add: template editor name edit improvements

This commit is contained in:
windingwind 2024-09-08 21:17:41 +02:00
parent fb8d20726a
commit 15ca55bca7
12 changed files with 224 additions and 40 deletions

View File

@ -128,6 +128,11 @@
margin: 0 auto;
padding: 0px;
}
.help-button {
appearance: auto;
-moz-default-appearance: -moz-mac-help-button;
min-width: 0;
}
</style>
<link
rel="stylesheet"
@ -146,10 +151,39 @@
orient="horizontal"
></xul:splitter>
<xul:hbox class="viewport editor-viewport">
<div style="display: flex; align-items: center">
<xul:hbox align="center">
<div style="flex-shrink: 0" data-l10n-id="templateType"></div>
<xul:menulist id="editor-type" native="true">
<xul:menupopup>
<xul:menuitem
data-l10n-id="templateType-unknown"
value="unknown"
></xul:menuitem>
<xul:menuitem
data-l10n-id="templateType-system"
value="system"
hidden="true"
></xul:menuitem>
<xul:menuitem
data-l10n-id="templateType-item"
value="item"
></xul:menuitem>
<xul:menuitem
data-l10n-id="templateType-text"
value="text"
></xul:menuitem>
</xul:menupopup>
</xul:menulist>
<button
id="templateType-help"
data-l10n-id="templateType-help"
class="help-button"
></button>
</xul:hbox>
<xul:hbox align="center">
<div style="flex-shrink: 0" data-l10n-id="templateName"></div>
<input id="editor-name" type="text" style="width: 100%" />
</div>
</xul:hbox>
<div style="display: flex; flex-direction: column; height: 100%">
<iframe
id="editor"

View File

@ -35,6 +35,11 @@ templateEditor-templateDisplayType =
.text = Text
.unknown = ?
templateEditor-templateHelp =
.system = For specific purposes, e.g., generating note link.
.item = Can generate note fragments from one or more selected items as input.
.text = Can generate note fragments. It doesn't require any input.
editor-resizeImage-title = Resize Image
editor-resizeImage-prompt = Resize image width to:
editor-previewImage-title = Preview Image

View File

@ -1,5 +1,19 @@
title = Template Editor
templateType = Template Type
templateType-item =
.label = Item
templateType-text =
.label = Text
templateType-system =
.label = Builtin
templateType-unknown =
.label = ?
templateType-help =
.label = About...
.title = Detailed explanation of template types
templateName = Template Name
previewContainer =

View File

@ -35,6 +35,11 @@ templateEditor-templateDisplayType =
.text = Text
.unknown = ?
templateEditor-templateHelp =
.system = For specific purposes, e.g., generating note link.
.item = Can generate note fragments from one or more selected items as input.
.text = Can generate note fragments. It doesn't require any input.
syncManager-noteName = Nome nota
syncManager-lastSync = Ultima sincronizzazione
syncManager-filePath = Percorso MarkDown

View File

@ -1,5 +1,19 @@
title = Editor dei template
templateType = Template Type
templateType-item =
.label = Item
templateType-text =
.label = Text
templateType-system =
.label = Builtin
templateType-unknown =
.label = ?
templateType-help =
.label = About...
.title = Detailed explanation of template types
templateName = Nome template
previewContainer =

View File

@ -35,6 +35,11 @@ templateEditor-templateDisplayType =
.text = Text
.unknown = ?
templateEditor-templateHelp =
.system = For specific purposes, e.g., generating note link.
.item = Can generate note fragments from one or more selected items as input.
.text = Can generate note fragments. It doesn't require any input.
editor-resizeImage-title = Resize Image
editor-resizeImage-prompt = Resize image width to:
editor-previewImage-title = Preview Image

View File

@ -1,5 +1,19 @@
title = Редактор шаблонов
templateType = Template Type
templateType-item =
.label = Item
templateType-text =
.label = Text
templateType-system =
.label = Builtin
templateType-unknown =
.label = ?
templateType-help =
.label = About...
.title = Detailed explanation of template types
templateName = Имя шаблона
previewContainer =

View File

@ -35,6 +35,11 @@ templateEditor-templateDisplayType =
.text = Text
.unknown = ?
templateEditor-templateHelp =
.system = For specific purposes, e.g., generating note link.
.item = Can generate note fragments from one or more selected items as input.
.text = Can generate note fragments. It doesn't require any input.
editor-resizeImage-title = Resmi Boyutlandır
editor-resizeImage-prompt = Resmi Şuna Boyutlandır:
editor-previewImage-title = Resmi Önizle

View File

@ -1,5 +1,19 @@
title = Şablon Düzenleyici
templateType = Template Type
templateType-item =
.label = Item
templateType-text =
.label = Text
templateType-system =
.label = Builtin
templateType-unknown =
.label = ?
templateType-help =
.label = About...
.title = Detailed explanation of template types
templateName = Şablon Adı
previewContainer =

View File

@ -30,11 +30,16 @@ templateEditor-templateDisplayName =
.ExportMDFileContent = Export MD File Content (导出MD正文)
templateEditor-templateDisplayType =
.system = Builtin
.item = Item
.text = Text
.system = 内置
.item = 条目
.text = 文本
.unknown = ?
templateEditor-templateHelp =
.system = 用于特定目的,例如生成笔记链接。
.item = 可以从一个或多个选定的条目生成笔记片段。
.text = 可以生成笔记片段。不需要任何输入。
editor-resizeImage-title = 缩放图片
editor-resizeImage-prompt = 缩放图片宽度为:
editor-previewImage-title = 预览图片

View File

@ -1,5 +1,19 @@
title = 模板编辑器
templateType = 模板类型
templateType-item =
.label = 条目
templateType-text =
.label = 文本
templateType-system =
.label = 内置
templateType-unknown =
.label = ?
templateType-help =
.label = 关于...
.title = 模板类型的详细解释
templateName = 模板名称
previewContainer =

View File

@ -109,6 +109,31 @@ export async function showTemplateEditor() {
return div;
})
.render();
_window.document
.querySelector("#templateType-help")
?.addEventListener("click", (ev) => {
new addon.data.ztoolkit.Guide().highlight(_window.document, {
title: "About Template Types",
description: ["system", "item", "text"]
.map(
(type) =>
`${getString(
"templateEditor-templateDisplayType",
type,
)}: ${getString("templateEditor-templateHelp", type)}`,
)
.join("\n"),
onNextClick: () => {
Zotero.launchURL(
"https://github.com/windingwind/zotero-better-notes/blob/master/docs/about-note-template.md",
);
},
showButtons: ["next", "close"],
nextBtnText: "Learn more",
closeBtnText: "OK",
position: "center",
});
});
_window.document
.querySelector("#create")
?.addEventListener("click", (ev) => {
@ -185,6 +210,12 @@ async function refresh() {
function getRowData(index: number) {
const rowData = addon.data.template.editor.templates[index];
if (!rowData) {
return {
name: "",
type: "unknown",
};
}
let templateType = "unknown";
let templateDisplayName = rowData;
if (addon.api.template.SYSTEM_TEMPLATE_NAMES.includes(rowData)) {
@ -230,42 +261,44 @@ function updateTable(selectId?: number) {
function updateEditor() {
const name = getSelectedTemplateName();
const { type, name: displayName } = getRowData(getSelectedIndex());
const templateText = addon.api.template.getTemplateText(name);
const win = addon.data.template.editor.window;
if (!win) {
return;
}
const header = addon.data.template.editor.window?.document.getElementById(
"editor-name",
const templateType = win.document.querySelector(
"#editor-type",
) as XUL.MenuList;
const templateName = win.document.querySelector(
"#editor-name",
) as HTMLInputElement;
const editor = addon.data.template.editor.window?.document.getElementById(
"editor",
) as HTMLIFrameElement;
const saveTemplate =
addon.data.template.editor.window?.document.getElementById(
"save",
) as XUL.Button;
const deleteTemplate =
addon.data.template.editor.window?.document.getElementById(
"delete",
) as XUL.Button;
const resetTemplate =
addon.data.template.editor.window?.document.getElementById(
"reset",
) as XUL.Button;
const editor = win?.document.getElementById("editor") as HTMLIFrameElement;
const saveTemplate = win?.document.getElementById("save") as XUL.Button;
const deleteTemplate = win?.document.getElementById("delete") as XUL.Button;
const resetTemplate = win?.document.getElementById("reset") as XUL.Button;
if (!name) {
header.value = "";
header.setAttribute("disabled", "true");
templateType.value = "unknown";
templateType.setAttribute("disabled", "true");
templateName.value = "";
templateName.setAttribute("disabled", "true");
editor.hidden = true;
saveTemplate.setAttribute("disabled", "true");
deleteTemplate.setAttribute("disabled", "true");
deleteTemplate.hidden = false;
resetTemplate.hidden = true;
} else {
header.value = name;
templateType.value = type;
templateName.value = displayName;
if (!addon.api.template.SYSTEM_TEMPLATE_NAMES.includes(name)) {
header.removeAttribute("disabled");
templateType.removeAttribute("disabled");
templateName.removeAttribute("disabled");
deleteTemplate.hidden = false;
resetTemplate.hidden = true;
} else {
header.setAttribute("disabled", "true");
templateType.setAttribute("disabled", "true");
templateName.setAttribute("disabled", "true");
deleteTemplate.setAttribute("disabled", "true");
deleteTemplate.hidden = true;
resetTemplate.hidden = false;
@ -292,15 +325,19 @@ async function updatePreview() {
}
function getSelectedTemplateName() {
const selectedTemplate = addon.data.template.editor.templates.find(
(v, i) =>
addon.data.template.editor.tableHelper?.treeInstance.selection.isSelected(
i,
),
);
const selectedTemplate =
addon.data.template.editor.templates[getSelectedIndex()];
return selectedTemplate || "";
}
function getSelectedIndex() {
const selectedIndex =
addon.data.template.editor.tableHelper?.treeInstance.selection.selected
.values()
.next().value;
return selectedIndex;
}
function createTemplate() {
const template: NoteTemplate = {
name: `New Template: ${new Date().getTime()}`,
@ -327,14 +364,32 @@ async function importNoteTemplate() {
}
function saveSelectedTemplate() {
const name = getSelectedTemplateName();
const header = addon.data.template.editor.window?.document.getElementById(
"editor-name",
const win = addon.data.template.editor.window;
if (!win) {
return;
}
const templateType = win.document.querySelector(
"#editor-type",
) as XUL.MenuList;
const templateName = win.document.querySelector(
"#editor-name",
) as HTMLInputElement;
const name = getSelectedTemplateName();
const type = templateType.value;
let modifiedName: string;
if (type === "system") {
modifiedName = name;
} else if (type === "unknown") {
modifiedName = templateName.value;
} else {
modifiedName = `[${type}]${templateName.value}`;
}
if (
addon.api.template.SYSTEM_TEMPLATE_NAMES.includes(name) &&
header.value !== name
modifiedName !== name
) {
showHint(
`Template ${name} is a system template. Modifying template name is not allowed.`,
@ -343,7 +398,7 @@ function saveSelectedTemplate() {
}
const template = {
name: header.value,
name: modifiedName,
text: addon.data.template.editor.editor.getValue() as string,
};
if (
@ -362,10 +417,10 @@ function saveSelectedTemplate() {
}
addon.api.template.setTemplate(template);
if (name !== template.name) {
if (name !== modifiedName) {
addon.api.template.removeTemplate(name);
}
showHint(`Template ${template.name} saved.`);
showHint(`Template ${modifiedName} saved.`);
const selectedId =
addon.data.template.editor.tableHelper?.treeInstance.selection.selected
.values()