From ecd8b93bd1a2a92e9102a5da600a342f35f21081 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Tue, 30 Jul 2024 14:04:33 -0700 Subject: [PATCH] Add timestamp() to template fns --- src-tauri/src/render.rs | 18 +++++++++++-- .../core/Editor/twig/placeholder.ts | 25 +++++++++++++++---- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/render.rs b/src-tauri/src/render.rs index 8d96285e..79470e63 100644 --- a/src-tauri/src/render.rs +++ b/src-tauri/src/render.rs @@ -1,5 +1,6 @@ use std::collections::HashMap; - +use std::time::SystemTime; +use chrono::{DateTime, Utc}; use sqlx::types::{Json, JsonValue}; use crate::models::{ @@ -103,7 +104,20 @@ pub fn variables_from_environment( } pub fn render(template: &str, vars: &HashMap) -> String { - parse_and_render(template, vars, None) + parse_and_render(template, vars, Some(template_callback)) +} + +fn template_callback(name: &str, _args: HashMap) -> String { + match name { + "timestamp" => { + let now = SystemTime::now(); + let now: DateTime = now.into(); + now.to_rfc3339() + }, + _ => { + "".to_string() + } + } } fn add_variable_to_map( diff --git a/src-web/components/core/Editor/twig/placeholder.ts b/src-web/components/core/Editor/twig/placeholder.ts index c044fc24..4c06dfae 100644 --- a/src-web/components/core/Editor/twig/placeholder.ts +++ b/src-web/components/core/Editor/twig/placeholder.ts @@ -3,21 +3,32 @@ import { Decoration, EditorView, ViewPlugin, WidgetType } from '@codemirror/view import { BetterMatchDecorator } from '../BetterMatchDecorator'; class PlaceholderWidget extends WidgetType { - constructor(readonly name: string, readonly isExistingVariable: boolean) { + constructor( + readonly name: string, + readonly exists: boolean, + readonly type: 'function' | 'variable' = 'variable', + ) { super(); } + eq(other: PlaceholderWidget) { - return this.name == other.name && this.isExistingVariable == other.isExistingVariable; + return this.name == other.name && this.exists == other.exists; } + toDOM() { const elt = document.createElement('span'); elt.className = `x-theme-placeholder placeholder ${ - this.isExistingVariable ? 'x-theme-placeholder--primary' : 'x-theme-placeholder--danger' + !this.exists + ? 'x-theme-placeholder--danger' + : this.type === 'variable' + ? 'x-theme-placeholder--primary' + : 'x-theme-placeholder--info' }`; - elt.title = !this.isExistingVariable ? 'Variable not found in active environment' : ''; + elt.title = !this.exists ? 'Variable not found in active environment' : ''; elt.textContent = this.name; return elt; } + ignoreEvent() { return false; } @@ -43,11 +54,13 @@ export const placeholders = function (variables: { name: string }[]) { return Decoration.replace({}); } + const isFunction = groupMatch.includes('('); return Decoration.replace({ inclusive: true, widget: new PlaceholderWidget( groupMatch, - variables.some((v) => v.name === groupMatch), + isFunction ? true : variables.some((v) => v.name === groupMatch), + isFunction ? 'function' : 'variable', ), }); }, @@ -56,9 +69,11 @@ export const placeholders = function (variables: { name: string }[]) { return ViewPlugin.fromClass( class { placeholders: DecorationSet; + constructor(view: EditorView) { this.placeholders = placeholderMatcher.createDeco(view); } + update(update: ViewUpdate) { this.placeholders = placeholderMatcher.updateDeco(update, this.placeholders); }