This commit is contained in:
Bob Farrell 2024-12-15 16:17:02 +00:00
parent 444db1a5e3
commit 004a156832
5 changed files with 29 additions and 14 deletions

View File

@ -0,0 +1 @@
<title>My Inertia App</title>

View File

@ -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;
}

View File

@ -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 },
.{}, .{},
), ),
}; };

View File

@ -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,

View File

@ -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>