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");
pub const http = @import("http.zig");
pub const views = @import("views.zig");
pub const config = @import("config.zig");
/// Context available in every Zmpl template as `context`.
pub const TemplateContext = @This();
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 {
return if (self.request) |request|
try request.authenticityToken()
@ -15,6 +20,8 @@ pub fn authenticityToken(self: TemplateContext) !?[]const u8 {
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 {
return if (self.request) |request| blk: {
const token = try request.authenticityToken();
@ -23,3 +30,10 @@ pub fn authenticityFormElement(self: TemplateContext) !?[]const u8 {
, .{ config.get([]const u8, "authenticity_token_name"), token });
} 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 {
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| {
// TODO: Allow user to configure layouts directory other than src/app/views/layouts/
@ -626,7 +626,7 @@ fn renderErrorView(
.content = try template.render(
request.response_data,
jetzig.TemplateContext,
.{ .request = request },
.{ .request = request, .route = route },
.{},
),
};

View File

@ -3,7 +3,7 @@ const jetzig = @import("../../jetzig.zig");
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| {
try request.server.logger.DEBUG(
"[middleware-htmx] htmx request detected, disabling layout. (#{s})",
@ -11,7 +11,7 @@ pub fn afterView(request: *jetzig.http.Request) !void {
);
request.setLayout(null);
} else {
const template_context = jetzig.TemplateContext{ .request = request };
const template_context = jetzig.TemplateContext{ .request = request, .route = route };
const template = jetzig.zmpl.findPrefixed("jetzig", "inertia").?;
_ = request.renderContent(.ok, try template.render(
request.response_data,

View File

@ -1,13 +1,13 @@
<!DOCTYPE html>
<html>
<head>
<title>My app</title>
<link href="/css/app.css" rel="stylesheet">
<script src="/js/app.js" defer></script>
</head>
<body>
<div id="app" data-page='{"component":"Event","props": {{zmpl.toJson()}},"url":"/events/80","version":"c32b8e4965f418ad16eaebba1d4e960f"}'></div>
</body>
<head>
@partial views:inertia/head
</head>
<body>
<div
id="app"
data-page='{"component":"{{jetzig_view}}","props":{{zmpl.toJson()}},"url":"{{context.path()}}","version":"c32b8e4965f418ad16eaebba1d4e960f"}'
>
</div>
</body>
</html>