fix: template defects

This commit is contained in:
h z
2025-04-18 02:16:17 +01:00
parent 137ea649f8
commit c20cb168ff
10 changed files with 55 additions and 27 deletions

View File

@@ -1,13 +1,14 @@
import React, {useState} from 'react'; import React, {useEffect, useState} from 'react';
const LayoutEditor = ({layout, onChange}) => { const LayoutEditor = ({layout, onChange}) => {
const [_layout, setLayout] = useState(layout || ""); const [_layout, setLayout] = useState(layout || "");
useEffect(() => {setLayout(layout)}, [layout]);
return ( return (
<textarea <textarea
className="textarea" className="textarea"
value={_layout} value={_layout}
onChange={(e) => { onChange={(e) => {
setLayout(e.target.value); setLayout(e.target.value);
onChange(layout); onChange(e.target.value);
}} }}
/> />
); );

View File

@@ -1,4 +1,4 @@
import React, { useContext, useState } from "react"; import React, {useContext, useEffect, useState} from "react";
import { AuthContext } from "../../AuthProvider"; import { AuthContext } from "../../AuthProvider";
import { useNavigate, useParams } from "react-router-dom"; import { useNavigate, useParams } from "react-router-dom";
import { useMarkdownTemplate, useSaveMarkdownTemplate } from "../../utils/queries/markdown-template-queries"; import { useMarkdownTemplate, useSaveMarkdownTemplate } from "../../utils/queries/markdown-template-queries";
@@ -7,9 +7,7 @@ import ParametersManager from "./ParametersManager";
import "bulma/css/bulma.min.css"; import "bulma/css/bulma.min.css";
const MarkdownTemplateEditor = () => { const MarkdownTemplateEditor = () => {
const { roles } = useContext(AuthContext);
if (!roles.includes("admin") || roles.includes("creator"))
return <div className="notification is-danger">Permission Denied</div>;
const navigate = useNavigate(); const navigate = useNavigate();
const { id } = useParams(); const { id } = useParams();
@@ -19,11 +17,20 @@ const MarkdownTemplateEditor = () => {
const [title, setTitle] = useState(template?.id || ""); const [title, setTitle] = useState(template?.id || "");
const [parameters, setParameters] = useState(template?.parameters || []); const [parameters, setParameters] = useState(template?.parameters || []);
const [layout, setLayout] = useState(template?.layout || ""); const [layout, setLayout] = useState(template?.layout || "");
const { roles } = useContext(AuthContext);
useEffect(() => {
setTitle(template?.title || "");
setParameters(template?.parameters || []);
setLayout(template?.layout || "");
}, [template]);
if (templateIsFetching) { if (templateIsFetching) {
return <p>Loading...</p>; return <p>Loading...</p>;
} }
if (!roles.includes("admin") || roles.includes("creator"))
return <div className="notification is-danger">Permission Denied</div>;
const handleSave = () => { const handleSave = () => {
saveMarkdownTemplate.mutate( saveMarkdownTemplate.mutate(
{ id, data: { title, parameters, layout } }, { id, data: { title, parameters, layout } },

View File

@@ -1,4 +1,4 @@
import React, { useState } from "react"; import React, {useEffect, useState} from "react";
import TypeEditor from "./TypeEditor"; import TypeEditor from "./TypeEditor";
const ParametersManager = ({ parameters, onChange }) => { const ParametersManager = ({ parameters, onChange }) => {
@@ -15,6 +15,9 @@ const ParametersManager = ({ parameters, onChange }) => {
setParameters(updated); setParameters(updated);
onChange(updated); onChange(updated);
}; };
useEffect(() => {
setParameters(parameters);
}, [parameters]);
const handleNameChange = (index, newName) => { const handleNameChange = (index, newName) => {
const updated = [..._parameters]; const updated = [..._parameters];
@@ -71,6 +74,7 @@ const ParametersManager = ({ parameters, onChange }) => {
updated[index].type = newType; updated[index].type = newType;
setParameters(updated); setParameters(updated);
onChange(updated); onChange(updated);
console.log("updated", updated);
}} }}
/> />
</div> </div>

View File

@@ -1,26 +1,39 @@
import React, {useState} from "react"; import React, {useEffect, useState} from "react";
import {useMarkdownTemplates} from "../../utils/queries/markdown-template-queries"; import {useMarkdownTemplates} from "../../utils/queries/markdown-template-queries";
const TemplateSelector = ({template, onChange}) => { const TemplateSelector = ({template, onChange}) => {
const [_template, setTemplate] = useState(template || { const {data:templates, isFetching: templatesAreFetching} = useMarkdownTemplates();
const [_template, setTemplate] = useState(templates?.find(t => t.id === template.id) || {
title: "", title: "",
parameters: [], parameters: [],
layout: "" layout: ""
}); });
const {data:templates, isFetching: templatesAreFetching} = useMarkdownTemplates(); useEffect(() => {
setTemplate(templates?.find(t => t.id === template.id) || {
title: "",
parameters: [],
layout: ""
});
}, [template]);
if(templatesAreFetching) { if(templatesAreFetching) {
return <p>Loading...</p> return <p>Loading...</p>
} }
return ( return (
<select <select
value={_template.title} value={template.id}
onChange={(e) => { onChange={(e) => {
setTemplate(e.target.value); const templateId = parseInt(e.target.value, 10);
onChange(e.target.value); onChange(templates.find(t => t.id === templateId) || {
title: "",
parameters: [],
layout: ""
});
}}> }}>
<option value="">(None)</option>
{ {
templates.map((tmpl, index) => ( templates.map((tmpl, index) => (
<option key={index} value={tmpl} >{tmpl.title}</option> <option key={index} value={tmpl.id} >{tmpl.title}</option>
)) ))
} }
</select> </select>

View File

@@ -53,6 +53,7 @@ const TypeEditor = ({ type, onChange }) => {
return <TemplateSelector return <TemplateSelector
template={_type.definition.template} template={_type.definition.template}
onChange={(newTemplate) => { onChange={(newTemplate) => {
const updated = { const updated = {
..._type, ..._type,
definition: { definition: {
@@ -62,6 +63,8 @@ const TypeEditor = ({ type, onChange }) => {
}; };
setType(updated); setType(updated);
onChange(updated); onChange(updated);
}} }}
/>; />;
default: default:

View File

@@ -8,6 +8,7 @@ import {useMarkdown} from "../../utils/queries/markdown-queries";
import {usePath} from "../../utils/queries/path-queries"; import {usePath} from "../../utils/queries/path-queries";
import {useMarkdownSetting} from "../../utils/queries/markdown-setting-queries"; import {useMarkdownSetting} from "../../utils/queries/markdown-setting-queries";
import {useMarkdownTemplate} from "../../utils/queries/markdown-template-queries"; import {useMarkdownTemplate} from "../../utils/queries/markdown-template-queries";
import {useMarkdownTemplateSetting} from "../../utils/queries/markdown-template-setting-queries";
const MarkdownContent = () => { const MarkdownContent = () => {
const { id } = useParams(); const { id } = useParams();
@@ -15,8 +16,8 @@ const MarkdownContent = () => {
const {data: markdown, isLoading, error} = useMarkdown(id); const {data: markdown, isLoading, error} = useMarkdown(id);
const {data: path, isFetching: isPathFetching} = usePath(markdown?.path_id); const {data: path, isFetching: isPathFetching} = usePath(markdown?.path_id);
const {data: setting, isFetching: isSettingFetching} = useMarkdownSetting(markdown?.setting_id); const {data: setting, isFetching: isSettingFetching} = useMarkdownSetting(markdown?.setting_id);
const {data: template_setting, isFetching: isTemplateSettingFetching} = useMarkdownTemplate(setting?.template_setting_id); const {data: templateSetting, isFetching: isTemplateSettingFetching} = useMarkdownTemplateSetting(setting?.template_setting_id);
const {data: template, isFetching: isTemplateFetching} = useMarkdownTemplate(templateSetting?.template_id);
useEffect(() => { useEffect(() => {
if(markdown && markdown.title === "index" && path){ if(markdown && markdown.title === "index" && path){
@@ -25,7 +26,7 @@ const MarkdownContent = () => {
}, [markdown, path]); }, [markdown, path]);
const notReady = isLoading || isPathFetching || isSettingFetching || isTemplateSettingFetching; const notReady = isLoading || isPathFetching || isSettingFetching || isTemplateSettingFetching || isTemplateFetching;
if (notReady) { if (notReady) {
return <div>Loading...</div>; return <div>Loading...</div>;
@@ -45,9 +46,9 @@ const MarkdownContent = () => {
</Link> </Link>
</PermissionGuard> </PermissionGuard>
</div> </div>
<MarkdownView content={JSON.parse(markdown.content)} template={template_setting}/> <MarkdownView content={JSON.parse(markdown.content)} template={template}/>
</div> </div>
); );
}; };
export default MarkdownContent; export default MarkdownContent;

View File

@@ -34,11 +34,12 @@ const Translate = ({variable, value}) => {
const ParseTemplate = ({template, variables}) => { const ParseTemplate = ({template, variables}) => {
if(!template || !Array.isArray(template.parameters)) return ''; if(!template || !Array.isArray(template.parameters)) return '';
const vars = variables || {};
let res = template.layout ?? ''; let res = template.layout ?? '';
for (const parameter of template.parameters) { for (const parameter of template.parameters) {
res = res.replaceAll(`<${parameter.name}/>`, Translate({ res = res.replaceAll(`<${parameter.name}/>`, Translate({
variable: parameter, variable: parameter,
value: variables[parameter.name] value: vars[parameter.name]
})); }));
} }
return res; return res;
@@ -64,6 +65,7 @@ const MarkdownView = ({ content, template, height="auto" }) => {
layout: "<markdown/>", layout: "<markdown/>",
title: "default" title: "default"
}; };
return ( return (
<div className="markdown-preview" style={{height}}> <div className="markdown-preview" style={{height}}>
<ReactMarkdown <ReactMarkdown

View File

@@ -1,7 +1,7 @@
import React, {useState} from "react"; import React, {useState} from "react";
import {useMarkdownTemplate} from "../../utils/queries/markdown-template-queries"; import {useMarkdownTemplate} from "../../utils/queries/markdown-template-queries";
const TemplatedEditorComponent = ({ variable, value, namespace, onContentChanged }) => { const TemplatedEditorComponent = ({ variable, value={}, namespace, onContentChanged }) => {
if(variable.type.base_type === "string") { if(variable.type.base_type === "string") {
return ( return (
<div> <div>
@@ -102,7 +102,7 @@ const TemplatedEditorComponent = ({ variable, value, namespace, onContentChanged
} }
if(variable.type.base_type === 'template'){ if(variable.type.base_type === 'template'){
const {data: _template, isFetching: _templateIsFetching} = useMarkdownTemplate(variable.type.definition.template_id); const {data: _template, isFetching: _templateIsFetching} = useMarkdownTemplate(variable.type.definition.template.id);
if(_templateIsFetching){ if(_templateIsFetching){
return(<p>Loading...</p>); return(<p>Loading...</p>);
} }

View File

@@ -86,12 +86,13 @@ const PathNode = ({ path, isRoot = false }) => {
<MarkdownNode <MarkdownNode
markdown={markdown} markdown={markdown}
handleMoveMarkdown={handleMoveMarkdown} handleMoveMarkdown={handleMoveMarkdown}
key={markdown.id}
/> />
))} ))}
</ul> </ul>
); );
return ( return (
<li> <li key={path.id}>
<div className="path-node-header field has-addons"> <div className="path-node-header field has-addons">
<span className="control has-text-weight-bold path-toggle" onClick={isRoot ? undefined : toggleExpand}> <span className="control has-text-weight-bold path-toggle" onClick={isRoot ? undefined : toggleExpand}>
{isExpanded ? "-" : "+"} {isExpanded ? "-" : "+"}

View File

@@ -15,7 +15,6 @@ const MarkdownTemplateSettingPanel = ({markdownSetting, onClose}) => {
const {data: templates, isFetching: templatesAreFetching}=useMarkdownTemplates(); const {data: templates, isFetching: templatesAreFetching}=useMarkdownTemplates();
const {data: template, isFetching: templateIsFetching} = useMarkdownTemplate(setting?.template_id); const {data: template, isFetching: templateIsFetching} = useMarkdownTemplate(setting?.template_id);
const [selectedTemplateId, setSelectedTemplateId] = useState(template?.id ?? undefined); const [selectedTemplateId, setSelectedTemplateId] = useState(template?.id ?? undefined);
const [selectedTemplate, setSelectedTemplate] = useState(templates?.find(t => t.id === selectedTemplateId) || undefined);
const createMarkdownTemplateSetting = useCreateMarkdownTemplateSetting(); const createMarkdownTemplateSetting = useCreateMarkdownTemplateSetting();
const updateMarkdownSetting = useUpdateMarkdownSetting(); const updateMarkdownSetting = useUpdateMarkdownSetting();
@@ -49,14 +48,11 @@ const MarkdownTemplateSettingPanel = ({markdownSetting, onClose}) => {
useEffect(() => { useEffect(() => {
if(template?.id && selectedTemplateId === undefined) { if(template?.id && selectedTemplateId === undefined) {
setSelectedTemplateId(template?.id ?? undefined); setSelectedTemplateId(template?.id ?? undefined);
setSelectedTemplate(templates?.find(t => t.id === selectedTemplateId) || undefined);
} }
},[template, selectedTemplateId]); },[template, selectedTemplateId]);
if (settingIsFetching || templatesAreFetching || templatesAreFetching || templateIsFetching) { if (settingIsFetching || templatesAreFetching || templatesAreFetching || templateIsFetching) {
return (<p>Loading...</p>); return (<p>Loading...</p>);
} }
console.log("template", template);
console.log("selectedTemplateId", selectedTemplateId);
return setting ? ( return setting ? (
<div className="box" style={{marginTop: "1rem"}}> <div className="box" style={{marginTop: "1rem"}}>
<h4 className="title is-5">Template Setting</h4> <h4 className="title is-5">Template Setting</h4>