From 004a1568322bcb698047630788feeb25d57c9be7 Mon Sep 17 00:00:00 2001 From: Bob Farrell Date: Sun, 15 Dec 2024 16:17:02 +0000 Subject: [PATCH] WIP --- demo/src/app/views/inertia/_head.zmpl | 1 + src/jetzig/TemplateContext.zig | 14 ++++++++++++++ src/jetzig/http/Server.zig | 4 ++-- src/jetzig/middleware/InertiaMiddleware.zig | 4 ++-- src/jetzig/templates/inertia.zmpl | 20 ++++++++++---------- 5 files changed, 29 insertions(+), 14 deletions(-) create mode 100644 demo/src/app/views/inertia/_head.zmpl 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 + + +
+
+