mirror of
https://github.com/jetzig-framework/jetzig.git
synced 2025-05-15 06:26:07 +00:00
WIP
This commit is contained in:
parent
444db1a5e3
commit
004a156832
1
demo/src/app/views/inertia/_head.zmpl
Normal file
1
demo/src/app/views/inertia/_head.zmpl
Normal file
@ -0,0 +1 @@
|
|||||||
|
<title>My Inertia App</title>
|
@ -1,13 +1,18 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
pub const http = @import("http.zig");
|
pub const http = @import("http.zig");
|
||||||
|
pub const views = @import("views.zig");
|
||||||
pub const config = @import("config.zig");
|
pub const config = @import("config.zig");
|
||||||
|
|
||||||
/// Context available in every Zmpl template as `context`.
|
/// Context available in every Zmpl template as `context`.
|
||||||
pub const TemplateContext = @This();
|
pub const TemplateContext = @This();
|
||||||
|
|
||||||
request: ?*http.Request = null,
|
request: ?*http.Request = null,
|
||||||
|
route: ?views.Route = null,
|
||||||
|
|
||||||
|
/// Return an authenticity token stored in the current request's session. If no token exists,
|
||||||
|
/// generate and store before returning.
|
||||||
|
/// Use to create a form element which can be verified by `AntiCsrfMiddleware`.
|
||||||
pub fn authenticityToken(self: TemplateContext) !?[]const u8 {
|
pub fn authenticityToken(self: TemplateContext) !?[]const u8 {
|
||||||
return if (self.request) |request|
|
return if (self.request) |request|
|
||||||
try request.authenticityToken()
|
try request.authenticityToken()
|
||||||
@ -15,6 +20,8 @@ pub fn authenticityToken(self: TemplateContext) !?[]const u8 {
|
|||||||
null;
|
null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Generate a hidden form element containing an authenticity token provided by
|
||||||
|
/// `authenticityToken`. Use as `{{context.authenticityFormElement()}}` in a Zmpl template.
|
||||||
pub fn authenticityFormElement(self: TemplateContext) !?[]const u8 {
|
pub fn authenticityFormElement(self: TemplateContext) !?[]const u8 {
|
||||||
return if (self.request) |request| blk: {
|
return if (self.request) |request| blk: {
|
||||||
const token = try request.authenticityToken();
|
const token = try request.authenticityToken();
|
||||||
@ -23,3 +30,10 @@ pub fn authenticityFormElement(self: TemplateContext) !?[]const u8 {
|
|||||||
, .{ config.get([]const u8, "authenticity_token_name"), token });
|
, .{ config.get([]const u8, "authenticity_token_name"), token });
|
||||||
} else null;
|
} else null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn path(self: TemplateContext) ?[]const u8 {
|
||||||
|
return if (self.request) |request|
|
||||||
|
request.path.path
|
||||||
|
else
|
||||||
|
null;
|
||||||
|
}
|
||||||
|
@ -433,7 +433,7 @@ fn renderTemplateWithLayout(
|
|||||||
) ![]const u8 {
|
) ![]const u8 {
|
||||||
try addTemplateConstants(view, route);
|
try addTemplateConstants(view, route);
|
||||||
|
|
||||||
const template_context = jetzig.TemplateContext{ .request = request };
|
const template_context = jetzig.TemplateContext{ .request = request, .route = route };
|
||||||
|
|
||||||
if (request.getLayout(route)) |layout_name| {
|
if (request.getLayout(route)) |layout_name| {
|
||||||
// TODO: Allow user to configure layouts directory other than src/app/views/layouts/
|
// TODO: Allow user to configure layouts directory other than src/app/views/layouts/
|
||||||
@ -626,7 +626,7 @@ fn renderErrorView(
|
|||||||
.content = try template.render(
|
.content = try template.render(
|
||||||
request.response_data,
|
request.response_data,
|
||||||
jetzig.TemplateContext,
|
jetzig.TemplateContext,
|
||||||
.{ .request = request },
|
.{ .request = request, .route = route },
|
||||||
.{},
|
.{},
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
@ -3,7 +3,7 @@ const jetzig = @import("../../jetzig.zig");
|
|||||||
|
|
||||||
const InertiaMiddleware = @This();
|
const InertiaMiddleware = @This();
|
||||||
|
|
||||||
pub fn afterView(request: *jetzig.http.Request) !void {
|
pub fn afterView(request: *jetzig.http.Request, route: jetzig.views.Route) !void {
|
||||||
if (request.headers.get("HX-Target")) |target| {
|
if (request.headers.get("HX-Target")) |target| {
|
||||||
try request.server.logger.DEBUG(
|
try request.server.logger.DEBUG(
|
||||||
"[middleware-htmx] htmx request detected, disabling layout. (#{s})",
|
"[middleware-htmx] htmx request detected, disabling layout. (#{s})",
|
||||||
@ -11,7 +11,7 @@ pub fn afterView(request: *jetzig.http.Request) !void {
|
|||||||
);
|
);
|
||||||
request.setLayout(null);
|
request.setLayout(null);
|
||||||
} else {
|
} else {
|
||||||
const template_context = jetzig.TemplateContext{ .request = request };
|
const template_context = jetzig.TemplateContext{ .request = request, .route = route };
|
||||||
const template = jetzig.zmpl.findPrefixed("jetzig", "inertia").?;
|
const template = jetzig.zmpl.findPrefixed("jetzig", "inertia").?;
|
||||||
_ = request.renderContent(.ok, try template.render(
|
_ = request.renderContent(.ok, try template.render(
|
||||||
request.response_data,
|
request.response_data,
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>My app</title>
|
@partial views:inertia/head
|
||||||
<link href="/css/app.css" rel="stylesheet">
|
|
||||||
<script src="/js/app.js" defer></script>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div
|
||||||
<div id="app" data-page='{"component":"Event","props": {{zmpl.toJson()}},"url":"/events/80","version":"c32b8e4965f418ad16eaebba1d4e960f"}'></div>
|
id="app"
|
||||||
|
data-page='{"component":"{{jetzig_view}}","props":{{zmpl.toJson()}},"url":"{{context.path()}}","version":"c32b8e4965f418ad16eaebba1d4e960f"}'
|
||||||
|
>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user