mirror of
https://github.com/zadam/trilium.git
synced 2025-12-28 11:09:56 +01:00
Compare commits
27 Commits
v0.101.0
...
feat/ui/fi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79d2010bfa | ||
|
|
3f86c809ce | ||
|
|
5174deac07 | ||
|
|
a6c515aea0 | ||
|
|
850710926e | ||
|
|
904da14895 | ||
|
|
4c5bc3a3d3 | ||
|
|
af4fc11a4e | ||
|
|
a63b8b2031 | ||
|
|
7b02d87558 | ||
|
|
16737b93dd | ||
|
|
c23fe7cf13 | ||
|
|
6d80323a76 | ||
|
|
8b630c6e2e | ||
|
|
047a8d9644 | ||
|
|
f14ae01fab | ||
|
|
785470b0ae | ||
|
|
73918c042b | ||
|
|
8d6eb6fa53 | ||
|
|
f97fbf8325 | ||
|
|
e7d6e646be | ||
|
|
839444af47 | ||
|
|
24a58da4b6 | ||
|
|
aa37196169 | ||
|
|
f821d7fcd6 | ||
|
|
b417831507 | ||
|
|
a4dbefd7ef |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@triliumnext/client",
|
||||
"version": "0.101.0",
|
||||
"version": "0.101.1",
|
||||
"description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)",
|
||||
"private": true,
|
||||
"license": "AGPL-3.0-only",
|
||||
|
||||
@@ -92,7 +92,7 @@ export default class DesktopLayout {
|
||||
.optChild(launcherPaneIsHorizontal, <LeftPaneToggle isHorizontalLayout={true} />)
|
||||
.child(<TabHistoryNavigationButtons />)
|
||||
.child(new TabRowWidget().class("full-width"))
|
||||
.optChild(launcherPaneIsHorizontal && isNewLayout, <RightPaneToggle />)
|
||||
.optChild(isNewLayout, <RightPaneToggle />)
|
||||
.optChild(customTitleBarButtons, <TitleBarButtons />)
|
||||
.css("height", "40px")
|
||||
.css("background-color", "var(--launcher-pane-background-color)")
|
||||
|
||||
@@ -3,7 +3,7 @@ import { signal } from "@preact/signals";
|
||||
import appContext from "../components/app_context.js";
|
||||
import froca from "./froca.js";
|
||||
import { t } from "./i18n.js";
|
||||
import utils from "./utils.js";
|
||||
import utils, { randomString } from "./utils.js";
|
||||
|
||||
export interface ToastOptions {
|
||||
id?: string;
|
||||
@@ -86,7 +86,7 @@ export async function showErrorForScriptNote(noteId: string, message: string) {
|
||||
export const toasts = signal<ToastOptionsWithRequiredId[]>([]);
|
||||
|
||||
function addToast(opts: ToastOptions) {
|
||||
const id = opts.id ?? crypto.randomUUID();
|
||||
const id = opts.id ?? randomString();
|
||||
const toast = { ...opts, id };
|
||||
toasts.value = [ ...toasts.value, toast ];
|
||||
return id;
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { dayjs } from "@triliumnext/commons";
|
||||
import type { ViewMode, ViewScope } from "./link.js";
|
||||
import FNote from "../entities/fnote";
|
||||
import { snapdom } from "@zumer/snapdom";
|
||||
|
||||
import FNote from "../entities/fnote";
|
||||
import type { ViewMode, ViewScope } from "./link.js";
|
||||
|
||||
const SVG_MIME = "image/svg+xml";
|
||||
|
||||
export const isShare = !window.glob;
|
||||
@@ -113,9 +114,8 @@ function formatDateISO(date: Date) {
|
||||
export function formatDateTime(date: Date, userSuppliedFormat?: string): string {
|
||||
if (userSuppliedFormat?.trim()) {
|
||||
return dayjs(date).format(userSuppliedFormat);
|
||||
} else {
|
||||
return `${formatDate(date)} ${formatTime(date)}`;
|
||||
}
|
||||
return `${formatDate(date)} ${formatTime(date)}`;
|
||||
}
|
||||
|
||||
function localNowDateTime() {
|
||||
@@ -191,9 +191,9 @@ export function formatSize(size: number | null | undefined) {
|
||||
|
||||
if (size < 1024) {
|
||||
return `${size} KiB`;
|
||||
} else {
|
||||
return `${Math.round(size / 102.4) / 10} MiB`;
|
||||
}
|
||||
return `${Math.round(size / 102.4) / 10} MiB`;
|
||||
|
||||
}
|
||||
|
||||
function toObject<T, R>(array: T[], fn: (arg0: T) => [key: string, value: R]) {
|
||||
@@ -208,7 +208,7 @@ function toObject<T, R>(array: T[], fn: (arg0: T) => [key: string, value: R]) {
|
||||
return obj;
|
||||
}
|
||||
|
||||
export function randomString(len: number) {
|
||||
export function randomString(len: number = 16) {
|
||||
let text = "";
|
||||
const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||
|
||||
@@ -297,18 +297,18 @@ function formatHtml(html: string) {
|
||||
let indent = "\n";
|
||||
const tab = "\t";
|
||||
let i = 0;
|
||||
let pre: { indent: string; tag: string }[] = [];
|
||||
const pre: { indent: string; tag: string }[] = [];
|
||||
|
||||
html = html
|
||||
.replace(new RegExp("<pre>([\\s\\S]+?)?</pre>"), function (x) {
|
||||
.replace(new RegExp("<pre>([\\s\\S]+?)?</pre>"), (x) => {
|
||||
pre.push({ indent: "", tag: x });
|
||||
return "<--TEMPPRE" + i++ + "/-->";
|
||||
return `<--TEMPPRE${i++}/-->`;
|
||||
})
|
||||
.replace(new RegExp("<[^<>]+>[^<]?", "g"), function (x) {
|
||||
.replace(new RegExp("<[^<>]+>[^<]?", "g"), (x) => {
|
||||
let ret;
|
||||
const tagRegEx = /<\/?([^\s/>]+)/.exec(x);
|
||||
let tag = tagRegEx ? tagRegEx[1] : "";
|
||||
let p = new RegExp("<--TEMPPRE(\\d+)/-->").exec(x);
|
||||
const tag = tagRegEx ? tagRegEx[1] : "";
|
||||
const p = new RegExp("<--TEMPPRE(\\d+)/-->").exec(x);
|
||||
|
||||
if (p) {
|
||||
const pInd = parseInt(p[1]);
|
||||
@@ -318,24 +318,22 @@ function formatHtml(html: string) {
|
||||
if (["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "menuitem", "meta", "param", "source", "track", "wbr"].indexOf(tag) >= 0) {
|
||||
// self closing tag
|
||||
ret = indent + x;
|
||||
} else if (x.indexOf("</") < 0) {
|
||||
//open tag
|
||||
if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + tab + x.substr(x.length - 1, x.length);
|
||||
else ret = indent + x;
|
||||
!p && (indent += tab);
|
||||
} else {
|
||||
if (x.indexOf("</") < 0) {
|
||||
//open tag
|
||||
if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + tab + x.substr(x.length - 1, x.length);
|
||||
else ret = indent + x;
|
||||
!p && (indent += tab);
|
||||
} else {
|
||||
//close tag
|
||||
indent = indent.substr(0, indent.length - 1);
|
||||
if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + x.substr(x.length - 1, x.length);
|
||||
else ret = indent + x;
|
||||
}
|
||||
//close tag
|
||||
indent = indent.substr(0, indent.length - 1);
|
||||
if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + x.substr(x.length - 1, x.length);
|
||||
else ret = indent + x;
|
||||
}
|
||||
return ret;
|
||||
});
|
||||
|
||||
for (i = pre.length; i--;) {
|
||||
html = html.replace("<--TEMPPRE" + i + "/-->", pre[i].tag.replace("<pre>", "<pre>\n").replace("</pre>", pre[i].indent + "</pre>"));
|
||||
html = html.replace(`<--TEMPPRE${i}/-->`, pre[i].tag.replace("<pre>", "<pre>\n").replace("</pre>", `${pre[i].indent}</pre>`));
|
||||
}
|
||||
|
||||
return html.charAt(0) === "\n" ? html.substr(1, html.length - 1) : html;
|
||||
@@ -364,11 +362,11 @@ type dynamicRequireMappings = {
|
||||
export function dynamicRequire<T extends keyof dynamicRequireMappings>(moduleName: T): Awaited<dynamicRequireMappings[T]>{
|
||||
if (typeof __non_webpack_require__ !== "undefined") {
|
||||
return __non_webpack_require__(moduleName);
|
||||
} else {
|
||||
// explicitly pass as string and not as expression to suppress webpack warning
|
||||
// 'Critical dependency: the request of a dependency is an expression'
|
||||
return require(`${moduleName}`);
|
||||
}
|
||||
// explicitly pass as string and not as expression to suppress webpack warning
|
||||
// 'Critical dependency: the request of a dependency is an expression'
|
||||
return require(`${moduleName}`);
|
||||
|
||||
}
|
||||
|
||||
function timeLimit<T>(promise: Promise<T>, limitMs: number, errorMessage?: string) {
|
||||
@@ -509,8 +507,8 @@ export function escapeRegExp(str: string) {
|
||||
function areObjectsEqual(...args: unknown[]) {
|
||||
let i;
|
||||
let l;
|
||||
let leftChain: Object[];
|
||||
let rightChain: Object[];
|
||||
let leftChain: object[];
|
||||
let rightChain: object[];
|
||||
|
||||
function compare2Objects(x: unknown, y: unknown) {
|
||||
let p;
|
||||
@@ -695,9 +693,9 @@ async function downloadAsSvg(nameWithoutExtension: string, svgSource: string | S
|
||||
|
||||
try {
|
||||
const result = await snapdom(element, {
|
||||
backgroundColor: "transparent",
|
||||
scale: 2
|
||||
});
|
||||
backgroundColor: "transparent",
|
||||
scale: 2
|
||||
});
|
||||
triggerDownload(`${nameWithoutExtension}.svg`, result.url);
|
||||
} finally {
|
||||
cleanup();
|
||||
@@ -733,9 +731,9 @@ async function downloadAsPng(nameWithoutExtension: string, svgSource: string | S
|
||||
|
||||
try {
|
||||
const result = await snapdom(element, {
|
||||
backgroundColor: "transparent",
|
||||
scale: 2
|
||||
});
|
||||
backgroundColor: "transparent",
|
||||
scale: 2
|
||||
});
|
||||
const pngImg = await result.toPng();
|
||||
await triggerDownload(`${nameWithoutExtension}.png`, pngImg.src);
|
||||
} finally {
|
||||
@@ -763,11 +761,11 @@ export function getSizeFromSvg(svgContent: string) {
|
||||
return {
|
||||
width: parseFloat(width),
|
||||
height: parseFloat(height)
|
||||
}
|
||||
} else {
|
||||
console.warn("SVG export error", svgDocument.documentElement);
|
||||
return null;
|
||||
};
|
||||
}
|
||||
console.warn("SVG export error", svgDocument.documentElement);
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -896,9 +894,9 @@ export function mapToKeyValueArray<K extends string | number | symbol, V>(map: R
|
||||
export function getErrorMessage(e: unknown) {
|
||||
if (e && typeof e === "object" && "message" in e && typeof e.message === "string") {
|
||||
return e.message;
|
||||
} else {
|
||||
return "Unknown error";
|
||||
}
|
||||
return "Unknown error";
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -436,7 +436,6 @@ body.desktop .tabulator-popup-container,
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.dropdown-menu a:hover:not(.disabled),
|
||||
.dropdown-item:hover:not(.disabled, .dropdown-container-item),
|
||||
.tabulator-menu-item:hover,
|
||||
:root .excalidraw .context-menu .context-menu-item:hover {
|
||||
@@ -1952,6 +1951,10 @@ body.electron.platform-darwin:not(.native-titlebar) .tab-row-container {
|
||||
padding-inline-start: 1em;
|
||||
}
|
||||
|
||||
.tab-row-widget {
|
||||
contain: inline-size;
|
||||
}
|
||||
|
||||
#tab-row-left-spacer {
|
||||
width: env(titlebar-area-x);
|
||||
-webkit-app-region: drag;
|
||||
@@ -1961,7 +1964,7 @@ body.electron.platform-darwin:not(.native-titlebar):not(.full-screen) #tab-row-l
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
.tab-row-container {
|
||||
body.electron:not(.platform-darwin) .tab-row-container {
|
||||
padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw));
|
||||
}
|
||||
|
||||
|
||||
@@ -349,5 +349,5 @@ body .todo-list input[type="checkbox"]:not(:checked):before {
|
||||
|
||||
.note-split.with-hue *::selection,
|
||||
.quick-edit-dialog-wrapper.with-hue *::selection {
|
||||
background: hsl(var(--custom-color-hue), 49.2%, 35%);
|
||||
--selection-background-color: hsl(var(--custom-color-hue), 49.2%, 35%);
|
||||
}
|
||||
@@ -320,5 +320,5 @@
|
||||
|
||||
.note-split.with-hue *::selection,
|
||||
.quick-edit-dialog-wrapper.with-hue *::selection {
|
||||
background: hsl(var(--custom-color-hue), 60%, 90%);
|
||||
--selection-background-color: hsl(var(--custom-color-hue), 60%, 90%);
|
||||
}
|
||||
@@ -634,6 +634,10 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child {
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.ck-content strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.ck-content hr {
|
||||
margin: 5px 0;
|
||||
height: 1px;
|
||||
|
||||
@@ -11,11 +11,25 @@
|
||||
},
|
||||
"toast": {
|
||||
"critical-error": {
|
||||
"title": "خطأ فادح"
|
||||
"title": "خطأ فادح",
|
||||
"message": "حدث خطأ حرج يمنع تشغيل تطبيق العميل:\n\n{{message}}\n\nيُرجّح أن يكون سبب هذا الخطأ هو تعطل أحد البرامج النصية بشكل غير متوقع. حاول تشغيل التطبيق في الوضع الآمن لحل المشكلة."
|
||||
},
|
||||
"widget-error": {
|
||||
"title": "فشل في البدء بعنصر الواجهة"
|
||||
}
|
||||
"title": "فشل في البدء بعنصر الواجهة",
|
||||
"message-custom": "تعذر تهيئة عنصر واجهة المستخدم المخصص من الملاحظة ذات المعرّف \"{{id}}\" والعنوان \"{{title}}\" بسبب:\n\n{{message}}",
|
||||
"message-unknown": "تعذر تهيئة عنصر واجهة المستخدم غير المعروف بسبب:\n\n{{message}}"
|
||||
},
|
||||
"bundle-error": {
|
||||
"title": "فشل تحميل البرنامج النصي المخصص",
|
||||
"message": "تعذر تنفيذ البرنامج النصي بسبب:\n\n{{message}}"
|
||||
},
|
||||
"widget-list-error": {
|
||||
"title": "فشل في الحصول على قائمة الأدوات من الخادم"
|
||||
},
|
||||
"widget-render-error": {
|
||||
"title": "فشل عرض عنصر واجهة مستخدم React مخصص"
|
||||
},
|
||||
"widget-missing-parent": "لا تحتوي الأداة المخصصة على خاصية إلزامية '{{property}}'.\n\nإذا كان من المفترض تشغيل هذا البرنامج النصي بدون عنصر واجهة مستخدم، فاستخدم '#run=frontendStartup' بدلاً من ذلك."
|
||||
},
|
||||
"add_link": {
|
||||
"add_link": "أضافة رابط",
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
"widget-render-error": {
|
||||
"title": "渲染自定义 React 小部件失败"
|
||||
},
|
||||
"widget-missing-parent": "自定义小部件未定义强制性的 \"{{property}}\" 属性。",
|
||||
"widget-missing-parent": "自定义小部件未定义强制性的 \"{{property}}\" 属性。\n\n如果此脚本需要在没有 UI 元素的情况下运行,请改用“#run=frontendStartup”。",
|
||||
"open-script-note": "打开脚本笔记",
|
||||
"scripting-error": "自定义脚本错误:{{title}}"
|
||||
},
|
||||
@@ -1597,7 +1597,11 @@
|
||||
"note_detail": {
|
||||
"could_not_find_typewidget": "找不到类型为 '{{type}}' 的 typeWidget",
|
||||
"printing": "正在打印…",
|
||||
"printing_pdf": "正在导出为PDF…"
|
||||
"printing_pdf": "正在导出为PDF…",
|
||||
"print_report_title": "打印报告",
|
||||
"print_report_collection_content_other": "集合中的 {{count}} 篇笔记无法打印,因为它们不受支持或受到保护。",
|
||||
"print_report_collection_details_button": "查看详情",
|
||||
"print_report_collection_details_ignored_notes": "忽略的笔记"
|
||||
},
|
||||
"note_title": {
|
||||
"placeholder": "请输入笔记标题...",
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
"widget-render-error": {
|
||||
"title": "カスタム React ウィジェットのレンダリングに失敗しました"
|
||||
},
|
||||
"widget-missing-parent": "カスタムウィジェットに必須の '{{property}}' プロパティが定義されていません。",
|
||||
"widget-missing-parent": "カスタムウィジェットに必須の '{{property}}' プロパティが定義されていません。\n\nこのスクリプトを UI 要素なしで実行する場合は、代わりに '#run=frontendStartup' を使用してください。",
|
||||
"open-script-note": "スクリプトノートを開く",
|
||||
"scripting-error": "カスタムスクリプトエラー: {{title}}"
|
||||
},
|
||||
@@ -1930,7 +1930,11 @@
|
||||
"note_detail": {
|
||||
"could_not_find_typewidget": "タイプ {{type}} の typeWidget が見つかりませんでした",
|
||||
"printing": "印刷中です...",
|
||||
"printing_pdf": "PDF へのエクスポート中です..."
|
||||
"printing_pdf": "PDF へのエクスポート中です...",
|
||||
"print_report_title": "レポートを印刷",
|
||||
"print_report_collection_content_other": "コレクション内の {{count}} 件のノートは、サポートされていないか保護されているため、印刷できませんでした。",
|
||||
"print_report_collection_details_button": "詳細を見る",
|
||||
"print_report_collection_details_ignored_notes": "無視されたノート"
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
"ignore_this_change": "この変更を無視する",
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
"widget-render-error": {
|
||||
"title": "Не удалось отобразить пользовательский React виджет"
|
||||
},
|
||||
"widget-missing-parent": "В пользовательском виджете не определено обязательное свойство '{{property}}'.",
|
||||
"widget-missing-parent": "В пользовательском виджете не определено обязательное свойство '{{property}}'.\n\nЕсли этот скрипт предназначен для запуска без элемента пользовательского интерфейса, используйте '#run=frontendStartup'.",
|
||||
"open-script-note": "Открыть заметку со скриптом",
|
||||
"scripting-error": "Ошибка пользовательского скрипта: {{title}}"
|
||||
},
|
||||
@@ -2112,7 +2112,13 @@
|
||||
"note_detail": {
|
||||
"could_not_find_typewidget": "Не удалось найти typeWidget для типа '{{type}}'",
|
||||
"printing_pdf": "Выполняется экспорт PDF...",
|
||||
"printing": "Выполняется печать..."
|
||||
"printing": "Выполняется печать...",
|
||||
"print_report_title": "Отчет по печати",
|
||||
"print_report_collection_content_one": "{{count}} заметка в коллекции не удалось распечатать, поскольку она не поддерживается или защищена.",
|
||||
"print_report_collection_content_few": "{{count}} заметки в коллекции не удалось распечатать, поскольку они не поддерживаются или защищены.",
|
||||
"print_report_collection_content_many": "{{count}} заметок в коллекции не удалось распечатать, поскольку они не поддерживаются или защищены.",
|
||||
"print_report_collection_details_button": "Подробнее",
|
||||
"print_report_collection_details_ignored_notes": "Пропущенные заметки"
|
||||
},
|
||||
"book": {
|
||||
"no_children_help": "В этой коллекции нет дочерних заметок, поэтому отображать нечего. Подробности см. в <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a>.",
|
||||
|
||||
@@ -13,6 +13,7 @@ import debounce from "../services/debounce";
|
||||
import { t } from "../services/i18n";
|
||||
import { DefinitionObject, extractAttributeDefinitionTypeAndName, LabelType } from "../services/promoted_attribute_definition_parser";
|
||||
import server from "../services/server";
|
||||
import { randomString } from "../services/utils";
|
||||
import ws from "../services/ws";
|
||||
import { useNoteContext, useNoteLabel, useTriliumEvent, useUniqueName } from "./react/hooks";
|
||||
import NoteAutocomplete from "./react/NoteAutocomplete";
|
||||
@@ -116,7 +117,7 @@ export function usePromotedAttributeData(note: FNote | null | undefined, compone
|
||||
valueAttr.attributeId = "";
|
||||
}
|
||||
|
||||
const uniqueId = crypto.randomUUID();
|
||||
const uniqueId = randomString();
|
||||
cells.push({ definitionAttr, definition, valueAttr, valueName, uniqueId });
|
||||
}
|
||||
}
|
||||
@@ -319,7 +320,7 @@ function MultiplicityCell({ cell, cells, setCells, setCellToFocus, note, compone
|
||||
const index = cells.indexOf(cell);
|
||||
const newCell: Cell = {
|
||||
...cell,
|
||||
uniqueId: crypto.randomUUID(),
|
||||
uniqueId: randomString(),
|
||||
valueAttr: {
|
||||
attributeId: "",
|
||||
type: cell.valueAttr.type,
|
||||
|
||||
@@ -4,6 +4,7 @@ import Component, { TypedComponent } from "../components/component.js";
|
||||
import froca from "../services/froca.js";
|
||||
import { t } from "../services/i18n.js";
|
||||
import toastService, { showErrorForScriptNote } from "../services/toast.js";
|
||||
import { randomString } from "../services/utils.js";
|
||||
import { renderReactWidget } from "./react/react_utils.jsx";
|
||||
|
||||
export class TypedBasicWidget<T extends TypedComponent<any>> extends TypedComponent<T> {
|
||||
@@ -180,7 +181,7 @@ export class TypedBasicWidget<T extends TypedComponent<any>> extends TypedCompon
|
||||
});
|
||||
} else {
|
||||
toastService.showPersistent({
|
||||
id: `custom-widget-failure-unknown-${crypto.randomUUID()}`,
|
||||
id: `custom-widget-failure-unknown-${randomString()}`,
|
||||
title: t("toast.widget-error.title"),
|
||||
icon: "bx bx-error-circle",
|
||||
message: t("toast.widget-error.message-unknown", {
|
||||
|
||||
@@ -108,14 +108,6 @@ button.global-menu-button {
|
||||
margin-inline-end: 5px;
|
||||
}
|
||||
|
||||
.global-menu .dropdown-item .bx {
|
||||
position: relative;
|
||||
top: 3px;
|
||||
font-size: 120%;
|
||||
margin-inline-end: 6px;
|
||||
}
|
||||
|
||||
|
||||
.global-menu-button-wrapper:hover .global-menu-button-update-available-button {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ export function CustomNoteLauncher({ launcherNote, getTargetNoteId, getHoistedNo
|
||||
const activate = !!evt.shiftKey;
|
||||
await appContext.tabManager.openInNewTab(targetNoteId, hoistedNoteIdWithDefault, activate);
|
||||
} else {
|
||||
await appContext.tabManager.openInSameTab(targetNoteId);
|
||||
await appContext.tabManager.openInSameTab(targetNoteId, hoistedNoteIdWithDefault);
|
||||
}
|
||||
}, [ launcherNote, getTargetNoteId, getHoistedNoteId ]);
|
||||
|
||||
|
||||
@@ -5,9 +5,14 @@ body.experimental-feature-new-layout {
|
||||
|
||||
.title-actions {
|
||||
display: flex;
|
||||
max-width: var(--max-content-width);
|
||||
flex-direction: column;
|
||||
gap: 0.5em;
|
||||
|
||||
body.prefers-centered-content & {
|
||||
margin-inline: auto;
|
||||
}
|
||||
|
||||
&:not(:empty) {
|
||||
padding: 0.75em 15px;
|
||||
}
|
||||
|
||||
@@ -340,7 +340,7 @@ function AttributesButton({ note, attributesShown, setAttributesShown }: Attribu
|
||||
|
||||
// React to note changes.
|
||||
useEffect(() => {
|
||||
setCount(note.attributes.length);
|
||||
setCount(note.getAttributes().filter(a => !a.isAutoLink).length);
|
||||
}, [ note ]);
|
||||
|
||||
// React to changes in count.
|
||||
|
||||
@@ -21,6 +21,7 @@ div.note-title-widget {
|
||||
|
||||
&::selection {
|
||||
color: var(--main-text-color);
|
||||
background: var(--selection-background-color);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1177,7 +1177,7 @@ export function useContentElement(noteContext: NoteContext | null | undefined) {
|
||||
const requestId = ++requestIdRef.current;
|
||||
noteContext?.getContentElement().then(contentElement => {
|
||||
// Prevent stale async.
|
||||
if (requestId !== requestIdRef.current) return;
|
||||
if (!contentElement || requestId !== requestIdRef.current) return;
|
||||
setContentElement(contentElement?.[0] ?? null);
|
||||
forceUpdate(v => v + 1);
|
||||
});
|
||||
|
||||
@@ -3,6 +3,7 @@ import { createPortal } from "preact/compat";
|
||||
import { useCallback, useEffect, useState } from "preact/hooks";
|
||||
|
||||
import { t } from "../../services/i18n";
|
||||
import { randomString } from "../../services/utils";
|
||||
import { useActiveNoteContext, useContentElement, useIsNoteReadOnly, useNoteProperty, useTextEditor, useTriliumOptionJson } from "../react/hooks";
|
||||
import Modal from "../react/Modal";
|
||||
import { HighlightsListOptions } from "../type_widgets/options/text_notes";
|
||||
@@ -201,7 +202,7 @@ function extractHighlightsFromTextEditor(editor: CKTextEditor) {
|
||||
|
||||
if (Object.values(attrs).some(Boolean)) {
|
||||
result.push({
|
||||
id: crypto.randomUUID(),
|
||||
id: randomString(),
|
||||
text: item.data,
|
||||
attrs,
|
||||
textNode: item.textNode,
|
||||
@@ -269,7 +270,7 @@ function extractHighlightsFromStaticHtml(el: HTMLElement | null) {
|
||||
|
||||
if (Object.values(attrs).some(Boolean)) {
|
||||
highlights.push({
|
||||
id: crypto.randomUUID(),
|
||||
id: randomString(),
|
||||
text: node.textContent,
|
||||
element: el,
|
||||
attrs
|
||||
|
||||
@@ -11,7 +11,7 @@ import { t } from "../../services/i18n";
|
||||
import options from "../../services/options";
|
||||
import { DEFAULT_GUTTER_SIZE } from "../../services/resizer";
|
||||
import Button from "../react/Button";
|
||||
import { useActiveNoteContext, useLegacyWidget, useNoteProperty, useTriliumOptionBool, useTriliumOptionJson } from "../react/hooks";
|
||||
import { useActiveNoteContext, useLegacyWidget, useNoteProperty, useTriliumEvent, useTriliumOptionBool, useTriliumOptionJson } from "../react/hooks";
|
||||
import Icon from "../react/Icon";
|
||||
import LegacyRightPanelWidget from "../right_panel_widget";
|
||||
import HighlightsList from "./HighlightsList";
|
||||
@@ -30,6 +30,9 @@ export default function RightPanelContainer({ widgetsByParent }: { widgetsByPare
|
||||
const [ rightPaneVisible, setRightPaneVisible ] = useTriliumOptionBool("rightPaneVisible");
|
||||
const items = useItems(rightPaneVisible, widgetsByParent);
|
||||
useSplit(rightPaneVisible);
|
||||
useTriliumEvent("toggleRightPane", () => {
|
||||
setRightPaneVisible(!rightPaneVisible);
|
||||
});
|
||||
|
||||
return (
|
||||
<div id="right-pane">
|
||||
|
||||
@@ -5,6 +5,7 @@ import clsx from "clsx";
|
||||
import { useCallback, useEffect, useState } from "preact/hooks";
|
||||
|
||||
import { t } from "../../services/i18n";
|
||||
import { randomString } from "../../services/utils";
|
||||
import { useActiveNoteContext, useContentElement, useIsNoteReadOnly, useNoteProperty, useTextEditor } from "../react/hooks";
|
||||
import Icon from "../react/Icon";
|
||||
import RightPanelWidget from "./RightPanelWidget";
|
||||
@@ -172,7 +173,7 @@ function extractTocFromTextEditor(editor: CKTextEditor) {
|
||||
// Assign a unique ID
|
||||
let tocId = item.getAttribute(TOC_ID) as string | undefined;
|
||||
if (!tocId) {
|
||||
tocId = crypto.randomUUID();
|
||||
tocId = randomString();
|
||||
writer.setAttribute(TOC_ID, tocId, item);
|
||||
}
|
||||
|
||||
@@ -210,7 +211,7 @@ function extractTocFromStaticHtml(el: HTMLElement | null) {
|
||||
const headings: DomHeading[] = [];
|
||||
for (const headingEl of el.querySelectorAll<HTMLHeadingElement>("h1,h2,h3,h4,h5,h6")) {
|
||||
headings.push({
|
||||
id: crypto.randomUUID(),
|
||||
id: randomString(),
|
||||
level: parseInt(headingEl.tagName.substring(1), 10),
|
||||
text: headingEl.textContent,
|
||||
element: headingEl
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@triliumnext/desktop",
|
||||
"version": "0.101.0",
|
||||
"version": "0.101.1",
|
||||
"description": "Build your personal knowledge base with Trilium Notes",
|
||||
"private": true,
|
||||
"main": "src/main.ts",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@triliumnext/server",
|
||||
"version": "0.101.0",
|
||||
"version": "0.101.1",
|
||||
"description": "The server-side component of TriliumNext, which exposes the client via the web, allows for sync and provides a REST API for both internal and external use.",
|
||||
"private": true,
|
||||
"main": "./src/main.ts",
|
||||
|
||||
@@ -20,13 +20,19 @@
|
||||
"hero_section": {
|
||||
"github": "GitHub",
|
||||
"get_started": "ابدأ الان",
|
||||
"dockerhub": "مستودع Docker"
|
||||
"dockerhub": "مستودع Docker",
|
||||
"title": "رتب أفكارك. ابنِ قاعدة معرفتك الشخصية.",
|
||||
"subtitle": "تريليوم هو حل مفتوح المصدر لتدوين الملاحظات وتنظيم قاعدة المعرفة الشخصية. استخدمه محليًا على جهاز الكمبيوتر الخاص بك، أو قم بمزامنته مع خادمك المستضاف ذاتيًا للاحتفاظ بملاحظاتك أينما كنت.",
|
||||
"screenshot_alt": "لقطة شاشة لتطبيق Trilium Notes لسطح المكتب"
|
||||
},
|
||||
"organization_benefits": {
|
||||
"title": "تنظيم",
|
||||
"note_structure_title": "هيكيلية الملاحظة",
|
||||
"hoisting_title": "مساحات العمل والتركيز على الملاحظة",
|
||||
"attributes_title": "العلاقات وجداول الملاحظة"
|
||||
"attributes_title": "العلاقات وجداول الملاحظة",
|
||||
"note_structure_description": "يمكن تنظيم الملاحظات بشكل هرمي. لا حاجة للمجلدات، إذ يمكن أن تحتوي كل ملاحظة على ملاحظات فرعية. ويمكن إضافة الملاحظة الواحدة في عدة مواضع ضمن التسلسل الهرمي.",
|
||||
"attributes_description": "استخدم العلاقات بين الملاحظات أو أضف تصنيفات لتسهيل عملية التصنيف. استخدم السمات المُروَّجة لإدخال معلومات مُهيكلة يمكن استخدامها في الجداول واللوحات.",
|
||||
"hoisting_description": "يمكنك بسهولة فصل ملاحظاتك الشخصية وملاحظات العمل عن طريق تجميعها ضمن مساحة عمل، مما يركز شجرة الملاحظات الخاصة بك لعرض مجموعة محددة من الملاحظات فقط."
|
||||
},
|
||||
"productivity_benefits": {
|
||||
"sync_title": "المزامنة",
|
||||
|
||||
72
docs/README-ar.md
vendored
72
docs/README-ar.md
vendored
@@ -11,14 +11,14 @@
|
||||
|
||||
# ملاحظات تريليوم
|
||||
|
||||

|
||||
\
|
||||

|
||||
\
|
||||
 \
|
||||

|
||||
\
|
||||
[](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp)
|
||||
[](https://hosted.weblate.org/engage/trilium/)
|
||||
[](https://hosted.weblate.org/engage/trilium/)
|
||||
|
||||
<!-- translate:off -->
|
||||
<!-- LANGUAGE SWITCHER -->
|
||||
@@ -38,22 +38,20 @@ script)](./README-ZH_TW.md) | [English](../README.md) | [French](./README-fr.md)
|
||||
## ⬇️ تنزيل
|
||||
- [النسخة الأخيرة](https://github.com/TriliumNext/Trilium/releases/latest) –
|
||||
نسخة مستقرة، محبذة لأكثر المستخدمين.
|
||||
- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) –
|
||||
unstable development version, updated daily with the latest features and
|
||||
fixes.
|
||||
- [الإصدار الليلي](https://github.com/TriliumNext/Trilium/releases/tag/nightly)
|
||||
– إصدار تطوير غير مستقر، يتم تحديثه يوميًا بأحدث الميزات والإصلاحات.
|
||||
|
||||
## 📚توثيق
|
||||
|
||||
**Visit our comprehensive documentation at
|
||||
**يمكنكم الاطلاع على وثائقنا الشاملة على الرابط التالي:
|
||||
[docs.triliumnotes.org](https://docs.triliumnotes.org/)**
|
||||
|
||||
يتوفر التوثيق لدينا بصيغ متعددة:
|
||||
- **Online Documentation**: Browse the full documentation at
|
||||
- **الوثائق الإلكترونية**: تصفح الوثائق الكاملة على
|
||||
[docs.triliumnotes.org](https://docs.triliumnotes.org/)
|
||||
- **In-App Help**: Press `F1` within Trilium to access the same documentation
|
||||
directly in the application
|
||||
- **GitHub**: Navigate through the [User Guide](./User%20Guide/User%20Guide/) in
|
||||
this repository
|
||||
- **المساعدة داخل التطبيق**: اضغط على مفتاح `F1` داخل تطبيق Trilium للوصول إلى
|
||||
نفس الوثائق مباشرةً داخل التطبيق
|
||||
- **GitHub**: تصفح [دليل المستخدم](./User%20Guide/User%20Guide/) في هذا المستودع
|
||||
|
||||
### روابط سريعة
|
||||
- [دليل البدء السريع](https://docs.triliumnotes.org/)
|
||||
@@ -64,30 +62,30 @@ script)](./README-ZH_TW.md) | [English](../README.md) | [French](./README-fr.md)
|
||||
للملاحظات](https://docs.triliumnotes.org/user-guide/setup/upgrading)
|
||||
- [مفاهيم ومميزات
|
||||
اساسية](https://docs.triliumnotes.org/user-guide/concepts/notes)
|
||||
- [Patterns of Personal Knowledge
|
||||
Base](https://docs.triliumnotes.org/user-guide/misc/patterns-of-personal-knowledge)
|
||||
- [أنماط قاعدة المعرفة
|
||||
الشخصية](https://docs.triliumnotes.org/user-guide/misc/patterns-of-personal-knowledge)
|
||||
|
||||
## 🎁الميزات
|
||||
|
||||
* Notes can be arranged into arbitrarily deep tree. Single note can be placed
|
||||
into multiple places in the tree (see
|
||||
[cloning](https://docs.triliumnotes.org/user-guide/concepts/notes/cloning))
|
||||
* Rich WYSIWYG note editor including e.g. tables, images and
|
||||
[math](https://docs.triliumnotes.org/user-guide/note-types/text) with markdown
|
||||
[autoformat](https://docs.triliumnotes.org/user-guide/note-types/text/markdown-formatting)
|
||||
* Support for editing [notes with source
|
||||
code](https://docs.triliumnotes.org/user-guide/note-types/code), including
|
||||
syntax highlighting
|
||||
* Fast and easy [navigation between
|
||||
notes](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-navigation),
|
||||
full text search and [note
|
||||
hoisting](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-hoisting)
|
||||
* Seamless [note
|
||||
versioning](https://docs.triliumnotes.org/user-guide/concepts/notes/note-revisions)
|
||||
* Note
|
||||
[attributes](https://docs.triliumnotes.org/user-guide/advanced-usage/attributes)
|
||||
can be used for note organization, querying and advanced
|
||||
[scripting](https://docs.triliumnotes.org/user-guide/scripts)
|
||||
* يمكن ترتيب النوتات الموسيقية في شجرة ذات عمق غير محدود. ويمكن وضع نوتة واحدة
|
||||
في أماكن متعددة في الشجرة (انظر
|
||||
[الاستنساخ](https://docs.triliumnotes.org/user-guide/concepts/notes/cloning))
|
||||
* محرر ملاحظات WYSIWYG غني يتضمن على سبيل المثال الجداول والصور
|
||||
و[الرياضيات](https://docs.triliumnotes.org/user-guide/note-types/text) مع
|
||||
تنسيق تلقائي لـ Markdown[2]
|
||||
* دعم تحرير [الملاحظات التي تحتوي على شفرة
|
||||
المصدر](https://docs.triliumnotes.org/user-guide/note-types/code)، بما في ذلك
|
||||
تمييز بناء الجملة
|
||||
* التنقل السريع والسهل بين الملاحظات
|
||||
(https://docs.triliumnotes.org/user-guide/concepts/navigation/note-navigation)،
|
||||
والبحث في النص الكامل، ورفع الملاحظات
|
||||
(https://docs.triliumnotes.org/user-guide/concepts/navigation/note-hoisting)
|
||||
* سلس [ملاحظة حول إصدار
|
||||
النظام](https://docs.triliumnotes.org/user-guide/concepts/notes/note-revisions)
|
||||
* يمكن استخدام
|
||||
[السمات](https://docs.triliumnotes.org/user-guide/advanced-usage/attributes)
|
||||
لتنظيم الملاحظات والاستعلام عنها و[البرمجة
|
||||
النصية](https://docs.triliumnotes.org/user-guide/scripts) المتقدمة
|
||||
* UI available in English, German, Spanish, French, Romanian, and Chinese
|
||||
(simplified and traditional)
|
||||
* Direct [OpenID and TOTP
|
||||
|
||||
122
docs/Release Notes/!!!meta.json
vendored
122
docs/Release Notes/!!!meta.json
vendored
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"formatVersion": 2,
|
||||
"appVersion": "0.100.0",
|
||||
"appVersion": "0.101.1",
|
||||
"files": [
|
||||
{
|
||||
"isClone": false,
|
||||
@@ -61,6 +61,32 @@
|
||||
"attachments": [],
|
||||
"dirFileName": "Release Notes",
|
||||
"children": [
|
||||
{
|
||||
"isClone": false,
|
||||
"noteId": "AgUcrU9nFXuW",
|
||||
"notePath": [
|
||||
"hD3V4hiu2VW4",
|
||||
"AgUcrU9nFXuW"
|
||||
],
|
||||
"title": "v0.101.1",
|
||||
"notePosition": 10,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
"mime": "text/html",
|
||||
"attributes": [
|
||||
{
|
||||
"type": "relation",
|
||||
"name": "template",
|
||||
"value": "wyurrlcDl416",
|
||||
"isInheritable": false,
|
||||
"position": 60
|
||||
}
|
||||
],
|
||||
"format": "markdown",
|
||||
"dataFileName": "v0.101.1.md",
|
||||
"attachments": []
|
||||
},
|
||||
{
|
||||
"isClone": false,
|
||||
"noteId": "uYwlZ594eyJu",
|
||||
@@ -69,7 +95,7 @@
|
||||
"uYwlZ594eyJu"
|
||||
],
|
||||
"title": "v0.101.0",
|
||||
"notePosition": 10,
|
||||
"notePosition": 20,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -95,7 +121,7 @@
|
||||
"iPGKEk7pwJXK"
|
||||
],
|
||||
"title": "v0.100.0",
|
||||
"notePosition": 20,
|
||||
"notePosition": 30,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -121,7 +147,7 @@
|
||||
"7HKMTjmopLcM"
|
||||
],
|
||||
"title": "v0.99.5",
|
||||
"notePosition": 30,
|
||||
"notePosition": 40,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -147,7 +173,7 @@
|
||||
"RMBaNYPsRpIr"
|
||||
],
|
||||
"title": "v0.99.4",
|
||||
"notePosition": 40,
|
||||
"notePosition": 50,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -173,7 +199,7 @@
|
||||
"yuroLztFfpu5"
|
||||
],
|
||||
"title": "v0.99.3",
|
||||
"notePosition": 50,
|
||||
"notePosition": 60,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -199,7 +225,7 @@
|
||||
"z207sehwMJ6C"
|
||||
],
|
||||
"title": "v0.99.2",
|
||||
"notePosition": 60,
|
||||
"notePosition": 70,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -225,7 +251,7 @@
|
||||
"WGQsXq2jNyTi"
|
||||
],
|
||||
"title": "v0.99.1",
|
||||
"notePosition": 70,
|
||||
"notePosition": 80,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -251,7 +277,7 @@
|
||||
"cyw2Yue9vXf3"
|
||||
],
|
||||
"title": "v0.99.0",
|
||||
"notePosition": 80,
|
||||
"notePosition": 90,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -277,7 +303,7 @@
|
||||
"QOJwjruOUr4k"
|
||||
],
|
||||
"title": "v0.98.1",
|
||||
"notePosition": 90,
|
||||
"notePosition": 100,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -303,7 +329,7 @@
|
||||
"PLUoryywi0BC"
|
||||
],
|
||||
"title": "v0.98.0",
|
||||
"notePosition": 100,
|
||||
"notePosition": 110,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -329,7 +355,7 @@
|
||||
"lvOuiWsLDv8F"
|
||||
],
|
||||
"title": "v0.97.2",
|
||||
"notePosition": 110,
|
||||
"notePosition": 120,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -355,7 +381,7 @@
|
||||
"OtFZ6Nd9vM3n"
|
||||
],
|
||||
"title": "v0.97.1",
|
||||
"notePosition": 120,
|
||||
"notePosition": 130,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -381,7 +407,7 @@
|
||||
"SJZ5PwfzHSQ1"
|
||||
],
|
||||
"title": "v0.97.0",
|
||||
"notePosition": 130,
|
||||
"notePosition": 140,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -407,7 +433,7 @@
|
||||
"mYXFde3LuNR7"
|
||||
],
|
||||
"title": "v0.96.0",
|
||||
"notePosition": 140,
|
||||
"notePosition": 150,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -433,7 +459,7 @@
|
||||
"jthwbL0FdaeU"
|
||||
],
|
||||
"title": "v0.95.0",
|
||||
"notePosition": 150,
|
||||
"notePosition": 160,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -459,7 +485,7 @@
|
||||
"7HGYsJbLuhnv"
|
||||
],
|
||||
"title": "v0.94.1",
|
||||
"notePosition": 160,
|
||||
"notePosition": 170,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -485,7 +511,7 @@
|
||||
"Neq53ujRGBqv"
|
||||
],
|
||||
"title": "v0.94.0",
|
||||
"notePosition": 170,
|
||||
"notePosition": 180,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -511,7 +537,7 @@
|
||||
"VN3xnce1vLkX"
|
||||
],
|
||||
"title": "v0.93.0",
|
||||
"notePosition": 180,
|
||||
"notePosition": 190,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -529,7 +555,7 @@
|
||||
"WRaBfQqPr6qo"
|
||||
],
|
||||
"title": "v0.92.7",
|
||||
"notePosition": 190,
|
||||
"notePosition": 200,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -555,7 +581,7 @@
|
||||
"a2rwfKNmUFU1"
|
||||
],
|
||||
"title": "v0.92.6",
|
||||
"notePosition": 200,
|
||||
"notePosition": 210,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -573,7 +599,7 @@
|
||||
"fEJ8qErr0BKL"
|
||||
],
|
||||
"title": "v0.92.5-beta",
|
||||
"notePosition": 210,
|
||||
"notePosition": 220,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -591,7 +617,7 @@
|
||||
"kkkZQQGSXjwy"
|
||||
],
|
||||
"title": "v0.92.4",
|
||||
"notePosition": 220,
|
||||
"notePosition": 230,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -609,7 +635,7 @@
|
||||
"vAroNixiezaH"
|
||||
],
|
||||
"title": "v0.92.3-beta",
|
||||
"notePosition": 230,
|
||||
"notePosition": 240,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -627,7 +653,7 @@
|
||||
"mHEq1wxAKNZd"
|
||||
],
|
||||
"title": "v0.92.2-beta",
|
||||
"notePosition": 240,
|
||||
"notePosition": 250,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -645,7 +671,7 @@
|
||||
"IykjoAmBpc61"
|
||||
],
|
||||
"title": "v0.92.1-beta",
|
||||
"notePosition": 250,
|
||||
"notePosition": 260,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -663,7 +689,7 @@
|
||||
"dq2AJ9vSBX4Y"
|
||||
],
|
||||
"title": "v0.92.0-beta",
|
||||
"notePosition": 260,
|
||||
"notePosition": 270,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -681,7 +707,7 @@
|
||||
"3a8aMe4jz4yM"
|
||||
],
|
||||
"title": "v0.91.6",
|
||||
"notePosition": 270,
|
||||
"notePosition": 280,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -699,7 +725,7 @@
|
||||
"8djQjkiDGESe"
|
||||
],
|
||||
"title": "v0.91.5",
|
||||
"notePosition": 280,
|
||||
"notePosition": 290,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -717,7 +743,7 @@
|
||||
"OylxVoVJqNmr"
|
||||
],
|
||||
"title": "v0.91.4-beta",
|
||||
"notePosition": 290,
|
||||
"notePosition": 300,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -735,7 +761,7 @@
|
||||
"tANGQDvnyhrj"
|
||||
],
|
||||
"title": "v0.91.3-beta",
|
||||
"notePosition": 300,
|
||||
"notePosition": 310,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -753,7 +779,7 @@
|
||||
"hMoBfwSoj1SC"
|
||||
],
|
||||
"title": "v0.91.2-beta",
|
||||
"notePosition": 310,
|
||||
"notePosition": 320,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -771,7 +797,7 @@
|
||||
"a2XMSKROCl9z"
|
||||
],
|
||||
"title": "v0.91.1-beta",
|
||||
"notePosition": 320,
|
||||
"notePosition": 330,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -789,7 +815,7 @@
|
||||
"yqXFvWbLkuMD"
|
||||
],
|
||||
"title": "v0.90.12",
|
||||
"notePosition": 330,
|
||||
"notePosition": 340,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -807,7 +833,7 @@
|
||||
"veS7pg311yJP"
|
||||
],
|
||||
"title": "v0.90.11-beta",
|
||||
"notePosition": 340,
|
||||
"notePosition": 350,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -825,7 +851,7 @@
|
||||
"sq5W9TQxRqMq"
|
||||
],
|
||||
"title": "v0.90.10-beta",
|
||||
"notePosition": 350,
|
||||
"notePosition": 360,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -843,7 +869,7 @@
|
||||
"yFEGVCUM9tPx"
|
||||
],
|
||||
"title": "v0.90.9-beta",
|
||||
"notePosition": 360,
|
||||
"notePosition": 370,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -861,7 +887,7 @@
|
||||
"o4wAGqOQuJtV"
|
||||
],
|
||||
"title": "v0.90.8",
|
||||
"notePosition": 370,
|
||||
"notePosition": 380,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -894,7 +920,7 @@
|
||||
"i4A5g9iOg9I0"
|
||||
],
|
||||
"title": "v0.90.7-beta",
|
||||
"notePosition": 380,
|
||||
"notePosition": 390,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -912,7 +938,7 @@
|
||||
"ThNf2GaKgXUs"
|
||||
],
|
||||
"title": "v0.90.6-beta",
|
||||
"notePosition": 390,
|
||||
"notePosition": 400,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -930,7 +956,7 @@
|
||||
"G4PAi554kQUr"
|
||||
],
|
||||
"title": "v0.90.5-beta",
|
||||
"notePosition": 400,
|
||||
"notePosition": 410,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -957,7 +983,7 @@
|
||||
"zATRobGRCmBn"
|
||||
],
|
||||
"title": "v0.90.4",
|
||||
"notePosition": 410,
|
||||
"notePosition": 420,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -975,7 +1001,7 @@
|
||||
"sCDLf8IKn3Iz"
|
||||
],
|
||||
"title": "v0.90.3",
|
||||
"notePosition": 420,
|
||||
"notePosition": 430,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -993,7 +1019,7 @@
|
||||
"VqqyBu4AuTjC"
|
||||
],
|
||||
"title": "v0.90.2-beta",
|
||||
"notePosition": 430,
|
||||
"notePosition": 440,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -1011,7 +1037,7 @@
|
||||
"RX3Nl7wInLsA"
|
||||
],
|
||||
"title": "v0.90.1-beta",
|
||||
"notePosition": 440,
|
||||
"notePosition": 450,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -1029,7 +1055,7 @@
|
||||
"GyueACukPWjk"
|
||||
],
|
||||
"title": "v0.90.0-beta",
|
||||
"notePosition": 450,
|
||||
"notePosition": 460,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -1047,7 +1073,7 @@
|
||||
"kzjHexDTTeVB"
|
||||
],
|
||||
"title": "v0.48",
|
||||
"notePosition": 460,
|
||||
"notePosition": 470,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
@@ -1114,7 +1140,7 @@
|
||||
"wyurrlcDl416"
|
||||
],
|
||||
"title": "Release Template",
|
||||
"notePosition": 470,
|
||||
"notePosition": 480,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
|
||||
2
docs/Release Notes/Release Notes/v0.101.0.md
vendored
2
docs/Release Notes/Release Notes/v0.101.0.md
vendored
@@ -12,7 +12,7 @@
|
||||
|
||||
* A new layout was introduced which heavily changes both existing UI elements, as well as adds some new ones (by @eliandoran and @adoriandoran, with special thanks for @rom1dep for the valuable suggestions).
|
||||
* The goal of this new layout is to modernize the application and to make it more intuitive but at the same time to reduce clutter.
|
||||
* See [documentation](https://docs.triliumnotes.org/user-guide/concepts/ui/New%20Layout) of the changes and the new UI elements.
|
||||
* See [documentation](https://docs.triliumnotes.org/user-guide/concepts/ui/new-layout) of the changes and the new UI elements.
|
||||
* Notes can be more easily navigated across the hierarchy using the breadcrumbs displayed underneath the tab bar.
|
||||
* The old layout can still be used, for now. Feedback is welcome.
|
||||
* Near the tab bar now there are [built-in buttons to go the previous or the next note in history](https://github.com/TriliumNext/Trilium/pull/8003/files) (only if the back/forward buttons are not already placed in the launch bar).
|
||||
|
||||
100
docs/Release Notes/Release Notes/v0.101.1.md
vendored
Normal file
100
docs/Release Notes/Release Notes/v0.101.1.md
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
# v0.101.1
|
||||
> [!NOTE]
|
||||
> This is a hotfix for yesterday's release, which marked the 8-year anniversary of Trilium, celebrating its [first public release](https://github.com/TriliumNext/Trilium/releases/tag/v0.0.9) on December 25th, 2017.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If you enjoyed this release, consider showing a token of appreciation by:
|
||||
>
|
||||
> * Pressing the “Star” button on [GitHub](https://github.com/TriliumNext/Trilium) (top-right).
|
||||
> * Considering a one-time or recurrent donation to the [lead developer](https://github.com/eliandoran) via [GitHub Sponsors](https://github.com/sponsors/eliandoran) or [PayPal](https://paypal.me/eliandoran).
|
||||
|
||||
## 💡 Key highlights
|
||||
|
||||
* A new layout was introduced which heavily changes both existing UI elements, as well as adds some new ones (by @eliandoran and @adoriandoran, with special thanks for @rom1dep for the valuable suggestions).
|
||||
* The goal of this new layout is to modernize the application and to make it more intuitive but at the same time to reduce clutter.
|
||||
* See [documentation](https://docs.triliumnotes.org/user-guide/concepts/ui/new-layout) of the changes and the new UI elements.
|
||||
* Notes can be more easily navigated across the hierarchy using the breadcrumbs displayed underneath the tab bar.
|
||||
* The old layout can still be used, for now. Feedback is welcome.
|
||||
* Near the tab bar now there are [built-in buttons to go the previous or the next note in history](https://github.com/TriliumNext/Trilium/pull/8003/files) (only if the back/forward buttons are not already placed in the launch bar).
|
||||
* **Scripting overhaul:** Custom widgets and Render note can now be written in Preact using JSX instead of the legacy format (jQuery + custom component framework). For more information, see [documentation on Preact in Trilium](https://docs.triliumnotes.org/user-guide/scripts/frontend-basics/Preact).
|
||||
|
||||
## 🐞 New bugfixes in v0.101.1
|
||||
|
||||
* [Right pane toggle missing on macOS vertical layout](https://github.com/TriliumNext/Trilium/issues/8157)
|
||||
* [Launchpad Note Launcher hoisting no longer working](https://github.com/TriliumNext/Trilium/issues/8160)
|
||||
* Toggle right pane keyboard button not working on new layout
|
||||
* [Tabs do not appear when using vertical layout and legacy theme](https://github.com/TriliumNext/Trilium/issues/8170) by @adoriandoran
|
||||
* [Text in headings do not respond to being bolded](https://github.com/TriliumNext/Trilium/issues/8177) by @adoriandoran
|
||||
* Table of contents in new layout: not displaying correctly on first render.
|
||||
* [The text editor keeps crashing in non-HTTPS](https://github.com/TriliumNext/Trilium/issues/8165)
|
||||
|
||||
## 🐞 Bugfixes in v0.101.0
|
||||
|
||||
* [Ctrl+F when a dialog is open opens different search dialog](https://github.com/TriliumNext/Trilium/issues/5735)
|
||||
* Toast: Icon missing for error messages
|
||||
* Launch bar calendar would jump to the wrong week note if it was in between years.
|
||||
* Launch bar calendar month selector was wrongly positioned.
|
||||
* Tooltips would sometimes be duplicated if an element is focused.
|
||||
* Text notes:
|
||||
* Missing padding in `<pre>` without `<code>`.
|
||||
* [Content disappears when inserting code block via Markdown formatting](https://github.com/TriliumNext/Trilium/issues/5776)
|
||||
* [Data loss for opened tabs after CKEditor crash](https://github.com/TriliumNext/Trilium/issues/7739)
|
||||
* [Mind Map export does not show text in links between nodes](https://github.com/TriliumNext/Trilium/issues/7829) by @lzinga
|
||||
* Webview: Layout issues when no source site is set.
|
||||
* Incorrect help button for content language.
|
||||
* Links in inherited attributes not underlined.
|
||||
* Mermaid preview did not render full-height if in read-only while in vertical layout.
|
||||
* Icons: `border-left` icon was missing.
|
||||
* Auto-complete shows empty name for hoisted note.
|
||||
* [Missing null check for canvas elements in fulltext search](https://github.com/TriliumNext/Trilium/pull/8090) by @Soein
|
||||
* Share badge would always indicate “Shared locally” when accessing the server version.
|
||||
* Clicking in the outer area of a menu dismisses it.
|
||||
* Geomap: street names not rendering in vector maps.
|
||||
* In code options modal (ribbon), the tooltip is behind the modal.
|
||||
* [Archived deeply nested notes appear in classic collections without #includeArchived](https://github.com/TriliumNext/Trilium/issues/8127)
|
||||
* [Grid collection not displaying images properly](https://github.com/TriliumNext/Trilium/issues/7969)
|
||||
* Printing collections: skip protected notes (if they are not unlocked) and files.
|
||||
* [Attachment auto-deletion displayed time is off by a factor of 1000](https://github.com/TriliumNext/Trilium/issues/7987)
|
||||
* [Note title color for legacy themes](https://github.com/TriliumNext/Trilium/pull/7997) by @Nriver
|
||||
* [First input box of the promoted multi relation edits last relation](https://github.com/TriliumNext/Trilium/issues/7992)
|
||||
|
||||
## ✨ Improvements
|
||||
|
||||
* Improved error handling for custom widgets.
|
||||
* Launch bar:
|
||||
* The horizontal launch bar can now be scrolled simply by scrolling the mouse wheel.
|
||||
* Tooltips are shown faster (no fade).
|
||||
* Improved error handling
|
||||
* HTTP errors are now more user-friendly.
|
||||
* Warn on Traefik request failures.
|
||||
* CKEditor crashes are notified, including an easy way to provide information for error reports.
|
||||
* Hide ribbon in Options.
|
||||
* Removed margins and rounded corners for the code editor.
|
||||
* Backend logs: reduced extra padding & decrease font size for readability.
|
||||
* Improved error handling for custom widgets.
|
||||
* Code notes will now have a default icon based on the language (e.g. custom icon for JS code notes). Only a subset of languages have a dedicated icon.
|
||||
* Printing collections will now display a message if one or more notes are not printable.
|
||||
* UI improvements by @adoriandoran
|
||||
|
||||
## 📖 Documentation
|
||||
|
||||
* [Wrong links in README](https://github.com/TriliumNext/Trilium/issues/7246)
|
||||
* [Improve organization of links](https://github.com/TriliumNext/Trilium/pull/8057)
|
||||
* Widget scripts are now better documented, in both the legacy (jQuery) and Preact/JSX format.
|
||||
|
||||
## 🌍 Internationalization
|
||||
|
||||
* Untranslated error message for custom widgets.
|
||||
|
||||
## 🛠️ Technical updates
|
||||
|
||||
* Ported the following components to React. If you notice any issues with your launchers or the bar itself, feel free to report them.
|
||||
* The launch bar and all its widgets.
|
||||
* The toast/notification system.
|
||||
* [Add dev shell and direnv support](https://github.com/TriliumNext/Trilium/pull/8011) by @yzx9 and @contributor
|
||||
* **Minor breaking change**: custom widgets using the typo `node-detail-pane` will not be supported anymore. Use `note-detail-pane` instead.
|
||||
* [ETAPI OpenAPI: Add missing share format](https://github.com/TriliumNext/Trilium/pull/8125) by @kalbasit
|
||||
|
||||
## 🔒️ Security fixes
|
||||
|
||||
* A security vulnerability was reported by @sivaadityacoder and fixed by @perfectra1n. More information to be provided in around a month.
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@triliumnext/source",
|
||||
"version": "0.101.0",
|
||||
"version": "0.101.1",
|
||||
"description": "Build your personal knowledge base with Trilium Notes",
|
||||
"directories": {
|
||||
"doc": "docs"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@triliumnext/commons",
|
||||
"version": "0.101.0",
|
||||
"version": "0.101.1",
|
||||
"description": "Shared library between the clients (e.g. browser, Electron) and the server, mostly for type definitions and utility methods.",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
|
||||
Reference in New Issue
Block a user