fix: template defects
This commit is contained in:
@@ -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);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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 } },
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 ? "-" : "+"}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user