add: template editor name edit improvements
This commit is contained in:
parent
fb8d20726a
commit
15ca55bca7
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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 = 预览图片
|
||||
|
|
|
|||
|
|
@ -1,5 +1,19 @@
|
|||
title = 模板编辑器
|
||||
|
||||
templateType = 模板类型
|
||||
|
||||
templateType-item =
|
||||
.label = 条目
|
||||
templateType-text =
|
||||
.label = 文本
|
||||
templateType-system =
|
||||
.label = 内置
|
||||
templateType-unknown =
|
||||
.label = ?
|
||||
templateType-help =
|
||||
.label = 关于...
|
||||
.title = 模板类型的详细解释
|
||||
|
||||
templateName = 模板名称
|
||||
|
||||
previewContainer =
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Reference in New Issue