mirror of
https://github.com/jetzig-framework/jetzig.git
synced 2025-05-14 14:06:08 +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");
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -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 },
|
||||
.{},
|
||||
),
|
||||
};
|
||||
|
@ -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,
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user