diff --git a/demo/src/app/views/inertia/_head.zmpl b/demo/src/app/views/inertia/_head.zmpl
new file mode 100644
index 0000000..783e4ab
--- /dev/null
+++ b/demo/src/app/views/inertia/_head.zmpl
@@ -0,0 +1 @@
+
My Inertia App
diff --git a/src/jetzig/TemplateContext.zig b/src/jetzig/TemplateContext.zig
index 321e527..b413285 100644
--- a/src/jetzig/TemplateContext.zig
+++ b/src/jetzig/TemplateContext.zig
@@ -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;
+}
diff --git a/src/jetzig/http/Server.zig b/src/jetzig/http/Server.zig
index 2b0e1f1..d4fba01 100644
--- a/src/jetzig/http/Server.zig
+++ b/src/jetzig/http/Server.zig
@@ -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 },
.{},
),
};
diff --git a/src/jetzig/middleware/InertiaMiddleware.zig b/src/jetzig/middleware/InertiaMiddleware.zig
index c124db7..d39aaaa 100644
--- a/src/jetzig/middleware/InertiaMiddleware.zig
+++ b/src/jetzig/middleware/InertiaMiddleware.zig
@@ -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,
diff --git a/src/jetzig/templates/inertia.zmpl b/src/jetzig/templates/inertia.zmpl
index 38198ee..51732d1 100644
--- a/src/jetzig/templates/inertia.zmpl
+++ b/src/jetzig/templates/inertia.zmpl
@@ -1,13 +1,13 @@
-
- My app
-
-
-
-
-
-
-
-
+
+ @partial views:inertia/head
+
+
+
+
+