diff --git a/_regroup/package.json b/_regroup/package.json index 11f8b299f..6c1f01e99 100644 --- a/_regroup/package.json +++ b/_regroup/package.json @@ -48,9 +48,7 @@ "lorem-ipsum": "2.0.8", "rcedit": "4.0.1", "rimraf": "6.1.0", - "tslib": "2.8.1", - "typedoc": "0.28.14", - "typedoc-plugin-missing-exports": "4.1.2" + "tslib": "2.8.1" }, "optionalDependencies": { "appdmg": "0.6.6" diff --git a/_regroup/typedoc.json b/_regroup/typedoc.json deleted file mode 100644 index 30771621c..000000000 --- a/_regroup/typedoc.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "entryPoints": [ - "src/services/backend_script_entrypoint.ts", - "src/public/app/services/frontend_script_entrypoint.ts" - ], - "plugin": [ - "typedoc-plugin-missing-exports" - ], - "outputs": [ - { - "name": "html", - "path": "./docs/Script API" - } - ] -} diff --git a/apps/build-docs/package.json b/apps/build-docs/package.json new file mode 100644 index 000000000..0a19e8072 --- /dev/null +++ b/apps/build-docs/package.json @@ -0,0 +1,22 @@ +{ + "name": "build-docs", + "version": "1.0.0", + "description": "", + "main": "src/main.ts", + "scripts": { + "start": "tsx ." + }, + "keywords": [], + "author": "Elian Doran ", + "license": "AGPL-3.0-only", + "packageManager": "pnpm@10.19.0", + "devDependencies": { + "@redocly/cli": "2.10.0", + "archiver": "7.0.1", + "fs-extra": "11.3.2", + "react": "19.2.0", + "react-dom": "19.2.0", + "typedoc": "0.28.14", + "typedoc-plugin-missing-exports": "4.1.2" + } +} diff --git a/apps/build-docs/src/backend_script_entrypoint.ts b/apps/build-docs/src/backend_script_entrypoint.ts new file mode 100644 index 000000000..bc9087c0c --- /dev/null +++ b/apps/build-docs/src/backend_script_entrypoint.ts @@ -0,0 +1,36 @@ +/** + * The backend script API is accessible to code notes with the "JS (backend)" language. + * + * The entire API is exposed as a single global: {@link api} + * + * @module Backend Script API + */ + +/** + * This file creates the entrypoint for TypeDoc that simulates the context from within a + * script note on the server side. + * + * Make sure to keep in line with backend's `script_context.ts`. + */ + +export type { default as AbstractBeccaEntity } from "../../server/src/becca/entities/abstract_becca_entity.js"; +export type { default as BAttachment } from "../../server/src/becca/entities/battachment.js"; +export type { default as BAttribute } from "../../server/src/becca/entities/battribute.js"; +export type { default as BBranch } from "../../server/src/becca/entities/bbranch.js"; +export type { default as BEtapiToken } from "../../server/src/becca/entities/betapi_token.js"; +export type { BNote }; +export type { default as BOption } from "../../server/src/becca/entities/boption.js"; +export type { default as BRecentNote } from "../../server/src/becca/entities/brecent_note.js"; +export type { default as BRevision } from "../../server/src/becca/entities/brevision.js"; + +import BNote from "../../server/src/becca/entities/bnote.js"; +import BackendScriptApi, { type Api } from "../../server/src/services/backend_script_api.js"; + +export type { Api }; + +const fakeNote = new BNote(); + +/** + * The `api` global variable allows access to the backend script API, which is documented in {@link Api}. + */ +export const api: Api = new BackendScriptApi(fakeNote, {}); diff --git a/apps/edit-docs/src/build-docs.ts b/apps/build-docs/src/build-docs.ts similarity index 81% rename from apps/edit-docs/src/build-docs.ts rename to apps/build-docs/src/build-docs.ts index aca569772..39a3dd30b 100644 --- a/apps/edit-docs/src/build-docs.ts +++ b/apps/build-docs/src/build-docs.ts @@ -4,14 +4,17 @@ process.env.NODE_ENV = "development"; import cls from "@triliumnext/server/src/services/cls.js"; import { dirname, join, resolve } from "path"; -import fs, { copyFile } from "fs/promises"; -import fsExtra, { createWriteStream, type WriteStream } from "fs-extra"; +import * as fs from "fs/promises"; +import * as fsExtra from "fs-extra"; import archiver from "archiver"; +import { WriteStream } from "fs"; +import { execSync } from "child_process"; +import BuildContext from "./context.js"; const DOCS_ROOT = "../../../docs"; const OUTPUT_DIR = "../../site"; -async function main() { +async function buildDocsInner() { const i18n = await import("@triliumnext/server/src/services/i18n.js"); await i18n.initializeTranslations(); @@ -30,7 +33,7 @@ async function main() { "export", null ); - const fileOutputStream = createWriteStream(zipFilePath); + const fileOutputStream = fsExtra.createWriteStream(zipFilePath); await exportToZip(taskContext, branch, "share", fileOutputStream); await waitForStreamToFinish(fileOutputStream); await extractZip(zipFilePath, OUTPUT_DIR); @@ -41,7 +44,7 @@ async function main() { } // Copy favicon. - await copyFile("../../apps/website/src/assets/favicon.ico", join(OUTPUT_DIR, "favicon.ico")); + await fs.copyFile("../../apps/website/src/assets/favicon.ico", join(OUTPUT_DIR, "favicon.ico")); console.log("Documentation built successfully!"); } @@ -106,4 +109,19 @@ export async function extractZip(zipFilePath: string, outputPath: string, ignore }); } -cls.init(main); +export default async function buildDocs({ gitRootDir }: BuildContext) { + // Build the share theme. + execSync(`pnpm run --filter share-theme build`, { + stdio: "inherit", + cwd: gitRootDir + }); + + // Trigger the actual build. + await new Promise((res, rej) => { + cls.init(() => { + buildDocsInner() + .catch(rej) + .then(res); + }); + }); +} diff --git a/apps/build-docs/src/context.ts b/apps/build-docs/src/context.ts new file mode 100644 index 000000000..ab2289e50 --- /dev/null +++ b/apps/build-docs/src/context.ts @@ -0,0 +1,4 @@ +export default interface BuildContext { + gitRootDir: string; + baseDir: string; +} diff --git a/apps/build-docs/src/frontend_script_entrypoint.ts b/apps/build-docs/src/frontend_script_entrypoint.ts new file mode 100644 index 000000000..768774eca --- /dev/null +++ b/apps/build-docs/src/frontend_script_entrypoint.ts @@ -0,0 +1,28 @@ +/** + * The front script API is accessible to code notes with the "JS (frontend)" language. + * + * The entire API is exposed as a single global: {@link api} + * + * @module Frontend Script API + */ + +/** + * This file creates the entrypoint for TypeDoc that simulates the context from within a + * script note. + * + * Make sure to keep in line with frontend's `script_context.ts`. + */ + +export type { default as BasicWidget } from "../../client/src/widgets/basic_widget.js"; +export type { default as FAttachment } from "../../client/src/entities/fattachment.js"; +export type { default as FAttribute } from "../../client/src/entities/fattribute.js"; +export type { default as FBranch } from "../../client/src/entities/fbranch.js"; +export type { default as FNote } from "../../client/src/entities/fnote.js"; +export type { Api } from "../../client/src/services/frontend_script_api.js"; +export type { default as NoteContextAwareWidget } from "../../client/src/widgets/note_context_aware_widget.js"; +export type { default as RightPanelWidget } from "../../client/src/widgets/right_panel_widget.js"; + +import FrontendScriptApi, { type Api } from "../../client/src/services/frontend_script_api.js"; + +//@ts-expect-error +export const api: Api = new FrontendScriptApi(); diff --git a/apps/build-docs/src/main.ts b/apps/build-docs/src/main.ts new file mode 100644 index 000000000..8e6804fe5 --- /dev/null +++ b/apps/build-docs/src/main.ts @@ -0,0 +1,26 @@ +import { join } from "path"; +import BuildContext from "./context"; +import buildSwagger from "./swagger"; +import { existsSync, mkdirSync, rmSync } from "fs"; +import buildDocs from "./build-docs"; +import buildScriptApi from "./script-api"; + +const context: BuildContext = { + gitRootDir: join(__dirname, "../../../"), + baseDir: join(__dirname, "../../../site") +}; + +async function main() { + // Clean input dir. + if (existsSync(context.baseDir)) { + rmSync(context.baseDir, { recursive: true }); + } + mkdirSync(context.baseDir); + + // Start building. + await buildDocs(context); + buildSwagger(context); + buildScriptApi(context); +} + +main(); diff --git a/apps/build-docs/src/script-api.ts b/apps/build-docs/src/script-api.ts new file mode 100644 index 000000000..8473ae3a0 --- /dev/null +++ b/apps/build-docs/src/script-api.ts @@ -0,0 +1,15 @@ +import { execSync } from "child_process"; +import BuildContext from "./context"; +import { join } from "path"; + +export default function buildScriptApi({ baseDir, gitRootDir }: BuildContext) { + // Generate types + execSync(`pnpm typecheck`, { stdio: "inherit", cwd: gitRootDir }); + + for (const config of [ "backend", "frontend" ]) { + const outDir = join(baseDir, "script-api", config); + execSync(`pnpm typedoc --options typedoc.${config}.json --html "${outDir}"`, { + stdio: "inherit" + }); + } +} diff --git a/apps/build-docs/src/swagger.ts b/apps/build-docs/src/swagger.ts new file mode 100644 index 000000000..b3677aeeb --- /dev/null +++ b/apps/build-docs/src/swagger.ts @@ -0,0 +1,32 @@ +import BuildContext from "./context"; +import { join } from "path"; +import { execSync } from "child_process"; +import { mkdirSync } from "fs"; + +interface BuildInfo { + specPath: string; + outDir: string; +} + +const DIR_PREFIX = "rest-api"; + +const buildInfos: BuildInfo[] = [ + { + // Paths are relative to Git root. + specPath: "apps/server/internal.openapi.yaml", + outDir: `${DIR_PREFIX}/internal` + }, + { + specPath: "apps/server/etapi.openapi.yaml", + outDir: `${DIR_PREFIX}/etapi` + } +]; + +export default function buildSwagger({ baseDir, gitRootDir }: BuildContext) { + for (const { specPath, outDir } of buildInfos) { + const absSpecPath = join(gitRootDir, specPath); + const targetDir = join(baseDir, outDir); + mkdirSync(targetDir, { recursive: true }); + execSync(`pnpm redocly build-docs ${absSpecPath} -o ${targetDir}/index.html`, { stdio: "inherit" }); + } +} diff --git a/apps/build-docs/tsconfig.app.json b/apps/build-docs/tsconfig.app.json new file mode 100644 index 000000000..b9e17115a --- /dev/null +++ b/apps/build-docs/tsconfig.app.json @@ -0,0 +1,36 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "bundler", + "target": "ES2020", + "outDir": "dist", + "strict": false, + "types": [ + "node", + "express" + ], + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.app.tsbuildinfo" + }, + "include": [ + "src/**/*.ts", + "../server/src/*.d.ts" + ], + "exclude": [ + "eslint.config.js", + "eslint.config.cjs", + "eslint.config.mjs" + ], + "references": [ + { + "path": "../server/tsconfig.app.json" + }, + { + "path": "../desktop/tsconfig.app.json" + }, + { + "path": "../client/tsconfig.app.json" + } + ] +} diff --git a/apps/build-docs/tsconfig.json b/apps/build-docs/tsconfig.json new file mode 100644 index 000000000..858921cfb --- /dev/null +++ b/apps/build-docs/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.base.json", + "include": [], + "references": [ + { + "path": "../server" + }, + { + "path": "../client" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/apps/build-docs/typedoc.backend.json b/apps/build-docs/typedoc.backend.json new file mode 100644 index 000000000..1781774c6 --- /dev/null +++ b/apps/build-docs/typedoc.backend.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "name": "Trilium Backend API", + "entryPoints": [ + "src/backend_script_entrypoint.ts" + ], + "plugin": [ + "typedoc-plugin-missing-exports" + ] +} diff --git a/apps/build-docs/typedoc.frontend.json b/apps/build-docs/typedoc.frontend.json new file mode 100644 index 000000000..f07d20dc7 --- /dev/null +++ b/apps/build-docs/typedoc.frontend.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "name": "Trilium Frontend API", + "entryPoints": [ + "src/frontend_script_entrypoint.ts" + ], + "plugin": [ + "typedoc-plugin-missing-exports" + ] +} diff --git a/apps/client/src/services/frontend_script_entrypoint.ts b/apps/client/src/services/frontend_script_entrypoint.ts deleted file mode 100644 index 75a27d204..000000000 --- a/apps/client/src/services/frontend_script_entrypoint.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * The front script API is accessible to code notes with the "JS (frontend)" language. - * - * The entire API is exposed as a single global: {@link api} - * - * @module Frontend Script API - */ - -/** - * This file creates the entrypoint for TypeDoc that simulates the context from within a - * script note. - * - * Make sure to keep in line with frontend's `script_context.ts`. - */ - -export type { default as BasicWidget } from "../widgets/basic_widget.js"; -export type { default as FAttachment } from "../entities/fattachment.js"; -export type { default as FAttribute } from "../entities/fattribute.js"; -export type { default as FBranch } from "../entities/fbranch.js"; -export type { default as FNote } from "../entities/fnote.js"; -export type { Api } from "./frontend_script_api.js"; -export type { default as NoteContextAwareWidget } from "../widgets/note_context_aware_widget.js"; -export type { default as RightPanelWidget } from "../widgets/right_panel_widget.js"; - -import FrontendScriptApi, { type Api } from "./frontend_script_api.js"; - -//@ts-expect-error -export const api: Api = new FrontendScriptApi(); diff --git a/apps/client/src/services/in_app_help.ts b/apps/client/src/services/in_app_help.ts index a0b118e5c..2f805783a 100644 --- a/apps/client/src/services/in_app_help.ts +++ b/apps/client/src/services/in_app_help.ts @@ -10,7 +10,7 @@ export const byNoteType: Record, string | null> = { file: null, image: null, launcher: null, - mermaid: null, + mermaid: "s1aBHPd79XYj", mindMap: null, noteMap: null, relationMap: null, diff --git a/apps/client/src/translations/ar/translation.json b/apps/client/src/translations/ar/translation.json index b04472d7c..dffb4f9d4 100644 --- a/apps/client/src/translations/ar/translation.json +++ b/apps/client/src/translations/ar/translation.json @@ -716,7 +716,6 @@ "backup_database_now": "نسخ اختياطي لقاعدة البيانات الان" }, "etapi": { - "wiki": "ويكي", "created": "تم الأنشاء", "actions": "أجراءات", "title": "ETAPI", diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json index e9738c25a..44aa6d387 100644 --- a/apps/client/src/translations/cn/translation.json +++ b/apps/client/src/translations/cn/translation.json @@ -1289,10 +1289,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI 是一个 REST API,用于以编程方式访问 Trilium 实例,而无需 UI。", - "see_more": "有关更多详细信息,请参见 {{- link_to_wiki}} 和 {{- link_to_openapi_spec}} 或 {{- link_to_swagger_ui}}。", - "wiki": "维基", - "openapi_spec": "ETAPI OpenAPI 规范", - "swagger_ui": "ETAPI Swagger UI", "create_token": "创建新的 ETAPI 令牌", "existing_tokens": "现有令牌", "no_tokens_yet": "目前还没有令牌。点击上面的按钮创建一个。", diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index 6d4790da8..6ff9525ff 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -1286,10 +1286,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI ist eine REST-API, die für den programmgesteuerten Zugriff auf die Trilium-Instanz ohne Benutzeroberfläche verwendet wird.", - "see_more": "Weitere Details können im {{- link_to_wiki}} und in der {{- link_to_openapi_spec}} oder der {{- link_to_swagger_ui }} gefunden werden.", - "wiki": "Wiki", - "openapi_spec": "ETAPI OpenAPI-Spezifikation", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Erstelle ein neues ETAPI-Token", "existing_tokens": "Vorhandene Token", "no_tokens_yet": "Es sind noch keine Token vorhanden. Klicke auf die Schaltfläche oben, um eine zu erstellen.", diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index 78056e19a..9f203eab3 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -1453,10 +1453,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI is a REST API used to access Trilium instance programmatically, without UI.", - "see_more": "See more details in the {{- link_to_wiki}} and the {{- link_to_openapi_spec}} or the {{- link_to_swagger_ui }}.", - "wiki": "wiki", - "openapi_spec": "ETAPI OpenAPI spec", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Create new ETAPI token", "existing_tokens": "Existing tokens", "no_tokens_yet": "There are no tokens yet. Click on the button above to create one.", diff --git a/apps/client/src/translations/es/translation.json b/apps/client/src/translations/es/translation.json index fe2f00dc0..b83fcf7bb 100644 --- a/apps/client/src/translations/es/translation.json +++ b/apps/client/src/translations/es/translation.json @@ -1446,10 +1446,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI es una REST API que se utiliza para acceder a la instancia de Trilium mediante programación, sin interfaz de usuario.", - "see_more": "Véa más detalles en el {{- link_to_wiki}} y el {{- link_to_openapi_spec}} o el {{- link_to_swagger_ui }}.", - "wiki": "wiki", - "openapi_spec": "Especificación ETAPI OpenAPI", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Crear nuevo token ETAPI", "existing_tokens": "Tokens existentes", "no_tokens_yet": "Aún no hay tokens. Dé clic en el botón de arriba para crear uno.", diff --git a/apps/client/src/translations/fr/translation.json b/apps/client/src/translations/fr/translation.json index 84593207b..1a4a1dec8 100644 --- a/apps/client/src/translations/fr/translation.json +++ b/apps/client/src/translations/fr/translation.json @@ -1288,8 +1288,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI est une API REST utilisée pour accéder à l'instance Trilium par programme, sans interface utilisateur.", - "wiki": "wiki", - "openapi_spec": "Spec ETAPI OpenAPI", "create_token": "Créer un nouveau jeton ETAPI", "existing_tokens": "Jetons existants", "no_tokens_yet": "Il n'y a pas encore de jetons. Cliquez sur le bouton ci-dessus pour en créer un.", @@ -1306,9 +1304,7 @@ "delete_token": "Supprimer/désactiver ce token", "rename_token_title": "Renommer le jeton", "rename_token_message": "Veuillez saisir le nom du nouveau jeton", - "delete_token_confirmation": "Êtes-vous sûr de vouloir supprimer le jeton ETAPI « {{name}} » ?", - "see_more": "Voir plus de détails dans le {{- link_to_wiki}} et le {{- link_to_openapi_spec}} ou le {{- link_to_swagger_ui }}.", - "swagger_ui": "Interface utilisateur ETAPI Swagger" + "delete_token_confirmation": "Êtes-vous sûr de vouloir supprimer le jeton ETAPI « {{name}} » ?" }, "options_widget": { "options_status": "Statut des options", diff --git a/apps/client/src/translations/it/translation.json b/apps/client/src/translations/it/translation.json index d8bf6bad6..5105b13f3 100644 --- a/apps/client/src/translations/it/translation.json +++ b/apps/client/src/translations/it/translation.json @@ -132,10 +132,6 @@ "new_token_message": "Inserisci il nome del nuovo token", "title": "ETAPI", "description": "ETAPI è un'API REST utilizzata per accedere alle istanze di Trilium in modo programmatico, senza interfaccia utente.", - "see_more": "Per maggiori dettagli consulta {{- link_to_wiki}} e {{- link_to_openapi_spec}} o {{- link_to_swagger_ui}}.", - "wiki": "wiki", - "openapi_spec": "Specifiche ETAPI OpenAPI", - "swagger_ui": "Interfaccia utente ETAPI Swagger", "create_token": "Crea un nuovo token ETAPI", "existing_tokens": "Token esistenti", "no_tokens_yet": "Non ci sono ancora token. Clicca sul pulsante qui sopra per crearne uno.", diff --git a/apps/client/src/translations/ja/translation.json b/apps/client/src/translations/ja/translation.json index 05c8b48f9..6a9b4f75e 100644 --- a/apps/client/src/translations/ja/translation.json +++ b/apps/client/src/translations/ja/translation.json @@ -657,10 +657,6 @@ "created": "作成日時", "title": "ETAPI", "description": "ETAPI は、Trilium インスタンスに UI なしでプログラム的にアクセスするための REST API です。", - "see_more": "詳細は{{- link_to_wiki}}と{{- link_to_openapi_spec}}または{{- link_to_swagger_ui }}を参照してください。", - "wiki": "wiki", - "openapi_spec": "ETAPI OpenAPIの仕様", - "swagger_ui": "ETAPI Swagger UI", "create_token": "新しくETAPIトークンを作成", "existing_tokens": "既存のトークン", "no_tokens_yet": "トークンはまだありません。上のボタンをクリックして作成してください。", diff --git a/apps/client/src/translations/pl/translation.json b/apps/client/src/translations/pl/translation.json index 426296d14..6ff4b26f4 100644 --- a/apps/client/src/translations/pl/translation.json +++ b/apps/client/src/translations/pl/translation.json @@ -1663,10 +1663,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI to interfejs API REST używany do programowego dostępu do instancji Trilium, bez interfejsu użytkownika.", - "see_more": "Zobacz więcej szczegółów w {{- link_to_wiki}} oraz w {{- link_to_openapi_spec}} lub {{- link_to_swagger_ui }}.", - "wiki": "wiki", - "openapi_spec": "specyfikacja ETAPI OpenAPI", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Utwórz nowy token ETAPI", "existing_tokens": "Istniejące tokeny", "no_tokens_yet": "Nie ma jeszcze żadnych tokenów. Kliknij przycisk powyżej, aby utworzyć jeden.", diff --git a/apps/client/src/translations/pt/translation.json b/apps/client/src/translations/pt/translation.json index f386f61e8..5497ad817 100644 --- a/apps/client/src/translations/pt/translation.json +++ b/apps/client/src/translations/pt/translation.json @@ -1422,10 +1422,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI é uma API REST usada para aceder a instância do Trilium programaticamente, sem interface gráfica.", - "see_more": "Veja mais pormenores no {{- link_to_wiki}}, na {{- link_to_openapi_spec}} ou na {{- link_to_swagger_ui}}.", - "wiki": "wiki", - "openapi_spec": "Especificação OpenAPI do ETAPI", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Criar token ETAPI", "existing_tokens": "Tokens existentes", "no_tokens_yet": "Ainda não existem tokens. Clique no botão acima para criar um.", diff --git a/apps/client/src/translations/pt_br/translation.json b/apps/client/src/translations/pt_br/translation.json index 08d891356..0d1676832 100644 --- a/apps/client/src/translations/pt_br/translation.json +++ b/apps/client/src/translations/pt_br/translation.json @@ -1932,10 +1932,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI é uma API REST usada para acessar a instância do Trilium programaticamente, sem interface gráfica.", - "see_more": "Veja mais detalhes no {{- link_to_wiki}}, na {{- link_to_openapi_spec}} ou na {{- link_to_swagger_ui}}.", - "wiki": "wiki", - "openapi_spec": "Especificação OpenAPI do ETAPI", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Criar novo token ETAPI", "existing_tokens": "Tokens existentes", "no_tokens_yet": "Ainda não existem tokens. Clique no botão acima para criar um.", diff --git a/apps/client/src/translations/ro/translation.json b/apps/client/src/translations/ro/translation.json index c683aba59..dd8947003 100644 --- a/apps/client/src/translations/ro/translation.json +++ b/apps/client/src/translations/ro/translation.json @@ -507,17 +507,13 @@ "new_token_message": "Introduceți denumirea noului token", "new_token_title": "Token ETAPI nou", "no_tokens_yet": "Nu există încă token-uri. Clic pe butonul de deasupra pentru a crea una.", - "openapi_spec": "Specificația OpenAPI pentru ETAPI", - "swagger_ui": "UI-ul Swagger pentru ETAPI", "rename_token": "Redenumește token-ul", "rename_token_message": "Introduceți denumirea noului token", "rename_token_title": "Redenumire token", - "see_more": "Vedeți mai multe detalii în {{- link_to_wiki}} și în {{- link_to_openapi_spec}} sau în {{- link_to_swagger_ui }}.", "title": "ETAPI", "token_created_message": "Copiați token-ul creat în clipboard. Trilium stochează token-ul ca hash așadar această valoare poate fi văzută doar acum.", "token_created_title": "Token ETAPI creat", - "token_name": "Denumire token", - "wiki": "wiki" + "token_name": "Denumire token" }, "execute_script": { "example_1": "De exemplu, pentru a adăuga un șir de caractere la titlul unei notițe, se poate folosi acest mic script:", diff --git a/apps/client/src/translations/ru/translation.json b/apps/client/src/translations/ru/translation.json index c1e62e327..adc2bab50 100644 --- a/apps/client/src/translations/ru/translation.json +++ b/apps/client/src/translations/ru/translation.json @@ -1440,7 +1440,6 @@ }, "etapi": { "title": "ETAPI", - "wiki": "вики", "created": "Создано", "actions": "Действия", "existing_tokens": "Существующие токены", @@ -1448,10 +1447,7 @@ "default_token_name": "новый токен", "rename_token_title": "Переименовать токен", "description": "ETAPI — это REST API, используемый для программного доступа к экземпляру Trilium без пользовательского интерфейса.", - "see_more": "Более подробную информацию смотрите в {{- link_to_wiki}} и {{- link_to_openapi_spec}} или {{- link_to_swagger_ui }}.", "create_token": "Создать новый токен ETAPI", - "openapi_spec": "Спецификация ETAPI OpenAPI", - "swagger_ui": "Пользовательский интерфейс ETAPI Swagger", "new_token_title": "Новый токен ETAPI", "token_created_title": "Создан токен ETAPI", "rename_token": "Переименовать этот токен", diff --git a/apps/client/src/translations/tw/translation.json b/apps/client/src/translations/tw/translation.json index e31228844..2ba0f9afd 100644 --- a/apps/client/src/translations/tw/translation.json +++ b/apps/client/src/translations/tw/translation.json @@ -1281,8 +1281,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI 是一個 REST API,用於以編程方式訪問 Trilium 實例,而無需 UI。", - "wiki": "維基", - "openapi_spec": "ETAPI OpenAPI 規範", "create_token": "新增 ETAPI 令牌", "existing_tokens": "現有令牌", "no_tokens_yet": "目前還沒有令牌。點擊上面的按鈕新增一個。", @@ -1299,9 +1297,7 @@ "delete_token": "刪除 / 停用此令牌", "rename_token_title": "重新命名令牌", "rename_token_message": "請輸入新的令牌名稱", - "delete_token_confirmation": "您確定要刪除 ETAPI 令牌 \"{{name}}\" 嗎?", - "see_more": "有關更多詳細資訊,請參閱 {{- link_to_wiki}} 和 {{- link_to_openapi_spec}} 或 {{- link_to_swagger_ui}}。", - "swagger_ui": "ETAPI Swagger UI" + "delete_token_confirmation": "您確定要刪除 ETAPI 令牌 \"{{name}}\" 嗎?" }, "options_widget": { "options_status": "選項狀態", diff --git a/apps/client/src/translations/uk/translation.json b/apps/client/src/translations/uk/translation.json index 9c2a1eca1..ebddac41b 100644 --- a/apps/client/src/translations/uk/translation.json +++ b/apps/client/src/translations/uk/translation.json @@ -1402,10 +1402,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI — це REST API, який використовується для програмного доступу до екземпляра Trilium без інтерфейсу користувача.", - "see_more": "Див. докладнішу інформацію у {{- link_to_wiki}} та {{- link_to_openapi_spec}} або {{- link_to_swagger_ui }}.", - "wiki": "вікі", - "openapi_spec": "ETAPI OpenAPI spec", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Створити новий токен ETAPI", "existing_tokens": "Існуючі токени", "no_tokens_yet": "Токенів поки що немає. Натисніть кнопку вище, щоб створити його.", diff --git a/apps/client/src/widgets/type_widgets/options/components/OptionsSection.tsx b/apps/client/src/widgets/type_widgets/options/components/OptionsSection.tsx index ff78d8a33..ce42b66e3 100644 --- a/apps/client/src/widgets/type_widgets/options/components/OptionsSection.tsx +++ b/apps/client/src/widgets/type_widgets/options/components/OptionsSection.tsx @@ -2,7 +2,7 @@ import type { ComponentChildren } from "preact"; import { CSSProperties } from "preact/compat"; interface OptionsSectionProps { - title?: string; + title?: ComponentChildren; children: ComponentChildren; noCard?: boolean; style?: CSSProperties; diff --git a/apps/client/src/widgets/type_widgets/options/etapi.tsx b/apps/client/src/widgets/type_widgets/options/etapi.tsx index 3ee7c7e19..f49dc85f7 100644 --- a/apps/client/src/widgets/type_widgets/options/etapi.tsx +++ b/apps/client/src/widgets/type_widgets/options/etapi.tsx @@ -11,6 +11,7 @@ import dialog from "../../../services/dialog"; import { formatDateTime } from "../../../utils/formatters"; import ActionButton from "../../react/ActionButton"; import { useTriliumEvent } from "../../react/hooks"; +import HelpButton from "../../react/HelpButton"; type RenameTokenCallback = (tokenId: string, oldName: string) => Promise; type DeleteTokenCallback = (tokenId: string, name: string ) => Promise; @@ -48,19 +49,13 @@ export default function EtapiSettings() { message: t("etapi.token_created_message"), defaultValue: authToken }); - }, []); + }, []); return ( - {t("etapi.description")}
- ${t("etapi.wiki")}`, - // TODO: We use window.open src/public/app/services/link.ts -> prevents regular click behavior on "a" element here because it's a relative path - link_to_openapi_spec: `${t("etapi.openapi_spec")}`, - link_to_swagger_ui: `${t("etapi.swagger_ui")}` - })} /> + {t("etapi.description")} +