From d4ec444558b9fb2bde9f46dc34b873fe89030aa1 Mon Sep 17 00:00:00 2001 From: LukeGus Date: Thu, 24 Sep 2026 15:07:25 -0500 Subject: [PATCH] feat: finish the homepage plugin, move service links and canvas out of core (B19) --- docker/nginx-https.conf | 25 +- docker/nginx.conf | 25 +- drizzle/mysql/0048_hard_demogoblin.sql | 6 + drizzle/mysql/meta/0048_snapshot.json | 5795 +++++++++++++++++ drizzle/mysql/meta/_journal.json | 7 + .../postgres/0049_reflective_adam_destine.sql | 6 + drizzle/postgres/meta/0049_snapshot.json | 5631 ++++++++++++++++ drizzle/postgres/meta/_journal.json | 7 + drizzle/sqlite/0045_public_menace.sql | 3 + drizzle/sqlite/meta/0045_snapshot.json | 5471 ++++++++++++++++ drizzle/sqlite/meta/_journal.json | 7 + electron/main.cjs | 4 +- packages/plugin-sdk/ARCHITECTURE.md | 74 +- packages/plugin-sdk/FINISH-LIST.md | 36 +- packages/plugin-sdk/src/frontend.ts | 61 + plugins/docker/src/frontend/DockerWidget.tsx | 2 +- .../src/frontend/DockerWidgetEditForm.tsx | 4 +- .../frontend/homepage/FileManagerWidget.tsx | 37 +- .../homepage/FileManagerWidgetEditForm.tsx | 35 +- .../src/frontend/homepage/homepage.ts | 24 + plugins/file-manager/src/frontend/index.tsx | 2 +- plugins/homepage/CHANGELOG.md | 22 + plugins/homepage/README.md | 57 + plugins/homepage/locales/en.json | 171 + .../homepage/locales/translated/af_ZA.json | 162 + .../homepage/locales/translated/ar_SA.json | 162 + .../homepage/locales/translated/bg_BG.json | 162 + .../homepage/locales/translated/bn_BD.json | 162 + .../homepage/locales/translated/ca_ES.json | 162 + .../homepage/locales/translated/cs_CZ.json | 162 + .../homepage/locales/translated/da_DK.json | 162 + .../homepage/locales/translated/de_DE.json | 162 + .../homepage/locales/translated/el_GR.json | 162 + .../homepage/locales/translated/es_ES.json | 162 + .../homepage/locales/translated/fi_FI.json | 162 + .../homepage/locales/translated/fr_FR.json | 162 + .../homepage/locales/translated/he_IL.json | 162 + .../homepage/locales/translated/hi_IN.json | 162 + .../homepage/locales/translated/hu_HU.json | 162 + .../homepage/locales/translated/id_ID.json | 162 + .../homepage/locales/translated/it_IT.json | 162 + .../homepage/locales/translated/ja_JP.json | 162 + .../homepage/locales/translated/ko_KR.json | 162 + .../homepage/locales/translated/nl_NL.json | 162 + .../homepage/locales/translated/no_NO.json | 162 + .../homepage/locales/translated/pl_PL.json | 162 + .../homepage/locales/translated/pt_BR.json | 162 + .../homepage/locales/translated/pt_PT.json | 162 + .../homepage/locales/translated/ro_RO.json | 162 + .../homepage/locales/translated/ru_RU.json | 162 + .../homepage/locales/translated/sr_SP.json | 162 + .../homepage/locales/translated/sv_SE.json | 162 + .../homepage/locales/translated/th_TH.json | 162 + .../homepage/locales/translated/tr_TR.json | 162 + .../homepage/locales/translated/uk_UA.json | 162 + .../homepage/locales/translated/vi_VN.json | 162 + .../homepage/locales/translated/zh_CN.json | 162 + .../homepage/locales/translated/zh_TW.json | 162 + plugins/homepage/manifest.json | 52 + .../mysql/0001_adopt_homepage_tables.sql | 36 + .../postgres/0001_adopt_homepage_tables.sql | 38 + plugins/homepage/migrations/snapshot.json | 132 + .../sqlite/0001_adopt_homepage_tables.sql | 38 + plugins/homepage/package.json | 15 + plugins/homepage/src/backend/index.ts | 43 + .../homepage/src/backend/outbound-routes.ts | 426 ++ plugins/homepage/src/backend/repository.ts | 288 + plugins/homepage/src/backend/routes.ts | 525 ++ plugins/homepage/src/backend/services.ts | 27 + plugins/homepage/src/backend/tables.ts | 68 + .../homepage/src/backend/url.ts | 0 .../src/frontend/DashboardHomepageView.tsx | 62 + .../homepage/src/frontend}/HomepageApp.tsx | 0 .../homepage/src/frontend}/HomepageCanvas.tsx | 14 +- .../src/frontend}/HomepagePreviewCard.tsx | 21 +- .../src/frontend/ServiceLinksCard.tsx | 146 + plugins/homepage/src/frontend/api.ts | 57 + .../frontend}/canvas/CanvasDotBackground.tsx | 0 .../src/frontend}/canvas/canvasGeometry.ts | 0 .../src/frontend}/canvas/snapToGrid.ts | 2 +- .../src/frontend}/canvas/useBoxDrag.ts | 2 +- .../src/frontend}/canvas/useBoxResize.ts | 6 +- .../src/frontend}/canvas/useCanvasInput.ts | 2 +- .../homepage/src/frontend}/clock-timezone.ts | 0 .../src/frontend}/dialogs/AddWidgetMenu.tsx | 4 +- .../dialogs/BookmarkListEditForm.tsx | 8 +- .../frontend}/dialogs/CalendarEditForm.tsx | 9 +- .../src/frontend}/dialogs/ClockEditForm.tsx | 8 +- .../frontend}/dialogs/CountdownEditForm.tsx | 9 +- .../frontend}/dialogs/CustomApiEditForm.tsx | 6 +- .../dialogs/DashboardLinksEditForm.tsx | 9 +- .../src/frontend}/dialogs/FolderEditForm.tsx | 6 +- .../frontend}/dialogs/HostGridEditForm.tsx | 48 +- .../frontend}/dialogs/HostStatusEditForm.tsx | 37 +- .../src/frontend}/dialogs/IframeEditForm.tsx | 8 +- .../frontend}/dialogs/ImageWidgetEditForm.tsx | 9 +- .../frontend}/dialogs/LinkTreeEditForm.tsx | 8 +- .../dialogs/MarkdownNotesEditForm.tsx | 11 +- .../src/frontend}/dialogs/NotesEditForm.tsx | 6 +- .../frontend}/dialogs/PingStatusEditForm.tsx | 8 +- .../dialogs/QuickConnectEditForm.tsx | 53 +- .../dialogs/RecentActivityEditForm.tsx | 10 +- .../src/frontend}/dialogs/RssFeedEditForm.tsx | 11 +- .../frontend}/dialogs/SearchBarEditForm.tsx | 6 +- .../frontend}/dialogs/SearchLinksEditForm.tsx | 8 +- .../frontend}/dialogs/ServiceGridEditForm.tsx | 8 +- .../frontend}/dialogs/ServiceLinkEditForm.tsx | 11 +- .../frontend}/dialogs/SingleHostEditForm.tsx | 26 +- .../frontend}/dialogs/SshTerminalEditForm.tsx | 7 +- .../dialogs/SystemOverviewEditForm.tsx | 7 +- .../dialogs/TermixUptimeEditForm.tsx | 7 +- .../frontend}/dialogs/TextBannerEditForm.tsx | 8 +- .../src/frontend}/dialogs/WeatherEditForm.tsx | 11 +- .../frontend}/dialogs/WidgetEditDialog.tsx | 11 +- plugins/homepage/src/frontend/index.tsx | 106 + .../src/frontend}/quick-connect-targets.ts | 24 +- plugins/homepage/src/frontend/registry.ts | 77 + .../src/frontend}/toolbar/HomepageToolbar.tsx | 4 +- plugins/homepage/src/frontend/types.ts | 402 ++ .../homepage/src/frontend/url.ts | 0 .../src/frontend/use-page-visible-interval.ts | 67 + .../frontend}/widgets/BookmarkListWidget.tsx | 7 +- .../src/frontend}/widgets/CalendarWidget.tsx | 13 +- .../src/frontend}/widgets/ClockWidget.tsx | 7 +- .../src/frontend}/widgets/CountdownWidget.tsx | 11 +- .../src/frontend}/widgets/CustomApiWidget.tsx | 25 +- .../widgets/DashboardLinksWidget.tsx | 25 +- .../src/frontend}/widgets/FolderWidget.tsx | 7 +- .../src/frontend}/widgets/HostGridWidget.tsx | 95 +- .../frontend}/widgets/HostStatusWidget.tsx | 122 +- .../src/frontend}/widgets/IframeWidget.tsx | 9 +- .../src/frontend}/widgets/ImageWidget.tsx | 11 +- .../src/frontend}/widgets/LinkTreeWidget.tsx | 6 +- .../frontend}/widgets/MarkdownNotesWidget.tsx | 11 +- .../src/frontend}/widgets/NotesWidget.tsx | 4 +- .../frontend}/widgets/PingStatusWidget.tsx | 22 +- .../frontend}/widgets/QuickConnectWidget.tsx | 75 +- .../widgets/RecentActivityWidget.tsx | 22 +- .../src/frontend}/widgets/RssFeedWidget.tsx | 29 +- .../src/frontend}/widgets/SearchBarWidget.tsx | 8 +- .../frontend}/widgets/SearchLinksWidget.tsx | 8 +- .../frontend}/widgets/ServiceGridWidget.tsx | 6 +- .../frontend}/widgets/ServiceLinkWidget.tsx | 7 +- .../frontend}/widgets/SshTerminalWidget.tsx | 55 +- .../widgets/SystemOverviewWidget.tsx | 26 +- .../frontend}/widgets/TermixUptimeWidget.tsx | 19 +- .../frontend}/widgets/TextBannerWidget.tsx | 7 +- .../src/frontend}/widgets/WeatherWidget.tsx | 11 +- .../src/frontend/widgets/WidgetRegistry.ts | 40 + .../src/frontend}/widgets/WidgetShell.tsx | 4 +- plugins/homepage/tests/backend/helpers.ts | 100 + .../homepage/tests/backend/migrations.test.ts | 176 + .../tests/backend/outbound-routes.test.ts | 96 + plugins/homepage/tests/backend/routes.test.ts | 124 + .../homepage/tests/backend/services.test.ts | 40 + .../homepage/tests/backend/url.test.ts | 2 +- .../tests/frontend}/ClockTimezone.test.tsx | 13 +- .../frontend}/SystemOverviewWidget.test.tsx | 25 +- .../frontend}/WidgetEditDialogClock.test.tsx | 9 +- .../homepage/tests/frontend/activate.test.tsx | 66 + .../frontend}/canvas/canvasGeometry.test.ts | 2 +- .../tests/frontend}/canvas/snapToGrid.test.ts | 4 +- plugins/homepage/tsconfig.json | 4 + plugins/homepage/vitest.config.ts | 3 + plugins/tunnels/src/frontend/views.tsx | 10 +- scripts/plugin-boundary-allowlist.json | 2 - src/backend/database/database.ts | 2 + src/backend/database/db/index.ts | 76 - .../database/db/performance-indexes.ts | 5 - src/backend/database/db/schema.mysql.ts | 55 +- src/backend/database/db/schema.pg.ts | 55 +- src/backend/database/db/schema.ts | 55 +- .../dashboard-service-link-repository.ts | 137 - src/backend/database/repositories/factory.ts | 25 +- .../repositories/homepage-item-repository.ts | 121 - .../homepage-layout-repository.ts | 67 - .../database/routes/dashboard-routes.ts | 240 + .../routes/dashboard-service-links-routes.ts | 263 - .../database/routes/delete-user-data.ts | 10 +- .../routes/homepage-favicon-routes.ts | 120 - .../database/routes/homepage-items-routes.ts | 202 - .../database/routes/homepage-layout-routes.ts | 86 - .../database/routes/homepage-ping-routes.ts | 108 - .../database/routes/homepage-proxy-routes.ts | 95 - .../database/routes/homepage-rss-routes.ts | 142 - src/backend/database/routes/sync-entities.ts | 15 +- src/backend/services/dashboard.ts | 262 - src/backend/services/homepage.ts | 45 - src/backend/starter.ts | 12 +- .../dashboard-service-link-repository.test.ts | 120 - .../homepage-item-repository.test.ts | 131 - .../homepage-layout-repository.test.ts | 85 - .../database/routes/dashboard-routes.test.ts | 139 + .../tests/database/routes/sync.test.ts | 2 - .../tests/plugins/sync-registry.test.ts | 8 +- src/backend/utils/logger.ts | 1 - src/backend/utils/swagger.ts | 4 - src/main.tsx | 10 - src/types/ui-preferences.ts | 9 + src/types/ui-types.ts | 2 - src/ui/AppShell.tsx | 1 - src/ui/api/dashboard-api.ts | 73 +- src/ui/api/homepage-api.ts | 72 - src/ui/dashboard/DashboardTab.tsx | 305 +- src/ui/dashboard/dashboard-cards-registry.ts | 2 + .../homepage/widgets/WidgetRegistry.ts | 24 - src/ui/lib/apply-ui-preset.ts | 24 +- src/ui/lib/theme.ts | 12 - .../visible-interval.ts} | 0 .../WidgetTitle.tsx => lib/widget-title.tsx} | 0 src/ui/locales/en.json | 264 +- src/ui/locales/translated/af_ZA.json | 154 +- src/ui/locales/translated/ar_SA.json | 154 +- src/ui/locales/translated/bg_BG.json | 154 +- src/ui/locales/translated/bn_BD.json | 154 +- src/ui/locales/translated/ca_ES.json | 154 +- src/ui/locales/translated/cs_CZ.json | 154 +- src/ui/locales/translated/da_DK.json | 154 +- src/ui/locales/translated/de_DE.json | 154 +- src/ui/locales/translated/el_GR.json | 154 +- src/ui/locales/translated/es_ES.json | 154 +- src/ui/locales/translated/fi_FI.json | 154 +- src/ui/locales/translated/fr_FR.json | 154 +- src/ui/locales/translated/he_IL.json | 154 +- src/ui/locales/translated/hi_IN.json | 154 +- src/ui/locales/translated/hu_HU.json | 154 +- src/ui/locales/translated/id_ID.json | 154 +- src/ui/locales/translated/it_IT.json | 154 +- src/ui/locales/translated/ja_JP.json | 154 +- src/ui/locales/translated/ko_KR.json | 154 +- src/ui/locales/translated/nl_NL.json | 154 +- src/ui/locales/translated/no_NO.json | 154 +- src/ui/locales/translated/pl_PL.json | 154 +- src/ui/locales/translated/pt_BR.json | 154 +- src/ui/locales/translated/pt_PT.json | 154 +- src/ui/locales/translated/ro_RO.json | 154 +- src/ui/locales/translated/ru_RU.json | 154 +- src/ui/locales/translated/sr_SP.json | 154 +- src/ui/locales/translated/sv_SE.json | 154 +- src/ui/locales/translated/th_TH.json | 154 +- src/ui/locales/translated/tr_TR.json | 154 +- src/ui/locales/translated/uk_UA.json | 154 +- src/ui/locales/translated/vi_VN.json | 154 +- src/ui/locales/translated/zh_CN.json | 154 +- src/ui/locales/translated/zh_TW.json | 154 +- src/ui/main-axios.ts | 22 +- src/ui/plugin-host/app.ts | 10 +- src/ui/plugin-host/bridge.ts | 31 + .../plugin-host/homepage-widget-registry.ts | 33 + src/ui/plugin-host/sdk-ui.ts | 18 +- src/ui/shell/shell-layout.ts | 14 +- src/ui/shell/tabUtils.tsx | 11 - src/ui/sidebar/AppRail.tsx | 5 - src/ui/sidebar/InterfacePresetSettings.tsx | 3 +- src/ui/tests/lib/apply-ui-preset.test.ts | 71 + src/ui/tests/plugin-host/registries.test.tsx | 56 +- 256 files changed, 27365 insertions(+), 9077 deletions(-) create mode 100644 drizzle/mysql/0048_hard_demogoblin.sql create mode 100644 drizzle/mysql/meta/0048_snapshot.json create mode 100644 drizzle/postgres/0049_reflective_adam_destine.sql create mode 100644 drizzle/postgres/meta/0049_snapshot.json create mode 100644 drizzle/sqlite/0045_public_menace.sql create mode 100644 drizzle/sqlite/meta/0045_snapshot.json create mode 100644 plugins/file-manager/src/frontend/homepage/homepage.ts create mode 100644 plugins/homepage/CHANGELOG.md create mode 100644 plugins/homepage/README.md create mode 100644 plugins/homepage/locales/en.json create mode 100644 plugins/homepage/locales/translated/af_ZA.json create mode 100644 plugins/homepage/locales/translated/ar_SA.json create mode 100644 plugins/homepage/locales/translated/bg_BG.json create mode 100644 plugins/homepage/locales/translated/bn_BD.json create mode 100644 plugins/homepage/locales/translated/ca_ES.json create mode 100644 plugins/homepage/locales/translated/cs_CZ.json create mode 100644 plugins/homepage/locales/translated/da_DK.json create mode 100644 plugins/homepage/locales/translated/de_DE.json create mode 100644 plugins/homepage/locales/translated/el_GR.json create mode 100644 plugins/homepage/locales/translated/es_ES.json create mode 100644 plugins/homepage/locales/translated/fi_FI.json create mode 100644 plugins/homepage/locales/translated/fr_FR.json create mode 100644 plugins/homepage/locales/translated/he_IL.json create mode 100644 plugins/homepage/locales/translated/hi_IN.json create mode 100644 plugins/homepage/locales/translated/hu_HU.json create mode 100644 plugins/homepage/locales/translated/id_ID.json create mode 100644 plugins/homepage/locales/translated/it_IT.json create mode 100644 plugins/homepage/locales/translated/ja_JP.json create mode 100644 plugins/homepage/locales/translated/ko_KR.json create mode 100644 plugins/homepage/locales/translated/nl_NL.json create mode 100644 plugins/homepage/locales/translated/no_NO.json create mode 100644 plugins/homepage/locales/translated/pl_PL.json create mode 100644 plugins/homepage/locales/translated/pt_BR.json create mode 100644 plugins/homepage/locales/translated/pt_PT.json create mode 100644 plugins/homepage/locales/translated/ro_RO.json create mode 100644 plugins/homepage/locales/translated/ru_RU.json create mode 100644 plugins/homepage/locales/translated/sr_SP.json create mode 100644 plugins/homepage/locales/translated/sv_SE.json create mode 100644 plugins/homepage/locales/translated/th_TH.json create mode 100644 plugins/homepage/locales/translated/tr_TR.json create mode 100644 plugins/homepage/locales/translated/uk_UA.json create mode 100644 plugins/homepage/locales/translated/vi_VN.json create mode 100644 plugins/homepage/locales/translated/zh_CN.json create mode 100644 plugins/homepage/locales/translated/zh_TW.json create mode 100644 plugins/homepage/manifest.json create mode 100644 plugins/homepage/migrations/mysql/0001_adopt_homepage_tables.sql create mode 100644 plugins/homepage/migrations/postgres/0001_adopt_homepage_tables.sql create mode 100644 plugins/homepage/migrations/snapshot.json create mode 100644 plugins/homepage/migrations/sqlite/0001_adopt_homepage_tables.sql create mode 100644 plugins/homepage/package.json create mode 100644 plugins/homepage/src/backend/index.ts create mode 100644 plugins/homepage/src/backend/outbound-routes.ts create mode 100644 plugins/homepage/src/backend/repository.ts create mode 100644 plugins/homepage/src/backend/routes.ts create mode 100644 plugins/homepage/src/backend/services.ts create mode 100644 plugins/homepage/src/backend/tables.ts rename src/backend/database/routes/service-link-url.ts => plugins/homepage/src/backend/url.ts (100%) create mode 100644 plugins/homepage/src/frontend/DashboardHomepageView.tsx rename {src/ui/features/homepage => plugins/homepage/src/frontend}/HomepageApp.tsx (100%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/HomepageCanvas.tsx (98%) rename {src/ui/dashboard/cards => plugins/homepage/src/frontend}/HomepagePreviewCard.tsx (64%) create mode 100644 plugins/homepage/src/frontend/ServiceLinksCard.tsx create mode 100644 plugins/homepage/src/frontend/api.ts rename {src/ui/features/homepage => plugins/homepage/src/frontend}/canvas/CanvasDotBackground.tsx (100%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/canvas/canvasGeometry.ts (100%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/canvas/snapToGrid.ts (80%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/canvas/useBoxDrag.ts (96%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/canvas/useBoxResize.ts (96%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/canvas/useCanvasInput.ts (97%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/clock-timezone.ts (100%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/AddWidgetMenu.tsx (97%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/BookmarkListEditForm.tsx (91%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/CalendarEditForm.tsx (84%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/ClockEditForm.tsx (89%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/CountdownEditForm.tsx (90%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/CustomApiEditForm.tsx (97%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/DashboardLinksEditForm.tsx (90%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/FolderEditForm.tsx (86%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/HostGridEditForm.tsx (68%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/HostStatusEditForm.tsx (75%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/IframeEditForm.tsx (80%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/ImageWidgetEditForm.tsx (92%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/LinkTreeEditForm.tsx (96%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/MarkdownNotesEditForm.tsx (90%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/NotesEditForm.tsx (77%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/PingStatusEditForm.tsx (94%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/QuickConnectEditForm.tsx (77%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/RecentActivityEditForm.tsx (90%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/RssFeedEditForm.tsx (86%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/SearchBarEditForm.tsx (95%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/SearchLinksEditForm.tsx (93%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/ServiceGridEditForm.tsx (95%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/ServiceLinkEditForm.tsx (92%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/SingleHostEditForm.tsx (54%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/SshTerminalEditForm.tsx (86%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/SystemOverviewEditForm.tsx (90%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/TermixUptimeEditForm.tsx (81%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/TextBannerEditForm.tsx (95%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/WeatherEditForm.tsx (88%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/dialogs/WidgetEditDialog.tsx (98%) create mode 100644 plugins/homepage/src/frontend/index.tsx rename {src/ui/features/homepage => plugins/homepage/src/frontend}/quick-connect-targets.ts (55%) create mode 100644 plugins/homepage/src/frontend/registry.ts rename {src/ui/features/homepage => plugins/homepage/src/frontend}/toolbar/HomepageToolbar.tsx (96%) create mode 100644 plugins/homepage/src/frontend/types.ts rename src/ui/lib/service-link-url.ts => plugins/homepage/src/frontend/url.ts (100%) create mode 100644 plugins/homepage/src/frontend/use-page-visible-interval.ts rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/BookmarkListWidget.tsx (94%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/CalendarWidget.tsx (94%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/ClockWidget.tsx (93%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/CountdownWidget.tsx (95%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/CustomApiWidget.tsx (89%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/DashboardLinksWidget.tsx (87%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/FolderWidget.tsx (90%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/HostGridWidget.tsx (52%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/HostStatusWidget.tsx (51%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/IframeWidget.tsx (89%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/ImageWidget.tsx (90%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/LinkTreeWidget.tsx (96%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/MarkdownNotesWidget.tsx (94%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/NotesWidget.tsx (93%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/PingStatusWidget.tsx (87%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/QuickConnectWidget.tsx (68%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/RecentActivityWidget.tsx (90%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/RssFeedWidget.tsx (86%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/SearchBarWidget.tsx (94%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/SearchLinksWidget.tsx (95%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/ServiceGridWidget.tsx (96%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/ServiceLinkWidget.tsx (96%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/SshTerminalWidget.tsx (73%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/SystemOverviewWidget.tsx (86%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/TermixUptimeWidget.tsx (91%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/TextBannerWidget.tsx (91%) rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/WeatherWidget.tsx (96%) create mode 100644 plugins/homepage/src/frontend/widgets/WidgetRegistry.ts rename {src/ui/features/homepage => plugins/homepage/src/frontend}/widgets/WidgetShell.tsx (97%) create mode 100644 plugins/homepage/tests/backend/helpers.ts create mode 100644 plugins/homepage/tests/backend/migrations.test.ts create mode 100644 plugins/homepage/tests/backend/outbound-routes.test.ts create mode 100644 plugins/homepage/tests/backend/routes.test.ts create mode 100644 plugins/homepage/tests/backend/services.test.ts rename src/backend/tests/database/routes/service-link-url.test.ts => plugins/homepage/tests/backend/url.test.ts (93%) rename {src/ui/tests/features/homepage => plugins/homepage/tests/frontend}/ClockTimezone.test.tsx (91%) rename {src/ui/tests/features/homepage => plugins/homepage/tests/frontend}/SystemOverviewWidget.test.tsx (81%) rename {src/ui/tests/features/homepage => plugins/homepage/tests/frontend}/WidgetEditDialogClock.test.tsx (88%) create mode 100644 plugins/homepage/tests/frontend/activate.test.tsx rename {src/ui/tests/features/homepage => plugins/homepage/tests/frontend}/canvas/canvasGeometry.test.ts (97%) rename {src/ui/tests/features/homepage => plugins/homepage/tests/frontend}/canvas/snapToGrid.test.ts (91%) create mode 100644 plugins/homepage/tsconfig.json create mode 100644 plugins/homepage/vitest.config.ts delete mode 100644 src/backend/database/repositories/dashboard-service-link-repository.ts delete mode 100644 src/backend/database/repositories/homepage-item-repository.ts delete mode 100644 src/backend/database/repositories/homepage-layout-repository.ts create mode 100644 src/backend/database/routes/dashboard-routes.ts delete mode 100644 src/backend/database/routes/dashboard-service-links-routes.ts delete mode 100644 src/backend/database/routes/homepage-favicon-routes.ts delete mode 100644 src/backend/database/routes/homepage-items-routes.ts delete mode 100644 src/backend/database/routes/homepage-layout-routes.ts delete mode 100644 src/backend/database/routes/homepage-ping-routes.ts delete mode 100644 src/backend/database/routes/homepage-proxy-routes.ts delete mode 100644 src/backend/database/routes/homepage-rss-routes.ts delete mode 100644 src/backend/services/dashboard.ts delete mode 100644 src/backend/services/homepage.ts delete mode 100644 src/backend/tests/database/repositories/dashboard-service-link-repository.test.ts delete mode 100644 src/backend/tests/database/repositories/homepage-item-repository.test.ts delete mode 100644 src/backend/tests/database/repositories/homepage-layout-repository.test.ts create mode 100644 src/backend/tests/database/routes/dashboard-routes.test.ts delete mode 100644 src/ui/api/homepage-api.ts delete mode 100644 src/ui/features/homepage/widgets/WidgetRegistry.ts rename src/ui/{features/homepage/use-visible-interval.ts => lib/visible-interval.ts} (100%) rename src/ui/{features/homepage/widgets/WidgetTitle.tsx => lib/widget-title.tsx} (100%) create mode 100644 src/ui/plugin-host/homepage-widget-registry.ts create mode 100644 src/ui/tests/lib/apply-ui-preset.test.ts diff --git a/docker/nginx-https.conf b/docker/nginx-https.conf index 6587e8d14..c7084ce51 100644 --- a/docker/nginx-https.conf +++ b/docker/nginx-https.conf @@ -161,7 +161,7 @@ http { root /app/html; index index.html index.htm; expires off; - add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'wasm-unsafe-eval' 'sha256-4lI7pWY2I7KZ35vkFr1bKo1OZllWHDP1lggz9ajwA84='; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: http: https:; font-src 'self' data:; connect-src 'self' http: https: ws: wss:; media-src 'self' data: blob: http: https:; worker-src 'self' blob:; frame-src http: https:; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'" always; + add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'wasm-unsafe-eval' 'sha256-iJpOhOpxvXh7OKmYZ0WQBD4t4cx55Fo/ofGeEAVwflY='; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: http: https:; font-src 'self' data:; connect-src 'self' http: https: ws: wss:; media-src 'self' data: blob: http: https:; worker-src 'self' blob:; frame-src http: https:; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'" always; add_header X-Frame-Options "DENY" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; @@ -539,26 +539,11 @@ http { proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } - location ~ ^/activity(/.*)?$ { - proxy_pass http://127.0.0.1:30006; - proxy_http_version 1.1; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; - } + # Service links and the homepage widget canvas moved to the homepage + # plugin, served under /plugin-api/homepage/. - location ~ ^/service-links(/.*)?$ { - proxy_pass http://127.0.0.1:30006; - proxy_http_version 1.1; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; - } - - location ~ ^/homepage(/.*)?$ { - proxy_pass http://127.0.0.1:30012; + location /dashboard/ { + proxy_pass http://127.0.0.1:30001; proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; diff --git a/docker/nginx.conf b/docker/nginx.conf index b9f2b75ed..b4c41ff06 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -142,7 +142,7 @@ http { root /app/html; index index.html index.htm; expires off; - add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'wasm-unsafe-eval' 'sha256-4lI7pWY2I7KZ35vkFr1bKo1OZllWHDP1lggz9ajwA84='; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: http: https:; font-src 'self' data:; connect-src 'self' http: https: ws: wss:; media-src 'self' data: blob: http: https:; worker-src 'self' blob:; frame-src http: https:; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'" always; + add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'wasm-unsafe-eval' 'sha256-iJpOhOpxvXh7OKmYZ0WQBD4t4cx55Fo/ofGeEAVwflY='; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: http: https:; font-src 'self' data:; connect-src 'self' http: https: ws: wss:; media-src 'self' data: blob: http: https:; worker-src 'self' blob:; frame-src http: https:; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'" always; add_header X-Frame-Options "DENY" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; @@ -517,26 +517,11 @@ http { proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } - location ~ ^/activity(/.*)?$ { - proxy_pass http://127.0.0.1:30006; - proxy_http_version 1.1; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; - } + # Service links and the homepage widget canvas moved to the homepage + # plugin, served under /plugin-api/homepage/. - location ~ ^/service-links(/.*)?$ { - proxy_pass http://127.0.0.1:30006; - proxy_http_version 1.1; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; - } - - location ~ ^/homepage(/.*)?$ { - proxy_pass http://127.0.0.1:30012; + location /dashboard/ { + proxy_pass http://127.0.0.1:30001; proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; diff --git a/drizzle/mysql/0048_hard_demogoblin.sql b/drizzle/mysql/0048_hard_demogoblin.sql new file mode 100644 index 000000000..a805ce5a6 --- /dev/null +++ b/drizzle/mysql/0048_hard_demogoblin.sql @@ -0,0 +1,6 @@ +-- dashboard_service_links, homepage_items and homepage_layouts moved to the +-- homepage plugin, which adopts them by rename at activation (see +-- plugins/homepage/migrations/mysql/0001_adopt_homepage_tables.sql). +-- Dropping them here would delete every row before the plugin's migration +-- ever runs, since this runs at boot before the plugins table exists. +SELECT 1; diff --git a/drizzle/mysql/meta/0048_snapshot.json b/drizzle/mysql/meta/0048_snapshot.json new file mode 100644 index 000000000..167eb7337 --- /dev/null +++ b/drizzle/mysql/meta/0048_snapshot.json @@ -0,0 +1,5795 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "f86d1f40-c554-4898-bf0c-089680ddb0fe", + "prevId": "1453029e-3b9c-4306-8dde-35039d3b7d76", + "tables": { + "api_keys": { + "name": "api_keys", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token_hash": { + "name": "token_hash", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token_prefix": { + "name": "token_prefix", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_used_at": { + "name": "last_used_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + } + }, + "indexes": { + "idx_api_keys_user_id": { + "name": "idx_api_keys_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "api_keys_user_id_users_id_fk": { + "name": "api_keys_user_id_users_id_fk", + "tableFrom": "api_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "api_keys_id": { + "name": "api_keys_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "audit_logs": { + "name": "audit_logs", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "action": { + "name": "action", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "resource_type": { + "name": "resource_type", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "resource_id": { + "name": "resource_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "resource_name": { + "name": "resource_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "details": { + "name": "details", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "success": { + "name": "success", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "timestamp": { + "name": "timestamp", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_audit_logs_timestamp": { + "name": "idx_audit_logs_timestamp", + "columns": [ + "timestamp" + ], + "isUnique": false + }, + "idx_audit_logs_user_ts": { + "name": "idx_audit_logs_user_ts", + "columns": [ + "user_id", + "timestamp" + ], + "isUnique": false + }, + "idx_audit_logs_action_ts": { + "name": "idx_audit_logs_action_ts", + "columns": [ + "action", + "timestamp" + ], + "isUnique": false + }, + "idx_audit_logs_resource_ts": { + "name": "idx_audit_logs_resource_ts", + "columns": [ + "resource_type", + "timestamp" + ], + "isUnique": false + } + }, + "foreignKeys": { + "audit_logs_user_id_users_id_fk": { + "name": "audit_logs_user_id_users_id_fk", + "tableFrom": "audit_logs", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "audit_logs_id": { + "name": "audit_logs_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "credential_access": { + "name": "credential_access", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "credential_id": { + "name": "credential_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role_id": { + "name": "role_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "granted_by": { + "name": "granted_by", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission_level": { + "name": "permission_level", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('use')" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_credential_access_user_id": { + "name": "idx_credential_access_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "idx_credential_access_role_id": { + "name": "idx_credential_access_role_id", + "columns": [ + "role_id" + ], + "isUnique": false + }, + "idx_credential_access_credential_id": { + "name": "idx_credential_access_credential_id", + "columns": [ + "credential_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "credential_access_credential_id_ssh_credentials_id_fk": { + "name": "credential_access_credential_id_ssh_credentials_id_fk", + "tableFrom": "credential_access", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_access_user_id_users_id_fk": { + "name": "credential_access_user_id_users_id_fk", + "tableFrom": "credential_access", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_access_role_id_roles_id_fk": { + "name": "credential_access_role_id_roles_id_fk", + "tableFrom": "credential_access", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_access_granted_by_users_id_fk": { + "name": "credential_access_granted_by_users_id_fk", + "tableFrom": "credential_access", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "credential_access_id": { + "name": "credential_access_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "credential_sidebar_preferences": { + "name": "credential_sidebar_preferences", + "columns": { + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "data": { + "name": "data", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": { + "credential_sidebar_preferences_user_id_users_id_fk": { + "name": "credential_sidebar_preferences_user_id_users_id_fk", + "tableFrom": "credential_sidebar_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "credential_sidebar_preferences_user_id": { + "name": "credential_sidebar_preferences_user_id", + "columns": [ + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "dismissed_alerts": { + "name": "dismissed_alerts", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "alert_id": { + "name": "alert_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dismissed_at": { + "name": "dismissed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_dismissed_alerts_user_id": { + "name": "idx_dismissed_alerts_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "dismissed_alerts_user_id_users_id_fk": { + "name": "dismissed_alerts_user_id_users_id_fk", + "tableFrom": "dismissed_alerts", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "dismissed_alerts_id": { + "name": "dismissed_alerts_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "folder_access": { + "name": "folder_access", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "folder": { + "name": "folder", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role_id": { + "name": "role_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "granted_by": { + "name": "granted_by", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission_level": { + "name": "permission_level", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('connect')" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_folder_access_owner_folder": { + "name": "idx_folder_access_owner_folder", + "columns": [ + "owner_user_id", + "folder" + ], + "isUnique": false + } + }, + "foreignKeys": { + "folder_access_owner_user_id_users_id_fk": { + "name": "folder_access_owner_user_id_users_id_fk", + "tableFrom": "folder_access", + "tableTo": "users", + "columnsFrom": [ + "owner_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "folder_access_user_id_users_id_fk": { + "name": "folder_access_user_id_users_id_fk", + "tableFrom": "folder_access", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "folder_access_role_id_roles_id_fk": { + "name": "folder_access_role_id_roles_id_fk", + "tableFrom": "folder_access", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "folder_access_granted_by_users_id_fk": { + "name": "folder_access_granted_by_users_id_fk", + "tableFrom": "folder_access", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "folder_access_id": { + "name": "folder_access_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "host_access": { + "name": "host_access", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "host_id": { + "name": "host_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role_id": { + "name": "role_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "granted_by": { + "name": "granted_by", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission_level": { + "name": "permission_level", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('connect')" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "last_accessed_at": { + "name": "last_accessed_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "access_count": { + "name": "access_count", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "idx_host_access_user_id": { + "name": "idx_host_access_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "idx_host_access_role_id": { + "name": "idx_host_access_role_id", + "columns": [ + "role_id" + ], + "isUnique": false + }, + "idx_host_access_host_id": { + "name": "idx_host_access_host_id", + "columns": [ + "host_id" + ], + "isUnique": false + }, + "idx_host_access_expires_at": { + "name": "idx_host_access_expires_at", + "columns": [ + "expires_at" + ], + "isUnique": false + } + }, + "foreignKeys": { + "host_access_host_id_ssh_data_id_fk": { + "name": "host_access_host_id_ssh_data_id_fk", + "tableFrom": "host_access", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "host_access_user_id_users_id_fk": { + "name": "host_access_user_id_users_id_fk", + "tableFrom": "host_access", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "host_access_role_id_roles_id_fk": { + "name": "host_access_role_id_roles_id_fk", + "tableFrom": "host_access", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "host_access_granted_by_users_id_fk": { + "name": "host_access_granted_by_users_id_fk", + "tableFrom": "host_access", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "host_access_id": { + "name": "host_access_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "host_sidebar_preferences": { + "name": "host_sidebar_preferences", + "columns": { + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "data": { + "name": "data", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": { + "host_sidebar_preferences_user_id_users_id_fk": { + "name": "host_sidebar_preferences_user_id_users_id_fk", + "tableFrom": "host_sidebar_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "host_sidebar_preferences_user_id": { + "name": "host_sidebar_preferences_user_id", + "columns": [ + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "ssh_data": { + "name": "ssh_data", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "connection_type": { + "name": "connection_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('ssh')" + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ip": { + "name": "ip", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "port": { + "name": "port", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "folder": { + "name": "folder", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "parent_host_id": { + "name": "parent_host_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pin": { + "name": "pin", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "sort_order": { + "name": "sort_order", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "auth_type": { + "name": "auth_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "use_warpgate": { + "name": "use_warpgate", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "share_ssh_auth": { + "name": "share_ssh_auth", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "force_keyboard_interactive": { + "name": "force_keyboard_interactive", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key_password": { + "name": "key_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sudo_password": { + "name": "sudo_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "autostart_password": { + "name": "autostart_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "autostart_key": { + "name": "autostart_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "autostart_key_password": { + "name": "autostart_key_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "credential_id": { + "name": "credential_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "override_credential_username": { + "name": "override_credential_username", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "vault_profile_id": { + "name": "vault_profile_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "enable_terminal": { + "name": "enable_terminal", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "enable_session_logging": { + "name": "enable_session_logging", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "allow_session_sharing": { + "name": "allow_session_sharing", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "enable_command_history": { + "name": "enable_command_history", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "enable_tunnel": { + "name": "enable_tunnel", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "tunnel_connections": { + "name": "tunnel_connections", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "jump_hosts": { + "name": "jump_hosts", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "enable_file_manager": { + "name": "enable_file_manager", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "scp_legacy": { + "name": "scp_legacy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "enable_web_ui": { + "name": "enable_web_ui", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "enable_tmux_monitor": { + "name": "enable_tmux_monitor", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "enable_terminal_toolbar": { + "name": "enable_terminal_toolbar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "show_terminal_in_sidebar": { + "name": "show_terminal_in_sidebar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "show_file_manager_in_sidebar": { + "name": "show_file_manager_in_sidebar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "show_tunnel_in_sidebar": { + "name": "show_tunnel_in_sidebar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "show_docker_in_sidebar": { + "name": "show_docker_in_sidebar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "show_server_stats_in_sidebar": { + "name": "show_server_stats_in_sidebar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "default_path": { + "name": "default_path", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status_check_enabled": { + "name": "status_check_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "status_check_interval": { + "name": "status_check_interval", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "web_ui_config": { + "name": "web_ui_config", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "terminal_config": { + "name": "terminal_config", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "quick_actions": { + "name": "quick_actions", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "enable_ssh": { + "name": "enable_ssh", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "ssh_port": { + "name": "ssh_port", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 22 + }, + "rdp_credential_id": { + "name": "rdp_credential_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "rdp_user": { + "name": "rdp_user", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "rdp_password": { + "name": "rdp_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "rdp_domain": { + "name": "rdp_domain", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "vnc_credential_id": { + "name": "vnc_credential_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "vnc_password": { + "name": "vnc_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "vnc_user": { + "name": "vnc_user", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "telnet_user": { + "name": "telnet_user", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "telnet_password": { + "name": "telnet_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "telnet_credential_id": { + "name": "telnet_credential_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "rdp_auth_type": { + "name": "rdp_auth_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "vnc_auth_type": { + "name": "vnc_auth_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "telnet_auth_type": { + "name": "telnet_auth_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "domain": { + "name": "domain", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "use_socks5": { + "name": "use_socks5", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "socks5_host": { + "name": "socks5_host", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "socks5_port": { + "name": "socks5_port", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "socks5_username": { + "name": "socks5_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "socks5_password": { + "name": "socks5_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "socks5_proxy_chain": { + "name": "socks5_proxy_chain", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "connection_origin": { + "name": "connection_origin", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "mac_address": { + "name": "mac_address", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "wol_broadcast_address": { + "name": "wol_broadcast_address", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "port_knock_sequence": { + "name": "port_knock_sequence", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "host_key_fingerprint": { + "name": "host_key_fingerprint", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "host_key_type": { + "name": "host_key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "host_key_algorithm": { + "name": "host_key_algorithm", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "('sha256')" + }, + "host_key_first_seen": { + "name": "host_key_first_seen", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "host_key_last_verified": { + "name": "host_key_last_verified", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "host_key_changed_count": { + "name": "host_key_changed_count", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "sync_id": { + "name": "sync_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_ssh_data_user_id": { + "name": "idx_ssh_data_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "idx_ssh_data_parent_host": { + "name": "idx_ssh_data_parent_host", + "columns": [ + "parent_host_id" + ], + "isUnique": false + }, + "idx_ssh_data_credential": { + "name": "idx_ssh_data_credential", + "columns": [ + "credential_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "ssh_data_user_id_users_id_fk": { + "name": "ssh_data_user_id_users_id_fk", + "tableFrom": "ssh_data", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "ssh_data_parent_host_id_ssh_data_id_fk": { + "name": "ssh_data_parent_host_id_ssh_data_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_data", + "columnsFrom": [ + "parent_host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_credential_id_ssh_credentials_id_fk": { + "name": "ssh_data_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_vault_profile_id_vault_profiles_id_fk": { + "name": "ssh_data_vault_profile_id_vault_profiles_id_fk", + "tableFrom": "ssh_data", + "tableTo": "vault_profiles", + "columnsFrom": [ + "vault_profile_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_rdp_credential_id_ssh_credentials_id_fk": { + "name": "ssh_data_rdp_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "rdp_credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_vnc_credential_id_ssh_credentials_id_fk": { + "name": "ssh_data_vnc_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "vnc_credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_telnet_credential_id_ssh_credentials_id_fk": { + "name": "ssh_data_telnet_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "telnet_credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "ssh_data_id": { + "name": "ssh_data_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "ssh_data_sync_id_unique": { + "name": "ssh_data_sync_id_unique", + "columns": [ + "sync_id" + ] + } + }, + "checkConstraint": {} + }, + "notification_channels": { + "name": "notification_channels", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "config": { + "name": "config", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": { + "notification_channels_user_id_users_id_fk": { + "name": "notification_channels_user_id_users_id_fk", + "tableFrom": "notification_channels", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "notification_channels_id": { + "name": "notification_channels_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "opkssh_tokens": { + "name": "opkssh_tokens", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "host_id": { + "name": "host_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ssh_cert": { + "name": "ssh_cert", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "private_key": { + "name": "private_key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub": { + "name": "sub", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "issuer": { + "name": "issuer", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "audience": { + "name": "audience", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_used": { + "name": "last_used", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "idx_opkssh_tokens_user_host": { + "name": "idx_opkssh_tokens_user_host", + "columns": [ + "user_id", + "host_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "opkssh_tokens_user_id_users_id_fk": { + "name": "opkssh_tokens_user_id_users_id_fk", + "tableFrom": "opkssh_tokens", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "opkssh_tokens_host_id_ssh_data_id_fk": { + "name": "opkssh_tokens_host_id_ssh_data_id_fk", + "tableFrom": "opkssh_tokens", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "opkssh_tokens_id": { + "name": "opkssh_tokens_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "plugin_install_counts": { + "name": "plugin_install_counts", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "registry_id": { + "name": "registry_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "count": { + "name": "count", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('aggregate-telemetry')" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_plugin_install_counts_plugin_registry": { + "name": "idx_plugin_install_counts_plugin_registry", + "columns": [ + "plugin_id", + "registry_id" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "plugin_install_counts_id": { + "name": "plugin_install_counts_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "plugin_migrations": { + "name": "plugin_migrations", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "migration_id": { + "name": "migration_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "checksum": { + "name": "checksum", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "applied_at": { + "name": "applied_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_plugin_migrations_plugin_migration": { + "name": "idx_plugin_migrations_plugin_migration", + "columns": [ + "plugin_id", + "migration_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "plugin_migrations_plugin_id_plugins_id_fk": { + "name": "plugin_migrations_plugin_id_plugins_id_fk", + "tableFrom": "plugin_migrations", + "tableTo": "plugins", + "columnsFrom": [ + "plugin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "plugin_migrations_id": { + "name": "plugin_migrations_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "plugin_permission_grants": { + "name": "plugin_permission_grants", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "capability": { + "name": "capability", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "granted_at": { + "name": "granted_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "granted_by": { + "name": "granted_by", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('admin')" + } + }, + "indexes": { + "idx_plugin_permission_grants_plugin_capability": { + "name": "idx_plugin_permission_grants_plugin_capability", + "columns": [ + "plugin_id", + "capability" + ], + "isUnique": true + } + }, + "foreignKeys": { + "plugin_permission_grants_plugin_id_plugins_id_fk": { + "name": "plugin_permission_grants_plugin_id_plugins_id_fk", + "tableFrom": "plugin_permission_grants", + "tableTo": "plugins", + "columnsFrom": [ + "plugin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "plugin_permission_grants_granted_by_users_id_fk": { + "name": "plugin_permission_grants_granted_by_users_id_fk", + "tableFrom": "plugin_permission_grants", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "plugin_permission_grants_id": { + "name": "plugin_permission_grants_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "plugin_registries": { + "name": "plugin_registries", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('community')" + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "signing_key": { + "name": "signing_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_checked_at": { + "name": "last_checked_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_index_hash": { + "name": "last_index_hash", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "plugin_registries_id": { + "name": "plugin_registries_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "plugin_settings": { + "name": "plugin_settings", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "scope": { + "name": "scope", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "scope_id": { + "name": "scope_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted": { + "name": "encrypted", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_plugin_settings_scope_key": { + "name": "idx_plugin_settings_scope_key", + "columns": [ + "plugin_id", + "scope", + "scope_id", + "key" + ], + "isUnique": true + }, + "idx_plugin_settings_plugin_scope": { + "name": "idx_plugin_settings_plugin_scope", + "columns": [ + "plugin_id", + "scope" + ], + "isUnique": false + } + }, + "foreignKeys": { + "plugin_settings_plugin_id_plugins_id_fk": { + "name": "plugin_settings_plugin_id_plugins_id_fk", + "tableFrom": "plugin_settings", + "tableTo": "plugins", + "columnsFrom": [ + "plugin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "plugin_settings_id": { + "name": "plugin_settings_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "plugin_storage": { + "name": "plugin_storage", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_plugin_storage_plugin_key": { + "name": "idx_plugin_storage_plugin_key", + "columns": [ + "plugin_id", + "key" + ], + "isUnique": true + } + }, + "foreignKeys": { + "plugin_storage_plugin_id_plugins_id_fk": { + "name": "plugin_storage_plugin_id_plugins_id_fk", + "tableFrom": "plugin_storage", + "tableTo": "plugins", + "columnsFrom": [ + "plugin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "plugin_storage_id": { + "name": "plugin_storage_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "plugins": { + "name": "plugins", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "version": { + "name": "version", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tier": { + "name": "tier", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('available')" + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('community')" + }, + "registry_id": { + "name": "registry_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "state": { + "name": "state", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('disabled')" + }, + "last_error": { + "name": "last_error", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "installed_at": { + "name": "installed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "auto_update": { + "name": "auto_update", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "manifest_json": { + "name": "manifest_json", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "idx_plugins_registry_id": { + "name": "idx_plugins_registry_id", + "columns": [ + "registry_id" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "plugins_id": { + "name": "plugins_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "rbac_applied_defaults": { + "name": "rbac_applied_defaults", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "role_name": { + "name": "role_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "applied_at": { + "name": "applied_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_rbac_applied_defaults_role_permission": { + "name": "idx_rbac_applied_defaults_role_permission", + "columns": [ + "role_name", + "permission" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "rbac_applied_defaults_id": { + "name": "rbac_applied_defaults_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "rbac_known_permissions": { + "name": "rbac_known_permissions", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "permission": { + "name": "permission", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_rbac_known_permissions_permission": { + "name": "idx_rbac_known_permissions_permission", + "columns": [ + "permission" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "rbac_known_permissions_id": { + "name": "rbac_known_permissions_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "recent_activity": { + "name": "recent_activity", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "host_id": { + "name": "host_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "host_name": { + "name": "host_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "timestamp": { + "name": "timestamp", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_recent_activity_user_ts": { + "name": "idx_recent_activity_user_ts", + "columns": [ + "user_id", + "timestamp" + ], + "isUnique": false + } + }, + "foreignKeys": { + "recent_activity_user_id_users_id_fk": { + "name": "recent_activity_user_id_users_id_fk", + "tableFrom": "recent_activity", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "recent_activity_host_id_ssh_data_id_fk": { + "name": "recent_activity_host_id_ssh_data_id_fk", + "tableFrom": "recent_activity", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "recent_activity_id": { + "name": "recent_activity_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "roles": { + "name": "roles", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_system": { + "name": "is_system", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "permissions": { + "name": "permissions", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "roles_id": { + "name": "roles_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "columns": [ + "name" + ] + } + }, + "checkConstraint": {} + }, + "secret_sources": { + "name": "secret_sources", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('onepassword-connect')" + }, + "base_url": { + "name": "base_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "shared": { + "name": "shared", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_secret_sources_user": { + "name": "idx_secret_sources_user", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "secret_sources_user_id_users_id_fk": { + "name": "secret_sources_user_id_users_id_fk", + "tableFrom": "secret_sources", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "secret_sources_id": { + "name": "secret_sources_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "sessions": { + "name": "sessions", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "jwt_token": { + "name": "jwt_token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "device_type": { + "name": "device_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "device_info": { + "name": "device_info", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "oidc_sub": { + "name": "oidc_sub", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "oidc_sid": { + "name": "oidc_sid", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sso_provider_id": { + "name": "sso_provider_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_active_at": { + "name": "last_active_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_sessions_user_id": { + "name": "idx_sessions_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "idx_sessions_expires_at": { + "name": "idx_sessions_expires_at", + "columns": [ + "expires_at" + ], + "isUnique": false + } + }, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "sessions_id": { + "name": "sessions_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "settings": { + "name": "settings", + "columns": { + "key": { + "name": "key", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "settings_key": { + "name": "settings_key", + "columns": [ + "key" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "shared_credential_secrets": { + "name": "shared_credential_secrets", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "credential_access_id": { + "name": "credential_access_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target_user_id": { + "name": "target_user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "credential_id": { + "name": "credential_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "encrypted_username": { + "name": "encrypted_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "auth_type": { + "name": "auth_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('password')" + }, + "encrypted_password": { + "name": "encrypted_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_key": { + "name": "encrypted_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_key_password": { + "name": "encrypted_key_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cert_public_key": { + "name": "cert_public_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_shared_credential_secrets_scope": { + "name": "idx_shared_credential_secrets_scope", + "columns": [ + "credential_access_id", + "target_user_id" + ], + "isUnique": true + }, + "idx_shared_credential_secrets_target": { + "name": "idx_shared_credential_secrets_target", + "columns": [ + "target_user_id", + "credential_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "shared_credential_secrets_target_user_id_users_id_fk": { + "name": "shared_credential_secrets_target_user_id_users_id_fk", + "tableFrom": "shared_credential_secrets", + "tableTo": "users", + "columnsFrom": [ + "target_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_credential_secrets_credential_id_ssh_credentials_id_fk": { + "name": "shared_credential_secrets_credential_id_ssh_credentials_id_fk", + "tableFrom": "shared_credential_secrets", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_cred_secrets_access_id_fk": { + "name": "shared_cred_secrets_access_id_fk", + "tableFrom": "shared_credential_secrets", + "tableTo": "credential_access", + "columnsFrom": [ + "credential_access_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "shared_credential_secrets_id": { + "name": "shared_credential_secrets_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "shared_host_auth_overrides": { + "name": "shared_host_auth_overrides", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "host_id": { + "name": "host_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "protocol": { + "name": "protocol", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'ssh'" + }, + "credential_id": { + "name": "credential_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "shared_host_auth_overrides_host_user_protocol_unique": { + "name": "shared_host_auth_overrides_host_user_protocol_unique", + "columns": [ + "host_id", + "user_id", + "protocol" + ], + "isUnique": true + } + }, + "foreignKeys": { + "shared_host_auth_overrides_host_id_ssh_data_id_fk": { + "name": "shared_host_auth_overrides_host_id_ssh_data_id_fk", + "tableFrom": "shared_host_auth_overrides", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_host_auth_overrides_user_id_users_id_fk": { + "name": "shared_host_auth_overrides_user_id_users_id_fk", + "tableFrom": "shared_host_auth_overrides", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_host_auth_overrides_credential_id_ssh_credentials_id_fk": { + "name": "shared_host_auth_overrides_credential_id_ssh_credentials_id_fk", + "tableFrom": "shared_host_auth_overrides", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "shared_host_auth_overrides_id": { + "name": "shared_host_auth_overrides_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "shared_host_secrets": { + "name": "shared_host_secrets", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "host_access_id": { + "name": "host_access_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target_user_id": { + "name": "target_user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "protocol": { + "name": "protocol", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'ssh'" + }, + "source_type": { + "name": "source_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('credential')" + }, + "original_credential_id": { + "name": "original_credential_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_username": { + "name": "encrypted_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_auth_type": { + "name": "encrypted_auth_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_password": { + "name": "encrypted_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_key": { + "name": "encrypted_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_key_password": { + "name": "encrypted_key_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_key_type": { + "name": "encrypted_key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_domain": { + "name": "encrypted_domain", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_shared_host_secrets_scope": { + "name": "idx_shared_host_secrets_scope", + "columns": [ + "host_access_id", + "target_user_id", + "protocol" + ], + "isUnique": true + } + }, + "foreignKeys": { + "shared_host_secrets_host_access_id_host_access_id_fk": { + "name": "shared_host_secrets_host_access_id_host_access_id_fk", + "tableFrom": "shared_host_secrets", + "tableTo": "host_access", + "columnsFrom": [ + "host_access_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_host_secrets_target_user_id_users_id_fk": { + "name": "shared_host_secrets_target_user_id_users_id_fk", + "tableFrom": "shared_host_secrets", + "tableTo": "users", + "columnsFrom": [ + "target_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_host_secrets_original_credential_id_ssh_credentials_id_fk": { + "name": "shared_host_secrets_original_credential_id_ssh_credentials_id_fk", + "tableFrom": "shared_host_secrets", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "original_credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "shared_host_secrets_id": { + "name": "shared_host_secrets_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "ssh_credential_usage": { + "name": "ssh_credential_usage", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "credential_id": { + "name": "credential_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "host_id": { + "name": "host_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "used_at": { + "name": "used_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_ssh_credential_usage_credential": { + "name": "idx_ssh_credential_usage_credential", + "columns": [ + "credential_id" + ], + "isUnique": false + }, + "idx_ssh_credential_usage_user": { + "name": "idx_ssh_credential_usage_user", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "ssh_credential_usage_credential_id_ssh_credentials_id_fk": { + "name": "ssh_credential_usage_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_credential_usage", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "ssh_credential_usage_host_id_ssh_data_id_fk": { + "name": "ssh_credential_usage_host_id_ssh_data_id_fk", + "tableFrom": "ssh_credential_usage", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "ssh_credential_usage_user_id_users_id_fk": { + "name": "ssh_credential_usage_user_id_users_id_fk", + "tableFrom": "ssh_credential_usage", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "ssh_credential_usage_id": { + "name": "ssh_credential_usage_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "ssh_credentials": { + "name": "ssh_credentials", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "folder": { + "name": "folder", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pin": { + "name": "pin", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "sort_order": { + "name": "sort_order", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "auth_type": { + "name": "auth_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "private_key": { + "name": "private_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key_password": { + "name": "key_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "detected_key_type": { + "name": "detected_key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cert_public_key": { + "name": "cert_public_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "usage_count": { + "name": "usage_count", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_used": { + "name": "last_used", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sync_id": { + "name": "sync_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_ssh_credentials_user_id": { + "name": "idx_ssh_credentials_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "ssh_credentials_user_id_users_id_fk": { + "name": "ssh_credentials_user_id_users_id_fk", + "tableFrom": "ssh_credentials", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "ssh_credentials_id": { + "name": "ssh_credentials_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "ssh_credentials_sync_id_unique": { + "name": "ssh_credentials_sync_id_unique", + "columns": [ + "sync_id" + ] + } + }, + "checkConstraint": {} + }, + "ssh_folders": { + "name": "ssh_folders", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "color": { + "name": "color", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "icon": { + "name": "icon", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "credential_id": { + "name": "credential_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sort_order": { + "name": "sort_order", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sync_id": { + "name": "sync_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_ssh_folders_user_id": { + "name": "idx_ssh_folders_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "ssh_folders_user_id_users_id_fk": { + "name": "ssh_folders_user_id_users_id_fk", + "tableFrom": "ssh_folders", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "ssh_folders_credential_id_ssh_credentials_id_fk": { + "name": "ssh_folders_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_folders", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "ssh_folders_id": { + "name": "ssh_folders_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "ssh_folders_sync_id_unique": { + "name": "ssh_folders_sync_id_unique", + "columns": [ + "sync_id" + ] + } + }, + "checkConstraint": {} + }, + "sso_providers": { + "name": "sso_providers", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "display_order": { + "name": "display_order", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "config": { + "name": "config", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "sso_providers_id": { + "name": "sso_providers_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "sync_tombstones": { + "name": "sync_tombstones", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "entity_type": { + "name": "entity_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sync_id": { + "name": "sync_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": { + "sync_tombstones_user_id_users_id_fk": { + "name": "sync_tombstones_user_id_users_id_fk", + "tableFrom": "sync_tombstones", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "sync_tombstones_id": { + "name": "sync_tombstones_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "termix_identities": { + "name": "termix_identities", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "handle": { + "name": "handle", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": { + "termix_identities_user_id_users_id_fk": { + "name": "termix_identities_user_id_users_id_fk", + "tableFrom": "termix_identities", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "termix_identities_id": { + "name": "termix_identities_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "termix_identities_user_id_unique": { + "name": "termix_identities_user_id_unique", + "columns": [ + "user_id" + ] + }, + "termix_identities_handle_unique": { + "name": "termix_identities_handle_unique", + "columns": [ + "handle" + ] + } + }, + "checkConstraint": {} + }, + "termix_identity_ca": { + "name": "termix_identity_ca", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "identity_id": { + "name": "identity_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "private_key": { + "name": "private_key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "validity_days": { + "name": "validity_days", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 90 + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": { + "termix_identity_ca_identity_id_termix_identities_id_fk": { + "name": "termix_identity_ca_identity_id_termix_identities_id_fk", + "tableFrom": "termix_identity_ca", + "tableTo": "termix_identities", + "columnsFrom": [ + "identity_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "termix_identity_ca_user_id_users_id_fk": { + "name": "termix_identity_ca_user_id_users_id_fk", + "tableFrom": "termix_identity_ca", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "termix_identity_ca_id": { + "name": "termix_identity_ca_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "termix_identity_ca_identity_id_unique": { + "name": "termix_identity_ca_identity_id_unique", + "columns": [ + "identity_id" + ] + } + }, + "checkConstraint": {} + }, + "termix_identity_keys": { + "name": "termix_identity_keys", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "identity_id": { + "name": "identity_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "algorithm": { + "name": "algorithm", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "comment": { + "name": "comment", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('manual')" + }, + "credential_id": { + "name": "credential_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": { + "termix_identity_keys_identity_id_termix_identities_id_fk": { + "name": "termix_identity_keys_identity_id_termix_identities_id_fk", + "tableFrom": "termix_identity_keys", + "tableTo": "termix_identities", + "columnsFrom": [ + "identity_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "termix_identity_keys_user_id_users_id_fk": { + "name": "termix_identity_keys_user_id_users_id_fk", + "tableFrom": "termix_identity_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "termix_identity_keys_credential_id_ssh_credentials_id_fk": { + "name": "termix_identity_keys_credential_id_ssh_credentials_id_fk", + "tableFrom": "termix_identity_keys", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "termix_identity_keys_id": { + "name": "termix_identity_keys_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "trusted_devices": { + "name": "trusted_devices", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "device_fingerprint": { + "name": "device_fingerprint", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "device_type": { + "name": "device_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "device_info": { + "name": "device_info", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_used_at": { + "name": "last_used_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_trusted_devices_user_id": { + "name": "idx_trusted_devices_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "trusted_devices_user_id_users_id_fk": { + "name": "trusted_devices_user_id_users_id_fk", + "tableFrom": "trusted_devices", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "trusted_devices_id": { + "name": "trusted_devices_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "ui_preferences": { + "name": "ui_preferences", + "columns": { + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "data": { + "name": "data", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": { + "ui_preferences_user_id_users_id_fk": { + "name": "ui_preferences_user_id_users_id_fk", + "tableFrom": "ui_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "ui_preferences_user_id": { + "name": "ui_preferences_user_id", + "columns": [ + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "user_external_identities": { + "name": "user_external_identities", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider_id": { + "name": "provider_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "subject": { + "name": "subject", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_user_external_identities_provider_subject": { + "name": "idx_user_external_identities_provider_subject", + "columns": [ + "provider_id", + "subject" + ], + "isUnique": true + }, + "idx_user_external_identities_user": { + "name": "idx_user_external_identities_user", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "user_external_identities_user_id_users_id_fk": { + "name": "user_external_identities_user_id_users_id_fk", + "tableFrom": "user_external_identities", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "user_external_identities_id": { + "name": "user_external_identities_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "user_open_tabs": { + "name": "user_open_tabs", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tab_type": { + "name": "tab_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "host_id": { + "name": "host_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tab_order": { + "name": "tab_order", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "backend_session_id": { + "name": "backend_session_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_user_open_tabs_user_id": { + "name": "idx_user_open_tabs_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "user_open_tabs_user_id_users_id_fk": { + "name": "user_open_tabs_user_id_users_id_fk", + "tableFrom": "user_open_tabs", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_open_tabs_host_id_ssh_data_id_fk": { + "name": "user_open_tabs_host_id_ssh_data_id_fk", + "tableFrom": "user_open_tabs", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "user_open_tabs_id": { + "name": "user_open_tabs_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "user_preferences": { + "name": "user_preferences", + "columns": { + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reopen_tabs_on_login": { + "name": "reopen_tabs_on_login", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "font_size": { + "name": "font_size", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "accent_color": { + "name": "accent_color", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "language": { + "name": "language", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "storage_mode": { + "name": "storage_mode", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "command_autocomplete": { + "name": "command_autocomplete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "command_palette_enabled": { + "name": "command_palette_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "show_host_tags": { + "name": "show_host_tags", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "host_tray_on_click": { + "name": "host_tray_on_click", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pin_app_rail": { + "name": "pin_app_rail", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "expand_app_rail_on_hover": { + "name": "expand_app_rail_on_hover", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "show_pin_app_rail_button": { + "name": "show_pin_app_rail_button", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "folders_collapsed": { + "name": "folders_collapsed", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "confirm_snippet_execution": { + "name": "confirm_snippet_execution", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "disable_update_check": { + "name": "disable_update_check", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "confirm_tab_close": { + "name": "confirm_tab_close", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "hidden_rail_tabs": { + "name": "hidden_rail_tabs", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "compact_host_view": { + "name": "compact_host_view", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status_color_scheme": { + "name": "status_color_scheme", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "custom_themes": { + "name": "custom_themes", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "custom_keybindings": { + "name": "custom_keybindings", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "terminal_defaults": { + "name": "terminal_defaults", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "terminal_macros": { + "name": "terminal_macros", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": { + "user_preferences_user_id_users_id_fk": { + "name": "user_preferences_user_id_users_id_fk", + "tableFrom": "user_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "user_preferences_user_id": { + "name": "user_preferences_user_id", + "columns": [ + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "user_roles": { + "name": "user_roles", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_id": { + "name": "role_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "granted_by": { + "name": "granted_by", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "granted_at": { + "name": "granted_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_user_roles_user_role": { + "name": "idx_user_roles_user_role", + "columns": [ + "user_id", + "role_id" + ], + "isUnique": true + }, + "idx_user_roles_role_id": { + "name": "idx_user_roles_role_id", + "columns": [ + "role_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_granted_by_users_id_fk": { + "name": "user_roles_granted_by_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "user_roles_id": { + "name": "user_roles_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "user_second_factors": { + "name": "user_second_factors", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "factor_id": { + "name": "factor_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "enrolled_at": { + "name": "enrolled_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": { + "idx_user_second_factors_user_factor": { + "name": "idx_user_second_factors_user_factor", + "columns": [ + "user_id", + "plugin_id", + "factor_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "user_second_factors_user_id_users_id_fk": { + "name": "user_second_factors_user_id_users_id_fk", + "tableFrom": "user_second_factors", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "user_second_factors_id": { + "name": "user_second_factors_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "password_hash": { + "name": "password_hash", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_admin": { + "name": "is_admin", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_oidc": { + "name": "is_oidc", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "oidc_identifier": { + "name": "oidc_identifier", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sso_provider_id": { + "name": "sso_provider_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "client_id": { + "name": "client_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "client_secret": { + "name": "client_secret", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "issuer_url": { + "name": "issuer_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "authorization_url": { + "name": "authorization_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "token_url": { + "name": "token_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "identifier_path": { + "name": "identifier_path", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name_path": { + "name": "name_path", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scopes": { + "name": "scopes", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "('openid email profile')" + }, + "totp_secret": { + "name": "totp_secret", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "totp_enabled": { + "name": "totp_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "totp_backup_codes": { + "name": "totp_backup_codes", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "registered_at": { + "name": "registered_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "donation_modal_dismissed": { + "name": "donation_modal_dismissed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "users_id": { + "name": "users_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "vault_profiles": { + "name": "vault_profiles", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "folder": { + "name": "folder", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "vault_addr": { + "name": "vault_addr", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "vault_namespace": { + "name": "vault_namespace", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "oidc_mount": { + "name": "oidc_mount", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "oidc_role": { + "name": "oidc_role", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ssh_mount": { + "name": "ssh_mount", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ssh_role": { + "name": "ssh_role", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "valid_principals": { + "name": "valid_principals", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "shared": { + "name": "shared", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "sync_id": { + "name": "sync_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": { + "vault_profiles_user_id_users_id_fk": { + "name": "vault_profiles_user_id_users_id_fk", + "tableFrom": "vault_profiles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "vault_profiles_id": { + "name": "vault_profiles_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "vault_profiles_sync_id_unique": { + "name": "vault_profiles_sync_id_unique", + "columns": [ + "sync_id" + ] + } + }, + "checkConstraint": {} + }, + "vault_tokens": { + "name": "vault_tokens", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "profile_id": { + "name": "profile_id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ssh_cert": { + "name": "ssh_cert", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "private_key": { + "name": "private_key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_used": { + "name": "last_used", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "idx_vault_tokens_user_profile": { + "name": "idx_vault_tokens_user_profile", + "columns": [ + "user_id", + "profile_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "vault_tokens_user_id_users_id_fk": { + "name": "vault_tokens_user_id_users_id_fk", + "tableFrom": "vault_tokens", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "vault_tokens_profile_id_vault_profiles_id_fk": { + "name": "vault_tokens_profile_id_vault_profiles_id_fk", + "tableFrom": "vault_tokens", + "tableTo": "vault_profiles", + "columnsFrom": [ + "profile_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "vault_tokens_id": { + "name": "vault_tokens_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "webauthn_credentials": { + "name": "webauthn_credentials", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "credential_id": { + "name": "credential_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "counter": { + "name": "counter", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "device_type": { + "name": "device_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "backed_up": { + "name": "backed_up", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "transports": { + "name": "transports", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_verification": { + "name": "user_verification", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('preferred')" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + }, + "last_used_at": { + "name": "last_used_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "webauthn_credentials_user_id_users_id_fk": { + "name": "webauthn_credentials_user_id_users_id_fk", + "tableFrom": "webauthn_credentials", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "webauthn_credentials_id": { + "name": "webauthn_credentials_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "tables": {}, + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/mysql/meta/_journal.json b/drizzle/mysql/meta/_journal.json index 4a2e25a73..05b26b099 100644 --- a/drizzle/mysql/meta/_journal.json +++ b/drizzle/mysql/meta/_journal.json @@ -337,6 +337,13 @@ "when": 1790274704817, "tag": "0047_red_silver_sable", "breakpoints": true + }, + { + "idx": 48, + "version": "5", + "when": 1790278287918, + "tag": "0048_hard_demogoblin", + "breakpoints": true } ] } \ No newline at end of file diff --git a/drizzle/postgres/0049_reflective_adam_destine.sql b/drizzle/postgres/0049_reflective_adam_destine.sql new file mode 100644 index 000000000..fa7a56e03 --- /dev/null +++ b/drizzle/postgres/0049_reflective_adam_destine.sql @@ -0,0 +1,6 @@ +-- dashboard_service_links, homepage_items and homepage_layouts moved to the +-- homepage plugin, which adopts them by rename at activation (see +-- plugins/homepage/migrations/postgres/0001_adopt_homepage_tables.sql). +-- Dropping them here would delete every row before the plugin's migration +-- ever runs, since this runs at boot before the plugins table exists. +SELECT 1; diff --git a/drizzle/postgres/meta/0049_snapshot.json b/drizzle/postgres/meta/0049_snapshot.json new file mode 100644 index 000000000..7b3635fb9 --- /dev/null +++ b/drizzle/postgres/meta/0049_snapshot.json @@ -0,0 +1,5631 @@ +{ + "id": "677f93a5-362c-4f81-8fb1-b51ff963a1b5", + "prevId": "0aa47ca9-9459-452f-af7e-f98bc08cb1f5", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.api_keys": { + "name": "api_keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "token_hash": { + "name": "token_hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "token_prefix": { + "name": "token_prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_used_at": { + "name": "last_used_at", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + } + }, + "indexes": { + "idx_api_keys_user_id": { + "name": "idx_api_keys_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "api_keys_user_id_users_id_fk": { + "name": "api_keys_user_id_users_id_fk", + "tableFrom": "api_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.audit_logs": { + "name": "audit_logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "action": { + "name": "action", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "resource_type": { + "name": "resource_type", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "resource_name": { + "name": "resource_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "details": { + "name": "details", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "success": { + "name": "success", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "timestamp": { + "name": "timestamp", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_audit_logs_timestamp": { + "name": "idx_audit_logs_timestamp", + "columns": [ + { + "expression": "timestamp", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_audit_logs_user_ts": { + "name": "idx_audit_logs_user_ts", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "timestamp", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_audit_logs_action_ts": { + "name": "idx_audit_logs_action_ts", + "columns": [ + { + "expression": "action", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "timestamp", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_audit_logs_resource_ts": { + "name": "idx_audit_logs_resource_ts", + "columns": [ + { + "expression": "resource_type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "timestamp", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "audit_logs_user_id_users_id_fk": { + "name": "audit_logs_user_id_users_id_fk", + "tableFrom": "audit_logs", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.credential_access": { + "name": "credential_access", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "role_id": { + "name": "role_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "granted_by": { + "name": "granted_by", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "permission_level": { + "name": "permission_level", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'use'" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_credential_access_user_id": { + "name": "idx_credential_access_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_credential_access_role_id": { + "name": "idx_credential_access_role_id", + "columns": [ + { + "expression": "role_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_credential_access_credential_id": { + "name": "idx_credential_access_credential_id", + "columns": [ + { + "expression": "credential_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "credential_access_credential_id_ssh_credentials_id_fk": { + "name": "credential_access_credential_id_ssh_credentials_id_fk", + "tableFrom": "credential_access", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_access_user_id_users_id_fk": { + "name": "credential_access_user_id_users_id_fk", + "tableFrom": "credential_access", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_access_role_id_roles_id_fk": { + "name": "credential_access_role_id_roles_id_fk", + "tableFrom": "credential_access", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_access_granted_by_users_id_fk": { + "name": "credential_access_granted_by_users_id_fk", + "tableFrom": "credential_access", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.credential_sidebar_preferences": { + "name": "credential_sidebar_preferences", + "schema": "", + "columns": { + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "data": { + "name": "data", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "credential_sidebar_preferences_user_id_users_id_fk": { + "name": "credential_sidebar_preferences_user_id_users_id_fk", + "tableFrom": "credential_sidebar_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.dismissed_alerts": { + "name": "dismissed_alerts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "alert_id": { + "name": "alert_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dismissed_at": { + "name": "dismissed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_dismissed_alerts_user_id": { + "name": "idx_dismissed_alerts_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "dismissed_alerts_user_id_users_id_fk": { + "name": "dismissed_alerts_user_id_users_id_fk", + "tableFrom": "dismissed_alerts", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.folder_access": { + "name": "folder_access", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "folder": { + "name": "folder", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "role_id": { + "name": "role_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "granted_by": { + "name": "granted_by", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "permission_level": { + "name": "permission_level", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'connect'" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_folder_access_owner_folder": { + "name": "idx_folder_access_owner_folder", + "columns": [ + { + "expression": "owner_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "folder", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "folder_access_owner_user_id_users_id_fk": { + "name": "folder_access_owner_user_id_users_id_fk", + "tableFrom": "folder_access", + "tableTo": "users", + "columnsFrom": [ + "owner_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "folder_access_user_id_users_id_fk": { + "name": "folder_access_user_id_users_id_fk", + "tableFrom": "folder_access", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "folder_access_role_id_roles_id_fk": { + "name": "folder_access_role_id_roles_id_fk", + "tableFrom": "folder_access", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "folder_access_granted_by_users_id_fk": { + "name": "folder_access_granted_by_users_id_fk", + "tableFrom": "folder_access", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.host_access": { + "name": "host_access", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "host_id": { + "name": "host_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "role_id": { + "name": "role_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "granted_by": { + "name": "granted_by", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "permission_level": { + "name": "permission_level", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'connect'" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "last_accessed_at": { + "name": "last_accessed_at", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_count": { + "name": "access_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + } + }, + "indexes": { + "idx_host_access_user_id": { + "name": "idx_host_access_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_host_access_role_id": { + "name": "idx_host_access_role_id", + "columns": [ + { + "expression": "role_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_host_access_host_id": { + "name": "idx_host_access_host_id", + "columns": [ + { + "expression": "host_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_host_access_expires_at": { + "name": "idx_host_access_expires_at", + "columns": [ + { + "expression": "expires_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "host_access_host_id_ssh_data_id_fk": { + "name": "host_access_host_id_ssh_data_id_fk", + "tableFrom": "host_access", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "host_access_user_id_users_id_fk": { + "name": "host_access_user_id_users_id_fk", + "tableFrom": "host_access", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "host_access_role_id_roles_id_fk": { + "name": "host_access_role_id_roles_id_fk", + "tableFrom": "host_access", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "host_access_granted_by_users_id_fk": { + "name": "host_access_granted_by_users_id_fk", + "tableFrom": "host_access", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.host_sidebar_preferences": { + "name": "host_sidebar_preferences", + "schema": "", + "columns": { + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "data": { + "name": "data", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "host_sidebar_preferences_user_id_users_id_fk": { + "name": "host_sidebar_preferences_user_id_users_id_fk", + "tableFrom": "host_sidebar_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ssh_data": { + "name": "ssh_data", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "connection_type": { + "name": "connection_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'ssh'" + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip": { + "name": "ip", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "folder": { + "name": "folder", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "parent_host_id": { + "name": "parent_host_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "pin": { + "name": "pin", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "auth_type": { + "name": "auth_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "use_warpgate": { + "name": "use_warpgate", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "share_ssh_auth": { + "name": "share_ssh_auth", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "force_keyboard_interactive": { + "name": "force_keyboard_interactive", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key_password": { + "name": "key_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sudo_password": { + "name": "sudo_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autostart_password": { + "name": "autostart_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autostart_key": { + "name": "autostart_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autostart_key_password": { + "name": "autostart_key_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "override_credential_username": { + "name": "override_credential_username", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "vault_profile_id": { + "name": "vault_profile_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "enable_terminal": { + "name": "enable_terminal", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "enable_session_logging": { + "name": "enable_session_logging", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "allow_session_sharing": { + "name": "allow_session_sharing", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "enable_command_history": { + "name": "enable_command_history", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "enable_tunnel": { + "name": "enable_tunnel", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "tunnel_connections": { + "name": "tunnel_connections", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "jump_hosts": { + "name": "jump_hosts", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enable_file_manager": { + "name": "enable_file_manager", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "scp_legacy": { + "name": "scp_legacy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enable_web_ui": { + "name": "enable_web_ui", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enable_tmux_monitor": { + "name": "enable_tmux_monitor", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enable_terminal_toolbar": { + "name": "enable_terminal_toolbar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "show_terminal_in_sidebar": { + "name": "show_terminal_in_sidebar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "show_file_manager_in_sidebar": { + "name": "show_file_manager_in_sidebar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "show_tunnel_in_sidebar": { + "name": "show_tunnel_in_sidebar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "show_docker_in_sidebar": { + "name": "show_docker_in_sidebar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "show_server_stats_in_sidebar": { + "name": "show_server_stats_in_sidebar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "default_path": { + "name": "default_path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status_check_enabled": { + "name": "status_check_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "status_check_interval": { + "name": "status_check_interval", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "web_ui_config": { + "name": "web_ui_config", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "terminal_config": { + "name": "terminal_config", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "quick_actions": { + "name": "quick_actions", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enable_ssh": { + "name": "enable_ssh", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "ssh_port": { + "name": "ssh_port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 22 + }, + "rdp_credential_id": { + "name": "rdp_credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "rdp_user": { + "name": "rdp_user", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "rdp_password": { + "name": "rdp_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "rdp_domain": { + "name": "rdp_domain", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "vnc_credential_id": { + "name": "vnc_credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "vnc_password": { + "name": "vnc_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "vnc_user": { + "name": "vnc_user", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telnet_user": { + "name": "telnet_user", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telnet_password": { + "name": "telnet_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telnet_credential_id": { + "name": "telnet_credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "rdp_auth_type": { + "name": "rdp_auth_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "vnc_auth_type": { + "name": "vnc_auth_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telnet_auth_type": { + "name": "telnet_auth_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "domain": { + "name": "domain", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "use_socks5": { + "name": "use_socks5", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "socks5_host": { + "name": "socks5_host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "socks5_port": { + "name": "socks5_port", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "socks5_username": { + "name": "socks5_username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "socks5_password": { + "name": "socks5_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "socks5_proxy_chain": { + "name": "socks5_proxy_chain", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "connection_origin": { + "name": "connection_origin", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mac_address": { + "name": "mac_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "wol_broadcast_address": { + "name": "wol_broadcast_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "port_knock_sequence": { + "name": "port_knock_sequence", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "host_key_fingerprint": { + "name": "host_key_fingerprint", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "host_key_type": { + "name": "host_key_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "host_key_algorithm": { + "name": "host_key_algorithm", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'sha256'" + }, + "host_key_first_seen": { + "name": "host_key_first_seen", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "host_key_last_verified": { + "name": "host_key_last_verified", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "host_key_changed_count": { + "name": "host_key_changed_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "sync_id": { + "name": "sync_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_ssh_data_user_id": { + "name": "idx_ssh_data_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_ssh_data_parent_host": { + "name": "idx_ssh_data_parent_host", + "columns": [ + { + "expression": "parent_host_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_ssh_data_credential": { + "name": "idx_ssh_data_credential", + "columns": [ + { + "expression": "credential_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "ssh_data_user_id_users_id_fk": { + "name": "ssh_data_user_id_users_id_fk", + "tableFrom": "ssh_data", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "ssh_data_parent_host_id_ssh_data_id_fk": { + "name": "ssh_data_parent_host_id_ssh_data_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_data", + "columnsFrom": [ + "parent_host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_credential_id_ssh_credentials_id_fk": { + "name": "ssh_data_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_vault_profile_id_vault_profiles_id_fk": { + "name": "ssh_data_vault_profile_id_vault_profiles_id_fk", + "tableFrom": "ssh_data", + "tableTo": "vault_profiles", + "columnsFrom": [ + "vault_profile_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_rdp_credential_id_ssh_credentials_id_fk": { + "name": "ssh_data_rdp_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "rdp_credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_vnc_credential_id_ssh_credentials_id_fk": { + "name": "ssh_data_vnc_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "vnc_credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_telnet_credential_id_ssh_credentials_id_fk": { + "name": "ssh_data_telnet_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "telnet_credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "ssh_data_sync_id_unique": { + "name": "ssh_data_sync_id_unique", + "nullsNotDistinct": false, + "columns": [ + "sync_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.notification_channels": { + "name": "notification_channels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "config": { + "name": "config", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "notification_channels_user_id_users_id_fk": { + "name": "notification_channels_user_id_users_id_fk", + "tableFrom": "notification_channels", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.opkssh_tokens": { + "name": "opkssh_tokens", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "host_id": { + "name": "host_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "ssh_cert": { + "name": "ssh_cert", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "private_key": { + "name": "private_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sub": { + "name": "sub", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "issuer": { + "name": "issuer", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "audience": { + "name": "audience", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "last_used": { + "name": "last_used", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "idx_opkssh_tokens_user_host": { + "name": "idx_opkssh_tokens_user_host", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "host_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "opkssh_tokens_user_id_users_id_fk": { + "name": "opkssh_tokens_user_id_users_id_fk", + "tableFrom": "opkssh_tokens", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "opkssh_tokens_host_id_ssh_data_id_fk": { + "name": "opkssh_tokens_host_id_ssh_data_id_fk", + "tableFrom": "opkssh_tokens", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.plugin_install_counts": { + "name": "plugin_install_counts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "registry_id": { + "name": "registry_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "count": { + "name": "count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'aggregate-telemetry'" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_plugin_install_counts_plugin_registry": { + "name": "idx_plugin_install_counts_plugin_registry", + "columns": [ + { + "expression": "plugin_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "registry_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.plugin_migrations": { + "name": "plugin_migrations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "migration_id": { + "name": "migration_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "checksum": { + "name": "checksum", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applied_at": { + "name": "applied_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_plugin_migrations_plugin_migration": { + "name": "idx_plugin_migrations_plugin_migration", + "columns": [ + { + "expression": "plugin_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "migration_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "plugin_migrations_plugin_id_plugins_id_fk": { + "name": "plugin_migrations_plugin_id_plugins_id_fk", + "tableFrom": "plugin_migrations", + "tableTo": "plugins", + "columnsFrom": [ + "plugin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.plugin_permission_grants": { + "name": "plugin_permission_grants", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "capability": { + "name": "capability", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "granted_at": { + "name": "granted_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "granted_by": { + "name": "granted_by", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'admin'" + } + }, + "indexes": { + "idx_plugin_permission_grants_plugin_capability": { + "name": "idx_plugin_permission_grants_plugin_capability", + "columns": [ + { + "expression": "plugin_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "capability", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "plugin_permission_grants_plugin_id_plugins_id_fk": { + "name": "plugin_permission_grants_plugin_id_plugins_id_fk", + "tableFrom": "plugin_permission_grants", + "tableTo": "plugins", + "columnsFrom": [ + "plugin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "plugin_permission_grants_granted_by_users_id_fk": { + "name": "plugin_permission_grants_granted_by_users_id_fk", + "tableFrom": "plugin_permission_grants", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.plugin_registries": { + "name": "plugin_registries", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'community'" + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "signing_key": { + "name": "signing_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "last_checked_at": { + "name": "last_checked_at", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "last_index_hash": { + "name": "last_index_hash", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.plugin_settings": { + "name": "plugin_settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "scope": { + "name": "scope", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "scope_id": { + "name": "scope_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "key": { + "name": "key", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "encrypted": { + "name": "encrypted", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_plugin_settings_scope_key": { + "name": "idx_plugin_settings_scope_key", + "columns": [ + { + "expression": "plugin_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "scope", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "scope_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_plugin_settings_plugin_scope": { + "name": "idx_plugin_settings_plugin_scope", + "columns": [ + { + "expression": "plugin_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "scope", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "plugin_settings_plugin_id_plugins_id_fk": { + "name": "plugin_settings_plugin_id_plugins_id_fk", + "tableFrom": "plugin_settings", + "tableTo": "plugins", + "columnsFrom": [ + "plugin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.plugin_storage": { + "name": "plugin_storage", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_plugin_storage_plugin_key": { + "name": "idx_plugin_storage_plugin_key", + "columns": [ + { + "expression": "plugin_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "plugin_storage_plugin_id_plugins_id_fk": { + "name": "plugin_storage_plugin_id_plugins_id_fk", + "tableFrom": "plugin_storage", + "tableTo": "plugins", + "columnsFrom": [ + "plugin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.plugins": { + "name": "plugins", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "version": { + "name": "version", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tier": { + "name": "tier", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'available'" + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'community'" + }, + "registry_id": { + "name": "registry_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "state": { + "name": "state", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'disabled'" + }, + "last_error": { + "name": "last_error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "installed_at": { + "name": "installed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "auto_update": { + "name": "auto_update", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "manifest_json": { + "name": "manifest_json", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "idx_plugins_registry_id": { + "name": "idx_plugins_registry_id", + "columns": [ + { + "expression": "registry_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.rbac_applied_defaults": { + "name": "rbac_applied_defaults", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "role_name": { + "name": "role_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "permission": { + "name": "permission", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "applied_at": { + "name": "applied_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_rbac_applied_defaults_role_permission": { + "name": "idx_rbac_applied_defaults_role_permission", + "columns": [ + { + "expression": "role_name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "permission", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.rbac_known_permissions": { + "name": "rbac_known_permissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "permission": { + "name": "permission", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_rbac_known_permissions_permission": { + "name": "idx_rbac_known_permissions_permission", + "columns": [ + { + "expression": "permission", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.recent_activity": { + "name": "recent_activity", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "host_id": { + "name": "host_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "host_name": { + "name": "host_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "timestamp": { + "name": "timestamp", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_recent_activity_user_ts": { + "name": "idx_recent_activity_user_ts", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "timestamp", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "recent_activity_user_id_users_id_fk": { + "name": "recent_activity_user_id_users_id_fk", + "tableFrom": "recent_activity", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "recent_activity_host_id_ssh_data_id_fk": { + "name": "recent_activity_host_id_ssh_data_id_fk", + "tableFrom": "recent_activity", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_system": { + "name": "is_system", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "permissions": { + "name": "permissions", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.secret_sources": { + "name": "secret_sources", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'onepassword-connect'" + }, + "base_url": { + "name": "base_url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "shared": { + "name": "shared", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_secret_sources_user": { + "name": "idx_secret_sources_user", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "secret_sources_user_id_users_id_fk": { + "name": "secret_sources_user_id_users_id_fk", + "tableFrom": "secret_sources", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "jwt_token": { + "name": "jwt_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "device_type": { + "name": "device_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "device_info": { + "name": "device_info", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "oidc_sub": { + "name": "oidc_sub", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "oidc_sid": { + "name": "oidc_sid", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sso_provider_id": { + "name": "sso_provider_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "last_active_at": { + "name": "last_active_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_sessions_user_id": { + "name": "idx_sessions_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_sessions_expires_at": { + "name": "idx_sessions_expires_at", + "columns": [ + { + "expression": "expires_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.settings": { + "name": "settings", + "schema": "", + "columns": { + "key": { + "name": "key", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shared_credential_secrets": { + "name": "shared_credential_secrets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "credential_access_id": { + "name": "credential_access_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "target_user_id": { + "name": "target_user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "encrypted_username": { + "name": "encrypted_username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "auth_type": { + "name": "auth_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'password'" + }, + "encrypted_password": { + "name": "encrypted_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "encrypted_key": { + "name": "encrypted_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "encrypted_key_password": { + "name": "encrypted_key_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cert_public_key": { + "name": "cert_public_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_shared_credential_secrets_scope": { + "name": "idx_shared_credential_secrets_scope", + "columns": [ + { + "expression": "credential_access_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "target_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_shared_credential_secrets_target": { + "name": "idx_shared_credential_secrets_target", + "columns": [ + { + "expression": "target_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "credential_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "shared_credential_secrets_target_user_id_users_id_fk": { + "name": "shared_credential_secrets_target_user_id_users_id_fk", + "tableFrom": "shared_credential_secrets", + "tableTo": "users", + "columnsFrom": [ + "target_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_credential_secrets_credential_id_ssh_credentials_id_fk": { + "name": "shared_credential_secrets_credential_id_ssh_credentials_id_fk", + "tableFrom": "shared_credential_secrets", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_cred_secrets_access_id_fk": { + "name": "shared_cred_secrets_access_id_fk", + "tableFrom": "shared_credential_secrets", + "tableTo": "credential_access", + "columnsFrom": [ + "credential_access_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shared_host_auth_overrides": { + "name": "shared_host_auth_overrides", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "host_id": { + "name": "host_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "default": "'ssh'" + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "shared_host_auth_overrides_host_user_protocol_unique": { + "name": "shared_host_auth_overrides_host_user_protocol_unique", + "columns": [ + { + "expression": "host_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "protocol", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "shared_host_auth_overrides_host_id_ssh_data_id_fk": { + "name": "shared_host_auth_overrides_host_id_ssh_data_id_fk", + "tableFrom": "shared_host_auth_overrides", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_host_auth_overrides_user_id_users_id_fk": { + "name": "shared_host_auth_overrides_user_id_users_id_fk", + "tableFrom": "shared_host_auth_overrides", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_host_auth_overrides_credential_id_ssh_credentials_id_fk": { + "name": "shared_host_auth_overrides_credential_id_ssh_credentials_id_fk", + "tableFrom": "shared_host_auth_overrides", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shared_host_secrets": { + "name": "shared_host_secrets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "host_access_id": { + "name": "host_access_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "target_user_id": { + "name": "target_user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "default": "'ssh'" + }, + "source_type": { + "name": "source_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'credential'" + }, + "original_credential_id": { + "name": "original_credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "encrypted_username": { + "name": "encrypted_username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "encrypted_auth_type": { + "name": "encrypted_auth_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "encrypted_password": { + "name": "encrypted_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "encrypted_key": { + "name": "encrypted_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "encrypted_key_password": { + "name": "encrypted_key_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "encrypted_key_type": { + "name": "encrypted_key_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "encrypted_domain": { + "name": "encrypted_domain", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_shared_host_secrets_scope": { + "name": "idx_shared_host_secrets_scope", + "columns": [ + { + "expression": "host_access_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "target_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "protocol", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "shared_host_secrets_host_access_id_host_access_id_fk": { + "name": "shared_host_secrets_host_access_id_host_access_id_fk", + "tableFrom": "shared_host_secrets", + "tableTo": "host_access", + "columnsFrom": [ + "host_access_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_host_secrets_target_user_id_users_id_fk": { + "name": "shared_host_secrets_target_user_id_users_id_fk", + "tableFrom": "shared_host_secrets", + "tableTo": "users", + "columnsFrom": [ + "target_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_host_secrets_original_credential_id_ssh_credentials_id_fk": { + "name": "shared_host_secrets_original_credential_id_ssh_credentials_id_fk", + "tableFrom": "shared_host_secrets", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "original_credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ssh_credential_usage": { + "name": "ssh_credential_usage", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "host_id": { + "name": "host_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "used_at": { + "name": "used_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_ssh_credential_usage_credential": { + "name": "idx_ssh_credential_usage_credential", + "columns": [ + { + "expression": "credential_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_ssh_credential_usage_user": { + "name": "idx_ssh_credential_usage_user", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "ssh_credential_usage_credential_id_ssh_credentials_id_fk": { + "name": "ssh_credential_usage_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_credential_usage", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "ssh_credential_usage_host_id_ssh_data_id_fk": { + "name": "ssh_credential_usage_host_id_ssh_data_id_fk", + "tableFrom": "ssh_credential_usage", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "ssh_credential_usage_user_id_users_id_fk": { + "name": "ssh_credential_usage_user_id_users_id_fk", + "tableFrom": "ssh_credential_usage", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ssh_credentials": { + "name": "ssh_credentials", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "folder": { + "name": "folder", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "pin": { + "name": "pin", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "auth_type": { + "name": "auth_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "private_key": { + "name": "private_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key_password": { + "name": "key_password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "detected_key_type": { + "name": "detected_key_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cert_public_key": { + "name": "cert_public_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "usage_count": { + "name": "usage_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "last_used": { + "name": "last_used", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sync_id": { + "name": "sync_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_ssh_credentials_user_id": { + "name": "idx_ssh_credentials_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "ssh_credentials_user_id_users_id_fk": { + "name": "ssh_credentials_user_id_users_id_fk", + "tableFrom": "ssh_credentials", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "ssh_credentials_sync_id_unique": { + "name": "ssh_credentials_sync_id_unique", + "nullsNotDistinct": false, + "columns": [ + "sync_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ssh_folders": { + "name": "ssh_folders", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "color": { + "name": "color", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "icon": { + "name": "icon", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "sync_id": { + "name": "sync_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_ssh_folders_user_id": { + "name": "idx_ssh_folders_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "ssh_folders_user_id_users_id_fk": { + "name": "ssh_folders_user_id_users_id_fk", + "tableFrom": "ssh_folders", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "ssh_folders_credential_id_ssh_credentials_id_fk": { + "name": "ssh_folders_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_folders", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "ssh_folders_sync_id_unique": { + "name": "ssh_folders_sync_id_unique", + "nullsNotDistinct": false, + "columns": [ + "sync_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.sso_providers": { + "name": "sso_providers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "display_order": { + "name": "display_order", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "config": { + "name": "config", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.sync_tombstones": { + "name": "sync_tombstones", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "entity_type": { + "name": "entity_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "sync_id": { + "name": "sync_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "deleted_at": { + "name": "deleted_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "sync_tombstones_user_id_users_id_fk": { + "name": "sync_tombstones_user_id_users_id_fk", + "tableFrom": "sync_tombstones", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.termix_identities": { + "name": "termix_identities", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "handle": { + "name": "handle", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "termix_identities_user_id_users_id_fk": { + "name": "termix_identities_user_id_users_id_fk", + "tableFrom": "termix_identities", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "termix_identities_user_id_unique": { + "name": "termix_identities_user_id_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id" + ] + }, + "termix_identities_handle_unique": { + "name": "termix_identities_handle_unique", + "nullsNotDistinct": false, + "columns": [ + "handle" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.termix_identity_ca": { + "name": "termix_identity_ca", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "identity_id": { + "name": "identity_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "private_key": { + "name": "private_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "validity_days": { + "name": "validity_days", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 90 + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "termix_identity_ca_identity_id_termix_identities_id_fk": { + "name": "termix_identity_ca_identity_id_termix_identities_id_fk", + "tableFrom": "termix_identity_ca", + "tableTo": "termix_identities", + "columnsFrom": [ + "identity_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "termix_identity_ca_user_id_users_id_fk": { + "name": "termix_identity_ca_user_id_users_id_fk", + "tableFrom": "termix_identity_ca", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "termix_identity_ca_identity_id_unique": { + "name": "termix_identity_ca_identity_id_unique", + "nullsNotDistinct": false, + "columns": [ + "identity_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.termix_identity_keys": { + "name": "termix_identity_keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "identity_id": { + "name": "identity_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "algorithm": { + "name": "algorithm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "comment": { + "name": "comment", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'manual'" + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "termix_identity_keys_identity_id_termix_identities_id_fk": { + "name": "termix_identity_keys_identity_id_termix_identities_id_fk", + "tableFrom": "termix_identity_keys", + "tableTo": "termix_identities", + "columnsFrom": [ + "identity_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "termix_identity_keys_user_id_users_id_fk": { + "name": "termix_identity_keys_user_id_users_id_fk", + "tableFrom": "termix_identity_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "termix_identity_keys_credential_id_ssh_credentials_id_fk": { + "name": "termix_identity_keys_credential_id_ssh_credentials_id_fk", + "tableFrom": "termix_identity_keys", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.trusted_devices": { + "name": "trusted_devices", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "device_fingerprint": { + "name": "device_fingerprint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "device_type": { + "name": "device_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "device_info": { + "name": "device_info", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "last_used_at": { + "name": "last_used_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_trusted_devices_user_id": { + "name": "idx_trusted_devices_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "trusted_devices_user_id_users_id_fk": { + "name": "trusted_devices_user_id_users_id_fk", + "tableFrom": "trusted_devices", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ui_preferences": { + "name": "ui_preferences", + "schema": "", + "columns": { + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "data": { + "name": "data", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "ui_preferences_user_id_users_id_fk": { + "name": "ui_preferences_user_id_users_id_fk", + "tableFrom": "ui_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_external_identities": { + "name": "user_external_identities", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "subject": { + "name": "subject", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_user_external_identities_provider_subject": { + "name": "idx_user_external_identities_provider_subject", + "columns": [ + { + "expression": "provider_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "subject", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_user_external_identities_user": { + "name": "idx_user_external_identities_user", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "user_external_identities_user_id_users_id_fk": { + "name": "user_external_identities_user_id_users_id_fk", + "tableFrom": "user_external_identities", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_open_tabs": { + "name": "user_open_tabs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "tab_type": { + "name": "tab_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "host_id": { + "name": "host_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tab_order": { + "name": "tab_order", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "backend_session_id": { + "name": "backend_session_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_user_open_tabs_user_id": { + "name": "idx_user_open_tabs_user_id", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "user_open_tabs_user_id_users_id_fk": { + "name": "user_open_tabs_user_id_users_id_fk", + "tableFrom": "user_open_tabs", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_open_tabs_host_id_ssh_data_id_fk": { + "name": "user_open_tabs_host_id_ssh_data_id_fk", + "tableFrom": "user_open_tabs", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_preferences": { + "name": "user_preferences", + "schema": "", + "columns": { + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "reopen_tabs_on_login": { + "name": "reopen_tabs_on_login", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "theme": { + "name": "theme", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "font_size": { + "name": "font_size", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accent_color": { + "name": "accent_color", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "language": { + "name": "language", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "storage_mode": { + "name": "storage_mode", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command_autocomplete": { + "name": "command_autocomplete", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "command_palette_enabled": { + "name": "command_palette_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "show_host_tags": { + "name": "show_host_tags", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "host_tray_on_click": { + "name": "host_tray_on_click", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "pin_app_rail": { + "name": "pin_app_rail", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "expand_app_rail_on_hover": { + "name": "expand_app_rail_on_hover", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "show_pin_app_rail_button": { + "name": "show_pin_app_rail_button", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "folders_collapsed": { + "name": "folders_collapsed", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "confirm_snippet_execution": { + "name": "confirm_snippet_execution", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "disable_update_check": { + "name": "disable_update_check", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "confirm_tab_close": { + "name": "confirm_tab_close", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "hidden_rail_tabs": { + "name": "hidden_rail_tabs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "compact_host_view": { + "name": "compact_host_view", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "status_color_scheme": { + "name": "status_color_scheme", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "custom_themes": { + "name": "custom_themes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "custom_keybindings": { + "name": "custom_keybindings", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "terminal_defaults": { + "name": "terminal_defaults", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "terminal_macros": { + "name": "terminal_macros", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "user_preferences_user_id_users_id_fk": { + "name": "user_preferences_user_id_users_id_fk", + "tableFrom": "user_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "granted_by": { + "name": "granted_by", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "granted_at": { + "name": "granted_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_user_roles_user_role": { + "name": "idx_user_roles_user_role", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "role_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_user_roles_role_id": { + "name": "idx_user_roles_role_id", + "columns": [ + { + "expression": "role_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_granted_by_users_id_fk": { + "name": "user_roles_granted_by_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_second_factors": { + "name": "user_second_factors", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "factor_id": { + "name": "factor_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "enrolled_at": { + "name": "enrolled_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_user_second_factors_user_factor": { + "name": "idx_user_second_factors_user_factor", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "plugin_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "factor_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "user_second_factors_user_id_users_id_fk": { + "name": "user_second_factors_user_id_users_id_fk", + "tableFrom": "user_second_factors", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password_hash": { + "name": "password_hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "is_admin": { + "name": "is_admin", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_oidc": { + "name": "is_oidc", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "oidc_identifier": { + "name": "oidc_identifier", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sso_provider_id": { + "name": "sso_provider_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "client_id": { + "name": "client_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_secret": { + "name": "client_secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "issuer_url": { + "name": "issuer_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "authorization_url": { + "name": "authorization_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token_url": { + "name": "token_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "identifier_path": { + "name": "identifier_path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "name_path": { + "name": "name_path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "scopes": { + "name": "scopes", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'openid email profile'" + }, + "totp_secret": { + "name": "totp_secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "totp_enabled": { + "name": "totp_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "totp_backup_codes": { + "name": "totp_backup_codes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "registered_at": { + "name": "registered_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "donation_modal_dismissed": { + "name": "donation_modal_dismissed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.vault_profiles": { + "name": "vault_profiles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "folder": { + "name": "folder", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "vault_addr": { + "name": "vault_addr", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "vault_namespace": { + "name": "vault_namespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "oidc_mount": { + "name": "oidc_mount", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "oidc_role": { + "name": "oidc_role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ssh_mount": { + "name": "ssh_mount", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ssh_role": { + "name": "ssh_role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "valid_principals": { + "name": "valid_principals", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "shared": { + "name": "shared", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "sync_id": { + "name": "sync_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "vault_profiles_user_id_users_id_fk": { + "name": "vault_profiles_user_id_users_id_fk", + "tableFrom": "vault_profiles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "vault_profiles_sync_id_unique": { + "name": "vault_profiles_sync_id_unique", + "nullsNotDistinct": false, + "columns": [ + "sync_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.vault_tokens": { + "name": "vault_tokens", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "profile_id": { + "name": "profile_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "ssh_cert": { + "name": "ssh_cert", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "private_key": { + "name": "private_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "expires_at": { + "name": "expires_at", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "last_used": { + "name": "last_used", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "idx_vault_tokens_user_profile": { + "name": "idx_vault_tokens_user_profile", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "profile_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "vault_tokens_user_id_users_id_fk": { + "name": "vault_tokens_user_id_users_id_fk", + "tableFrom": "vault_tokens", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "vault_tokens_profile_id_vault_profiles_id_fk": { + "name": "vault_tokens_profile_id_vault_profiles_id_fk", + "tableFrom": "vault_tokens", + "tableTo": "vault_profiles", + "columnsFrom": [ + "profile_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.webauthn_credentials": { + "name": "webauthn_credentials", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "credential_id": { + "name": "credential_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "counter": { + "name": "counter", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "device_type": { + "name": "device_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "backed_up": { + "name": "backed_up", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "transports": { + "name": "transports", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_verification": { + "name": "user_verification", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'preferred'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "CURRENT_TIMESTAMP" + }, + "last_used_at": { + "name": "last_used_at", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "webauthn_credentials_user_id_users_id_fk": { + "name": "webauthn_credentials_user_id_users_id_fk", + "tableFrom": "webauthn_credentials", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/postgres/meta/_journal.json b/drizzle/postgres/meta/_journal.json index 9244a139b..70664dd9e 100644 --- a/drizzle/postgres/meta/_journal.json +++ b/drizzle/postgres/meta/_journal.json @@ -344,6 +344,13 @@ "when": 1790274704269, "tag": "0048_rare_catseye", "breakpoints": true + }, + { + "idx": 49, + "version": "7", + "when": 1790278287300, + "tag": "0049_reflective_adam_destine", + "breakpoints": true } ] } \ No newline at end of file diff --git a/drizzle/sqlite/0045_public_menace.sql b/drizzle/sqlite/0045_public_menace.sql new file mode 100644 index 000000000..15dcd3965 --- /dev/null +++ b/drizzle/sqlite/0045_public_menace.sql @@ -0,0 +1,3 @@ +DROP TABLE `dashboard_service_links`;--> statement-breakpoint +DROP TABLE `homepage_items`;--> statement-breakpoint +DROP TABLE `homepage_layouts`; \ No newline at end of file diff --git a/drizzle/sqlite/meta/0045_snapshot.json b/drizzle/sqlite/meta/0045_snapshot.json new file mode 100644 index 000000000..65095ea96 --- /dev/null +++ b/drizzle/sqlite/meta/0045_snapshot.json @@ -0,0 +1,5471 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "73eaaff7-6861-4b1c-985b-5faa23e923c3", + "prevId": "52d31840-4880-4133-8a5e-9e2ff8271b15", + "tables": { + "api_keys": { + "name": "api_keys", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token_hash": { + "name": "token_hash", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token_prefix": { + "name": "token_prefix", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_used_at": { + "name": "last_used_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_active": { + "name": "is_active", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + } + }, + "indexes": { + "idx_api_keys_user_id": { + "name": "idx_api_keys_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "api_keys_user_id_users_id_fk": { + "name": "api_keys_user_id_users_id_fk", + "tableFrom": "api_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "audit_logs": { + "name": "audit_logs", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "resource_type": { + "name": "resource_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "resource_id": { + "name": "resource_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "resource_name": { + "name": "resource_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "details": { + "name": "details", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "success": { + "name": "success", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "timestamp": { + "name": "timestamp", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_audit_logs_timestamp": { + "name": "idx_audit_logs_timestamp", + "columns": [ + "timestamp" + ], + "isUnique": false + }, + "idx_audit_logs_user_ts": { + "name": "idx_audit_logs_user_ts", + "columns": [ + "user_id", + "timestamp" + ], + "isUnique": false + }, + "idx_audit_logs_action_ts": { + "name": "idx_audit_logs_action_ts", + "columns": [ + "action", + "timestamp" + ], + "isUnique": false + }, + "idx_audit_logs_resource_ts": { + "name": "idx_audit_logs_resource_ts", + "columns": [ + "resource_type", + "timestamp" + ], + "isUnique": false + } + }, + "foreignKeys": { + "audit_logs_user_id_users_id_fk": { + "name": "audit_logs_user_id_users_id_fk", + "tableFrom": "audit_logs", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "credential_access": { + "name": "credential_access", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role_id": { + "name": "role_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "granted_by": { + "name": "granted_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission_level": { + "name": "permission_level", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'use'" + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_credential_access_user_id": { + "name": "idx_credential_access_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "idx_credential_access_role_id": { + "name": "idx_credential_access_role_id", + "columns": [ + "role_id" + ], + "isUnique": false + }, + "idx_credential_access_credential_id": { + "name": "idx_credential_access_credential_id", + "columns": [ + "credential_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "credential_access_credential_id_ssh_credentials_id_fk": { + "name": "credential_access_credential_id_ssh_credentials_id_fk", + "tableFrom": "credential_access", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_access_user_id_users_id_fk": { + "name": "credential_access_user_id_users_id_fk", + "tableFrom": "credential_access", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_access_role_id_roles_id_fk": { + "name": "credential_access_role_id_roles_id_fk", + "tableFrom": "credential_access", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_access_granted_by_users_id_fk": { + "name": "credential_access_granted_by_users_id_fk", + "tableFrom": "credential_access", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "credential_sidebar_preferences": { + "name": "credential_sidebar_preferences", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "data": { + "name": "data", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "credential_sidebar_preferences_user_id_users_id_fk": { + "name": "credential_sidebar_preferences_user_id_users_id_fk", + "tableFrom": "credential_sidebar_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "dismissed_alerts": { + "name": "dismissed_alerts", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "alert_id": { + "name": "alert_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dismissed_at": { + "name": "dismissed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_dismissed_alerts_user_id": { + "name": "idx_dismissed_alerts_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "dismissed_alerts_user_id_users_id_fk": { + "name": "dismissed_alerts_user_id_users_id_fk", + "tableFrom": "dismissed_alerts", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "folder_access": { + "name": "folder_access", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "folder": { + "name": "folder", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role_id": { + "name": "role_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "granted_by": { + "name": "granted_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission_level": { + "name": "permission_level", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'connect'" + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_folder_access_owner_folder": { + "name": "idx_folder_access_owner_folder", + "columns": [ + "owner_user_id", + "folder" + ], + "isUnique": false + } + }, + "foreignKeys": { + "folder_access_owner_user_id_users_id_fk": { + "name": "folder_access_owner_user_id_users_id_fk", + "tableFrom": "folder_access", + "tableTo": "users", + "columnsFrom": [ + "owner_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "folder_access_user_id_users_id_fk": { + "name": "folder_access_user_id_users_id_fk", + "tableFrom": "folder_access", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "folder_access_role_id_roles_id_fk": { + "name": "folder_access_role_id_roles_id_fk", + "tableFrom": "folder_access", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "folder_access_granted_by_users_id_fk": { + "name": "folder_access_granted_by_users_id_fk", + "tableFrom": "folder_access", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "host_access": { + "name": "host_access", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "host_id": { + "name": "host_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role_id": { + "name": "role_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "granted_by": { + "name": "granted_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission_level": { + "name": "permission_level", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'connect'" + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "last_accessed_at": { + "name": "last_accessed_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "access_count": { + "name": "access_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "idx_host_access_user_id": { + "name": "idx_host_access_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "idx_host_access_role_id": { + "name": "idx_host_access_role_id", + "columns": [ + "role_id" + ], + "isUnique": false + }, + "idx_host_access_host_id": { + "name": "idx_host_access_host_id", + "columns": [ + "host_id" + ], + "isUnique": false + }, + "idx_host_access_expires_at": { + "name": "idx_host_access_expires_at", + "columns": [ + "expires_at" + ], + "isUnique": false + } + }, + "foreignKeys": { + "host_access_host_id_ssh_data_id_fk": { + "name": "host_access_host_id_ssh_data_id_fk", + "tableFrom": "host_access", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "host_access_user_id_users_id_fk": { + "name": "host_access_user_id_users_id_fk", + "tableFrom": "host_access", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "host_access_role_id_roles_id_fk": { + "name": "host_access_role_id_roles_id_fk", + "tableFrom": "host_access", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "host_access_granted_by_users_id_fk": { + "name": "host_access_granted_by_users_id_fk", + "tableFrom": "host_access", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "host_sidebar_preferences": { + "name": "host_sidebar_preferences", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "data": { + "name": "data", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "host_sidebar_preferences_user_id_users_id_fk": { + "name": "host_sidebar_preferences_user_id_users_id_fk", + "tableFrom": "host_sidebar_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "ssh_data": { + "name": "ssh_data", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "connection_type": { + "name": "connection_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'ssh'" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ip": { + "name": "ip", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "folder": { + "name": "folder", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "parent_host_id": { + "name": "parent_host_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pin": { + "name": "pin", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "auth_type": { + "name": "auth_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "use_warpgate": { + "name": "use_warpgate", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "share_ssh_auth": { + "name": "share_ssh_auth", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "force_keyboard_interactive": { + "name": "force_keyboard_interactive", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "text(8192)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key_password": { + "name": "key_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sudo_password": { + "name": "sudo_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "autostart_password": { + "name": "autostart_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "autostart_key": { + "name": "autostart_key", + "type": "text(8192)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "autostart_key_password": { + "name": "autostart_key_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "override_credential_username": { + "name": "override_credential_username", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "vault_profile_id": { + "name": "vault_profile_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "enable_terminal": { + "name": "enable_terminal", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "enable_session_logging": { + "name": "enable_session_logging", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "allow_session_sharing": { + "name": "allow_session_sharing", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "enable_command_history": { + "name": "enable_command_history", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "enable_tunnel": { + "name": "enable_tunnel", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "tunnel_connections": { + "name": "tunnel_connections", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "jump_hosts": { + "name": "jump_hosts", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "enable_file_manager": { + "name": "enable_file_manager", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "scp_legacy": { + "name": "scp_legacy", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "enable_web_ui": { + "name": "enable_web_ui", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "enable_tmux_monitor": { + "name": "enable_tmux_monitor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "enable_terminal_toolbar": { + "name": "enable_terminal_toolbar", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "show_terminal_in_sidebar": { + "name": "show_terminal_in_sidebar", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "show_file_manager_in_sidebar": { + "name": "show_file_manager_in_sidebar", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "show_tunnel_in_sidebar": { + "name": "show_tunnel_in_sidebar", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "show_docker_in_sidebar": { + "name": "show_docker_in_sidebar", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "show_server_stats_in_sidebar": { + "name": "show_server_stats_in_sidebar", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "default_path": { + "name": "default_path", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status_check_enabled": { + "name": "status_check_enabled", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "status_check_interval": { + "name": "status_check_interval", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "web_ui_config": { + "name": "web_ui_config", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "terminal_config": { + "name": "terminal_config", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "quick_actions": { + "name": "quick_actions", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "enable_ssh": { + "name": "enable_ssh", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "ssh_port": { + "name": "ssh_port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 22 + }, + "rdp_credential_id": { + "name": "rdp_credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "rdp_user": { + "name": "rdp_user", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "rdp_password": { + "name": "rdp_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "rdp_domain": { + "name": "rdp_domain", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "vnc_credential_id": { + "name": "vnc_credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "vnc_password": { + "name": "vnc_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "vnc_user": { + "name": "vnc_user", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "telnet_user": { + "name": "telnet_user", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "telnet_password": { + "name": "telnet_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "telnet_credential_id": { + "name": "telnet_credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "rdp_auth_type": { + "name": "rdp_auth_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "vnc_auth_type": { + "name": "vnc_auth_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "telnet_auth_type": { + "name": "telnet_auth_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "domain": { + "name": "domain", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "use_socks5": { + "name": "use_socks5", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "socks5_host": { + "name": "socks5_host", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "socks5_port": { + "name": "socks5_port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "socks5_username": { + "name": "socks5_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "socks5_password": { + "name": "socks5_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "socks5_proxy_chain": { + "name": "socks5_proxy_chain", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "connection_origin": { + "name": "connection_origin", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "mac_address": { + "name": "mac_address", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "wol_broadcast_address": { + "name": "wol_broadcast_address", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "port_knock_sequence": { + "name": "port_knock_sequence", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "host_key_fingerprint": { + "name": "host_key_fingerprint", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "host_key_type": { + "name": "host_key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "host_key_algorithm": { + "name": "host_key_algorithm", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'sha256'" + }, + "host_key_first_seen": { + "name": "host_key_first_seen", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "host_key_last_verified": { + "name": "host_key_last_verified", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "host_key_changed_count": { + "name": "host_key_changed_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "sync_id": { + "name": "sync_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "ssh_data_sync_id_unique": { + "name": "ssh_data_sync_id_unique", + "columns": [ + "sync_id" + ], + "isUnique": true + }, + "idx_ssh_data_user_id": { + "name": "idx_ssh_data_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "idx_ssh_data_parent_host": { + "name": "idx_ssh_data_parent_host", + "columns": [ + "parent_host_id" + ], + "isUnique": false + }, + "idx_ssh_data_credential": { + "name": "idx_ssh_data_credential", + "columns": [ + "credential_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "ssh_data_user_id_users_id_fk": { + "name": "ssh_data_user_id_users_id_fk", + "tableFrom": "ssh_data", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "ssh_data_parent_host_id_ssh_data_id_fk": { + "name": "ssh_data_parent_host_id_ssh_data_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_data", + "columnsFrom": [ + "parent_host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_credential_id_ssh_credentials_id_fk": { + "name": "ssh_data_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_vault_profile_id_vault_profiles_id_fk": { + "name": "ssh_data_vault_profile_id_vault_profiles_id_fk", + "tableFrom": "ssh_data", + "tableTo": "vault_profiles", + "columnsFrom": [ + "vault_profile_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_rdp_credential_id_ssh_credentials_id_fk": { + "name": "ssh_data_rdp_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "rdp_credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_vnc_credential_id_ssh_credentials_id_fk": { + "name": "ssh_data_vnc_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "vnc_credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ssh_data_telnet_credential_id_ssh_credentials_id_fk": { + "name": "ssh_data_telnet_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_data", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "telnet_credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "notification_channels": { + "name": "notification_channels", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "config": { + "name": "config", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "enabled": { + "name": "enabled", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "notification_channels_user_id_users_id_fk": { + "name": "notification_channels_user_id_users_id_fk", + "tableFrom": "notification_channels", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "opkssh_tokens": { + "name": "opkssh_tokens", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "host_id": { + "name": "host_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ssh_cert": { + "name": "ssh_cert", + "type": "text(8192)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "private_key": { + "name": "private_key", + "type": "text(8192)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub": { + "name": "sub", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "issuer": { + "name": "issuer", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "audience": { + "name": "audience", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_used": { + "name": "last_used", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "idx_opkssh_tokens_user_host": { + "name": "idx_opkssh_tokens_user_host", + "columns": [ + "user_id", + "host_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "opkssh_tokens_user_id_users_id_fk": { + "name": "opkssh_tokens_user_id_users_id_fk", + "tableFrom": "opkssh_tokens", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "opkssh_tokens_host_id_ssh_data_id_fk": { + "name": "opkssh_tokens_host_id_ssh_data_id_fk", + "tableFrom": "opkssh_tokens", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "plugin_install_counts": { + "name": "plugin_install_counts", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "registry_id": { + "name": "registry_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "count": { + "name": "count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'aggregate-telemetry'" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_plugin_install_counts_plugin_registry": { + "name": "idx_plugin_install_counts_plugin_registry", + "columns": [ + "plugin_id", + "registry_id" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "plugin_migrations": { + "name": "plugin_migrations", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "migration_id": { + "name": "migration_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "checksum": { + "name": "checksum", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "applied_at": { + "name": "applied_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_plugin_migrations_plugin_migration": { + "name": "idx_plugin_migrations_plugin_migration", + "columns": [ + "plugin_id", + "migration_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "plugin_migrations_plugin_id_plugins_id_fk": { + "name": "plugin_migrations_plugin_id_plugins_id_fk", + "tableFrom": "plugin_migrations", + "tableTo": "plugins", + "columnsFrom": [ + "plugin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "plugin_permission_grants": { + "name": "plugin_permission_grants", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "capability": { + "name": "capability", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "granted_at": { + "name": "granted_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "granted_by": { + "name": "granted_by", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'admin'" + } + }, + "indexes": { + "idx_plugin_permission_grants_plugin_capability": { + "name": "idx_plugin_permission_grants_plugin_capability", + "columns": [ + "plugin_id", + "capability" + ], + "isUnique": true + } + }, + "foreignKeys": { + "plugin_permission_grants_plugin_id_plugins_id_fk": { + "name": "plugin_permission_grants_plugin_id_plugins_id_fk", + "tableFrom": "plugin_permission_grants", + "tableTo": "plugins", + "columnsFrom": [ + "plugin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "plugin_permission_grants_granted_by_users_id_fk": { + "name": "plugin_permission_grants_granted_by_users_id_fk", + "tableFrom": "plugin_permission_grants", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "plugin_registries": { + "name": "plugin_registries", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'community'" + }, + "enabled": { + "name": "enabled", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "signing_key": { + "name": "signing_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_checked_at": { + "name": "last_checked_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_index_hash": { + "name": "last_index_hash", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "plugin_settings": { + "name": "plugin_settings", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "scope_id": { + "name": "scope_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted": { + "name": "encrypted", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_plugin_settings_scope_key": { + "name": "idx_plugin_settings_scope_key", + "columns": [ + "plugin_id", + "scope", + "scope_id", + "key" + ], + "isUnique": true + }, + "idx_plugin_settings_plugin_scope": { + "name": "idx_plugin_settings_plugin_scope", + "columns": [ + "plugin_id", + "scope" + ], + "isUnique": false + } + }, + "foreignKeys": { + "plugin_settings_plugin_id_plugins_id_fk": { + "name": "plugin_settings_plugin_id_plugins_id_fk", + "tableFrom": "plugin_settings", + "tableTo": "plugins", + "columnsFrom": [ + "plugin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "plugin_storage": { + "name": "plugin_storage", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "plugin_id": { + "name": "plugin_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_plugin_storage_plugin_key": { + "name": "idx_plugin_storage_plugin_key", + "columns": [ + "plugin_id", + "key" + ], + "isUnique": true + } + }, + "foreignKeys": { + "plugin_storage_plugin_id_plugins_id_fk": { + "name": "plugin_storage_plugin_id_plugins_id_fk", + "tableFrom": "plugin_storage", + "tableTo": "plugins", + "columnsFrom": [ + "plugin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "plugins": { + "name": "plugins", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "version": { + "name": "version", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tier": { + "name": "tier", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'available'" + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'community'" + }, + "registry_id": { + "name": "registry_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "state": { + "name": "state", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'disabled'" + }, + "last_error": { + "name": "last_error", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "installed_at": { + "name": "installed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "auto_update": { + "name": "auto_update", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "manifest_json": { + "name": "manifest_json", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "idx_plugins_registry_id": { + "name": "idx_plugins_registry_id", + "columns": [ + "registry_id" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "rbac_applied_defaults": { + "name": "rbac_applied_defaults", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "role_name": { + "name": "role_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "applied_at": { + "name": "applied_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_rbac_applied_defaults_role_permission": { + "name": "idx_rbac_applied_defaults_role_permission", + "columns": [ + "role_name", + "permission" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "rbac_known_permissions": { + "name": "rbac_known_permissions", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "plugin_id": { + "name": "plugin_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_rbac_known_permissions_permission": { + "name": "idx_rbac_known_permissions_permission", + "columns": [ + "permission" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "recent_activity": { + "name": "recent_activity", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "host_id": { + "name": "host_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "host_name": { + "name": "host_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "timestamp": { + "name": "timestamp", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_recent_activity_user_ts": { + "name": "idx_recent_activity_user_ts", + "columns": [ + "user_id", + "timestamp" + ], + "isUnique": false + } + }, + "foreignKeys": { + "recent_activity_user_id_users_id_fk": { + "name": "recent_activity_user_id_users_id_fk", + "tableFrom": "recent_activity", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "recent_activity_host_id_ssh_data_id_fk": { + "name": "recent_activity_host_id_ssh_data_id_fk", + "tableFrom": "recent_activity", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "roles": { + "name": "roles", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_system": { + "name": "is_system", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "permissions": { + "name": "permissions", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "roles_name_unique": { + "name": "roles_name_unique", + "columns": [ + "name" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "secret_sources": { + "name": "secret_sources", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'onepassword-connect'" + }, + "base_url": { + "name": "base_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "shared": { + "name": "shared", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_secret_sources_user": { + "name": "idx_secret_sources_user", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "secret_sources_user_id_users_id_fk": { + "name": "secret_sources_user_id_users_id_fk", + "tableFrom": "secret_sources", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "sessions": { + "name": "sessions", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "jwt_token": { + "name": "jwt_token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "device_type": { + "name": "device_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "device_info": { + "name": "device_info", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "oidc_sub": { + "name": "oidc_sub", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "oidc_sid": { + "name": "oidc_sid", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sso_provider_id": { + "name": "sso_provider_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_active_at": { + "name": "last_active_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_sessions_user_id": { + "name": "idx_sessions_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "idx_sessions_expires_at": { + "name": "idx_sessions_expires_at", + "columns": [ + "expires_at" + ], + "isUnique": false + } + }, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "settings": { + "name": "settings", + "columns": { + "key": { + "name": "key", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "shared_credential_secrets": { + "name": "shared_credential_secrets", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "credential_access_id": { + "name": "credential_access_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target_user_id": { + "name": "target_user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "encrypted_username": { + "name": "encrypted_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "auth_type": { + "name": "auth_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'password'" + }, + "encrypted_password": { + "name": "encrypted_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_key": { + "name": "encrypted_key", + "type": "text(16384)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_key_password": { + "name": "encrypted_key_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "public_key": { + "name": "public_key", + "type": "text(4096)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cert_public_key": { + "name": "cert_public_key", + "type": "text(8192)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_shared_credential_secrets_scope": { + "name": "idx_shared_credential_secrets_scope", + "columns": [ + "credential_access_id", + "target_user_id" + ], + "isUnique": true + }, + "idx_shared_credential_secrets_target": { + "name": "idx_shared_credential_secrets_target", + "columns": [ + "target_user_id", + "credential_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "shared_credential_secrets_target_user_id_users_id_fk": { + "name": "shared_credential_secrets_target_user_id_users_id_fk", + "tableFrom": "shared_credential_secrets", + "tableTo": "users", + "columnsFrom": [ + "target_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_credential_secrets_credential_id_ssh_credentials_id_fk": { + "name": "shared_credential_secrets_credential_id_ssh_credentials_id_fk", + "tableFrom": "shared_credential_secrets", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_cred_secrets_access_id_fk": { + "name": "shared_cred_secrets_access_id_fk", + "tableFrom": "shared_credential_secrets", + "tableTo": "credential_access", + "columnsFrom": [ + "credential_access_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "shared_host_auth_overrides": { + "name": "shared_host_auth_overrides", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "host_id": { + "name": "host_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "protocol": { + "name": "protocol", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'ssh'" + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "shared_host_auth_overrides_host_user_protocol_unique": { + "name": "shared_host_auth_overrides_host_user_protocol_unique", + "columns": [ + "host_id", + "user_id", + "protocol" + ], + "isUnique": true + } + }, + "foreignKeys": { + "shared_host_auth_overrides_host_id_ssh_data_id_fk": { + "name": "shared_host_auth_overrides_host_id_ssh_data_id_fk", + "tableFrom": "shared_host_auth_overrides", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_host_auth_overrides_user_id_users_id_fk": { + "name": "shared_host_auth_overrides_user_id_users_id_fk", + "tableFrom": "shared_host_auth_overrides", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_host_auth_overrides_credential_id_ssh_credentials_id_fk": { + "name": "shared_host_auth_overrides_credential_id_ssh_credentials_id_fk", + "tableFrom": "shared_host_auth_overrides", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "shared_host_secrets": { + "name": "shared_host_secrets", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "host_access_id": { + "name": "host_access_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target_user_id": { + "name": "target_user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "protocol": { + "name": "protocol", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'ssh'" + }, + "source_type": { + "name": "source_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'credential'" + }, + "original_credential_id": { + "name": "original_credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_username": { + "name": "encrypted_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_auth_type": { + "name": "encrypted_auth_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_password": { + "name": "encrypted_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_key": { + "name": "encrypted_key", + "type": "text(16384)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_key_password": { + "name": "encrypted_key_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_key_type": { + "name": "encrypted_key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "encrypted_domain": { + "name": "encrypted_domain", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_shared_host_secrets_scope": { + "name": "idx_shared_host_secrets_scope", + "columns": [ + "host_access_id", + "target_user_id", + "protocol" + ], + "isUnique": true + } + }, + "foreignKeys": { + "shared_host_secrets_host_access_id_host_access_id_fk": { + "name": "shared_host_secrets_host_access_id_host_access_id_fk", + "tableFrom": "shared_host_secrets", + "tableTo": "host_access", + "columnsFrom": [ + "host_access_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_host_secrets_target_user_id_users_id_fk": { + "name": "shared_host_secrets_target_user_id_users_id_fk", + "tableFrom": "shared_host_secrets", + "tableTo": "users", + "columnsFrom": [ + "target_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shared_host_secrets_original_credential_id_ssh_credentials_id_fk": { + "name": "shared_host_secrets_original_credential_id_ssh_credentials_id_fk", + "tableFrom": "shared_host_secrets", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "original_credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "ssh_credential_usage": { + "name": "ssh_credential_usage", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "host_id": { + "name": "host_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "used_at": { + "name": "used_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_ssh_credential_usage_credential": { + "name": "idx_ssh_credential_usage_credential", + "columns": [ + "credential_id" + ], + "isUnique": false + }, + "idx_ssh_credential_usage_user": { + "name": "idx_ssh_credential_usage_user", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "ssh_credential_usage_credential_id_ssh_credentials_id_fk": { + "name": "ssh_credential_usage_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_credential_usage", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "ssh_credential_usage_host_id_ssh_data_id_fk": { + "name": "ssh_credential_usage_host_id_ssh_data_id_fk", + "tableFrom": "ssh_credential_usage", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "ssh_credential_usage_user_id_users_id_fk": { + "name": "ssh_credential_usage_user_id_users_id_fk", + "tableFrom": "ssh_credential_usage", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "ssh_credentials": { + "name": "ssh_credentials", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "folder": { + "name": "folder", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pin": { + "name": "pin", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "auth_type": { + "name": "auth_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "text(16384)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "private_key": { + "name": "private_key", + "type": "text(16384)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "public_key": { + "name": "public_key", + "type": "text(4096)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key_password": { + "name": "key_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "detected_key_type": { + "name": "detected_key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cert_public_key": { + "name": "cert_public_key", + "type": "text(8192)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "usage_count": { + "name": "usage_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_used": { + "name": "last_used", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sync_id": { + "name": "sync_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "ssh_credentials_sync_id_unique": { + "name": "ssh_credentials_sync_id_unique", + "columns": [ + "sync_id" + ], + "isUnique": true + }, + "idx_ssh_credentials_user_id": { + "name": "idx_ssh_credentials_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "ssh_credentials_user_id_users_id_fk": { + "name": "ssh_credentials_user_id_users_id_fk", + "tableFrom": "ssh_credentials", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "ssh_folders": { + "name": "ssh_folders", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "color": { + "name": "color", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "icon": { + "name": "icon", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sync_id": { + "name": "sync_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "ssh_folders_sync_id_unique": { + "name": "ssh_folders_sync_id_unique", + "columns": [ + "sync_id" + ], + "isUnique": true + }, + "idx_ssh_folders_user_id": { + "name": "idx_ssh_folders_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "ssh_folders_user_id_users_id_fk": { + "name": "ssh_folders_user_id_users_id_fk", + "tableFrom": "ssh_folders", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "ssh_folders_credential_id_ssh_credentials_id_fk": { + "name": "ssh_folders_credential_id_ssh_credentials_id_fk", + "tableFrom": "ssh_folders", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "sso_providers": { + "name": "sso_providers", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "enabled": { + "name": "enabled", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "display_order": { + "name": "display_order", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "config": { + "name": "config", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "sync_tombstones": { + "name": "sync_tombstones", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "entity_type": { + "name": "entity_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sync_id": { + "name": "sync_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "sync_tombstones_user_id_users_id_fk": { + "name": "sync_tombstones_user_id_users_id_fk", + "tableFrom": "sync_tombstones", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "termix_identities": { + "name": "termix_identities", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "handle": { + "name": "handle", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "termix_identities_user_id_unique": { + "name": "termix_identities_user_id_unique", + "columns": [ + "user_id" + ], + "isUnique": true + }, + "termix_identities_handle_unique": { + "name": "termix_identities_handle_unique", + "columns": [ + "handle" + ], + "isUnique": true + } + }, + "foreignKeys": { + "termix_identities_user_id_users_id_fk": { + "name": "termix_identities_user_id_users_id_fk", + "tableFrom": "termix_identities", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "termix_identity_ca": { + "name": "termix_identity_ca", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "identity_id": { + "name": "identity_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "public_key": { + "name": "public_key", + "type": "text(4096)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "private_key": { + "name": "private_key", + "type": "text(8192)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "validity_days": { + "name": "validity_days", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 90 + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "termix_identity_ca_identity_id_unique": { + "name": "termix_identity_ca_identity_id_unique", + "columns": [ + "identity_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "termix_identity_ca_identity_id_termix_identities_id_fk": { + "name": "termix_identity_ca_identity_id_termix_identities_id_fk", + "tableFrom": "termix_identity_ca", + "tableTo": "termix_identities", + "columnsFrom": [ + "identity_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "termix_identity_ca_user_id_users_id_fk": { + "name": "termix_identity_ca_user_id_users_id_fk", + "tableFrom": "termix_identity_ca", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "termix_identity_keys": { + "name": "termix_identity_keys", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "identity_id": { + "name": "identity_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "public_key": { + "name": "public_key", + "type": "text(8192)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "algorithm": { + "name": "algorithm", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "comment": { + "name": "comment", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'manual'" + }, + "credential_id": { + "name": "credential_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "enabled": { + "name": "enabled", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "termix_identity_keys_identity_id_termix_identities_id_fk": { + "name": "termix_identity_keys_identity_id_termix_identities_id_fk", + "tableFrom": "termix_identity_keys", + "tableTo": "termix_identities", + "columnsFrom": [ + "identity_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "termix_identity_keys_user_id_users_id_fk": { + "name": "termix_identity_keys_user_id_users_id_fk", + "tableFrom": "termix_identity_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "termix_identity_keys_credential_id_ssh_credentials_id_fk": { + "name": "termix_identity_keys_credential_id_ssh_credentials_id_fk", + "tableFrom": "termix_identity_keys", + "tableTo": "ssh_credentials", + "columnsFrom": [ + "credential_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "trusted_devices": { + "name": "trusted_devices", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "device_fingerprint": { + "name": "device_fingerprint", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "device_type": { + "name": "device_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "device_info": { + "name": "device_info", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_used_at": { + "name": "last_used_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_trusted_devices_user_id": { + "name": "idx_trusted_devices_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "trusted_devices_user_id_users_id_fk": { + "name": "trusted_devices_user_id_users_id_fk", + "tableFrom": "trusted_devices", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "ui_preferences": { + "name": "ui_preferences", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "data": { + "name": "data", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "ui_preferences_user_id_users_id_fk": { + "name": "ui_preferences_user_id_users_id_fk", + "tableFrom": "ui_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_external_identities": { + "name": "user_external_identities", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "subject": { + "name": "subject", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_user_external_identities_provider_subject": { + "name": "idx_user_external_identities_provider_subject", + "columns": [ + "provider_id", + "subject" + ], + "isUnique": true + }, + "idx_user_external_identities_user": { + "name": "idx_user_external_identities_user", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "user_external_identities_user_id_users_id_fk": { + "name": "user_external_identities_user_id_users_id_fk", + "tableFrom": "user_external_identities", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_open_tabs": { + "name": "user_open_tabs", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tab_type": { + "name": "tab_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "host_id": { + "name": "host_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tab_order": { + "name": "tab_order", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "backend_session_id": { + "name": "backend_session_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_user_open_tabs_user_id": { + "name": "idx_user_open_tabs_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "user_open_tabs_user_id_users_id_fk": { + "name": "user_open_tabs_user_id_users_id_fk", + "tableFrom": "user_open_tabs", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_open_tabs_host_id_ssh_data_id_fk": { + "name": "user_open_tabs_host_id_ssh_data_id_fk", + "tableFrom": "user_open_tabs", + "tableTo": "ssh_data", + "columnsFrom": [ + "host_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_preferences": { + "name": "user_preferences", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "reopen_tabs_on_login": { + "name": "reopen_tabs_on_login", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "font_size": { + "name": "font_size", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "accent_color": { + "name": "accent_color", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "language": { + "name": "language", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "storage_mode": { + "name": "storage_mode", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "command_autocomplete": { + "name": "command_autocomplete", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "command_palette_enabled": { + "name": "command_palette_enabled", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "show_host_tags": { + "name": "show_host_tags", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "host_tray_on_click": { + "name": "host_tray_on_click", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pin_app_rail": { + "name": "pin_app_rail", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "expand_app_rail_on_hover": { + "name": "expand_app_rail_on_hover", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "show_pin_app_rail_button": { + "name": "show_pin_app_rail_button", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "folders_collapsed": { + "name": "folders_collapsed", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "confirm_snippet_execution": { + "name": "confirm_snippet_execution", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "disable_update_check": { + "name": "disable_update_check", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "confirm_tab_close": { + "name": "confirm_tab_close", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "hidden_rail_tabs": { + "name": "hidden_rail_tabs", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "compact_host_view": { + "name": "compact_host_view", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status_color_scheme": { + "name": "status_color_scheme", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "custom_themes": { + "name": "custom_themes", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "custom_keybindings": { + "name": "custom_keybindings", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "terminal_defaults": { + "name": "terminal_defaults", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "terminal_macros": { + "name": "terminal_macros", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "user_preferences_user_id_users_id_fk": { + "name": "user_preferences_user_id_users_id_fk", + "tableFrom": "user_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_id": { + "name": "role_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "granted_by": { + "name": "granted_by", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "granted_at": { + "name": "granted_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_user_roles_user_role": { + "name": "idx_user_roles_user_role", + "columns": [ + "user_id", + "role_id" + ], + "isUnique": true + }, + "idx_user_roles_role_id": { + "name": "idx_user_roles_role_id", + "columns": [ + "role_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_granted_by_users_id_fk": { + "name": "user_roles_granted_by_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "granted_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_second_factors": { + "name": "user_second_factors", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "plugin_id": { + "name": "plugin_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "factor_id": { + "name": "factor_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "enrolled_at": { + "name": "enrolled_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "idx_user_second_factors_user_factor": { + "name": "idx_user_second_factors_user_factor", + "columns": [ + "user_id", + "plugin_id", + "factor_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "user_second_factors_user_id_users_id_fk": { + "name": "user_second_factors_user_id_users_id_fk", + "tableFrom": "user_second_factors", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "password_hash": { + "name": "password_hash", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_admin": { + "name": "is_admin", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_oidc": { + "name": "is_oidc", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "oidc_identifier": { + "name": "oidc_identifier", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sso_provider_id": { + "name": "sso_provider_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "client_id": { + "name": "client_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "client_secret": { + "name": "client_secret", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "issuer_url": { + "name": "issuer_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "authorization_url": { + "name": "authorization_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "token_url": { + "name": "token_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "identifier_path": { + "name": "identifier_path", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name_path": { + "name": "name_path", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scopes": { + "name": "scopes", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'openid email profile'" + }, + "totp_secret": { + "name": "totp_secret", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "totp_enabled": { + "name": "totp_enabled", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "totp_backup_codes": { + "name": "totp_backup_codes", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "registered_at": { + "name": "registered_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "donation_modal_dismissed": { + "name": "donation_modal_dismissed", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "vault_profiles": { + "name": "vault_profiles", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "folder": { + "name": "folder", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "vault_addr": { + "name": "vault_addr", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "vault_namespace": { + "name": "vault_namespace", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "oidc_mount": { + "name": "oidc_mount", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "oidc_role": { + "name": "oidc_role", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ssh_mount": { + "name": "ssh_mount", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ssh_role": { + "name": "ssh_role", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "valid_principals": { + "name": "valid_principals", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key_type": { + "name": "key_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "shared": { + "name": "shared", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "sync_id": { + "name": "sync_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "vault_profiles_sync_id_unique": { + "name": "vault_profiles_sync_id_unique", + "columns": [ + "sync_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "vault_profiles_user_id_users_id_fk": { + "name": "vault_profiles_user_id_users_id_fk", + "tableFrom": "vault_profiles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "vault_tokens": { + "name": "vault_tokens", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "profile_id": { + "name": "profile_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ssh_cert": { + "name": "ssh_cert", + "type": "text(8192)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "private_key": { + "name": "private_key", + "type": "text(8192)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_used": { + "name": "last_used", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "idx_vault_tokens_user_profile": { + "name": "idx_vault_tokens_user_profile", + "columns": [ + "user_id", + "profile_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "vault_tokens_user_id_users_id_fk": { + "name": "vault_tokens_user_id_users_id_fk", + "tableFrom": "vault_tokens", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "vault_tokens_profile_id_vault_profiles_id_fk": { + "name": "vault_tokens_profile_id_vault_profiles_id_fk", + "tableFrom": "vault_tokens", + "tableTo": "vault_profiles", + "columnsFrom": [ + "profile_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "webauthn_credentials": { + "name": "webauthn_credentials", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "credential_id": { + "name": "credential_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "counter": { + "name": "counter", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "device_type": { + "name": "device_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "backed_up": { + "name": "backed_up", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "transports": { + "name": "transports", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_verification": { + "name": "user_verification", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'preferred'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "last_used_at": { + "name": "last_used_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "webauthn_credentials_user_id_users_id_fk": { + "name": "webauthn_credentials_user_id_users_id_fk", + "tableFrom": "webauthn_credentials", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/sqlite/meta/_journal.json b/drizzle/sqlite/meta/_journal.json index 94547cef1..9ee857272 100644 --- a/drizzle/sqlite/meta/_journal.json +++ b/drizzle/sqlite/meta/_journal.json @@ -316,6 +316,13 @@ "when": 1790274703680, "tag": "0044_gorgeous_yellow_claw", "breakpoints": true + }, + { + "idx": 45, + "version": "6", + "when": 1790278286648, + "tag": "0045_public_menace", + "breakpoints": true } ] } \ No newline at end of file diff --git a/electron/main.cjs b/electron/main.cjs index 02f13c122..1f3c7e32a 100644 --- a/electron/main.cjs +++ b/electron/main.cjs @@ -1050,8 +1050,8 @@ function getBackendPidFilePath() { // Manager) rather than through the normal quit flow, will-quit never fires // and stopBackendServer() never runs -- the forked backend child is a // genuinely separate OS process on Windows/mac/Linux, so it keeps running -// and holding every port the backend binds (30001, 30004, 30006, -// 30010-30012). Every subsequent launch's own backend then fails outright +// and holding every port the backend binds (30001, 30004). Every subsequent +// launch's own backend then fails outright // with EADDRINUSE and the app is stuck until something manually kills the // orphan. Reap any such leftover process, identified by PID file, before // spawning a new one. diff --git a/packages/plugin-sdk/ARCHITECTURE.md b/packages/plugin-sdk/ARCHITECTURE.md index 90d9d2afa..ba551e667 100644 --- a/packages/plugin-sdk/ARCHITECTURE.md +++ b/packages/plugin-sdk/ARCHITECTURE.md @@ -478,11 +478,17 @@ Slots core owns: `terminal.toolbar`, `terminal.toolbarStatus`, renamed `terminal.dock` to `terminal.sidePanel` and added the status slot, where host-metrics puts its CPU, memory and disk bars), `onboarding.steps`, `onboarding.features`, `onboarding.workflow`, `hosts.importMenu`, `hosts.panel`, `proxmox.hostEditor`, -`shell.overlay`, `dashboard.hostMetrics` and `homepage.hostMetrics`. **B16** -added the last two, component slots in the dashboard's host status card -(`{ hostId, online }`, one per host row) and the homepage's host status widget -(`{ hostId, shownMetrics, online }`): core draws the status and a plugin draws -the numbers, so core no longer calls the metrics API. **B12** added `shell.overlay`, a component slot the +`shell.overlay`, `dashboard.hostMetrics`, `homepage.hostMetrics` and +`dashboard.secondaryView`. **B16** added the middle two, component slots in +the dashboard's host status card (`{ hostId, online }`, one per host row) and +the homepage's host status widget (`{ hostId, shownMetrics, online }`): core +draws the status and a plugin draws the numbers, so core no longer calls the +metrics API. **B19** added `dashboard.secondaryView` (component slot, one +contribution rendered at a time, `titleKey` names its tab): the dashboard's +"Dashboard / " toggle renders whatever is contributed instead of +knowing about the homepage plugin by name, so the toggle disappears with no +contributor and would show a second plugin's view the same way if one ever +claimed it too. **B12** added `shell.overlay`, a component slot the shell renders once at its root for always-mounted plugin UI: session-sharing keeps its share dialog and its room-invite watcher there. `session.remoteDisplay` moved to session-sharing, which declares it and draws @@ -591,8 +597,9 @@ connection helpers (`isElectron`, `resolveConnectionOrigin`, `pluginWsUrl`, stopgap in the right place: D1 turns them into typed bridge members. **B16** added `LineChart`, `useAdaptivePolling`, `useAreaPreferences` (the Appearance density and chart options), and the homepage widget pieces -`WidgetTitle` and `runVisibleInterval`, for host-metrics's cards and its -metrics chart widget. **B15** added `useUiPreferencesContext`, whose `setOverride` the +`WidgetTitle` and `runVisibleInterval` (moved to `src/ui/lib/` in **B19**, +once a plugin rather than a core feature became their biggest caller), for +host-metrics's cards and its metrics chart widget. **B15** added `useUiPreferencesContext`, whose `setOverride` the Docker manager uses to remember the card or table layout the user picked. The `docker` and `hostMetrics` areas are still declared in core's `types/ui-preferences.ts`; a plugin cannot contribute its own area yet. The frontend SDK gained `useHostStatus(hostId)`: core's @@ -605,6 +612,11 @@ host lookup. **B17** added `NotificationChannelDialog` and the channel API so a plugin that manages them shows core's dialog. `useConnectionDefaults` now carries terminal defaults only; the RDP half became remote desktop's user settings. Publishing its `.d.ts` for plugins outside this repo is a follow-up for the repo split. +**B19** added `PluginViewPlaceholder`, for the homepage plugin's widget +shell to render in place of a widget type whose owning plugin (docker, +tunnels, host-metrics, file-manager) is off, and moved `WidgetTitle` and +`runVisibleInterval` here from the deleted homepage feature directory +(above), unchanged for their existing callers. #### Strings @@ -779,7 +791,7 @@ as `allowPrivateHosts`, and runs approved commands through else from optional services: `snippets.access`, `fleets.access`, `automations.access`, `workspaces.saved`, `network-topology.graph`, `terminal.history` and `homepage.items` v1 (`list()`, which the homepage -plugin provides from B19). A tool names the service it needs, and a tool +plugin provides, B19). A tool names the service it needs, and a tool whose service has no running provider is not offered to the model at all. B18 made the write methods of `snippets.access` and `fleets.access` check the same permission their routes do (`snippets.create`/`edit`/`delete`, @@ -791,6 +803,48 @@ and `allowReadOnlyCommands` plus a custom `providers` field, and the host and keys. The shell knows nothing about it: availability is the plugin being enabled, `ai.use`, and those settings. +**Homepage (B19)** is the widget canvas and the dashboard's service links. +It imports nothing from core. It adopts `homepage_items`, `homepage_layouts` +and `dashboard_service_links`, keeping the legacy sync wire names +(`homepageItems`, `dashboardServiceLinks`). Its outbound routes (favicon, RSS, +ping, proxy widgets) all go through `ctx.fetch`, so they keep the SSRF +guard every other outbound call gets. It provides `homepage.items` v1 +(`list()`), which the AI assistant reads as an optional service. Core's own +uptime, recent-activity and database-health routes are unrelated to the +canvas and stayed on the main server (`database/routes/dashboard-routes.ts`, +mounted at `/dashboard`); only the widget canvas and the service-links table +left with this plugin. The two ports it used to run on (30006 dashboard, +30012 homepage) are gone. + +Both dashboard cards (`service_links`, `homepage_preview`) and the +`?view=homepage` full-screen link are the plugin's own, registered through +`registerDashboardCard`/`registerTab`. `registerDashboardCard` gained +`defaultPanel` (`"main"` or `"side"`), so a preset that lays out cards for a +new user reads a plugin's own card's height and panel from the registry +(`service_links` asks for the side column) instead of a core file having to +spell every plugin's card id and its layout by hand. The dashboard's "Dashboard / Homepage" +toggle is generic: it renders whatever a plugin contributes to a new +`dashboard.secondaryView` action slot (component kind, `titleKey` for the tab +label), so core carries no homepage-specific header or copy-link button of +its own. A widget any plugin registers with `app.registerHomepageWidget` +still goes into a registry core owns (`src/ui/plugin-host/homepage-widget-registry.ts`), +the same as `dashboard-cards-registry.ts`, so docker's, tunnels', file-manager's +and host-metrics's own homepage widgets keep working with homepage disabled; +only the canvas that renders them is gone. The frontend SDK gained +`useHostActions()` (every host action any plugin registered, for a widget +that offers a picker over what it can do with a host, such as Quick +Connect), `useActivityTypes()` and `activityTarget(type)` (the recent-activity +type list and its icon/tab/label, for a filter or an activity feed widget), +and `useHomepageWidgetTypes()`/`homepageWidgetType(id)` (the read side of +`registerHomepageWidget`, for the canvas and its add-widget menu). +`@termix/plugin-sdk/ui` gained `PluginViewPlaceholder`, and `WidgetTitle` and +`runVisibleInterval` moved from the homepage feature directory to +`src/ui/lib/` now that a plugin, not a core feature, is their biggest +caller. The shared `host`/`selectHost`/`noHostConfigured`/`loading` strings +several widget-owning plugins relied on through the `homepage` namespace's +core fallback moved to core's `common.*`, which is what that fallback is +actually for. + #### Host status is core The status dot in the host list, the dashboard and the homepage widget is @@ -2187,7 +2241,7 @@ Then, with the app running: The bundled plugins predate the SDK, apart from workspaces (A9), snippets (B2), remote-desktop (B14), docker (B15), host-metrics (B16), automations -(B17) and ai (B18), which import +(B17), ai (B18) and homepage (B19), which import nothing from core. The others still reach core by relative path (`../../../../src/backend/...`), which an esbuild plugin, `packages/plugin-sdk/cli/lib/legacy-core-imports.mjs`, keeps out of the bundle @@ -2215,7 +2269,7 @@ What the lint fence enforces today, in `eslint.config.mjs`: | Core importing a plugin backend | **Error** | 0 | - | | A plugin backend importing frontend code or `@/` | **Error** | 0 | - | | The shell importing plugin code | **Error** | 0 | - | -| A plugin frontend importing core through `@/` | Warning | 55 files | D1 | +| A plugin frontend importing core through `@/` | Warning | 53 files | D1 | | A plugin importing core by relative path | Warning | 4 files | D1 | | A plugin importing another plugin's source | Warning | 0 files | - | diff --git a/packages/plugin-sdk/FINISH-LIST.md b/packages/plugin-sdk/FINISH-LIST.md index 3a70f476e..fe58c439f 100644 --- a/packages/plugin-sdk/FINISH-LIST.md +++ b/packages/plugin-sdk/FINISH-LIST.md @@ -404,10 +404,6 @@ build`'s esbuild step has no static-asset-copy pipeline the way core's Vite ever is not, the run now fails on its first SSH step instead of being skipped silently. Owner: none unless a background "is this user unlocked" check is added to the SDK. -- **B18 (ai), for B19:** the assistant's `list_homepage_items` tool calls - the optional `homepage.items` v1 service, `list(): Promise>`, as the acting user. Until B19 provides it the tool is - not offered to the model. Owner: B19. - **B18 (ai):** the "allow read-only diagnostic commands" user setting only adds a line to the system prompt. No tool runs a command directly; `tools/command-allowlist.ts` (`isReadOnlyCommand`) is tested but unused, so @@ -433,6 +429,28 @@ typeId, title }>>`, as the acting user. Until B19 provides it the tool is - **B18:** tunnels builds its own SSE URL off the axios base instead of the new `app.fetch`. Owner: D1. +- **Pre-existing, found in B19:** `createMockCtx`'s `wsRoutes` double (B15) + records `{ path, raw, handler, options }` per route, but + `plugins/serial/tests/backend/activate.test.ts`, + `plugins/ssh-terminal/tests/backend/activate.test.ts` and + `plugins/tunnels/tests/backend/activate.test.ts` still assert the old + two-field shape (`{ path, raw }`) and fail on `toEqual`. Not touched by + this step; update each assertion to match or to check only the fields it + cares about. Owner: D0. +- **Pre-existing, found in B19:** `src/backend/hosts/file-manager/` (21 + files) is dead code left over from before the file-manager plugin (B6): + nothing in `src/backend/starter.ts` or elsewhere imports + `hosts/file-manager/index.ts`, so its own port (30004, still listed in + `src/backend/utils/swagger.ts`'s server list) never actually starts and + its `axios.post("http://localhost:30006/activity/log", ...)` calls (now a + dead port after this step) never run. Delete the directory once confirmed + nothing else references it. Owner: D0. +- **Pre-existing, found in B19:** `src/ui/main-axios.ts`'s `tmuxMonitorApi` + still points at `getApiUrl("/tmux_monitor", 30010)`, a port tmux-monitor's + own B10 step moved off of (per `plugins/tmux-monitor/CHANGELOG.md`) without + updating this frontend constant to `/plugin-api/tmux-monitor`. Not + something this step touched or verified further. Owner: D0. + ## Manual checks after 2.9.0 - SSH terminal: password auth, key auth (and an encrypted key's passphrase @@ -489,3 +507,13 @@ typeId, title }>>`, as the acting user. Until B19 provides it the tool is skipped and the others keep running, then enable it again; the AI assistant lists and creates automations, and says they are unavailable with automations off. +- Homepage: on a 2.8 database every widget, its layout and every service + link are there; add, move, resize, edit and delete a widget of each type; + the favicon, RSS, ping and custom API widgets against a real remote URL, + and each refuses a private/loopback target; the dashboard's Service + Links and Homepage Preview cards; the Dashboard/Homepage toggle and its + copy-link and open-full-view buttons; `?view=homepage`; docker's, tunnels' + and file-manager's own homepage widgets still work with the homepage + plugin disabled; the AI assistant lists homepage items and says + unavailable with homepage off; disable homepage in admin (the tab, its + dashboard cards and the toggle disappear) then enable it again. diff --git a/packages/plugin-sdk/src/frontend.ts b/packages/plugin-sdk/src/frontend.ts index 83e9e8254..ce79fd5d9 100644 --- a/packages/plugin-sdk/src/frontend.ts +++ b/packages/plugin-sdk/src/frontend.ts @@ -372,11 +372,15 @@ export interface DashboardCardContribution { id: string; titleKey: string; defaultHeight?: number; + /** Which column a preset places this card in by default. Defaults to "main". */ + defaultPanel?: "main" | "side"; component: ComponentType; } export interface HomepageWidgetContribution> { id: string; + /** Set by core to the registering plugin's id; a plugin never sets this itself. */ + pluginId?: string; name: string; description: string; category: "links" | "info" | "system" | "monitoring"; @@ -701,6 +705,19 @@ export interface PluginHostBridge { ) => ComponentType> | undefined; hostProtocols: (host: PluginHostRecord) => string[]; useHostStatus: (hostId: number | undefined) => HostStatusInfo | null; + useHostActions: () => HostActionContribution[]; + useActivityTypes: () => string[]; + activityTarget: (type: string) => ActivityTargetInfo | undefined; + useHomepageWidgetTypes: () => HomepageWidgetContribution[]; + homepageWidgetType: (id: string) => HomepageWidgetContribution | undefined; +} + +/** What a recent-activity entry opens and how it is labelled. */ +export interface ActivityTargetInfo { + icon?: IconComponent; + /** Tab type the entry reopens. */ + tab: string; + titleKey?: string; } /** @@ -847,6 +864,50 @@ export function useSlotContributions( return requireHost().useSlotContributions(slotId, context); } +/** + * Every host action any running plugin (and core) registered with + * registerHostAction, for a plugin that offers a picker over "what can I do + * with this host" without knowing which plugin provides each one - a quick + * connect widget, say. Reactive: it re-renders as plugins enable and disable. + */ +export function useHostActions(): HostActionContribution[] { + return requireHost().useHostActions(); +} + +/** + * Recent-activity types every registered tab claims (registerTab's + * activityTypes), core's and plugins'. For a filter that lists what a user + * can pick, without knowing which plugin owns each activity type. + */ +export function useActivityTypes(): string[] { + return requireHost().useActivityTypes(); +} + +/** + * What a recent-activity entry of this type opens and how it is labelled - + * the tab type claiming it through registerTab's activityTypes, core's or a + * plugin's. undefined for a type nothing claims (its plugin is gone). + */ +export function activityTarget(type: string): ActivityTargetInfo | undefined { + return requireHost().activityTarget(type); +} + +/** + * Every homepage widget type any running plugin registered with + * registerHomepageWidget, for the homepage plugin's own canvas and add-widget + * menu. Reactive: it re-renders as plugins enable and disable. + */ +export function useHomepageWidgetTypes(): HomepageWidgetContribution[] { + return requireHost().useHomepageWidgetTypes(); +} + +/** A single registered homepage widget type, by id, or undefined if none. */ +export function homepageWidgetType( + id: string, +): HomepageWidgetContribution | undefined { + return requireHost().homepageWidgetType(id); +} + /** * The component another plugin registered under `id` with * app.registerComponent, or undefined while that plugin is off. diff --git a/plugins/docker/src/frontend/DockerWidget.tsx b/plugins/docker/src/frontend/DockerWidget.tsx index 1d08f2d01..46e584122 100644 --- a/plugins/docker/src/frontend/DockerWidget.tsx +++ b/plugins/docker/src/frontend/DockerWidget.tsx @@ -22,7 +22,7 @@ function DockerWidget({ return (
- {t("homepage.widgetNoHostSelected")} + {t("common.noHostConfigured")}
); } diff --git a/plugins/docker/src/frontend/DockerWidgetEditForm.tsx b/plugins/docker/src/frontend/DockerWidgetEditForm.tsx index 6e1166aa8..13000a3df 100644 --- a/plugins/docker/src/frontend/DockerWidgetEditForm.tsx +++ b/plugins/docker/src/frontend/DockerWidgetEditForm.tsx @@ -16,7 +16,7 @@ export function DockerWidgetEditForm({ return (
- + {options.map((host) => (
{t("homepage.hostGridAllHint")} diff --git a/src/ui/features/homepage/dialogs/HostStatusEditForm.tsx b/plugins/homepage/src/frontend/dialogs/HostStatusEditForm.tsx similarity index 75% rename from src/ui/features/homepage/dialogs/HostStatusEditForm.tsx rename to plugins/homepage/src/frontend/dialogs/HostStatusEditForm.tsx index c86f243c7..5d6acae4a 100644 --- a/src/ui/features/homepage/dialogs/HostStatusEditForm.tsx +++ b/plugins/homepage/src/frontend/dialogs/HostStatusEditForm.tsx @@ -1,18 +1,10 @@ -import { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { getSSHHosts } from "@/api/ssh-host-management-api"; +import { useHosts, useTranslation } from "@termix/plugin-sdk/frontend"; import type { HostMetricKey, HostStatusConfig, WidgetEditFormProps, -} from "@/types/homepage-types"; -import { Select2 } from "@/components/select2"; - -interface SimpleHost { - id: string; - name: string; - metricsEnabled: boolean; -} +} from "../types.js"; +import { Select2 } from "@termix/plugin-sdk/ui"; const METRIC_OPTIONS: { key: HostMetricKey; labelKey: string }[] = [ { key: "cpu", labelKey: "homepage.metricCpu" }, @@ -29,7 +21,8 @@ export function HostStatusEditForm({ onChange, }: WidgetEditFormProps) { const { t } = useTranslation(); - const [hosts, setHosts] = useState([]); + const { hosts: allHosts } = useHosts(); + const hosts = allHosts.filter((h) => h.statusCheckEnabled !== false); const shownMetrics: HostMetricKey[] = config.shownMetrics?.length ? config.shownMetrics @@ -37,22 +30,6 @@ export function HostStatusEditForm({ ? ["cpu", "memory", ...(config.showDisk ? ["disk" as HostMetricKey] : [])] : []; - useEffect(() => { - getSSHHosts() - .then((all) => - setHosts( - all - .filter((x) => x.statusCheckEnabled !== false) - .map((x) => ({ - id: String(x.id), - name: x.name, - metricsEnabled: true, - })), - ), - ) - .catch(() => {}); - }, []); - function toggleMetric(key: HostMetricKey) { const next = shownMetrics.includes(key) ? shownMetrics.filter((k) => k !== key) @@ -64,7 +41,7 @@ export function HostStatusEditForm({
- + {hosts.map((h) => (

{t("homepage.hostGridAllHint")} diff --git a/src/ui/features/homepage/dialogs/RecentActivityEditForm.tsx b/plugins/homepage/src/frontend/dialogs/RecentActivityEditForm.tsx similarity index 90% rename from src/ui/features/homepage/dialogs/RecentActivityEditForm.tsx rename to plugins/homepage/src/frontend/dialogs/RecentActivityEditForm.tsx index 2bf19ece9..2ddf55ad2 100644 --- a/src/ui/features/homepage/dialogs/RecentActivityEditForm.tsx +++ b/plugins/homepage/src/frontend/dialogs/RecentActivityEditForm.tsx @@ -1,17 +1,17 @@ -import { useTranslation } from "react-i18next"; -import { Input } from "@/components/input"; -import { activityFilterTypes } from "../quick-connect-targets"; +import { useActivityTypes, useTranslation } from "@termix/plugin-sdk/frontend"; +import { Input } from "@termix/plugin-sdk/ui"; import type { RecentActivityConfig, ActivityType, WidgetEditFormProps, -} from "@/types/homepage-types"; +} from "../types.js"; export function RecentActivityEditForm({ config, onChange, }: WidgetEditFormProps) { const { t } = useTranslation(); + const activityTypes = useActivityTypes(); const toggleType = (type: ActivityType) => { const next = config.filterTypes.includes(type) @@ -46,7 +46,7 @@ export function RecentActivityEditForm({ {t("homepage.filterActivityTypes")}

- {activityFilterTypes().map((type) => ( + {activityTypes.map((type) => (
diff --git a/src/ui/features/homepage/widgets/HostStatusWidget.tsx b/plugins/homepage/src/frontend/widgets/HostStatusWidget.tsx similarity index 51% rename from src/ui/features/homepage/widgets/HostStatusWidget.tsx rename to plugins/homepage/src/frontend/widgets/HostStatusWidget.tsx index 80b93f892..2438168f8 100644 --- a/src/ui/features/homepage/widgets/HostStatusWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/HostStatusWidget.tsx @@ -1,17 +1,18 @@ -import { useEffect, useState } from "react"; import { Server } from "lucide-react"; -import { useTranslation } from "react-i18next"; +import { + useTranslation, + useHost, + useHostStatus, +} from "@termix/plugin-sdk/frontend"; + +import { ComponentSlot, WidgetTitle } from "@termix/plugin-sdk/ui"; import { registerWidget } from "./WidgetRegistry"; import type { HostStatusConfig, HostMetricKey, WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { getServerStatusById } from "@/api/host-status-api"; -import { getSSHHosts } from "@/api/ssh-host-management-api"; -import { ComponentSlot } from "@/shell/ActionSlot"; -import { WidgetTitle } from "./WidgetTitle"; +} from "../types.js"; +import { GRID_SIZE } from "../types.js"; function getAccentColor(): string { return ( @@ -38,75 +39,11 @@ function HostStatusWidget({ const { t } = useTranslation(); const shownMetrics = migrateConfig(config); const { hostId } = config; - const [hostName, setHostName] = useState(null); - const [online, setOnline] = useState(null); - const [reachable, setReachable] = useState(false); + const host = useHost(hostId || undefined); + const statusInfo = useHostStatus(hostId || undefined); const needsMetrics = shownMetrics.length > 0; - useEffect(() => { - if (!hostId) return; - getSSHHosts() - .then((hosts) => { - const host = hosts.find((h) => h.id === hostId); - if (host) setHostName(host.name); - }) - .catch(() => {}); - }, [hostId]); - - useEffect(() => { - if (!hostId) return; - let cancelled = false; - - const poll = async () => { - try { - const s = await getServerStatusById(hostId); - if (!cancelled) { - setOnline(s.status === "online"); - setReachable(s.status === "reachable"); - } - } catch { - if (!cancelled) { - setOnline(false); - setReachable(false); - } - } - }; - - poll(); - - let intervalId: ReturnType | null = null; - const start = () => { - if (intervalId !== null) return; - intervalId = setInterval(() => { - if (document.visibilityState === "hidden") return; - void poll(); - }, 30_000); - }; - const stop = () => { - if (intervalId === null) return; - clearInterval(intervalId); - intervalId = null; - }; - const onVisibility = () => { - if (document.visibilityState === "hidden") { - stop(); - return; - } - void poll(); - start(); - }; - - if (document.visibilityState !== "hidden") start(); - document.addEventListener("visibilitychange", onVisibility); - - return () => { - cancelled = true; - stop(); - document.removeEventListener("visibilitychange", onVisibility); - }; - }, [hostId]); - if (!hostId) { return (
@@ -115,22 +52,23 @@ function HostStatusWidget({ ); } - const onlineColor = - online === null - ? "#6b7280" - : online - ? getAccentColor() - : reachable - ? "#fbbf24" - : "#ef4444"; - const onlineLabel = - online === null - ? t("common.unknown") - : online - ? t("common.online") - : reachable - ? t("common.reachable", { defaultValue: "Reachable" }) - : t("common.offline"); + const online = statusInfo?.status === "online"; + const reachable = statusInfo?.status === "reachable"; + + const onlineColor = !statusInfo + ? "#6b7280" + : online + ? getAccentColor() + : reachable + ? "#fbbf24" + : "#ef4444"; + const onlineLabel = !statusInfo + ? t("common.unknown") + : online + ? t("common.online") + : reachable + ? t("common.reachable", { defaultValue: "Reachable" }) + : t("common.offline"); return (
@@ -141,7 +79,7 @@ function HostStatusWidget({
- {hostName ?? `Host #${hostId}`} + {host?.name ?? `Host #${hostId}`} )}
diff --git a/src/ui/features/homepage/widgets/IframeWidget.tsx b/plugins/homepage/src/frontend/widgets/IframeWidget.tsx similarity index 89% rename from src/ui/features/homepage/widgets/IframeWidget.tsx rename to plugins/homepage/src/frontend/widgets/IframeWidget.tsx index 45d037a8f..33309bc89 100644 --- a/src/ui/features/homepage/widgets/IframeWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/IframeWidget.tsx @@ -1,11 +1,8 @@ import { Globe } from "lucide-react"; import { registerWidget } from "./WidgetRegistry"; -import type { - IframeConfig, - WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { WidgetTitle } from "./WidgetTitle"; +import type { IframeConfig, WidgetComponentProps } from "../types.js"; +import { GRID_SIZE } from "../types.js"; +import { WidgetTitle } from "@termix/plugin-sdk/ui"; function IframeWidget({ widget, diff --git a/src/ui/features/homepage/widgets/ImageWidget.tsx b/plugins/homepage/src/frontend/widgets/ImageWidget.tsx similarity index 90% rename from src/ui/features/homepage/widgets/ImageWidget.tsx rename to plugins/homepage/src/frontend/widgets/ImageWidget.tsx index 16fd49ac7..8651e8980 100644 --- a/src/ui/features/homepage/widgets/ImageWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/ImageWidget.tsx @@ -1,13 +1,10 @@ import { useState, useRef } from "react"; import { ImageIcon } from "lucide-react"; -import { useTranslation } from "react-i18next"; +import { useTranslation } from "@termix/plugin-sdk/frontend"; import { registerWidget } from "./WidgetRegistry"; -import type { - ImageWidgetConfig, - WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { WidgetTitle } from "./WidgetTitle"; +import type { ImageWidgetConfig, WidgetComponentProps } from "../types.js"; +import { GRID_SIZE } from "../types.js"; +import { WidgetTitle } from "@termix/plugin-sdk/ui"; const FIT_MAP = { contain: "object-contain", diff --git a/src/ui/features/homepage/widgets/LinkTreeWidget.tsx b/plugins/homepage/src/frontend/widgets/LinkTreeWidget.tsx similarity index 96% rename from src/ui/features/homepage/widgets/LinkTreeWidget.tsx rename to plugins/homepage/src/frontend/widgets/LinkTreeWidget.tsx index 91cc3f571..050bafc13 100644 --- a/src/ui/features/homepage/widgets/LinkTreeWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/LinkTreeWidget.tsx @@ -5,9 +5,9 @@ import type { LinkTreeConfig, LinkTreeLink, WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { WidgetTitle } from "./WidgetTitle"; +} from "../types.js"; +import { GRID_SIZE } from "../types.js"; +import { WidgetTitle } from "@termix/plugin-sdk/ui"; function TreeLink({ link, diff --git a/src/ui/features/homepage/widgets/MarkdownNotesWidget.tsx b/plugins/homepage/src/frontend/widgets/MarkdownNotesWidget.tsx similarity index 94% rename from src/ui/features/homepage/widgets/MarkdownNotesWidget.tsx rename to plugins/homepage/src/frontend/widgets/MarkdownNotesWidget.tsx index 1b0319a8b..030684240 100644 --- a/src/ui/features/homepage/widgets/MarkdownNotesWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/MarkdownNotesWidget.tsx @@ -1,13 +1,10 @@ import { useState, useCallback } from "react"; import { FileText } from "lucide-react"; import { registerWidget } from "./WidgetRegistry"; -import type { - MarkdownNotesConfig, - WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { updateHomepageItem } from "@/api/homepage-api"; -import { WidgetTitle } from "./WidgetTitle"; +import type { MarkdownNotesConfig, WidgetComponentProps } from "../types.js"; +import { GRID_SIZE } from "../types.js"; +import { updateHomepageItem } from "../api.js"; +import { WidgetTitle } from "@termix/plugin-sdk/ui"; function renderMarkdown(src: string): string { return src diff --git a/src/ui/features/homepage/widgets/NotesWidget.tsx b/plugins/homepage/src/frontend/widgets/NotesWidget.tsx similarity index 93% rename from src/ui/features/homepage/widgets/NotesWidget.tsx rename to plugins/homepage/src/frontend/widgets/NotesWidget.tsx index 7d8e1be6f..11e2eeecc 100644 --- a/src/ui/features/homepage/widgets/NotesWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/NotesWidget.tsx @@ -4,8 +4,8 @@ import { GRID_SIZE, type NotesConfig, type WidgetComponentProps, -} from "@/types/homepage-types"; -import { WidgetTitle } from "./WidgetTitle"; +} from "../types.js"; +import { WidgetTitle } from "@termix/plugin-sdk/ui"; function NotesWidget({ widget, config }: WidgetComponentProps) { const { content, backgroundColor } = config; diff --git a/src/ui/features/homepage/widgets/PingStatusWidget.tsx b/plugins/homepage/src/frontend/widgets/PingStatusWidget.tsx similarity index 87% rename from src/ui/features/homepage/widgets/PingStatusWidget.tsx rename to plugins/homepage/src/frontend/widgets/PingStatusWidget.tsx index 26c36442d..7563b0740 100644 --- a/src/ui/features/homepage/widgets/PingStatusWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/PingStatusWidget.tsx @@ -1,15 +1,10 @@ import { useEffect, useState } from "react"; import { Wifi } from "lucide-react"; -import { useTranslation } from "react-i18next"; +import { usePluginApi, useTranslation } from "@termix/plugin-sdk/frontend"; import { registerWidget } from "./WidgetRegistry"; -import type { - PingStatusConfig, - WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { homepageApi } from "@/main-axios"; -import { WidgetTitle } from "./WidgetTitle"; -import { runVisibleInterval } from "../use-visible-interval"; +import type { PingStatusConfig, WidgetComponentProps } from "../types.js"; +import { GRID_SIZE } from "../types.js"; +import { WidgetTitle, runVisibleInterval } from "@termix/plugin-sdk/ui"; interface PingResult { ok: boolean; @@ -17,11 +12,6 @@ interface PingResult { latencyMs: number; } -async function pingUrl(url: string): Promise { - const res = await homepageApi.get("/ping", { params: { url } }); - return res.data as PingResult; -} - function StatusDot({ ok, pending }: { ok: boolean | null; pending: boolean }) { if (pending) return ( @@ -40,6 +30,7 @@ function PingStatusWidget({ config, }: WidgetComponentProps) { const { t } = useTranslation(); + const api = usePluginApi(); const { urls, refreshInterval, showLatency } = config; const [results, setResults] = useState>({}); const [pending, setPending] = useState>({}); @@ -55,7 +46,8 @@ function PingStatusWidget({ await Promise.all( urls.map(async (u) => { try { - const r = await pingUrl(u.url); + const res = await api.get("/ping", { params: { url: u.url } }); + const r = res.data as PingResult; setResults((prev) => ({ ...prev, [u.url]: r })); } catch { setResults((prev) => ({ diff --git a/src/ui/features/homepage/widgets/QuickConnectWidget.tsx b/plugins/homepage/src/frontend/widgets/QuickConnectWidget.tsx similarity index 68% rename from src/ui/features/homepage/widgets/QuickConnectWidget.tsx rename to plugins/homepage/src/frontend/widgets/QuickConnectWidget.tsx index 8ba95aa36..f2f8d80e0 100644 --- a/src/ui/features/homepage/widgets/QuickConnectWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/QuickConnectWidget.tsx @@ -1,43 +1,55 @@ -import { useState, useEffect } from "react"; import { Zap } from "lucide-react"; -import { useTranslation } from "react-i18next"; +import { + useTranslation, + useHostActions, + useHostStatus, + useHosts, + type PluginHostRecord, +} from "@termix/plugin-sdk/frontend"; + import { registerWidget } from "./WidgetRegistry"; import type { QuickConnectConfig, QuickConnectType, WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { getSSHHosts } from "@/api/ssh-host-management-api"; -import type { SSHHostWithStatus } from "@/main-axios"; -import type { TabType } from "@/types/ui-types"; -import { WidgetTitle } from "./WidgetTitle"; -import { useHostActions } from "@/sidebar/host-contributions"; -import { quickConnectTargets } from "../quick-connect-targets"; +} from "../types.js"; +import { GRID_SIZE } from "../types.js"; -function statusDotClass(host: SSHHostWithStatus): string { - if (host.status === "online") return "bg-green-500"; - if (host.status === "offline") return "bg-red-500"; - return "bg-muted-foreground/30"; -} +import { quickConnectTargets } from "../quick-connect-targets.js"; +import { WidgetTitle } from "@termix/plugin-sdk/ui"; -function openTab(host: SSHHostWithStatus, type: QuickConnectType) { +function openTab(host: PluginHostRecord, type: QuickConnectType) { window.dispatchEvent( new CustomEvent("termix:open-tab", { - detail: { hostId: String(host.id), type: type as TabType }, + detail: { hostId: String(host.id), type }, }), ); } +function StatusDot({ hostId }: { hostId: number }) { + const status = useHostStatus(hostId); + const cls = + status?.status === "online" + ? "bg-green-500" + : status?.status === "offline" + ? "bg-red-500" + : "bg-muted-foreground/30"; + return ; +} + function QuickConnectWidget({ widget, config, }: WidgetComponentProps) { const { t } = useTranslation(); - const [hosts, setHosts] = useState([]); - const [loading, setLoading] = useState(true); + const { hosts: allHosts, loaded } = useHosts(); const targets = quickConnectTargets(useHostActions()); + const hosts = + config.hostIds.length > 0 + ? allHosts.filter((h) => config.hostIds.includes(Number(h.id))) + : allHosts; + // An empty list means the first tools plugins offer, in their order. const types = config.connectionTypes.length > 0 @@ -46,23 +58,10 @@ function QuickConnectWidget({ .slice(0, 2) .map((target) => target.type) as QuickConnectType[]); - useEffect(() => { - getSSHHosts() - .then((all) => { - const filtered = - config.hostIds.length > 0 - ? all.filter((h) => config.hostIds.includes(h.id)) - : all; - setHosts(filtered); - }) - .catch(() => {}) - .finally(() => setLoading(false)); - }, [config.hostIds]); - - if (loading) { + if (!loaded) { return (
- {t("homepage.loading")} + {t("common.loading")}
); } @@ -88,15 +87,11 @@ function QuickConnectWidget({ if (availableTypes.length === 0) return null; return (
- {config.showStatus && ( - - )} + {config.showStatus && } {host.name || host.ip} diff --git a/src/ui/features/homepage/widgets/RecentActivityWidget.tsx b/plugins/homepage/src/frontend/widgets/RecentActivityWidget.tsx similarity index 90% rename from src/ui/features/homepage/widgets/RecentActivityWidget.tsx rename to plugins/homepage/src/frontend/widgets/RecentActivityWidget.tsx index daa41eb92..c5980205f 100644 --- a/src/ui/features/homepage/widgets/RecentActivityWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/RecentActivityWidget.tsx @@ -1,20 +1,20 @@ import { useEffect, useState } from "react"; import { Activity } from "lucide-react"; -import { useTranslation } from "react-i18next"; -import { activityTarget } from "@/lib/activity-types"; +import { useTranslation, activityTarget } from "@termix/plugin-sdk/frontend"; + +import { + WidgetTitle, + getRecentActivity, + runVisibleInterval, + type RecentActivityItem, +} from "@termix/plugin-sdk/ui"; import { registerWidget } from "./WidgetRegistry"; import type { RecentActivityConfig, ActivityType, WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { - getRecentActivity, - type RecentActivityItem, -} from "@/api/dashboard-api"; -import { WidgetTitle } from "./WidgetTitle"; -import { runVisibleInterval } from "../use-visible-interval"; +} from "../types.js"; +import { GRID_SIZE } from "../types.js"; function relativeTime(ts: string): string { const diff = Date.now() - new Date(ts).getTime(); @@ -65,7 +65,7 @@ function RecentActivityWidget({ if (loading) { return (
- {t("homepage.loading")} + {t("common.loading")}
); } diff --git a/src/ui/features/homepage/widgets/RssFeedWidget.tsx b/plugins/homepage/src/frontend/widgets/RssFeedWidget.tsx similarity index 86% rename from src/ui/features/homepage/widgets/RssFeedWidget.tsx rename to plugins/homepage/src/frontend/widgets/RssFeedWidget.tsx index 24530bc34..074f1345f 100644 --- a/src/ui/features/homepage/widgets/RssFeedWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/RssFeedWidget.tsx @@ -1,13 +1,10 @@ import { useEffect, useState } from "react"; import { Rss, ExternalLink } from "lucide-react"; +import { usePluginApi, useTranslation } from "@termix/plugin-sdk/frontend"; import { registerWidget } from "./WidgetRegistry"; -import { homepageApi } from "@/main-axios"; -import type { - RssFeedConfig, - WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { WidgetTitle } from "./WidgetTitle"; +import type { RssFeedConfig, WidgetComponentProps } from "../types.js"; +import { GRID_SIZE } from "../types.js"; +import { WidgetTitle } from "@termix/plugin-sdk/ui"; interface RssItem { title: string; @@ -37,6 +34,8 @@ function RssFeedWidget({ config, isReadOnly, }: WidgetComponentProps) { + const { t } = useTranslation(); + const api = usePluginApi(); const { feedUrl, maxItems, showDescription } = config; const [items, setItems] = useState([]); const [error, setError] = useState(false); @@ -49,9 +48,9 @@ function RssFeedWidget({ try { setLoading(true); setError(false); - const res = await homepageApi.get( - `/rss?url=${encodeURIComponent(feedUrl)}&max=${maxItems ?? 10}`, - ); + const res = await api.get("/rss", { + params: { url: feedUrl, max: maxItems ?? 10 }, + }); if (!cancelled) setItems(res.data); } catch { if (!cancelled) setError(true); @@ -69,7 +68,7 @@ function RssFeedWidget({ return (
- Configure a feed URL in widget settings + {t("homepage.rssNoFeedUrl")}
); } @@ -77,7 +76,7 @@ function RssFeedWidget({ if (loading && items.length === 0) { return (
- Loading... + {t("common.loading")}
); } @@ -85,7 +84,7 @@ function RssFeedWidget({ if (error) { return (
- Could not load feed + {t("homepage.rssLoadError")}
); } @@ -93,7 +92,7 @@ function RssFeedWidget({ return (
} /> @@ -101,7 +100,7 @@ function RssFeedWidget({
{items.length === 0 ? (
- No items + {t("homepage.rssNoItems")}
) : ( items.map((item, i) => ( diff --git a/src/ui/features/homepage/widgets/SearchBarWidget.tsx b/plugins/homepage/src/frontend/widgets/SearchBarWidget.tsx similarity index 94% rename from src/ui/features/homepage/widgets/SearchBarWidget.tsx rename to plugins/homepage/src/frontend/widgets/SearchBarWidget.tsx index 14aaa30c2..39427ef96 100644 --- a/src/ui/features/homepage/widgets/SearchBarWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/SearchBarWidget.tsx @@ -1,14 +1,14 @@ import { useRef, useState } from "react"; import { Search } from "lucide-react"; -import { useTranslation } from "react-i18next"; +import { useTranslation } from "@termix/plugin-sdk/frontend"; import { registerWidget } from "./WidgetRegistry"; import type { SearchBarConfig, SearchEngine, WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { WidgetTitle } from "./WidgetTitle"; +} from "../types.js"; +import { GRID_SIZE } from "../types.js"; +import { WidgetTitle } from "@termix/plugin-sdk/ui"; const ENGINE_URLS: Record = { google: "https://www.google.com/search?q={q}", diff --git a/src/ui/features/homepage/widgets/SearchLinksWidget.tsx b/plugins/homepage/src/frontend/widgets/SearchLinksWidget.tsx similarity index 95% rename from src/ui/features/homepage/widgets/SearchLinksWidget.tsx rename to plugins/homepage/src/frontend/widgets/SearchLinksWidget.tsx index 14b39159d..8fc026ea1 100644 --- a/src/ui/features/homepage/widgets/SearchLinksWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/SearchLinksWidget.tsx @@ -1,14 +1,14 @@ import { useState } from "react"; import { SearchCode } from "lucide-react"; -import { useTranslation } from "react-i18next"; +import { useTranslation } from "@termix/plugin-sdk/frontend"; import { registerWidget } from "./WidgetRegistry"; import type { SearchLinksConfig, SearchLinkShortcut, WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { WidgetTitle } from "./WidgetTitle"; +} from "../types.js"; +import { GRID_SIZE } from "../types.js"; +import { WidgetTitle } from "@termix/plugin-sdk/ui"; function SearchLinksWidget({ widget, diff --git a/src/ui/features/homepage/widgets/ServiceGridWidget.tsx b/plugins/homepage/src/frontend/widgets/ServiceGridWidget.tsx similarity index 96% rename from src/ui/features/homepage/widgets/ServiceGridWidget.tsx rename to plugins/homepage/src/frontend/widgets/ServiceGridWidget.tsx index a57f4a681..bf02cad90 100644 --- a/src/ui/features/homepage/widgets/ServiceGridWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/ServiceGridWidget.tsx @@ -5,9 +5,9 @@ import type { ServiceGridConfig, ServiceGridItem, WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { WidgetTitle } from "./WidgetTitle"; +} from "../types.js"; +import { GRID_SIZE } from "../types.js"; +import { WidgetTitle } from "@termix/plugin-sdk/ui"; function getAccentColor(): string { return ( diff --git a/src/ui/features/homepage/widgets/ServiceLinkWidget.tsx b/plugins/homepage/src/frontend/widgets/ServiceLinkWidget.tsx similarity index 96% rename from src/ui/features/homepage/widgets/ServiceLinkWidget.tsx rename to plugins/homepage/src/frontend/widgets/ServiceLinkWidget.tsx index 22d0ace9f..672e65909 100644 --- a/src/ui/features/homepage/widgets/ServiceLinkWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/ServiceLinkWidget.tsx @@ -1,11 +1,8 @@ import { useRef, useState, useEffect } from "react"; import { ExternalLink } from "lucide-react"; import { registerWidget } from "./WidgetRegistry"; -import type { - ServiceLinkConfig, - WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; +import type { ServiceLinkConfig, WidgetComponentProps } from "../types.js"; +import { GRID_SIZE } from "../types.js"; function getAccentColor(): string { return ( diff --git a/src/ui/features/homepage/widgets/SshTerminalWidget.tsx b/plugins/homepage/src/frontend/widgets/SshTerminalWidget.tsx similarity index 73% rename from src/ui/features/homepage/widgets/SshTerminalWidget.tsx rename to plugins/homepage/src/frontend/widgets/SshTerminalWidget.tsx index 4bfaabc6a..a749c9028 100644 --- a/src/ui/features/homepage/widgets/SshTerminalWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/SshTerminalWidget.tsx @@ -1,25 +1,22 @@ import { useState, useRef, useEffect } from "react"; -import { PluginComponent } from "@/plugin-host/component-registry"; import { Terminal as TerminalIcon, Play } from "lucide-react"; -import { useTranslation } from "react-i18next"; +import { + useTranslation, + useHost, + type TabHandle as TerminalHandle, +} from "@termix/plugin-sdk/frontend"; + +import { PluginComponent, WidgetTitle } from "@termix/plugin-sdk/ui"; import { registerWidget } from "./WidgetRegistry"; -import type { - SshTerminalConfig, - WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import type { TabHandle as TerminalHandle } from "@termix/plugin-sdk/frontend"; -import { getSSHHosts } from "@/api/ssh-host-management-api"; -import type { SSHHostWithStatus } from "@/main-axios"; -import { WidgetTitle } from "./WidgetTitle"; +import type { SshTerminalConfig, WidgetComponentProps } from "../types.js"; +import { GRID_SIZE } from "../types.js"; function SshTerminalWidget({ widget, config, }: WidgetComponentProps) { const { t } = useTranslation(); - const [host, setHost] = useState(null); - const [loading, setLoading] = useState(true); + const host = useHost(config.hostId || undefined); const [started, setStarted] = useState(false); const terminalRef = useRef(null); const terminalWrapRef = useRef(null); @@ -49,24 +46,10 @@ function SshTerminalWidget({ }); }, [started]); + // auto-connect after the host loads if configured useEffect(() => { - if (!config.hostId) { - setLoading(false); - return; - } - getSSHHosts() - .then((hosts) => { - const found = hosts.find((h) => h.id === config.hostId); - setHost(found ?? null); - }) - .catch(() => {}) - .finally(() => setLoading(false)); - }, [config.hostId]); - - // auto-connect after host loads if configured - useEffect(() => { - if (!loading && host && config.autoConnect) setStarted(true); - }, [loading, host, config.autoConnect]); + if (host && config.autoConnect) setStarted(true); + }, [host, config.autoConnect]); if (!config.hostId) { return ( @@ -77,14 +60,6 @@ function SshTerminalWidget({ ); } - if (loading) { - return ( -
- {t("homepage.loading")} -
- ); - } - if (!host) { return (
@@ -94,9 +69,9 @@ function SshTerminalWidget({ } const hostConfig = { - id: host.id as unknown as number, + id: Number(host.id), ip: host.ip, - port: host.sshPort ?? host.port ?? 22, + port: (host.sshPort as number | undefined) ?? host.port ?? 22, username: host.username, authType: host.authType, terminalConfig: host.terminalConfig, diff --git a/src/ui/features/homepage/widgets/SystemOverviewWidget.tsx b/plugins/homepage/src/frontend/widgets/SystemOverviewWidget.tsx similarity index 86% rename from src/ui/features/homepage/widgets/SystemOverviewWidget.tsx rename to plugins/homepage/src/frontend/widgets/SystemOverviewWidget.tsx index b3fe6169f..cdd97e6d1 100644 --- a/src/ui/features/homepage/widgets/SystemOverviewWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/SystemOverviewWidget.tsx @@ -1,16 +1,16 @@ import { useEffect, useState } from "react"; import { Server } from "lucide-react"; -import { useTranslation } from "react-i18next"; +import { useTranslation } from "@termix/plugin-sdk/frontend"; import { registerWidget } from "./WidgetRegistry"; -import type { - SystemOverviewConfig, - WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { getVersionInfo, getDatabaseHealth } from "@/api/system-status-api"; -import { getUptime } from "@/api/dashboard-api"; -import { WidgetTitle } from "./WidgetTitle"; -import { runVisibleInterval } from "../use-visible-interval"; +import type { SystemOverviewConfig, WidgetComponentProps } from "../types.js"; +import { GRID_SIZE } from "../types.js"; +import { + WidgetTitle, + getDatabaseHealth, + getUptime, + getVersionInfo, + runVisibleInterval, +} from "@termix/plugin-sdk/ui"; interface InfoRowProps { label: string; @@ -92,7 +92,7 @@ function SystemOverviewWidget({ {showVersion && ( )} @@ -106,7 +106,7 @@ function SystemOverviewWidget({ {showDbHealth && ( )}
diff --git a/src/ui/features/homepage/widgets/TermixUptimeWidget.tsx b/plugins/homepage/src/frontend/widgets/TermixUptimeWidget.tsx similarity index 91% rename from src/ui/features/homepage/widgets/TermixUptimeWidget.tsx rename to plugins/homepage/src/frontend/widgets/TermixUptimeWidget.tsx index 77e0e2cd9..0a88793db 100644 --- a/src/ui/features/homepage/widgets/TermixUptimeWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/TermixUptimeWidget.tsx @@ -1,15 +1,14 @@ import { useEffect, useState, useRef } from "react"; import { Clock4 } from "lucide-react"; -import { useTranslation } from "react-i18next"; +import { useTranslation } from "@termix/plugin-sdk/frontend"; import { registerWidget } from "./WidgetRegistry"; -import type { - TermixUptimeConfig, - WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { getUptime } from "@/api/dashboard-api"; -import { WidgetTitle } from "./WidgetTitle"; -import { runVisibleInterval } from "../use-visible-interval"; +import type { TermixUptimeConfig, WidgetComponentProps } from "../types.js"; +import { GRID_SIZE } from "../types.js"; +import { + WidgetTitle, + getUptime, + runVisibleInterval, +} from "@termix/plugin-sdk/ui"; function formatUptime(seconds: number): { days: number; @@ -63,7 +62,7 @@ function TermixUptimeWidget({ if (seconds === null) { return (
- {t("homepage.loading")} + {t("common.loading")}
); } diff --git a/src/ui/features/homepage/widgets/TextBannerWidget.tsx b/plugins/homepage/src/frontend/widgets/TextBannerWidget.tsx similarity index 91% rename from src/ui/features/homepage/widgets/TextBannerWidget.tsx rename to plugins/homepage/src/frontend/widgets/TextBannerWidget.tsx index 7aa4e6002..b1c450b3a 100644 --- a/src/ui/features/homepage/widgets/TextBannerWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/TextBannerWidget.tsx @@ -1,10 +1,7 @@ import { Type } from "lucide-react"; import { registerWidget } from "./WidgetRegistry"; -import type { - TextBannerConfig, - WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; +import type { TextBannerConfig, WidgetComponentProps } from "../types.js"; +import { GRID_SIZE } from "../types.js"; const FONT_SIZE_MAP = { sm: "text-xs", diff --git a/src/ui/features/homepage/widgets/WeatherWidget.tsx b/plugins/homepage/src/frontend/widgets/WeatherWidget.tsx similarity index 96% rename from src/ui/features/homepage/widgets/WeatherWidget.tsx rename to plugins/homepage/src/frontend/widgets/WeatherWidget.tsx index 7af81e1e3..1017cdd70 100644 --- a/src/ui/features/homepage/widgets/WeatherWidget.tsx +++ b/plugins/homepage/src/frontend/widgets/WeatherWidget.tsx @@ -8,13 +8,10 @@ import { Thermometer, } from "lucide-react"; import { registerWidget } from "./WidgetRegistry"; -import type { - WeatherConfig, - WidgetComponentProps, -} from "@/types/homepage-types"; -import { GRID_SIZE } from "@/types/homepage-types"; -import { WidgetTitle } from "./WidgetTitle"; -import { runVisibleInterval } from "../use-visible-interval"; +import type { WeatherConfig, WidgetComponentProps } from "../types.js"; +import { GRID_SIZE } from "../types.js"; + +import { WidgetTitle, runVisibleInterval } from "@termix/plugin-sdk/ui"; interface WttrCurrent { temp_C: string; diff --git a/plugins/homepage/src/frontend/widgets/WidgetRegistry.ts b/plugins/homepage/src/frontend/widgets/WidgetRegistry.ts new file mode 100644 index 000000000..f4affd582 --- /dev/null +++ b/plugins/homepage/src/frontend/widgets/WidgetRegistry.ts @@ -0,0 +1,40 @@ +import { + homepageWidgetType, + useHomepageWidgetTypes, + type HomepageWidgetContribution, +} from "@termix/plugin-sdk/frontend"; +import type { WidgetTypeDefinition, WidgetTypeId } from "../types.js"; + +/** + * Each widget module calls this at import time (before activate(app) runs), + * so the definitions are queued here and app.registerHomepageWidget is + * called for each one from activate. Core owns the actual registry, the same + * one other plugins (docker, tunnels, host-metrics, file-manager) register + * their own widgets into. + */ +const queued: WidgetTypeDefinition[] = []; + +export function registerWidget(def: WidgetTypeDefinition): void { + queued.push(def as unknown as WidgetTypeDefinition); +} + +/** Called once from activate(app); drains the queue. */ +export function drainQueuedWidgets(): WidgetTypeDefinition[] { + return queued.splice(0, queued.length); +} + +function toDefinition( + widget: HomepageWidgetContribution | undefined, +): WidgetTypeDefinition | undefined { + return widget as unknown as WidgetTypeDefinition | undefined; +} + +export function getWidgetType( + id: WidgetTypeId, +): WidgetTypeDefinition | undefined { + return toDefinition(homepageWidgetType(id)); +} + +export function useWidgetTypes(): WidgetTypeDefinition[] { + return useHomepageWidgetTypes() as unknown as WidgetTypeDefinition[]; +} diff --git a/src/ui/features/homepage/widgets/WidgetShell.tsx b/plugins/homepage/src/frontend/widgets/WidgetShell.tsx similarity index 97% rename from src/ui/features/homepage/widgets/WidgetShell.tsx rename to plugins/homepage/src/frontend/widgets/WidgetShell.tsx index a34cf4e1f..3e93e1806 100644 --- a/src/ui/features/homepage/widgets/WidgetShell.tsx +++ b/plugins/homepage/src/frontend/widgets/WidgetShell.tsx @@ -1,8 +1,8 @@ import { useState } from "react"; import { Pencil, Trash2, GripVertical } from "lucide-react"; -import type { CanvasWidget } from "@/types/homepage-types"; +import type { CanvasWidget } from "../types.js"; import { getWidgetType, useWidgetTypes } from "./WidgetRegistry"; -import { PluginViewPlaceholder } from "@/plugin-host/PluginViewPlaceholder"; +import { PluginViewPlaceholder } from "@termix/plugin-sdk/ui"; interface WidgetShellProps { widget: CanvasWidget; diff --git a/plugins/homepage/tests/backend/helpers.ts b/plugins/homepage/tests/backend/helpers.ts new file mode 100644 index 000000000..5aaf90e8d --- /dev/null +++ b/plugins/homepage/tests/backend/helpers.ts @@ -0,0 +1,100 @@ +import http from "node:http"; +import type { AddressInfo } from "node:net"; +import { fileURLToPath } from "node:url"; +import express, { type Router } from "express"; +import { + createMockCtx, + createTestDb, + type MockPluginContext, + type TestDb, +} from "@termix/plugin-sdk/testing"; +import type { PluginManifest } from "@termix/plugin-sdk/manifest"; +import manifestJson from "../../manifest.json"; + +export const pluginDir = fileURLToPath(new URL("../..", import.meta.url)); +export const manifest = manifestJson as unknown as PluginManifest; + +export interface TestServer { + db: TestDb; + mock: MockPluginContext; + request: ( + method: string, + path: string, + options?: { user?: string; body?: unknown }, + // Route bodies vary per test; asserting on them is the point. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ) => Promise<{ status: number; body: any }>; + close: () => Promise; +} + +/** + * The plugin activated against a real in-memory database, its router mounted + * on an express app the way core mounts it: JSON parsed, the acting user set + * from the request, everything else left to the plugin. + */ +export async function startServer( + options: { + permissions?: string[]; + users?: string[]; + fetch?: (url: string, init?: { method?: string }) => Promise; + } = {}, +): Promise { + const db = await createTestDb(pluginDir); + for (const user of options.users ?? ["user-1", "user-2"]) { + db.sqlite + .prepare("INSERT INTO users (id, username) VALUES (?, ?)") + .run(user, user); + } + + let router: Router | null = null; + const mock = createMockCtx({ + pluginId: manifest.id, + manifest, + capabilities: manifest.capabilities, + db: db.database, + router: () => (router = express.Router()), + permissions: options.permissions ?? ["homepage.use"], + fetch: options.fetch, + }); + + const { activate } = await import("../../src/backend/index.js"); + await activate(mock.ctx); + + const app = express(); + app.use(express.json()); + app.use((req, _res, next) => { + mock.setActor(req.header("x-test-user") ?? undefined); + next(); + }); + app.use((req, res, next) => router!(req, res, next)); + + const server = http.createServer(app); + await new Promise((resolve) => server.listen(0, resolve)); + const { port } = server.address() as AddressInfo; + + return { + db, + mock, + async request(method, path, { user = "user-1", body: given } = {}) { + const body = method === "GET" ? undefined : given; + const response = await fetch(`http://127.0.0.1:${port}${path}`, { + method, + headers: { + "x-test-user": user, + ...(body !== undefined ? { "content-type": "application/json" } : {}), + }, + body: body !== undefined ? JSON.stringify(body) : undefined, + }); + const contentType = response.headers.get("content-type") ?? ""; + if (!contentType.includes("json")) { + return { status: response.status, body: await response.text() }; + } + const text = await response.text(); + return { status: response.status, body: text ? JSON.parse(text) : null }; + }, + async close() { + await new Promise((resolve) => server.close(() => resolve())); + db.close(); + }, + }; +} diff --git a/plugins/homepage/tests/backend/migrations.test.ts b/plugins/homepage/tests/backend/migrations.test.ts new file mode 100644 index 000000000..8c16cae9d --- /dev/null +++ b/plugins/homepage/tests/backend/migrations.test.ts @@ -0,0 +1,176 @@ +import { afterEach, describe, expect, it } from "vitest"; +import { createTestDb, type TestDb } from "@termix/plugin-sdk/testing"; +import { pluginDir } from "./helpers"; + +// The three tables as core's SQLite bootstrap created them before 2.9.0, +// plus the homepage_items index performance-indexes.ts added. +const LEGACY_DDL = ` + CREATE TABLE homepage_items ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, + type_id TEXT NOT NULL, + title TEXT, + config TEXT NOT NULL DEFAULT '{}', + folder_id INTEGER, + sync_id TEXT UNIQUE, + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + CREATE INDEX idx_homepage_items_user_id ON homepage_items (user_id); + + CREATE TABLE homepage_layouts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE, + layout TEXT NOT NULL DEFAULT '{}', + updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + + CREATE TABLE dashboard_service_links ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, + label TEXT NOT NULL, + url TEXT NOT NULL, + "order" INTEGER NOT NULL DEFAULT 0, + sync_id TEXT UNIQUE, + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + ); +`; + +let db: TestDb | null = null; + +afterEach(() => { + db?.close(); + db = null; +}); + +const tableExists = (name: string) => + !!db!.sqlite + .prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?") + .get(name); + +const indexOn = (table: string) => + ( + db!.sqlite + .prepare( + "SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = ? AND name NOT LIKE 'sqlite_%'", + ) + .all(table) as { name: string }[] + ).map((row) => row.name); + +describe("adopting the homepage tables", () => { + it("keeps every existing row when the legacy tables are there", async () => { + db = await createTestDb(pluginDir, { + before: (sqlite) => { + sqlite.exec("INSERT INTO users (id) VALUES ('user-1'), ('user-2')"); + sqlite.exec(LEGACY_DDL); + sqlite + .prepare( + "INSERT INTO homepage_items (user_id, type_id, title, config, sync_id) VALUES (?, ?, ?, ?, ?)", + ) + .run("user-1", "clock", "My Clock", '{"format":"24h"}', "sync-item"); + sqlite + .prepare( + "INSERT INTO homepage_layouts (user_id, layout) VALUES (?, ?)", + ) + .run("user-1", '{"entries":[],"pan":{"x":0,"y":0},"zoom":1}'); + sqlite + .prepare( + "INSERT INTO dashboard_service_links (user_id, label, url, sync_id) VALUES (?, ?, ?, ?)", + ) + .run("user-1", "Grafana", "https://grafana.local", "sync-link"); + }, + }); + + expect(db.applied).toEqual(["0001_adopt_homepage_tables"]); + expect(tableExists("homepage_items")).toBe(false); + expect(tableExists("homepage_layouts")).toBe(false); + expect(tableExists("dashboard_service_links")).toBe(false); + expect(tableExists("p_homepage_homepage_items")).toBe(true); + expect(tableExists("p_homepage_homepage_layouts")).toBe(true); + expect(tableExists("p_homepage_dashboard_service_links")).toBe(true); + + const items = db.sqlite + .prepare( + "SELECT user_id, type_id, title, sync_id FROM p_homepage_homepage_items", + ) + .all(); + expect(items).toEqual([ + { + user_id: "user-1", + type_id: "clock", + title: "My Clock", + sync_id: "sync-item", + }, + ]); + + const layouts = db.sqlite + .prepare("SELECT user_id, layout FROM p_homepage_homepage_layouts") + .all(); + expect(layouts).toEqual([ + { + user_id: "user-1", + layout: '{"entries":[],"pan":{"x":0,"y":0},"zoom":1}', + }, + ]); + + const links = db.sqlite + .prepare( + "SELECT user_id, label, url, sync_id FROM p_homepage_dashboard_service_links", + ) + .all(); + expect(links).toEqual([ + { + user_id: "user-1", + label: "Grafana", + url: "https://grafana.local", + sync_id: "sync-link", + }, + ]); + + expect(indexOn("p_homepage_homepage_items")).toEqual([ + "idx_homepage_items_user_id", + ]); + expect(indexOn("p_homepage_dashboard_service_links")).toEqual([ + "idx_dashboard_service_links_user_id", + ]); + }); + + it("creates the tables fresh when there are no legacy ones", async () => { + db = await createTestDb(pluginDir); + + expect(tableExists("p_homepage_homepage_items")).toBe(true); + expect(tableExists("p_homepage_homepage_layouts")).toBe(true); + expect(tableExists("p_homepage_dashboard_service_links")).toBe(true); + expect( + db.sqlite.prepare("SELECT * FROM p_homepage_homepage_items").all(), + ).toEqual([]); + }); + + it("removes a user's rows when the user is deleted", async () => { + db = await createTestDb(pluginDir, { + before: (sqlite) => { + sqlite.exec("INSERT INTO users (id) VALUES ('user-1'), ('user-2')"); + }, + }); + db.sqlite + .prepare( + "INSERT INTO p_homepage_homepage_items (user_id, type_id) VALUES (?, ?)", + ) + .run("user-1", "clock"); + db.sqlite + .prepare( + "INSERT INTO p_homepage_homepage_items (user_id, type_id) VALUES (?, ?)", + ) + .run("user-2", "clock"); + + db.sqlite.exec("DELETE FROM users WHERE id = 'user-1'"); + + const remaining = ( + db.sqlite + .prepare("SELECT user_id FROM p_homepage_homepage_items") + .all() as { user_id: string }[] + ).map((row) => row.user_id); + expect(remaining).toEqual(["user-2"]); + }); +}); diff --git a/plugins/homepage/tests/backend/outbound-routes.test.ts b/plugins/homepage/tests/backend/outbound-routes.test.ts new file mode 100644 index 000000000..33b9ed938 --- /dev/null +++ b/plugins/homepage/tests/backend/outbound-routes.test.ts @@ -0,0 +1,96 @@ +import { afterEach, describe, expect, it } from "vitest"; +import { startServer, type TestServer } from "./helpers"; + +let server: TestServer; + +afterEach(async () => { + await server.close(); +}); + +function jsonResponse(body: unknown, init: ResponseInit = {}): Response { + return new Response(JSON.stringify(body), { + status: 200, + headers: { "content-type": "application/json" }, + ...init, + }); +} + +describe("outbound routes go through ctx.fetch", () => { + it("proxy: returns the parsed JSON body from ctx.fetch", async () => { + server = await startServer({ + fetch: async () => jsonResponse({ hello: "world" }), + }); + const res = await server.request( + "GET", + "/proxy?url=https://example.com/api", + ); + expect(res.status).toBe(200); + expect(res.body).toEqual({ hello: "world" }); + }); + + it("proxy: every request to a private address is refused by the SSRF guard, never reaching ctx.fetch's caller", async () => { + // The route never gets to call the stub for a rejected URL because + // safeOutboundFetch (behind ctx.fetch) throws before any response comes + // back; simulate that by having the stub itself reject, matching what + // the real safeOutboundFetch does for a blocked host. + server = await startServer({ + fetch: async () => { + throw new Error("Private destinations are not allowed"); + }, + }); + const res = await server.request( + "GET", + "/proxy?url=http://127.0.0.1:9999/secret", + ); + expect(res.status).toBe(500); + }); + + it("proxy: rejects a non-JSON response", async () => { + server = await startServer({ + fetch: async () => + new Response("", { + status: 200, + headers: { "content-type": "text/html" }, + }), + }); + const res = await server.request("GET", "/proxy?url=https://example.com"); + expect(res.status).toBe(400); + }); + + it("ping: reports ok for a 2xx response", async () => { + server = await startServer({ + fetch: async () => new Response(null, { status: 200 }), + }); + const res = await server.request("GET", "/ping?url=https://example.com"); + expect(res.status).toBe(200); + expect(res.body.ok).toBe(true); + }); + + it("rss: parses items from the feed ctx.fetch returned", async () => { + const xml = ` + Hellohttps://example.com/1 + `; + server = await startServer({ + fetch: async () => + new Response(xml, { + status: 200, + headers: { "content-type": "application/xml" }, + }), + }); + const res = await server.request( + "GET", + "/rss?url=https://example.com/feed", + ); + expect(res.status).toBe(200); + expect(res.body).toHaveLength(1); + expect(res.body[0].title).toBe("Hello"); + }); + + it("rejects a request with no url", async () => { + server = await startServer(); + expect((await server.request("GET", "/ping")).status).toBe(400); + expect((await server.request("GET", "/rss")).status).toBe(400); + expect((await server.request("GET", "/proxy")).status).toBe(400); + expect((await server.request("GET", "/favicon")).status).toBe(400); + }); +}); diff --git a/plugins/homepage/tests/backend/routes.test.ts b/plugins/homepage/tests/backend/routes.test.ts new file mode 100644 index 000000000..cf404cce0 --- /dev/null +++ b/plugins/homepage/tests/backend/routes.test.ts @@ -0,0 +1,124 @@ +import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import { startServer, type TestServer } from "./helpers"; + +let server: TestServer; + +afterEach(async () => { + await server.close(); +}); + +describe("homepage item routes", () => { + beforeEach(async () => { + server = await startServer(); + }); + + it("creates, lists, updates and deletes an item", async () => { + const created = await server.request("POST", "/items", { + body: { typeId: "clock", title: "My Clock", config: { format: "24h" } }, + }); + expect(created.status).toBe(201); + expect(created.body).toMatchObject({ typeId: "clock", title: "My Clock" }); + expect(created.body.syncId).toEqual(expect.any(String)); + + const list = await server.request("GET", "/items"); + expect(list.body).toHaveLength(1); + + const updated = await server.request("PUT", `/items/${created.body.id}`, { + body: { title: "Renamed" }, + }); + expect(updated.status).toBe(200); + expect(updated.body.title).toBe("Renamed"); + + const deleted = await server.request("DELETE", `/items/${created.body.id}`); + expect(deleted.status).toBe(200); + expect((await server.request("GET", "/items")).body).toHaveLength(0); + }); + + it("rejects a missing typeId", async () => { + const res = await server.request("POST", "/items", { body: {} }); + expect(res.status).toBe(400); + }); + + it("404s updating or deleting another user's item", async () => { + const created = await server.request("POST", "/items", { + body: { typeId: "clock" }, + }); + const res = await server.request("DELETE", `/items/${created.body.id}`, { + user: "user-2", + }); + expect(res.status).toBe(404); + }); +}); + +describe("homepage layout routes", () => { + beforeEach(async () => { + server = await startServer(); + }); + + it("returns null before any layout is saved, then round-trips one", async () => { + expect((await server.request("GET", "/layout")).body).toBeNull(); + + const saved = await server.request("PUT", "/layout", { + body: { entries: [], pan: { x: 0, y: 0 }, zoom: 1 }, + }); + expect(saved.status).toBe(200); + expect(saved.body.layout).toEqual({ + entries: [], + pan: { x: 0, y: 0 }, + zoom: 1, + }); + + const fetched = await server.request("GET", "/layout"); + expect(fetched.body.layout.zoom).toBe(1); + }); +}); + +describe("service link routes", () => { + beforeEach(async () => { + server = await startServer(); + }); + + it("creates, lists, updates and deletes a service link", async () => { + const created = await server.request("POST", "/service-links", { + body: { label: "Grafana", url: "grafana.local" }, + }); + expect(created.status).toBe(201); + // A bare host gets normalized to http://. + expect(created.body.url).toBe("http://grafana.local"); + + const list = await server.request("GET", "/service-links"); + expect(list.body).toHaveLength(1); + + const updated = await server.request( + "PUT", + `/service-links/${created.body.id}`, + { body: { label: "Grafana Dashboard" } }, + ); + expect(updated.body.label).toBe("Grafana Dashboard"); + + const deleted = await server.request( + "DELETE", + `/service-links/${created.body.id}`, + ); + expect(deleted.status).toBe(200); + expect((await server.request("GET", "/service-links")).body).toHaveLength( + 0, + ); + }); + + it("rejects an invalid url", async () => { + const res = await server.request("POST", "/service-links", { + body: { label: "Bad", url: "javascript:alert(1)" }, + }); + expect(res.status).toBe(400); + }); +}); + +describe("permission denial", () => { + it("answers 403 for every route without homepage.use", async () => { + server = await startServer({ permissions: [] }); + expect((await server.request("GET", "/items")).status).toBe(403); + expect((await server.request("GET", "/layout")).status).toBe(403); + expect((await server.request("GET", "/service-links")).status).toBe(403); + }); +}); diff --git a/plugins/homepage/tests/backend/services.test.ts b/plugins/homepage/tests/backend/services.test.ts new file mode 100644 index 000000000..b6abd7259 --- /dev/null +++ b/plugins/homepage/tests/backend/services.test.ts @@ -0,0 +1,40 @@ +import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import { startServer, type TestServer } from "./helpers"; + +let server: TestServer; + +beforeEach(async () => { + server = await startServer(); +}); + +afterEach(async () => { + await server.close(); +}); + +describe("homepage.items service", () => { + it("lists the acting user's items", async () => { + await server.request("POST", "/items", { + body: { typeId: "clock", title: "My Clock" }, + }); + await server.request("POST", "/items", { + body: { typeId: "notes" }, + user: "user-2", + }); + + server.mock.setActor("user-1"); + const service = server.mock.services.get("homepage.items") as + | { list: () => Promise> } + | undefined; + const items = await service!.list(); + expect(items).toEqual([ + { id: expect.any(Number), typeId: "clock", title: "My Clock" }, + ]); + }); + + it("returns an empty list with no acting user", async () => { + server.mock.setActor(undefined); + const service = server.mock.services.get("homepage.items") as + { list: () => Promise } | undefined; + expect(await service!.list()).toEqual([]); + }); +}); diff --git a/src/backend/tests/database/routes/service-link-url.test.ts b/plugins/homepage/tests/backend/url.test.ts similarity index 93% rename from src/backend/tests/database/routes/service-link-url.test.ts rename to plugins/homepage/tests/backend/url.test.ts index 51919df95..7cac75152 100644 --- a/src/backend/tests/database/routes/service-link-url.test.ts +++ b/plugins/homepage/tests/backend/url.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import { isValidServiceLinkUrl, normalizeServiceLinkUrl, -} from "../../../database/routes/service-link-url.js"; +} from "../../src/backend/url.js"; describe("service link URL handling", () => { it("keeps explicit http and https URLs", () => { diff --git a/src/ui/tests/features/homepage/ClockTimezone.test.tsx b/plugins/homepage/tests/frontend/ClockTimezone.test.tsx similarity index 91% rename from src/ui/tests/features/homepage/ClockTimezone.test.tsx rename to plugins/homepage/tests/frontend/ClockTimezone.test.tsx index 58964d30b..cfec2f274 100644 --- a/src/ui/tests/features/homepage/ClockTimezone.test.tsx +++ b/plugins/homepage/tests/frontend/ClockTimezone.test.tsx @@ -1,17 +1,18 @@ import { describe, it, expect, vi, afterEach } from "vitest"; import { render, screen, cleanup, fireEvent } from "@testing-library/react"; -vi.mock("react-i18next", () => ({ - useTranslation: () => ({ t: (key: string) => key }), +vi.mock("@termix/plugin-sdk/frontend", async (importOriginal) => ({ + ...(await importOriginal>()), + useTranslation: () => ({ t: (key: string) => key, language: "en" }), })); -import { ClockWidget } from "../../../features/homepage/widgets/ClockWidget"; -import { ClockEditForm } from "../../../features/homepage/dialogs/ClockEditForm"; +import { ClockWidget } from "../../src/frontend/widgets/ClockWidget.js"; +import { ClockEditForm } from "../../src/frontend/dialogs/ClockEditForm.js"; import { normalizeTimezone, validateClockTimezone, -} from "../../../features/homepage/clock-timezone"; -import type { CanvasWidget, ClockConfig } from "@/types/homepage-types"; +} from "../../src/frontend/clock-timezone.js"; +import type { CanvasWidget, ClockConfig } from "../../src/frontend/types.js"; const widget: CanvasWidget = { id: 1, diff --git a/src/ui/tests/features/homepage/SystemOverviewWidget.test.tsx b/plugins/homepage/tests/frontend/SystemOverviewWidget.test.tsx similarity index 81% rename from src/ui/tests/features/homepage/SystemOverviewWidget.test.tsx rename to plugins/homepage/tests/frontend/SystemOverviewWidget.test.tsx index 7324e2b4d..ed944d1f2 100644 --- a/src/ui/tests/features/homepage/SystemOverviewWidget.test.tsx +++ b/plugins/homepage/tests/frontend/SystemOverviewWidget.test.tsx @@ -1,28 +1,27 @@ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import { render, screen, cleanup, waitFor } from "@testing-library/react"; -vi.mock("react-i18next", () => ({ - useTranslation: () => ({ t: (key: string) => key }), +vi.mock("@termix/plugin-sdk/frontend", async (importOriginal) => ({ + ...(await importOriginal>()), + useTranslation: () => ({ t: (key: string) => key, language: "en" }), })); const getVersionInfo = vi.fn(); const getDatabaseHealth = vi.fn(async () => ({ status: "ok" })); -vi.mock("@/api/system-status-api", () => ({ +const getUptime = vi.fn(async () => ({ formatted: "1d 2h" })); + +vi.mock("@termix/plugin-sdk/ui", async (importOriginal) => ({ + ...(await importOriginal>()), getVersionInfo: (...args: unknown[]) => getVersionInfo(...args), getDatabaseHealth: () => getDatabaseHealth(), -})); -vi.mock("@/api/dashboard-api", () => ({ - getUptime: vi.fn(async () => ({ formatted: "1d 2h" })), -})); - -// The real one installs an interval and a visibilitychange listener; the -// component's first fetch happens outside it, which is all these tests need. -vi.mock("../../../features/homepage/use-visible-interval", () => ({ + getUptime: () => getUptime(), + // The real one installs an interval and a visibilitychange listener; the + // component's first fetch happens outside it, which is all these tests need. runVisibleInterval: () => () => {}, })); -import { SystemOverviewWidget } from "../../../features/homepage/widgets/SystemOverviewWidget"; -import type { CanvasWidget } from "@/types/homepage-types"; +import { SystemOverviewWidget } from "../../src/frontend/widgets/SystemOverviewWidget.js"; +import type { CanvasWidget } from "../../src/frontend/types.js"; const widget: CanvasWidget = { id: 1, diff --git a/src/ui/tests/features/homepage/WidgetEditDialogClock.test.tsx b/plugins/homepage/tests/frontend/WidgetEditDialogClock.test.tsx similarity index 88% rename from src/ui/tests/features/homepage/WidgetEditDialogClock.test.tsx rename to plugins/homepage/tests/frontend/WidgetEditDialogClock.test.tsx index e6d3e6381..f10b2b42b 100644 --- a/src/ui/tests/features/homepage/WidgetEditDialogClock.test.tsx +++ b/plugins/homepage/tests/frontend/WidgetEditDialogClock.test.tsx @@ -1,12 +1,13 @@ import { describe, it, expect, vi, afterEach } from "vitest"; import { render, screen, cleanup, fireEvent } from "@testing-library/react"; -vi.mock("react-i18next", () => ({ - useTranslation: () => ({ t: (key: string) => key }), +vi.mock("@termix/plugin-sdk/frontend", async (importOriginal) => ({ + ...(await importOriginal>()), + useTranslation: () => ({ t: (key: string) => key, language: "en" }), })); -import { WidgetEditDialog } from "../../../features/homepage/dialogs/WidgetEditDialog"; -import type { CanvasWidget } from "@/types/homepage-types"; +import { WidgetEditDialog } from "../../src/frontend/dialogs/WidgetEditDialog.js"; +import type { CanvasWidget } from "../../src/frontend/types.js"; function clockWidget(timezone?: string): CanvasWidget { return { diff --git a/plugins/homepage/tests/frontend/activate.test.tsx b/plugins/homepage/tests/frontend/activate.test.tsx new file mode 100644 index 000000000..5bd61cf05 --- /dev/null +++ b/plugins/homepage/tests/frontend/activate.test.tsx @@ -0,0 +1,66 @@ +import { afterEach, describe, expect, it } from "vitest"; +import { + renderWithApp, + type RenderedPluginApp, +} from "@termix/plugin-sdk/testing"; +import type { PluginManifest } from "@termix/plugin-sdk/manifest"; +import * as plugin from "../../src/frontend/index"; +import manifestJson from "../../manifest.json"; +import locales from "../../locales/en.json"; + +const manifest = manifestJson as unknown as PluginManifest; + +const declared = (views?: Array<{ id: string }>) => + (views ?? []).map((view) => view.id).sort(); + +let rendered: RenderedPluginApp | null = null; + +afterEach(async () => { + await rendered?.deactivate(); + rendered = null; +}); + +describe(`${manifest.id} activate`, () => { + it("activates and registers only views its manifest declares", async () => { + rendered = await renderWithApp(plugin, { manifest, locales }); + const contributes = manifest.contributes as unknown as Record< + string, + Array<{ id: string }> | undefined + >; + const tabs = declared(contributes.tabs); + const cards = declared(contributes.dashboardCards); + for (const id of rendered.registered.tabs()) expect(tabs).toContain(id); + for (const id of rendered.registered.dashboardCards()) { + expect(cards).toContain(id); + } + }); + + it("registers the homepage tab as a singleton", async () => { + rendered = await renderWithApp(plugin, { manifest, locales }); + expect(rendered.registered.tabs()).toContain("homepage"); + }); + + it("registers both dashboard cards", async () => { + rendered = await renderWithApp(plugin, { manifest, locales }); + expect(rendered.registered.dashboardCards().sort()).toEqual([ + "homepage_preview", + "service_links", + ]); + }); + + it("contributes to the dashboard.secondaryView slot", async () => { + rendered = await renderWithApp(plugin, { manifest, locales }); + expect(rendered.registered.slot("dashboard.secondaryView")).toEqual([ + "homepage", + ]); + }); + + it("removes everything it registered on deactivate", async () => { + const app = await renderWithApp(plugin, { manifest, locales }); + await app.deactivate(); + expect(app.registered.tabs()).toEqual([]); + expect(app.registered.dashboardCards()).toEqual([]); + expect(app.registered.slot("dashboard.secondaryView")).toEqual([]); + expect(app.registered.actions()).toEqual([]); + }); +}); diff --git a/src/ui/tests/features/homepage/canvas/canvasGeometry.test.ts b/plugins/homepage/tests/frontend/canvas/canvasGeometry.test.ts similarity index 97% rename from src/ui/tests/features/homepage/canvas/canvasGeometry.test.ts rename to plugins/homepage/tests/frontend/canvas/canvasGeometry.test.ts index 90c8d01eb..2849232e4 100644 --- a/src/ui/tests/features/homepage/canvas/canvasGeometry.test.ts +++ b/plugins/homepage/tests/frontend/canvas/canvasGeometry.test.ts @@ -3,7 +3,7 @@ import { screenToCanvas, canvasToScreen, zoomAroundPoint, -} from "../../../../features/homepage/canvas/canvasGeometry"; +} from "../../../src/frontend/canvas/canvasGeometry.js"; const PAN = { x: 100, y: 200 }; const ZOOM = 2; diff --git a/src/ui/tests/features/homepage/canvas/snapToGrid.test.ts b/plugins/homepage/tests/frontend/canvas/snapToGrid.test.ts similarity index 91% rename from src/ui/tests/features/homepage/canvas/snapToGrid.test.ts rename to plugins/homepage/tests/frontend/canvas/snapToGrid.test.ts index f298d911f..7a1b43234 100644 --- a/src/ui/tests/features/homepage/canvas/snapToGrid.test.ts +++ b/plugins/homepage/tests/frontend/canvas/snapToGrid.test.ts @@ -2,8 +2,8 @@ import { describe, it, expect } from "vitest"; import { snapToGrid, snapToGridFloor, -} from "../../../../features/homepage/canvas/snapToGrid"; -import { GRID_SIZE } from "@/types/homepage-types"; +} from "../../../src/frontend/canvas/snapToGrid.js"; +import { GRID_SIZE } from "../../../src/frontend/types.js"; describe("snapToGrid", () => { it("snaps to nearest grid multiple", () => { diff --git a/plugins/homepage/tsconfig.json b/plugins/homepage/tsconfig.json new file mode 100644 index 000000000..7b35314c3 --- /dev/null +++ b/plugins/homepage/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "@termix/plugin-sdk/tsconfig.plugin.json", + "include": ["src/**/*.ts", "src/**/*.tsx", "tests/**/*.ts", "tests/**/*.tsx"] +} diff --git a/plugins/homepage/vitest.config.ts b/plugins/homepage/vitest.config.ts new file mode 100644 index 000000000..31ba004fc --- /dev/null +++ b/plugins/homepage/vitest.config.ts @@ -0,0 +1,3 @@ +import { pluginVitestConfig } from "@termix/plugin-sdk/vitest-preset"; + +export default pluginVitestConfig(import.meta.url); diff --git a/plugins/tunnels/src/frontend/views.tsx b/plugins/tunnels/src/frontend/views.tsx index 6171d9fcf..a571d99fa 100644 --- a/plugins/tunnels/src/frontend/views.tsx +++ b/plugins/tunnels/src/frontend/views.tsx @@ -81,15 +81,15 @@ export function TunnelWidget({
); - if (!config.hostId) return placeholder(t("homepage.widgetNoHostSelected")); - if (!loaded) return placeholder(t("homepage.loading")); + if (!config.hostId) return placeholder(t("common.noHostConfigured")); + if (!loaded) return placeholder(t("common.loading")); const host = hosts.find( (candidate) => String(candidate.id) === String(config.hostId) && hostTunnelSettings(candidate).enabled, ); - if (!host) return placeholder(t("homepage.widgetNoHostSelected")); + if (!host) return placeholder(t("common.noHostConfigured")); return (
@@ -130,7 +130,7 @@ export function TunnelWidgetEditForm({ return (
- + {options.map((host) => (
{editMode && !isFlex && (
void; cardLabels: Record; isAdmin: boolean; - serviceLinks: ServiceLink[]; - onAddServiceLink: (label: string, url: string) => Promise; - onDeleteServiceLink: (id: number) => Promise; statusLoading: boolean; isVisible?: boolean; }; @@ -1081,9 +915,6 @@ function PanelColumn({ onClearActivity, cardLabels, isAdmin, - serviceLinks, - onAddServiceLink, - onDeleteServiceLink, statusLoading, isVisible = true, }: PanelColumnProps) { @@ -1138,9 +969,6 @@ function PanelColumn({ activity={activity} onClearActivity={onClearActivity} isAdmin={isAdmin} - serviceLinks={serviceLinks} - onAddServiceLink={onAddServiceLink} - onDeleteServiceLink={onDeleteServiceLink} statusLoading={statusLoading} isVisible={isVisible} /> @@ -1237,26 +1065,23 @@ export function DashboardTab({ return () => window.removeEventListener("dashboardSlotsChanged", handler); }, []); - const [homepageLinkCopied, setHomepageLinkCopied] = useState(false); + // A plugin's own view next to the dashboard, e.g. the homepage plugin's + // canvas preview. Only one is offered today; "dashboard" always exists. + const secondaryViews = useActionSlot("dashboard.secondaryView"); + const secondaryView = secondaryViews[0]; - const handleCopyHomepageLink = () => { - navigator.clipboard - .writeText(`${window.location.origin}?view=homepage`) - .catch(() => {}); - setHomepageLinkCopied(true); - setTimeout(() => setHomepageLinkCopied(false), 1500); - }; - - const [dashboardView, setDashboardView] = useState<"dashboard" | "homepage">( - () => { - try { - return (localStorage.getItem("dashboardView") ?? "dashboard") as - "dashboard" | "homepage"; - } catch { - return "dashboard"; - } - }, - ); + const [dashboardView, setDashboardView] = useState(() => { + try { + return localStorage.getItem("dashboardView") ?? "dashboard"; + } catch { + return "dashboard"; + } + }); + // Falls back to the dashboard when the view a plugin contributed is off. + const isDashboardView = + dashboardView === "dashboard" || + !secondaryView || + dashboardView !== secondaryView.actionId; useEffect(() => { try { @@ -1398,24 +1223,6 @@ export function DashboardTab({ } }; - const [serviceLinks, setServiceLinks] = useState([]); - - useEffect(() => { - getServiceLinks() - .then(setServiceLinks) - .catch(() => {}); - }, []); - - const handleAddServiceLink = async (label: string, url: string) => { - const created = await createServiceLink(label, url); - setServiceLinks((prev) => [...prev, created]); - }; - - const handleDeleteServiceLink = async (id: number) => { - await deleteServiceLink(id); - setServiceLinks((prev) => prev.filter((l) => l.id !== id)); - }; - const todayLabel = new Date().toLocaleDateString(i18n.language, { weekday: "long", month: "long", @@ -1438,8 +1245,6 @@ export function DashboardTab({ quick_actions: t("dashboard.quickActions"), host_status: t("dashboardTab.hostStatus"), recent_activity: t("dashboard.recentActivity"), - service_links: t("dashboard.serviceLinks"), - homepage_preview: t("dashboard.homepagePreview"), ...Object.fromEntries( registeredCards.map((card) => [card.id, t(card.titleKey)]), ), @@ -1514,11 +1319,7 @@ export function DashboardTab({ : 0; const defaultHeight: number | null = getRegisteredDashboardCard(id)?.defaultHeight ?? - (id === "host_status" || id === "recent_activity" - ? null - : id === "service_links" - ? 200 - : 150); + (id === "host_status" || id === "recent_activity" ? null : 150); const key = `${id}_${Date.now()}`; return [ ...prev, @@ -1557,9 +1358,6 @@ export function DashboardTab({ onOpenTab, cardLabels, isAdmin, - serviceLinks, - onAddServiceLink: handleAddServiceLink, - onDeleteServiceLink: handleDeleteServiceLink, statusLoading, isVisible, }; @@ -1705,13 +1503,6 @@ export function DashboardTab({ onOpenSingletonTab={onOpenSingletonTab} /> )} - {slot.id === "service_links" && ( - - )}
))}
@@ -1726,18 +1517,20 @@ export function DashboardTab({
- + {secondaryView && ( + + )}
- {dashboardView === "dashboard" && ( + {isDashboardView && (

{todayLabel}

@@ -1824,7 +1617,7 @@ export function DashboardTab({ {t("dashboard.donate")} - {dashboardView === "dashboard" && ( + {isDashboardView && ( <> {editMode ? ( @@ -1860,43 +1653,9 @@ export function DashboardTab({
- {dashboardView === "homepage" ? ( + {!isDashboardView && secondaryView?.component ? (
-
- - {t("nav.homepage")} - -
- - -
-
-
- -
+
) : ( <> diff --git a/src/ui/dashboard/dashboard-cards-registry.ts b/src/ui/dashboard/dashboard-cards-registry.ts index d82c58764..3ba0880e4 100644 --- a/src/ui/dashboard/dashboard-cards-registry.ts +++ b/src/ui/dashboard/dashboard-cards-registry.ts @@ -19,6 +19,8 @@ export interface RegisteredDashboardCard { pluginId?: string; titleKey: string; defaultHeight?: number; + /** Which column a preset places this card in by default. Defaults to "main". */ + defaultPanel?: "main" | "side"; component: ComponentType; } diff --git a/src/ui/features/homepage/widgets/WidgetRegistry.ts b/src/ui/features/homepage/widgets/WidgetRegistry.ts deleted file mode 100644 index 9dfb565af..000000000 --- a/src/ui/features/homepage/widgets/WidgetRegistry.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { - WidgetTypeDefinition, - WidgetTypeId, -} from "@/types/homepage-types"; -import { createRegistry } from "@/lib/registry"; - -/** Core widgets register on import; plugin widgets while their plugin runs. */ -const registry = createRegistry(); - -export function registerWidget(def: WidgetTypeDefinition): () => void { - return registry.register(def as unknown as WidgetTypeDefinition); -} - -export function getWidgetType( - id: WidgetTypeId, -): WidgetTypeDefinition | undefined { - return registry.get(id); -} - -export function getAllWidgetTypes(): WidgetTypeDefinition[] { - return registry.list(); -} - -export const useWidgetTypes = registry.useList; diff --git a/src/ui/lib/apply-ui-preset.ts b/src/ui/lib/apply-ui-preset.ts index 9095ef4c1..a6841458b 100644 --- a/src/ui/lib/apply-ui-preset.ts +++ b/src/ui/lib/apply-ui-preset.ts @@ -9,6 +9,7 @@ import { import { PRESETS, type UiPreset } from "@/types/ui-preferences"; import { sanitizeHostSidebarPreferences } from "@/types/host-sidebar-preferences"; import { sanitizeCredentialSidebarPreferences } from "@/types/credential-sidebar-preferences"; +import { getRegisteredDashboardCard } from "@/dashboard/dashboard-cards-registry"; /** * Seeding a preset into the stores that already own their settings. @@ -25,31 +26,36 @@ import { sanitizeCredentialSidebarPreferences } from "@/types/credential-sidebar * overwrites layouts the user may have arranged by hand. */ -const DASHBOARD_SLOT_HEIGHTS: Record = { +// Core's own cards. A plugin's card carries its own height and panel on its +// registration (registerDashboardCard's defaultHeight/defaultPanel), read +// below, so this preset never has to spell the plugin's card id itself. +const CORE_DASHBOARD_SLOT_HEIGHTS: Record = { stats_bar: 96, counters_bar: 48, quick_actions: 160, host_status: null, recent_activity: null, - network_graph: 360, - service_links: 200, - homepage_preview: 320, }; -/** Cards that belong in the narrower side column rather than the main one. */ -const DASHBOARD_SIDE_CARDS = new Set(["recent_activity", "service_links"]); +/** Core cards that belong in the narrower side column rather than the main one. */ +const CORE_DASHBOARD_SIDE_CARDS = new Set(["recent_activity"]); -function buildDashboardSlots(cardIds: string[]) { +export function buildDashboardSlots(cardIds: string[]) { let mainOrder = 0; let sideOrder = 0; return cardIds.map((id) => { - const panel = DASHBOARD_SIDE_CARDS.has(id) ? "side" : "main"; + const registered = getRegisteredDashboardCard(id); + const panel = + registered?.defaultPanel ?? + (CORE_DASHBOARD_SIDE_CARDS.has(id) ? "side" : "main"); + const height = + registered?.defaultHeight ?? CORE_DASHBOARD_SLOT_HEIGHTS[id] ?? null; return { key: `${id}_0`, id, panel, order: panel === "side" ? sideOrder++ : mainOrder++, - height: DASHBOARD_SLOT_HEIGHTS[id] ?? null, + height, }; }); } diff --git a/src/ui/lib/theme.ts b/src/ui/lib/theme.ts index 44f1cfda5..c510664ea 100644 --- a/src/ui/lib/theme.ts +++ b/src/ui/lib/theme.ts @@ -36,18 +36,6 @@ export const DASHBOARD_CARDS: DashboardCardConfig[] = [ description: "Feed of recent connection events", defaultEnabled: true, }, - { - id: "service_links", - label: "Service Links", - description: "Clickable buttons linking to services on your servers", - defaultEnabled: false, - }, - { - id: "homepage_preview", - label: "Homepage", - description: "Scaled preview of your Homepage canvas", - defaultEnabled: false, - }, ]; export const ACCENT_PRESET_COLORS = [ diff --git a/src/ui/features/homepage/use-visible-interval.ts b/src/ui/lib/visible-interval.ts similarity index 100% rename from src/ui/features/homepage/use-visible-interval.ts rename to src/ui/lib/visible-interval.ts diff --git a/src/ui/features/homepage/widgets/WidgetTitle.tsx b/src/ui/lib/widget-title.tsx similarity index 100% rename from src/ui/features/homepage/widgets/WidgetTitle.tsx rename to src/ui/lib/widget-title.tsx diff --git a/src/ui/locales/en.json b/src/ui/locales/en.json index c38fed337..eccee4d42 100644 --- a/src/ui/locales/en.json +++ b/src/ui/locales/en.json @@ -194,255 +194,6 @@ "arrangeUnlockedSwitchedToManual": "Switched to manual sort so your order sticks", "arrangeUnlocked": "Unlock drag to rearrange" }, - "homepage": { - "title": "Homepage", - "addWidget": "Add Widget", - "editWidget": "Edit Widget", - "deleteWidget": "Delete", - "widgetTypes": "Widget Types", - "serviceLink": "Service Link", - "folder": "Folder", - "clock": "Clock", - "notes": "Notes", - "hostStatus": "Host Status", - "bookmarkList": "Bookmarks", - "zoomIn": "Zoom In", - "zoomOut": "Zoom Out", - "resetView": "Reset View", - "lockLayout": "Lock Layout", - "unlockLayout": "Unlock Layout", - "noWidgets": "Right-click or click + to add your first widget", - "openFullView": "Open Full View", - "previewTitle": "Homepage Preview", - "cancel": "Cancel", - "save": "Save", - "title_label": "Title", - "widgetTitlePlaceholder": "Widget title (optional)", - "url": "URL", - "imageUrl": "Custom Image URL", - "imageUrlHint": "Leave blank to use the site favicon automatically", - "showImage": "Show Image", - "description": "Description", - "color": "Color", - "icon": "Icon", - "expanded": "Expanded by default", - "timezone": "Timezone", - "invalidTimezone": "Invalid timezone. Use an IANA name such as America/New_York", - "showSeconds": "Show seconds", - "format12h": "12-hour", - "format24h": "24-hour", - "content": "Content", - "backgroundColor": "Background Color", - "host": "Host", - "showMetrics": "Show Metrics", - "links": "Links", - "addLink": "Add Link", - "linkLabel": "Label", - "linkUrl": "URL", - "removeLink": "Remove", - "categoryLinks": "Links", - "categoryInfo": "Info", - "categorySystem": "System", - "widgetServiceLinkDesc": "A clickable tile linking to a service URL", - "widgetFolderDesc": "A container to group related widgets", - "widgetClockDesc": "A live clock with configurable timezone", - "widgetNotesDesc": "A markdown notes widget", - "widgetHostStatusDesc": "Shows live CPU, memory and disk for an SSH host", - "widgetBookmarkListDesc": "A list of quick links", - "copyLink": "Copy Link", - "linkCopied": "Link copied!", - "location": "Location", - "temperatureUnit": "Temperature Unit", - "showForecast": "Show 3-day forecast", - "scrolling": "Allow Scrolling", - "feedUrl": "Feed URL", - "maxItems": "Max Items", - "showDescription": "Show Description", - "widgetWeatherName": "Weather", - "widgetWeatherDesc": "Live weather for any location", - "widgetIframeName": "iFrame Embed", - "widgetIframeDesc": "Embed any URL in an iframe", - "widgetRssName": "RSS Feed", - "widgetRssDesc": "Display items from an RSS or Atom feed", - "dragToFolder": "Drag widgets here or use + to add", - "showDisk": "Show Disk Usage", - "addToFolder": "Add widget to folder", - "noHostSelected": "No host selected", - "selectHost": "Select a host...", - "displayedMetrics": "Displayed Metrics", - "metricCpu": "CPU", - "metricMemory": "Memory", - "metricDisk": "Disk", - "metricUptime": "Uptime", - "metricSystem": "System", - "metricNetwork": "Network", - "metricProcesses": "Processes", - "categoryMonitoring": "Monitoring", - "loading": "Loading...", - "allClear": "All clear", - "noPingUrls": "No URLs configured", - "pingLabel": "Label", - "addPingUrl": "Add URL", - "showLatency": "Show Latency", - "refreshInterval": "Refresh Interval", - "seconds": "seconds", - "filterActivityTypes": "Filter Types", - "filterTypesHint": "Leave empty to show all", - "showTimestamp": "Show Timestamp", - "uptimeUnavailable": "Uptime unavailable", - "uptimeLabel": "Uptime", - "overviewVersion": "Version", - "overviewUpdate": "Up to date", - "overviewUpdateLabel": "Update", - "overviewUpdateAvailable": "Update available", - "overviewDatabase": "Database", - "overviewUptime": "Uptime", - "noHosts": "No hosts configured", - "hostGridHosts": "Hosts", - "hostGridAllHint": "Leave empty to show all hosts", - "columns": "Columns", - "showIp": "Show IP Address", - "connectionType": "Connection Type", - "layout": "Layout", - "showStatus": "Show Status", - "showHostName": "Show Host Name", - "noDockerActivity": "No Docker activity", - "noActivity": "No activity", - "showAcknowledged": "Show Acknowledged", - "widgetMetricsChartName": "Metrics Chart", - "widgetMetricsChartDesc": "Historical CPU, memory, disk or network chart for a host", - "widgetHostGridName": "Host Grid", - "widgetHostGridDesc": "Grid view of SSH host statuses", - "widgetPingStatusName": "Ping Status", - "widgetPingStatusDesc": "HTTP ping status for one or more URLs", - "widgetRecentActivityName": "Recent Activity", - "widgetRecentActivityDesc": "Scrollable feed of recent Termix activity", - "widgetTermixUptimeName": "Termix Uptime", - "widgetTermixUptimeDesc": "Live uptime counter for the Termix server", - "widgetSystemOverviewName": "System Overview", - "widgetSystemOverviewDesc": "Termix version, database health and uptime at a glance", - "widgetSshQuickConnectName": "SSH Quick Connect", - "widgetSshQuickConnectDesc": "One-click buttons to open SSH sessions", - "widgetDockerActivityName": "Docker Activity", - "widgetDockerActivityDesc": "Recent Docker container events across all hosts", - "widgetCalendarName": "Calendar", - "widgetCalendarDesc": "A monthly calendar with today highlighted", - "widgetCountdownName": "Countdown", - "widgetCountdownDesc": "Countdown timer to a target date", - "widgetSearchBarName": "Search Bar", - "widgetSearchBarDesc": "Quick web search widget", - "widgetTextBannerName": "Text Banner", - "widgetTextBannerDesc": "A bold label or section header for the canvas", - "widgetImageWidgetName": "Image", - "widgetImageWidgetDesc": "Display an image from a URL", - "widgetMarkdownNotesName": "Markdown Notes", - "widgetMarkdownNotesDesc": "Rich notes with inline markdown rendering", - "widgetCustomApiName": "Custom API", - "widgetCustomApiDesc": "Fetch and display data from any JSON API", - "widgetServiceGridName": "Service Grid", - "widgetServiceGridDesc": "A configurable grid of service tile links", - "widgetDashboardLinksName": "Dashboard Links", - "widgetDashboardLinksDesc": "Display your configured service links from the dashboard", - "widgetSearchLinksName": "Search Shortcuts", - "widgetSearchLinksDesc": "Quick search shortcut buttons with inline input", - "widgetLinkTreeName": "Link Tree", - "widgetLinkTreeDesc": "Grouped sections of links with headings", - "calMon": "Mo", - "calTue": "Tu", - "calWed": "We", - "calThu": "Th", - "calFri": "Fr", - "calSat": "Sa", - "calSun": "Su", - "startOnMonday": "Start week on Monday", - "countdownNoDate": "No target date set", - "countdownPast": "Event has passed", - "countdownDays": "days", - "countdownHours": "hrs", - "countdownMinutes": "min", - "countdownSeconds": "sec", - "countdownLabel": "Label", - "countdownLabelPlaceholder": "e.g. Launch Day", - "countdownShowDays": "Show Days", - "countdownShowHours": "Show Hours", - "targetDate": "Target Date", - "searchEngine": "Search Engine", - "customSearchUrl": "Custom Search URL", - "searchPlaceholder": "Search...", - "searchGo": "Go", - "searchPlaceholderLabel": "Placeholder Text", - "searchPlaceholderHint": "Text shown inside the search input", - "openInNewTab": "Open in New Tab", - "searchQueryPlaceholder": "Enter query...", - "noSearchShortcuts": "No shortcuts configured", - "addSearchShortcut": "Add Shortcut", - "fontSize": "Font Size", - "textAlign": "Text Align", - "fontWeight": "Font Weight", - "clearColor": "Clear Color", - "imageFit": "Image Fit", - "imageLinkUrl": "Link URL", - "noImage": "No image URL set", - "altText": "Alt Text", - "altTextPlaceholder": "Describe the image", - "renderMarkdown": "Render Markdown", - "displayMode": "Display Mode", - "displayField": "Display Field", - "jsonPath": "JSON Path", - "customApiLabel": "Label", - "customApiLabelPlaceholder": "e.g. Temperature", - "customApiUnit": "Unit", - "customApiNoUrl": "No API URL configured", - "customApiError": "Failed to fetch", - "customApiNotArray": "Response is not an array", - "addService": "Add Service", - "showLabels": "Show Labels", - "iconSize": "Icon Size", - "noDashboardLinks": "No dashboard links configured", - "noLimit": "No limit", - "sectionHeading": "Section Heading", - "addSection": "Add Section", - "compactMode": "Compact Mode", - "showDetailed": "Show Detailed", - "selectHosts": "Select Hosts", - "allHosts": "All hosts", - "listLayout": "List", - "gridLayout": "Grid", - "terminal": "Terminal", - "files": "Files", - "docker": "Docker", - "range15m": "15 minutes", - "range1h": "1 hour", - "range6h": "6 hours", - "range24h": "24 hours", - "metricNetRx": "Net Download", - "metricNetTx": "Net Upload", - "severityFilter": "Severity Filter", - "filterAll": "All", - "accentColor": "Accent Color", - "widgetSshTerminalName": "SSH Terminal", - "widgetSshTerminalDesc": "An inline SSH terminal connected to a configured host", - "sshTerminalNoHost": "No host configured", - "sshTerminalConnect": "Connect", - "sshTerminalAutoConnect": "Auto-connect on load", - "widgetQuickConnectName": "Quick Connect", - "widgetQuickConnectDesc": "One-click launch buttons for any connection type across your hosts", - "connectionTypes": "Connection Types", - "connType_terminal": "Terminal", - "connType_files": "File Manager", - "connType_docker": "Docker", - "connType_host-metrics": "Host Metrics", - "connType_rdp": "RDP", - "connType_vnc": "VNC", - "connType_telnet": "Telnet", - "widgetFileManagerName": "File Manager", - "widgetFileManagerDesc": "Embedded SFTP file manager for a configured host", - "widgetDockerName": "Docker Manager", - "widgetDockerDesc": "Embedded Docker container manager for a configured host", - "widgetTunnelName": "Tunnel Manager", - "widgetTunnelDesc": "Embedded SSH tunnel manager for a configured host", - "widgetNoHostSelected": "No host configured" - }, "serverConfig": { "title": "Server Configuration", "description": "Configure the Termix server URL to connect to your backend services", @@ -539,6 +290,9 @@ "dismiss": "Dismiss", "more": "More", "loading": "Loading...", + "host": "Host", + "selectHost": "Select a host...", + "noHostConfigured": "No host configured", "optional": "Optional", "connect": "Connect", "copied": "Copied", @@ -682,7 +436,6 @@ "renameTab": "Rename tab", "openFileManager": "Open File Manager", "dashboard": "Dashboard", - "homepage": "Homepage", "quickConnect": "Quick Connect", "sshTools": "SSH Tools", "history": "History", @@ -1904,8 +1657,6 @@ "panelMain": "Main", "panelSide": "Side", "justNow": "just now", - "serviceLinks": "Service Links", - "homepagePreview": "Homepage Preview", "activityFileManager": "File manager" }, "donation": { @@ -1935,15 +1686,6 @@ "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", "empty": "Empty", "clear": "Clear", - "serviceLinksTitle": "Service Links", - "serviceLinksEmpty": "No service links yet", - "serviceLinksAddLabel": "Label", - "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Add", - "serviceLinksLabelPlaceholder": "My Service", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Enter a valid web address", - "serviceLinksAddFailed": "Failed to add service link", "viewServerDetails": "View server details" }, "admin": { diff --git a/src/ui/locales/translated/af_ZA.json b/src/ui/locales/translated/af_ZA.json index 5b51d3e53..31a0d0277 100644 --- a/src/ui/locales/translated/af_ZA.json +++ b/src/ui/locales/translated/af_ZA.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Ontsluit sleep om te herrangskik" }, "homepage": { - "title": "Tuisblad", - "addWidget": "Voeg Widget by", - "editWidget": "Wysig Widget", "deleteWidget": "Vee uit", "widgetTypes": "Widgettipes", "serviceLink": "Diens skakel", @@ -206,116 +203,40 @@ "notes": "Notas", "hostStatus": "Gasheerstatus", "bookmarkList": "Boekmerke", - "zoomIn": "Inzoem", - "zoomOut": "Uitzoom", - "resetView": "Herstel aansig", - "lockLayout": "Sluituitleg", - "unlockLayout": "Ontsluit uitleg", - "noWidgets": "Regskliek of klik + om jou eerste widget by te voeg", - "openFullView": "Maak volle aansig oop", - "previewTitle": "Tuisbladvoorskou", - "cancel": "Kanselleer", - "save": "Stoor", - "title_label": "Titel", - "widgetTitlePlaceholder": "Widgettitel (opsioneel)", - "url": "URL", - "imageUrl": "Pasgemaakte beeld-URL", - "imageUrlHint": "Los leeg om die webwerf se gunstelingikoon outomaties te gebruik", - "showImage": "Wys Beeld", - "description": "Beskrywing", - "color": "Kleur", "icon": "Ikoon", "expanded": "Uitgebreid by verstek", - "timezone": "Tydsone", - "invalidTimezone": "Ongeldige tydsone. Gebruik 'n IANA-naam soos Amerika/New_York", - "showSeconds": "Wys sekondes", - "format12h": "12-uur", "format24h": "24-uur", - "content": "Inhoud", - "backgroundColor": "Agtergrondkleur", "host": "Gasheer", "showMetrics": "Wys Metrieke", - "links": "Skakels", - "addLink": "Voeg skakel by", - "linkLabel": "Etiket", "linkUrl": "URL", "removeLink": "Verwyder", - "categoryLinks": "Skakels", - "categoryInfo": "Inligting", - "categorySystem": "Stelsel", "widgetServiceLinkDesc": "'n Klikbare teël wat na 'n diens-URL skakel", "widgetFolderDesc": "'n Houer om verwante widgets te groepeer", "widgetClockDesc": "'n Regstreekse horlosie met konfigureerbare tydsone", "widgetNotesDesc": "'n Notas-widget vir afmerkings", "widgetHostStatusDesc": "Toon lewendige SVE, geheue en skyf vir 'n SSH-gasheer", "widgetBookmarkListDesc": "'n Lys van vinnige skakels", - "copyLink": "Kopieer skakel", - "linkCopied": "Skakel gekopieer!", - "location": "Ligging", - "temperatureUnit": "Temperatuureenheid", - "showForecast": "Wys 3-dae voorspelling", - "scrolling": "Laat blaai toe", - "feedUrl": "Voer-URL", - "maxItems": "Maksimum items", - "showDescription": "Wys Beskrywing", "widgetWeatherName": "Weer", "widgetWeatherDesc": "Regstreekse weer vir enige plek", "widgetIframeName": "iFrame-inbedding", "widgetIframeDesc": "Voeg enige URL in 'n iframe in", - "widgetRssName": "RSS-voer", "widgetRssDesc": "Wys items vanaf 'n RSS- of Atom-voer", "dragToFolder": "Sleep widgets hierheen of gebruik + om by te voeg", "showDisk": "Wys skyfgebruik", "addToFolder": "Voeg widget by vouer", - "noHostSelected": "Geen gasheer gekies nie", "selectHost": "Kies 'n gasheer...", - "displayedMetrics": "Vertoonde Metrieke", - "metricCpu": "SVE", - "metricMemory": "Geheue", - "metricDisk": "Skyf", - "metricUptime": "Optyd", - "metricSystem": "Stelsel", - "metricNetwork": "Netwerk", - "metricProcesses": "Prosesse", - "categoryMonitoring": "Monitering", "loading": "Laai tans...", "allClear": "Alles duidelik", - "noPingUrls": "Geen URL'e gekonfigureer nie", - "pingLabel": "Etiket", - "addPingUrl": "Voeg URL by", - "showLatency": "Wys Latensie", - "refreshInterval": "Verversingsinterval", - "seconds": "sekondes", - "filterActivityTypes": "Filtertipes", - "filterTypesHint": "Los leeg om alles te wys", - "showTimestamp": "Wys Tydstempel", - "uptimeUnavailable": "Beskikbaar vir bedryfstyd", - "uptimeLabel": "Optyd", - "overviewVersion": "Weergawe", "overviewUpdate": "Op datum", - "overviewUpdateLabel": "Opdatering", - "overviewUpdateAvailable": "Opdatering beskikbaar", - "overviewDatabase": "Databasis", - "overviewUptime": "Optyd", - "noHosts": "Geen gashere gekonfigureer nie", - "hostGridHosts": "Gashere", - "hostGridAllHint": "Los leeg om alle gashere te wys", - "columns": "Kolomme", - "showIp": "Wys IP-adres", "connectionType": "Verbindingstipe", - "layout": "Uitleg", - "showStatus": "Wys Status", "showHostName": "Wys gasheernaam", "noDockerActivity": "Geen Docker-aktiwiteit nie", - "noActivity": "Geen aktiwiteit nie", "showAcknowledged": "Wys Erken", "widgetMetricsChartName": "Metrieke Grafiek", "widgetMetricsChartDesc": "Historiese SVE-, geheue-, skyf- of netwerkgrafiek vir 'n gasheer", "widgetHostGridName": "Gasheerrooster", "widgetHostGridDesc": "Roosteraansig van SSH-gasheerstatusse", - "widgetPingStatusName": "Ping-status", "widgetPingStatusDesc": "HTTP-pingstatus vir een of meer URL'e", - "widgetRecentActivityName": "Onlangse Aktiwiteit", "widgetRecentActivityDesc": "Blaaibare stroom van onlangse Termix-aktiwiteit", "widgetTermixUptimeName": "Termix-optyd", "widgetTermixUptimeDesc": "Regstreekse optydteller vir die Termix-bediener", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Vinnige soektog-kortpadknoppies met inlyn-invoer", "widgetLinkTreeName": "Skakelboom", "widgetLinkTreeDesc": "Gegroepeerde afdelings van skakels met opskrifte", - "calMon": "Ma", - "calTue": "Di", - "calWed": "Ons", - "calThu": "Do", - "calFri": "Vr", - "calSat": "Sa", - "calSun": "So", - "startOnMonday": "Begin week op Maandag", - "countdownNoDate": "Geen teikendatum gestel nie", - "countdownPast": "Gebeurtenis het verbygegaan", - "countdownDays": "dae", - "countdownHours": "ure", - "countdownMinutes": "min", - "countdownSeconds": "sek", - "countdownLabel": "Etiket", - "countdownLabelPlaceholder": "bv. Bekendstellingsdag", - "countdownShowDays": "Skou Dae", - "countdownShowHours": "Wys Ure", - "targetDate": "Teikendatum", - "searchEngine": "Soekenjin", - "customSearchUrl": "Pasgemaakte soektog-URL", - "searchPlaceholder": "Soek...", - "searchGo": "Gaan", - "searchPlaceholderLabel": "Plekhouerteks", - "searchPlaceholderHint": "Teks wat binne die soekinvoer gewys word", - "openInNewTab": "Maak oop in Nuwe Oortjie", - "searchQueryPlaceholder": "Voer navraag in...", - "noSearchShortcuts": "Geen kortpaaie gekonfigureer nie", - "addSearchShortcut": "Voeg kortpad by", - "fontSize": "Lettergrootte", - "textAlign": "Teksbelyning", - "fontWeight": "Lettertipe Gewig", - "clearColor": "Duidelike Kleur", - "imageFit": "Beeldpassing", - "imageLinkUrl": "Skakel-URL", - "noImage": "Geen beeld-URL gestel nie", - "altText": "Alt-teks", - "altTextPlaceholder": "Beskryf die beeld", - "renderMarkdown": "Lewer Markdown", - "displayMode": "Vertoonmodus", - "displayField": "Vertoonveld", - "jsonPath": "JSON-pad", - "customApiLabel": "Etiket", - "customApiLabelPlaceholder": "bv. Temperatuur", - "customApiUnit": "Eenheid", - "customApiNoUrl": "Geen API-URL gekonfigureer nie", - "customApiError": "Kon nie haal nie", - "customApiNotArray": "Antwoord is nie 'n skikking nie", - "addService": "Voeg Diens by", - "showLabels": "Wys etikette", - "iconSize": "Ikoongrootte", - "noDashboardLinks": "Geen dashboard-skakels gekonfigureer nie", - "noLimit": "Geen limiet nie", - "sectionHeading": "Afdelingsopskrif", - "addSection": "Voeg Afdeling by", - "compactMode": "Kompakte modus", "showDetailed": "Wys Gedetailleerde", - "selectHosts": "Kies gashere", "allHosts": "Alle gashere", - "listLayout": "Lys", - "gridLayout": "Rooster", "terminal": "Terminaal", "files": "Lêers", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Aksentkleur", "widgetSshTerminalName": "SSH-terminaal", "widgetSshTerminalDesc": "'n Inlyn SSH-terminaal gekoppel aan 'n gekonfigureerde gasheer", - "sshTerminalNoHost": "Geen gasheer gekonfigureer nie", - "sshTerminalConnect": "Verbind", - "sshTerminalAutoConnect": "Koppel outomaties tydens laai", "widgetQuickConnectName": "Vinnige verbinding", "widgetQuickConnectDesc": "Een-klik-bekendstellingsknoppies vir enige verbindingstipe oor jou gashere", - "connectionTypes": "Verbindingstipes", "connType_terminal": "Terminaal", "connType_files": "Lêerbestuurder", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Hernoem oortjie", "openFileManager": "Maak Lêerbestuurder oop", "dashboard": "Dashboard", - "homepage": "Tuisblad", "quickConnect": "Vinnige verbinding", "sshTools": "SSH-gereedskap", "history": "Geskiedenis", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Bedienerstatistieke", "panelMain": "Hoof", "panelSide": "Kant", - "justNow": "nou net", - "serviceLinks": "Diens skakels", - "homepagePreview": "Tuisbladvoorskou" + "justNow": "nou net" }, "donation": { "title": "Geniet jy Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Sleep kaarte om te herrangskik · Sleep die kolomverdeler om kolomme se grootte te verander · Sleep die onderste rand van 'n kaart om die hoogte daarvan te verander · Asblik om te verwyder", "empty": "Leeg", "clear": "Duidelik", - "serviceLinksTitle": "Diens skakels", - "serviceLinksEmpty": "Geen diens skakels nog nie", "serviceLinksAddLabel": "Etiket", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Voeg by", - "serviceLinksLabelPlaceholder": "My Diens", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Voer 'n geldige webadres in", - "serviceLinksAddFailed": "Kon nie diensskakel byvoeg nie", "viewServerDetails": "Bekyk bedienerbesonderhede" }, "admin": { diff --git a/src/ui/locales/translated/ar_SA.json b/src/ui/locales/translated/ar_SA.json index eae448f7f..f87e79882 100644 --- a/src/ui/locales/translated/ar_SA.json +++ b/src/ui/locales/translated/ar_SA.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "قم بإلغاء القفل واسحب لإعادة الترتيب" }, "homepage": { - "title": "الصفحة الرئيسية", - "addWidget": "إضافة ويدجت", - "editWidget": "تعديل ويدجت", "deleteWidget": "حذف", "widgetTypes": "أنواع الأدوات", "serviceLink": "رابط الخدمة", @@ -206,116 +203,40 @@ "notes": "ملاحظات", "hostStatus": "حالة المضيف", "bookmarkList": "علامات مرجعية", - "zoomIn": "تكبير", - "zoomOut": "تصغير", - "resetView": "إعادة تعيين العرض", - "lockLayout": "قفل التخطيط", - "unlockLayout": "إلغاء قفل التخطيط", - "noWidgets": "انقر بزر الماوس الأيمن أو انقر على + لإضافة أداتك الأولى", - "openFullView": "فتح العرض الكامل", - "previewTitle": "معاينة الصفحة الرئيسية", - "cancel": "إلغاء", - "save": "حفظ", - "title_label": "العنوان", - "widgetTitlePlaceholder": "عنوان الأداة (اختياري)", - "url": "URL", - "imageUrl": "URL صورة مخصصة", - "imageUrlHint": "اتركه فارغًا لاستخدام أيقونة الموقع تلقائيًا", - "showImage": "إظهار الصورة", - "description": "الوصف", - "color": "اللون", "icon": "الأيقونة", "expanded": "موسَّع بشكل افتراضي", - "timezone": "المنطقة الزمنية", - "invalidTimezone": "المنطقة الزمنية غير صالحة. استخدم اسمًا من IANA مثل America/New_York", - "showSeconds": "عرض الثواني", - "format12h": "12 ساعة", "format24h": "24 ساعة", - "content": "المحتوى", - "backgroundColor": "لون الخلفية", "host": "المضيف", "showMetrics": "عرض المقاييس", - "links": "روابط", - "addLink": "إضافة رابط", - "linkLabel": "التسمية", "linkUrl": "URL", "removeLink": "إزالة", - "categoryLinks": "روابط", - "categoryInfo": "معلومات", - "categorySystem": "النظام", "widgetServiceLinkDesc": "بلاطة قابلة للنقر تؤدي إلى رابط خدمة", "widgetFolderDesc": "حاوية لتجميع الأدوات ذات الصلة", "widgetClockDesc": "ساعة مباشرة مع منطقة زمنية قابلة للتكوين", "widgetNotesDesc": "أداة ملاحظات بتنسيق Markdown", "widgetHostStatusDesc": "يعرض بيانات المعالج والذاكرة والقرص لخادم SSH مباشرة", "widgetBookmarkListDesc": "قائمة بالروابط السريعة", - "copyLink": "نسخ الرابط", - "linkCopied": "تم نسخ الرابط!", - "location": "الموقع", - "temperatureUnit": "وحدة درجة الحرارة", - "showForecast": "إظهار توقعات 3 أيام", - "scrolling": "السماح بالتمرير", - "feedUrl": "رابط التغذية", - "maxItems": "الحد الأقصى للعناصر", - "showDescription": "إظهار الوصف", "widgetWeatherName": "الطقس", "widgetWeatherDesc": "حالة الطقس المباشرة لأي موقع", "widgetIframeName": "تضمين iFrame", "widgetIframeDesc": "تضمين أي رابط في إطار iFrame", - "widgetRssName": "تغذية RSS", "widgetRssDesc": "عرض عناصر من تغذية RSS أو Atom", "dragToFolder": "اسحب الأدوات هنا أو استخدم + للإضافة", "showDisk": "إظهار استخدام القرص", "addToFolder": "إضافة أداة إلى المجلد", - "noHostSelected": "لم يتم تحديد أي مضيف", "selectHost": "اختيار مضيف...", - "displayedMetrics": "المقاييس المعروضة", - "metricCpu": "CPU", - "metricMemory": "الذاكرة", - "metricDisk": "القرص", - "metricUptime": "وقت التشغيل", - "metricSystem": "النظام", - "metricNetwork": "الشبكة", - "metricProcesses": "العمليات", - "categoryMonitoring": "المراقبة", "loading": "جار التحميل...", "allClear": "كل شيء طبيعي", - "noPingUrls": "لم يتم تكوين عناوين URL", - "pingLabel": "التسمية", - "addPingUrl": "إضافة URL", - "showLatency": "إظهار زمن الانتقال", - "refreshInterval": "فترة التحديث", - "seconds": "ثانية", - "filterActivityTypes": "أنواع التصفية", - "filterTypesHint": "اترك فارغاً لإظهار الكل", - "showTimestamp": "إظهار الطابع الزمني", - "uptimeUnavailable": "وقت التشغيل غير متوفر", - "uptimeLabel": "وقت التشغيل", - "overviewVersion": "الإصدار", "overviewUpdate": "محدّث", - "overviewUpdateLabel": "تحديث", - "overviewUpdateAvailable": "تحديث متوفر", - "overviewDatabase": "قاعدة البيانات", - "overviewUptime": "وقت التشغيل", - "noHosts": "لا توجد مضيفات مُهيأة", - "hostGridHosts": "المضيفات", - "hostGridAllHint": "اتركه فارغًا لعرض جميع المضيفات", - "columns": "الأعمدة", - "showIp": "إظهار عنوان IP", "connectionType": "نوع الاتصال", - "layout": "التخطيط", - "showStatus": "إظهار الحالة", "showHostName": "إظهار اسم المضيف", "noDockerActivity": "لا يوجد نشاط Docker", - "noActivity": "لا يوجد نشاط", "showAcknowledged": "إظهار المُقر بها", "widgetMetricsChartName": "مخطط المقاييس", "widgetMetricsChartDesc": "مخطط تاريخي لوحدة المعالجة المركزية أو الذاكرة أو القرص أو الشبكة لمضيف", "widgetHostGridName": "شبكة المضيفات", "widgetHostGridDesc": "عرض شبكي لحالات مضيفات SSH", - "widgetPingStatusName": "حالة Ping", "widgetPingStatusDesc": "حالة ping HTTP لعنوان URL واحد أو أكثر", - "widgetRecentActivityName": "النشاط الأخير", "widgetRecentActivityDesc": "موجز قابل للتمرير للنشاط الأخير في Termix", "widgetTermixUptimeName": "مدة تشغيل Termix", "widgetTermixUptimeDesc": "عداد مباشر لمدة تشغيل خادم Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "أزرار اختصارات بحث سريعة مع إدخال مضمن", "widgetLinkTreeName": "شجرة الروابط", "widgetLinkTreeDesc": "أقسام مجمّعة من الروابط مع عناوين", - "calMon": "إثنين", - "calTue": "ثلاثاء", - "calWed": "أربعاء", - "calThu": "خميس", - "calFri": "جمعة", - "calSat": "سبت", - "calSun": "أحد", - "startOnMonday": "بدء الأسبوع يوم الإثنين", - "countdownNoDate": "لم يتم تحديد تاريخ مستهدف", - "countdownPast": "انقضى الحدث", - "countdownDays": "أيام", - "countdownHours": "ساعات", - "countdownMinutes": "دقائق", - "countdownSeconds": "ثوانٍ", - "countdownLabel": "تسمية", - "countdownLabelPlaceholder": "مثال: يوم الإطلاق", - "countdownShowDays": "إظهار الأيام", - "countdownShowHours": "إظهار الساعات", - "targetDate": "التاريخ المستهدف", - "searchEngine": "محرك البحث", - "customSearchUrl": "عنوان URL بحث مخصص", - "searchPlaceholder": "بحث...", - "searchGo": "تنفيذ", - "searchPlaceholderLabel": "نص العنصر النائب", - "searchPlaceholderHint": "النص المعروض داخل حقل البحث", - "openInNewTab": "فتح في علامة تبويب جديدة", - "searchQueryPlaceholder": "أدخل الاستعلام...", - "noSearchShortcuts": "لا توجد اختصارات مكونة", - "addSearchShortcut": "إضافة اختصار", - "fontSize": "حجم الخط", - "textAlign": "محاذاة النص", - "fontWeight": "وزن الخط", - "clearColor": "مسح اللون", - "imageFit": "ملاءمة الصورة", - "imageLinkUrl": "رابط URL", - "noImage": "لم يتم تعيين عنوان URL للصورة", - "altText": "نص بديل", - "altTextPlaceholder": "وصف الصورة", - "renderMarkdown": "عرض Markdown", - "displayMode": "وضع العرض", - "displayField": "حقل العرض", - "jsonPath": "مسار JSON", - "customApiLabel": "تسمية", - "customApiLabelPlaceholder": "مثال: درجة الحرارة", - "customApiUnit": "وحدة", - "customApiNoUrl": "لم يتم تكوين عنوان URL API", - "customApiError": "فشل في الجلب", - "customApiNotArray": "الاستجابة ليست مصفوفة", - "addService": "إضافة خدمة", - "showLabels": "إظهار التسميات", - "iconSize": "حجم الأيقونة", - "noDashboardLinks": "لا توجد روابط لوحة تحكم مُعدة", - "noLimit": "غير محدود", - "sectionHeading": "عنوان القسم", - "addSection": "إضافة قسم", - "compactMode": "الوضع المضغوط", "showDetailed": "إظهار التفاصيل", - "selectHosts": "اختيار المضيفين", "allHosts": "جميع المضيفين", - "listLayout": "قائمة", - "gridLayout": "شبكة", "terminal": "الطرفية", "files": "الملفات", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "لون التمييز", "widgetSshTerminalName": "طرفية SSH", "widgetSshTerminalDesc": "طرفية SSH مضمنة متصلة بمضيف مُعد", - "sshTerminalNoHost": "لم يتم إعداد مضيف", - "sshTerminalConnect": "اتصل", - "sshTerminalAutoConnect": "اتصال تلقائي عند التحميل", "widgetQuickConnectName": "اتصال سريع", "widgetQuickConnectDesc": "أزرار تشغيل بنقرة واحدة لأي نوع اتصال عبر مضيفيك", - "connectionTypes": "أنواع الاتصال", "connType_terminal": "الطرفية", "connType_files": "مدير الملفات", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "إعادة تسمية علامة التبويب", "openFileManager": "فتح مدير الملفات", "dashboard": "لوحة المعلومات", - "homepage": "الصفحة الرئيسية", "quickConnect": "اتصال سريع", "sshTools": "أدوات SSH", "history": "السجل", @@ -1895,9 +1752,7 @@ "serverStatsCard": "إحصائيات الخادم", "panelMain": "الرئيسية", "panelSide": "الجانبية", - "justNow": "للتو", - "serviceLinks": "روابط الخدمات", - "homepagePreview": "معاينة الصفحة الرئيسية" + "justNow": "للتو" }, "donation": { "title": "هل تستمتع بـ Termix؟", @@ -1926,15 +1781,8 @@ "editModeInstructions": "اسحب البطاقات لإعادة الترتيب · اسحب مقسم العمود لتغيير حجم الأعمدة · اسحب الحافة السفلية للبطاقة لتغيير ارتفاعها · اسحب إلى سلة المهملات للإزالة", "empty": "فارغ", "clear": "مسح", - "serviceLinksTitle": "روابط الخدمات", - "serviceLinksEmpty": "لا توجد روابط خدمات بعد", "serviceLinksAddLabel": "التسمية", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "إضافة", - "serviceLinksLabelPlaceholder": "خدمتي", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "أدخل عنوان ويب صالح", - "serviceLinksAddFailed": "فشل في إضافة رابط الخدمة", "viewServerDetails": "عرض تفاصيل الخادم" }, "admin": { diff --git a/src/ui/locales/translated/bg_BG.json b/src/ui/locales/translated/bg_BG.json index 9e80d0ac1..d8360d044 100644 --- a/src/ui/locales/translated/bg_BG.json +++ b/src/ui/locales/translated/bg_BG.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Отключете плъзгането, за да пренаредите" }, "homepage": { - "title": "Начална страница", - "addWidget": "Добавяне на джаджа", - "editWidget": "Редактиране на уиджет", "deleteWidget": "Изтриване", "widgetTypes": "Видове джаджи", "serviceLink": "Връзка към услугата", @@ -206,116 +203,40 @@ "notes": "Бележки", "hostStatus": "Състояние на хоста", "bookmarkList": "Отметки", - "zoomIn": "Увеличаване на мащаба", - "zoomOut": "Намаляване на мащаба", - "resetView": "Нулиране на изгледа", - "lockLayout": "Заключване на оформлението", - "unlockLayout": "Отключване на оформлението", - "noWidgets": "Щракнете с десния бутон или щракнете върху +, за да добавите първия си уиджет", - "openFullView": "Отваряне на пълен изглед", - "previewTitle": "Преглед на началната страница", - "cancel": "Отказ", - "save": "Запазване", - "title_label": "Заглавие", - "widgetTitlePlaceholder": "Заглавие на уиджета (по избор)", - "url": "URL адрес", - "imageUrl": "URL адрес на персонализирано изображение", - "imageUrlHint": "Оставете празно, за да използвате автоматично фавиконката на сайта", - "showImage": "Показване на изображение", - "description": "Описание", - "color": "Цвят", "icon": "Икона", "expanded": "Разширено по подразбиране", - "timezone": "Часова зона", - "invalidTimezone": "Невалидна часова зона. Използвайте име от IANA, като например America/New_York.", - "showSeconds": "Показване на секунди", - "format12h": "12-часов", "format24h": "24-часово", - "content": "Съдържание", - "backgroundColor": "Цвят на фона", "host": "Домакин", "showMetrics": "Показване на показатели", - "links": "Връзки", - "addLink": "Добавяне на връзка", - "linkLabel": "Етикет", "linkUrl": "URL адрес", "removeLink": "Премахване", - "categoryLinks": "Връзки", - "categoryInfo": "Информация", - "categorySystem": "Система", "widgetServiceLinkDesc": "Плочка, върху която може да се кликва, препращаща към URL адрес на услуга", "widgetFolderDesc": "Контейнер за групиране на свързани джаджи", "widgetClockDesc": "Жив часовник с конфигурируема часова зона", "widgetNotesDesc": "Уиджет за бележки в Markdown", "widgetHostStatusDesc": "Показва процесора, паметта и диска в реално време за SSH хост", "widgetBookmarkListDesc": "Списък с бързи връзки", - "copyLink": "Копиране на връзката", - "linkCopied": "Линкът е копиран!", - "location": "Местоположение", - "temperatureUnit": "Температурна единица", - "showForecast": "Показване на 3-дневна прогноза", - "scrolling": "Разрешаване на превъртане", - "feedUrl": "URL адрес на емисията", - "maxItems": "Максимален брой елементи", - "showDescription": "Покажи описание", "widgetWeatherName": "Времето", "widgetWeatherDesc": "Времето на живо за всяко място", "widgetIframeName": "Вграждане на iFrame", "widgetIframeDesc": "Вграждане на произволен URL адрес във вложена рамка", - "widgetRssName": "RSS емисия", "widgetRssDesc": "Показване на елементи от RSS или Atom емисия", "dragToFolder": "Плъзнете джаджи тук или използвайте +, за да добавите", "showDisk": "Показване на използването на диска", "addToFolder": "Добавяне на джаджа към папката", - "noHostSelected": "Няма избран хост", "selectHost": "Изберете хост...", - "displayedMetrics": "Показани показатели", - "metricCpu": "Процесор", - "metricMemory": "Памет", - "metricDisk": "Диск", - "metricUptime": "Време на работа", - "metricSystem": "Система", - "metricNetwork": "Мрежа", - "metricProcesses": "Процеси", - "categoryMonitoring": "Мониторинг", "loading": "Зареждане...", "allClear": "Всичко е чисто", - "noPingUrls": "Няма конфигурирани URL адреси", - "pingLabel": "Етикет", - "addPingUrl": "Добавяне на URL адрес", - "showLatency": "Покажи латентност", - "refreshInterval": "Интервал на обновяване", - "seconds": "секунди", - "filterActivityTypes": "Видове филтри", - "filterTypesHint": "Оставете празно, за да се покажат всички", - "showTimestamp": "Показване на времева маркировка", - "uptimeUnavailable": "Не е налично време за работа", - "uptimeLabel": "Време на работа", - "overviewVersion": "Версия", "overviewUpdate": "Актуално", - "overviewUpdateLabel": "Актуализация", - "overviewUpdateAvailable": "Налична е актуализация", - "overviewDatabase": "База данни", - "overviewUptime": "Време на работа", - "noHosts": "Няма конфигурирани хостове", - "hostGridHosts": "Домакини", - "hostGridAllHint": "Оставете празно, за да се покажат всички хостове", - "columns": "Колони", - "showIp": "Показване на IP адрес", "connectionType": "Тип връзка", - "layout": "Оформление", - "showStatus": "Покажи състоянието", "showHostName": "Покажи името на хоста", "noDockerActivity": "Няма активност в Docker", - "noActivity": "Няма активност", "showAcknowledged": "Покажи потвърдено", "widgetMetricsChartName": "Диаграма с показатели", "widgetMetricsChartDesc": "Историческа диаграма на процесора, паметта, диска или мрежата за хост", "widgetHostGridName": "Хост мрежа", "widgetHostGridDesc": "Табелен изглед на състоянията на SSH хоста", - "widgetPingStatusName": "Състояние на пинг", "widgetPingStatusDesc": "HTTP ping статус за един или повече URL адреси", - "widgetRecentActivityName": "Последна активност", "widgetRecentActivityDesc": "Превъртаща се емисия от скорошна активност на Termix", "widgetTermixUptimeName": "Време на работа на Termix", "widgetTermixUptimeDesc": "Брояч на времето за работа в реално време за Termix сървъра", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Бутони за бързо търсене с вградено въвеждане", "widgetLinkTreeName": "Дърво на връзките", "widgetLinkTreeDesc": "Групирани секции от връзки със заглавия", - "calMon": "Мо", - "calTue": "Вт", - "calWed": "Ние", - "calThu": "Четвъртък", - "calFri": "Пт", - "calSat": "Съ", - "calSun": "Су", - "startOnMonday": "Започнете седмицата в понеделник", - "countdownNoDate": "Няма определена целева дата", - "countdownPast": "Събитието е отминало", - "countdownDays": "дни", - "countdownHours": "часа", - "countdownMinutes": "мин.", - "countdownSeconds": "сек", - "countdownLabel": "Етикет", - "countdownLabelPlaceholder": "напр. Ден на стартиране", - "countdownShowDays": "Дни на шоуто", - "countdownShowHours": "Работно време на шоуто", - "targetDate": "Целева дата", - "searchEngine": "Търсачка", - "customSearchUrl": "URL адрес за персонализирано търсене", - "searchPlaceholder": "Търсене...", - "searchGo": "Отиди", - "searchPlaceholderLabel": "Текст на заместител", - "searchPlaceholderHint": "Текст, показан във полето за търсене", - "openInNewTab": "Отваряне в нов раздел", - "searchQueryPlaceholder": "Въведете заявка...", - "noSearchShortcuts": "Няма конфигурирани преки пътища", - "addSearchShortcut": "Добавяне на пряк път", - "fontSize": "Размер на шрифта", - "textAlign": "Подравняване на текста", - "fontWeight": "Тегло на шрифта", - "clearColor": "Ясен цвят", - "imageFit": "Напасване на изображението", - "imageLinkUrl": "URL адрес на връзката", - "noImage": "Няма зададен URL адрес на изображението", - "altText": "Алтернативен текст", - "altTextPlaceholder": "Опишете изображението", - "renderMarkdown": "Рендиране на маркиране", - "displayMode": "Режим на показване", - "displayField": "Поле за показване", - "jsonPath": "JSON път", - "customApiLabel": "Етикет", - "customApiLabelPlaceholder": "напр. Температура", - "customApiUnit": "Единица", - "customApiNoUrl": "Няма конфигуриран URL адрес на API", - "customApiError": "Неуспешно извличане", - "customApiNotArray": "Отговорът не е масив", - "addService": "Добавяне на услуга", - "showLabels": "Показване на етикети", - "iconSize": "Размер на иконата", - "noDashboardLinks": "Няма конфигурирани връзки към таблото за управление", - "noLimit": "Без ограничение", - "sectionHeading": "Заглавие на раздел", - "addSection": "Добавяне на раздел", - "compactMode": "Компактен режим", "showDetailed": "Покажи подробности", - "selectHosts": "Изберете хостове", "allHosts": "Всички хостове", - "listLayout": "Списък", - "gridLayout": "Решетка", "terminal": "Терминал", "files": "Файлове", "docker": "Докер", @@ -422,12 +284,8 @@ "accentColor": "Акцентен цвят", "widgetSshTerminalName": "SSH терминал", "widgetSshTerminalDesc": "Вграден SSH терминал, свързан с конфигуриран хост", - "sshTerminalNoHost": "Няма конфигуриран хост", - "sshTerminalConnect": "Свържете се", - "sshTerminalAutoConnect": "Автоматично свързване при зареждане", "widgetQuickConnectName": "Бързо свързване", "widgetQuickConnectDesc": "Бутони за стартиране с едно щракване за всеки тип връзка между вашите хостове", - "connectionTypes": "Видове връзки", "connType_terminal": "Терминал", "connType_files": "Файлов мениджър", "connType_docker": "Докер", @@ -685,7 +543,6 @@ "renameTab": "Преименуване на раздел", "openFileManager": "Отворете файловия мениджър", "dashboard": "Табло за управление", - "homepage": "Начална страница", "quickConnect": "Бързо свързване", "sshTools": "SSH инструменти", "history": "История", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Статистика на сървъра", "panelMain": "Главно", "panelSide": "Страна", - "justNow": "точно сега", - "serviceLinks": "Връзки към услуги", - "homepagePreview": "Преглед на началната страница" + "justNow": "точно сега" }, "donation": { "title": "Харесва ли ви Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Плъзнете картите, за да ги пренаредите · Плъзнете разделителя на колоните, за да промените размера на колоните · Плъзнете долния ръб на картата, за да промените размера на височината ѝ · Изтрийте картата от кошчето", "empty": "Празно", "clear": "Изчисти", - "serviceLinksTitle": "Връзки към услуги", - "serviceLinksEmpty": "Все още няма връзки към услуги", "serviceLinksAddLabel": "Етикет", "serviceLinksAddUrl": "URL адрес", - "serviceLinksAdd": "Добавяне", - "serviceLinksLabelPlaceholder": "Моята услуга", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Въведете валиден уеб адрес", - "serviceLinksAddFailed": "Добавянето на линк към услугата не бе успешно", "viewServerDetails": "Преглед на подробности за сървъра" }, "admin": { diff --git a/src/ui/locales/translated/bn_BD.json b/src/ui/locales/translated/bn_BD.json index 2e28bff72..e8bcc344c 100644 --- a/src/ui/locales/translated/bn_BD.json +++ b/src/ui/locales/translated/bn_BD.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "পুনর্বিন্যাস করতে ড্র্যাগ আনলক করুন" }, "homepage": { - "title": "হোমপেজ", - "addWidget": "উইজেট যোগ করুন", - "editWidget": "উইজেট সম্পাদনা করুন", "deleteWidget": "মুছে ফেলুন", "widgetTypes": "উইজেটের প্রকারভেদ", "serviceLink": "সার্ভিস লিঙ্ক", @@ -206,116 +203,40 @@ "notes": "নোট", "hostStatus": "হোস্ট স্ট্যাটাস", "bookmarkList": "বুকমার্ক", - "zoomIn": "জুম ইন", - "zoomOut": "জুম আউট", - "resetView": "দৃশ্য রিসেট করুন", - "lockLayout": "লক লেআউট", - "unlockLayout": "লেআউট আনলক করুন", - "noWidgets": "আপনার প্রথম উইজেট যোগ করতে ডান-ক্লিক করুন অথবা + এ ক্লিক করুন।", - "openFullView": "সম্পূর্ণ দৃশ্য খুলুন", - "previewTitle": "হোমপেজ প্রিভিউ", - "cancel": "বাতিল করুন", - "save": "সংরক্ষণ করুন", - "title_label": "শিরোনাম", - "widgetTitlePlaceholder": "উইজেটের শিরোনাম (ঐচ্ছিক)", - "url": "ইউআরএল", - "imageUrl": "কাস্টম ইমেজ ইউআরএল", - "imageUrlHint": "সাইটের ফেভিকন স্বয়ংক্রিয়ভাবে ব্যবহার করতে খালি রাখুন।", - "showImage": "ছবি দেখান", - "description": "বর্ণনা", - "color": "রঙ", "icon": "আইকন", "expanded": "ডিফল্টরূপে প্রসারিত", - "timezone": "সময় অঞ্চল", - "invalidTimezone": "অবৈধ টাইমজোন। America/New_York-এর মতো একটি IANA নাম ব্যবহার করুন।", - "showSeconds": "সেকেন্ড দেখান", - "format12h": "১২ ঘন্টা", "format24h": "২৪ ঘন্টা", - "content": "বিষয়বস্তু", - "backgroundColor": "পটভূমির রঙ", "host": "হোস্ট", "showMetrics": "মেট্রিক্স দেখান", - "links": "লিঙ্ক", - "addLink": "লিঙ্ক যোগ করুন", - "linkLabel": "লেবেল", "linkUrl": "ইউআরএল", "removeLink": "অপসারণ করুন", - "categoryLinks": "লিঙ্ক", - "categoryInfo": "তথ্য", - "categorySystem": "সিস্টেম", "widgetServiceLinkDesc": "একটি পরিষেবা URL-এর সাথে লিঙ্কযুক্ত একটি ক্লিকযোগ্য টাইল।", "widgetFolderDesc": "সম্পর্কিত উইজেটগুলিকে একত্রিত করার জন্য একটি ধারক।", "widgetClockDesc": "পরিবর্তনযোগ্য টাইমজোন সহ একটি লাইভ ঘড়ি", "widgetNotesDesc": "একটি মার্কডাউন নোট উইজেট", "widgetHostStatusDesc": "একটি SSH হোস্টের লাইভ সিপিইউ, মেমরি এবং ডিস্ক দেখায়।", "widgetBookmarkListDesc": "দ্রুত লিঙ্কের একটি তালিকা", - "copyLink": "লিঙ্ক কপি করুন", - "linkCopied": "লিঙ্ক কপি করা হয়েছে!", - "location": "অবস্থান", - "temperatureUnit": "তাপমাত্রা ইউনিট", - "showForecast": "তিন দিনের পূর্বাভাস দেখান", - "scrolling": "স্ক্রোল করার অনুমতি দিন", - "feedUrl": "ফিড ইউআরএল", - "maxItems": "সর্বোচ্চ আইটেম", - "showDescription": "বিবরণ দেখান", "widgetWeatherName": "আবহাওয়া", "widgetWeatherDesc": "যেকোনো স্থানের সরাসরি আবহাওয়ার খবর", "widgetIframeName": "আইফ্রেম এমবেড", "widgetIframeDesc": "যেকোনো URL একটি iframe-এ এমবেড করুন।", - "widgetRssName": "আরএসএস ফিড", "widgetRssDesc": "আরএসএস বা অ্যাটম ফিড থেকে আইটেমগুলি প্রদর্শন করুন", "dragToFolder": "উইজেটগুলো এখানে টেনে আনুন অথবা যোগ করতে + ব্যবহার করুন।", "showDisk": "ডিস্ক ব্যবহার দেখান", "addToFolder": "ফোল্ডারে উইজেট যোগ করুন", - "noHostSelected": "কোন হোস্ট নির্বাচন করা হয়নি", "selectHost": "একজন হোস্ট নির্বাচন করুন...", - "displayedMetrics": "প্রদর্শিত মেট্রিক্স", - "metricCpu": "সিপিইউ", - "metricMemory": "স্মৃতি", - "metricDisk": "ডিস্ক", - "metricUptime": "আপটাইম", - "metricSystem": "সিস্টেম", - "metricNetwork": "নেটওয়ার্ক", - "metricProcesses": "প্রক্রিয়া", - "categoryMonitoring": "পর্যবেক্ষণ", "loading": "লোড হচ্ছে...", "allClear": "সব পরিষ্কার", - "noPingUrls": "কোন URL কনফিগার করা নেই", - "pingLabel": "লেবেল", - "addPingUrl": "URL যোগ করুন", - "showLatency": "লেটেন্সি দেখান", - "refreshInterval": "রিফ্রেশ ব্যবধান", - "seconds": "সেকেন্ড", - "filterActivityTypes": "ফিল্টারের প্রকারভেদ", - "filterTypesHint": "সবগুলো দেখাতে খালি রাখুন", - "showTimestamp": "টাইমস্ট্যাম্প দেখান", - "uptimeUnavailable": "আপটাইম অনুপলব্ধ", - "uptimeLabel": "আপটাইম", - "overviewVersion": "সংস্করণ", "overviewUpdate": "হালনাগাদ", - "overviewUpdateLabel": "আপডেট", - "overviewUpdateAvailable": "আপডেট উপলব্ধ", - "overviewDatabase": "ডাটাবেস", - "overviewUptime": "আপটাইম", - "noHosts": "কোন হোস্ট কনফিগার করা নেই", - "hostGridHosts": "হোস্টরা", - "hostGridAllHint": "সমস্ত হোস্ট দেখানোর জন্য খালি রাখুন", - "columns": "কলাম", - "showIp": "আইপি ঠিকানা দেখান", "connectionType": "সংযোগের ধরণ", - "layout": "লেআউট", - "showStatus": "অবস্থা দেখান", "showHostName": "হোস্টের নাম দেখান", "noDockerActivity": "কোন ডকার কার্যকলাপ নেই", - "noActivity": "কোন কার্যকলাপ নেই", "showAcknowledged": "স্বীকৃতি প্রদর্শন করুন", "widgetMetricsChartName": "মেট্রিক্স চার্ট", "widgetMetricsChartDesc": "একটি হোস্টের ঐতিহাসিক সিপিইউ, মেমরি, ডিস্ক বা নেটওয়ার্ক চার্ট", "widgetHostGridName": "হোস্ট গ্রিড", "widgetHostGridDesc": "SSH হোস্ট স্ট্যাটাসের গ্রিড ভিউ", - "widgetPingStatusName": "পিং স্ট্যাটাস", "widgetPingStatusDesc": "এক বা একাধিক URL-এর জন্য HTTP পিং স্ট্যাটাস", - "widgetRecentActivityName": "সাম্প্রতিক কার্যকলাপ", "widgetRecentActivityDesc": "সাম্প্রতিক টারমিক্স কার্যকলাপের স্ক্রোলযোগ্য ফিড", "widgetTermixUptimeName": "টার্মিক্স আপটাইম", "widgetTermixUptimeDesc": "টারমিক্স সার্ভারের লাইভ আপটাইম কাউন্টার", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "ইনলাইন ইনপুট সহ দ্রুত অনুসন্ধানের শর্টকাট বাটন", "widgetLinkTreeName": "লিঙ্ক ট্রি", "widgetLinkTreeDesc": "শিরোনাম সহ লিঙ্কের দলবদ্ধ বিভাগ", - "calMon": "মো", - "calTue": "তু", - "calWed": "আমরা", - "calThu": "থ", - "calFri": "ফ্র", - "calSat": "সা", - "calSun": "সু", - "startOnMonday": "সোমবার থেকে সপ্তাহ শুরু করুন", - "countdownNoDate": "কোনো নির্দিষ্ট তারিখ নির্ধারণ করা হয়নি।", - "countdownPast": "অনুষ্ঠানটি শেষ হয়ে গেছে।", - "countdownDays": "দিন", - "countdownHours": "ঘন্টা", - "countdownMinutes": "মিনিট", - "countdownSeconds": "সেকেন্ড", - "countdownLabel": "লেবেল", - "countdownLabelPlaceholder": "যেমন লঞ্চের দিন", - "countdownShowDays": "শো ডেজ", - "countdownShowHours": "শো আওয়ার্স", - "targetDate": "লক্ষ্য তারিখ", - "searchEngine": "সার্চ ইঞ্জিন", - "customSearchUrl": "কাস্টম সার্চ ইউআরএল", - "searchPlaceholder": "অনুসন্ধান করুন...", - "searchGo": "যান", - "searchPlaceholderLabel": "স্থানধারক পাঠ্য", - "searchPlaceholderHint": "সার্চ ইনপুটের ভিতরে দেখানো টেক্সট", - "openInNewTab": "নতুন ট্যাবে খুলুন", - "searchQueryPlaceholder": "প্রশ্ন লিখুন...", - "noSearchShortcuts": "কোন শর্টকাট কনফিগার করা নেই", - "addSearchShortcut": "শর্টকাট যোগ করুন", - "fontSize": "ফন্ট সাইজ", - "textAlign": "টেক্সট অ্যালাইন", - "fontWeight": "ফন্ট ওজন", - "clearColor": "পরিষ্কার রঙ", - "imageFit": "ইমেজ ফিট", - "imageLinkUrl": "লিঙ্ক ইউআরএল", - "noImage": "কোন ছবির ইউআরএল সেট করা হয়নি", - "altText": "বিকল্প পাঠ্য", - "altTextPlaceholder": "ছবিটি বর্ণনা করুন", - "renderMarkdown": "রেন্ডার মার্কডাউন", - "displayMode": "ডিসপ্লে মোড", - "displayField": "ডিসপ্লে ফিল্ড", - "jsonPath": "JSON পাথ", - "customApiLabel": "লেবেল", - "customApiLabelPlaceholder": "যেমন তাপমাত্রা", - "customApiUnit": "ইউনিট", - "customApiNoUrl": "কোন API URL কনফিগার করা নেই", - "customApiError": "আনতে ব্যর্থ হয়েছে", - "customApiNotArray": "প্রতিক্রিয়া একটি অ্যারে নয়", - "addService": "পরিষেবা যোগ করুন", - "showLabels": "লেবেল দেখান", - "iconSize": "আইকনের আকার", - "noDashboardLinks": "কোন ড্যাশবোর্ড লিঙ্ক কনফিগার করা নেই", - "noLimit": "কোনো সীমা নেই", - "sectionHeading": "বিভাগ শিরোনাম", - "addSection": "বিভাগ যোগ করুন", - "compactMode": "কমপ্যাক্ট মোড", "showDetailed": "বিস্তারিত দেখুন", - "selectHosts": "হোস্ট নির্বাচন করুন", "allHosts": "সকল হোস্ট", - "listLayout": "তালিকা", - "gridLayout": "গ্রিড", "terminal": "টার্মিনাল", "files": "ফাইল", "docker": "ডকার", @@ -422,12 +284,8 @@ "accentColor": "অ্যাকসেন্ট রঙ", "widgetSshTerminalName": "এসএসএইচ টার্মিনাল", "widgetSshTerminalDesc": "একটি কনফিগার করা হোস্টের সাথে সংযুক্ত একটি ইনলাইন SSH টার্মিনাল", - "sshTerminalNoHost": "কোন হোস্ট কনফিগার করা নেই", - "sshTerminalConnect": "সংযোগ করুন", - "sshTerminalAutoConnect": "লোড হলে স্বয়ংক্রিয়ভাবে সংযোগ স্থাপন", "widgetQuickConnectName": "দ্রুত সংযোগ", "widgetQuickConnectDesc": "আপনার হোস্ট জুড়ে যেকোনো সংযোগ প্রকারের জন্য এক-ক্লিকে চালু করার বাটন।", - "connectionTypes": "সংযোগের প্রকারভেদ", "connType_terminal": "টার্মিনাল", "connType_files": "ফাইল ম্যানেজার", "connType_docker": "ডকার", @@ -685,7 +543,6 @@ "renameTab": "ট্যাবের নাম পরিবর্তন করুন", "openFileManager": "ফাইল ম্যানেজার খুলুন", "dashboard": "ড্যাশবোর্ড", - "homepage": "হোমপেজ", "quickConnect": "দ্রুত সংযোগ", "sshTools": "SSH টুলস", "history": "ইতিহাস", @@ -1895,9 +1752,7 @@ "serverStatsCard": "সার্ভার পরিসংখ্যান", "panelMain": "প্রধান", "panelSide": "পাশ", - "justNow": "এইমাত্র", - "serviceLinks": "পরিষেবা লিঙ্ক", - "homepagePreview": "হোমপেজ প্রিভিউ" + "justNow": "এইমাত্র" }, "donation": { "title": "টারমিক্স উপভোগ করছেন?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "কার্ডগুলোর ক্রম পরিবর্তন করতে টেনে আনুন · কলামের আকার পরিবর্তন করতে কলাম বিভাজকটি টেনে আনুন · কার্ডের উচ্চতার পরিবর্তন করতে এর নিচের প্রান্তটি টেনে আনুন · মুছে ফেলতে ট্র্যাশ ব্যবহার করুন", "empty": "খালি", "clear": "পরিষ্কার", - "serviceLinksTitle": "পরিষেবা লিঙ্ক", - "serviceLinksEmpty": "এখনও কোনো পরিষেবা লিঙ্ক নেই", "serviceLinksAddLabel": "লেবেল", "serviceLinksAddUrl": "ইউআরএল", - "serviceLinksAdd": "যোগ করুন", - "serviceLinksLabelPlaceholder": "আমার পরিষেবা", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "একটি বৈধ ওয়েব ঠিকানা লিখুন", - "serviceLinksAddFailed": "পরিষেবা লিঙ্ক যোগ করতে ব্যর্থ হয়েছে", "viewServerDetails": "সার্ভারের বিবরণ দেখুন" }, "admin": { diff --git a/src/ui/locales/translated/ca_ES.json b/src/ui/locales/translated/ca_ES.json index 58c800e2c..c3ffa8e3d 100644 --- a/src/ui/locales/translated/ca_ES.json +++ b/src/ui/locales/translated/ca_ES.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Desbloqueja arrossega per reorganitzar" }, "homepage": { - "title": "Pàgina d'inici", - "addWidget": "Afegeix un widget", - "editWidget": "Edita el widget", "deleteWidget": "Suprimeix", "widgetTypes": "Tipus de widgets", "serviceLink": "Enllaç de servei", @@ -206,116 +203,40 @@ "notes": "Notes", "hostStatus": "Estat de l'amfitrió", "bookmarkList": "Adreces d'interès", - "zoomIn": "Ampliar zoom", - "zoomOut": "Allunyar", - "resetView": "Restableix la vista", - "lockLayout": "Disseny de bloqueig", - "unlockLayout": "Desbloqueja el disseny", - "noWidgets": "Feu clic amb el botó dret o feu clic a + per afegir el primer widget", - "openFullView": "Obre la vista completa", - "previewTitle": "Vista prèvia de la pàgina d'inici", - "cancel": "Cancel·la", - "save": "Desa", - "title_label": "Títol", - "widgetTitlePlaceholder": "Títol del widget (opcional)", - "url": "URL", - "imageUrl": "URL d'imatge personalitzada", - "imageUrlHint": "Deixeu-ho en blanc per utilitzar la icona de favorits del lloc web automàticament", - "showImage": "Mostra la imatge", - "description": "Descripció", - "color": "Color", "icon": "Icona", "expanded": "Expandit per defecte", - "timezone": "Zona horària", - "invalidTimezone": "Fus horari no vàlid. Feu servir un nom IANA com ara Amèrica/Nova_York.", - "showSeconds": "Mostra els segons", - "format12h": "12 hores", "format24h": "24 hores", - "content": "Contingut", - "backgroundColor": "Color de fons", "host": "Amfitrió", "showMetrics": "Mostra les mètriques", - "links": "Enllaços", - "addLink": "Afegeix un enllaç", - "linkLabel": "Etiqueta", "linkUrl": "URL", "removeLink": "Elimina", - "categoryLinks": "Enllaços", - "categoryInfo": "Informació", - "categorySystem": "Sistema", "widgetServiceLinkDesc": "Una tessel·la clicable que enllaça a una URL de servei", "widgetFolderDesc": "Un contenidor per agrupar widgets relacionats", "widgetClockDesc": "Un rellotge en directe amb zona horària configurable", "widgetNotesDesc": "Un widget de notes de rebaixa", "widgetHostStatusDesc": "Mostra la CPU, la memòria i el disc en directe per a un host SSH", "widgetBookmarkListDesc": "Una llista d'enllaços ràpids", - "copyLink": "Copia l'enllaç", - "linkCopied": "Enllaç copiat!", - "location": "Ubicació", - "temperatureUnit": "Unitat de temperatura", - "showForecast": "Mostra la previsió de 3 dies", - "scrolling": "Permet el desplaçament", - "feedUrl": "URL del canal", - "maxItems": "Màxim d'elements", - "showDescription": "Mostra la descripció", "widgetWeatherName": "El temps", "widgetWeatherDesc": "El temps en directe per a qualsevol ubicació", "widgetIframeName": "Incrustació d'iFrame", "widgetIframeDesc": "Incrustar qualsevol URL en un iframe", - "widgetRssName": "Canal RSS", "widgetRssDesc": "Mostrar elements d'un canal RSS o Atom", "dragToFolder": "Arrossega els widgets aquí o fes servir + per afegir-los", "showDisk": "Mostra l'ús del disc", "addToFolder": "Afegeix el widget a la carpeta", - "noHostSelected": "No s'ha seleccionat cap amfitrió", "selectHost": "Seleccioneu un amfitrió...", - "displayedMetrics": "Mètriques mostrades", - "metricCpu": "CPU", - "metricMemory": "Memòria", - "metricDisk": "Disc", - "metricUptime": "Temps de funcionament", - "metricSystem": "Sistema", - "metricNetwork": "Xarxa", - "metricProcesses": "Processos", - "categoryMonitoring": "Monitorització", "loading": "S'està carregant...", "allClear": "Tot clar", - "noPingUrls": "No s'han configurat URL", - "pingLabel": "Etiqueta", - "addPingUrl": "Afegeix URL", - "showLatency": "Mostra la latència", - "refreshInterval": "Interval d'actualització", - "seconds": "segons", - "filterActivityTypes": "Tipus de filtre", - "filterTypesHint": "Deixeu-ho en blanc per mostrar-ho tot", - "showTimestamp": "Mostra la marca de temps", - "uptimeUnavailable": "Temps de funcionament no disponible", - "uptimeLabel": "Temps de funcionament", - "overviewVersion": "Versió", "overviewUpdate": "Actualitzat", - "overviewUpdateLabel": "Actualització", - "overviewUpdateAvailable": "Actualització disponible", - "overviewDatabase": "Base de dades", - "overviewUptime": "Temps de funcionament", - "noHosts": "No hi ha cap amfitrió configurat", - "hostGridHosts": "Amfitrions", - "hostGridAllHint": "Deixeu-ho en blanc per mostrar tots els amfitrions", - "columns": "Columnes", - "showIp": "Mostra l'adreça IP", "connectionType": "Tipus de connexió", - "layout": "Disseny", - "showStatus": "Mostra l'estat", "showHostName": "Mostra el nom de l'amfitrió", "noDockerActivity": "Sense activitat de Docker", - "noActivity": "Sense activitat", "showAcknowledged": "Mostra Reconeixement", "widgetMetricsChartName": "Gràfic de mètriques", "widgetMetricsChartDesc": "Gràfic històric de CPU, memòria, disc o xarxa per a un host", "widgetHostGridName": "Graella d'amfitrió", "widgetHostGridDesc": "Vista de quadrícula dels estats dels hosts SSH", - "widgetPingStatusName": "Estat del ping", "widgetPingStatusDesc": "Estat del ping HTTP per a una o més URL", - "widgetRecentActivityName": "Activitat recent", "widgetRecentActivityDesc": "Canal desplaçable de l'activitat recent de Termix", "widgetTermixUptimeName": "Temps de funcionament de Termix", "widgetTermixUptimeDesc": "Comptador de temps de funcionament en directe per al servidor Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Botons de drecera de cerca ràpida amb entrada en línia", "widgetLinkTreeName": "Arbre d'enllaços", "widgetLinkTreeDesc": "Seccions agrupades d'enllaços amb encapçalaments", - "calMon": "Mo", - "calTue": "Dimarts", - "calWed": "Nosaltres", - "calThu": "Dj.", - "calFri": "Div.", - "calSat": "Sa", - "calSun": "Dg.", - "startOnMonday": "Comença la setmana dilluns", - "countdownNoDate": "No hi ha cap data objectiu fixada", - "countdownPast": "L'esdeveniment ha passat", - "countdownDays": "dies", - "countdownHours": "hores", - "countdownMinutes": "min", - "countdownSeconds": "segons", - "countdownLabel": "Etiqueta", - "countdownLabelPlaceholder": "p. ex. Dia del llançament", - "countdownShowDays": "Dies d'espectacle", - "countdownShowHours": "Horari de la mostra", - "targetDate": "Data objectiu", - "searchEngine": "Motor de cerca", - "customSearchUrl": "URL de cerca personalitzada", - "searchPlaceholder": "Cerca...", - "searchGo": "Anar", - "searchPlaceholderLabel": "Text de marcador de posició", - "searchPlaceholderHint": "Text que es mostra dins del camp de cerca", - "openInNewTab": "Obre en una pestanya nova", - "searchQueryPlaceholder": "Introduïu la consulta...", - "noSearchShortcuts": "No hi ha dreceres configurades", - "addSearchShortcut": "Afegeix una drecera", - "fontSize": "Mida de la lletra", - "textAlign": "Alineació del text", - "fontWeight": "Pes de la lletra", - "clearColor": "Color clar", - "imageFit": "Ajust d'imatge", - "imageLinkUrl": "URL de l'enllaç", - "noImage": "No s'ha definit cap URL d'imatge", - "altText": "Text alternatiu", - "altTextPlaceholder": "Descriu la imatge", - "renderMarkdown": "Renderització Markdown", - "displayMode": "Mode de visualització", - "displayField": "Camp de visualització", - "jsonPath": "Camí JSON", - "customApiLabel": "Etiqueta", - "customApiLabelPlaceholder": "p. ex. Temperatura", - "customApiUnit": "Unitat", - "customApiNoUrl": "No s'ha configurat cap URL de l'API", - "customApiError": "No s'ha pogut obtenir", - "customApiNotArray": "La resposta no és una matriu", - "addService": "Afegeix un servei", - "showLabels": "Mostra les etiquetes", - "iconSize": "Mida de la icona", - "noDashboardLinks": "No hi ha cap enllaç configurat al tauler de control", - "noLimit": "Sense límit", - "sectionHeading": "Encapçalament de secció", - "addSection": "Afegeix secció", - "compactMode": "Mode compacte", "showDetailed": "Mostra detallat", - "selectHosts": "Selecciona els amfitrions", "allHosts": "Tots els amfitrions", - "listLayout": "Llista", - "gridLayout": "Graella", "terminal": "Terminal", "files": "Fitxers", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Color d'accent", "widgetSshTerminalName": "Terminal SSH", "widgetSshTerminalDesc": "Un terminal SSH en línia connectat a un host configurat", - "sshTerminalNoHost": "No hi ha cap amfitrió configurat", - "sshTerminalConnect": "Connecta", - "sshTerminalAutoConnect": "Connexió automàtica en càrrega", "widgetQuickConnectName": "Connexió ràpida", "widgetQuickConnectDesc": "Botons d'inici amb un sol clic per a qualsevol tipus de connexió entre els vostres amfitrions", - "connectionTypes": "Tipus de connexió", "connType_terminal": "Terminal", "connType_files": "Gestor de fitxers", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Canvia el nom de la pestanya", "openFileManager": "Obre el gestor de fitxers", "dashboard": "Tauler de control", - "homepage": "Pàgina d'inici", "quickConnect": "Connexió ràpida", "sshTools": "Eines SSH", "history": "Història", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Estadístiques del servidor", "panelMain": "Principal", "panelSide": "Costat", - "justNow": "ara mateix", - "serviceLinks": "Enllaços de servei", - "homepagePreview": "Vista prèvia de la pàgina d'inici" + "justNow": "ara mateix" }, "donation": { "title": "T'agrada Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Arrossegueu les targetes per reordenar · Arrossegueu el divisor de columnes per canviar la mida de les columnes · Arrossegueu la vora inferior d'una targeta per canviar-ne l'alçada · Paperera per eliminar-la", "empty": "Buit", "clear": "Clar", - "serviceLinksTitle": "Enllaços de servei", - "serviceLinksEmpty": "Encara no hi ha enllaços de servei", "serviceLinksAddLabel": "Etiqueta", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Afegeix", - "serviceLinksLabelPlaceholder": "El meu servei", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Introduïu una adreça web vàlida", - "serviceLinksAddFailed": "No s'ha pogut afegir l'enllaç del servei", "viewServerDetails": "Veure els detalls del servidor" }, "admin": { diff --git a/src/ui/locales/translated/cs_CZ.json b/src/ui/locales/translated/cs_CZ.json index f8c7300a3..8f2d20bec 100644 --- a/src/ui/locales/translated/cs_CZ.json +++ b/src/ui/locales/translated/cs_CZ.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Odemkněte přetažením pro změnu uspořádání" }, "homepage": { - "title": "Domovská stránka", - "addWidget": "Přidat widget", - "editWidget": "Upravit widget", "deleteWidget": "Vymazat", "widgetTypes": "Typy widgetů", "serviceLink": "Odkaz na službu", @@ -206,116 +203,40 @@ "notes": "Poznámky", "hostStatus": "Stav hostitele", "bookmarkList": "Záložky", - "zoomIn": "Přiblížit", - "zoomOut": "Oddálit", - "resetView": "Obnovit zobrazení", - "lockLayout": "Rozložení zámku", - "unlockLayout": "Odemknout rozvržení", - "noWidgets": "Klikněte pravým tlačítkem myši nebo kliknutím na + přidejte svůj první widget", - "openFullView": "Otevřít celé zobrazení", - "previewTitle": "Náhled domovské stránky", - "cancel": "Zrušit", - "save": "Uložit", - "title_label": "Titul", - "widgetTitlePlaceholder": "Název widgetu (volitelné)", - "url": "URL", - "imageUrl": "URL vlastního obrázku", - "imageUrlHint": "Nechte pole prázdné, pokud chcete favicon webu používat automaticky.", - "showImage": "Zobrazit obrázek", - "description": "Popis", - "color": "Barva", "icon": "Ikona", "expanded": "Ve výchozím nastavení rozšířeno", - "timezone": "Časové pásmo", - "invalidTimezone": "Neplatné časové pásmo. Použijte název IANA, například America/New_York.", - "showSeconds": "Zobrazit sekundy", - "format12h": "12 hodin", "format24h": "24 hodin denně", - "content": "Obsah", - "backgroundColor": "Barva pozadí", "host": "Hostitel", "showMetrics": "Zobrazit metriky", - "links": "Odkazy", - "addLink": "Přidat odkaz", - "linkLabel": "Označení", "linkUrl": "URL", "removeLink": "Odstranit", - "categoryLinks": "Odkazy", - "categoryInfo": "Informace", - "categorySystem": "Systém", "widgetServiceLinkDesc": "Klikatelná dlaždice odkazující na URL adresu služby", "widgetFolderDesc": "Kontejner pro seskupování souvisejících widgetů", "widgetClockDesc": "Živé hodiny s konfigurovatelným časovým pásmem", "widgetNotesDesc": "Widget Markdown Notes", "widgetHostStatusDesc": "Zobrazuje aktuální stav CPU, paměti a disku pro hostitele SSH", "widgetBookmarkListDesc": "Seznam rychlých odkazů", - "copyLink": "Kopírovat odkaz", - "linkCopied": "Odkaz zkopírován!", - "location": "Umístění", - "temperatureUnit": "Jednotka teploty", - "showForecast": "Zobrazit třídenní předpověď", - "scrolling": "Povolit rolování", - "feedUrl": "URL kanálu", - "maxItems": "Maximální počet položek", - "showDescription": "Zobrazit popis", "widgetWeatherName": "Počasí", "widgetWeatherDesc": "Živé počasí pro jakékoli místo", "widgetIframeName": "Vložení iFrame", "widgetIframeDesc": "Vložte libovolnou URL do prvku iframe", - "widgetRssName": "RSS kanál", "widgetRssDesc": "Zobrazení položek z RSS nebo Atom kanálu", "dragToFolder": "Přetáhněte widgety sem nebo je přidejte pomocí +", "showDisk": "Zobrazit využití disku", "addToFolder": "Přidat widget do složky", - "noHostSelected": "Nebyl vybrán žádný hostitel", "selectHost": "Vyberte hostitele...", - "displayedMetrics": "Zobrazené metriky", - "metricCpu": "Procesor", - "metricMemory": "Paměť", - "metricDisk": "Disk", - "metricUptime": "Doba provozuschopnosti", - "metricSystem": "Systém", - "metricNetwork": "Síť", - "metricProcesses": "Procesy", - "categoryMonitoring": "Monitorování", "loading": "Načítání...", "allClear": "Všechno čisté", - "noPingUrls": "Žádné adresy URL nejsou nakonfigurovány", - "pingLabel": "Označení", - "addPingUrl": "Přidat URL", - "showLatency": "Zobrazit latenci", - "refreshInterval": "Interval aktualizace", - "seconds": "sekundy", - "filterActivityTypes": "Typy filtrů", - "filterTypesHint": "Pro zobrazení všech ponechte prázdné", - "showTimestamp": "Zobrazit časové razítko", - "uptimeUnavailable": "Dostupnost není k dispozici", - "uptimeLabel": "Doba provozuschopnosti", - "overviewVersion": "Verze", "overviewUpdate": "Aktuální", - "overviewUpdateLabel": "Aktualizovat", - "overviewUpdateAvailable": "Aktualizace k dispozici", - "overviewDatabase": "Databáze", - "overviewUptime": "Doba provozuschopnosti", - "noHosts": "Žádní hostitelé nakonfigurováni", - "hostGridHosts": "Hostitelé", - "hostGridAllHint": "Nechte prázdné pro zobrazení všech hostitelů", - "columns": "Sloupce", - "showIp": "Zobrazit IP adresu", "connectionType": "Typ připojení", - "layout": "Rozvržení", - "showStatus": "Zobrazit stav", "showHostName": "Zobrazit název hostitele", "noDockerActivity": "Žádná aktivita Dockeru", - "noActivity": "Žádná aktivita", "showAcknowledged": "Zobrazit potvrzeno", "widgetMetricsChartName": "Graf metrik", "widgetMetricsChartDesc": "Historický graf CPU, paměti, disku nebo sítě pro hostitele", "widgetHostGridName": "Hostitelská mřížka", "widgetHostGridDesc": "Mřížkové zobrazení stavů hostitelů SSH", - "widgetPingStatusName": "Stav pingu", "widgetPingStatusDesc": "Stav HTTP pingu pro jednu nebo více URL adres", - "widgetRecentActivityName": "Nedávná aktivita", "widgetRecentActivityDesc": "Posouvatelný kanál nedávné aktivity Termixu", "widgetTermixUptimeName": "Doba provozuschopnosti Termixu", "widgetTermixUptimeDesc": "Čítač provozuschopnosti serveru Termix v reálném čase", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Tlačítka zkratek pro rychlé vyhledávání s vloženým vstupem", "widgetLinkTreeName": "Strom odkazů", "widgetLinkTreeDesc": "Seskupené sekce odkazů s nadpisy", - "calMon": "Po", - "calTue": "Út", - "calWed": "My", - "calThu": "Čt", - "calFri": "Pá", - "calSat": "So", - "calSun": "Ne", - "startOnMonday": "Začátek týdne v pondělí", - "countdownNoDate": "Není stanoveno žádné cílové datum", - "countdownPast": "Událost proběhla", - "countdownDays": "dny", - "countdownHours": "hodin", - "countdownMinutes": "min.", - "countdownSeconds": "sekunda", - "countdownLabel": "Označení", - "countdownLabelPlaceholder": "např. den spuštění", - "countdownShowDays": "Dny výstav", - "countdownShowHours": "Otevírací doba", - "targetDate": "Cílové datum", - "searchEngine": "Vyhledávač", - "customSearchUrl": "URL pro vlastní vyhledávání", - "searchPlaceholder": "Vyhledávání...", - "searchGo": "Jít", - "searchPlaceholderLabel": "Zástupný text", - "searchPlaceholderHint": "Text zobrazený uvnitř vyhledávacího pole", - "openInNewTab": "Otevřít v nové kartě", - "searchQueryPlaceholder": "Zadejte dotaz...", - "noSearchShortcuts": "Žádné zkratky nakonfigurované", - "addSearchShortcut": "Přidat zkratku", - "fontSize": "Velikost písma", - "textAlign": "Zarovnání textu", - "fontWeight": "Tloušťka písma", - "clearColor": "Jasná barva", - "imageFit": "Přizpůsobení obrazu", - "imageLinkUrl": "URL odkazu", - "noImage": "Není nastavena adresa URL obrázku", - "altText": "Alternativní text", - "altTextPlaceholder": "Popište obrázek", - "renderMarkdown": "Renderování Markdownu", - "displayMode": "Režim zobrazení", - "displayField": "Pole zobrazení", - "jsonPath": "Cesta JSON", - "customApiLabel": "Označení", - "customApiLabelPlaceholder": "např. teplota", - "customApiUnit": "Jednotka", - "customApiNoUrl": "Není nakonfigurována žádná adresa URL API", - "customApiError": "Načtení se nezdařilo", - "customApiNotArray": "Odpověď není pole", - "addService": "Přidat službu", - "showLabels": "Zobrazit štítky", - "iconSize": "Velikost ikony", - "noDashboardLinks": "Nejsou nakonfigurovány žádné odkazy na řídicí panel", - "noLimit": "Bez omezení", - "sectionHeading": "Nadpis sekce", - "addSection": "Přidat sekci", - "compactMode": "Kompaktní režim", "showDetailed": "Zobrazit podrobnosti", - "selectHosts": "Vyberte hostitele", "allHosts": "Všichni hostitelé", - "listLayout": "Seznam", - "gridLayout": "Mřížka", "terminal": "Terminál", "files": "Soubory", "docker": "Přístavní dělník", @@ -422,12 +284,8 @@ "accentColor": "Zvýrazňující barva", "widgetSshTerminalName": "SSH terminál", "widgetSshTerminalDesc": "Vložený SSH terminál připojený k nakonfigurovanému hostiteli", - "sshTerminalNoHost": "Žádný hostitel není nakonfigurován", - "sshTerminalConnect": "Připojit", - "sshTerminalAutoConnect": "Automatické připojení při načtení", "widgetQuickConnectName": "Rychlé připojení", "widgetQuickConnectDesc": "Tlačítka pro spuštění jedním kliknutím pro jakýkoli typ připojení napříč vašimi hostiteli", - "connectionTypes": "Typy připojení", "connType_terminal": "Terminál", "connType_files": "Správce souborů", "connType_docker": "Přístavní dělník", @@ -685,7 +543,6 @@ "renameTab": "Přejmenovat kartu", "openFileManager": "Otevřít Správce souborů", "dashboard": "Dashboard", - "homepage": "Domovská stránka", "quickConnect": "Rychlé připojení", "sshTools": "SSH nástroje", "history": "Dějiny", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Statistiky serveru", "panelMain": "Hlavní", "panelSide": "Strana", - "justNow": "právě teď", - "serviceLinks": "Odkazy na služby", - "homepagePreview": "Náhled domovské stránky" + "justNow": "právě teď" }, "donation": { "title": "Líbí se vám Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Přetažením karet změníte pořadí · Přetažením děliče sloupců změníte velikost sloupců · Přetažením spodního okraje karty změníte její výšku · Odebráním z koše", "empty": "Prázdný", "clear": "Jasný", - "serviceLinksTitle": "Odkazy na služby", - "serviceLinksEmpty": "Zatím žádné odkazy na služby", "serviceLinksAddLabel": "Označení", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Přidat", - "serviceLinksLabelPlaceholder": "Moje služba", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Zadejte platnou webovou adresu", - "serviceLinksAddFailed": "Nepodařilo se přidat odkaz na službu", "viewServerDetails": "Zobrazit podrobnosti o serveru" }, "admin": { diff --git a/src/ui/locales/translated/da_DK.json b/src/ui/locales/translated/da_DK.json index 4d98e4c9e..62d953962 100644 --- a/src/ui/locales/translated/da_DK.json +++ b/src/ui/locales/translated/da_DK.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Lås op, træk for at omarrangere" }, "homepage": { - "title": "Hjemmeside", - "addWidget": "Tilføj widget", - "editWidget": "Rediger widget", "deleteWidget": "Slet", "widgetTypes": "Widgettyper", "serviceLink": "Servicelink", @@ -206,116 +203,40 @@ "notes": "Noter", "hostStatus": "Værtsstatus", "bookmarkList": "Bogmærker", - "zoomIn": "Zoom ind", - "zoomOut": "Zoom ud", - "resetView": "Nulstil visning", - "lockLayout": "Låselayout", - "unlockLayout": "Lås layout op", - "noWidgets": "Højreklik eller klik på + for at tilføje din første widget", - "openFullView": "Åbn fuld visning", - "previewTitle": "Forhåndsvisning af hjemmeside", - "cancel": "Ophæve", - "save": "Spare", - "title_label": "Titel", - "widgetTitlePlaceholder": "Widgettitel (valgfrit)", - "url": "URL", - "imageUrl": "Brugerdefineret billed-URL", - "imageUrlHint": "Lad feltet stå tomt for at bruge webstedets favicon automatisk", - "showImage": "Vis billede", - "description": "Beskrivelse", - "color": "Farve", "icon": "Ikon", "expanded": "Udvidet som standard", - "timezone": "Tidszone", - "invalidTimezone": "Ugyldig tidszone. Brug et IANA-navn, f.eks. America/New_York.", - "showSeconds": "Vis sekunder", - "format12h": "12-timers", "format24h": "24-timers", - "content": "Tilfreds", - "backgroundColor": "Baggrundsfarve", "host": "Vært", "showMetrics": "Vis metrikker", - "links": "Links", - "addLink": "Tilføj link", - "linkLabel": "Mærke", "linkUrl": "URL", "removeLink": "Fjerne", - "categoryLinks": "Links", - "categoryInfo": "Info", - "categorySystem": "System", "widgetServiceLinkDesc": "En klikbar flise, der linker til en tjeneste-URL", "widgetFolderDesc": "En container til at gruppere relaterede widgets", "widgetClockDesc": "Et live-ur med konfigurerbar tidszone", "widgetNotesDesc": "En widget med nedskæringsnoter", "widgetHostStatusDesc": "Viser live CPU, hukommelse og disk for en SSH-vært", "widgetBookmarkListDesc": "En liste over hurtige links", - "copyLink": "Kopiér link", - "linkCopied": "Link kopieret!", - "location": "Beliggenhed", - "temperatureUnit": "Temperaturenhed", - "showForecast": "Vis 3-dages vejrudsigt", - "scrolling": "Tillad rulning", - "feedUrl": "Feed-URL", - "maxItems": "Maks. antal varer", - "showDescription": "Vis beskrivelse", "widgetWeatherName": "Vejr", "widgetWeatherDesc": "Live vejrudsigt for enhver lokation", "widgetIframeName": "iFrame-integrering", "widgetIframeDesc": "Integrer en hvilken som helst URL i en iframe", - "widgetRssName": "RSS-feed", "widgetRssDesc": "Vis elementer fra et RSS- eller Atom-feed", "dragToFolder": "Træk widgets hertil, eller brug + for at tilføje", "showDisk": "Vis diskforbrug", "addToFolder": "Tilføj widget til mappe", - "noHostSelected": "Ingen vært valgt", "selectHost": "Vælg en vært...", - "displayedMetrics": "Viste målinger", - "metricCpu": "CPU", - "metricMemory": "Hukommelse", - "metricDisk": "Disk", - "metricUptime": "Oppetid", - "metricSystem": "System", - "metricNetwork": "Netværk", - "metricProcesses": "Processer", - "categoryMonitoring": "Overvågning", "loading": "Indlæser...", "allClear": "Alt klart", - "noPingUrls": "Ingen URL'er konfigureret", - "pingLabel": "Mærke", - "addPingUrl": "Tilføj URL", - "showLatency": "Vis latenstid", - "refreshInterval": "Opdateringsinterval", - "seconds": "sekunder", - "filterActivityTypes": "Filtertyper", - "filterTypesHint": "Lad stå tomt for at vise alle", - "showTimestamp": "Vis tidsstempel", - "uptimeUnavailable": "Oppetid utilgængelig", - "uptimeLabel": "Oppetid", - "overviewVersion": "Version", "overviewUpdate": "Opdateret", - "overviewUpdateLabel": "Opdatering", - "overviewUpdateAvailable": "Opdatering tilgængelig", - "overviewDatabase": "Database", - "overviewUptime": "Oppetid", - "noHosts": "Ingen værter konfigureret", - "hostGridHosts": "Værter", - "hostGridAllHint": "Lad stå tomt for at vise alle værter", - "columns": "Kolonner", - "showIp": "Vis IP-adresse", "connectionType": "Forbindelsestype", - "layout": "Layout", - "showStatus": "Vis status", "showHostName": "Vis værtsnavn", "noDockerActivity": "Ingen Docker-aktivitet", - "noActivity": "Ingen aktivitet", "showAcknowledged": "Vis anerkendt", "widgetMetricsChartName": "Metrikdiagram", "widgetMetricsChartDesc": "Historisk CPU-, hukommelses-, disk- eller netværksdiagram for en vært", "widgetHostGridName": "Værtgitter", "widgetHostGridDesc": "Gittervisning af SSH-værtsstatusser", - "widgetPingStatusName": "Ping-status", "widgetPingStatusDesc": "HTTP-pingstatus for en eller flere URL'er", - "widgetRecentActivityName": "Seneste aktivitet", "widgetRecentActivityDesc": "Rulbart feed af den seneste Termix-aktivitet", "widgetTermixUptimeName": "Termix Oppetid", "widgetTermixUptimeDesc": "Live oppetidstæller for Termix-serveren", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Genvejsknapper til hurtigsøgning med indbygget input", "widgetLinkTreeName": "Linktræ", "widgetLinkTreeDesc": "Grupperede sektioner af links med overskrifter", - "calMon": "Må", - "calTue": "Ti", - "calWed": "Vi", - "calThu": "To", - "calFri": "Fr", - "calSat": "Lør", - "calSun": "Sø", - "startOnMonday": "Start ugen på mandag", - "countdownNoDate": "Ingen måldato fastsat", - "countdownPast": "Begivenheden er overstået", - "countdownDays": "dage", - "countdownHours": "timer", - "countdownMinutes": "min.", - "countdownSeconds": "sek.", - "countdownLabel": "Mærke", - "countdownLabelPlaceholder": "f.eks. lanceringsdag", - "countdownShowDays": "Vis dage", - "countdownShowHours": "Åbningstider", - "targetDate": "Måldato", - "searchEngine": "Søgemaskine", - "customSearchUrl": "Tilpasset søge-URL", - "searchPlaceholder": "Søge...", - "searchGo": "Gå", - "searchPlaceholderLabel": "Pladsholdertekst", - "searchPlaceholderHint": "Tekst vist i søgefeltet", - "openInNewTab": "Åbn i ny fane", - "searchQueryPlaceholder": "Indtast forespørgsel...", - "noSearchShortcuts": "Ingen genveje konfigureret", - "addSearchShortcut": "Tilføj genvej", - "fontSize": "Skriftstørrelse", - "textAlign": "Tekstjustering", - "fontWeight": "Skriftvægt", - "clearColor": "Klar farve", - "imageFit": "Billedtilpasning", - "imageLinkUrl": "Link-URL", - "noImage": "Ingen billed-URL angivet", - "altText": "Alternativ tekst", - "altTextPlaceholder": "Beskriv billedet", - "renderMarkdown": "Render Markdown", - "displayMode": "Visningstilstand", - "displayField": "Visningsfelt", - "jsonPath": "JSON-sti", - "customApiLabel": "Mærke", - "customApiLabelPlaceholder": "f.eks. Temperatur", - "customApiUnit": "Enhed", - "customApiNoUrl": "Ingen API-URL konfigureret", - "customApiError": "Kunne ikke hente", - "customApiNotArray": "Svaret er ikke et array", - "addService": "Tilføj tjeneste", - "showLabels": "Vis etiketter", - "iconSize": "Ikonstørrelse", - "noDashboardLinks": "Ingen dashboard-links konfigureret", - "noLimit": "Ingen grænse", - "sectionHeading": "Sektionsoverskrift", - "addSection": "Tilføj sektion", - "compactMode": "Kompakt tilstand", "showDetailed": "Vis detaljeret", - "selectHosts": "Vælg værter", "allHosts": "Alle værter", - "listLayout": "Liste", - "gridLayout": "Gitter", "terminal": "Terminal", "files": "Filer", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Accentfarve", "widgetSshTerminalName": "SSH-terminal", "widgetSshTerminalDesc": "En indbygget SSH-terminal forbundet til en konfigureret vært", - "sshTerminalNoHost": "Ingen vært konfigureret", - "sshTerminalConnect": "Forbinde", - "sshTerminalAutoConnect": "Automatisk forbindelse ved indlæsning", "widgetQuickConnectName": "Hurtig forbindelse", "widgetQuickConnectDesc": "Startknapper med ét klik til enhver forbindelsestype på tværs af dine værter", - "connectionTypes": "Forbindelsestyper", "connType_terminal": "Terminal", "connType_files": "Filhåndtering", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Omdøb faneblad", "openFileManager": "Åbn Filhåndtering", "dashboard": "Dashboard", - "homepage": "Hjemmeside", "quickConnect": "Hurtig forbindelse", "sshTools": "SSH-værktøjer", "history": "Historie", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Serverstatistik", "panelMain": "Hoved", "panelSide": "Side", - "justNow": "lige nu", - "serviceLinks": "Servicelinks", - "homepagePreview": "Forhåndsvisning af hjemmeside" + "justNow": "lige nu" }, "donation": { "title": "Kan du lide Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Træk kort for at ændre rækkefølgen · Træk kolonneopdeleren for at ændre størrelsen på kolonnerne · Træk i den nederste kant af et kort for at ændre størrelsen på dets højde · Fjern i papirkurven", "empty": "Tom", "clear": "Klar", - "serviceLinksTitle": "Servicelinks", - "serviceLinksEmpty": "Ingen servicelinks endnu", "serviceLinksAddLabel": "Mærke", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Tilføje", - "serviceLinksLabelPlaceholder": "Min tjeneste", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Indtast en gyldig webadresse", - "serviceLinksAddFailed": "Kunne ikke tilføje tjenestelink", "viewServerDetails": "Se serveroplysninger" }, "admin": { diff --git a/src/ui/locales/translated/de_DE.json b/src/ui/locales/translated/de_DE.json index 154b51978..441035479 100644 --- a/src/ui/locales/translated/de_DE.json +++ b/src/ui/locales/translated/de_DE.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Entsperren und per Drag & Drop neu anordnen" }, "homepage": { - "title": "Startseite", - "addWidget": "Widget hinzufügen", - "editWidget": "Widget bearbeiten", "deleteWidget": "Löschen", "widgetTypes": "Widget-Typen", "serviceLink": "Service-Link", @@ -206,116 +203,40 @@ "notes": "Notizen", "hostStatus": "Host-Status", "bookmarkList": "Lesezeichen", - "zoomIn": "Vergrößern", - "zoomOut": "Verkleinern", - "resetView": "Ansicht zurücksetzen", - "lockLayout": "Layout sperren", - "unlockLayout": "Layout entsperren", - "noWidgets": "Klicken Sie mit der rechten Maustaste oder auf +, um Ihr erstes Widget hinzuzufügen", - "openFullView": "Vollansicht öffnen", - "previewTitle": "Homepage-Vorschau", - "cancel": "Abbrechen", - "save": "Speichern", - "title_label": "Titel", - "widgetTitlePlaceholder": "Widget-Titel (optional)", - "url": "URL", - "imageUrl": "Benutzerdefinierte Bild-URL", - "imageUrlHint": "Leer lassen, um automatisch das Favicon der Website zu verwenden", - "showImage": "Bild anzeigen", - "description": "Beschreibung", - "color": "Farbe", "icon": "Symbol", "expanded": "Standardmäßig erweitert", - "timezone": "Zeitzone", - "invalidTimezone": "Ungültige Zeitzone. Verwenden Sie einen IANA-Namen wie z. B. America/New_York.", - "showSeconds": "Sekunden anzeigen", - "format12h": "12-Stunden", "format24h": "24-Stunden", - "content": "Inhalt", - "backgroundColor": "Hintergrundfarbe", "host": "Host", "showMetrics": "Metriken anzeigen", - "links": "Links", - "addLink": "Link hinzufügen", - "linkLabel": "Bezeichnung", "linkUrl": "URL", "removeLink": "Entfernen", - "categoryLinks": "Links", - "categoryInfo": "Info", - "categorySystem": "System", "widgetServiceLinkDesc": "Anklickbare Kachel, die auf eine Service-URL verlinkt", "widgetFolderDesc": "Ein Container, um verwandte Widgets zu gruppieren", "widgetClockDesc": "Eine Live-Uhr mit konfigurierbarer Zeitzone", "widgetNotesDesc": "Ein Markdown-Notizen-Widget", "widgetHostStatusDesc": "Zeigt Live-CPU-, Arbeitsspeicher- und Festplattenauslastung für einen SSH-Host an", "widgetBookmarkListDesc": "Eine Liste von Schnelllinks", - "copyLink": "Link kopieren", - "linkCopied": "Link kopiert!", - "location": "Standort", - "temperatureUnit": "Temperatureinheit", - "showForecast": "3-Tage-Vorhersage anzeigen", - "scrolling": "Scrollen erlauben", - "feedUrl": "Feed-URL", - "maxItems": "Max. Einträge", - "showDescription": "Beschreibung anzeigen", "widgetWeatherName": "Wetter", "widgetWeatherDesc": "Live-Wetter für jeden Standort", "widgetIframeName": "iFrame-Einbettung", "widgetIframeDesc": "Bettet eine beliebige URL in einen iFrame ein", - "widgetRssName": "RSS-Feed", "widgetRssDesc": "Zeigt Einträge aus einem RSS- oder Atom-Feed an", "dragToFolder": "Widgets hierher ziehen oder + zum Hinzufügen verwenden", "showDisk": "Festplattennutzung anzeigen", "addToFolder": "Widget zum Ordner hinzufügen", - "noHostSelected": "Kein Host ausgewählt", "selectHost": "Host auswählen...", - "displayedMetrics": "Angezeigte Metriken", - "metricCpu": "CPU", - "metricMemory": "Arbeitsspeicher", - "metricDisk": "Festplatte", - "metricUptime": "Betriebszeit", - "metricSystem": "System", - "metricNetwork": "Netzwerk", - "metricProcesses": "Prozesse", - "categoryMonitoring": "Überwachung", "loading": "Wird geladen...", "allClear": "Alles in Ordnung", - "noPingUrls": "Keine URLs konfiguriert", - "pingLabel": "Bezeichnung", - "addPingUrl": "URL hinzufügen", - "showLatency": "Latenz anzeigen", - "refreshInterval": "Aktualisierungsintervall", - "seconds": "Sekunden", - "filterActivityTypes": "Filtertypen", - "filterTypesHint": "Leer lassen, um alle anzuzeigen", - "showTimestamp": "Zeitstempel anzeigen", - "uptimeUnavailable": "Betriebszeit nicht verfügbar", - "uptimeLabel": "Betriebszeit", - "overviewVersion": "Version", "overviewUpdate": "Aktuell", - "overviewUpdateLabel": "Aktualisieren", - "overviewUpdateAvailable": "Update verfügbar", - "overviewDatabase": "Datenbank", - "overviewUptime": "Betriebszeit", - "noHosts": "Keine Hosts konfiguriert", - "hostGridHosts": "Hosts", - "hostGridAllHint": "Leer lassen, um alle Hosts anzuzeigen", - "columns": "Spalten", - "showIp": "IP-Adresse anzeigen", "connectionType": "Verbindungstyp", - "layout": "Layout", - "showStatus": "Status anzeigen", "showHostName": "Hostname anzeigen", "noDockerActivity": "Keine Docker-Aktivität", - "noActivity": "Keine Aktivität", "showAcknowledged": "Bestätigte anzeigen", "widgetMetricsChartName": "Metrikdiagramm", "widgetMetricsChartDesc": "Historisches CPU-, Arbeitsspeicher-, Festplatten- oder Netzwerkdiagramm für einen Host", "widgetHostGridName": "Host-Raster", "widgetHostGridDesc": "Rasteransicht der SSH-Host-Status", - "widgetPingStatusName": "Ping-Status", "widgetPingStatusDesc": "HTTP-Ping-Status für eine oder mehrere URLs", - "widgetRecentActivityName": "Letzte Aktivität", "widgetRecentActivityDesc": "Scrollbarer Feed der letzten Termix-Aktivitäten", "widgetTermixUptimeName": "Termix-Betriebszeit", "widgetTermixUptimeDesc": "Live-Betriebszeitzähler für den Termix-Server", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Schnelle Such-Verknüpfungsschaltflächen mit Inline-Eingabe", "widgetLinkTreeName": "Link-Baum", "widgetLinkTreeDesc": "Gruppierte Link-Abschnitte mit Überschriften", - "calMon": "Mo", - "calTue": "Di", - "calWed": "Mi", - "calThu": "Do", - "calFri": "Fr", - "calSat": "Sa", - "calSun": "So", - "startOnMonday": "Woche am Montag beginnen", - "countdownNoDate": "Kein Zieldatum festgelegt", - "countdownPast": "Ereignis ist vorbei", - "countdownDays": "Tage", - "countdownHours": "Std.", - "countdownMinutes": "Min.", - "countdownSeconds": "Sek.", - "countdownLabel": "Label", - "countdownLabelPlaceholder": "z.B. Starttag", - "countdownShowDays": "Tage anzeigen", - "countdownShowHours": "Stunden anzeigen", - "targetDate": "Zieldatum", - "searchEngine": "Suchmaschine", - "customSearchUrl": "Benutzerdefinierte Such-URL", - "searchPlaceholder": "Suchen...", - "searchGo": "Los", - "searchPlaceholderLabel": "Platzhaltertext", - "searchPlaceholderHint": "Text, der im Suchfeld angezeigt wird", - "openInNewTab": "In neuem Tab öffnen", - "searchQueryPlaceholder": "Suchbegriff eingeben...", - "noSearchShortcuts": "Keine Shortcuts konfiguriert", - "addSearchShortcut": "Shortcut hinzufügen", - "fontSize": "Schriftgröße", - "textAlign": "Textausrichtung", - "fontWeight": "Schriftstärke", - "clearColor": "Farbe löschen", - "imageFit": "Bildanpassung", - "imageLinkUrl": "Link-URL", - "noImage": "Keine Bild-URL festgelegt", - "altText": "Alternativtext", - "altTextPlaceholder": "Bild beschreiben", - "renderMarkdown": "Markdown rendern", - "displayMode": "Anzeigemodus", - "displayField": "Anzeigefeld", - "jsonPath": "JSON-Pfad", - "customApiLabel": "Bezeichnung", - "customApiLabelPlaceholder": "z.B. Temperatur", - "customApiUnit": "Einheit", - "customApiNoUrl": "Keine API-URL konfiguriert", - "customApiError": "Fehler beim Abrufen", - "customApiNotArray": "Antwort ist kein Array", - "addService": "Dienst hinzufügen", - "showLabels": "Beschriftungen anzeigen", - "iconSize": "Symbolgröße", - "noDashboardLinks": "Keine Dashboard-Links konfiguriert", - "noLimit": "Keine Begrenzung", - "sectionHeading": "Abschnittsüberschrift", - "addSection": "Abschnitt hinzufügen", - "compactMode": "Kompaktmodus", "showDetailed": "Details anzeigen", - "selectHosts": "Hosts auswählen", "allHosts": "Alle Hosts", - "listLayout": "Liste", - "gridLayout": "Raster", "terminal": "Terminal", "files": "Dateien", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Akzentfarbe", "widgetSshTerminalName": "SSH-Terminal", "widgetSshTerminalDesc": "Ein eingebettetes SSH-Terminal, das mit einem konfigurierten Host verbunden ist", - "sshTerminalNoHost": "Kein Host konfiguriert", - "sshTerminalConnect": "Verbinden", - "sshTerminalAutoConnect": "Beim Laden automatisch verbinden", "widgetQuickConnectName": "Schnellverbindung", "widgetQuickConnectDesc": "Ein-Klick-Schaltflächen für alle Verbindungstypen auf Ihren Hosts", - "connectionTypes": "Verbindungstypen", "connType_terminal": "Terminal", "connType_files": "Dateimanager", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Registerkarte umbenennen", "openFileManager": "Dateimanager öffnen", "dashboard": "Dashboard", - "homepage": "Startseite", "quickConnect": "Schnellverbindung", "sshTools": "SSH-Tools", "history": "Verlauf", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Serverstatistiken", "panelMain": "Hauptbereich", "panelSide": "Seitenbereich", - "justNow": "gerade eben", - "serviceLinks": "Service-Links", - "homepagePreview": "Homepage-Vorschau" + "justNow": "gerade eben" }, "donation": { "title": "Gefällt Ihnen Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Karten ziehen, um sie neu anzuordnen · Spaltentrenner ziehen, um Spalten zu skalieren · Untere Kante einer Karte ziehen, um die Höhe anzupassen · Papierkorb zum Entfernen", "empty": "Leer", "clear": "Leeren", - "serviceLinksTitle": "Service-Links", - "serviceLinksEmpty": "Noch keine Service-Links", "serviceLinksAddLabel": "Bezeichnung", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Hinzufügen", - "serviceLinksLabelPlaceholder": "Mein Dienst", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Geben Sie eine gültige Webadresse ein", - "serviceLinksAddFailed": "Hinzufügen des Service-Links fehlgeschlagen", "viewServerDetails": "Serverdetails anzeigen" }, "admin": { diff --git a/src/ui/locales/translated/el_GR.json b/src/ui/locales/translated/el_GR.json index 7d76d53dc..6ff770451 100644 --- a/src/ui/locales/translated/el_GR.json +++ b/src/ui/locales/translated/el_GR.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Ξεκλειδώστε και σύρετε για αναδιάταξη." }, "homepage": { - "title": "Αρχική σελίδα", - "addWidget": "Προσθήκη γραφικού στοιχείου", - "editWidget": "Επεξεργασία γραφικού στοιχείου", "deleteWidget": "Διαγράφω", "widgetTypes": "Τύποι γραφικών στοιχείων", "serviceLink": "Σύνδεσμος υπηρεσίας", @@ -206,116 +203,40 @@ "notes": "Σημειώσεις", "hostStatus": "Κατάσταση οικοδεσπότη", "bookmarkList": "Σελιδοδείκτες", - "zoomIn": "Μεγέθυνση", - "zoomOut": "Σμίκρυνση", - "resetView": "Επαναφορά προβολής", - "lockLayout": "Διάταξη κλειδαριάς", - "unlockLayout": "Ξεκλείδωμα διάταξης", - "noWidgets": "Κάντε δεξί κλικ ή κάντε κλικ στο + για να προσθέσετε το πρώτο σας γραφικό στοιχείο", - "openFullView": "Άνοιγμα πλήρους προβολής", - "previewTitle": "Προεπισκόπηση αρχικής σελίδας", - "cancel": "Ματαίωση", - "save": "Εκτός", - "title_label": "Τίτλος", - "widgetTitlePlaceholder": "Τίτλος γραφικού στοιχείου (προαιρετικό)", - "url": "URL", - "imageUrl": "URL προσαρμοσμένης εικόνας", - "imageUrlHint": "Αφήστε το κενό για να χρησιμοποιήσετε αυτόματα το favicon του ιστότοπου", - "showImage": "Εμφάνιση εικόνας", - "description": "Περιγραφή", - "color": "Χρώμα", "icon": "Εικόνισμα", "expanded": "Αναπτυγμένο από προεπιλογή", - "timezone": "Ζώνη ώρας", - "invalidTimezone": "Μη έγκυρη ζώνη ώρας. Χρησιμοποιήστε ένα όνομα IANA, όπως America/New_York.", - "showSeconds": "Εμφάνιση δευτερολέπτων", - "format12h": "12ωρο", "format24h": "24ωρο", - "content": "Περιεχόμενο", - "backgroundColor": "Χρώμα φόντου", "host": "Πλήθος", "showMetrics": "Εμφάνιση μετρήσεων", - "links": "Εδαφος διά παιγνίδι γκολφ", - "addLink": "Προσθήκη συνδέσμου", - "linkLabel": "Επιγραφή", "linkUrl": "URL", "removeLink": "Αφαιρώ", - "categoryLinks": "Εδαφος διά παιγνίδι γκολφ", - "categoryInfo": "Πληροφορίες", - "categorySystem": "Σύστημα", "widgetServiceLinkDesc": "Ένα πλακίδιο με δυνατότητα κλικ που συνδέεται με μια διεύθυνση URL υπηρεσίας", "widgetFolderDesc": "Ένα κοντέινερ για την ομαδοποίηση σχετικών γραφικών στοιχείων", "widgetClockDesc": "Ένα ζωντανό ρολόι με ρυθμιζόμενη ζώνη ώρας", "widgetNotesDesc": "Ένα γραφικό στοιχείο σημειώσεων με έκπτωση", "widgetHostStatusDesc": "Εμφανίζει ζωντανή CPU, μνήμη και δίσκο για έναν κεντρικό υπολογιστή SSH", "widgetBookmarkListDesc": "Μια λίστα με γρήγορους συνδέσμους", - "copyLink": "Αντιγραφή συνδέσμου", - "linkCopied": "Ο σύνδεσμος αντιγράφηκε!", - "location": "Τοποθεσία", - "temperatureUnit": "Μονάδα θερμοκρασίας", - "showForecast": "Εμφάνιση τριήμερης πρόγνωσης", - "scrolling": "Επιτρέπεται η κύλιση", - "feedUrl": "URL ροής", - "maxItems": "Μέγιστος αριθμός στοιχείων", - "showDescription": "Εμφάνιση περιγραφής", "widgetWeatherName": "Καιρός", "widgetWeatherDesc": "Ζωντανός καιρός για οποιαδήποτε τοποθεσία", "widgetIframeName": "Ενσωμάτωση iFrame", "widgetIframeDesc": "Ενσωματώστε οποιαδήποτε διεύθυνση URL σε ένα iframe", - "widgetRssName": "Ροή RSS", "widgetRssDesc": "Εμφάνιση στοιχείων από μια ροή RSS ή Atom", "dragToFolder": "Σύρετε τα γραφικά στοιχεία εδώ ή χρησιμοποιήστε το + για προσθήκη", "showDisk": "Εμφάνιση χρήσης δίσκου", "addToFolder": "Προσθήκη γραφικού στοιχείου σε φάκελο", - "noHostSelected": "Δεν έχει επιλεγεί κεντρικός υπολογιστής", "selectHost": "Επιλέξτε έναν οικοδεσπότη...", - "displayedMetrics": "Εμφανιζόμενες μετρήσεις", - "metricCpu": "ΚΜΕ", - "metricMemory": "Μνήμη", - "metricDisk": "Δίσκος", - "metricUptime": "Χρόνος λειτουργίας", - "metricSystem": "Σύστημα", - "metricNetwork": "Δίκτυο", - "metricProcesses": "Διαδικασίες", - "categoryMonitoring": "Παρακολούθηση", "loading": "Φόρτωση...", "allClear": "Ορίζοντας είναι σαφής", - "noPingUrls": "Δεν έχουν ρυθμιστεί διευθύνσεις URL", - "pingLabel": "Επιγραφή", - "addPingUrl": "Προσθήκη διεύθυνσης URL", - "showLatency": "Εμφάνιση καθυστέρησης", - "refreshInterval": "Διάστημα ανανέωσης", - "seconds": "δευτερόλεπτα", - "filterActivityTypes": "Τύποι φίλτρων", - "filterTypesHint": "Αφήστε κενό για να εμφανιστούν όλα", - "showTimestamp": "Εμφάνιση χρονικής σήμανσης", - "uptimeUnavailable": "Ο χρόνος λειτουργίας δεν είναι διαθέσιμος", - "uptimeLabel": "Χρόνος λειτουργίας", - "overviewVersion": "Εκδοχή", "overviewUpdate": "Σύγχρονος", - "overviewUpdateLabel": "Εκσυγχρονίζω", - "overviewUpdateAvailable": "Διαθέσιμη ενημέρωση", - "overviewDatabase": "Βάση δεδομένων", - "overviewUptime": "Χρόνος λειτουργίας", - "noHosts": "Δεν έχουν ρυθμιστεί κεντρικοί υπολογιστές", - "hostGridHosts": "Οικοδεσπότες", - "hostGridAllHint": "Αφήστε κενό για να εμφανιστούν όλοι οι κεντρικοί υπολογιστές", - "columns": "Στήλες", - "showIp": "Εμφάνιση διεύθυνσης IP", "connectionType": "Τύπος σύνδεσης", - "layout": "Σχέδιο", - "showStatus": "Εμφάνιση κατάστασης", "showHostName": "Εμφάνιση ονόματος κεντρικού υπολογιστή", "noDockerActivity": "Καμία δραστηριότητα Docker", - "noActivity": "Καμία δραστηριότητα", "showAcknowledged": "Εμφάνιση Επιβεβαιωμένων", "widgetMetricsChartName": "Γράφημα μετρήσεων", "widgetMetricsChartDesc": "Ιστορικό διάγραμμα CPU, μνήμης, δίσκου ή δικτύου για έναν κεντρικό υπολογιστή", "widgetHostGridName": "Πλέγμα κεντρικού υπολογιστή", "widgetHostGridDesc": "Προβολή πλέγματος των καταστάσεων κεντρικού υπολογιστή SSH", - "widgetPingStatusName": "Κατάσταση Ping", "widgetPingStatusDesc": "Κατάσταση ping HTTP για μία ή περισσότερες διευθύνσεις URL", - "widgetRecentActivityName": "Πρόσφατη δραστηριότητα", "widgetRecentActivityDesc": "Ροή με δυνατότητα κύλισης για την πρόσφατη δραστηριότητα του Termix", "widgetTermixUptimeName": "Χρόνος λειτουργίας Termix", "widgetTermixUptimeDesc": "Μετρητής χρόνου λειτουργίας σε πραγματικό χρόνο για τον διακομιστή Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Κουμπιά συντόμευσης γρήγορης αναζήτησης με ενσωματωμένη εισαγωγή", "widgetLinkTreeName": "Δέντρο συνδέσμων", "widgetLinkTreeDesc": "Ομαδοποιημένες ενότητες συνδέσμων με επικεφαλίδες", - "calMon": "Μο", - "calTue": "Τρ", - "calWed": "Εμείς", - "calThu": "Πέμ", - "calFri": "Πατέρας", - "calSat": "Σάβ", - "calSun": "Κυρ", - "startOnMonday": "Έναρξη εβδομάδας τη Δευτέρα", - "countdownNoDate": "Δεν έχει οριστεί ημερομηνία-στόχος", - "countdownPast": "Η εκδήλωση πέρασε", - "countdownDays": "ημέρες", - "countdownHours": "ώρες", - "countdownMinutes": "λεπτά", - "countdownSeconds": "δευτ.", - "countdownLabel": "Επιγραφή", - "countdownLabelPlaceholder": "π.χ. Ημέρα Εκκίνησης", - "countdownShowDays": "Ημέρες προβολής", - "countdownShowHours": "Ώρες προβολής", - "targetDate": "Ημερομηνία-στόχος", - "searchEngine": "Μηχανή αναζήτησης", - "customSearchUrl": "URL προσαρμοσμένης αναζήτησης", - "searchPlaceholder": "Ερευνα...", - "searchGo": "Πάω", - "searchPlaceholderLabel": "Κείμενο κράτησης θέσης", - "searchPlaceholderHint": "Κείμενο που εμφανίζεται μέσα στην εισαγωγή αναζήτησης", - "openInNewTab": "Άνοιγμα σε νέα καρτέλα", - "searchQueryPlaceholder": "Εισαγωγή ερωτήματος...", - "noSearchShortcuts": "Δεν έχουν ρυθμιστεί συντομεύσεις", - "addSearchShortcut": "Προσθήκη συντόμευσης", - "fontSize": "Μέγεθος γραμματοσειράς", - "textAlign": "Στοίχιση κειμένου", - "fontWeight": "Πάχος γραμματοσειράς", - "clearColor": "Διαυγές χρώμα", - "imageFit": "Προσαρμογή εικόνας", - "imageLinkUrl": "URL συνδέσμου", - "noImage": "Δεν έχει οριστεί URL εικόνας", - "altText": "Εναλλακτικό κείμενο", - "altTextPlaceholder": "Περιγράψτε την εικόνα", - "renderMarkdown": "Απόδοση Markdown", - "displayMode": "Λειτουργία εμφάνισης", - "displayField": "Πεδίο εμφάνισης", - "jsonPath": "Διαδρομή JSON", - "customApiLabel": "Επιγραφή", - "customApiLabelPlaceholder": "π.χ. Θερμοκρασία", - "customApiUnit": "Μονάδα", - "customApiNoUrl": "Δεν έχει ρυθμιστεί URL API", - "customApiError": "Η ανάκτηση απέτυχε", - "customApiNotArray": "Η απάντηση δεν είναι πίνακας", - "addService": "Προσθήκη υπηρεσίας", - "showLabels": "Εμφάνιση ετικετών", - "iconSize": "Μέγεθος εικονιδίου", - "noDashboardLinks": "Δεν έχουν ρυθμιστεί σύνδεσμοι πίνακα ελέγχου", - "noLimit": "Χωρίς όριο", - "sectionHeading": "Επικεφαλίδα Ενότητας", - "addSection": "Προσθήκη ενότητας", - "compactMode": "Συμπαγής λειτουργία", "showDetailed": "Εμφάνιση λεπτομερειών", - "selectHosts": "Επιλέξτε κεντρικούς υπολογιστές", "allHosts": "Όλοι οι οικοδεσπότες", - "listLayout": "Λίστα", - "gridLayout": "Πλέγμα", "terminal": "Τερματικό", "files": "Αρχεία", "docker": "Λιμενεργάτης", @@ -422,12 +284,8 @@ "accentColor": "Χρώμα έμφασης", "widgetSshTerminalName": "Τερματικό SSH", "widgetSshTerminalDesc": "Ένα ενσωματωμένο τερματικό SSH συνδεδεμένο σε έναν διαμορφωμένο κεντρικό υπολογιστή", - "sshTerminalNoHost": "Δεν έχει ρυθμιστεί κεντρικός υπολογιστής", - "sshTerminalConnect": "Συνδέω", - "sshTerminalAutoConnect": "Αυτόματη σύνδεση κατά τη φόρτωση", "widgetQuickConnectName": "Γρήγορη σύνδεση", "widgetQuickConnectDesc": "Κουμπιά εκκίνησης με ένα κλικ για οποιονδήποτε τύπο σύνδεσης σε όλους τους κεντρικούς υπολογιστές σας", - "connectionTypes": "Τύποι σύνδεσης", "connType_terminal": "Τερματικό", "connType_files": "Διαχειριστής αρχείων", "connType_docker": "Λιμενεργάτης", @@ -685,7 +543,6 @@ "renameTab": "Μετονομασία καρτέλας", "openFileManager": "Άνοιγμα Διαχείρισης Αρχείων", "dashboard": "Ταμπλό", - "homepage": "Αρχική σελίδα", "quickConnect": "Γρήγορη σύνδεση", "sshTools": "Εργαλεία SSH", "history": "Ιστορία", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Στατιστικά διακομιστή", "panelMain": "Κύριος", "panelSide": "Πλευρά", - "justNow": "μόλις τώρα", - "serviceLinks": "Σύνδεσμοι υπηρεσιών", - "homepagePreview": "Προεπισκόπηση αρχικής σελίδας" + "justNow": "μόλις τώρα" }, "donation": { "title": "Σας αρέσει το Termix;", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Σύρετε τις κάρτες για αναδιάταξη · Σύρετε το διαχωριστικό στηλών για αλλαγή μεγέθους στηλών · Σύρετε το κάτω άκρο μιας κάρτας για αλλαγή μεγέθους στο ύψος της · Κάδος απορριμμάτων για αφαίρεση", "empty": "Αδειάζω", "clear": "Σαφής", - "serviceLinksTitle": "Σύνδεσμοι υπηρεσιών", - "serviceLinksEmpty": "Δεν υπάρχουν ακόμη σύνδεσμοι υπηρεσίας", "serviceLinksAddLabel": "Επιγραφή", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Προσθέτω", - "serviceLinksLabelPlaceholder": "Η Υπηρεσία μου", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Εισαγάγετε μια έγκυρη διεύθυνση ιστού", - "serviceLinksAddFailed": "Αποτυχία προσθήκης συνδέσμου υπηρεσίας", "viewServerDetails": "Προβολή λεπτομερειών διακομιστή" }, "admin": { diff --git a/src/ui/locales/translated/es_ES.json b/src/ui/locales/translated/es_ES.json index 148ba6970..1f9403fea 100644 --- a/src/ui/locales/translated/es_ES.json +++ b/src/ui/locales/translated/es_ES.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Desbloquea arrastrar para reorganizar" }, "homepage": { - "title": "Inicio", - "addWidget": "Añadir widget", - "editWidget": "Editar widget", "deleteWidget": "Eliminar", "widgetTypes": "Tipos de widgets", "serviceLink": "Enlace de servicio", @@ -206,116 +203,40 @@ "notes": "Notas", "hostStatus": "Estado del host", "bookmarkList": "Marcadores", - "zoomIn": "Acercar", - "zoomOut": "Alejar", - "resetView": "Restablecer vista", - "lockLayout": "Bloquear diseño", - "unlockLayout": "Desbloquear diseño", - "noWidgets": "Haz clic derecho o pulsa + para añadir tu primer widget", - "openFullView": "Abrir vista completa", - "previewTitle": "Vista previa de la página de inicio", - "cancel": "Cancelar", - "save": "Guardar", - "title_label": "Título", - "widgetTitlePlaceholder": "Título del widget (opcional)", - "url": "URL", - "imageUrl": "URL de imagen personalizada", - "imageUrlHint": "Déjalo en blanco para usar el favicon del sitio automáticamente", - "showImage": "Mostrar imagen", - "description": "Descripción", - "color": "Color", "icon": "Icono", "expanded": "Expandido por defecto", - "timezone": "Zona horaria", - "invalidTimezone": "Zona horaria no válida. Utilice un nombre IANA como America/New_York.", - "showSeconds": "Mostrar segundos", - "format12h": "12 horas", "format24h": "24 horas", - "content": "Contenido", - "backgroundColor": "Color de fondo", "host": "Host", "showMetrics": "Mostrar métricas", - "links": "Enlaces", - "addLink": "Añadir enlace", - "linkLabel": "Etiqueta", "linkUrl": "URL", "removeLink": "Eliminar", - "categoryLinks": "Enlaces", - "categoryInfo": "Información", - "categorySystem": "Sistema", "widgetServiceLinkDesc": "Un mosaico interactivo que enlaza a una URL de servicio", "widgetFolderDesc": "Un contenedor para agrupar widgets relacionados", "widgetClockDesc": "Un reloj en vivo con zona horaria configurable", "widgetNotesDesc": "Un widget de notas en Markdown", "widgetHostStatusDesc": "Muestra uso de CPU, memoria y disco en vivo de un host SSH", "widgetBookmarkListDesc": "Una lista de enlaces rápidos", - "copyLink": "Copiar enlace", - "linkCopied": "¡Enlace copiado!", - "location": "Ubicación", - "temperatureUnit": "Unidad de temperatura", - "showForecast": "Mostrar pronóstico de 3 días", - "scrolling": "Permitir desplazamiento", - "feedUrl": "URL del feed", - "maxItems": "Máx. de elementos", - "showDescription": "Mostrar descripción", "widgetWeatherName": "Tiempo", "widgetWeatherDesc": "El tiempo en vivo para cualquier ubicación", "widgetIframeName": "Incrustar iFrame", "widgetIframeDesc": "Incrusta cualquier URL en un iframe", - "widgetRssName": "Fuente RSS", "widgetRssDesc": "Muestra elementos de una fuente RSS o Atom", "dragToFolder": "Arrastra widgets aquí o usa + para añadir", "showDisk": "Mostrar uso de disco", "addToFolder": "Añadir widget a la carpeta", - "noHostSelected": "Ningún host seleccionado", "selectHost": "Seleccionar un host...", - "displayedMetrics": "Métricas mostradas", - "metricCpu": "CPU", - "metricMemory": "Memoria", - "metricDisk": "Disco", - "metricUptime": "Tiempo de actividad", - "metricSystem": "Sistema", - "metricNetwork": "Red", - "metricProcesses": "Procesos", - "categoryMonitoring": "Monitorización", "loading": "Cargando...", "allClear": "Todo correcto", - "noPingUrls": "No hay URLs configuradas", - "pingLabel": "Etiqueta", - "addPingUrl": "Añadir URL", - "showLatency": "Mostrar latencia", - "refreshInterval": "Intervalo de actualización", - "seconds": "segundos", - "filterActivityTypes": "Filtrar tipos", - "filterTypesHint": "Dejar vacío para mostrar todo", - "showTimestamp": "Mostrar marca de tiempo", - "uptimeUnavailable": "Tiempo de actividad no disponible", - "uptimeLabel": "Tiempo de actividad", - "overviewVersion": "Versión", "overviewUpdate": "Actualizado", - "overviewUpdateLabel": "Actualizar", - "overviewUpdateAvailable": "Actualización disponible", - "overviewDatabase": "Base de datos", - "overviewUptime": "Tiempo de actividad", - "noHosts": "Sin hosts configurados", - "hostGridHosts": "Hosts", - "hostGridAllHint": "Dejar vacío para mostrar todos los hosts", - "columns": "Columnas", - "showIp": "Mostrar dirección IP", "connectionType": "Tipo de conexión", - "layout": "Diseño", - "showStatus": "Mostrar estado", "showHostName": "Mostrar nombre de host", "noDockerActivity": "Sin actividad de Docker", - "noActivity": "Sin actividad", "showAcknowledged": "Mostrar reconocidos", "widgetMetricsChartName": "Gráfico de métricas", "widgetMetricsChartDesc": "Gráfico histórico de CPU, memoria, disco o red para un host", "widgetHostGridName": "Cuadrícula de hosts", "widgetHostGridDesc": "Vista en cuadrícula de los estados de los hosts SSH", - "widgetPingStatusName": "Estado de ping", "widgetPingStatusDesc": "Estado de ping HTTP para una o más URLs", - "widgetRecentActivityName": "Actividad reciente", "widgetRecentActivityDesc": "Feed desplazable de actividad reciente de Termix", "widgetTermixUptimeName": "Tiempo de actividad de Termix", "widgetTermixUptimeDesc": "Contador en tiempo real del tiempo de actividad del servidor Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Botones de atajo de búsqueda rápida con entrada inline", "widgetLinkTreeName": "Árbol de enlaces", "widgetLinkTreeDesc": "Secciones agrupadas de enlaces con encabezados", - "calMon": "Lu", - "calTue": "Ma", - "calWed": "Mi", - "calThu": "Ju", - "calFri": "Vi", - "calSat": "Sa", - "calSun": "Do", - "startOnMonday": "Comenzar la semana el lunes", - "countdownNoDate": "No se ha fijado una fecha objetivo", - "countdownPast": "El evento ya ha pasado", - "countdownDays": "días", - "countdownHours": "h", - "countdownMinutes": "min", - "countdownSeconds": "s", - "countdownLabel": "Etiqueta", - "countdownLabelPlaceholder": "p. ej. Día de lanzamiento", - "countdownShowDays": "Mostrar días", - "countdownShowHours": "Mostrar horas", - "targetDate": "Fecha objetivo", - "searchEngine": "Motor de búsqueda", - "customSearchUrl": "URL de búsqueda personalizada", - "searchPlaceholder": "Buscar...", - "searchGo": "Ir", - "searchPlaceholderLabel": "Texto del marcador de posición", - "searchPlaceholderHint": "Texto mostrado dentro del campo de búsqueda", - "openInNewTab": "Abrir en nueva pestaña", - "searchQueryPlaceholder": "Introducir consulta...", - "noSearchShortcuts": "No hay accesos directos configurados", - "addSearchShortcut": "Añadir acceso directo", - "fontSize": "Tamaño de fuente", - "textAlign": "Alineación del texto", - "fontWeight": "Grosor de la fuente", - "clearColor": "Limpiar color", - "imageFit": "Ajuste de imagen", - "imageLinkUrl": "URL del enlace", - "noImage": "No se ha establecido una URL de imagen", - "altText": "Texto alternativo", - "altTextPlaceholder": "Describir la imagen", - "renderMarkdown": "Procesar Markdown", - "displayMode": "Modo de visualización", - "displayField": "Campo de visualización", - "jsonPath": "Ruta JSON", - "customApiLabel": "Etiqueta", - "customApiLabelPlaceholder": "p. ej. Temperatura", - "customApiUnit": "Unidad", - "customApiNoUrl": "No se ha configurado ninguna URL de API", - "customApiError": "Error al obtener", - "customApiNotArray": "La respuesta no es un array", - "addService": "Añadir servicio", - "showLabels": "Mostrar etiquetas", - "iconSize": "Tamaño del icono", - "noDashboardLinks": "Sin enlaces de panel configurados", - "noLimit": "Sin límite", - "sectionHeading": "Encabezado de sección", - "addSection": "Añadir sección", - "compactMode": "Modo compacto", "showDetailed": "Mostrar detallado", - "selectHosts": "Seleccionar hosts", "allHosts": "Todos los hosts", - "listLayout": "Lista", - "gridLayout": "Cuadrícula", "terminal": "Terminal", "files": "Archivos", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Color de acento", "widgetSshTerminalName": "Terminal SSH", "widgetSshTerminalDesc": "Un terminal SSH integrado conectado a un host configurado", - "sshTerminalNoHost": "Sin host configurado", - "sshTerminalConnect": "Conectar", - "sshTerminalAutoConnect": "Conectar automáticamente al cargar", "widgetQuickConnectName": "Conexión rápida", "widgetQuickConnectDesc": "Botones de inicio con un clic para cualquier tipo de conexión en tus hosts", - "connectionTypes": "Tipos de conexión", "connType_terminal": "Terminal", "connType_files": "Gestor de archivos", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Renombrar pestaña", "openFileManager": "Abrir gestor de archivos", "dashboard": "Panel de control", - "homepage": "Inicio", "quickConnect": "Conexión rápida", "sshTools": "Herramientas SSH", "history": "Historial", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Estadísticas del servidor", "panelMain": "Principal", "panelSide": "Lateral", - "justNow": "ahora mismo", - "serviceLinks": "Enlaces de servicio", - "homepagePreview": "Vista previa de la página de inicio" + "justNow": "ahora mismo" }, "donation": { "title": "¿Disfrutando de Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Arrastra las tarjetas para reordenar · Arrastra el divisor de columnas para redimensionar las columnas · Arrastra el borde inferior de una tarjeta para cambiar su altura · Arrastra a la papelera para eliminar", "empty": "Vacío", "clear": "Limpiar", - "serviceLinksTitle": "Enlaces de servicio", - "serviceLinksEmpty": "Aún no hay enlaces de servicio", "serviceLinksAddLabel": "Etiqueta", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Añadir", - "serviceLinksLabelPlaceholder": "Mi servicio", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Introduce una dirección web válida", - "serviceLinksAddFailed": "Error al añadir el enlace de servicio", "viewServerDetails": "Ver detalles del servidor" }, "admin": { diff --git a/src/ui/locales/translated/fi_FI.json b/src/ui/locales/translated/fi_FI.json index 02d17a249..fb0d41e98 100644 --- a/src/ui/locales/translated/fi_FI.json +++ b/src/ui/locales/translated/fi_FI.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Avaa vetämällä järjestelläksesi uudelleen" }, "homepage": { - "title": "Etusivu", - "addWidget": "Lisää widget", - "editWidget": "Muokkaa widgetiä", "deleteWidget": "Poistaa", "widgetTypes": "Widget-tyypit", "serviceLink": "Palvelulinkki", @@ -206,116 +203,40 @@ "notes": "Muistiinpanoja", "hostStatus": "Isännän tila", "bookmarkList": "Kirjanmerkit", - "zoomIn": "Lähennä", - "zoomOut": "Loitonna", - "resetView": "Palauta näkymä", - "lockLayout": "Lukituksen asettelu", - "unlockLayout": "Avaa asettelu", - "noWidgets": "Lisää ensimmäinen widget napsauttamalla hiiren kakkospainikkeella tai napsauttamalla +", - "openFullView": "Avaa koko näkymä", - "previewTitle": "Etusivun esikatselu", - "cancel": "Peruuttaa", - "save": "Tallentaa", - "title_label": "Otsikko", - "widgetTitlePlaceholder": "Widgetin otsikko (valinnainen)", - "url": "URL-osoite", - "imageUrl": "Mukautetun kuvan URL-osoite", - "imageUrlHint": "Jätä tyhjäksi, jos haluat käyttää sivuston suosikkikuvaketta automaattisesti", - "showImage": "Näytä kuva", - "description": "Kuvaus", - "color": "Väri", "icon": "Kuvake", "expanded": "Oletusarvoisesti laajennettu", - "timezone": "Aikavyöhyke", - "invalidTimezone": "Virheellinen aikavyöhyke. Käytä IANA-nimeä, kuten Amerikka/New_York", - "showSeconds": "Näytä sekunnit", - "format12h": "12 tunnin", "format24h": "24 tunnin", - "content": "Sisältö", - "backgroundColor": "Taustaväri", "host": "Isäntä", "showMetrics": "Näytä mittarit", - "links": "Linkit", - "addLink": "Lisää linkki", - "linkLabel": "Tarra", "linkUrl": "URL-osoite", "removeLink": "Poistaa", - "categoryLinks": "Linkit", - "categoryInfo": "Tiedot", - "categorySystem": "Järjestelmä", "widgetServiceLinkDesc": "Klikattava laatta, joka linkittää palvelun URL-osoitteeseen", "widgetFolderDesc": "Säiliö toisiinsa liittyvien widgetien ryhmittelyyn", "widgetClockDesc": "Live-kello, jossa on konfiguroitava aikavyöhyke", "widgetNotesDesc": "Markdown-muistiinpano-widget", "widgetHostStatusDesc": "Näyttää reaaliaikaisen suorittimen, muistin ja levyn SSH-isännälle", "widgetBookmarkListDesc": "Pikalinkkien luettelo", - "copyLink": "Kopioi linkki", - "linkCopied": "Linkki kopioitu!", - "location": "Sijainti", - "temperatureUnit": "Lämpötilayksikkö", - "showForecast": "Näytä 3 päivän ennuste", - "scrolling": "Salli vieritys", - "feedUrl": "Syötteen URL-osoite", - "maxItems": "Kohteiden enimmäismäärä", - "showDescription": "Näytä kuvaus", "widgetWeatherName": "Sää", "widgetWeatherDesc": "Live-sää missä tahansa paikassa", "widgetIframeName": "iFrame-upotus", "widgetIframeDesc": "Upota mikä tahansa URL-osoite iframe-kehykseen", - "widgetRssName": "RSS-syöte", "widgetRssDesc": "Näytä RSS- tai Atom-syötteen kohteita", "dragToFolder": "Vedä widgetit tähän tai lisää ne käyttämällä +-merkkiä", "showDisk": "Näytä levyn käyttö", "addToFolder": "Lisää widget kansioon", - "noHostSelected": "Ei valittua isäntää", "selectHost": "Valitse isäntä...", - "displayedMetrics": "Näytetyt mittarit", - "metricCpu": "Suoritin", - "metricMemory": "Muisti", - "metricDisk": "Levy", - "metricUptime": "Käyttöaika", - "metricSystem": "Järjestelmä", - "metricNetwork": "Verkko", - "metricProcesses": "Prosessit", - "categoryMonitoring": "Seuranta", "loading": "Ladataan...", "allClear": "Kaikki selvää", - "noPingUrls": "Ei määritettyjä URL-osoitteita", - "pingLabel": "Tarra", - "addPingUrl": "Lisää URL-osoite", - "showLatency": "Näytä latenssi", - "refreshInterval": "Päivitysväli", - "seconds": "sekuntia", - "filterActivityTypes": "Suodatintyypit", - "filterTypesHint": "Jätä tyhjäksi näyttääksesi kaikki", - "showTimestamp": "Näytä aikaleima", - "uptimeUnavailable": "Käyttöaika ei saatavilla", - "uptimeLabel": "Käyttöaika", - "overviewVersion": "Versio", "overviewUpdate": "Ajan tasalla", - "overviewUpdateLabel": "Päivittää", - "overviewUpdateAvailable": "Päivitys saatavilla", - "overviewDatabase": "Tietokanta", - "overviewUptime": "Käyttöaika", - "noHosts": "Ei määritettyjä isäntiä", - "hostGridHosts": "Isännät", - "hostGridAllHint": "Jätä tyhjäksi, jos haluat näyttää kaikki isännät", - "columns": "Sarakkeet", - "showIp": "Näytä IP-osoite", "connectionType": "Yhteystyyppi", - "layout": "Layout", - "showStatus": "Näytä tila", "showHostName": "Näytä isäntänimi", "noDockerActivity": "Ei Docker-toimintaa", - "noActivity": "Ei toimintaa", "showAcknowledged": "Näytä kuitattu", "widgetMetricsChartName": "Mittarikaavio", "widgetMetricsChartDesc": "Isännän historiallinen suorittimen, muistin, levyn tai verkon kaavio", "widgetHostGridName": "Isäntäverkko", "widgetHostGridDesc": "SSH-isäntätilojen ruudukkonäkymä", - "widgetPingStatusName": "Ping-tila", "widgetPingStatusDesc": "Yhden tai useamman URL-osoitteen HTTP-ping-tila", - "widgetRecentActivityName": "Viimeaikaiset toiminnot", "widgetRecentActivityDesc": "Vieritettävä syöte viimeaikaisesta Termix-toiminnasta", "widgetTermixUptimeName": "Termixin käyttöaika", "widgetTermixUptimeDesc": "Termix-palvelimen reaaliaikainen käyttöaikalaskuri", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Pikahaun pikanäppäimet, joissa on rivikohtainen syöttö", "widgetLinkTreeName": "Linkkipuu", "widgetLinkTreeDesc": "Ryhmitellyt linkkiosiot otsikoineen", - "calMon": "Mo", - "calTue": "Ti", - "calWed": "Me", - "calThu": "To", - "calFri": "Pe", - "calSat": "La", - "calSun": "Su", - "startOnMonday": "Viikko alkaa maanantaina", - "countdownNoDate": "Ei asetettua tavoitepäivämäärää", - "countdownPast": "Tapahtuma on ohi", - "countdownDays": "päivää", - "countdownHours": "tuntia", - "countdownMinutes": "min", - "countdownSeconds": "sek", - "countdownLabel": "Tarra", - "countdownLabelPlaceholder": "esim. julkaisupäivä", - "countdownShowDays": "Näyttelypäivät", - "countdownShowHours": "Näytä aukioloajat", - "targetDate": "Tavoitepäivämäärä", - "searchEngine": "Hakukone", - "customSearchUrl": "Mukautetun haun URL-osoite", - "searchPlaceholder": "Haku...", - "searchGo": "Mennä", - "searchPlaceholderLabel": "Paikkamerkkiteksti", - "searchPlaceholderHint": "Hakusyötteen sisällä näkyvä teksti", - "openInNewTab": "Avaa uudessa välilehdessä", - "searchQueryPlaceholder": "Syötä kysely...", - "noSearchShortcuts": "Ei määritettyjä pikanäppäimiä", - "addSearchShortcut": "Lisää pikakuvake", - "fontSize": "Fonttikoko", - "textAlign": "Tekstin tasaus", - "fontWeight": "Fontin paino", - "clearColor": "Kirkas väri", - "imageFit": "Kuvan sovitus", - "imageLinkUrl": "Linkin URL-osoite", - "noImage": "Kuvan URL-osoitetta ei ole asetettu", - "altText": "Vaihtoehtoinen teksti", - "altTextPlaceholder": "Kuvaile kuvaa", - "renderMarkdown": "Renderöi Markdown", - "displayMode": "Näyttötila", - "displayField": "Näyttökenttä", - "jsonPath": "JSON-polku", - "customApiLabel": "Tarra", - "customApiLabelPlaceholder": "esim. Lämpötila", - "customApiUnit": "Yksikkö", - "customApiNoUrl": "API-URL-osoitetta ei ole määritetty", - "customApiError": "Nouto epäonnistui", - "customApiNotArray": "Vastaus ei ole taulukko", - "addService": "Lisää palvelu", - "showLabels": "Näytä otsikot", - "iconSize": "Kuvakkeen koko", - "noDashboardLinks": "Ei määritettyjä kojelaudan linkkejä", - "noLimit": "Ei rajaa", - "sectionHeading": "Osion otsikko", - "addSection": "Lisää osio", - "compactMode": "Kompakti tila", "showDetailed": "Näytä yksityiskohtainen", - "selectHosts": "Valitse isännät", "allHosts": "Kaikki isännät", - "listLayout": "Lista", - "gridLayout": "Ruudukko", "terminal": "Terminaali", "files": "Tiedostot", "docker": "Satamatyöläinen", @@ -422,12 +284,8 @@ "accentColor": "Korostusväri", "widgetSshTerminalName": "SSH-terminaali", "widgetSshTerminalDesc": "Sisäänrakennettu SSH-pääte, joka on yhdistetty konfiguroituun isäntään", - "sshTerminalNoHost": "Ei määritettyä isäntää", - "sshTerminalConnect": "Yhdistä", - "sshTerminalAutoConnect": "Automaattinen yhteys kuormituksen yhteydessä", "widgetQuickConnectName": "Pikayhteys", "widgetQuickConnectDesc": "Yhden napsautuksen käynnistyspainikkeet mille tahansa yhteystyypille isäntätietokoneissasi", - "connectionTypes": "Yhteystyypit", "connType_terminal": "Terminaali", "connType_files": "Tiedostonhallinta", "connType_docker": "Satamatyöläinen", @@ -685,7 +543,6 @@ "renameTab": "Nimeä välilehti uudelleen", "openFileManager": "Avaa tiedostonhallinta", "dashboard": "Kojelauta", - "homepage": "Etusivu", "quickConnect": "Pikayhteys", "sshTools": "SSH-työkalut", "history": "Historia", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Palvelimen tilastot", "panelMain": "Pääasiallinen", "panelSide": "Sivu", - "justNow": "juuri nyt", - "serviceLinks": "Palvelulinkit", - "homepagePreview": "Etusivun esikatselu" + "justNow": "juuri nyt" }, "donation": { "title": "Pidätkö Termixistä?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Vedä kortteja järjestelläksesi uudelleen · Vedä sarakeväliä muuttaaksesi sarakkeiden kokoa · Vedä kortin alareunaa muuttaaksesi sen korkeutta · Roskakori poistaaksesi", "empty": "Tyhjä", "clear": "Tyhjennä", - "serviceLinksTitle": "Palvelulinkit", - "serviceLinksEmpty": "Ei vielä palvelulinkkejä", "serviceLinksAddLabel": "Tarra", "serviceLinksAddUrl": "URL-osoite", - "serviceLinksAdd": "Lisätä", - "serviceLinksLabelPlaceholder": "Palveluni", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Anna kelvollinen verkko-osoite", - "serviceLinksAddFailed": "Palvelulinkin lisääminen epäonnistui", "viewServerDetails": "Näytä palvelimen tiedot" }, "admin": { diff --git a/src/ui/locales/translated/fr_FR.json b/src/ui/locales/translated/fr_FR.json index 07c25d1d8..df3ed4dba 100644 --- a/src/ui/locales/translated/fr_FR.json +++ b/src/ui/locales/translated/fr_FR.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Déverrouillez et faites glisser pour réorganiser" }, "homepage": { - "title": "Accueil", - "addWidget": "Ajouter un widget", - "editWidget": "Modifier le widget", "deleteWidget": "Supprimer", "widgetTypes": "Types de widgets", "serviceLink": "Lien de service", @@ -206,116 +203,40 @@ "notes": "Notes", "hostStatus": "Statut de l'hôte", "bookmarkList": "Favoris", - "zoomIn": "Zoom avant", - "zoomOut": "Zoom arrière", - "resetView": "Réinitialiser la vue", - "lockLayout": "Verrouiller la disposition", - "unlockLayout": "Déverrouiller la disposition", - "noWidgets": "Faites un clic droit ou cliquez sur + pour ajouter votre premier widget", - "openFullView": "Ouvrir la vue complète", - "previewTitle": "Aperçu de la page d'accueil", - "cancel": "Annuler", - "save": "Enregistrer", - "title_label": "Titre", - "widgetTitlePlaceholder": "Titre du widget (facultatif)", - "url": "URL", - "imageUrl": "URL d'image personnalisée", - "imageUrlHint": "Laissez vide pour utiliser automatiquement le favicon du site", - "showImage": "Afficher l'image", - "description": "Description", - "color": "Couleur", "icon": "Icône", "expanded": "Développé par défaut", - "timezone": "Fuseau horaire", - "invalidTimezone": "Fuseau horaire invalide. Veuillez utiliser un nom IANA tel que America/New_York.", - "showSeconds": "Afficher les secondes", - "format12h": "Format 12 heures", "format24h": "Format 24 heures", - "content": "Contenu", - "backgroundColor": "Couleur d'arrière-plan", "host": "Hôte", "showMetrics": "Afficher les métriques", - "links": "Liens", - "addLink": "Ajouter un lien", - "linkLabel": "Libellé", "linkUrl": "URL", "removeLink": "Supprimer", - "categoryLinks": "Liens", - "categoryInfo": "Info", - "categorySystem": "Système", "widgetServiceLinkDesc": "Une tuile cliquable renvoyant vers une URL de service", "widgetFolderDesc": "Un conteneur pour regrouper des widgets liés", "widgetClockDesc": "Une horloge en temps réel avec fuseau horaire configurable", "widgetNotesDesc": "Un widget de notes Markdown", "widgetHostStatusDesc": "Affiche en direct le CPU, la mémoire et le disque d'un hôte SSH", "widgetBookmarkListDesc": "Une liste de liens rapides", - "copyLink": "Copier le lien", - "linkCopied": "Lien copié !", - "location": "Localisation", - "temperatureUnit": "Unité de température", - "showForecast": "Afficher les prévisions sur 3 jours", - "scrolling": "Autoriser le défilement", - "feedUrl": "URL du flux", - "maxItems": "Nombre max d'éléments", - "showDescription": "Afficher la description", "widgetWeatherName": "Météo", "widgetWeatherDesc": "Météo en direct pour n'importe quel lieu", "widgetIframeName": "Intégration iFrame", "widgetIframeDesc": "Intègre n'importe quelle URL dans une iframe", - "widgetRssName": "Flux RSS", "widgetRssDesc": "Affiche les éléments d'un flux RSS ou Atom", "dragToFolder": "Faites glisser les widgets ici ou utilisez + pour ajouter", "showDisk": "Afficher l'utilisation du disque", "addToFolder": "Ajouter le widget au dossier", - "noHostSelected": "Aucun hôte sélectionné", "selectHost": "Sélectionner un hôte…", - "displayedMetrics": "Métriques affichées", - "metricCpu": "CPU", - "metricMemory": "Mémoire", - "metricDisk": "Disque", - "metricUptime": "Uptime", - "metricSystem": "Système", - "metricNetwork": "Réseau", - "metricProcesses": "Processus", - "categoryMonitoring": "Surveillance", "loading": "Chargement…", "allClear": "Aucune alerte", - "noPingUrls": "Aucune URL configurée", - "pingLabel": "Libellé", - "addPingUrl": "Ajouter une URL", - "showLatency": "Afficher la latence", - "refreshInterval": "Intervalle de rafraîchissement", - "seconds": "secondes", - "filterActivityTypes": "Filtrer les types", - "filterTypesHint": "Laisser vide pour tout afficher", - "showTimestamp": "Afficher l’horodatage", - "uptimeUnavailable": "Uptime non disponible", - "uptimeLabel": "Uptime", - "overviewVersion": "Version", "overviewUpdate": "À jour", - "overviewUpdateLabel": "Mise à jour", - "overviewUpdateAvailable": "Mise à jour disponible", - "overviewDatabase": "Base de données", - "overviewUptime": "Uptime", - "noHosts": "Aucun hôte configuré", - "hostGridHosts": "Hôtes", - "hostGridAllHint": "Laissez vide pour afficher tous les hôtes", - "columns": "Colonnes", - "showIp": "Afficher l'adresse IP", "connectionType": "Type de connexion", - "layout": "Disposition", - "showStatus": "Afficher le statut", "showHostName": "Afficher le nom d'hôte", "noDockerActivity": "Aucune activité Docker", - "noActivity": "Aucune activité", "showAcknowledged": "Afficher les acquittés", "widgetMetricsChartName": "Graphique de métriques", "widgetMetricsChartDesc": "Graphique historique CPU, mémoire, disque ou réseau pour un hôte", "widgetHostGridName": "Grille d'hôtes", "widgetHostGridDesc": "Vue en grille des statuts des hôtes SSH", - "widgetPingStatusName": "Statut du ping", "widgetPingStatusDesc": "Statut du ping HTTP pour une ou plusieurs URL", - "widgetRecentActivityName": "Activité récente", "widgetRecentActivityDesc": "Flux défilant de l'activité récente de Termix", "widgetTermixUptimeName": "Temps de disponibilité de Termix", "widgetTermixUptimeDesc": "Compteur en direct du temps de disponibilité du serveur Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Boutons de raccourci de recherche rapide avec saisie intégrée", "widgetLinkTreeName": "Arborescence de liens", "widgetLinkTreeDesc": "Sections groupées de liens avec des titres", - "calMon": "Lu", - "calTue": "Ma", - "calWed": "Me", - "calThu": "Je", - "calFri": "Ve", - "calSat": "Sa", - "calSun": "Di", - "startOnMonday": "Commencer la semaine le lundi", - "countdownNoDate": "Aucune date cible définie", - "countdownPast": "L'événement est passé", - "countdownDays": "jours", - "countdownHours": "h", - "countdownMinutes": "min", - "countdownSeconds": "s", - "countdownLabel": "Libellé", - "countdownLabelPlaceholder": "ex. : Jour de lancement", - "countdownShowDays": "Afficher les jours", - "countdownShowHours": "Afficher les heures", - "targetDate": "Date cible", - "searchEngine": "Moteur de recherche", - "customSearchUrl": "URL de recherche personnalisée", - "searchPlaceholder": "Rechercher...", - "searchGo": "OK", - "searchPlaceholderLabel": "Texte indicatif", - "searchPlaceholderHint": "Texte affiché dans le champ de recherche", - "openInNewTab": "Ouvrir dans un nouvel onglet", - "searchQueryPlaceholder": "Saisir une requête...", - "noSearchShortcuts": "Aucun raccourci configuré", - "addSearchShortcut": "Ajouter un raccourci", - "fontSize": "Taille de la police", - "textAlign": "Alignement du texte", - "fontWeight": "Graisse de la police", - "clearColor": "Effacer la couleur", - "imageFit": "Ajustement de l'image", - "imageLinkUrl": "URL du lien", - "noImage": "Aucune URL d'image définie", - "altText": "Texte alternatif", - "altTextPlaceholder": "Décrire l'image", - "renderMarkdown": "Rendu Markdown", - "displayMode": "Mode d'affichage", - "displayField": "Champ d'affichage", - "jsonPath": "Chemin JSON", - "customApiLabel": "Étiquette", - "customApiLabelPlaceholder": "ex. : Température", - "customApiUnit": "Unité", - "customApiNoUrl": "Aucune URL d'API configurée", - "customApiError": "Échec de la récupération", - "customApiNotArray": "La réponse n'est pas un tableau", - "addService": "Ajouter un service", - "showLabels": "Afficher les étiquettes", - "iconSize": "Taille des icônes", - "noDashboardLinks": "Aucun lien de tableau de bord configuré", - "noLimit": "Aucune limite", - "sectionHeading": "Titre de la section", - "addSection": "Ajouter une section", - "compactMode": "Mode compact", "showDetailed": "Afficher les détails", - "selectHosts": "Sélectionner les hôtes", "allHosts": "Tous les hôtes", - "listLayout": "Liste", - "gridLayout": "Grille", "terminal": "Terminal", "files": "Fichiers", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Couleur d'accent", "widgetSshTerminalName": "Terminal SSH", "widgetSshTerminalDesc": "Un terminal SSH intégré connecté à un hôte configuré", - "sshTerminalNoHost": "Aucun hôte configuré", - "sshTerminalConnect": "Connecter", - "sshTerminalAutoConnect": "Connexion automatique au chargement", "widgetQuickConnectName": "Connexion rapide", "widgetQuickConnectDesc": "Boutons de lancement en un clic pour tout type de connexion à vos hôtes", - "connectionTypes": "Types de connexion", "connType_terminal": "Terminal", "connType_files": "Gestionnaire de fichiers", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Renommer l'onglet", "openFileManager": "Ouvrir le gestionnaire de fichiers", "dashboard": "Tableau de bord", - "homepage": "Accueil", "quickConnect": "Connexion rapide", "sshTools": "Outils SSH", "history": "Historique", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Statistiques du serveur", "panelMain": "Principal", "panelSide": "Latéral", - "justNow": "à l'instant", - "serviceLinks": "Liens de service", - "homepagePreview": "Aperçu de la page d'accueil" + "justNow": "à l'instant" }, "donation": { "title": "Vous appréciez Termix ?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Faites glisser les cartes pour les réorganiser · Faites glisser le séparateur de colonne pour redimensionner les colonnes · Faites glisser le bord inférieur d’une carte pour redimensionner sa hauteur · Corbeille pour supprimer", "empty": "Vide", "clear": "Effacer", - "serviceLinksTitle": "Liens de service", - "serviceLinksEmpty": "Aucun lien de service pour l’instant", "serviceLinksAddLabel": "Libellé", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Ajouter", - "serviceLinksLabelPlaceholder": "Mon service", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Saisissez une adresse Web valide", - "serviceLinksAddFailed": "Échec de l’ajout du lien de service", "viewServerDetails": "Afficher les détails du serveur" }, "admin": { diff --git a/src/ui/locales/translated/he_IL.json b/src/ui/locales/translated/he_IL.json index b0121f2a1..f35120703 100644 --- a/src/ui/locales/translated/he_IL.json +++ b/src/ui/locales/translated/he_IL.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "גרור כדי לסדר מחדש" }, "homepage": { - "title": "דף הבית", - "addWidget": "הוסף ווידג'ט", - "editWidget": "עריכת ווידג'ט", "deleteWidget": "לִמְחוֹק", "widgetTypes": "סוגי ווידג'טים", "serviceLink": "קישור שירות", @@ -206,116 +203,40 @@ "notes": "הערות", "hostStatus": "סטטוס מארח", "bookmarkList": "סימניות", - "zoomIn": "לְהִתְמַקֵד", - "zoomOut": "התקרבות", - "resetView": "איפוס תצוגה", - "lockLayout": "פריסת נעילה", - "unlockLayout": "נעילת פריסה", - "noWidgets": "לחץ לחיצה ימנית או לחץ על + כדי להוסיף את הווידג'ט הראשון שלך", - "openFullView": "פתח תצוגה מלאה", - "previewTitle": "תצוגה מקדימה של דף הבית", - "cancel": "לְבַטֵל", - "save": "לְהַצִיל", - "title_label": "כּוֹתֶרֶת", - "widgetTitlePlaceholder": "כותרת הווידג'ט (אופציונלי)", - "url": "כתובת אתר", - "imageUrl": "כתובת אתר של תמונה מותאמת אישית", - "imageUrlHint": "השאר ריק כדי להשתמש בסמל האתר באופן אוטומטי", - "showImage": "הצג תמונה", - "description": "תֵאוּר", - "color": "צֶבַע", "icon": "אייקון", "expanded": "מורחב כברירת מחדל", - "timezone": "אזור זמן", - "invalidTimezone": "אזור זמן לא חוקי. השתמש בשם IANA כגון America/New_York", - "showSeconds": "הצג שניות", - "format12h": "12 שעות", "format24h": "24 שעות ביממה", - "content": "תוֹכֶן", - "backgroundColor": "צבע רקע", "host": "מְאָרֵחַ", "showMetrics": "הצג מדדים", - "links": "קישורים", - "addLink": "הוסף קישור", - "linkLabel": "מַדבֵּקָה", "linkUrl": "כתובת אתר", "removeLink": "לְהַסִיר", - "categoryLinks": "קישורים", - "categoryInfo": "מידע", - "categorySystem": "מַעֲרֶכֶת", "widgetServiceLinkDesc": "אריח הניתן ללחיצה המקשר לכתובת URL של שירות", "widgetFolderDesc": "מיכל לקיבוץ ווידג'טים קשורים", "widgetClockDesc": "שעון חי עם אזור זמן הניתן להגדרה", "widgetNotesDesc": "ווידג'ט הערות הנחה", "widgetHostStatusDesc": "מציג את המעבד, הזיכרון והדיסק בזמן אמת עבור מארח SSH", "widgetBookmarkListDesc": "רשימה של קישורים מהירים", - "copyLink": "העתק קישור", - "linkCopied": "קישור הועתק!", - "location": "מִקוּם", - "temperatureUnit": "יחידת טמפרטורה", - "showForecast": "הצג תחזית ל-3 ימים", - "scrolling": "אפשר גלילה", - "feedUrl": "כתובת אתר של הזנה", - "maxItems": "מקסימום פריטים", - "showDescription": "הצג תיאור", "widgetWeatherName": "מֶזֶג אֲוִיר", "widgetWeatherDesc": "מזג אוויר חי לכל מקום", "widgetIframeName": "הטמעת iFrame", "widgetIframeDesc": "הטמע כל כתובת URL ב-iframe", - "widgetRssName": "עדכון RSS", "widgetRssDesc": "הצגת פריטים מפיד RSS או Atom", "dragToFolder": "גררו ווידג'טים לכאן או השתמשו ב-+ כדי להוסיף", "showDisk": "הצג שימוש בדיסק", "addToFolder": "הוסף ווידג'ט לתיקייה", - "noHostSelected": "לא נבחר מארח", "selectHost": "בחר מארח...", - "displayedMetrics": "מדדים מוצגים", - "metricCpu": "מעבד", - "metricMemory": "זֵכֶר", - "metricDisk": "דִיסק", - "metricUptime": "זמן פעולה", - "metricSystem": "מַעֲרֶכֶת", - "metricNetwork": "רֶשֶׁת", - "metricProcesses": "תהליכים", - "categoryMonitoring": "ניטור", "loading": "טְעִינָה...", "allClear": "הכל ברור", - "noPingUrls": "לא הוגדרו כתובות URL", - "pingLabel": "מַדבֵּקָה", - "addPingUrl": "הוסף כתובת URL", - "showLatency": "הצג זמן השהייה", - "refreshInterval": "מרווח רענון", - "seconds": "שניות", - "filterActivityTypes": "סוגי סינון", - "filterTypesHint": "השאר ריק כדי להציג הכל", - "showTimestamp": "הצג חותמת זמן", - "uptimeUnavailable": "זמן פעולה לא זמין", - "uptimeLabel": "זמן פעולה", - "overviewVersion": "גִרְסָה", "overviewUpdate": "מעודכן", - "overviewUpdateLabel": "לְעַדְכֵּן", - "overviewUpdateAvailable": "עדכון זמין", - "overviewDatabase": "מסד נתונים", - "overviewUptime": "זמן פעולה", - "noHosts": "לא הוגדרו מארחים", - "hostGridHosts": "מארחים", - "hostGridAllHint": "השאר ריק כדי להציג את כל המארחים", - "columns": "עמודות", - "showIp": "הצג כתובת IP", "connectionType": "סוג חיבור", - "layout": "מַעֲרָך", - "showStatus": "הצג סטטוס", "showHostName": "הצג שם מארח", "noDockerActivity": "אין פעילות של דוקר", - "noActivity": "אין פעילות", "showAcknowledged": "הצג אישור", "widgetMetricsChartName": "תרשים מדדים", "widgetMetricsChartDesc": "תרשים היסטורי של מעבד, זיכרון, דיסק או רשת עבור מחשב מארח", "widgetHostGridName": "רשת מארחים", "widgetHostGridDesc": "תצוגת רשת של סטטוסי מארח SSH", - "widgetPingStatusName": "סטטוס פינג", "widgetPingStatusDesc": "סטטוס פינג HTTP עבור כתובת URL אחת או יותר", - "widgetRecentActivityName": "פעילות אחרונה", "widgetRecentActivityDesc": "הזנה גלילה של פעילות טרמיקס האחרונה", "widgetTermixUptimeName": "זמן פעילות של טרמיקס", "widgetTermixUptimeDesc": "מונה זמן פעולה בזמן אמת עבור שרת Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "כפתורי קיצור דרך לחיפוש מהיר עם קלט מובנה", "widgetLinkTreeName": "עץ קישורים", "widgetLinkTreeDesc": "מקטעים מקובצים של קישורים עם כותרות", - "calMon": "מו", - "calTue": "טו", - "calWed": "אָנוּ", - "calThu": "ה'", - "calFri": "פר", - "calSat": "סא", - "calSun": "סו", - "startOnMonday": "תחילת השבוע ביום שני", - "countdownNoDate": "לא נקבע תאריך יעד", - "countdownPast": "האירוע עבר", - "countdownDays": "ימים", - "countdownHours": "שעות", - "countdownMinutes": "דקות", - "countdownSeconds": "שניות", - "countdownLabel": "מַדבֵּקָה", - "countdownLabelPlaceholder": "למשל יום ההשקה", - "countdownShowDays": "ימי המופע", - "countdownShowHours": "שעות המופע", - "targetDate": "תאריך יעד", - "searchEngine": "מנוע חיפוש", - "customSearchUrl": "כתובת אתר לחיפוש מותאמת אישית", - "searchPlaceholder": "לְחַפֵּשׂ...", - "searchGo": "לָלֶכֶת", - "searchPlaceholderLabel": "טקסט מציין מיקום", - "searchPlaceholderHint": "טקסט המוצג בתוך קלט החיפוש", - "openInNewTab": "פתח בכרטיסייה חדשה", - "searchQueryPlaceholder": "הזן שאילתה...", - "noSearchShortcuts": "לא הוגדרו קיצורי דרך", - "addSearchShortcut": "הוסף קיצור דרך", - "fontSize": "גודל גופן", - "textAlign": "יישור טקסט", - "fontWeight": "משקל גופן", - "clearColor": "צבע שקוף", - "imageFit": "התאמת תמונה", - "imageLinkUrl": "כתובת אתר של קישור", - "noImage": "לא הוגדרה כתובת URL של תמונה", - "altText": "טקסט חלופי", - "altTextPlaceholder": "תאר את התמונה", - "renderMarkdown": "רינדור סימון למטה", - "displayMode": "מצב תצוגה", - "displayField": "שדה תצוגה", - "jsonPath": "נתיב JSON", - "customApiLabel": "מַדבֵּקָה", - "customApiLabelPlaceholder": "לדוגמה טמפרטורה", - "customApiUnit": "יְחִידָה", - "customApiNoUrl": "לא הוגדרה כתובת URL של API", - "customApiError": "נכשלה האחזור", - "customApiNotArray": "התגובה אינה מערך", - "addService": "הוסף שירות", - "showLabels": "הצג תוויות", - "iconSize": "גודל סמל", - "noDashboardLinks": "לא הוגדרו קישורי לוח מחוונים", - "noLimit": "אין הגבלה", - "sectionHeading": "כותרת סעיף", - "addSection": "הוסף מדור", - "compactMode": "מצב קומפקטי", "showDetailed": "הצג פרטים", - "selectHosts": "בחר מארחים", "allHosts": "כל המארחים", - "listLayout": "רְשִׁימָה", - "gridLayout": "רֶשֶׁת", "terminal": "מָסוֹף", "files": "קבצים", "docker": "דוקר", @@ -422,12 +284,8 @@ "accentColor": "צבע מבטא", "widgetSshTerminalName": "מסוף SSH", "widgetSshTerminalDesc": "מסוף SSH מובנה המחובר למארח מוגדר", - "sshTerminalNoHost": "לא הוגדר מארח", - "sshTerminalConnect": "לְחַבֵּר", - "sshTerminalAutoConnect": "חיבור אוטומטי בעת טעינה", "widgetQuickConnectName": "חיבור מהיר", "widgetQuickConnectDesc": "כפתורי הפעלה בלחיצה אחת עבור כל סוג חיבור בין המארחים שלך", - "connectionTypes": "סוגי חיבור", "connType_terminal": "מָסוֹף", "connType_files": "מנהל הקבצים", "connType_docker": "דוקר", @@ -685,7 +543,6 @@ "renameTab": "שינוי שם הכרטיסייה", "openFileManager": "פתח את מנהל הקבצים", "dashboard": "לוּחַ מַחווָנִים", - "homepage": "דף הבית", "quickConnect": "חיבור מהיר", "sshTools": "כלי SSH", "history": "הִיסטוֹרִיָה", @@ -1895,9 +1752,7 @@ "serverStatsCard": "סטטיסטיקות שרת", "panelMain": "רָאשִׁי", "panelSide": "צַד", - "justNow": "זֶה עַתָה", - "serviceLinks": "קישורי שירות", - "homepagePreview": "תצוגה מקדימה של דף הבית" + "justNow": "זֶה עַתָה" }, "donation": { "title": "נהנים מ-Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "גרור כרטיסים כדי לשנות את הסדר · גרור את מפריד העמודות כדי לשנות את גודל העמודות · גרור את הקצה התחתון של הכרטיס כדי לשנות את גודל הגובה שלו · אשפה כדי להסיר", "empty": "רֵיק", "clear": "בָּרוּר", - "serviceLinksTitle": "קישורי שירות", - "serviceLinksEmpty": "אין עדיין קישורים לשירותים", "serviceLinksAddLabel": "מַדבֵּקָה", "serviceLinksAddUrl": "כתובת אתר", - "serviceLinksAdd": "לְהוֹסִיף", - "serviceLinksLabelPlaceholder": "השירות שלי", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "הזן כתובת אינטרנט חוקית", - "serviceLinksAddFailed": "נכשל הוספת קישור לשירות", "viewServerDetails": "הצג פרטי שרת" }, "admin": { diff --git a/src/ui/locales/translated/hi_IN.json b/src/ui/locales/translated/hi_IN.json index 411de61b9..fe55406fe 100644 --- a/src/ui/locales/translated/hi_IN.json +++ b/src/ui/locales/translated/hi_IN.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "पुनः व्यवस्थित करने के लिए अनलॉक करके ड्रैग करें" }, "homepage": { - "title": "होमपेज", - "addWidget": "विजेट जोड़ें", - "editWidget": "विजेट संपादित करें", "deleteWidget": "डिलीट करें", "widgetTypes": "विजेट प्रकार", "serviceLink": "सेवा लिंक", @@ -206,116 +203,40 @@ "notes": "नोट्स", "hostStatus": "होस्ट स्थिति", "bookmarkList": "बुकमार्क", - "zoomIn": "ज़ूम इन", - "zoomOut": "ज़ूम आउट", - "resetView": "दृश्य रीसेट करें", - "lockLayout": "लेआउट लॉक करें", - "unlockLayout": "लेआउट अनलॉक करें", - "noWidgets": "अपना पहला विजेट जोड़ने के लिए राइट-क्लिक करें या + पर क्लिक करें", - "openFullView": "पूर्ण दृश्य खोलें", - "previewTitle": "होमपेज पूर्वावलोकन", - "cancel": "रद्द करें", - "save": "सहेजें", - "title_label": "शीर्षक", - "widgetTitlePlaceholder": "विजेट शीर्षक (वैकल्पिक)", - "url": "URL", - "imageUrl": "कस्टम इमेज URL", - "imageUrlHint": "साइट फ़ेविकॉन का स्वचालित रूप से उपयोग करने के लिए खाली छोड़ें", - "showImage": "इमेज दिखाएँ", - "description": "विवरण", - "color": "रंग", "icon": "आइकन", "expanded": "डिफ़ॉल्ट रूप से विस्तारित", - "timezone": "समय क्षेत्र", - "invalidTimezone": "समय क्षेत्र अमान्य है। कृपया IANA नाम का उपयोग करें, जैसे कि America/New_York", - "showSeconds": "सेकंड दिखाएँ", - "format12h": "12-घंटे", "format24h": "24-घंटे", - "content": "सामग्री", - "backgroundColor": "पृष्ठभूमि रंग", "host": "होस्ट", "showMetrics": "मेट्रिक्स दिखाएं", - "links": "लिंक", - "addLink": "लिंक जोड़ें", - "linkLabel": "लेबल", "linkUrl": "URL", "removeLink": "हटाएं", - "categoryLinks": "लिंक", - "categoryInfo": "जानकारी", - "categorySystem": "सिस्टम", "widgetServiceLinkDesc": "एक क्लिक करने योग्य टाइल जो सेवा URL से जुड़ता है", "widgetFolderDesc": "संबंधित विजेट को समूहित करने का कंटेनर", "widgetClockDesc": "कॉन्फ़िगर करने योग्य समय क्षेत्र वाली लाइव घड़ी", "widgetNotesDesc": "मार्कडाउन नोट्स विजेट", "widgetHostStatusDesc": "SSH होस्ट के लिए लाइव CPU, मेमोरी और डिस्क दिखाता है", "widgetBookmarkListDesc": "त्वरित लिंक की सूची", - "copyLink": "लिंक कॉपी करें", - "linkCopied": "लिंक कॉपी हो गया!", - "location": "स्थान", - "temperatureUnit": "तापमान इकाई", - "showForecast": "3-दिन का पूर्वानुमान दिखाएं", - "scrolling": "स्क्रॉलिंग की अनुमति दें", - "feedUrl": "फ़ीड URL", - "maxItems": "अधिकतम आइटम", - "showDescription": "विवरण दिखाएं", "widgetWeatherName": "मौसम", "widgetWeatherDesc": "किसी भी स्थान का लाइव मौसम", "widgetIframeName": "iFrame एम्बेड", "widgetIframeDesc": "किसी भी URL को आइफ्रेम में एम्बेड करें", - "widgetRssName": "RSS फ़ीड", "widgetRssDesc": "RSS या एटम फ़ीड से आइटम प्रदर्शित करें", "dragToFolder": "विजेट यहाँ खींचें या + का उपयोग करके जोड़ें", "showDisk": "डिस्क उपयोग दिखाएं", "addToFolder": "फ़ोल्डर में विजेट जोड़ें", - "noHostSelected": "कोई होस्ट चयनित नहीं", "selectHost": "होस्ट चुनें...", - "displayedMetrics": "प्रदर्शित मेट्रिक्स", - "metricCpu": "CPU", - "metricMemory": "मेमोरी", - "metricDisk": "डिस्क", - "metricUptime": "अपटाइम", - "metricSystem": "सिस्टम", - "metricNetwork": "नेटवर्क", - "metricProcesses": "प्रोसेस", - "categoryMonitoring": "निगरानी", "loading": "लोड हो रहा है...", "allClear": "सब ठीक है", - "noPingUrls": "कोई URL कॉन्फ़िगर नहीं किया गया", - "pingLabel": "लेबल", - "addPingUrl": "URL जोड़ें", - "showLatency": "लेटेंसी दिखाएं", - "refreshInterval": "रीफ़्रेश अंतराल", - "seconds": "सेकंड", - "filterActivityTypes": "प्रकार फ़िल्टर करें", - "filterTypesHint": "सभी दिखाने के लिए खाली छोड़ें", - "showTimestamp": "टाइमस्टैम्प दिखाएं", - "uptimeUnavailable": "अपटाइम अनुपलब्ध", - "uptimeLabel": "अपटाइम", - "overviewVersion": "संस्करण", "overviewUpdate": "अद्यतित", - "overviewUpdateLabel": "अद्यतन", - "overviewUpdateAvailable": "अपडेट उपलब्ध है", - "overviewDatabase": "डेटाबेस", - "overviewUptime": "अपटाइम", - "noHosts": "कोई होस्ट कॉन्फ़िगर नहीं किए गए", - "hostGridHosts": "होस्ट", - "hostGridAllHint": "सभी होस्ट दिखाने के लिए खाली छोड़ें", - "columns": "कॉलम", - "showIp": "IP पता दिखाएं", "connectionType": "कनेक्शन प्रकार", - "layout": "लेआउट", - "showStatus": "स्थिति दिखाएं", "showHostName": "होस्ट का नाम दिखाएं", "noDockerActivity": "कोई Docker गतिविधि नहीं", - "noActivity": "कोई गतिविधि नहीं", "showAcknowledged": "स्वीकृत दिखाएं", "widgetMetricsChartName": "मीट्रिक चार्ट", "widgetMetricsChartDesc": "होस्ट के लिए ऐतिहासिक CPU, मेमोरी, डिस्क या नेटवर्क चार्ट", "widgetHostGridName": "होस्ट ग्रिड", "widgetHostGridDesc": "SSH होस्ट की स्थितियों का ग्रिड दृश्य", - "widgetPingStatusName": "पिंग स्थिति", "widgetPingStatusDesc": "एक या अधिक URLs के लिए HTTP पिंग स्थिति", - "widgetRecentActivityName": "हाल की गतिविधि", "widgetRecentActivityDesc": "Termix की हाल की गतिविधियों का स्क्रॉल करने योग्य फीड", "widgetTermixUptimeName": "Termix अपटाइम", "widgetTermixUptimeDesc": "Termix सर्वर के लिए लाइव अपटाइम काउंटर", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "इनलाइन इनपुट के साथ त्वरित खोज शॉर्टकट बटन", "widgetLinkTreeName": "लिंक ट्री", "widgetLinkTreeDesc": "शीर्षकों के साथ लिंक के समूहीकृत अनुभाग", - "calMon": "सोम", - "calTue": "मंगल", - "calWed": "बुध", - "calThu": "गुरु", - "calFri": "शुक्र", - "calSat": "शनि", - "calSun": "रवि", - "startOnMonday": "सप्ताह सोमवार से शुरू करें", - "countdownNoDate": "कोई लक्ष्य तिथि निर्धारित नहीं", - "countdownPast": "ईवेंट बीत चुका है", - "countdownDays": "दिन", - "countdownHours": "घंटे", - "countdownMinutes": "मिनट", - "countdownSeconds": "सेकंड", - "countdownLabel": "लेबल", - "countdownLabelPlaceholder": "उदा. लॉन्च दिवस", - "countdownShowDays": "दिन दिखाएं", - "countdownShowHours": "घंटे दिखाएं", - "targetDate": "लक्ष्य तिथि", - "searchEngine": "खोज इंजन", - "customSearchUrl": "कस्टम खोज URL", - "searchPlaceholder": "खोजें...", - "searchGo": "जाएं", - "searchPlaceholderLabel": "प्लेसहोल्डर टेक्स्ट", - "searchPlaceholderHint": "खोज इनपुट के अंदर दिखाया जाने वाला पाठ", - "openInNewTab": "नए टैब में खोलें", - "searchQueryPlaceholder": "क्वेरी दर्ज करें...", - "noSearchShortcuts": "कोई शॉर्टकट कॉन्फ़िगर नहीं है", - "addSearchShortcut": "शॉर्टकट जोड़ें", - "fontSize": "फ़ॉन्ट आकार", - "textAlign": "पाठ संरेखण", - "fontWeight": "फ़ॉन्ट मोटाई", - "clearColor": "रंग साफ़ करें", - "imageFit": "छवि फ़िट", - "imageLinkUrl": "लिंक URL", - "noImage": "कोई छवि URL सेट नहीं है", - "altText": "Alt टेक्स्ट", - "altTextPlaceholder": "छवि का विवरण दें", - "renderMarkdown": "मार्कडाउन रेंडर करें", - "displayMode": "प्रदर्शन मोड", - "displayField": "प्रदर्शन फ़ील्ड", - "jsonPath": "JSON पथ", - "customApiLabel": "लेबल", - "customApiLabelPlaceholder": "उदा. तापमान", - "customApiUnit": "इकाई", - "customApiNoUrl": "कोई API URL कॉन्फ़िगर नहीं है", - "customApiError": "फ़ेच करने में विफल", - "customApiNotArray": "प्रतिक्रिया एक ऐरे नहीं है", - "addService": "सेवा जोड़ें", - "showLabels": "लेबल दिखाएं", - "iconSize": "आइकन का आकार", - "noDashboardLinks": "कोई डैशबोर्ड लिंक कॉन्फ़िगर नहीं किया गया", - "noLimit": "कोई सीमा नहीं", - "sectionHeading": "अनुभाग शीर्षक", - "addSection": "अनुभाग जोड़ें", - "compactMode": "संक्षिप्त मोड", "showDetailed": "विस्तृत दिखाएं", - "selectHosts": "होस्ट चुनें", "allHosts": "सभी होस्ट", - "listLayout": "सूची", - "gridLayout": "ग्रिड", "terminal": "टर्मिनल", "files": "फ़ाइलें", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "एक्सेंट रंग", "widgetSshTerminalName": "SSH टर्मिनल", "widgetSshTerminalDesc": "कॉन्फ़िगर किए गए होस्ट से जुड़ा एक इनलाइन SSH टर्मिनल", - "sshTerminalNoHost": "कोई होस्ट कॉन्फ़िगर नहीं किया गया", - "sshTerminalConnect": "कनेक्ट करें", - "sshTerminalAutoConnect": "लोड पर स्वतः कनेक्ट", "widgetQuickConnectName": "त्वरित कनेक्ट", "widgetQuickConnectDesc": "आपके होस्ट पर किसी भी कनेक्शन प्रकार के लिए एक-क्लिक लॉन्च बटन", - "connectionTypes": "कनेक्शन प्रकार", "connType_terminal": "टर्मिनल", "connType_files": "फ़ाइल प्रबंधक", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "टैब का नाम बदलें", "openFileManager": "फ़ाइल प्रबंधक खोलें", "dashboard": "डैशबोर्ड", - "homepage": "होमपेज", "quickConnect": "त्वरित कनेक्ट", "sshTools": "SSH टूल्स", "history": "इतिहास", @@ -1895,9 +1752,7 @@ "serverStatsCard": "सर्वर आँकड़े", "panelMain": "मुख्य", "panelSide": "साइड", - "justNow": "अभी-अभी", - "serviceLinks": "सेवा लिंक", - "homepagePreview": "मुखपृष्ठ पूर्वावलोकन" + "justNow": "अभी-अभी" }, "donation": { "title": "टर्मिक्स का आनंद ले रहे हैं?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "कार्ड्स को पुन: क्रमित करने के लिए खींचें · कॉलम का आकार बदलने के लिए कॉलम विभाजक को खींचें · कार्ड की ऊंचाई बदलने के लिए उसके निचले किनारे को खींचें · हटाने के लिए ट्रैश में डालें", "empty": "खाली", "clear": "साफ़ करें", - "serviceLinksTitle": "सर्विस लिंक्स", - "serviceLinksEmpty": "अभी तक कोई सर्विस लिंक नहीं", "serviceLinksAddLabel": "लेबल", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "जोड़ें", - "serviceLinksLabelPlaceholder": "मेरी सर्विस", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "एक मान्य वेब पता दर्ज करें", - "serviceLinksAddFailed": "सर्विस लिंक जोड़ने में विफल", "viewServerDetails": "सर्वर विवरण देखें" }, "admin": { diff --git a/src/ui/locales/translated/hu_HU.json b/src/ui/locales/translated/hu_HU.json index 8aebb0cbc..65dedd963 100644 --- a/src/ui/locales/translated/hu_HU.json +++ b/src/ui/locales/translated/hu_HU.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Húzással átrendezhető" }, "homepage": { - "title": "Kezdőlap", - "addWidget": "Widget hozzáadása", - "editWidget": "Widget szerkesztése", "deleteWidget": "Töröl", "widgetTypes": "Widget típusok", "serviceLink": "Szolgáltatási hivatkozás", @@ -206,116 +203,40 @@ "notes": "Megjegyzések", "hostStatus": "Gazdagép állapota", "bookmarkList": "Könyvjelzők", - "zoomIn": "Nagyítás", - "zoomOut": "Kicsinyítés", - "resetView": "Nézet visszaállítása", - "lockLayout": "Zár elrendezése", - "unlockLayout": "Elrendezés feloldása", - "noWidgets": "Kattintson jobb gombbal, vagy kattintson a + ikonra az első widget hozzáadásához", - "openFullView": "Teljes nézet megnyitása", - "previewTitle": "Kezdőlap előnézete", - "cancel": "Mégsem", - "save": "Megtakarítás", - "title_label": "Cím", - "widgetTitlePlaceholder": "Widget címe (opcionális)", - "url": "URL-cím", - "imageUrl": "Egyéni kép URL-címe", - "imageUrlHint": "Hagyja üresen a webhely faviconjának automatikus használatához", - "showImage": "Kép megjelenítése", - "description": "Leírás", - "color": "Szín", "icon": "Ikon", "expanded": "Alapértelmezés szerint kibontva", - "timezone": "Időzóna", - "invalidTimezone": "Érvénytelen időzóna. Használjon IANA nevet, például Amerika/New_York", - "showSeconds": "Másodpercek megjelenítése", - "format12h": "12 órás", "format24h": "24 órás", - "content": "Tartalom", - "backgroundColor": "Háttérszín", "host": "Házigazda", "showMetrics": "Metrikák megjelenítése", - "links": "Linkek", - "addLink": "Link hozzáadása", - "linkLabel": "Címke", "linkUrl": "URL-cím", "removeLink": "Eltávolítás", - "categoryLinks": "Linkek", - "categoryInfo": "Információ", - "categorySystem": "Rendszer", "widgetServiceLinkDesc": "Egy kattintható csempe, amely egy szolgáltatás URL-címére mutat", "widgetFolderDesc": "Egy tároló a kapcsolódó widgetek csoportosításához", "widgetClockDesc": "Élő óra konfigurálható időzónával", "widgetNotesDesc": "Egy Markdown jegyzetek widget", "widgetHostStatusDesc": "Élő CPU, memória és lemezterület megjelenítése egy SSH hoszton", "widgetBookmarkListDesc": "Gyorslinkek listája", - "copyLink": "Link másolása", - "linkCopied": "Link másolva!", - "location": "Elhelyezkedés", - "temperatureUnit": "Hőmérséklet egység", - "showForecast": "3 napos előrejelzés megjelenítése", - "scrolling": "Görgetés engedélyezése", - "feedUrl": "Hírcsatorna URL-címe", - "maxItems": "Max. tételek", - "showDescription": "Leírás megjelenítése", "widgetWeatherName": "Időjárás", "widgetWeatherDesc": "Élő időjárás bármely helyszínre", "widgetIframeName": "iFrame beágyazás", "widgetIframeDesc": "Bármely URL beágyazása iframe-be", - "widgetRssName": "RSS-hírcsatorna", "widgetRssDesc": "RSS- vagy Atom-hírcsatorna elemeinek megjelenítése", "dragToFolder": "Húzd ide a widgeteket, vagy használd a + jelet a hozzáadáshoz", "showDisk": "Lemezhasználat megjelenítése", "addToFolder": "Widget hozzáadása mappához", - "noHostSelected": "Nincs kiválasztva gazdagép", "selectHost": "Válasszon egy hosztot...", - "displayedMetrics": "Megjelenített mutatók", - "metricCpu": "CPU", - "metricMemory": "Memória", - "metricDisk": "Korong", - "metricUptime": "Üzemidő", - "metricSystem": "Rendszer", - "metricNetwork": "Hálózat", - "metricProcesses": "Folyamatok", - "categoryMonitoring": "Monitoring", "loading": "Terhelés...", "allClear": "Minden tiszta", - "noPingUrls": "Nincsenek konfigurált URL-ek", - "pingLabel": "Címke", - "addPingUrl": "URL hozzáadása", - "showLatency": "Késleltetés megjelenítése", - "refreshInterval": "Frissítési intervallum", - "seconds": "másodperc", - "filterActivityTypes": "Szűrőtípusok", - "filterTypesHint": "Hagyja üresen az összes megjelenítéséhez", - "showTimestamp": "Időbélyeg megjelenítése", - "uptimeUnavailable": "Üzemidő nem elérhető", - "uptimeLabel": "Üzemidő", - "overviewVersion": "Változat", "overviewUpdate": "Naprakész", - "overviewUpdateLabel": "Frissítés", - "overviewUpdateAvailable": "Frissítés elérhető", - "overviewDatabase": "Adatbázis", - "overviewUptime": "Üzemidő", - "noHosts": "Nincsenek konfigurált gazdagépek", - "hostGridHosts": "Házigazdák", - "hostGridAllHint": "Hagyja üresen az összes hoszt megjelenítéséhez", - "columns": "Oszlopok", - "showIp": "IP-cím megjelenítése", "connectionType": "Kapcsolat típusa", - "layout": "Elrendezés", - "showStatus": "Állapot megjelenítése", "showHostName": "Gazdagép nevének megjelenítése", "noDockerActivity": "Nincs Docker-tevékenység", - "noActivity": "Nincs aktivitás", "showAcknowledged": "Elismert megjelenítése", "widgetMetricsChartName": "Metrikadiagram", "widgetMetricsChartDesc": "Egy gazdagép CPU-, memória-, lemez- vagy hálózati előzménydiagramja", "widgetHostGridName": "Host Grid", "widgetHostGridDesc": "SSH-gazdagépek állapotainak rácsnézete", - "widgetPingStatusName": "Ping állapot", "widgetPingStatusDesc": "HTTP ping állapot egy vagy több URL-hez", - "widgetRecentActivityName": "Legutóbbi tevékenységek", "widgetRecentActivityDesc": "Görgethető hírfolyam a legutóbbi Termix-tevékenységekről", "widgetTermixUptimeName": "Termix üzemidő", "widgetTermixUptimeDesc": "Élő üzemidő-számláló a Termix szerverhez", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Gyorskeresési parancsikonok beágyazott beviteli lehetőséggel", "widgetLinkTreeName": "Linkfa", "widgetLinkTreeDesc": "Csoportosított linkek címsorokkal", - "calMon": "Mo", - "calTue": "Kedd", - "calWed": "Mi", - "calThu": "Cs", - "calFri": "Péntek", - "calSat": "Sa", - "calSun": "Su", - "startOnMonday": "Hétfőn kezdjük a hetet", - "countdownNoDate": "Nincs kitűzött céldátum", - "countdownPast": "Az esemény elmúlt", - "countdownDays": "napok", - "countdownHours": "óra", - "countdownMinutes": "perc", - "countdownSeconds": "másodperc", - "countdownLabel": "Címke", - "countdownLabelPlaceholder": "pl. Indítási nap", - "countdownShowDays": "Kiállítási napok", - "countdownShowHours": "Nyitvatartási idő megjelenítése", - "targetDate": "Céldátum", - "searchEngine": "Keresőmotor", - "customSearchUrl": "Egyéni keresési URL", - "searchPlaceholder": "Keresés...", - "searchGo": "Megy", - "searchPlaceholderLabel": "Helyőrző szöveg", - "searchPlaceholderHint": "A keresési mezőben megjelenített szöveg", - "openInNewTab": "Megnyitás új lapon", - "searchQueryPlaceholder": "Írja be a lekérdezést...", - "noSearchShortcuts": "Nincsenek konfigurált gyorsbillentyűk", - "addSearchShortcut": "Parancsikon hozzáadása", - "fontSize": "Betűméret", - "textAlign": "Szöveg igazítása", - "fontWeight": "Betűvastagság", - "clearColor": "Tiszta szín", - "imageFit": "Kép illesztése", - "imageLinkUrl": "Link URL-címe", - "noImage": "Nincs beállítva kép URL-címe", - "altText": "Alt szöveg", - "altTextPlaceholder": "Írd le a képet", - "renderMarkdown": "Markdown renderelés", - "displayMode": "Kijelző mód", - "displayField": "Kijelző mező", - "jsonPath": "JSON-útvonal", - "customApiLabel": "Címke", - "customApiLabelPlaceholder": "pl. hőmérséklet", - "customApiUnit": "Egység", - "customApiNoUrl": "Nincs konfigurálva API URL", - "customApiError": "Nem sikerült lekérni", - "customApiNotArray": "A válasz nem tömb", - "addService": "Szolgáltatás hozzáadása", - "showLabels": "Címkék megjelenítése", - "iconSize": "Ikonméret", - "noDashboardLinks": "Nincsenek konfigurált irányítópult-hivatkozások", - "noLimit": "Nincs korlát", - "sectionHeading": "Szakasz címsora", - "addSection": "Szakasz hozzáadása", - "compactMode": "Kompakt mód", "showDetailed": "Részletes megjelenítése", - "selectHosts": "Válasszon hosztokat", "allHosts": "Minden házigazda", - "listLayout": "Lista", - "gridLayout": "Rács", "terminal": "Terminál", "files": "Fájlok", "docker": "Dokkmunkás", @@ -422,12 +284,8 @@ "accentColor": "hangsúlyos szín", "widgetSshTerminalName": "SSH terminál", "widgetSshTerminalDesc": "Egy beágyazott SSH terminál, amely egy konfigurált gazdagéphez csatlakozik", - "sshTerminalNoHost": "Nincs konfigurálva gazdagép", - "sshTerminalConnect": "Csatlakozás", - "sshTerminalAutoConnect": "Automatikus csatlakozás terheléskor", "widgetQuickConnectName": "Gyors csatlakozás", "widgetQuickConnectDesc": "Egy kattintásos indítógombok bármilyen kapcsolattípushoz a hosztokon keresztül", - "connectionTypes": "Kapcsolattípusok", "connType_terminal": "Terminál", "connType_files": "Fájlkezelő", "connType_docker": "Dokkmunkás", @@ -685,7 +543,6 @@ "renameTab": "Fül átnevezése", "openFileManager": "Fájlkezelő megnyitása", "dashboard": "Műszerfal", - "homepage": "Kezdőlap", "quickConnect": "Gyors csatlakozás", "sshTools": "SSH eszközök", "history": "Történelem", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Szerver statisztikák", "panelMain": "Fő", "panelSide": "Oldal", - "justNow": "éppen most", - "serviceLinks": "Szolgáltatási linkek", - "homepagePreview": "Kezdőlap előnézete" + "justNow": "éppen most" }, "donation": { "title": "Élvezed a Termixet?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Kártyák húzásával átrendezheted a sorrendet · Az oszlopelválasztó húzásával átméretezheted az oszlopokat · A kártya alsó szélének húzásával átméretezheted a magasságát · A kukába helyezéssel eltávolíthatod", "empty": "Üres", "clear": "Világos", - "serviceLinksTitle": "Szolgáltatási linkek", - "serviceLinksEmpty": "Még nincsenek szolgáltatáslinkek", "serviceLinksAddLabel": "Címke", "serviceLinksAddUrl": "URL-cím", - "serviceLinksAdd": "Hozzáadás", - "serviceLinksLabelPlaceholder": "Szolgáltatásom", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Adjon meg egy érvényes webcímet", - "serviceLinksAddFailed": "Nem sikerült hozzáadni a szolgáltatás linkjét", "viewServerDetails": "Szerver részleteinek megtekintése" }, "admin": { diff --git a/src/ui/locales/translated/id_ID.json b/src/ui/locales/translated/id_ID.json index 4065a0c4f..63de718d9 100644 --- a/src/ui/locales/translated/id_ID.json +++ b/src/ui/locales/translated/id_ID.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Buka kunci dengan menyeret untuk mengatur ulang" }, "homepage": { - "title": "Beranda", - "addWidget": "Tambahkan Widget", - "editWidget": "Edit Widget", "deleteWidget": "Menghapus", "widgetTypes": "Jenis Widget", "serviceLink": "Tautan Layanan", @@ -206,116 +203,40 @@ "notes": "Catatan", "hostStatus": "Status Host", "bookmarkList": "Penanda buku", - "zoomIn": "Perbesar", - "zoomOut": "Perkecil tampilan", - "resetView": "Atur Ulang Tampilan", - "lockLayout": "Tata Letak Kunci", - "unlockLayout": "Buka Tata Letak", - "noWidgets": "Klik kanan atau klik + untuk menambahkan widget pertama Anda.", - "openFullView": "Buka Tampilan Penuh", - "previewTitle": "Pratinjau Halaman Utama", - "cancel": "Membatalkan", - "save": "Menyimpan", - "title_label": "Judul", - "widgetTitlePlaceholder": "Judul widget (opsional)", - "url": "URL", - "imageUrl": "URL Gambar Kustom", - "imageUrlHint": "Biarkan kosong untuk menggunakan favicon situs secara otomatis.", - "showImage": "Tampilkan Gambar", - "description": "Keterangan", - "color": "Warna", "icon": "Ikon", "expanded": "Diperluas secara default", - "timezone": "Zona waktu", - "invalidTimezone": "Zona waktu tidak valid. Gunakan nama IANA seperti America/New_York.", - "showSeconds": "Tampilkan detik", - "format12h": "12 jam", "format24h": "24 jam", - "content": "Isi", - "backgroundColor": "Warna Latar Belakang", "host": "Tuan rumah", "showMetrics": "Tampilkan Metrik", - "links": "Tautan", - "addLink": "Tambahkan Tautan", - "linkLabel": "Label", "linkUrl": "URL", "removeLink": "Menghapus", - "categoryLinks": "Tautan", - "categoryInfo": "Informasi", - "categorySystem": "Sistem", "widgetServiceLinkDesc": "Ubin yang dapat diklik yang mengarah ke URL layanan.", "widgetFolderDesc": "Sebuah wadah untuk mengelompokkan widget yang terkait.", "widgetClockDesc": "Jam digital dengan zona waktu yang dapat dikonfigurasi.", "widgetNotesDesc": "Widget catatan markdown", "widgetHostStatusDesc": "Menampilkan penggunaan CPU, memori, dan disk secara langsung untuk host SSH.", "widgetBookmarkListDesc": "Daftar tautan cepat", - "copyLink": "Salin Tautan", - "linkCopied": "Tautan berhasil disalin!", - "location": "Lokasi", - "temperatureUnit": "Satuan Suhu", - "showForecast": "Tampilkan ramalan cuaca 3 hari ke depan", - "scrolling": "Izinkan Pengguliran", - "feedUrl": "URL Umpan", - "maxItems": "Jumlah Item Maksimum", - "showDescription": "Tampilkan Deskripsi", "widgetWeatherName": "Cuaca", "widgetWeatherDesc": "Informasi cuaca terkini untuk lokasi mana pun.", "widgetIframeName": "Penyematan iFrame", "widgetIframeDesc": "Sematkan URL apa pun di dalam iframe.", - "widgetRssName": "Umpan RSS", "widgetRssDesc": "Menampilkan item dari feed RSS atau Atom.", "dragToFolder": "Seret widget ke sini atau gunakan tanda + untuk menambahkan", "showDisk": "Tampilkan Penggunaan Disk", "addToFolder": "Tambahkan widget ke folder", - "noHostSelected": "Tidak ada pembawa acara yang dipilih.", "selectHost": "Pilih tuan rumah...", - "displayedMetrics": "Metrik yang Ditampilkan", - "metricCpu": "CPU", - "metricMemory": "Ingatan", - "metricDisk": "Disk", - "metricUptime": "Waktu aktif", - "metricSystem": "Sistem", - "metricNetwork": "Jaringan", - "metricProcesses": "Proses", - "categoryMonitoring": "Pemantauan", "loading": "Memuat...", "allClear": "Semuanya aman.", - "noPingUrls": "Tidak ada URL yang dikonfigurasi", - "pingLabel": "Label", - "addPingUrl": "Tambahkan URL", - "showLatency": "Tampilkan Latensi", - "refreshInterval": "Interval Penyegaran", - "seconds": "detik", - "filterActivityTypes": "Jenis Filter", - "filterTypesHint": "Biarkan kosong untuk menampilkan semua", - "showTimestamp": "Tampilkan Cap Waktu", - "uptimeUnavailable": "Waktu aktif tidak tersedia", - "uptimeLabel": "Waktu aktif", - "overviewVersion": "Versi", "overviewUpdate": "Terkini", - "overviewUpdateLabel": "Memperbarui", - "overviewUpdateAvailable": "Pembaruan tersedia", - "overviewDatabase": "Basis data", - "overviewUptime": "Waktu aktif", - "noHosts": "Tidak ada host yang dikonfigurasi.", - "hostGridHosts": "Tuan rumah", - "hostGridAllHint": "Biarkan kosong untuk menampilkan semua host", - "columns": "Kolom", - "showIp": "Tampilkan Alamat IP", "connectionType": "Jenis Koneksi", - "layout": "Tata Letak", - "showStatus": "Tampilkan Status", "showHostName": "Nama Pembawa Acara", "noDockerActivity": "Tidak ada aktivitas Docker", - "noActivity": "Tidak ada kegiatan", "showAcknowledged": "Pertunjukan Diterima", "widgetMetricsChartName": "Bagan Metrik", "widgetMetricsChartDesc": "Grafik historis CPU, memori, disk, atau jaringan untuk sebuah host.", "widgetHostGridName": "Jaringan Host", "widgetHostGridDesc": "Tampilan grid status host SSH", - "widgetPingStatusName": "Status Ping", "widgetPingStatusDesc": "Status ping HTTP untuk satu atau lebih URL", - "widgetRecentActivityName": "Aktivitas Terkini", "widgetRecentActivityDesc": "Tampilan aktivitas Termix terkini yang dapat digulir.", "widgetTermixUptimeName": "Waktu Operasional Termix", "widgetTermixUptimeDesc": "Penghitung waktu aktif langsung untuk server Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Tombol pintasan pencarian cepat dengan input sebaris", "widgetLinkTreeName": "Pohon Tautan", "widgetLinkTreeDesc": "Bagian-bagian tautan yang dikelompokkan dengan judul.", - "calMon": "Mo", - "calTue": "Tu", - "calWed": "Kami", - "calThu": "Th", - "calFri": "Fr", - "calSat": "Sa", - "calSun": "Su", - "startOnMonday": "Minggu dimulai pada hari Senin.", - "countdownNoDate": "Tidak ada tanggal target yang ditetapkan.", - "countdownPast": "Acara telah berlalu", - "countdownDays": "hari", - "countdownHours": "jam", - "countdownMinutes": "menit", - "countdownSeconds": "detik", - "countdownLabel": "Label", - "countdownLabelPlaceholder": "misalnya Hari Peluncuran", - "countdownShowDays": "Hari Pertunjukan", - "countdownShowHours": "Jam Pertunjukan", - "targetDate": "Tanggal Target", - "searchEngine": "Mesin Pencari", - "customSearchUrl": "URL Pencarian Kustom", - "searchPlaceholder": "Mencari...", - "searchGo": "Pergi", - "searchPlaceholderLabel": "Teks Placeholder", - "searchPlaceholderHint": "Teks yang ditampilkan di dalam kolom pencarian", - "openInNewTab": "Buka di Tab Baru", - "searchQueryPlaceholder": "Masukkan pertanyaan...", - "noSearchShortcuts": "Tidak ada pintasan yang dikonfigurasi.", - "addSearchShortcut": "Tambahkan Pintasan", - "fontSize": "Ukuran Huruf", - "textAlign": "Perataan Teks", - "fontWeight": "Ketebalan Huruf", - "clearColor": "Warna Bening", - "imageFit": "Pencocokan Gambar", - "imageLinkUrl": "Tautan URL", - "noImage": "Tidak ada URL gambar yang ditetapkan.", - "altText": "Teks Alternatif", - "altTextPlaceholder": "Jelaskan gambar tersebut", - "renderMarkdown": "Render Markdown", - "displayMode": "Mode Tampilan", - "displayField": "Bidang Tampilan", - "jsonPath": "Jalur JSON", - "customApiLabel": "Label", - "customApiLabelPlaceholder": "misalnya Suhu", - "customApiUnit": "Satuan", - "customApiNoUrl": "Tidak ada URL API yang dikonfigurasi.", - "customApiError": "Gagal mengambil", - "customApiNotArray": "Respons bukanlah sebuah array.", - "addService": "Tambahkan Layanan", - "showLabels": "Tampilkan Label", - "iconSize": "Ukuran Ikon", - "noDashboardLinks": "Tidak ada tautan dasbor yang dikonfigurasi.", - "noLimit": "Tidak ada batasan", - "sectionHeading": "Judul Bagian", - "addSection": "Tambahkan Bagian", - "compactMode": "Mode Ringkas", "showDetailed": "Tampilkan Detail", - "selectHosts": "Pilih Host", "allHosts": "Semua tuan rumah", - "listLayout": "Daftar", - "gridLayout": "Jaringan", "terminal": "Terminal", "files": "Berkas", "docker": "Buruh pelabuhan", @@ -422,12 +284,8 @@ "accentColor": "Warna Aksen", "widgetSshTerminalName": "Terminal SSH", "widgetSshTerminalDesc": "Terminal SSH inline yang terhubung ke host yang telah dikonfigurasi.", - "sshTerminalNoHost": "Tidak ada host yang dikonfigurasi.", - "sshTerminalConnect": "Menghubungkan", - "sshTerminalAutoConnect": "Terhubung otomatis saat dimuat", "widgetQuickConnectName": "Koneksi Cepat", "widgetQuickConnectDesc": "Tombol peluncuran sekali klik untuk semua jenis koneksi di seluruh host Anda.", - "connectionTypes": "Jenis Koneksi", "connType_terminal": "Terminal", "connType_files": "Pengelola File", "connType_docker": "Buruh pelabuhan", @@ -685,7 +543,6 @@ "renameTab": "Ganti nama tab", "openFileManager": "Buka Pengelola File", "dashboard": "Dasbor", - "homepage": "Beranda", "quickConnect": "Koneksi Cepat", "sshTools": "Alat SSH", "history": "Sejarah", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Statistik Server", "panelMain": "Utama", "panelSide": "Samping", - "justNow": "baru saja", - "serviceLinks": "Tautan Layanan", - "homepagePreview": "Pratinjau Halaman Utama" + "justNow": "baru saja" }, "donation": { "title": "Apakah Anda menikmati Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Seret kartu untuk mengubah urutan · Seret pembatas kolom untuk mengubah ukuran kolom · Seret tepi bawah kartu untuk mengubah ukuran tingginya · Gunakan tombol Sampah untuk menghapus", "empty": "Kosong", "clear": "Jernih", - "serviceLinksTitle": "Tautan Layanan", - "serviceLinksEmpty": "Belum ada tautan layanan.", "serviceLinksAddLabel": "Label", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Menambahkan", - "serviceLinksLabelPlaceholder": "Layanan Saya", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Masukkan alamat web yang valid", - "serviceLinksAddFailed": "Gagal menambahkan tautan layanan", "viewServerDetails": "Lihat detail server" }, "admin": { diff --git a/src/ui/locales/translated/it_IT.json b/src/ui/locales/translated/it_IT.json index 6182a131e..9f704f404 100644 --- a/src/ui/locales/translated/it_IT.json +++ b/src/ui/locales/translated/it_IT.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Sblocca trascina per riorganizzare" }, "homepage": { - "title": "Pagina iniziale", - "addWidget": "Aggiungi widget", - "editWidget": "Modifica widget", "deleteWidget": "Elimina", "widgetTypes": "Tipi di widget", "serviceLink": "Collegamento servizio", @@ -206,116 +203,40 @@ "notes": "Note", "hostStatus": "Stato host", "bookmarkList": "Segnalibri", - "zoomIn": "Ingrandisci", - "zoomOut": "Rimpicciolisci", - "resetView": "Reimposta vista", - "lockLayout": "Blocca layout", - "unlockLayout": "Sblocca layout", - "noWidgets": "Fai clic con il tasto destro o clicca su + per aggiungere il tuo primo widget", - "openFullView": "Apri vista completa", - "previewTitle": "Anteprima homepage", - "cancel": "Annulla", - "save": "Salva", - "title_label": "Titolo", - "widgetTitlePlaceholder": "Titolo widget (opzionale)", - "url": "URL", - "imageUrl": "URL immagine personalizzata", - "imageUrlHint": "Lascia vuoto per utilizzare automaticamente la favicon del sito", - "showImage": "Mostra immagine", - "description": "Descrizione", - "color": "Colore", "icon": "Icona", "expanded": "Espanso per impostazione predefinita", - "timezone": "Fuso orario", - "invalidTimezone": "Fuso orario non valido. Utilizzare un nome IANA come America/New_York", - "showSeconds": "Mostra secondi", - "format12h": "12 ore", "format24h": "24 ore", - "content": "Contenuto", - "backgroundColor": "Colore sfondo", "host": "Host", "showMetrics": "Mostra Metriche", - "links": "Collegamenti", - "addLink": "Aggiungi Collegamento", - "linkLabel": "Etichetta", "linkUrl": "URL", "removeLink": "Rimuovi", - "categoryLinks": "Collegamenti", - "categoryInfo": "Info", - "categorySystem": "Sistema", "widgetServiceLinkDesc": "Un riquadro cliccabile che collega a un URL di servizio", "widgetFolderDesc": "Un contenitore per raggruppare widget correlati", "widgetClockDesc": "Un orologio in tempo reale con fuso orario configurabile", "widgetNotesDesc": "Un widget per note in formato markdown", "widgetHostStatusDesc": "Mostra CPU, memoria e disco in tempo reale per un host SSH", "widgetBookmarkListDesc": "Un elenco di collegamenti rapidi", - "copyLink": "Copia Collegamento", - "linkCopied": "Collegamento copiato!", - "location": "Località", - "temperatureUnit": "Unità di temperatura", - "showForecast": "Mostra previsioni a 3 giorni", - "scrolling": "Consenti scorrimento", - "feedUrl": "URL del feed", - "maxItems": "Numero massimo di elementi", - "showDescription": "Mostra descrizione", "widgetWeatherName": "Meteo", "widgetWeatherDesc": "Meteo in tempo reale per qualsiasi località", "widgetIframeName": "Incorporamento iFrame", "widgetIframeDesc": "Incorpora qualsiasi URL in un iframe", - "widgetRssName": "Feed RSS", "widgetRssDesc": "Visualizza elementi da un feed RSS o Atom", "dragToFolder": "Trascina i widget qui o usa + per aggiungere", "showDisk": "Mostra utilizzo disco", "addToFolder": "Aggiungi widget alla cartella", - "noHostSelected": "Nessun host selezionato", "selectHost": "Seleziona un host...", - "displayedMetrics": "Metriche visualizzate", - "metricCpu": "CPU", - "metricMemory": "Memoria", - "metricDisk": "Disco", - "metricUptime": "Uptime", - "metricSystem": "Sistema", - "metricNetwork": "Rete", - "metricProcesses": "Processi", - "categoryMonitoring": "Monitoraggio", "loading": "Caricamento...", "allClear": "Tutto a posto", - "noPingUrls": "Nessun URL configurato", - "pingLabel": "Etichetta", - "addPingUrl": "Aggiungi URL", - "showLatency": "Mostra latenza", - "refreshInterval": "Intervallo di aggiornamento", - "seconds": "secondi", - "filterActivityTypes": "Filtra tipi", - "filterTypesHint": "Lascia vuoto per mostrare tutto", - "showTimestamp": "Mostra timestamp", - "uptimeUnavailable": "Uptime non disponibile", - "uptimeLabel": "Uptime", - "overviewVersion": "Versione", "overviewUpdate": "Aggiornato", - "overviewUpdateLabel": "Aggiornamento", - "overviewUpdateAvailable": "Aggiornamento disponibile", - "overviewDatabase": "Database", - "overviewUptime": "Uptime", - "noHosts": "Nessun host configurato", - "hostGridHosts": "Host", - "hostGridAllHint": "Lascia vuoto per mostrare tutti gli host", - "columns": "Colonne", - "showIp": "Mostra indirizzo IP", "connectionType": "Tipo di connessione", - "layout": "Layout", - "showStatus": "Mostra stato", "showHostName": "Mostra nome host", "noDockerActivity": "Nessuna attività Docker", - "noActivity": "Nessuna attività", "showAcknowledged": "Mostra riconosciuti", "widgetMetricsChartName": "Grafico metriche", "widgetMetricsChartDesc": "Grafico storico di CPU, memoria, disco o rete per un host", "widgetHostGridName": "Griglia host", "widgetHostGridDesc": "Vista a griglia degli stati degli host SSH", - "widgetPingStatusName": "Stato ping", "widgetPingStatusDesc": "Stato del ping HTTP per uno o più URL", - "widgetRecentActivityName": "Attività recente", "widgetRecentActivityDesc": "Feed scorrevole dell'attività recente di Termix", "widgetTermixUptimeName": "Uptime di Termix", "widgetTermixUptimeDesc": "Contatore di uptime in tempo reale per il server Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Pulsanti di ricerca rapida con input inline", "widgetLinkTreeName": "Albero dei collegamenti", "widgetLinkTreeDesc": "Sezioni raggruppate di collegamenti con intestazioni", - "calMon": "Lu", - "calTue": "Ma", - "calWed": "Me", - "calThu": "Gi", - "calFri": "Ve", - "calSat": "Sa", - "calSun": "Do", - "startOnMonday": "Inizia la settimana il lunedì", - "countdownNoDate": "Nessuna data obiettivo impostata", - "countdownPast": "Evento passato", - "countdownDays": "giorni", - "countdownHours": "ore", - "countdownMinutes": "min", - "countdownSeconds": "sec", - "countdownLabel": "Etichetta", - "countdownLabelPlaceholder": "es. Giorno di lancio", - "countdownShowDays": "Mostra giorni", - "countdownShowHours": "Mostra ore", - "targetDate": "Data obiettivo", - "searchEngine": "Motore di ricerca", - "customSearchUrl": "URL di ricerca personalizzato", - "searchPlaceholder": "Cerca...", - "searchGo": "Vai", - "searchPlaceholderLabel": "Testo segnaposto", - "searchPlaceholderHint": "Testo mostrato nel campo di ricerca", - "openInNewTab": "Apri in nuova scheda", - "searchQueryPlaceholder": "Inserisci query...", - "noSearchShortcuts": "Nessuna scorciatoia configurata", - "addSearchShortcut": "Aggiungi scorciatoia", - "fontSize": "Dimensione carattere", - "textAlign": "Allineamento testo", - "fontWeight": "Spessore carattere", - "clearColor": "Rimuovi colore", - "imageFit": "Adatta immagine", - "imageLinkUrl": "URL collegamento", - "noImage": "Nessun URL immagine impostato", - "altText": "Testo alternativo", - "altTextPlaceholder": "Descrivi l'immagine", - "renderMarkdown": "Visualizza Markdown", - "displayMode": "Modalità visualizzazione", - "displayField": "Campo visualizzazione", - "jsonPath": "Percorso JSON", - "customApiLabel": "Etichetta", - "customApiLabelPlaceholder": "es. Temperatura", - "customApiUnit": "Unità", - "customApiNoUrl": "Nessun URL API configurato", - "customApiError": "Recupero fallito", - "customApiNotArray": "La risposta non è un array", - "addService": "Aggiungi servizio", - "showLabels": "Mostra etichette", - "iconSize": "Dimensioni icone", - "noDashboardLinks": "Nessun collegamento dashboard configurato", - "noLimit": "Nessun limite", - "sectionHeading": "Intestazione sezione", - "addSection": "Aggiungi sezione", - "compactMode": "Modalità compatta", "showDetailed": "Mostra dettagli", - "selectHosts": "Seleziona host", "allHosts": "Tutti gli host", - "listLayout": "Elenco", - "gridLayout": "Griglia", "terminal": "Terminale", "files": "File", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Colore accento", "widgetSshTerminalName": "Terminale SSH", "widgetSshTerminalDesc": "Un terminale SSH inline connesso a un host configurato", - "sshTerminalNoHost": "Nessun host configurato", - "sshTerminalConnect": "Connetti", - "sshTerminalAutoConnect": "Connessione automatica al caricamento", "widgetQuickConnectName": "Connessione rapida", "widgetQuickConnectDesc": "Pulsanti di avvio con un clic per qualsiasi tipo di connessione ai tuoi host", - "connectionTypes": "Tipi di connessione", "connType_terminal": "Terminale", "connType_files": "Gestione file", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Rinomina scheda", "openFileManager": "Apri Gestione file", "dashboard": "Dashboard", - "homepage": "Homepage", "quickConnect": "Connessione rapida", "sshTools": "Strumenti SSH", "history": "Cronologia", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Statistiche server", "panelMain": "Principale", "panelSide": "Laterale", - "justNow": "adesso", - "serviceLinks": "Link ai servizi", - "homepagePreview": "Anteprima home page" + "justNow": "adesso" }, "donation": { "title": "Ti piace Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Trascina le schede per riordinarle · Trascina il divisore di colonna per ridimensionare le colonne · Trascina il bordo inferiore di una scheda per ridimensionarne l'altezza · Cestino per rimuovere", "empty": "Vuoto", "clear": "Pulisci", - "serviceLinksTitle": "Collegamenti ai servizi", - "serviceLinksEmpty": "Nessun collegamento ai servizi", "serviceLinksAddLabel": "Etichetta", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Aggiungi", - "serviceLinksLabelPlaceholder": "Il mio servizio", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Inserisci un indirizzo web valido", - "serviceLinksAddFailed": "Impossibile aggiungere il collegamento al servizio", "viewServerDetails": "Visualizza dettagli server" }, "admin": { diff --git a/src/ui/locales/translated/ja_JP.json b/src/ui/locales/translated/ja_JP.json index cc7f97d43..44721c00d 100644 --- a/src/ui/locales/translated/ja_JP.json +++ b/src/ui/locales/translated/ja_JP.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "ロックを解除してドラッグして並べ替える" }, "homepage": { - "title": "ホームページ", - "addWidget": "ウィジェットを追加", - "editWidget": "ウィジェットを編集", "deleteWidget": "削除", "widgetTypes": "ウィジェットタイプ", "serviceLink": "サービスリンク", @@ -206,116 +203,40 @@ "notes": "メモ", "hostStatus": "ホストステータス", "bookmarkList": "ブックマーク", - "zoomIn": "拡大", - "zoomOut": "縮小", - "resetView": "表示をリセット", - "lockLayout": "レイアウトをロック", - "unlockLayout": "レイアウトのロックを解除", - "noWidgets": "右クリックまたは「+」をクリックして最初のウィジェットを追加してください", - "openFullView": "全画面表示を開く", - "previewTitle": "ホームページプレビュー", - "cancel": "キャンセル", - "save": "保存", - "title_label": "タイトル", - "widgetTitlePlaceholder": "ウィジェットのタイトル(任意)", - "url": "URL", - "imageUrl": "カスタム画像URL", - "imageUrlHint": "空白のままにすると、サイトのファビコンが自動的に使用されます", - "showImage": "画像を表示", - "description": "説明", - "color": "色", "icon": "アイコン", "expanded": "デフォルトで展開", - "timezone": "タイムゾーン", - "invalidTimezone": "無効なタイムゾーンです。IANA名(例:America/New_York)を使用してください。", - "showSeconds": "秒を表示", - "format12h": "12時間表示", "format24h": "24時間表示", - "content": "内容", - "backgroundColor": "背景色", "host": "ホスト", "showMetrics": "メトリクス表示", - "links": "リンク", - "addLink": "リンクを追加", - "linkLabel": "ラベル", "linkUrl": "URL", "removeLink": "削除", - "categoryLinks": "リンク", - "categoryInfo": "情報", - "categorySystem": "システム", "widgetServiceLinkDesc": "サービスURLへリンクするクリック可能なタイル", "widgetFolderDesc": "関連するウィジェットをグループ化するコンテナ", "widgetClockDesc": "設定可能なタイムゾーンを備えた現在時刻の時計", "widgetNotesDesc": "Markdownメモウィジェット", "widgetHostStatusDesc": "SSHホストのCPU、メモリ、ディスク使用状況をライブ表示", "widgetBookmarkListDesc": "クイックリンクのリスト", - "copyLink": "リンクをコピー", - "linkCopied": "リンクがコピーされました!", - "location": "場所", - "temperatureUnit": "温度単位", - "showForecast": "3日間の予報を表示", - "scrolling": "スクロール許可", - "feedUrl": "フィードURL", - "maxItems": "最大アイテム数", - "showDescription": "説明を表示", "widgetWeatherName": "天気", "widgetWeatherDesc": "任意の場所の現在の天気", "widgetIframeName": "iFrame埋め込み", "widgetIframeDesc": "任意のURLをiFrameで埋め込み", - "widgetRssName": "RSSフィード", "widgetRssDesc": "RSSまたはAtomフィードのアイテムを表示", "dragToFolder": "ウィジェットをここにドラッグ、または+で追加", "showDisk": "ディスク使用量を表示", "addToFolder": "ウィジェットをフォルダに追加", - "noHostSelected": "ホストが選択されていません", "selectHost": "ホストを選択...", - "displayedMetrics": "表示メトリクス", - "metricCpu": "CPU", - "metricMemory": "メモリ", - "metricDisk": "ディスク", - "metricUptime": "稼働時間", - "metricSystem": "システム", - "metricNetwork": "ネットワーク", - "metricProcesses": "プロセス", - "categoryMonitoring": "モニタリング", "loading": "読み込み中...", "allClear": "すべて正常", - "noPingUrls": "URLが設定されていません", - "pingLabel": "ラベル", - "addPingUrl": "URLを追加", - "showLatency": "レイテンシを表示", - "refreshInterval": "更新間隔", - "seconds": "秒", - "filterActivityTypes": "アクティビティタイプフィルター", - "filterTypesHint": "すべてを表示するには空のままにします", - "showTimestamp": "タイムスタンプを表示", - "uptimeUnavailable": "稼働時間は利用できません", - "uptimeLabel": "稼働時間", - "overviewVersion": "バージョン", "overviewUpdate": "最新", - "overviewUpdateLabel": "アップデート", - "overviewUpdateAvailable": "アップデートあり", - "overviewDatabase": "データベース", - "overviewUptime": "稼働時間", - "noHosts": "ホストが設定されていません", - "hostGridHosts": "ホスト", - "hostGridAllHint": "空のままにするとすべてのホストを表示します", - "columns": "列", - "showIp": "IPアドレスを表示", "connectionType": "接続タイプ", - "layout": "レイアウト", - "showStatus": "ステータスを表示", "showHostName": "ホスト名を表示", "noDockerActivity": "Dockerアクティビティはありません", - "noActivity": "アクティビティはありません", "showAcknowledged": "確認済みを表示", "widgetMetricsChartName": "メトリックチャート", "widgetMetricsChartDesc": "ホストのCPU、メモリ、ディスク、またはネットワークの履歴チャート", "widgetHostGridName": "ホストグリッド", "widgetHostGridDesc": "SSHホストステータスのグリッドビュー", - "widgetPingStatusName": "Pingステータス", "widgetPingStatusDesc": "1つ以上のURLのHTTP pingステータス", - "widgetRecentActivityName": "最近のアクティビティ", "widgetRecentActivityDesc": "スクロール可能なTermixの最近のアクティビティフィード", "widgetTermixUptimeName": "Termixアップタイム", "widgetTermixUptimeDesc": "Termixサーバーのライブアップタイムカウンター", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "インライン入力対応のクイック検索ショートカット", "widgetLinkTreeName": "リンクツリー", "widgetLinkTreeDesc": "見出し付きのリンクグループ", - "calMon": "月", - "calTue": "火", - "calWed": "水", - "calThu": "木", - "calFri": "金", - "calSat": "土", - "calSun": "日", - "startOnMonday": "週の始まりを月曜に", - "countdownNoDate": "目標日が設定されていません", - "countdownPast": "イベントは終了しました", - "countdownDays": "日", - "countdownHours": "時間", - "countdownMinutes": "分", - "countdownSeconds": "秒", - "countdownLabel": "ラベル", - "countdownLabelPlaceholder": "例: リリース日", - "countdownShowDays": "日数を表示", - "countdownShowHours": "時間を表示", - "targetDate": "目標日", - "searchEngine": "検索エンジン", - "customSearchUrl": "カスタム検索URL", - "searchPlaceholder": "検索...", - "searchGo": "検索", - "searchPlaceholderLabel": "プレースホルダーテキスト", - "searchPlaceholderHint": "検索入力欄に表示されるテキスト", - "openInNewTab": "新しいタブで開く", - "searchQueryPlaceholder": "クエリを入力...", - "noSearchShortcuts": "設定済みのショートカットはありません", - "addSearchShortcut": "ショートカットを追加", - "fontSize": "フォントサイズ", - "textAlign": "テキスト配置", - "fontWeight": "フォントの太さ", - "clearColor": "色をクリア", - "imageFit": "画像フィット", - "imageLinkUrl": "リンクURL", - "noImage": "画像URLが設定されていません", - "altText": "代替テキスト", - "altTextPlaceholder": "画像の説明を入力", - "renderMarkdown": "Markdownをレンダリング", - "displayMode": "表示モード", - "displayField": "表示フィールド", - "jsonPath": "JSONパス", - "customApiLabel": "ラベル", - "customApiLabelPlaceholder": "例: 温度", - "customApiUnit": "単位", - "customApiNoUrl": "API URLが設定されていません", - "customApiError": "取得に失敗しました", - "customApiNotArray": "レスポンスが配列ではありません", - "addService": "サービスを追加", - "showLabels": "ラベルを表示", - "iconSize": "アイコンサイズ", - "noDashboardLinks": "ダッシュボードリンクが設定されていません", - "noLimit": "制限なし", - "sectionHeading": "セクション見出し", - "addSection": "セクションを追加", - "compactMode": "コンパクトモード", "showDetailed": "詳細を表示", - "selectHosts": "ホストを選択", "allHosts": "すべてのホスト", - "listLayout": "リスト", - "gridLayout": "グリッド", "terminal": "ターミナル", "files": "ファイル", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "アクセントカラー", "widgetSshTerminalName": "SSHターミナル", "widgetSshTerminalDesc": "設定済みホストに接続するインラインSSHターミナル", - "sshTerminalNoHost": "ホストが設定されていません", - "sshTerminalConnect": "接続", - "sshTerminalAutoConnect": "読み込み時に自動接続", "widgetQuickConnectName": "クイック接続", "widgetQuickConnectDesc": "ホスト上のあらゆる接続タイプをワンクリックで起動するボタン", - "connectionTypes": "接続タイプ", "connType_terminal": "ターミナル", "connType_files": "ファイルマネージャー", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "タブ名を変更", "openFileManager": "ファイルマネージャーを開く", "dashboard": "ダッシュボード", - "homepage": "ホームページ", "quickConnect": "クイック接続", "sshTools": "SSHツール", "history": "履歴", @@ -1895,9 +1752,7 @@ "serverStatsCard": "サーバー統計", "panelMain": "メイン", "panelSide": "サイド", - "justNow": "たった今", - "serviceLinks": "サービスリンク", - "homepagePreview": "ホームページプレビュー" + "justNow": "たった今" }, "donation": { "title": "Termixをお楽しみいただけていますか?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "カードをドラッグして並べ替え · 列の仕切りをドラッグして列幅を調整 · カードの下端をドラッグして高さを調整 · ゴミ箱にドラッグして削除", "empty": "空", "clear": "クリア", - "serviceLinksTitle": "サービスリンク", - "serviceLinksEmpty": "サービスリンクはまだありません", "serviceLinksAddLabel": "ラベル", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "追加", - "serviceLinksLabelPlaceholder": "マイサービス", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "有効なWebアドレスを入力してください", - "serviceLinksAddFailed": "サービスリンクの追加に失敗しました", "viewServerDetails": "サーバーの詳細を表示" }, "admin": { diff --git a/src/ui/locales/translated/ko_KR.json b/src/ui/locales/translated/ko_KR.json index 8ff9ede97..62ec30420 100644 --- a/src/ui/locales/translated/ko_KR.json +++ b/src/ui/locales/translated/ko_KR.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "드래그하여 순서를 재배열하세요." }, "homepage": { - "title": "홈페이지", - "addWidget": "위젯 추가", - "editWidget": "위젯 편집", "deleteWidget": "삭제", "widgetTypes": "위젯 유형", "serviceLink": "서비스 링크", @@ -206,116 +203,40 @@ "notes": "메모", "hostStatus": "호스트 상태", "bookmarkList": "즐겨찾기", - "zoomIn": "확대", - "zoomOut": "축소", - "resetView": "보기 초기화", - "lockLayout": "레이아웃 잠금", - "unlockLayout": "레이아웃 잠금 해제", - "noWidgets": "마우스 오른쪽 클릭 또는 +를 클릭하여 첫 위젯을 추가하세요.", - "openFullView": "전체 보기 열기", - "previewTitle": "홈페이지 미리보기", - "cancel": "취소", - "save": "저장", - "title_label": "제목", - "widgetTitlePlaceholder": "위젯 제목 (선택 사항)", - "url": "URL", - "imageUrl": "사용자 지정 이미지 URL", - "imageUrlHint": "비워 두면 사이트 파비콘이 자동으로 사용됩니다.", - "showImage": "이미지 표시", - "description": "설명", - "color": "색상", "icon": "아이콘", "expanded": "기본적으로 확장됨", - "timezone": "시간대", - "invalidTimezone": "잘못된 시간대입니다. America/New_York와 같은 IANA 이름을 사용하십시오.", - "showSeconds": "초 표시", - "format12h": "12시간", "format24h": "24시간", - "content": "내용", - "backgroundColor": "배경색", "host": "호스트", "showMetrics": "메트릭 표시", - "links": "링크", - "addLink": "링크 추가", - "linkLabel": "레이블", "linkUrl": "URL", "removeLink": "제거", - "categoryLinks": "링크", - "categoryInfo": "정보", - "categorySystem": "시스템", "widgetServiceLinkDesc": "서비스 URL로 연결되는 클릭 가능한 타일", "widgetFolderDesc": "관련 위젯을 그룹화하는 컨테이너", "widgetClockDesc": "시간대 설정이 가능한 실시간 시계", "widgetNotesDesc": "마크다운 메모 위젯", "widgetHostStatusDesc": "SSH 호스트의 실시간 CPU, 메모리, 디스크 사용량 표시", "widgetBookmarkListDesc": "빠른 링크 목록", - "copyLink": "링크 복사", - "linkCopied": "링크가 복사되었습니다!", - "location": "위치", - "temperatureUnit": "온도 단위", - "showForecast": "3일 예보 표시", - "scrolling": "스크롤 허용", - "feedUrl": "피드 URL", - "maxItems": "최대 항목 수", - "showDescription": "설명 표시", "widgetWeatherName": "날씨", "widgetWeatherDesc": "모든 지역의 실시간 날씨", "widgetIframeName": "iFrame 임베드", "widgetIframeDesc": "URL을 iframe으로 임베드", - "widgetRssName": "RSS 피드", "widgetRssDesc": "RSS 또는 Atom 피드의 항목 표시", "dragToFolder": "위젯을 여기로 드래그하거나 +를 눌러 추가하세요.", "showDisk": "디스크 사용량 표시", "addToFolder": "폴더에 위젯 추가", - "noHostSelected": "선택된 호스트 없음", "selectHost": "호스트 선택...", - "displayedMetrics": "표시된 메트릭", - "metricCpu": "CPU", - "metricMemory": "메모리", - "metricDisk": "디스크", - "metricUptime": "업타임", - "metricSystem": "시스템", - "metricNetwork": "네트워크", - "metricProcesses": "프로세스", - "categoryMonitoring": "모니터링", "loading": "로딩 중...", "allClear": "모두 정상", - "noPingUrls": "구성된 URL 없음", - "pingLabel": "레이블", - "addPingUrl": "URL 추가", - "showLatency": "지연 시간 표시", - "refreshInterval": "새로 고침 간격", - "seconds": "초", - "filterActivityTypes": "유형 필터", - "filterTypesHint": "모두 보려면 비워 두세요", - "showTimestamp": "타임스탬프 표시", - "uptimeUnavailable": "업타임 없음", - "uptimeLabel": "업타임", - "overviewVersion": "버전", "overviewUpdate": "최신 상태", - "overviewUpdateLabel": "업데이트", - "overviewUpdateAvailable": "업데이트 있음", - "overviewDatabase": "데이터베이스", - "overviewUptime": "업타임", - "noHosts": "호스트 구성 없음", - "hostGridHosts": "호스트", - "hostGridAllHint": "비워 두면 모든 호스트 표시", - "columns": "열", - "showIp": "IP 주소 표시", "connectionType": "연결 유형", - "layout": "레이아웃", - "showStatus": "상태 표시", "showHostName": "호스트 이름 표시", "noDockerActivity": "Docker 활동 없음", - "noActivity": "활동 없음", "showAcknowledged": "확인됨 표시", "widgetMetricsChartName": "메트릭 차트", "widgetMetricsChartDesc": "호스트의 CPU, 메모리, 디스크, 네트워크 기록 차트", "widgetHostGridName": "호스트 그리드", "widgetHostGridDesc": "SSH 호스트 상태 그리드 뷰", - "widgetPingStatusName": "Ping 상태", "widgetPingStatusDesc": "하나 이상의 URL에 대한 HTTP 핑 상태", - "widgetRecentActivityName": "최근 활동", "widgetRecentActivityDesc": "Termix 최근 활동의 스크롤 가능한 피드", "widgetTermixUptimeName": "Termix 가동 시간", "widgetTermixUptimeDesc": "Termix 서버의 실시간 가동 시간 카운터", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "인라인 입력이 있는 빠른 검색 바로가기 버튼", "widgetLinkTreeName": "링크 트리", "widgetLinkTreeDesc": "제목이 있는 링크의 그룹화된 섹션", - "calMon": "월", - "calTue": "화", - "calWed": "수", - "calThu": "목", - "calFri": "금", - "calSat": "토", - "calSun": "일", - "startOnMonday": "주 시작을 월요일로", - "countdownNoDate": "목표 날짜가 설정되지 않음", - "countdownPast": "이벤트가 지났습니다", - "countdownDays": "일", - "countdownHours": "시간", - "countdownMinutes": "분", - "countdownSeconds": "초", - "countdownLabel": "레이블", - "countdownLabelPlaceholder": "예: 출시일", - "countdownShowDays": "일 표시", - "countdownShowHours": "시간 표시", - "targetDate": "목표 날짜", - "searchEngine": "검색 엔진", - "customSearchUrl": "사용자 지정 검색 URL", - "searchPlaceholder": "검색...", - "searchGo": "이동", - "searchPlaceholderLabel": "플레이스홀더 텍스트", - "searchPlaceholderHint": "검색 입력란에 표시되는 텍스트", - "openInNewTab": "새 탭에서 열기", - "searchQueryPlaceholder": "검색어 입력...", - "noSearchShortcuts": "바로가기가 구성되지 않음", - "addSearchShortcut": "바로가기 추가", - "fontSize": "글꼴 크기", - "textAlign": "텍스트 정렬", - "fontWeight": "글꼴 두께", - "clearColor": "색상 지우기", - "imageFit": "이미지 맞춤", - "imageLinkUrl": "링크 URL", - "noImage": "이미지 URL이 설정되지 않음", - "altText": "대체 텍스트", - "altTextPlaceholder": "이미지 설명 입력", - "renderMarkdown": "마크다운 렌더링", - "displayMode": "표시 모드", - "displayField": "표시 필드", - "jsonPath": "JSON 경로", - "customApiLabel": "레이블", - "customApiLabelPlaceholder": "예: 온도", - "customApiUnit": "단위", - "customApiNoUrl": "API URL이 구성되지 않음", - "customApiError": "가져오기 실패", - "customApiNotArray": "응답이 배열이 아닙니다", - "addService": "서비스 추가", - "showLabels": "레이블 표시", - "iconSize": "아이콘 크기", - "noDashboardLinks": "대시보드 링크가 구성되지 않음", - "noLimit": "제한 없음", - "sectionHeading": "섹션 제목", - "addSection": "섹션 추가", - "compactMode": "간결 모드", "showDetailed": "상세 보기", - "selectHosts": "호스트 선택", "allHosts": "모든 호스트", - "listLayout": "목록", - "gridLayout": "그리드", "terminal": "터미널", "files": "파일", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "강조 색상", "widgetSshTerminalName": "SSH 터미널", "widgetSshTerminalDesc": "구성된 호스트에 연결된 인라인 SSH 터미널", - "sshTerminalNoHost": "호스트가 구성되지 않음", - "sshTerminalConnect": "연결", - "sshTerminalAutoConnect": "로드 시 자동 연결", "widgetQuickConnectName": "빨리 연결", "widgetQuickConnectDesc": "호스트 전반에 걸친 모든 연결 유형에 대한 원클릭 실행 버튼", - "connectionTypes": "연결 유형", "connType_terminal": "터미널", "connType_files": "파일 관리자", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "탭 이름 변경", "openFileManager": "파일 관리자 열기", "dashboard": "대시보드", - "homepage": "홈페이지", "quickConnect": "빠른 연결", "sshTools": "SSH 도구", "history": "기록", @@ -1895,9 +1752,7 @@ "serverStatsCard": "서버 통계", "panelMain": "메인", "panelSide": "사이드", - "justNow": "방금 전", - "serviceLinks": "서비스 링크", - "homepagePreview": "홈페이지 미리보기" + "justNow": "방금 전" }, "donation": { "title": "Termix가 마음에 드시나요?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "카드를 드래그하여 재정렬 · 열 구분선을 드래그하여 열 너비 조절 · 카드 하단을 드래그하여 높이 조절 · 휴지통으로 제거", "empty": "비어 있음", "clear": "비우기", - "serviceLinksTitle": "서비스 링크", - "serviceLinksEmpty": "아직 서비스 링크 없음", "serviceLinksAddLabel": "이름", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "추가", - "serviceLinksLabelPlaceholder": "내 서비스", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "올바른 웹 주소를 입력하세요", - "serviceLinksAddFailed": "서비스 링크 추가 실패", "viewServerDetails": "서버 세부정보 보기" }, "admin": { diff --git a/src/ui/locales/translated/nl_NL.json b/src/ui/locales/translated/nl_NL.json index 7d2970923..35dbfbd2a 100644 --- a/src/ui/locales/translated/nl_NL.json +++ b/src/ui/locales/translated/nl_NL.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Ontgrendel slepen om te herschikken" }, "homepage": { - "title": "Startpagina", - "addWidget": "Widget toevoegen", - "editWidget": "Widget bewerken", "deleteWidget": "Verwijderen", "widgetTypes": "Widgettypen", "serviceLink": "Servicelink", @@ -206,116 +203,40 @@ "notes": "Notities", "hostStatus": "Hoststatus", "bookmarkList": "Bladwijzers", - "zoomIn": "Inzoomen", - "zoomOut": "Uitzoomen", - "resetView": "Weergave opnieuw instellen", - "lockLayout": "Slotindeling", - "unlockLayout": "Lay-out ontgrendelen", - "noWidgets": "Klik met de rechtermuisknop of klik op + om je eerste widget toe te voegen.", - "openFullView": "Volledige weergave openen", - "previewTitle": "Startpagina-voorbeeld", - "cancel": "Annuleren", - "save": "Redden", - "title_label": "Titel", - "widgetTitlePlaceholder": "Widgettitel (optioneel)", - "url": "URL", - "imageUrl": "Aangepaste afbeeldings-URL", - "imageUrlHint": "Laat dit veld leeg om automatisch het site-favicon te gebruiken.", - "showImage": "Afbeelding weergeven", - "description": "Beschrijving", - "color": "Kleur", "icon": "Icon", "expanded": "Standaard uitgevouwen", - "timezone": "Tijdzone", - "invalidTimezone": "Ongeldige tijdzone. Gebruik een IANA-naam zoals America/New_York.", - "showSeconds": "Toon seconden", - "format12h": "12 uur", "format24h": "24 uur per dag", - "content": "Inhoud", - "backgroundColor": "Achtergrondkleur", "host": "Gastheer", "showMetrics": "Toon statistieken", - "links": "Links", - "addLink": "Link toevoegen", - "linkLabel": "Label", "linkUrl": "URL", "removeLink": "Verwijderen", - "categoryLinks": "Links", - "categoryInfo": "Informatie", - "categorySystem": "Systeem", "widgetServiceLinkDesc": "Een aanklikbare tegel die linkt naar een service-URL.", "widgetFolderDesc": "Een container om gerelateerde widgets te groeperen.", "widgetClockDesc": "Een live klok met instelbare tijdzone.", "widgetNotesDesc": "Een widget voor Markdown-notities", "widgetHostStatusDesc": "Toont live CPU-, geheugen- en schijfgebruik voor een SSH-host.", "widgetBookmarkListDesc": "Een lijst met snelle links", - "copyLink": "Link kopiëren", - "linkCopied": "Link gekopieerd!", - "location": "Locatie", - "temperatureUnit": "Temperatuureenheid", - "showForecast": "Toon de 3-daagse weersvoorspelling", - "scrolling": "Scrollen toestaan", - "feedUrl": "Feed-URL", - "maxItems": "Max. aantal items", - "showDescription": "Beschrijving weergeven", "widgetWeatherName": "Weer", "widgetWeatherDesc": "Live weerbericht voor elke locatie", "widgetIframeName": "iFrame-insluiting", "widgetIframeDesc": "Sluit elke URL in een iframe in.", - "widgetRssName": "RSS-feed", "widgetRssDesc": "Items weergeven uit een RSS- of Atom-feed.", "dragToFolder": "Sleep widgets hierheen of gebruik + om ze toe te voegen.", "showDisk": "Schijfgebruik weergeven", "addToFolder": "Widget toevoegen aan map", - "noHostSelected": "Geen host geselecteerd", "selectHost": "Selecteer een host...", - "displayedMetrics": "Weergegeven statistieken", - "metricCpu": "CPU", - "metricMemory": "Geheugen", - "metricDisk": "Schijf", - "metricUptime": "Beschikbaarheid", - "metricSystem": "Systeem", - "metricNetwork": "Netwerk", - "metricProcesses": "Processen", - "categoryMonitoring": "Monitoring", "loading": "Laden...", "allClear": "Alles in orde", - "noPingUrls": "Geen URL's geconfigureerd", - "pingLabel": "Label", - "addPingUrl": "URL toevoegen", - "showLatency": "Toon latentie", - "refreshInterval": "Vernieuwingsinterval", - "seconds": "seconden", - "filterActivityTypes": "Filtertypen", - "filterTypesHint": "Laat dit veld leeg om alles weer te geven.", - "showTimestamp": "Toon tijdstempel", - "uptimeUnavailable": "Beschikbaarheid niet beschikbaar", - "uptimeLabel": "Beschikbaarheid", - "overviewVersion": "Versie", "overviewUpdate": "Actueel", - "overviewUpdateLabel": "Update", - "overviewUpdateAvailable": "Update beschikbaar", - "overviewDatabase": "Database", - "overviewUptime": "Beschikbaarheid", - "noHosts": "Geen hosts geconfigureerd", - "hostGridHosts": "Gastheren", - "hostGridAllHint": "Laat dit veld leeg om alle hosts weer te geven.", - "columns": "Kolommen", - "showIp": "IP-adres weergeven", "connectionType": "Verbindingstype", - "layout": "Indeling", - "showStatus": "Status weergeven", "showHostName": "Toon de naam van de presentator", "noDockerActivity": "Geen Docker-activiteit", - "noActivity": "Geen activiteit", "showAcknowledged": "Toon erkend", "widgetMetricsChartName": "Statistiekengrafiek", "widgetMetricsChartDesc": "Historische grafiek van CPU, geheugen, schijf of netwerk voor een host.", "widgetHostGridName": "Host Grid", "widgetHostGridDesc": "Rasterweergave van de status van SSH-hosts", - "widgetPingStatusName": "Pingstatus", "widgetPingStatusDesc": "HTTP-pingstatus voor een of meer URL's", - "widgetRecentActivityName": "Recente activiteit", "widgetRecentActivityDesc": "Scrollbare feed met recente Termix-activiteiten", "widgetTermixUptimeName": "Termix-uptime", "widgetTermixUptimeDesc": "Live uptime-teller voor de Termix-server", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Sneltoetsen voor snel zoeken met inline invoer.", "widgetLinkTreeName": "Linkboom", "widgetLinkTreeDesc": "Gegroepeerde secties met links en bijbehorende kopjes.", - "calMon": "Mo", - "calTue": "Tu", - "calWed": "Wij", - "calThu": "E", - "calFri": "Fr", - "calSat": "Sa", - "calSun": "Zo", - "startOnMonday": "De week begint op maandag.", - "countdownNoDate": "Geen streefdatum vastgesteld", - "countdownPast": "Het evenement heeft plaatsgevonden.", - "countdownDays": "dagen", - "countdownHours": "uren", - "countdownMinutes": "min", - "countdownSeconds": "sec", - "countdownLabel": "Label", - "countdownLabelPlaceholder": "bijvoorbeeld Lanceringsdag", - "countdownShowDays": "Showdagen", - "countdownShowHours": "Openingstijden", - "targetDate": "Streefdatum", - "searchEngine": "Zoekmachine", - "customSearchUrl": "Aangepaste zoek-URL", - "searchPlaceholder": "Zoekopdracht...", - "searchGo": "Gaan", - "searchPlaceholderLabel": "Plaatsvervangende tekst", - "searchPlaceholderHint": "Tekst die wordt weergegeven in het zoekveld", - "openInNewTab": "Openen in een nieuw tabblad", - "searchQueryPlaceholder": "Voer uw zoekopdracht in...", - "noSearchShortcuts": "Er zijn geen snelkoppelingen geconfigureerd.", - "addSearchShortcut": "Snelkoppeling toevoegen", - "fontSize": "Lettergrootte", - "textAlign": "Tekst uitlijnen", - "fontWeight": "Lettertypegewicht", - "clearColor": "Transparante kleur", - "imageFit": "Afbeelding passend maken", - "imageLinkUrl": "Link-URL", - "noImage": "Geen afbeeldings-URL ingesteld", - "altText": "Alternatieve tekst", - "altTextPlaceholder": "Beschrijf de afbeelding", - "renderMarkdown": "Markdown weergeven", - "displayMode": "Weergavemodus", - "displayField": "Weergaveveld", - "jsonPath": "JSON-pad", - "customApiLabel": "Label", - "customApiLabelPlaceholder": "bijv. Temperatuur", - "customApiUnit": "Eenheid", - "customApiNoUrl": "Geen API-URL geconfigureerd", - "customApiError": "Het ophalen is mislukt.", - "customApiNotArray": "Het antwoord is geen array.", - "addService": "Voeg een service toe", - "showLabels": "Labels weergeven", - "iconSize": "Pictogramgrootte", - "noDashboardLinks": "Er zijn geen dashboardlinks geconfigureerd.", - "noLimit": "Geen limiet", - "sectionHeading": "Sectiekop", - "addSection": "Sectie toevoegen", - "compactMode": "Compacte modus", "showDetailed": "Gedetailleerde weergave", - "selectHosts": "Selecteer hosts", "allHosts": "Alle hosts", - "listLayout": "Lijst", - "gridLayout": "Rooster", "terminal": "Terminal", "files": "Bestanden", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Accentkleur", "widgetSshTerminalName": "SSH-terminal", "widgetSshTerminalDesc": "Een inline SSH-terminal verbonden met een geconfigureerde host.", - "sshTerminalNoHost": "Geen host geconfigureerd", - "sshTerminalConnect": "Verbinden", - "sshTerminalAutoConnect": "Automatisch aansluiten bij belasting", "widgetQuickConnectName": "Snel verbinden", "widgetQuickConnectDesc": "Startknoppen met één klik voor elk verbindingstype op al uw hosts.", - "connectionTypes": "Verbindingstypen", "connType_terminal": "Terminal", "connType_files": "Bestandsbeheerder", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Tabblad hernoemen", "openFileManager": "Open bestandsbeheerder", "dashboard": "Dashboard", - "homepage": "Startpagina", "quickConnect": "Snel verbinden", "sshTools": "SSH-tools", "history": "Geschiedenis", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Serverstatistieken", "panelMain": "Voornaamst", "panelSide": "Kant", - "justNow": "zojuist", - "serviceLinks": "Servicelinks", - "homepagePreview": "Startpagina-voorbeeld" + "justNow": "zojuist" }, "donation": { "title": "Vind je Termix lekker?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Sleep kaarten om de volgorde te wijzigen · Sleep de kolomscheidingslijn om de kolombreedte aan te passen · Sleep de onderrand van een kaart om de hoogte aan te passen · Verwijder kaarten uit de prullenbak", "empty": "Leeg", "clear": "Duidelijk", - "serviceLinksTitle": "Servicelinks", - "serviceLinksEmpty": "Er zijn nog geen servicelinks beschikbaar.", "serviceLinksAddLabel": "Label", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Toevoegen", - "serviceLinksLabelPlaceholder": "Mijn Service", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Voer een geldig webadres in.", - "serviceLinksAddFailed": "Het toevoegen van de servicelink is mislukt.", "viewServerDetails": "Servergegevens bekijken" }, "admin": { diff --git a/src/ui/locales/translated/no_NO.json b/src/ui/locales/translated/no_NO.json index 4eee01c42..002b423d0 100644 --- a/src/ui/locales/translated/no_NO.json +++ b/src/ui/locales/translated/no_NO.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Lås opp og dra for å omorganisere" }, "homepage": { - "title": "Hjemmeside", - "addWidget": "Legg til widget", - "editWidget": "Rediger widget", "deleteWidget": "Slett", "widgetTypes": "Widget-typer", "serviceLink": "Tjenestekobling", @@ -206,116 +203,40 @@ "notes": "Notater", "hostStatus": "Vertsstatus", "bookmarkList": "Bokmerker", - "zoomIn": "Zoom inn", - "zoomOut": "Zoom ut", - "resetView": "Tilbakestill visning", - "lockLayout": "Låseoppsett", - "unlockLayout": "Lås opp oppsett", - "noWidgets": "Høyreklikk eller klikk på + for å legge til din første widget", - "openFullView": "Åpne fullvisning", - "previewTitle": "Forhåndsvisning av hjemmeside", - "cancel": "Kansellere", - "save": "Spare", - "title_label": "Tittel", - "widgetTitlePlaceholder": "Widgettittel (valgfritt)", - "url": "URL-adresse", - "imageUrl": "Tilpasset bilde-URL", - "imageUrlHint": "La feltet stå tomt for å bruke nettstedets favicon automatisk", - "showImage": "Vis bilde", - "description": "Beskrivelse", - "color": "Farge", "icon": "Ikon", "expanded": "Utvidet som standard", - "timezone": "Tidssone", - "invalidTimezone": "Ugyldig tidssone. Bruk et IANA-navn, for eksempel America/New_York.", - "showSeconds": "Vis sekunder", - "format12h": "12-timers", "format24h": "24-timers", - "content": "Innhold", - "backgroundColor": "Bakgrunnsfarge", "host": "Vert", "showMetrics": "Vis beregninger", - "links": "Lenker", - "addLink": "Legg til lenke", - "linkLabel": "Merkelapp", "linkUrl": "URL-adresse", "removeLink": "Fjerne", - "categoryLinks": "Lenker", - "categoryInfo": "Info", - "categorySystem": "System", "widgetServiceLinkDesc": "En klikkbar flis som lenker til en tjeneste-URL", "widgetFolderDesc": "En beholder for å gruppere relaterte widgeter", "widgetClockDesc": "En live-klokke med konfigurerbar tidssone", "widgetNotesDesc": "En widget for nedmerkingsnotater", "widgetHostStatusDesc": "Viser live CPU, minne og disk for en SSH-vert", "widgetBookmarkListDesc": "En liste over hurtiglenker", - "copyLink": "Kopier lenke", - "linkCopied": "Lenken er kopiert!", - "location": "Sted", - "temperatureUnit": "Temperaturenhet", - "showForecast": "Vis 3-dagers værmelding", - "scrolling": "Tillat rulling", - "feedUrl": "Nettadresse for feeden", - "maxItems": "Maksimalt antall varer", - "showDescription": "Vis beskrivelse", "widgetWeatherName": "Vær", "widgetWeatherDesc": "Live vær for alle steder", "widgetIframeName": "iFrame-innbygging", "widgetIframeDesc": "Legg inn en hvilken som helst URL i en iframe", - "widgetRssName": "RSS-feed", "widgetRssDesc": "Vis elementer fra en RSS- eller Atom-feed", "dragToFolder": "Dra widgeter hit eller bruk + for å legge til", "showDisk": "Vis diskbruk", "addToFolder": "Legg til widget i mappe", - "noHostSelected": "Ingen vert valgt", "selectHost": "Velg en vert...", - "displayedMetrics": "Viste målinger", - "metricCpu": "CPU", - "metricMemory": "Hukommelse", - "metricDisk": "Disk", - "metricUptime": "Oppetid", - "metricSystem": "System", - "metricNetwork": "Nettverk", - "metricProcesses": "Prosesser", - "categoryMonitoring": "Overvåking", "loading": "Laster inn...", "allClear": "Alt klart", - "noPingUrls": "Ingen nettadresser konfigurert", - "pingLabel": "Merkelapp", - "addPingUrl": "Legg til nettadresse", - "showLatency": "Vis latens", - "refreshInterval": "Oppdateringsintervall", - "seconds": "sekunder", - "filterActivityTypes": "Filtertyper", - "filterTypesHint": "La stå tomt for å vise alle", - "showTimestamp": "Vis tidsstempel", - "uptimeUnavailable": "Oppetid utilgjengelig", - "uptimeLabel": "Oppetid", - "overviewVersion": "Versjon", "overviewUpdate": "Oppdatert", - "overviewUpdateLabel": "Oppdatering", - "overviewUpdateAvailable": "Oppdatering tilgjengelig", - "overviewDatabase": "Database", - "overviewUptime": "Oppetid", - "noHosts": "Ingen verter konfigurert", - "hostGridHosts": "Verter", - "hostGridAllHint": "La stå tomt for å vise alle verter", - "columns": "Kolonner", - "showIp": "Vis IP-adresse", "connectionType": "Tilkoblingstype", - "layout": "Oppsett", - "showStatus": "Vis status", "showHostName": "Vis vertsnavn", "noDockerActivity": "Ingen Docker-aktivitet", - "noActivity": "Ingen aktivitet", "showAcknowledged": "Vis bekreftet", "widgetMetricsChartName": "Målinger Diagram", "widgetMetricsChartDesc": "Historisk CPU-, minne-, disk- eller nettverksdiagram for en vert", "widgetHostGridName": "Vertsnett", "widgetHostGridDesc": "Rutenettvisning av SSH-vertstatuser", - "widgetPingStatusName": "Ping-status", "widgetPingStatusDesc": "HTTP-pingstatus for én eller flere URL-er", - "widgetRecentActivityName": "Nylig aktivitet", "widgetRecentActivityDesc": "Rullbar feed av nylig Termix-aktivitet", "widgetTermixUptimeName": "Termix Oppetid", "widgetTermixUptimeDesc": "Live oppetidsteller for Termix-serveren", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Hurtigsøk snarveiknapper med innebygd inndata", "widgetLinkTreeName": "Lenketre", "widgetLinkTreeDesc": "Grupperte deler av lenker med overskrifter", - "calMon": "Mo", - "calTue": "Ti", - "calWed": "Vi", - "calThu": "To", - "calFri": "Fr", - "calSat": "Lø", - "calSun": "Søn", - "startOnMonday": "Start uken på mandag", - "countdownNoDate": "Ingen måldato angitt", - "countdownPast": "Arrangementet har gått", - "countdownDays": "dager", - "countdownHours": "timer", - "countdownMinutes": "min", - "countdownSeconds": "sek", - "countdownLabel": "Merkelapp", - "countdownLabelPlaceholder": "f.eks. lanseringsdag", - "countdownShowDays": "Vis dager", - "countdownShowHours": "Åpningstider", - "targetDate": "Måldato", - "searchEngine": "Søkemotor", - "customSearchUrl": "Tilpasset søke-URL", - "searchPlaceholder": "Søk...", - "searchGo": "Gå", - "searchPlaceholderLabel": "Plassholdertekst", - "searchPlaceholderHint": "Tekst vist i søkefeltet", - "openInNewTab": "Åpne i ny fane", - "searchQueryPlaceholder": "Skriv inn spørring...", - "noSearchShortcuts": "Ingen snarveier konfigurert", - "addSearchShortcut": "Legg til snarvei", - "fontSize": "Skriftstørrelse", - "textAlign": "Tekstjustering", - "fontWeight": "Skriftvekt", - "clearColor": "Klar farge", - "imageFit": "Bildetilpasning", - "imageLinkUrl": "Lenke-URL", - "noImage": "Ingen bilde-URL angitt", - "altText": "Alternativ tekst", - "altTextPlaceholder": "Beskriv bildet", - "renderMarkdown": "Gjengivelsesmarkering", - "displayMode": "Visningsmodus", - "displayField": "Visningsfelt", - "jsonPath": "JSON-sti", - "customApiLabel": "Merkelapp", - "customApiLabelPlaceholder": "f.eks. Temperatur", - "customApiUnit": "Enhet", - "customApiNoUrl": "Ingen API-URL konfigurert", - "customApiError": "Kunne ikke hente", - "customApiNotArray": "Responsen er ikke en matrise", - "addService": "Legg til tjeneste", - "showLabels": "Vis etiketter", - "iconSize": "Ikonstørrelse", - "noDashboardLinks": "Ingen dashbordlenker konfigurert", - "noLimit": "Ingen grense", - "sectionHeading": "Seksjonsoverskrift", - "addSection": "Legg til seksjon", - "compactMode": "Kompakt modus", "showDetailed": "Vis detaljert", - "selectHosts": "Velg verter", "allHosts": "Alle verter", - "listLayout": "Liste", - "gridLayout": "Rutenett", "terminal": "Terminal", "files": "Filer", "docker": "Dokker", @@ -422,12 +284,8 @@ "accentColor": "Aksentfarge", "widgetSshTerminalName": "SSH-terminal", "widgetSshTerminalDesc": "En innebygd SSH-terminal koblet til en konfigurert vert", - "sshTerminalNoHost": "Ingen vert konfigurert", - "sshTerminalConnect": "Koble til", - "sshTerminalAutoConnect": "Automatisk tilkobling ved lasting", "widgetQuickConnectName": "Hurtigtilkobling", "widgetQuickConnectDesc": "Ettklikks startknapper for alle tilkoblingstyper på tvers av vertene dine", - "connectionTypes": "Tilkoblingstyper", "connType_terminal": "Terminal", "connType_files": "Filbehandler", "connType_docker": "Dokker", @@ -685,7 +543,6 @@ "renameTab": "Gi nytt navn til fanen", "openFileManager": "Åpne filbehandleren", "dashboard": "Dashbord", - "homepage": "Hjemmeside", "quickConnect": "Hurtigtilkobling", "sshTools": "SSH-verktøy", "history": "Historie", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Serverstatistikk", "panelMain": "Hoved", "panelSide": "Side", - "justNow": "akkurat nå", - "serviceLinks": "Tjenestelenker", - "homepagePreview": "Forhåndsvisning av hjemmeside" + "justNow": "akkurat nå" }, "donation": { "title": "Liker du Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Dra kort for å endre rekkefølge · Dra kolonnedeleren for å endre størrelsen på kolonnene · Dra i den nederste kanten av et kort for å endre størrelsen på høyden · Papirkurven for å fjerne", "empty": "Tømme", "clear": "Klar", - "serviceLinksTitle": "Tjenestelenker", - "serviceLinksEmpty": "Ingen tjenestelenker ennå", "serviceLinksAddLabel": "Merkelapp", "serviceLinksAddUrl": "URL-adresse", - "serviceLinksAdd": "Legge til", - "serviceLinksLabelPlaceholder": "Min tjeneste", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Skriv inn en gyldig nettadresse", - "serviceLinksAddFailed": "Kunne ikke legge til tjenestelenke", "viewServerDetails": "Vis serverdetaljer" }, "admin": { diff --git a/src/ui/locales/translated/pl_PL.json b/src/ui/locales/translated/pl_PL.json index 0ba625af3..f494bb59d 100644 --- a/src/ui/locales/translated/pl_PL.json +++ b/src/ui/locales/translated/pl_PL.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Odblokuj przeciąganie, aby zmienić kolejność" }, "homepage": { - "title": "Strona główna", - "addWidget": "Dodaj widżet", - "editWidget": "Edytuj widżet", "deleteWidget": "Usuń", "widgetTypes": "Typy widżetów", "serviceLink": "Link do usługi", @@ -206,116 +203,40 @@ "notes": "Notatki", "hostStatus": "Status hosta", "bookmarkList": "Zakładki", - "zoomIn": "Powiększ", - "zoomOut": "Oddal", - "resetView": "Resetuj widok", - "lockLayout": "Zablokuj układ", - "unlockLayout": "Odblokuj układ", - "noWidgets": "Kliknij prawym przyciskiem myszy lub kliknij +, aby dodać pierwszy widżet", - "openFullView": "Otwórz pełny widok", - "previewTitle": "Podgląd strony głównej", - "cancel": "Anuluj", - "save": "Zapisz", - "title_label": "Tytuł", - "widgetTitlePlaceholder": "Tytuł widżetu (opcjonalnie)", - "url": "Adres URL", - "imageUrl": "Niestandardowy adres URL obrazu", - "imageUrlHint": "Pozostaw puste, aby automatycznie użyć ikony witryny", - "showImage": "Pokaż obraz", - "description": "Opis", - "color": "Kolor", "icon": "Ikona", "expanded": "Domyślnie rozwinięty", - "timezone": "Strefa czasowa", - "invalidTimezone": "Nieprawidłowa strefa czasowa. Użyj nazwy IANA, takiej jak America/New_York", - "showSeconds": "Pokaż sekundy", - "format12h": "12-godzinny", "format24h": "24-godzinny", - "content": "Treść", - "backgroundColor": "Kolor tła", "host": "Host", "showMetrics": "Pokaż metryki", - "links": "Linki", - "addLink": "Dodaj link", - "linkLabel": "Etykieta", "linkUrl": "Adres URL", "removeLink": "Usuń", - "categoryLinks": "Linki", - "categoryInfo": "Informacje", - "categorySystem": "System", "widgetServiceLinkDesc": "Klikalny kafelek łączący się z adresem URL usługi", "widgetFolderDesc": "Kontener do grupowania powiązanych widżetów", "widgetClockDesc": "Zegar na żywo z konfigurowalną strefą czasową", "widgetNotesDesc": "Widżet notatek Markdown", "widgetHostStatusDesc": "Pokazuje aktualne zużycie procesora, pamięci i dysku dla hosta SSH", "widgetBookmarkListDesc": "Lista szybkich linków", - "copyLink": "Kopiuj link", - "linkCopied": "Link skopiowany!", - "location": "Lokalizacja", - "temperatureUnit": "Jednostka temperatury", - "showForecast": "Pokaż prognozę 3-dniową", - "scrolling": "Zezwól na przewijanie", - "feedUrl": "Adres URL kanału", - "maxItems": "Maksymalna liczba elementów", - "showDescription": "Pokaż opis", "widgetWeatherName": "Pogoda", "widgetWeatherDesc": "Pogoda na żywo dla dowolnej lokalizacji", "widgetIframeName": "Osadzenie iFrame", "widgetIframeDesc": "Osadź dowolny adres URL w ramce iframe", - "widgetRssName": "Kanał RSS", "widgetRssDesc": "Wyświetlaj elementy z kanału RSS lub Atom", "dragToFolder": "Przeciągnij widżety tutaj lub użyj +, aby je dodać", "showDisk": "Pokaż użycie dysku", "addToFolder": "Dodaj widżet do folderu", - "noHostSelected": "Nie wybrano hosta", "selectHost": "Wybierz hosta...", - "displayedMetrics": "Wyświetlane metryki", - "metricCpu": "Procesor", - "metricMemory": "Pamięć", - "metricDisk": "Dysk", - "metricUptime": "Czas działania", - "metricSystem": "System", - "metricNetwork": "Sieć", - "metricProcesses": "Procesy", - "categoryMonitoring": "Monitorowanie", "loading": "Ładowanie...", "allClear": "Bez alertów", - "noPingUrls": "Brak skonfigurowanych adresów URL", - "pingLabel": "Etykieta", - "addPingUrl": "Dodaj adres URL", - "showLatency": "Pokaż opóźnienie", - "refreshInterval": "Interwał odświeżania", - "seconds": "sekundy", - "filterActivityTypes": "Filtruj typy", - "filterTypesHint": "Pozostaw puste, aby wyświetlić wszystkie", - "showTimestamp": "Pokaż znacznik czasu", - "uptimeUnavailable": "Czas działania niedostępny", - "uptimeLabel": "Czas działania", - "overviewVersion": "Wersja", "overviewUpdate": "Aktualna", - "overviewUpdateLabel": "Aktualizacja", - "overviewUpdateAvailable": "Dostępna aktualizacja", - "overviewDatabase": "Baza danych", - "overviewUptime": "Czas działania", - "noHosts": "Brak skonfigurowanych hostów", - "hostGridHosts": "Hosty", - "hostGridAllHint": "Pozostaw puste, aby wyświetlić wszystkie hosty", - "columns": "Kolumny", - "showIp": "Pokaż adres IP", "connectionType": "Typ połączenia", - "layout": "Układ", - "showStatus": "Pokaż status", "showHostName": "Pokaż nazwę hosta", "noDockerActivity": "Brak aktywności Dockera", - "noActivity": "Brak aktywności", "showAcknowledged": "Pokaż potwierdzone", "widgetMetricsChartName": "Wykres metryk", "widgetMetricsChartDesc": "Historyczny wykres procesora, pamięci, dysku lub sieci dla hosta", "widgetHostGridName": "Siatka hostów", "widgetHostGridDesc": "Widok siatki statusów hostów SSH", - "widgetPingStatusName": "Status pingu", "widgetPingStatusDesc": "Status pingu HTTP dla jednego lub większej liczby adresów URL", - "widgetRecentActivityName": "Ostatnia aktywność", "widgetRecentActivityDesc": "Przewijalna lista ostatniej aktywności w Termixie", "widgetTermixUptimeName": "Czas działania Termixa", "widgetTermixUptimeDesc": "Licznik czasu działania serwera Termix na żywo", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Przyciski szybkiego wyszukiwania z polem wpisywania", "widgetLinkTreeName": "Drzewo linków", "widgetLinkTreeDesc": "Zgrupowane sekcje linków z nagłówkami", - "calMon": "Pn", - "calTue": "Wt", - "calWed": "Śr", - "calThu": "Cz", - "calFri": "Pt", - "calSat": "So", - "calSun": "Nd", - "startOnMonday": "Zacznij tydzień w poniedziałek", - "countdownNoDate": "Nie ustalono daty docelowej", - "countdownPast": "Wydarzenie minęło", - "countdownDays": "dni", - "countdownHours": "godz.", - "countdownMinutes": "min", - "countdownSeconds": "sek", - "countdownLabel": "Etykieta", - "countdownLabelPlaceholder": "np. Dzień premiery", - "countdownShowDays": "Pokaż dni", - "countdownShowHours": "Pokaż godziny", - "targetDate": "Data docelowa", - "searchEngine": "Wyszukiwarka", - "customSearchUrl": "Niestandardowy adres URL wyszukiwania", - "searchPlaceholder": "Szukaj...", - "searchGo": "Szukaj", - "searchPlaceholderLabel": "Tekst zastępczy", - "searchPlaceholderHint": "Tekst wyświetlany w polu wyszukiwania", - "openInNewTab": "Otwórz w nowej karcie", - "searchQueryPlaceholder": "Wprowadź zapytanie...", - "noSearchShortcuts": "Brak skonfigurowanych skrótów", - "addSearchShortcut": "Dodaj skrót", - "fontSize": "Rozmiar czcionki", - "textAlign": "Wyrównanie tekstu", - "fontWeight": "Grubość czcionki", - "clearColor": "Wyczyść kolor", - "imageFit": "Dopasowanie obrazu", - "imageLinkUrl": "Adres URL łącza", - "noImage": "Nie ustawiono adresu URL obrazu", - "altText": "Tekst alternatywny", - "altTextPlaceholder": "Opisz obraz", - "renderMarkdown": "Renderuj Markdown", - "displayMode": "Tryb wyświetlania", - "displayField": "Pole wyświetlania", - "jsonPath": "Ścieżka JSON", - "customApiLabel": "Etykieta", - "customApiLabelPlaceholder": "np. Temperatura", - "customApiUnit": "Jednostka", - "customApiNoUrl": "Brak skonfigurowanego adresu URL API", - "customApiError": "Nie udało się pobrać", - "customApiNotArray": "Odpowiedź nie jest tablicą", - "addService": "Dodaj usługę", - "showLabels": "Pokaż etykiety", - "iconSize": "Rozmiar ikony", - "noDashboardLinks": "Brak skonfigurowanych linków pulpitu", - "noLimit": "Bez limitu", - "sectionHeading": "Nagłówek sekcji", - "addSection": "Dodaj sekcję", - "compactMode": "Tryb kompaktowy", "showDetailed": "Pokaż szczegółowe", - "selectHosts": "Wybierz hosty", "allHosts": "Wszystkie hosty", - "listLayout": "Lista", - "gridLayout": "Siatka", "terminal": "Terminal", "files": "Pliki", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Kolor akcentowy", "widgetSshTerminalName": "Terminal SSH", "widgetSshTerminalDesc": "Osadzony terminal SSH połączony ze skonfigurowanym hostem", - "sshTerminalNoHost": "Brak skonfigurowanego hosta", - "sshTerminalConnect": "Połącz", - "sshTerminalAutoConnect": "Automatyczne łączenie po załadowaniu", "widgetQuickConnectName": "Szybkie połączenie", "widgetQuickConnectDesc": "Przyciski uruchamiania jednym kliknięciem dla dowolnego typu połączenia na Twoich hostach", - "connectionTypes": "Typy połączeń", "connType_terminal": "Terminal", "connType_files": "Menedżer plików", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Zmień nazwę karty", "openFileManager": "Otwórz menedżer plików", "dashboard": "Pulpit", - "homepage": "Strona główna", "quickConnect": "Szybkie połączenie", "sshTools": "Narzędzia SSH", "history": "Historia", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Statystyki serwera", "panelMain": "Główny", "panelSide": "Boczny", - "justNow": "przed chwilą", - "serviceLinks": "Linki do usług", - "homepagePreview": "Podgląd strony głównej" + "justNow": "przed chwilą" }, "donation": { "title": "Podoba Ci się Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Przeciągnij karty, aby zmienić kolejność · Przeciągnij separator kolumn, aby zmienić ich szerokość · Przeciągnij dolną krawędź karty, aby zmienić jej wysokość · Kosz usuwa kartę", "empty": "Puste", "clear": "Wyczyść", - "serviceLinksTitle": "Linki do usług", - "serviceLinksEmpty": "Brak linków do usług", "serviceLinksAddLabel": "Etykieta", "serviceLinksAddUrl": "Adres URL", - "serviceLinksAdd": "Dodaj", - "serviceLinksLabelPlaceholder": "Moja usługa", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Wprowadź prawidłowy adres internetowy", - "serviceLinksAddFailed": "Nie udało się dodać linku do usługi", "viewServerDetails": "Wyświetl szczegóły serwera" }, "admin": { diff --git a/src/ui/locales/translated/pt_BR.json b/src/ui/locales/translated/pt_BR.json index c06f22e00..8cce31bb2 100644 --- a/src/ui/locales/translated/pt_BR.json +++ b/src/ui/locales/translated/pt_BR.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Desbloqueie e arraste para reorganizar." }, "homepage": { - "title": "Página inicial", - "addWidget": "Adicionar widget", - "editWidget": "Widget de edição", "deleteWidget": "Excluir", "widgetTypes": "Tipos de widgets", "serviceLink": "Link de serviço", @@ -206,116 +203,40 @@ "notes": "Notas", "hostStatus": "Status do host", "bookmarkList": "Favoritos", - "zoomIn": "Ampliar", - "zoomOut": "Diminuir o zoom", - "resetView": "Redefinir visualização", - "lockLayout": "Configuração de fechadura", - "unlockLayout": "Desbloquear layout", - "noWidgets": "Clique com o botão direito do mouse ou clique em + para adicionar seu primeiro widget.", - "openFullView": "Abrir visualização completa", - "previewTitle": "Pré-visualização da página inicial", - "cancel": "Cancelar", - "save": "Salvar", - "title_label": "Título", - "widgetTitlePlaceholder": "Título do widget (opcional)", - "url": "URL", - "imageUrl": "URL da imagem personalizada", - "imageUrlHint": "Deixe em branco para usar o favicon do site automaticamente.", - "showImage": "Mostrar imagem", - "description": "Descrição", - "color": "Cor", "icon": "Ícone", "expanded": "Expandido por padrão", - "timezone": "Fuso horário", - "invalidTimezone": "Fuso horário inválido. Use um nome IANA, como America/New_York.", - "showSeconds": "Mostrar segundos", - "format12h": "12 horas", "format24h": "24 horas", - "content": "Contente", - "backgroundColor": "Cor de fundo", "host": "Hospedar", "showMetrics": "Mostrar métricas", - "links": "Links", - "addLink": "Adicionar link", - "linkLabel": "Rótulo", "linkUrl": "URL", "removeLink": "Remover", - "categoryLinks": "Links", - "categoryInfo": "Informações", - "categorySystem": "Sistema", "widgetServiceLinkDesc": "Um bloco clicável que direciona para um URL de serviço.", "widgetFolderDesc": "Um contêiner para agrupar widgets relacionados.", "widgetClockDesc": "Um relógio em tempo real com fuso horário configurável.", "widgetNotesDesc": "Um widget de notas em Markdown", "widgetHostStatusDesc": "Exibe o uso de CPU, memória e disco em tempo real para um host SSH.", "widgetBookmarkListDesc": "Lista de links rápidos", - "copyLink": "Copiar link", - "linkCopied": "Link copiado!", - "location": "Localização", - "temperatureUnit": "Unidade de temperatura", - "showForecast": "Mostrar previsão para 3 dias", - "scrolling": "Permitir rolagem", - "feedUrl": "URL do feed", - "maxItems": "Número máximo de itens", - "showDescription": "Descrição do programa", "widgetWeatherName": "Clima", "widgetWeatherDesc": "Previsão do tempo ao vivo para qualquer local.", "widgetIframeName": "Incorporação de iFrame", "widgetIframeDesc": "Incorpore qualquer URL em um iframe.", - "widgetRssName": "Feed RSS", "widgetRssDesc": "Exibir itens de um feed RSS ou Atom", "dragToFolder": "Arraste os widgets para cá ou use o sinal de + para adicionar.", "showDisk": "Mostrar uso do disco", "addToFolder": "Adicionar widget à pasta", - "noHostSelected": "Nenhum host selecionado", "selectHost": "Selecione um host...", - "displayedMetrics": "Métricas exibidas", - "metricCpu": "CPU", - "metricMemory": "Memória", - "metricDisk": "Disco", - "metricUptime": "Tempo de atividade", - "metricSystem": "Sistema", - "metricNetwork": "Rede", - "metricProcesses": "Processos", - "categoryMonitoring": "Monitoramento", "loading": "Carregando...", "allClear": "Tudo certo", - "noPingUrls": "Nenhuma URL configurada", - "pingLabel": "Rótulo", - "addPingUrl": "Adicionar URL", - "showLatency": "Mostrar latência", - "refreshInterval": "Intervalo de atualização", - "seconds": "segundos", - "filterActivityTypes": "Tipos de filtro", - "filterTypesHint": "Deixe em branco para mostrar tudo", - "showTimestamp": "Mostrar carimbo de data/hora", - "uptimeUnavailable": "Tempo de atividade indisponível", - "uptimeLabel": "Tempo de atividade", - "overviewVersion": "Versão", "overviewUpdate": "Atualizado", - "overviewUpdateLabel": "Atualizar", - "overviewUpdateAvailable": "Atualização disponível", - "overviewDatabase": "Banco de dados", - "overviewUptime": "Tempo de atividade", - "noHosts": "Nenhum host configurado", - "hostGridHosts": "Anfitriões", - "hostGridAllHint": "Deixe em branco para mostrar todos os hosts.", - "columns": "Colunas", - "showIp": "Mostrar endereço IP", "connectionType": "Tipo de conexão", - "layout": "Layout", - "showStatus": "Mostrar status", "showHostName": "Mostrar nome do apresentador", "noDockerActivity": "Nenhuma atividade do Docker", - "noActivity": "Nenhuma atividade", "showAcknowledged": "Mostrar reconhecido", "widgetMetricsChartName": "Gráfico de métricas", "widgetMetricsChartDesc": "Gráfico histórico de CPU, memória, disco ou rede para um host", "widgetHostGridName": "Grade de anfitriões", "widgetHostGridDesc": "Visualização em grade dos status dos hosts SSH", - "widgetPingStatusName": "Status do ping", "widgetPingStatusDesc": "Status do ping HTTP para um ou mais URLs", - "widgetRecentActivityName": "Atividade recente", "widgetRecentActivityDesc": "Feed de rolagem com atividades recentes do Termix", "widgetTermixUptimeName": "Tempo de atividade do Termix", "widgetTermixUptimeDesc": "Contador de tempo de atividade em tempo real para o servidor Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Botões de atalho de pesquisa rápida com entrada embutida", "widgetLinkTreeName": "Link Tree", "widgetLinkTreeDesc": "Seções agrupadas de links com títulos", - "calMon": "Mo", - "calTue": "Tu", - "calWed": "Nós", - "calThu": "O", - "calFri": "Padre", - "calSat": "Sa", - "calSun": "Su", - "startOnMonday": "Comece a semana na segunda-feira", - "countdownNoDate": "Nenhuma data-alvo definida.", - "countdownPast": "O evento já aconteceu.", - "countdownDays": "dias", - "countdownHours": "horas", - "countdownMinutes": "min", - "countdownSeconds": "seg", - "countdownLabel": "Rótulo", - "countdownLabelPlaceholder": "Exemplo: Dia do Lançamento", - "countdownShowDays": "Dias de exibição", - "countdownShowHours": "Horário de funcionamento", - "targetDate": "Data-alvo", - "searchEngine": "Mecanismo de busca", - "customSearchUrl": "URL de pesquisa personalizada", - "searchPlaceholder": "Procurar...", - "searchGo": "Ir", - "searchPlaceholderLabel": "Texto de espaço reservado", - "searchPlaceholderHint": "Texto exibido dentro do campo de pesquisa", - "openInNewTab": "Abrir em nova aba", - "searchQueryPlaceholder": "Digite a consulta...", - "noSearchShortcuts": "Nenhum atalho configurado", - "addSearchShortcut": "Adicionar atalho", - "fontSize": "Tamanho da fonte", - "textAlign": "Alinhamento de texto", - "fontWeight": "Peso da fonte", - "clearColor": "Cor transparente", - "imageFit": "Ajuste de imagem", - "imageLinkUrl": "URL do link", - "noImage": "Nenhuma URL de imagem definida.", - "altText": "Texto alternativo", - "altTextPlaceholder": "Descreva a imagem", - "renderMarkdown": "Renderizar Markdown", - "displayMode": "Modo de exibição", - "displayField": "Campo de exibição", - "jsonPath": "Caminho JSON", - "customApiLabel": "Rótulo", - "customApiLabelPlaceholder": "Exemplo: Temperatura", - "customApiUnit": "Unidade", - "customApiNoUrl": "Nenhuma URL de API configurada", - "customApiError": "Falha ao buscar", - "customApiNotArray": "A resposta não é uma matriz.", - "addService": "Adicionar serviço", - "showLabels": "Mostrar rótulos", - "iconSize": "Tamanho do ícone", - "noDashboardLinks": "Nenhum link para o painel de controle configurado", - "noLimit": "Sem limite", - "sectionHeading": "Título da seção", - "addSection": "Adicionar seção", - "compactMode": "Modo compacto", "showDetailed": "Mostrar detalhes", - "selectHosts": "Selecionar anfitriões", "allHosts": "Todos os anfitriões", - "listLayout": "Lista", - "gridLayout": "Grade", "terminal": "terminal", "files": "Arquivos", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Cor de destaque", "widgetSshTerminalName": "Terminal SSH", "widgetSshTerminalDesc": "Um terminal SSH embutido conectado a um host configurado.", - "sshTerminalNoHost": "Nenhum host configurado", - "sshTerminalConnect": "Conectar", - "sshTerminalAutoConnect": "Conexão automática sob carga", "widgetQuickConnectName": "Conexão rápida", "widgetQuickConnectDesc": "Botões de inicialização com um clique para qualquer tipo de conexão em seus hosts.", - "connectionTypes": "Tipos de conexão", "connType_terminal": "terminal", "connType_files": "Gerenciador de arquivos", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Renomear guia", "openFileManager": "Abra o Gerenciador de Arquivos", "dashboard": "Painel", - "homepage": "Página inicial", "quickConnect": "Conexão rápida", "sshTools": "Ferramentas SSH", "history": "História", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Estatísticas do servidor", "panelMain": "Principal", "panelSide": "Lado", - "justNow": "agora mesmo", - "serviceLinks": "Links de serviço", - "homepagePreview": "Pré-visualização da página inicial" + "justNow": "agora mesmo" }, "donation": { "title": "Gostando do Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Arraste os cartões para reordená-los · Arraste o divisor de colunas para redimensionar as colunas · Arraste a borda inferior de um cartão para redimensionar sua altura · Lixeira para remover", "empty": "Vazio", "clear": "Claro", - "serviceLinksTitle": "Links de serviço", - "serviceLinksEmpty": "Ainda não há links de serviço.", "serviceLinksAddLabel": "Rótulo", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Adicionar", - "serviceLinksLabelPlaceholder": "Meu Serviço", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Insira um endereço web válido.", - "serviceLinksAddFailed": "Falha ao adicionar o link de serviço", "viewServerDetails": "Ver detalhes do servidor" }, "admin": { diff --git a/src/ui/locales/translated/pt_PT.json b/src/ui/locales/translated/pt_PT.json index 3007fcebb..0710497eb 100644 --- a/src/ui/locales/translated/pt_PT.json +++ b/src/ui/locales/translated/pt_PT.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Desbloqueie e arraste para reorganizar." }, "homepage": { - "title": "Página Inicial", - "addWidget": "Adicionar widget", - "editWidget": "Editar widget", "deleteWidget": "Apagar", "widgetTypes": "Tipos de Widgets", "serviceLink": "Link de Serviço", @@ -206,116 +203,40 @@ "notes": "Notas", "hostStatus": "Estado do Host", "bookmarkList": "Marcadores", - "zoomIn": "Ampliar", - "zoomOut": "Reduzir", - "resetView": "Repor Vista", - "lockLayout": "Bloquear Disposição", - "unlockLayout": "Desbloquear Disposição", - "noWidgets": "Clique com o botão direito ou em + para adicionar o seu primeiro widget", - "openFullView": "Abrir Vista Completa", - "previewTitle": "Pré-visualização da Página Inicial", - "cancel": "Cancelar", - "save": "Guardar", - "title_label": "Título", - "widgetTitlePlaceholder": "Título do widget (opcional)", - "url": "URL", - "imageUrl": "URL de Imagem Personalizada", - "imageUrlHint": "Deixe em branco para usar automaticamente o favicon do site", - "showImage": "Mostrar Imagem", - "description": "Descrição", - "color": "Cor", "icon": "Ícone", "expanded": "Expandido por predefinição", - "timezone": "Fuso Horário", - "invalidTimezone": "Fuso horário inválido. Utilize um nome IANA, como America/New_York.", - "showSeconds": "Mostrar segundos", - "format12h": "12 horas", "format24h": "24 horas", - "content": "Conteúdo", - "backgroundColor": "Cor de Fundo", "host": "Host", "showMetrics": "Mostrar métricas", - "links": "Hiperligações", - "addLink": "Adicionar ligação", - "linkLabel": "Etiqueta", "linkUrl": "URL", "removeLink": "Remover", - "categoryLinks": "Hiperligações", - "categoryInfo": "Info", - "categorySystem": "Sistema", "widgetServiceLinkDesc": "Um mosaico clicável que liga a um URL de serviço", "widgetFolderDesc": "Um contentor para agrupar widgets relacionados", "widgetClockDesc": "Um relógio em tempo real com fuso horário configurável", "widgetNotesDesc": "Um widget de notas em markdown", "widgetHostStatusDesc": "Mostra CPU, memória e disco em tempo real para um anfitrião SSH", "widgetBookmarkListDesc": "Uma lista de hiperligações rápidas", - "copyLink": "Copiar ligação", - "linkCopied": "Ligação copiada!", - "location": "Localização", - "temperatureUnit": "Unidade de temperatura", - "showForecast": "Mostrar previsão de 3 dias", - "scrolling": "Permitir deslocamento", - "feedUrl": "URL do feed", - "maxItems": "Itens máx.", - "showDescription": "Mostrar descrição", "widgetWeatherName": "Tempo", "widgetWeatherDesc": "Tempo em direto para qualquer localização", "widgetIframeName": "Incorporação iFrame", "widgetIframeDesc": "Incorpora qualquer URL num iframe", - "widgetRssName": "Feed RSS", "widgetRssDesc": "Mostra itens de um feed RSS ou Atom", "dragToFolder": "Arraste widgets aqui ou use + para adicionar", "showDisk": "Mostrar utilização do disco", "addToFolder": "Adicionar widget à pasta", - "noHostSelected": "Nenhum anfitrião selecionado", "selectHost": "Selecionar um host...", - "displayedMetrics": "Métricas Exibidas", - "metricCpu": "CPU", - "metricMemory": "Memória", - "metricDisk": "Disco", - "metricUptime": "Tempo de atividade", - "metricSystem": "Sistema", - "metricNetwork": "Rede", - "metricProcesses": "Processos", - "categoryMonitoring": "Monitorização", "loading": "A carregar...", "allClear": "Tudo em ordem", - "noPingUrls": "Nenhum URL configurado", - "pingLabel": "Etiqueta", - "addPingUrl": "Adicionar URL", - "showLatency": "Mostrar latência", - "refreshInterval": "Intervalo de atualização", - "seconds": "segundos", - "filterActivityTypes": "Filtrar tipos", - "filterTypesHint": "Deixar vazio para mostrar todos", - "showTimestamp": "Mostrar timestamp", - "uptimeUnavailable": "Tempo de atividade indisponível", - "uptimeLabel": "Tempo de atividade", - "overviewVersion": "Versão", "overviewUpdate": "Atualizado", - "overviewUpdateLabel": "Atualização", - "overviewUpdateAvailable": "Atualização disponível", - "overviewDatabase": "Base de dados", - "overviewUptime": "Tempo de atividade", - "noHosts": "Sem hosts configurados", - "hostGridHosts": "Hosts", - "hostGridAllHint": "Deixar em branco para mostrar todos os hosts", - "columns": "Colunas", - "showIp": "Mostrar endereço IP", "connectionType": "Tipo de ligação", - "layout": "Layout", - "showStatus": "Mostrar estado", "showHostName": "Mostrar nome do host", "noDockerActivity": "Sem atividade do Docker", - "noActivity": "Sem atividade", "showAcknowledged": "Mostrar reconhecidos", "widgetMetricsChartName": "Gráfico de métricas", "widgetMetricsChartDesc": "Gráfico histórico de CPU, memória, disco ou rede para um host", "widgetHostGridName": "Grelha de hosts", "widgetHostGridDesc": "Vista em grelha dos estados dos hosts SSH", - "widgetPingStatusName": "Estado do ping", "widgetPingStatusDesc": "Estado do ping HTTP para um ou mais URLs", - "widgetRecentActivityName": "Atividade recente", "widgetRecentActivityDesc": "Feed deslocável da atividade recente do Termix", "widgetTermixUptimeName": "Tempo de atividade do Termix", "widgetTermixUptimeDesc": "Contador em tempo real do tempo de atividade do servidor Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Botões de atalho para pesquisa rápida com entrada inline", "widgetLinkTreeName": "Árvore de Links", "widgetLinkTreeDesc": "Secções agrupadas de links com cabeçalhos", - "calMon": "Seg", - "calTue": "Ter", - "calWed": "Qua", - "calThu": "Qui", - "calFri": "Sex", - "calSat": "Sáb", - "calSun": "Dom", - "startOnMonday": "Começar a semana na segunda-feira", - "countdownNoDate": "Nenhuma data alvo definida", - "countdownPast": "O evento já passou", - "countdownDays": "dias", - "countdownHours": "horas", - "countdownMinutes": "min", - "countdownSeconds": "seg", - "countdownLabel": "Rótulo", - "countdownLabelPlaceholder": "p. ex. Dia de Lançamento", - "countdownShowDays": "Mostrar Dias", - "countdownShowHours": "Mostrar Horas", - "targetDate": "Data Alvo", - "searchEngine": "Motor de Pesquisa", - "customSearchUrl": "URL de Pesquisa Personalizada", - "searchPlaceholder": "Pesquisar...", - "searchGo": "Ir", - "searchPlaceholderLabel": "Texto do Placeholder", - "searchPlaceholderHint": "Texto apresentado no campo de pesquisa", - "openInNewTab": "Abrir num Novo Separador", - "searchQueryPlaceholder": "Introduzir consulta...", - "noSearchShortcuts": "Nenhum atalho configurado", - "addSearchShortcut": "Adicionar Atalho", - "fontSize": "Tamanho da Letra", - "textAlign": "Alinhamento do Texto", - "fontWeight": "Peso da Fonte", - "clearColor": "Limpar Cor", - "imageFit": "Ajuste da Imagem", - "imageLinkUrl": "URL do Link", - "noImage": "Nenhum URL de imagem definido", - "altText": "Texto Alternativo", - "altTextPlaceholder": "Descreva a imagem", - "renderMarkdown": "Renderizar Markdown", - "displayMode": "Modo de Exibição", - "displayField": "Campo de Exibição", - "jsonPath": "Caminho JSON", - "customApiLabel": "Etiqueta", - "customApiLabelPlaceholder": "p. ex. Temperatura", - "customApiUnit": "Unidade", - "customApiNoUrl": "Nenhum URL de API configurado", - "customApiError": "Falha ao obter", - "customApiNotArray": "A resposta não é um array", - "addService": "Adicionar Serviço", - "showLabels": "Mostrar Etiquetas", - "iconSize": "Tamanho do Ícone", - "noDashboardLinks": "Nenhuma ligação do painel configurada", - "noLimit": "Sem limite", - "sectionHeading": "Cabeçalho da Secção", - "addSection": "Adicionar Secção", - "compactMode": "Modo Compacto", "showDetailed": "Mostrar Detalhes", - "selectHosts": "Selecionar Hosts", "allHosts": "Todos os hosts", - "listLayout": "Lista", - "gridLayout": "Grelha", "terminal": "Terminal", "files": "Ficheiros", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Cor de Destaque", "widgetSshTerminalName": "Terminal SSH", "widgetSshTerminalDesc": "Um terminal SSH integrado ligado a um host configurado", - "sshTerminalNoHost": "Nenhum host configurado", - "sshTerminalConnect": "Ligar", - "sshTerminalAutoConnect": "Ligação automática ao carregar", "widgetQuickConnectName": "Ligação Rápida", "widgetQuickConnectDesc": "Botões de lançamento num clique para qualquer tipo de ligação em todos os seus hosts", - "connectionTypes": "Tipos de Ligação", "connType_terminal": "Terminal", "connType_files": "Gestor de Ficheiros", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Renomear separador", "openFileManager": "Abrir Gestor de Ficheiros", "dashboard": "Painel de controlo", - "homepage": "Página inicial", "quickConnect": "Ligação Rápida", "sshTools": "Ferramentas SSH", "history": "Histórico", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Estatísticas do Servidor", "panelMain": "Principal", "panelSide": "Lateral", - "justNow": "agora mesmo", - "serviceLinks": "Links de Serviço", - "homepagePreview": "Pré-visualização da Página Inicial" + "justNow": "agora mesmo" }, "donation": { "title": "Está a gostar do Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Arraste cartões para reordenar · Arraste o divisor de coluna para redimensionar colunas · Arraste a borda inferior de um cartão para redimensionar a sua altura · Lixo para remover", "empty": "Vazio", "clear": "Limpar", - "serviceLinksTitle": "Links de Serviço", - "serviceLinksEmpty": "Ainda sem links de serviço", "serviceLinksAddLabel": "Etiqueta", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Adicionar", - "serviceLinksLabelPlaceholder": "O Meu Serviço", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Insira um endereço web válido", - "serviceLinksAddFailed": "Falha ao adicionar link de serviço", "viewServerDetails": "Ver detalhes do servidor" }, "admin": { diff --git a/src/ui/locales/translated/ro_RO.json b/src/ui/locales/translated/ro_RO.json index 41a5179e9..ecea06a42 100644 --- a/src/ui/locales/translated/ro_RO.json +++ b/src/ui/locales/translated/ro_RO.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Deblocați trageți pentru a rearanja" }, "homepage": { - "title": "Pagina principală", - "addWidget": "Adăugați widget", - "editWidget": "Editare widget", "deleteWidget": "Şterge", "widgetTypes": "Tipuri de widgeturi", "serviceLink": "Legătură de serviciu", @@ -206,116 +203,40 @@ "notes": "Note", "hostStatus": "Starea gazdei", "bookmarkList": "Semne de carte", - "zoomIn": "Mărire", - "zoomOut": "Micșorare", - "resetView": "Resetare vizualizare", - "lockLayout": "Aspectul blocării", - "unlockLayout": "Deblocare aspect", - "noWidgets": "Faceți clic dreapta sau faceți clic pe + pentru a adăuga primul widget", - "openFullView": "Deschideți Vizualizarea Completă", - "previewTitle": "Previzualizare pagină principală", - "cancel": "Anula", - "save": "Salva", - "title_label": "Titlu", - "widgetTitlePlaceholder": "Titlul widgetului (opțional)", - "url": "URL-ul", - "imageUrl": "URL-ul imaginii personalizate", - "imageUrlHint": "Lăsați necompletat pentru a utiliza automat favicon-ul site-ului", - "showImage": "Afișați imaginea", - "description": "Descriere", - "color": "Culoare", "icon": "Pictogramă", "expanded": "Extins în mod implicit", - "timezone": "Fus orar", - "invalidTimezone": "Fus orar nevalid. Folosiți un nume IANA, cum ar fi America/New_York.", - "showSeconds": "Afișează secundele", - "format12h": "12 ore", "format24h": "24 de ore", - "content": "Conţinut", - "backgroundColor": "Culoare de fundal", "host": "Gazdă", "showMetrics": "Afișați valorile", - "links": "Linkuri", - "addLink": "Adăugați link", - "linkLabel": "Eticheta", "linkUrl": "URL-ul", "removeLink": "Elimina", - "categoryLinks": "Linkuri", - "categoryInfo": "Informații", - "categorySystem": "Sistem", "widgetServiceLinkDesc": "O dală pe care se poate da clic și care trimite la adresa URL a unui serviciu", "widgetFolderDesc": "Un container pentru gruparea widget-urilor corelate", "widgetClockDesc": "Un ceas live cu fus orar configurabil", "widgetNotesDesc": "Un widget pentru note de reducere", "widgetHostStatusDesc": "Afișează CPU-ul, memoria și discul în timp real pentru o gazdă SSH", "widgetBookmarkListDesc": "O listă de linkuri rapide", - "copyLink": "Copiază linkul", - "linkCopied": "Link copiat!", - "location": "Locaţie", - "temperatureUnit": "Unitate de temperatură", - "showForecast": "Afișați prognoza meteo pe 3 zile", - "scrolling": "Permiteți derularea", - "feedUrl": "URL-ul fluxului", - "maxItems": "Articole maxime", - "showDescription": "Afișați descrierea", "widgetWeatherName": "Vreme", "widgetWeatherDesc": "Vremea în timp real pentru orice locație", "widgetIframeName": "Încorporare iFrame", "widgetIframeDesc": "Încorporează orice adresă URL într-un iframe", - "widgetRssName": "Flux RSS", "widgetRssDesc": "Afișează elemente dintr-un flux RSS sau Atom", "dragToFolder": "Trageți widgeturile aici sau folosiți + pentru a adăuga", "showDisk": "Afișează utilizarea discului", "addToFolder": "Adăugați widgetul în folder", - "noHostSelected": "Nicio gazdă selectată", "selectHost": "Selectați o gazdă...", - "displayedMetrics": "Metrici afișate", - "metricCpu": "CPU", - "metricMemory": "Memorie", - "metricDisk": "Disc", - "metricUptime": "Timp de funcționare", - "metricSystem": "Sistem", - "metricNetwork": "Reţea", - "metricProcesses": "Procese", - "categoryMonitoring": "Monitorizare", "loading": "Încărcare...", "allClear": "Totul este clar", - "noPingUrls": "Nicio adresă URL configurată", - "pingLabel": "Eticheta", - "addPingUrl": "Adăugați adresa URL", - "showLatency": "Afișați latența", - "refreshInterval": "Interval de actualizare", - "seconds": "secunde", - "filterActivityTypes": "Tipuri de filtre", - "filterTypesHint": "Lăsați gol pentru a afișa toate", - "showTimestamp": "Afișați marcajul temporal", - "uptimeUnavailable": "Disponibilitate indisponibilă", - "uptimeLabel": "Timp de funcționare", - "overviewVersion": "Versiune", "overviewUpdate": "La zi", - "overviewUpdateLabel": "Actualizare", - "overviewUpdateAvailable": "Actualizare disponibilă", - "overviewDatabase": "Bază de date", - "overviewUptime": "Timp de funcționare", - "noHosts": "Nicio gazdă configurată", - "hostGridHosts": "Gazde", - "hostGridAllHint": "Lăsați gol pentru a afișa toate gazdele", - "columns": "Coloane", - "showIp": "Afișați adresa IP", "connectionType": "Tip de conexiune", - "layout": "Aspect", - "showStatus": "Afișați starea", "showHostName": "Afișați numele gazdei", "noDockerActivity": "Nicio activitate Docker", - "noActivity": "Nicio activitate", "showAcknowledged": "Afișare Recunoscută", "widgetMetricsChartName": "Diagrama metricilor", "widgetMetricsChartDesc": "Diagramă istorică CPU, memorie, disc sau rețea pentru o gazdă", "widgetHostGridName": "Grilă gazdă", "widgetHostGridDesc": "Vizualizare grilă a stărilor gazdelor SSH", - "widgetPingStatusName": "Starea ping-ului", "widgetPingStatusDesc": "Starea ping-ului HTTP pentru una sau mai multe adrese URL", - "widgetRecentActivityName": "Activitate recentă", "widgetRecentActivityDesc": "Flux derulant al activității recente a Termix", "widgetTermixUptimeName": "Timpul de funcționare Termix", "widgetTermixUptimeDesc": "Contor de disponibilitate live pentru serverul Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Butoane rapide pentru căutare rapidă cu introducere în linie", "widgetLinkTreeName": "Arbore de legături", "widgetLinkTreeDesc": "Secțiuni grupate de linkuri cu titluri", - "calMon": "Luni", - "calTue": "Marți", - "calWed": "Noi", - "calThu": "Joi", - "calFri": "Fr.", - "calSat": "Sâmbătă", - "calSun": "Su", - "startOnMonday": "Începeți săptămâna luni", - "countdownNoDate": "Nu a fost stabilită o dată țintă", - "countdownPast": "Evenimentul a trecut", - "countdownDays": "zile", - "countdownHours": "ore", - "countdownMinutes": "min", - "countdownSeconds": "sec", - "countdownLabel": "Eticheta", - "countdownLabelPlaceholder": "de exemplu, ziua lansării", - "countdownShowDays": "Zile de spectacol", - "countdownShowHours": "Programul de lucru", - "targetDate": "Data țintă", - "searchEngine": "Motor de căutare", - "customSearchUrl": "URL de căutare personalizată", - "searchPlaceholder": "Căutare...", - "searchGo": "Merge", - "searchPlaceholderLabel": "Text substituent", - "searchPlaceholderHint": "Text afișat în câmpul de căutare", - "openInNewTab": "Deschide într-o filă nouă", - "searchQueryPlaceholder": "Introduceți interogarea...", - "noSearchShortcuts": "Nu sunt configurate comenzi rapide", - "addSearchShortcut": "Adăugați o comandă rapidă", - "fontSize": "Dimensiunea fontului", - "textAlign": "Aliniere text", - "fontWeight": "Grosimea fontului", - "clearColor": "Culoare clară", - "imageFit": "Potrivire imagine", - "imageLinkUrl": "URL-ul linkului", - "noImage": "Nu a fost setată nicio adresă URL a imaginii", - "altText": "Text alternativ", - "altTextPlaceholder": "Descrieți imaginea", - "renderMarkdown": "Reducere de randare", - "displayMode": "Mod de afișare", - "displayField": "Câmp de afișare", - "jsonPath": "Calea JSON", - "customApiLabel": "Eticheta", - "customApiLabelPlaceholder": "de exemplu, temperatura", - "customApiUnit": "Unitate", - "customApiNoUrl": "Nicio adresă URL API configurată", - "customApiError": "Preluarea nu a reușit", - "customApiNotArray": "Răspunsul nu este o matrice", - "addService": "Adăugați serviciu", - "showLabels": "Afișați etichetele", - "iconSize": "Dimensiunea pictogramei", - "noDashboardLinks": "Nu sunt configurate linkuri la tabloul de bord", - "noLimit": "Fără limită", - "sectionHeading": "Titlu secțiune", - "addSection": "Adăugați secțiune", - "compactMode": "Mod compact", "showDetailed": "Afișare detaliată", - "selectHosts": "Selectați gazdele", "allHosts": "Toate gazdele", - "listLayout": "Listă", - "gridLayout": "Grilă", "terminal": "Terminal", "files": "Fișiere", "docker": "Docher", @@ -422,12 +284,8 @@ "accentColor": "Culoare accentuată", "widgetSshTerminalName": "Terminal SSH", "widgetSshTerminalDesc": "Un terminal SSH inline conectat la o gazdă configurată", - "sshTerminalNoHost": "Nicio gazdă configurată", - "sshTerminalConnect": "Conectează-te", - "sshTerminalAutoConnect": "Conectare automată la sarcină", "widgetQuickConnectName": "Conectare rapidă", "widgetQuickConnectDesc": "Butoane de lansare cu un singur clic pentru orice tip de conexiune pe gazdele dvs.", - "connectionTypes": "Tipuri de conexiune", "connType_terminal": "Terminal", "connType_files": "Manager de fișiere", "connType_docker": "Docher", @@ -685,7 +543,6 @@ "renameTab": "Redenumiți fila", "openFileManager": "Deschideți Managerul de fișiere", "dashboard": "Bord", - "homepage": "Pagina principală", "quickConnect": "Conectare rapidă", "sshTools": "Instrumente SSH", "history": "Istorie", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Statistici server", "panelMain": "Principal", "panelSide": "Partea", - "justNow": "chiar acum", - "serviceLinks": "Linkuri de servicii", - "homepagePreview": "Previzualizare pagină principală" + "justNow": "chiar acum" }, "donation": { "title": "Îți place Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Trageți fișele pentru a reordona · Trageți separatorul de coloane pentru a redimensiona coloanele · Trageți marginea de jos a unei fișe pentru a-i redimensiona înălțimea · Coș de gunoi pentru a le elimina", "empty": "Gol", "clear": "Clar", - "serviceLinksTitle": "Linkuri de servicii", - "serviceLinksEmpty": "Încă nu există linkuri de servicii", "serviceLinksAddLabel": "Eticheta", "serviceLinksAddUrl": "URL-ul", - "serviceLinksAdd": "Adăuga", - "serviceLinksLabelPlaceholder": "Serviciul meu", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Introduceți o adresă web validă", - "serviceLinksAddFailed": "Nu s-a putut adăuga linkul de serviciu", "viewServerDetails": "Vizualizați detaliile serverului" }, "admin": { diff --git a/src/ui/locales/translated/ru_RU.json b/src/ui/locales/translated/ru_RU.json index a1a873956..97c887b23 100644 --- a/src/ui/locales/translated/ru_RU.json +++ b/src/ui/locales/translated/ru_RU.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Разблокируйте перетаскивание для изменения порядка." }, "homepage": { - "title": "Главная страница", - "addWidget": "Добавить виджет", - "editWidget": "Изменить виджет", "deleteWidget": "Удалить", "widgetTypes": "Типы виджетов", "serviceLink": "Ссылка на сервис", @@ -206,116 +203,40 @@ "notes": "Заметки", "hostStatus": "Статус хоста", "bookmarkList": "Закладки", - "zoomIn": "Приблизить", - "zoomOut": "Отдалить", - "resetView": "Сбросить вид", - "lockLayout": "Заблокировать макет", - "unlockLayout": "Разблокировать макет", - "noWidgets": "Нажмите правой кнопкой мыши или на +, чтобы добавить первый виджет", - "openFullView": "Открыть полный вид", - "previewTitle": "Предпросмотр домашней страницы", - "cancel": "Отмена", - "save": "Сохранить", - "title_label": "Название", - "widgetTitlePlaceholder": "Название виджета (необязательно)", - "url": "URL", - "imageUrl": "Пользовательский URL изображения", - "imageUrlHint": "Оставьте пустым, чтобы автоматически использовать favicon сайта", - "showImage": "Показывать изображение", - "description": "Описание", - "color": "Цвет", "icon": "Значок", "expanded": "Развернуто по умолчанию", - "timezone": "Часовой пояс", - "invalidTimezone": "Неверный часовой пояс. Используйте название IANA, например, America/New_York.", - "showSeconds": "Показывать секунды", - "format12h": "12-часовой", "format24h": "24-часовой", - "content": "Содержимое", - "backgroundColor": "Цвет фона", "host": "Хост", "showMetrics": "Показать метрики", - "links": "Ссылки", - "addLink": "Добавить ссылку", - "linkLabel": "Название", "linkUrl": "URL", "removeLink": "Удалить", - "categoryLinks": "Ссылки", - "categoryInfo": "Информация", - "categorySystem": "Система", "widgetServiceLinkDesc": "Кликабельная плитка, ведущая на URL сервиса", "widgetFolderDesc": "Контейнер для группировки связанных виджетов", "widgetClockDesc": "Часы с настраиваемым часовым поясом", "widgetNotesDesc": "Виджет для заметок в формате Markdown", "widgetHostStatusDesc": "Показывает текущую загрузку ЦП, памяти и диска для SSH-хоста", "widgetBookmarkListDesc": "Список быстрых ссылок", - "copyLink": "Копировать ссылку", - "linkCopied": "Ссылка скопирована!", - "location": "Местоположение", - "temperatureUnit": "Единица температуры", - "showForecast": "Показывать прогноз на 3 дня", - "scrolling": "Разрешить прокрутку", - "feedUrl": "URL ленты", - "maxItems": "Макс. элементов", - "showDescription": "Показывать описание", "widgetWeatherName": "Погода", "widgetWeatherDesc": "Актуальная погода для любого местоположения", "widgetIframeName": "Встраивание iFrame", "widgetIframeDesc": "Встраивает любой URL в iframe", - "widgetRssName": "RSS-лента", "widgetRssDesc": "Отображает элементы из ленты RSS или Atom", "dragToFolder": "Перетащите виджеты сюда или нажмите +, чтобы добавить", "showDisk": "Показывать использование диска", "addToFolder": "Добавить виджет в папку", - "noHostSelected": "Хост не выбран", "selectHost": "Выберите хост...", - "displayedMetrics": "Отображаемые метрики", - "metricCpu": "ЦП", - "metricMemory": "Память", - "metricDisk": "Диск", - "metricUptime": "Время работы", - "metricSystem": "Система", - "metricNetwork": "Сеть", - "metricProcesses": "Процессы", - "categoryMonitoring": "Мониторинг", "loading": "Загрузка...", "allClear": "Всё в порядке", - "noPingUrls": "URL-адреса не настроены", - "pingLabel": "Метка", - "addPingUrl": "Добавить URL", - "showLatency": "Показать задержку", - "refreshInterval": "Интервал обновления", - "seconds": "секунд", - "filterActivityTypes": "Типы фильтрации", - "filterTypesHint": "Оставьте пустым, чтобы показать все", - "showTimestamp": "Показывать метку времени", - "uptimeUnavailable": "Время работы недоступно", - "uptimeLabel": "Время работы", - "overviewVersion": "Версия", "overviewUpdate": "Актуально", - "overviewUpdateLabel": "Обновлять", - "overviewUpdateAvailable": "Доступно обновление", - "overviewDatabase": "База данных", - "overviewUptime": "Время работы", - "noHosts": "Нет настроенных хостов", - "hostGridHosts": "Хосты", - "hostGridAllHint": "Оставьте пустым, чтобы показать все хосты", - "columns": "Колонки", - "showIp": "Показать IP-адрес", "connectionType": "Тип подключения", - "layout": "Макет", - "showStatus": "Показать статус", "showHostName": "Показать имя хоста", "noDockerActivity": "Нет активности Docker", - "noActivity": "Нет активности", "showAcknowledged": "Показать подтверждённые", "widgetMetricsChartName": "График метрик", "widgetMetricsChartDesc": "График истории использования ЦП, памяти, диска или сети для хоста", "widgetHostGridName": "Сетка хостов", "widgetHostGridDesc": "Представление статусов хостов SSH в виде сетки", - "widgetPingStatusName": "Статус ping", "widgetPingStatusDesc": "Статус HTTP ping для одного или нескольких URL", - "widgetRecentActivityName": "Недавняя активность", "widgetRecentActivityDesc": "Прокручиваемая лента недавней активности Termix", "widgetTermixUptimeName": "Время работы Termix", "widgetTermixUptimeDesc": "Счётчик времени работы сервера Termix в реальном времени", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Кнопки быстрого поиска со встроенным полем ввода", "widgetLinkTreeName": "Дерево ссылок", "widgetLinkTreeDesc": "Сгруппированные разделы ссылок с заголовками", - "calMon": "Пн", - "calTue": "Вт", - "calWed": "Ср", - "calThu": "Чт", - "calFri": "Пт", - "calSat": "Сб", - "calSun": "Вс", - "startOnMonday": "Начинать неделю с понедельника", - "countdownNoDate": "Целевая дата не задана", - "countdownPast": "Событие прошло", - "countdownDays": "дн.", - "countdownHours": "ч", - "countdownMinutes": "мин", - "countdownSeconds": "с", - "countdownLabel": "Название", - "countdownLabelPlaceholder": "например, День запуска", - "countdownShowDays": "Показать дни", - "countdownShowHours": "Показать часы", - "targetDate": "Целевая дата", - "searchEngine": "Поисковая система", - "customSearchUrl": "Пользовательский URL поиска", - "searchPlaceholder": "Поиск...", - "searchGo": "Искать", - "searchPlaceholderLabel": "Текст подсказки", - "searchPlaceholderHint": "Текст внутри поля поиска", - "openInNewTab": "Открывать в новой вкладке", - "searchQueryPlaceholder": "Введите запрос...", - "noSearchShortcuts": "Нет ярлыков поиска", - "addSearchShortcut": "Добавить ярлык", - "fontSize": "Размер шрифта", - "textAlign": "Выравнивание текста", - "fontWeight": "Жирность шрифта", - "clearColor": "Очистить цвет", - "imageFit": "Вписывание изображения", - "imageLinkUrl": "URL ссылки", - "noImage": "URL изображения не задан", - "altText": "Альтернативный текст", - "altTextPlaceholder": "Опишите изображение", - "renderMarkdown": "Отображать Markdown", - "displayMode": "Режим отображения", - "displayField": "Отображаемое поле", - "jsonPath": "Путь JSON", - "customApiLabel": "Название", - "customApiLabelPlaceholder": "например, Температура", - "customApiUnit": "Единица измерения", - "customApiNoUrl": "URL API не настроен", - "customApiError": "Не удалось загрузить данные", - "customApiNotArray": "Ответ не является массивом", - "addService": "Добавить сервис", - "showLabels": "Показывать метки", - "iconSize": "Размер иконок", - "noDashboardLinks": "Нет настроенных ссылок на панель", - "noLimit": "Без лимита", - "sectionHeading": "Заголовок раздела", - "addSection": "Добавить раздел", - "compactMode": "Компактный режим", "showDetailed": "Показать подробности", - "selectHosts": "Выбрать хосты", "allHosts": "Все хосты", - "listLayout": "Список", - "gridLayout": "Сетка", "terminal": "Терминал", "files": "Файлы", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Акцентный цвет", "widgetSshTerminalName": "SSH Терминал", "widgetSshTerminalDesc": "Встроенный SSH-терминал, подключённый к настроенному хосту", - "sshTerminalNoHost": "Хост не настроен", - "sshTerminalConnect": "Подключиться", - "sshTerminalAutoConnect": "Автоподключение при загрузке", "widgetQuickConnectName": "Быстрое подключение", "widgetQuickConnectDesc": "Кнопки для быстрого запуска одним кликом любого типа подключения к вашим хостам", - "connectionTypes": "Типы подключений", "connType_terminal": "Терминал", "connType_files": "Файловый менеджер", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Переименовать вкладку", "openFileManager": "Открыть файловый менеджер", "dashboard": "Панель мониторинга", - "homepage": "Главная", "quickConnect": "Быстрое подключение", "sshTools": "Инструменты SSH", "history": "История", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Статистика сервера", "panelMain": "Главная", "panelSide": "Боковая", - "justNow": "только что", - "serviceLinks": "Ссылки на сервисы", - "homepagePreview": "Предпросмотр главной страницы" + "justNow": "только что" }, "donation": { "title": "Нравится Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Перетаскивайте карточки для изменения порядка · Перетащите разделитель столбцов для изменения ширины · Перетащите нижний край карточки для изменения высоты · Корзина для удаления", "empty": "Пусто", "clear": "Очистить", - "serviceLinksTitle": "Сервисные ссылки", - "serviceLinksEmpty": "Пока нет сервисных ссылок", "serviceLinksAddLabel": "Название", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Добавить", - "serviceLinksLabelPlaceholder": "Мой сервис", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Введите действительный веб-адрес", - "serviceLinksAddFailed": "Не удалось добавить сервисную ссылку", "viewServerDetails": "Просмотреть сведения о сервере" }, "admin": { diff --git a/src/ui/locales/translated/sr_SP.json b/src/ui/locales/translated/sr_SP.json index 25df220d0..49c1d87d9 100644 --- a/src/ui/locales/translated/sr_SP.json +++ b/src/ui/locales/translated/sr_SP.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Откључај превлачење да би се преуредило" }, "homepage": { - "title": "Почетна страница", - "addWidget": "Додај виџет", - "editWidget": "Измени виџет", "deleteWidget": "Обриши", "widgetTypes": "Типови виџета", "serviceLink": "Веза са услугом", @@ -206,116 +203,40 @@ "notes": "Белешке", "hostStatus": "Статус домаћина", "bookmarkList": "Обележивачи", - "zoomIn": "Увећај", - "zoomOut": "Умањи", - "resetView": "Ресетуј приказ", - "lockLayout": "Закључај распоред", - "unlockLayout": "Откључај распоред", - "noWidgets": "Кликните десним тастером миша или кликните на + да бисте додали свој први виџет", - "openFullView": "Отвори цео приказ", - "previewTitle": "Преглед почетне странице", - "cancel": "Откажи", - "save": "Сачувај", - "title_label": "Наслов", - "widgetTitlePlaceholder": "Наслов виџета (опционо)", - "url": "URL", - "imageUrl": "Прилагођени URL слике", - "imageUrlHint": "Оставите празно да бисте аутоматски користили фавикон сајта", - "showImage": "Прикажи слику", - "description": "Опис", - "color": "Боја", "icon": "Икона", "expanded": "Проширено подразумевано", - "timezone": "Временска зона", - "invalidTimezone": "Неважећа временска зона. Користите IANA назив као што је Америка/Њујорк", - "showSeconds": "Прикажи секунде", - "format12h": "12 сати", "format24h": "24-часовни", - "content": "Садржај", - "backgroundColor": "Боја позадине", "host": "Домаћин", "showMetrics": "Прикажи метрике", - "links": "Линкови", - "addLink": "Додај линк", - "linkLabel": "Ознака", "linkUrl": "URL", "removeLink": "Уклони", - "categoryLinks": "Линкови", - "categoryInfo": "Информације", - "categorySystem": "Систем", "widgetServiceLinkDesc": "Плочица на коју се може кликнути и која води до URL-а услуге", "widgetFolderDesc": "Контејнер за груписање повезаних виџета", "widgetClockDesc": "Сат уживо са подесивом временском зоном", "widgetNotesDesc": "Виџет за белешке о markdown-у", "widgetHostStatusDesc": "Приказује процесор, меморију и диск уживо за SSH хост", "widgetBookmarkListDesc": "Листа брзих линкова", - "copyLink": "Копирај линк", - "linkCopied": "Линк копиран!", - "location": "Локација", - "temperatureUnit": "Јединица за температуру", - "showForecast": "Прикажи тродневну прогнозу", - "scrolling": "Дозволи скроловање", - "feedUrl": "URL фида", - "maxItems": "Максималан број ставки", - "showDescription": "Прикажи опис", "widgetWeatherName": "Време", "widgetWeatherDesc": "Време уживо за било коју локацију", "widgetIframeName": "Уграђивање iFrame-а", "widgetIframeDesc": "Уградите било који URL у iframe", - "widgetRssName": "RSS фид", "widgetRssDesc": "Приказ ставке из RSS или Atom фида", "dragToFolder": "Превуците виџете овде или користите + да бисте их додали", "showDisk": "Прикажи коришћење диска", "addToFolder": "Додај виџет у фасциклу", - "noHostSelected": "Није изабран домаћин", "selectHost": "Изаберите хост...", - "displayedMetrics": "Приказане метрике", - "metricCpu": "Процесор", - "metricMemory": "Памћење", - "metricDisk": "Диск", - "metricUptime": "Време непрекидног рада", - "metricSystem": "Систем", - "metricNetwork": "Мрежа", - "metricProcesses": "Процеси", - "categoryMonitoring": "Праћење", "loading": "Учитавање...", "allClear": "Све је чисто", - "noPingUrls": "Није конфигурисан ниједан URL", - "pingLabel": "Ознака", - "addPingUrl": "Додај URL", - "showLatency": "Прикажи латенцију", - "refreshInterval": "Интервал освежавања", - "seconds": "секунде", - "filterActivityTypes": "Типови филтера", - "filterTypesHint": "Оставите празно да бисте видели све", - "showTimestamp": "Прикажи временску ознаку", - "uptimeUnavailable": "Време непрекидног рада није доступно", - "uptimeLabel": "Време непрекидног рада", - "overviewVersion": "Верзија", "overviewUpdate": "Ажурирано", - "overviewUpdateLabel": "Ажурирање", - "overviewUpdateAvailable": "Ажурирање је доступно", - "overviewDatabase": "База података", - "overviewUptime": "Време непрекидног рада", - "noHosts": "Ниједан хост није конфигурисан", - "hostGridHosts": "Домаћини", - "hostGridAllHint": "Оставите празно да бисте приказали све хостове", - "columns": "Колоне", - "showIp": "Прикажи ИП адресу", "connectionType": "Тип везе", - "layout": "Распоред", - "showStatus": "Прикажи статус", "showHostName": "Прикажи име хоста", "noDockerActivity": "Нема активности Докера", - "noActivity": "Нема активности", "showAcknowledged": "Прикажи потврђено", "widgetMetricsChartName": "Графикон метрика", "widgetMetricsChartDesc": "Историјски графикон процесора, меморије, диска или мреже за хост", "widgetHostGridName": "Хост мрежа", "widgetHostGridDesc": "Приказ мреже статуса SSH хоста", - "widgetPingStatusName": "Статус пинга", "widgetPingStatusDesc": "HTTP пинг статус за један или више URL-ова", - "widgetRecentActivityName": "Недавне активности", "widgetRecentActivityDesc": "Покретни фид скорашњих активности Termix-а", "widgetTermixUptimeName": "Време непрекидног рада Термикса", "widgetTermixUptimeDesc": "Бројач времена непрекидног рада за Termix сервер", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Дугмад за пречице брзе претраге са уграђеним уносом", "widgetLinkTreeName": "Стабло веза", "widgetLinkTreeDesc": "Груписани делови линкова са насловима", - "calMon": "Мо", - "calTue": "Уто", - "calWed": "Ми", - "calThu": "Чет", - "calFri": "Пет", - "calSat": "Са", - "calSun": "Су", - "startOnMonday": "Почетак недеље у понедељак", - "countdownNoDate": "Није одређен циљни датум", - "countdownPast": "Догађај је прошао", - "countdownDays": "дана", - "countdownHours": "сати", - "countdownMinutes": "мин", - "countdownSeconds": "сек", - "countdownLabel": "Ознака", - "countdownLabelPlaceholder": "нпр. Дан лансирања", - "countdownShowDays": "Дани емисије", - "countdownShowHours": "Радно време емисије", - "targetDate": "Циљни датум", - "searchEngine": "Претраживач", - "customSearchUrl": "URL прилагођене претраге", - "searchPlaceholder": "Претрага...", - "searchGo": "Иди", - "searchPlaceholderLabel": "Текст резервисаног места", - "searchPlaceholderHint": "Текст приказан унутар поља за претрагу", - "openInNewTab": "Отвори у новој картици", - "searchQueryPlaceholder": "Унесите упит...", - "noSearchShortcuts": "Ниједна пречица није конфигурисана", - "addSearchShortcut": "Додај пречицу", - "fontSize": "Величина фонта", - "textAlign": "Поравнање текста", - "fontWeight": "Дебљина фонта", - "clearColor": "Чиста боја", - "imageFit": "Уклапање слике", - "imageLinkUrl": "URL линка", - "noImage": "Није подешен URL слике", - "altText": "Алтернативни текст", - "altTextPlaceholder": "Опишите слику", - "renderMarkdown": "Рендеровање маркдауна", - "displayMode": "Режим приказа", - "displayField": "Поље за приказ", - "jsonPath": "JSON путања", - "customApiLabel": "Ознака", - "customApiLabelPlaceholder": "нпр. Температура", - "customApiUnit": "Јединица", - "customApiNoUrl": "Није конфигурисан API URL", - "customApiError": "Преузимање није успело", - "customApiNotArray": "Одговор није низ", - "addService": "Додај услугу", - "showLabels": "Прикажи ознаке", - "iconSize": "Величина иконе", - "noDashboardLinks": "Није конфигурисан ниједан линк до контролне табле", - "noLimit": "Без ограничења", - "sectionHeading": "Наслов одељка", - "addSection": "Додај одељак", - "compactMode": "Компактни режим", "showDetailed": "Прикажи детаље", - "selectHosts": "Изаберите хостове", "allHosts": "Сви домаћини", - "listLayout": "Листа", - "gridLayout": "Мрежа", "terminal": "Терминал", "files": "Датотеке", "docker": "Докер", @@ -422,12 +284,8 @@ "accentColor": "Акцентна боја", "widgetSshTerminalName": "SSH терминал", "widgetSshTerminalDesc": "Уграђени SSH терминал повезан са конфигурисаним хостом", - "sshTerminalNoHost": "Није конфигурисан хост", - "sshTerminalConnect": "Повежи се", - "sshTerminalAutoConnect": "Аутоматско повезивање при учитавању", "widgetQuickConnectName": "Брзо повезивање", "widgetQuickConnectDesc": "Дугмад за покретање једним кликом за било који тип везе на вашим хостовима", - "connectionTypes": "Типови повезивања", "connType_terminal": "Терминал", "connType_files": "Менаџер датотека", "connType_docker": "Докер", @@ -685,7 +543,6 @@ "renameTab": "Преименуј картицу", "openFileManager": "Отвори менаџер датотека", "dashboard": "Контролна табла", - "homepage": "Почетна страница", "quickConnect": "Брзо повезивање", "sshTools": "SSH алати", "history": "Историја", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Статистика сервера", "panelMain": "Главни", "panelSide": "Страна", - "justNow": "управо сада", - "serviceLinks": "Линкови услуга", - "homepagePreview": "Преглед почетне странице" + "justNow": "управо сада" }, "donation": { "title": "Уживате у Термиксу?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Превуците картице да бисте променили редослед · Превуците разделник колона да бисте променили величину колона · Превуците доњу ивицу картице да бисте променили величину њене висине · Отпад да бисте уклонили", "empty": "Празно", "clear": "Јасно", - "serviceLinksTitle": "Линкови услуга", - "serviceLinksEmpty": "Још нема линкова за услуге", "serviceLinksAddLabel": "Ознака", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Додај", - "serviceLinksLabelPlaceholder": "Моја услуга", - "serviceLinksUrlPlaceholder": "хттп://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Унесите важећу веб адресу", - "serviceLinksAddFailed": "Додавање линка услуге није успело", "viewServerDetails": "Погледајте детаље сервера" }, "admin": { diff --git a/src/ui/locales/translated/sv_SE.json b/src/ui/locales/translated/sv_SE.json index 826633a99..1f008acb3 100644 --- a/src/ui/locales/translated/sv_SE.json +++ b/src/ui/locales/translated/sv_SE.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Lås upp och dra för att ordna om" }, "homepage": { - "title": "Hemsida", - "addWidget": "Lägg till widget", - "editWidget": "Redigera widget", "deleteWidget": "Radera", "widgetTypes": "Widgettyper", "serviceLink": "Servicelänk", @@ -206,116 +203,40 @@ "notes": "Anteckningar", "hostStatus": "Värdstatus", "bookmarkList": "Bokmärken", - "zoomIn": "Zooma in", - "zoomOut": "Zooma ut", - "resetView": "Återställ vy", - "lockLayout": "Låslayout", - "unlockLayout": "Lås upp layouten", - "noWidgets": "Högerklicka eller klicka på + för att lägga till din första widget", - "openFullView": "Öppna helvy", - "previewTitle": "Förhandsvisning av startsidan", - "cancel": "Avboka", - "save": "Spara", - "title_label": "Titel", - "widgetTitlePlaceholder": "Widgettitel (valfritt)", - "url": "URL", - "imageUrl": "Anpassad bild-URL", - "imageUrlHint": "Lämna tomt för att använda webbplatsens favicon automatiskt", - "showImage": "Visa bild", - "description": "Beskrivning", - "color": "Färg", "icon": "Ikon", "expanded": "Utökad som standard", - "timezone": "Tidszon", - "invalidTimezone": "Ogiltig tidszon. Använd ett IANA-namn som America/New_York", - "showSeconds": "Visa sekunder", - "format12h": "12-timmars", "format24h": "24-timmars", - "content": "Innehåll", - "backgroundColor": "Bakgrundsfärg", "host": "Värd", "showMetrics": "Visa mätvärden", - "links": "Länkar", - "addLink": "Lägg till länk", - "linkLabel": "Märka", "linkUrl": "URL", "removeLink": "Ta bort", - "categoryLinks": "Länkar", - "categoryInfo": "Info", - "categorySystem": "System", "widgetServiceLinkDesc": "En klickbar panel som länkar till en tjänst-URL", "widgetFolderDesc": "En behållare för att gruppera relaterade widgetar", "widgetClockDesc": "En liveklocka med konfigurerbar tidszon", "widgetNotesDesc": "En widget för nedskrivningsanteckningar", "widgetHostStatusDesc": "Visar CPU, minne och disk i realtid för en SSH-värd", "widgetBookmarkListDesc": "En lista med snabblänkar", - "copyLink": "Kopiera länk", - "linkCopied": "Länk kopierad!", - "location": "Plats", - "temperatureUnit": "Temperaturenhet", - "showForecast": "Visa 3-dagarsprognos", - "scrolling": "Tillåt rullning", - "feedUrl": "Flödes-URL", - "maxItems": "Max antal artiklar", - "showDescription": "Visa beskrivning", "widgetWeatherName": "Väder", "widgetWeatherDesc": "Liveväder för alla platser", "widgetIframeName": "iFrame-bäddning", "widgetIframeDesc": "Bädda in valfri URL i en iframe", - "widgetRssName": "RSS-flöde", "widgetRssDesc": "Visa objekt från ett RSS- eller Atom-flöde", "dragToFolder": "Dra widgetar hit eller använd + för att lägga till", "showDisk": "Visa diskanvändning", "addToFolder": "Lägg till widget i mapp", - "noHostSelected": "Ingen värd vald", "selectHost": "Välj en värd...", - "displayedMetrics": "Visade mätvärden", - "metricCpu": "CPU", - "metricMemory": "Minne", - "metricDisk": "Disk", - "metricUptime": "Drifttid", - "metricSystem": "System", - "metricNetwork": "Nätverk", - "metricProcesses": "Processer", - "categoryMonitoring": "Övervakning", "loading": "Belastning...", "allClear": "Faran över", - "noPingUrls": "Inga webbadresser konfigurerade", - "pingLabel": "Märka", - "addPingUrl": "Lägg till URL", - "showLatency": "Visa latens", - "refreshInterval": "Uppdateringsintervall", - "seconds": "sekunder", - "filterActivityTypes": "Filtertyper", - "filterTypesHint": "Lämna tomt för att visa alla", - "showTimestamp": "Visa tidsstämpel", - "uptimeUnavailable": "Drifttid otillgänglig", - "uptimeLabel": "Drifttid", - "overviewVersion": "Version", "overviewUpdate": "Uppdaterad", - "overviewUpdateLabel": "Uppdatera", - "overviewUpdateAvailable": "Uppdatering tillgänglig", - "overviewDatabase": "Databas", - "overviewUptime": "Drifttid", - "noHosts": "Inga värdar konfigurerade", - "hostGridHosts": "Värdar", - "hostGridAllHint": "Lämna tomt för att visa alla värdar", - "columns": "Kolumner", - "showIp": "Visa IP-adress", "connectionType": "Anslutningstyp", - "layout": "Layout", - "showStatus": "Visa status", "showHostName": "Visa värdnamn", "noDockerActivity": "Ingen Docker-aktivitet", - "noActivity": "Ingen aktivitet", "showAcknowledged": "Visa bekräftad", "widgetMetricsChartName": "Mätvärdena Diagram", "widgetMetricsChartDesc": "Historiskt diagram över CPU, minne, disk eller nätverk för en värd", "widgetHostGridName": "Värdnät", "widgetHostGridDesc": "Rutnätsvy över SSH-värdstatusar", - "widgetPingStatusName": "Pingstatus", "widgetPingStatusDesc": "HTTP-pingstatus för en eller flera URL:er", - "widgetRecentActivityName": "Senaste aktivitet", "widgetRecentActivityDesc": "Rullningsbart flöde av senaste Termix-aktivitet", "widgetTermixUptimeName": "Termix drifttid", "widgetTermixUptimeDesc": "Live-upptidsräknare för Termix-servern", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Snabbsökningsknappar med inbyggd inmatning", "widgetLinkTreeName": "Länkträd", "widgetLinkTreeDesc": "Grupperade länksektioner med rubriker", - "calMon": "Må", - "calTue": "Tis", - "calWed": "Vi", - "calThu": "To", - "calFri": "Fr", - "calSat": "Lör", - "calSun": "Sö", - "startOnMonday": "Börja veckan på måndag", - "countdownNoDate": "Inget måldatum angivet", - "countdownPast": "Händelsen har passerat", - "countdownDays": "dagar", - "countdownHours": "timmar", - "countdownMinutes": "min", - "countdownSeconds": "sek", - "countdownLabel": "Märka", - "countdownLabelPlaceholder": "t.ex. lanseringsdagen", - "countdownShowDays": "Visa dagar", - "countdownShowHours": "Visa öppettider", - "targetDate": "Måldatum", - "searchEngine": "Sökmotor", - "customSearchUrl": "Anpassad sök-URL", - "searchPlaceholder": "Söka...", - "searchGo": "Gå", - "searchPlaceholderLabel": "Platshållartext", - "searchPlaceholderHint": "Text som visas inuti sökinmatningen", - "openInNewTab": "Öppna i ny flik", - "searchQueryPlaceholder": "Ange fråga...", - "noSearchShortcuts": "Inga genvägar konfigurerade", - "addSearchShortcut": "Lägg till genväg", - "fontSize": "Fontstorlek", - "textAlign": "Textjustering", - "fontWeight": "Teckensnittsvikt", - "clearColor": "Klar färg", - "imageFit": "Bildanpassning", - "imageLinkUrl": "Länk-URL", - "noImage": "Ingen bild-URL angiven", - "altText": "Alternativtext", - "altTextPlaceholder": "Beskriv bilden", - "renderMarkdown": "Rendera Markdown", - "displayMode": "Visningsläge", - "displayField": "Visningsfält", - "jsonPath": "JSON-sökväg", - "customApiLabel": "Märka", - "customApiLabelPlaceholder": "t.ex. temperatur", - "customApiUnit": "Enhet", - "customApiNoUrl": "Ingen API-URL konfigurerad", - "customApiError": "Misslyckades med att hämta", - "customApiNotArray": "Svaret är inte en array", - "addService": "Lägg till tjänst", - "showLabels": "Visa etiketter", - "iconSize": "Ikonstorlek", - "noDashboardLinks": "Inga länkar till instrumentpanelen konfigurerade", - "noLimit": "Ingen gräns", - "sectionHeading": "Avsnittsrubrik", - "addSection": "Lägg till avsnitt", - "compactMode": "Kompaktläge", "showDetailed": "Visa detaljerad", - "selectHosts": "Välj värdar", "allHosts": "Alla värdar", - "listLayout": "Lista", - "gridLayout": "Rutnät", "terminal": "Terminal", "files": "Filer", "docker": "Hamnarbetare", @@ -422,12 +284,8 @@ "accentColor": "Accentfärg", "widgetSshTerminalName": "SSH-terminal", "widgetSshTerminalDesc": "En inline SSH-terminal ansluten till en konfigurerad värd", - "sshTerminalNoHost": "Ingen värd konfigurerad", - "sshTerminalConnect": "Ansluta", - "sshTerminalAutoConnect": "Automatisk anslutning vid laddning", "widgetQuickConnectName": "Snabbanslutning", "widgetQuickConnectDesc": "Knappar med ett klick för alla anslutningstyper över dina värdar", - "connectionTypes": "Anslutningstyper", "connType_terminal": "Terminal", "connType_files": "Filhanteraren", "connType_docker": "Hamnarbetare", @@ -685,7 +543,6 @@ "renameTab": "Byt namn på fliken", "openFileManager": "Öppna filhanteraren", "dashboard": "Instrumentpanel", - "homepage": "Hemsida", "quickConnect": "Snabbanslutning", "sshTools": "SSH-verktyg", "history": "Historia", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Serverstatistik", "panelMain": "Huvudsaklig", "panelSide": "Sida", - "justNow": "just nu", - "serviceLinks": "Servicelänkar", - "homepagePreview": "Förhandsvisning av startsidan" + "justNow": "just nu" }, "donation": { "title": "Gillar du Termix?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Dra kort för att ändra ordning · Dra kolumndelaren för att ändra storlek på kolumner · Dra i den nedre kanten av ett kort för att ändra storlek på dess höjd · Ta bort i papperskorgen", "empty": "Tömma", "clear": "Rensa", - "serviceLinksTitle": "Servicelänkar", - "serviceLinksEmpty": "Inga tjänstelänkar ännu", "serviceLinksAddLabel": "Märka", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Tillägga", - "serviceLinksLabelPlaceholder": "Min tjänst", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Ange en giltig webbadress", - "serviceLinksAddFailed": "Misslyckades med att lägga till tjänstelänk", "viewServerDetails": "Visa serverinformation" }, "admin": { diff --git a/src/ui/locales/translated/th_TH.json b/src/ui/locales/translated/th_TH.json index 789533bb0..7db88128b 100644 --- a/src/ui/locales/translated/th_TH.json +++ b/src/ui/locales/translated/th_TH.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "ปลดล็อกการลากเพื่อจัดเรียงใหม่" }, "homepage": { - "title": "หน้าแรก", - "addWidget": "เพิ่มวิดเจ็ต", - "editWidget": "แก้ไขวิดเจ็ต", "deleteWidget": "ลบ", "widgetTypes": "ประเภทวิดเจ็ต", "serviceLink": "ลิงก์บริการ", @@ -206,116 +203,40 @@ "notes": "หมายเหตุ", "hostStatus": "สถานะโฮสต์", "bookmarkList": "ที่คั่นหนังสือ", - "zoomIn": "ซูมเข้า", - "zoomOut": "ซูมออก", - "resetView": "รีเซ็ตมุมมอง", - "lockLayout": "การจัดวางล็อค", - "unlockLayout": "ปลดล็อกเค้าโครง", - "noWidgets": "คลิกขวาหรือคลิก + เพื่อเพิ่มวิดเจ็ตแรกของคุณ", - "openFullView": "เปิดดูแบบเต็มหน้าจอ", - "previewTitle": "ตัวอย่างหน้าแรก", - "cancel": "ยกเลิก", - "save": "บันทึก", - "title_label": "ชื่อ", - "widgetTitlePlaceholder": "ชื่อวิดเจ็ต (ไม่บังคับ)", - "url": "URL", - "imageUrl": "URL รูปภาพแบบกำหนดเอง", - "imageUrlHint": "เว้นว่างไว้เพื่อใช้ไอคอนเว็บไซต์โดยอัตโนมัติ", - "showImage": "แสดงภาพ", - "description": "คำอธิบาย", - "color": "สี", "icon": "ไอคอน", "expanded": "ขยายตามค่าเริ่มต้น", - "timezone": "เขตเวลา", - "invalidTimezone": "เขตเวลาไม่ถูกต้อง กรุณาใช้ชื่อ IANA เช่น America/New_York", - "showSeconds": "แสดงวินาที", - "format12h": "12 ชั่วโมง", "format24h": "ตลอด 24 ชั่วโมง", - "content": "เนื้อหา", - "backgroundColor": "สีพื้นหลัง", "host": "เจ้าภาพ", "showMetrics": "แสดงค่าเมตริก", - "links": "ลิงก์", - "addLink": "เพิ่มลิงก์", - "linkLabel": "ฉลาก", "linkUrl": "URL", "removeLink": "ลบ", - "categoryLinks": "ลิงก์", - "categoryInfo": "ข้อมูล", - "categorySystem": "ระบบ", "widgetServiceLinkDesc": "ช่องที่สามารถคลิกได้ ซึ่งเชื่อมโยงไปยัง URL ของบริการ", "widgetFolderDesc": "คอนเทนเนอร์สำหรับจัดกลุ่มวิดเจ็ตที่เกี่ยวข้องเข้าด้วยกัน", "widgetClockDesc": "นาฬิกาแบบเรียลไทม์พร้อมโซนเวลาที่สามารถตั้งค่าได้", "widgetNotesDesc": "วิดเจ็ตบันทึกย่อแบบมาร์คดาวน์", "widgetHostStatusDesc": "แสดงการใช้งาน CPU, หน่วยความจำ และดิสก์แบบเรียลไทม์สำหรับโฮสต์ SSH", "widgetBookmarkListDesc": "รายการลิงก์ด่วน", - "copyLink": "คัดลอกลิงก์", - "linkCopied": "คัดลอกลิงก์เรียบร้อยแล้ว!", - "location": "ที่ตั้ง", - "temperatureUnit": "หน่วยอุณหภูมิ", - "showForecast": "แสดงพยากรณ์อากาศ 3 วัน", - "scrolling": "อนุญาตให้เลื่อน", - "feedUrl": "URL ฟีด", - "maxItems": "ไอเทมสูงสุด", - "showDescription": "แสดงคำอธิบาย", "widgetWeatherName": "สภาพอากาศ", "widgetWeatherDesc": "พยากรณ์อากาศแบบเรียลไทม์สำหรับทุกสถานที่", "widgetIframeName": "การฝัง iFrame", "widgetIframeDesc": "ฝัง URL ใดๆ ลงใน iframe", - "widgetRssName": "ฟีด RSS", "widgetRssDesc": "แสดงรายการจากฟีด RSS หรือ Atom", "dragToFolder": "ลากวิดเจ็ตมาวางที่นี่ หรือใช้เครื่องหมาย + เพื่อเพิ่ม", "showDisk": "แสดงการใช้งานดิสก์", "addToFolder": "เพิ่มวิดเจ็ตลงในโฟลเดอร์", - "noHostSelected": "ไม่ได้เลือกโฮสต์", "selectHost": "เลือกโฮสต์...", - "displayedMetrics": "ตัวชี้วัดที่แสดงผล", - "metricCpu": "ซีพียู", - "metricMemory": "หน่วยความจำ", - "metricDisk": "ดิสก์", - "metricUptime": "เวลาใช้งาน", - "metricSystem": "ระบบ", - "metricNetwork": "เครือข่าย", - "metricProcesses": "กระบวนการ", - "categoryMonitoring": "การตรวจสอบ", "loading": "กำลังโหลด...", "allClear": "ทุกอย่างเรียบร้อย", - "noPingUrls": "ไม่มีการกำหนดค่า URL", - "pingLabel": "ฉลาก", - "addPingUrl": "เพิ่ม URL", - "showLatency": "แสดงค่าความหน่วง", - "refreshInterval": "ช่วงเวลาการรีเฟรช", - "seconds": "วินาที", - "filterActivityTypes": "ประเภทตัวกรอง", - "filterTypesHint": "เว้นว่างไว้เพื่อแสดงทั้งหมด", - "showTimestamp": "แสดงเวลา", - "uptimeUnavailable": "ไม่สามารถระบุเวลาใช้งานได้", - "uptimeLabel": "เวลาใช้งาน", - "overviewVersion": "เวอร์ชั่น", "overviewUpdate": "อัปเดตล่าสุด", - "overviewUpdateLabel": "อัปเดต", - "overviewUpdateAvailable": "มีการอัปเดตแล้ว", - "overviewDatabase": "ฐานข้อมูล", - "overviewUptime": "เวลาใช้งาน", - "noHosts": "ไม่มีการกำหนดค่าโฮสต์", - "hostGridHosts": "โฮสต์", - "hostGridAllHint": "เว้นว่างไว้เพื่อแสดงโฮสต์ทั้งหมด", - "columns": "คอลัมน์", - "showIp": "แสดงที่อยู่ IP", "connectionType": "ประเภทการเชื่อมต่อ", - "layout": "เค้าโครง", - "showStatus": "แสดงสถานะ", "showHostName": "ชื่อพิธีกรรายการ", "noDockerActivity": "ไม่มีกิจกรรม Docker", - "noActivity": "ไม่มีกิจกรรม", "showAcknowledged": "แสดงให้เห็นว่าได้รับการรับทราบแล้ว", "widgetMetricsChartName": "แผนภูมิตัวชี้วัด", "widgetMetricsChartDesc": "แผนภูมิแสดงประวัติการใช้งาน CPU, หน่วยความจำ, ดิสก์ หรือเครือข่ายสำหรับโฮสต์", "widgetHostGridName": "โฮสต์กริด", "widgetHostGridDesc": "การแสดงผลแบบตารางของสถานะโฮสต์ SSH", - "widgetPingStatusName": "สถานะการปิง", "widgetPingStatusDesc": "สถานะการ ping HTTP สำหรับ URL หนึ่งรายการขึ้นไป", - "widgetRecentActivityName": "กิจกรรมล่าสุด", "widgetRecentActivityDesc": "ฟีดแบบเลื่อนดูได้ของกิจกรรมล่าสุดของ Termix", "widgetTermixUptimeName": "เวลาทำงานของเทอร์มิกซ์", "widgetTermixUptimeDesc": "ตัวนับเวลาการทำงานแบบเรียลไทม์ของเซิร์ฟเวอร์ Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "ปุ่มลัดค้นหาด่วนพร้อมช่องป้อนข้อมูลแบบอินไลน์", "widgetLinkTreeName": "ลิงก์ทรี", "widgetLinkTreeDesc": "กลุ่มของลิงก์ที่มีหัวข้อกำกับ", - "calMon": "โม", - "calTue": "ตู", - "calWed": "เรา", - "calThu": "ไทย", - "calFri": "ฟร", - "calSat": "ซา", - "calSun": "ซู", - "startOnMonday": "เริ่มต้นสัปดาห์ในวันจันทร์", - "countdownNoDate": "ยังไม่ได้กำหนดวันเป้าหมาย", - "countdownPast": "กิจกรรมได้จบลงแล้ว", - "countdownDays": "วัน", - "countdownHours": "ชั่วโมง", - "countdownMinutes": "นาที", - "countdownSeconds": "วินาที", - "countdownLabel": "ฉลาก", - "countdownLabelPlaceholder": "เช่น วันเปิดตัว", - "countdownShowDays": "วันแสดง", - "countdownShowHours": "เวลาทำการ", - "targetDate": "วันที่เป้าหมาย", - "searchEngine": "เครื่องมือค้นหา", - "customSearchUrl": "URL ค้นหาแบบกำหนดเอง", - "searchPlaceholder": "ค้นหา...", - "searchGo": "ไป", - "searchPlaceholderLabel": "ข้อความตัวอย่าง", - "searchPlaceholderHint": "ข้อความที่แสดงอยู่ภายในช่องค้นหา", - "openInNewTab": "เปิดในแท็บใหม่", - "searchQueryPlaceholder": "ป้อนคำค้นหา...", - "noSearchShortcuts": "ไม่ได้ตั้งค่าทางลัดใดๆ", - "addSearchShortcut": "เพิ่มทางลัด", - "fontSize": "ขนาดตัวอักษร", - "textAlign": "จัดแนวข้อความ", - "fontWeight": "น้ำหนักตัวอักษร", - "clearColor": "สีใส", - "imageFit": "ภาพที่พอดี", - "imageLinkUrl": "ลิงก์ URL", - "noImage": "ไม่ได้ตั้งค่า URL รูปภาพ", - "altText": "ข้อความแสดงแทน (Alt Text)", - "altTextPlaceholder": "อธิบายภาพ", - "renderMarkdown": "แสดงผลมาร์คดาวน์", - "displayMode": "โหมดการแสดงผล", - "displayField": "ช่องแสดงผล", - "jsonPath": "เส้นทาง JSON", - "customApiLabel": "ฉลาก", - "customApiLabelPlaceholder": "เช่น อุณหภูมิ", - "customApiUnit": "หน่วย", - "customApiNoUrl": "ไม่ได้กำหนดค่า URL API ไว้", - "customApiError": "ไม่สามารถดึงข้อมูลได้", - "customApiNotArray": "คำตอบไม่ใช่อาร์เรย์", - "addService": "เพิ่มบริการ", - "showLabels": "แสดงป้ายกำกับ", - "iconSize": "ขนาดไอคอน", - "noDashboardLinks": "ไม่มีการกำหนดค่าลิงก์แดชบอร์ด", - "noLimit": "ไม่มีขีดจำกัด", - "sectionHeading": "หัวข้อส่วน", - "addSection": "เพิ่มส่วน", - "compactMode": "โหมดกะทัดรัด", "showDetailed": "แสดงรายละเอียด", - "selectHosts": "เลือกโฮสต์", "allHosts": "โฮสต์ทั้งหมด", - "listLayout": "รายการ", - "gridLayout": "ตาราง", "terminal": "เทอร์มินัล", "files": "ไฟล์", "docker": "ด็อกเกอร์", @@ -422,12 +284,8 @@ "accentColor": "สีเน้น", "widgetSshTerminalName": "เทอร์มินัล SSH", "widgetSshTerminalDesc": "เทอร์มินัล SSH แบบอินไลน์ที่เชื่อมต่อกับโฮสต์ที่กำหนดค่าไว้", - "sshTerminalNoHost": "ไม่มีการกำหนดค่าโฮสต์", - "sshTerminalConnect": "เชื่อมต่อ", - "sshTerminalAutoConnect": "เชื่อมต่ออัตโนมัติเมื่อโหลดเสร็จ", "widgetQuickConnectName": "การเชื่อมต่อด่วน", "widgetQuickConnectDesc": "ปุ่มเปิดใช้งานเพียงคลิกเดียวสำหรับการเชื่อมต่อทุกประเภทบนโฮสต์ของคุณ", - "connectionTypes": "ประเภทการเชื่อมต่อ", "connType_terminal": "เทอร์มินัล", "connType_files": "ตัวจัดการไฟล์", "connType_docker": "ด็อกเกอร์", @@ -685,7 +543,6 @@ "renameTab": "เปลี่ยนชื่อแท็บ", "openFileManager": "เปิดตัวจัดการไฟล์", "dashboard": "แดชบอร์ด", - "homepage": "หน้าแรก", "quickConnect": "การเชื่อมต่อด่วน", "sshTools": "เครื่องมือ SSH", "history": "ประวัติศาสตร์", @@ -1895,9 +1752,7 @@ "serverStatsCard": "สถิติเซิร์ฟเวอร์", "panelMain": "หลัก", "panelSide": "ด้านข้าง", - "justNow": "เมื่อสักครู่นี้เอง", - "serviceLinks": "ลิงก์บริการ", - "homepagePreview": "ตัวอย่างหน้าแรก" + "justNow": "เมื่อสักครู่นี้เอง" }, "donation": { "title": "ชอบ Termix ไหม?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "ลากการ์ดเพื่อจัดเรียงลำดับใหม่ · ลากเส้นแบ่งคอลัมน์เพื่อปรับขนาดคอลัมน์ · ลากขอบด้านล่างของการ์ดเพื่อปรับขนาดความสูง · ลากไอคอนถังขยะเพื่อลบออก", "empty": "ว่างเปล่า", "clear": "ชัดเจน", - "serviceLinksTitle": "ลิงก์บริการ", - "serviceLinksEmpty": "ยังไม่มีลิงก์บริการ", "serviceLinksAddLabel": "ฉลาก", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "เพิ่ม", - "serviceLinksLabelPlaceholder": "บริการของฉัน", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "ป้อนที่อยู่เว็บที่ถูกต้อง", - "serviceLinksAddFailed": "ไม่สามารถเพิ่มลิงก์บริการได้", "viewServerDetails": "ดูรายละเอียดเซิร์ฟเวอร์" }, "admin": { diff --git a/src/ui/locales/translated/tr_TR.json b/src/ui/locales/translated/tr_TR.json index 49205f30c..1198e3469 100644 --- a/src/ui/locales/translated/tr_TR.json +++ b/src/ui/locales/translated/tr_TR.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Kilidi açmak için sürükleyip bırakın ve yeniden düzenleyin." }, "homepage": { - "title": "Ana Sayfa", - "addWidget": "Bileşen Ekle", - "editWidget": "Bileşeni Düzenle", "deleteWidget": "Sil", "widgetTypes": "Widget Türleri", "serviceLink": "Servis Bağlantısı", @@ -206,116 +203,40 @@ "notes": "Notlar", "hostStatus": "Sunucu Durumu", "bookmarkList": "Yer İmleri", - "zoomIn": "Yakınlaştır", - "zoomOut": "Uzaklaştır", - "resetView": "Görünümü Sıfırla", - "lockLayout": "Düzeni Kilitle", - "unlockLayout": "Düzen Kilidini Aç", - "noWidgets": "İlk widget'ınızı eklemek için sağ tıklayın veya + simgesine tıklayın", - "openFullView": "Tam Görünümü Aç", - "previewTitle": "Ana Sayfa Önizlemesi", - "cancel": "İptal", - "save": "Kaydet", - "title_label": "Başlık", - "widgetTitlePlaceholder": "Widget başlığı (isteğe bağlı)", - "url": "URL", - "imageUrl": "Özel Resim URL'si", - "imageUrlHint": "Site favicon'unu otomatik olarak kullanmak için boş bırakın", - "showImage": "Resmi Göster", - "description": "Açıklama", - "color": "Renk", "icon": "Simge", "expanded": "Varsayılan olarak genişletilmiş", - "timezone": "Zaman Dilimi", - "invalidTimezone": "Geçersiz saat dilimi. Lütfen America/New_York gibi bir IANA adı kullanın.", - "showSeconds": "Saniyeleri göster", - "format12h": "12 saatlik", "format24h": "24 saatlik", - "content": "İçerik", - "backgroundColor": "Arka Plan Rengi", "host": "Sunucu", "showMetrics": "Metrikleri Göster", - "links": "Bağlantılar", - "addLink": "Bağlantı Ekle", - "linkLabel": "Etiket", "linkUrl": "URL", "removeLink": "Kaldır", - "categoryLinks": "Bağlantılar", - "categoryInfo": "Bilgi", - "categorySystem": "Sistem", "widgetServiceLinkDesc": "Bir servis URL'sine bağlanan tıklanabilir bir döşeme", "widgetFolderDesc": "İlgili widget'ları gruplandırmak için bir kapsayıcı", "widgetClockDesc": "Yapılandırılabilir saat dilimine sahip canlı bir saat", "widgetNotesDesc": "Markdown notlar widget'ı", "widgetHostStatusDesc": "Bir SSH sunucusu için canlı CPU, bellek ve disk kullanımını gösterir", "widgetBookmarkListDesc": "Hızlı bağlantıların bir listesi", - "copyLink": "Bağlantıyı Kopyala", - "linkCopied": "Bağlantı kopyalandı!", - "location": "Konum", - "temperatureUnit": "Sıcaklık Birimi", - "showForecast": "3 günlük tahmini göster", - "scrolling": "Kaydırmaya İzin Ver", - "feedUrl": "Akış URL'si", - "maxItems": "Maksimum Öğe Sayısı", - "showDescription": "Açıklamayı Göster", "widgetWeatherName": "Hava Durumu", "widgetWeatherDesc": "Herhangi bir konum için canlı hava durumu", "widgetIframeName": "iFrame Yerleştirme", "widgetIframeDesc": "Herhangi bir URL'yi iframe içine göm", - "widgetRssName": "RSS Akışı", "widgetRssDesc": "RSS veya Atom akışından öğeleri görüntüle", "dragToFolder": "Widget'ları buraya sürükleyin veya eklemek için + kullanın", "showDisk": "Disk Kullanımını Göster", "addToFolder": "Widget'ı klasöre ekle", - "noHostSelected": "Sunucu seçilmedi", "selectHost": "Bir sunucu seçin...", - "displayedMetrics": "Gösterilen Metrikler", - "metricCpu": "CPU", - "metricMemory": "Bellek", - "metricDisk": "Disk", - "metricUptime": "Çalışma Süresi", - "metricSystem": "Sistem", - "metricNetwork": "Ağ", - "metricProcesses": "İşlemler", - "categoryMonitoring": "İzleme", "loading": "Yükleniyor...", "allClear": "Her şey normal", - "noPingUrls": "Hiçbir URL yapılandırılmamış", - "pingLabel": "Etiket", - "addPingUrl": "URL Ekle", - "showLatency": "Gecikmeyi Göster", - "refreshInterval": "Yenileme Aralığı", - "seconds": "saniye", - "filterActivityTypes": "Filtre Türleri", - "filterTypesHint": "Tümünü göstermek için boş bırakın", - "showTimestamp": "Zaman Damgasını Göster", - "uptimeUnavailable": "Çalışma süresi kullanılamıyor", - "uptimeLabel": "Çalışma Süresi", - "overviewVersion": "Sürüm", "overviewUpdate": "Güncel", - "overviewUpdateLabel": "Güncelleme", - "overviewUpdateAvailable": "Güncelleme mevcut", - "overviewDatabase": "Veritabanı", - "overviewUptime": "Çalışma Süresi", - "noHosts": "Hiçbir sunucu yapılandırılmamış", - "hostGridHosts": "Sunucular", - "hostGridAllHint": "Tüm sunucuları göstermek için boş bırakın", - "columns": "Sütunlar", - "showIp": "IP Adresini Göster", "connectionType": "Bağlantı Türü", - "layout": "Düzen", - "showStatus": "Durumu Göster", "showHostName": "Sunucu Adını Göster", "noDockerActivity": "Docker etkinliği yok", - "noActivity": "Etkinlik yok", "showAcknowledged": "Onaylananları Göster", "widgetMetricsChartName": "Metrik Grafiği", "widgetMetricsChartDesc": "Bir sunucu için geçmiş CPU, bellek, disk veya ağ grafiği", "widgetHostGridName": "Sunucu Izgarası", "widgetHostGridDesc": "SSH sunucu durumlarının ızgara görünümü", - "widgetPingStatusName": "Ping Durumu", "widgetPingStatusDesc": "Bir veya daha fazla URL için HTTP ping durumu", - "widgetRecentActivityName": "Son Etkinlikler", "widgetRecentActivityDesc": "Son Termix etkinliklerinin kaydırılabilir akışı", "widgetTermixUptimeName": "Termix Çalışma Süresi", "widgetTermixUptimeDesc": "Termix sunucusu için canlı çalışma süresi sayacı", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Satır içi girişli hızlı arama kısayol düğmeleri", "widgetLinkTreeName": "Bağlantı Ağacı", "widgetLinkTreeDesc": "Başlıklarla gruplandırılmış bağlantı bölümleri", - "calMon": "Pzt", - "calTue": "Sal", - "calWed": "Çar", - "calThu": "Per", - "calFri": "Cum", - "calSat": "Cmt", - "calSun": "Paz", - "startOnMonday": "Haftayı Pazartesi başlat", - "countdownNoDate": "Hedef tarih ayarlanmadı", - "countdownPast": "Etkinlik geçmişte kaldı", - "countdownDays": "gün", - "countdownHours": "sa", - "countdownMinutes": "dk", - "countdownSeconds": "sn", - "countdownLabel": "Etiket", - "countdownLabelPlaceholder": "Örn. Lansman Günü", - "countdownShowDays": "Günleri Göster", - "countdownShowHours": "Saatleri Göster", - "targetDate": "Hedef Tarih", - "searchEngine": "Arama Motoru", - "customSearchUrl": "Özel Arama URL'si", - "searchPlaceholder": "Ara...", - "searchGo": "Git", - "searchPlaceholderLabel": "Yer Tutucu Metin", - "searchPlaceholderHint": "Arama girişinde gösterilen metin", - "openInNewTab": "Yeni Sekmede Aç", - "searchQueryPlaceholder": "Sorgu girin...", - "noSearchShortcuts": "Hiç kısayol yapılandırılmadı", - "addSearchShortcut": "Kısayol Ekle", - "fontSize": "Yazı Tipi Boyutu", - "textAlign": "Metin Hizalama", - "fontWeight": "Yazı Tipi Kalınlığı", - "clearColor": "Rengi Temizle", - "imageFit": "Görüntü Sığdırma", - "imageLinkUrl": "Bağlantı URL'si", - "noImage": "Görüntü URL'si ayarlanmadı", - "altText": "Alternatif Metin", - "altTextPlaceholder": "Görüntüyü tanımlayın", - "renderMarkdown": "Markdown'ı Görüntüle", - "displayMode": "Görüntüleme Modu", - "displayField": "Görüntüleme Alanı", - "jsonPath": "JSON Yolu", - "customApiLabel": "Etiket", - "customApiLabelPlaceholder": "Örn. Sıcaklık", - "customApiUnit": "Birim", - "customApiNoUrl": "API URL'si yapılandırılmadı", - "customApiError": "Getirme başarısız", - "customApiNotArray": "Yanıt bir dizi değil", - "addService": "Servis Ekle", - "showLabels": "Etiketleri Göster", - "iconSize": "Simge Boyutu", - "noDashboardLinks": "Hiçbir pano bağlantısı yapılandırılmamış", - "noLimit": "Sınır yok", - "sectionHeading": "Bölüm Başlığı", - "addSection": "Bölüm Ekle", - "compactMode": "Kompakt Mod", "showDetailed": "Ayrıntılı Göster", - "selectHosts": "Sunucuları Seç", "allHosts": "Tüm sunucular", - "listLayout": "Liste", - "gridLayout": "Izgara", "terminal": "Terminal", "files": "Dosyalar", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Vurgu Rengi", "widgetSshTerminalName": "SSH Terminali", "widgetSshTerminalDesc": "Yapılandırılmış bir sunucuya bağlı satır içi SSH terminali", - "sshTerminalNoHost": "Hiçbir sunucu yapılandırılmamış", - "sshTerminalConnect": "Bağlan", - "sshTerminalAutoConnect": "Yüklendiğinde otomatik bağlan", "widgetQuickConnectName": "Hızlı Bağlantı", "widgetQuickConnectDesc": "Sunucularınızda herhangi bir bağlantı türü için tek tıklamayla başlatma düğmeleri", - "connectionTypes": "Bağlantı Türleri", "connType_terminal": "Terminal", "connType_files": "Dosya Yöneticisi", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Sekmeyi Yeniden Adlandır", "openFileManager": "Dosya Yöneticisini Aç", "dashboard": "Dashboard", - "homepage": "Ana Sayfa", "quickConnect": "Hızlı Bağlantı", "sshTools": "SSH Araçları", "history": "Geçmiş", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Sunucu İstatistikleri", "panelMain": "Ana", "panelSide": "Kenar", - "justNow": "az önce", - "serviceLinks": "Hizmet Bağlantıları", - "homepagePreview": "Ana Sayfa Önizlemesi" + "justNow": "az önce" }, "donation": { "title": "Termix'i Beğendiniz mi?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Kartları sürükleyerek sıralayın · Sütun genişliğini değiştirmek için sütun ayırıcıyı sürükleyin · Kartın yüksekliğini ayarlamak için alt kenarını sürükleyin · Kaldırmak için çöp kutusuna atın", "empty": "Boş", "clear": "Temizle", - "serviceLinksTitle": "Servis Bağlantıları", - "serviceLinksEmpty": "Henüz servis bağlantısı yok", "serviceLinksAddLabel": "Etiket", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Ekle", - "serviceLinksLabelPlaceholder": "Hizmetim", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Geçerli bir web adresi girin", - "serviceLinksAddFailed": "Servis bağlantısı eklenemedi", "viewServerDetails": "Sunucu ayrıntılarını görüntüle" }, "admin": { diff --git a/src/ui/locales/translated/uk_UA.json b/src/ui/locales/translated/uk_UA.json index e167fef81..d0c976f41 100644 --- a/src/ui/locales/translated/uk_UA.json +++ b/src/ui/locales/translated/uk_UA.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Розблокуйте перетягування, щоб змінити порядок" }, "homepage": { - "title": "Домашня сторінка", - "addWidget": "Додати віджет", - "editWidget": "Редагувати віджет", "deleteWidget": "Видалити", "widgetTypes": "Типи віджетів", "serviceLink": "Посилання на сервіс", @@ -206,116 +203,40 @@ "notes": "Нотатки", "hostStatus": "Стан хоста", "bookmarkList": "Закладки", - "zoomIn": "Збільшити масштаб", - "zoomOut": "Зменшити масштаб", - "resetView": "Скинути вигляд", - "lockLayout": "Макет замка", - "unlockLayout": "Розблокувати макет", - "noWidgets": "Клацніть правою кнопкою миші або натисніть кнопку +, щоб додати свій перший віджет", - "openFullView": "Відкрити повний перегляд", - "previewTitle": "Попередній перегляд головної сторінки", - "cancel": "Скасувати", - "save": "Зберегти", - "title_label": "Назва", - "widgetTitlePlaceholder": "Назва віджета (необов'язково)", - "url": "URL-адреса", - "imageUrl": "URL-адреса користувацького зображення", - "imageUrlHint": "Залиште поле порожнім, щоб автоматично використовувати фавіконку сайту", - "showImage": "Показати зображення", - "description": "Опис", - "color": "Колір", "icon": "Значок", "expanded": "Розгорнуто за замовчуванням", - "timezone": "Часовий пояс", - "invalidTimezone": "Недійсний часовий пояс. Використайте назву IANA, наприклад, America/New_York.", - "showSeconds": "Показати секунди", - "format12h": "12-годинний", "format24h": "24 години на добу", - "content": "Зміст", - "backgroundColor": "Колір фону", "host": "Хост", "showMetrics": "Показати показники", - "links": "Посилання", - "addLink": "Додати посилання", - "linkLabel": "Мітка", "linkUrl": "URL-адреса", "removeLink": "Видалити", - "categoryLinks": "Посилання", - "categoryInfo": "Інформація", - "categorySystem": "Система", "widgetServiceLinkDesc": "Клікувальна плитка, що посилається на URL-адресу сервісу", "widgetFolderDesc": "Контейнер для групування пов'язаних віджетів", "widgetClockDesc": "Живий годинник із налаштовуваним часовим поясом", "widgetNotesDesc": "Віджет нотаток Markdown", "widgetHostStatusDesc": "Показує стан процесора, пам'яті та диска в реальному часі для SSH-хоста", "widgetBookmarkListDesc": "Список швидких посилань", - "copyLink": "Копіювати посилання", - "linkCopied": "Посилання скопійовано!", - "location": "Розташування", - "temperatureUnit": "Одиниця вимірювання температури", - "showForecast": "Показати 3-денний прогноз", - "scrolling": "Дозволити прокручування", - "feedUrl": "URL-адреса стрічки", - "maxItems": "Макс. кількість елементів", - "showDescription": "Показати опис", "widgetWeatherName": "Погода", "widgetWeatherDesc": "Погода в реальному часі для будь-якого місця", "widgetIframeName": "Вбудувати iFrame", "widgetIframeDesc": "Вбудувати будь-яку URL-адресу в iframe", - "widgetRssName": "RSS-канал", "widgetRssDesc": "Відображення елементів зі стрічки RSS або Atom", "dragToFolder": "Перетягніть віджети сюди або скористайтеся знаком +, щоб додати", "showDisk": "Показати використання диска", "addToFolder": "Додати віджет до папки", - "noHostSelected": "Хост не вибрано", "selectHost": "Виберіть хоста...", - "displayedMetrics": "Відображені показники", - "metricCpu": "Процесор", - "metricMemory": "Пам'ять", - "metricDisk": "Диск", - "metricUptime": "Час безперебійної роботи", - "metricSystem": "Система", - "metricNetwork": "Мережа", - "metricProcesses": "Процеси", - "categoryMonitoring": "Моніторинг", "loading": "Завантаження...", "allClear": "Все чисто", - "noPingUrls": "URL-адреси не налаштовано", - "pingLabel": "Мітка", - "addPingUrl": "Додати URL-адресу", - "showLatency": "Показати затримку", - "refreshInterval": "Інтервал оновлення", - "seconds": "секунди", - "filterActivityTypes": "Типи фільтрів", - "filterTypesHint": "Залиште порожнім, щоб показати всі", - "showTimestamp": "Показати позначку часу", - "uptimeUnavailable": "Час безперебійної роботи недоступний", - "uptimeLabel": "Час безперебійної роботи", - "overviewVersion": "Версія", "overviewUpdate": "Оновлено", - "overviewUpdateLabel": "Оновлення", - "overviewUpdateAvailable": "Доступне оновлення", - "overviewDatabase": "База даних", - "overviewUptime": "Час безперебійної роботи", - "noHosts": "Немає налаштованих хостів", - "hostGridHosts": "Хости", - "hostGridAllHint": "Залиште порожнім, щоб показати всіх хостів", - "columns": "Колонки", - "showIp": "Показати IP-адресу", "connectionType": "Тип підключення", - "layout": "Макет", - "showStatus": "Показати статус", "showHostName": "Показати ім'я хоста", "noDockerActivity": "Немає активності Docker", - "noActivity": "Немає активності", "showAcknowledged": "Показати підтверджене", "widgetMetricsChartName": "Діаграма показників", "widgetMetricsChartDesc": "Історична діаграма процесора, пам'яті, диска або мережі для хоста", "widgetHostGridName": "Сітка хоста", "widgetHostGridDesc": "Таблиця статусів хостів SSH", - "widgetPingStatusName": "Стан пінгу", "widgetPingStatusDesc": "Статус HTTP-пінгу для однієї або кількох URL-адрес", - "widgetRecentActivityName": "Нещодавня активність", "widgetRecentActivityDesc": "Прокручувана стрічка нещодавньої активності Termix", "widgetTermixUptimeName": "Час безперебійної роботи Termix", "widgetTermixUptimeDesc": "Лічильник часу безвідмовної роботи сервера Termix у реальному часі", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Кнопки швидкого пошуку з вбудованим введенням", "widgetLinkTreeName": "Дерево посилань", "widgetLinkTreeDesc": "Згруповані розділи посилань із заголовками", - "calMon": "Мо", - "calTue": "Вт", - "calWed": "Ми", - "calThu": "Чт", - "calFri": "Пт", - "calSat": "Сб", - "calSun": "Су", - "startOnMonday": "Початок тижня в понеділок", - "countdownNoDate": "Цільова дата не встановлена", - "countdownPast": "Подія пройшла", - "countdownDays": "дні", - "countdownHours": "год.", - "countdownMinutes": "хв", - "countdownSeconds": "сек", - "countdownLabel": "Мітка", - "countdownLabelPlaceholder": "наприклад, день запуску", - "countdownShowDays": "Дні показу", - "countdownShowHours": "Години роботи шоу", - "targetDate": "Цільова дата", - "searchEngine": "Пошукова система", - "customSearchUrl": "URL-адреса користувацького пошуку", - "searchPlaceholder": "Пошук...", - "searchGo": "Іти", - "searchPlaceholderLabel": "Текст-заповнювач", - "searchPlaceholderHint": "Текст, що відображається всередині пошукового поля", - "openInNewTab": "Відкрити в новій вкладці", - "searchQueryPlaceholder": "Введіть запит...", - "noSearchShortcuts": "Немає налаштованих комбінацій клавіш", - "addSearchShortcut": "Додати ярлик", - "fontSize": "Розмір шрифту", - "textAlign": "Вирівнювання тексту", - "fontWeight": "Вага шрифту", - "clearColor": "Чіткий колір", - "imageFit": "Розмір зображення", - "imageLinkUrl": "URL-адреса посилання", - "noImage": "URL-адреса зображення не встановлена", - "altText": "Альтернативний текст", - "altTextPlaceholder": "Опишіть зображення", - "renderMarkdown": "Рендеринг Markdown", - "displayMode": "Режим відображення", - "displayField": "Поле відображення", - "jsonPath": "Шлях JSON", - "customApiLabel": "Мітка", - "customApiLabelPlaceholder": "наприклад, температура", - "customApiUnit": "Одиниця", - "customApiNoUrl": "URL-адреса API не налаштована", - "customApiError": "Не вдалося отримати", - "customApiNotArray": "Відповідь не є масивом", - "addService": "Додати послугу", - "showLabels": "Показати мітки", - "iconSize": "Розмір значка", - "noDashboardLinks": "Посилання на інформаційну панель не налаштовано", - "noLimit": "Без обмежень", - "sectionHeading": "Заголовок розділу", - "addSection": "Додати розділ", - "compactMode": "Компактний режим", "showDetailed": "Показати детальну інформацію", - "selectHosts": "Виберіть хости", "allHosts": "Усі хости", - "listLayout": "Список", - "gridLayout": "Сітка", "terminal": "Термінал", "files": "Файли", "docker": "Докер", @@ -422,12 +284,8 @@ "accentColor": "Акцентний колір", "widgetSshTerminalName": "SSH-термінал", "widgetSshTerminalDesc": "Вбудований SSH-термінал, підключений до налаштованого хоста", - "sshTerminalNoHost": "Хост не налаштовано", - "sshTerminalConnect": "Підключитися", - "sshTerminalAutoConnect": "Автоматичне підключення під час завантаження", "widgetQuickConnectName": "Швидке підключення", "widgetQuickConnectDesc": "Кнопки запуску одним кліком для будь-якого типу підключення на ваших хостах", - "connectionTypes": "Типи з'єднань", "connType_terminal": "Термінал", "connType_files": "Файловий менеджер", "connType_docker": "Докер", @@ -685,7 +543,6 @@ "renameTab": "Перейменувати вкладку", "openFileManager": "Відкрити файловий менеджер", "dashboard": "Інформаційна панель", - "homepage": "Домашня сторінка", "quickConnect": "Швидке підключення", "sshTools": "SSH-інструменти", "history": "Історія", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Статистика сервера", "panelMain": "Головне", "panelSide": "Сторона", - "justNow": "щойно", - "serviceLinks": "Посилання на сервіси", - "homepagePreview": "Попередній перегляд головної сторінки" + "justNow": "щойно" }, "donation": { "title": "Подобається Термікс?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Перетягніть картки, щоб змінити порядок · Перетягніть роздільник стовпців, щоб змінити розмір стовпців · Перетягніть нижній край картки, щоб змінити її висоту · Видалити з кошика", "empty": "Порожній", "clear": "Очистити", - "serviceLinksTitle": "Посилання на сервіси", - "serviceLinksEmpty": "Поки що немає посилань на сервіси", "serviceLinksAddLabel": "Мітка", "serviceLinksAddUrl": "URL-адреса", - "serviceLinksAdd": "Додати", - "serviceLinksLabelPlaceholder": "Моя послуга", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Введіть дійсну веб-адресу", - "serviceLinksAddFailed": "Не вдалося додати посилання на послугу", "viewServerDetails": "Переглянути деталі сервера" }, "admin": { diff --git a/src/ui/locales/translated/vi_VN.json b/src/ui/locales/translated/vi_VN.json index a368c7b72..74ca8def1 100644 --- a/src/ui/locales/translated/vi_VN.json +++ b/src/ui/locales/translated/vi_VN.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "Mở khóa chức năng kéo để sắp xếp lại." }, "homepage": { - "title": "Trang chủ", - "addWidget": "Thêm widget", - "editWidget": "Sửa widget", "deleteWidget": "Xóa", "widgetTypes": "Loại widget", "serviceLink": "Liên kết dịch vụ", @@ -206,116 +203,40 @@ "notes": "Ghi chú", "hostStatus": "Trạng thái máy chủ", "bookmarkList": "Dấu trang", - "zoomIn": "Phóng to", - "zoomOut": "Thu nhỏ", - "resetView": "Đặt lại chế độ xem", - "lockLayout": "Khóa bố cục", - "unlockLayout": "Mở khóa bố cục", - "noWidgets": "Nhấp chuột phải hoặc nhấn + để thêm widget đầu tiên", - "openFullView": "Mở toàn màn hình", - "previewTitle": "Xem trước trang chủ", - "cancel": "Hủy", - "save": "Lưu", - "title_label": "Tiêu đề", - "widgetTitlePlaceholder": "Tiêu đề widget (tùy chọn)", - "url": "URL", - "imageUrl": "URL hình ảnh tùy chỉnh", - "imageUrlHint": "Để trống để tự động dùng favicon của trang", - "showImage": "Hiển thị hình ảnh", - "description": "Mô tả", - "color": "Màu sắc", "icon": "Biểu tượng", "expanded": "Mở rộng mặc định", - "timezone": "Múi giờ", - "invalidTimezone": "Múi giờ không hợp lệ. Hãy sử dụng tên IANA như America/New_York.", - "showSeconds": "Hiển thị giây", - "format12h": "12 giờ", "format24h": "24 giờ", - "content": "Nội dung", - "backgroundColor": "Màu nền", "host": "Máy chủ", "showMetrics": "Hiển thị chỉ số", - "links": "Liên kết", - "addLink": "Thêm liên kết", - "linkLabel": "Nhãn", "linkUrl": "URL", "removeLink": "Xóa", - "categoryLinks": "Liên kết", - "categoryInfo": "Thông tin", - "categorySystem": "Hệ thống", "widgetServiceLinkDesc": "Ô nhấp được để liên kết đến URL dịch vụ", "widgetFolderDesc": "Hộp chứa để nhóm các widget liên quan", "widgetClockDesc": "Đồng hồ trực tiếp với múi giờ tùy chỉnh", "widgetNotesDesc": "Widget ghi chú markdown", "widgetHostStatusDesc": "Hiển thị trực tiếp CPU, bộ nhớ và ổ đĩa cho máy chủ SSH", "widgetBookmarkListDesc": "Danh sách liên kết nhanh", - "copyLink": "Sao chép liên kết", - "linkCopied": "Đã sao chép liên kết!", - "location": "Vị trí", - "temperatureUnit": "Đơn vị nhiệt độ", - "showForecast": "Hiển thị dự báo 3 ngày", - "scrolling": "Cho phép cuộn", - "feedUrl": "URL nguồn cấp", - "maxItems": "Số mục tối đa", - "showDescription": "Hiển thị mô tả", "widgetWeatherName": "Thời tiết", "widgetWeatherDesc": "Thời tiết trực tiếp cho mọi vị trí", "widgetIframeName": "Nhúng iFrame", "widgetIframeDesc": "Nhúng bất kỳ URL nào vào iframe", - "widgetRssName": "Nguồn RSS", "widgetRssDesc": "Hiển thị các mục từ nguồn RSS hoặc Atom", "dragToFolder": "Kéo widget vào đây hoặc dùng + để thêm", "showDisk": "Hiển thị mức sử dụng ổ đĩa", "addToFolder": "Thêm widget vào thư mục", - "noHostSelected": "Chưa chọn máy chủ", "selectHost": "Chọn máy chủ...", - "displayedMetrics": "Chỉ số hiển thị", - "metricCpu": "CPU", - "metricMemory": "Bộ nhớ", - "metricDisk": "Đĩa", - "metricUptime": "Thời gian hoạt động", - "metricSystem": "Hệ thống", - "metricNetwork": "Mạng", - "metricProcesses": "Tiến trình", - "categoryMonitoring": "Giám sát", "loading": "Đang tải...", "allClear": "Tất cả ổn", - "noPingUrls": "Chưa cấu hình URL", - "pingLabel": "Nhãn", - "addPingUrl": "Thêm URL", - "showLatency": "Hiển thị độ trễ", - "refreshInterval": "Chu kỳ làm mới", - "seconds": "giây", - "filterActivityTypes": "Loại hoạt động", - "filterTypesHint": "Để trống để hiển thị tất cả", - "showTimestamp": "Hiển thị dấu thời gian", - "uptimeUnavailable": "Không có thời gian hoạt động", - "uptimeLabel": "Thời gian hoạt động", - "overviewVersion": "Phiên bản", "overviewUpdate": "Đã cập nhật mới nhất", - "overviewUpdateLabel": "Cập nhật", - "overviewUpdateAvailable": "Có bản cập nhật", - "overviewDatabase": "Cơ sở dữ liệu", - "overviewUptime": "Thời gian hoạt động", - "noHosts": "Chưa cấu hình máy chủ nào", - "hostGridHosts": "Máy chủ", - "hostGridAllHint": "Để trống để hiển thị tất cả máy chủ", - "columns": "Cột", - "showIp": "Hiển thị địa chỉ IP", "connectionType": "Kiểu kết nối", - "layout": "Bố cục", - "showStatus": "Hiển thị trạng thái", "showHostName": "Hiển thị tên máy chủ", "noDockerActivity": "Không có hoạt động Docker", - "noActivity": "Không có hoạt động", "showAcknowledged": "Hiển thị đã xác nhận", "widgetMetricsChartName": "Biểu đồ chỉ số", "widgetMetricsChartDesc": "Biểu đồ lịch sử CPU, bộ nhớ, ổ đĩa hoặc mạng cho một máy chủ", "widgetHostGridName": "Lưới máy chủ", "widgetHostGridDesc": "Hiển thị trạng thái máy chủ SSH dạng lưới", - "widgetPingStatusName": "Trạng thái ping", "widgetPingStatusDesc": "Trạng thái ping HTTP cho một hoặc nhiều URL", - "widgetRecentActivityName": "Hoạt động gần đây", "widgetRecentActivityDesc": "Luồng cuộn hiển thị hoạt động Termix gần đây", "widgetTermixUptimeName": "Thời gian hoạt động Termix", "widgetTermixUptimeDesc": "Bộ đếm uptime trực tiếp cho máy chủ Termix", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "Các nút lối tắt tìm kiếm nhanh với nhập liệu trực tiếp", "widgetLinkTreeName": "Cây Liên kết", "widgetLinkTreeDesc": "Các phần liên kết được nhóm với tiêu đề", - "calMon": "T2", - "calTue": "T3", - "calWed": "T4", - "calThu": "T5", - "calFri": "T6", - "calSat": "T7", - "calSun": "CN", - "startOnMonday": "Bắt đầu tuần từ Thứ 2", - "countdownNoDate": "Chưa đặt ngày mục tiêu", - "countdownPast": "Sự kiện đã qua", - "countdownDays": "ngày", - "countdownHours": "giờ", - "countdownMinutes": "phút", - "countdownSeconds": "giây", - "countdownLabel": "Nhãn", - "countdownLabelPlaceholder": "Ví dụ: Ngày ra mắt", - "countdownShowDays": "Hiển thị ngày", - "countdownShowHours": "Hiển thị giờ", - "targetDate": "Ngày mục tiêu", - "searchEngine": "Công cụ tìm kiếm", - "customSearchUrl": "URL tìm kiếm tùy chỉnh", - "searchPlaceholder": "Tìm kiếm...", - "searchGo": "Tìm", - "searchPlaceholderLabel": "Văn bản gợi ý", - "searchPlaceholderHint": "Văn bản hiển thị trong ô tìm kiếm", - "openInNewTab": "Mở trong tab mới", - "searchQueryPlaceholder": "Nhập truy vấn...", - "noSearchShortcuts": "Chưa có phím tắt nào được cấu hình", - "addSearchShortcut": "Thêm phím tắt", - "fontSize": "Cỡ chữ", - "textAlign": "Căn chỉnh văn bản", - "fontWeight": "Độ đậm chữ", - "clearColor": "Xóa màu", - "imageFit": "Kiểu vừa ảnh", - "imageLinkUrl": "URL liên kết", - "noImage": "Chưa đặt URL hình ảnh", - "altText": "Văn bản thay thế", - "altTextPlaceholder": "Mô tả hình ảnh", - "renderMarkdown": "Kết xuất Markdown", - "displayMode": "Chế độ hiển thị", - "displayField": "Trường hiển thị", - "jsonPath": "Đường dẫn JSON", - "customApiLabel": "Nhãn", - "customApiLabelPlaceholder": "Ví dụ: Nhiệt độ", - "customApiUnit": "Đơn vị", - "customApiNoUrl": "Chưa cấu hình URL API", - "customApiError": "Không tải được", - "customApiNotArray": "Phản hồi không phải là một mảng", - "addService": "Thêm dịch vụ", - "showLabels": "Hiển thị nhãn", - "iconSize": "Kích thước biểu tượng", - "noDashboardLinks": "Chưa có liên kết bảng điều khiển", - "noLimit": "Không giới hạn", - "sectionHeading": "Tiêu đề phần", - "addSection": "Thêm phần", - "compactMode": "Chế độ thu gọn", "showDetailed": "Hiển thị chi tiết", - "selectHosts": "Chọn máy chủ", "allHosts": "Tất cả máy chủ", - "listLayout": "Danh sách", - "gridLayout": "Lưới", "terminal": "Terminal", "files": "Tệp", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "Màu nhấn", "widgetSshTerminalName": "SSH Terminal", "widgetSshTerminalDesc": "Một terminal SSH nội tuyến kết nối tới máy chủ đã cấu hình", - "sshTerminalNoHost": "Chưa cấu hình máy chủ", - "sshTerminalConnect": "Kết nối", - "sshTerminalAutoConnect": "Tự động kết nối khi tải", "widgetQuickConnectName": "Kết nối nhanh", "widgetQuickConnectDesc": "Nút khởi chạy một nhấp cho mọi loại kết nối trên các máy chủ của bạn", - "connectionTypes": "Loại kết nối", "connType_terminal": "Terminal", "connType_files": "Quản lý tệp", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "Đổi tên tab", "openFileManager": "Mở quản lý tệp", "dashboard": "Bảng điều khiển", - "homepage": "Trang chủ", "quickConnect": "Kết nối nhanh", "sshTools": "Công cụ SSH", "history": "Lịch sử", @@ -1895,9 +1752,7 @@ "serverStatsCard": "Thống kê máy chủ", "panelMain": "Chính", "panelSide": "Bên", - "justNow": "vừa xong", - "serviceLinks": "Liên kết Dịch vụ", - "homepagePreview": "Xem trước Trang chủ" + "justNow": "vừa xong" }, "donation": { "title": "Bạn thích Termix chứ?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "Kéo thẻ để sắp xếp lại · Kéo dải phân cách cột để thay đổi kích thước cột · Kéo cạnh dưới của thẻ để thay đổi chiều cao · Kéo vào thùng rác để xóa", "empty": "Trống", "clear": "Xóa", - "serviceLinksTitle": "Liên kết dịch vụ", - "serviceLinksEmpty": "Chưa có liên kết dịch vụ nào", "serviceLinksAddLabel": "Nhãn", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "Thêm", - "serviceLinksLabelPlaceholder": "Dịch vụ của tôi", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "Nhập địa chỉ web hợp lệ", - "serviceLinksAddFailed": "Thêm liên kết dịch vụ thất bại", "viewServerDetails": "Xem chi tiết máy chủ" }, "admin": { diff --git a/src/ui/locales/translated/zh_CN.json b/src/ui/locales/translated/zh_CN.json index c853bace9..bb3a7bfa6 100644 --- a/src/ui/locales/translated/zh_CN.json +++ b/src/ui/locales/translated/zh_CN.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "解锁拖动即可重新排列" }, "homepage": { - "title": "主页", - "addWidget": "添加小部件", - "editWidget": "编辑小部件", "deleteWidget": "删除", "widgetTypes": "小部件类型", "serviceLink": "服务链接", @@ -206,116 +203,40 @@ "notes": "笔记", "hostStatus": "主机状态", "bookmarkList": "书签", - "zoomIn": "放大", - "zoomOut": "缩小", - "resetView": "重置视图", - "lockLayout": "锁定布局", - "unlockLayout": "解锁布局", - "noWidgets": "右键单击或点击 + 来添加第一个小部件", - "openFullView": "打开完整视图", - "previewTitle": "首页预览", - "cancel": "取消", - "save": "保存", - "title_label": "标题", - "widgetTitlePlaceholder": "小组件标题(可选)", - "url": "URL", - "imageUrl": "自定义图片 URL", - "imageUrlHint": "留空将自动使用网站图标", - "showImage": "显示图片", - "description": "描述", - "color": "颜色", "icon": "图标", "expanded": "默认展开", - "timezone": "时区", - "invalidTimezone": "时区无效。请使用 IANA 名称,例如 America/New_York。", - "showSeconds": "显示秒", - "format12h": "12 小时制", "format24h": "24 小时制", - "content": "内容", - "backgroundColor": "背景颜色", "host": "主机", "showMetrics": "显示指标", - "links": "链接", - "addLink": "添加链接", - "linkLabel": "标签", "linkUrl": "URL", "removeLink": "移除", - "categoryLinks": "链接", - "categoryInfo": "信息", - "categorySystem": "系统", "widgetServiceLinkDesc": "可点击的磁贴,链接到服务 URL", "widgetFolderDesc": "将相关小组件分组的容器", "widgetClockDesc": "带有可配置时区的实时时钟", "widgetNotesDesc": "Markdown 笔记小组件", "widgetHostStatusDesc": "显示 SSH 主机的实时 CPU、内存和磁盘", "widgetBookmarkListDesc": "快速链接列表", - "copyLink": "复制链接", - "linkCopied": "链接已复制!", - "location": "位置", - "temperatureUnit": "温度单位", - "showForecast": "显示三日天气预报", - "scrolling": "允许滚动", - "feedUrl": "订阅源 URL", - "maxItems": "最大条目数", - "showDescription": "显示描述", "widgetWeatherName": "天气", "widgetWeatherDesc": "实时天气信息", "widgetIframeName": "iFrame 嵌入", "widgetIframeDesc": "在 iframe 中嵌入任意 URL", - "widgetRssName": "RSS 订阅源", "widgetRssDesc": "显示 RSS 或 Atom 订阅源中的条目", "dragToFolder": "拖动小组件至此或点击 + 添加", "showDisk": "显示磁盘使用情况", "addToFolder": "添加小组件到文件夹", - "noHostSelected": "未选择主机", "selectHost": "选择主机...", - "displayedMetrics": "显示指标", - "metricCpu": "CPU", - "metricMemory": "内存", - "metricDisk": "磁盘", - "metricUptime": "运行时间", - "metricSystem": "系统", - "metricNetwork": "网络", - "metricProcesses": "进程", - "categoryMonitoring": "监控", "loading": "加载中...", "allClear": "一切正常", - "noPingUrls": "未配置 URL", - "pingLabel": "标签", - "addPingUrl": "添加 URL", - "showLatency": "显示延迟", - "refreshInterval": "刷新间隔", - "seconds": "秒", - "filterActivityTypes": "过滤类型", - "filterTypesHint": "留空显示全部", - "showTimestamp": "显示时间戳", - "uptimeUnavailable": "运行时间不可用", - "uptimeLabel": "运行时间", - "overviewVersion": "版本", "overviewUpdate": "已是最新", - "overviewUpdateLabel": "更新", - "overviewUpdateAvailable": "有可用更新", - "overviewDatabase": "数据库", - "overviewUptime": "运行时间", - "noHosts": "未配置主机", - "hostGridHosts": "主机", - "hostGridAllHint": "留空显示所有主机", - "columns": "列", - "showIp": "显示 IP 地址", "connectionType": "连接类型", - "layout": "布局", - "showStatus": "显示状态", "showHostName": "显示主机名称", "noDockerActivity": "无 Docker 活动", - "noActivity": "无活动", "showAcknowledged": "显示已确认", "widgetMetricsChartName": "指标图表", "widgetMetricsChartDesc": "主机的历史 CPU、内存、磁盘或网络图表", "widgetHostGridName": "主机网格", "widgetHostGridDesc": "SSH 主机状态的网格视图", - "widgetPingStatusName": "Ping 状态", "widgetPingStatusDesc": "一个或多个 URL 的 HTTP ping 状态", - "widgetRecentActivityName": "近期活动", "widgetRecentActivityDesc": "可滚动的近期 Termix 活动信息流", "widgetTermixUptimeName": "Termix 运行时间", "widgetTermixUptimeDesc": "Termix 服务器的实时运行时间计数器", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "带内联输入的快速搜索快捷按钮", "widgetLinkTreeName": "链接树", "widgetLinkTreeDesc": "带标题的分组链接部分", - "calMon": "一", - "calTue": "二", - "calWed": "三", - "calThu": "四", - "calFri": "五", - "calSat": "六", - "calSun": "日", - "startOnMonday": "从周一开始", - "countdownNoDate": "未设置目标日期", - "countdownPast": "事件已过", - "countdownDays": "天", - "countdownHours": "小时", - "countdownMinutes": "分钟", - "countdownSeconds": "秒", - "countdownLabel": "标签", - "countdownLabelPlaceholder": "例如:发布日", - "countdownShowDays": "显示天数", - "countdownShowHours": "显示小时", - "targetDate": "目标日期", - "searchEngine": "搜索引擎", - "customSearchUrl": "自定义搜索 URL", - "searchPlaceholder": "搜索...", - "searchGo": "搜索", - "searchPlaceholderLabel": "占位符文本", - "searchPlaceholderHint": "搜索输入框中显示的文本", - "openInNewTab": "在新标签页中打开", - "searchQueryPlaceholder": "输入查询...", - "noSearchShortcuts": "未配置快捷方式", - "addSearchShortcut": "添加快捷方式", - "fontSize": "字体大小", - "textAlign": "文本对齐", - "fontWeight": "字体粗细", - "clearColor": "清除颜色", - "imageFit": "图片适应", - "imageLinkUrl": "链接 URL", - "noImage": "未设置图片 URL", - "altText": "替代文本", - "altTextPlaceholder": "描述图片", - "renderMarkdown": "渲染 Markdown", - "displayMode": "显示模式", - "displayField": "显示字段", - "jsonPath": "JSON 路径", - "customApiLabel": "标签", - "customApiLabelPlaceholder": "例如:温度", - "customApiUnit": "单位", - "customApiNoUrl": "未配置 API URL", - "customApiError": "获取失败", - "customApiNotArray": "响应不是数组", - "addService": "添加服务", - "showLabels": "显示标签", - "iconSize": "图标大小", - "noDashboardLinks": "未配置仪表板链接", - "noLimit": "无限制", - "sectionHeading": "分区标题", - "addSection": "添加分区", - "compactMode": "紧凑模式", "showDetailed": "显示详情", - "selectHosts": "选择主机", "allHosts": "所有主机", - "listLayout": "列表", - "gridLayout": "网格", "terminal": "终端", "files": "文件", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "强调色", "widgetSshTerminalName": "SSH 终端", "widgetSshTerminalDesc": "连接到已配置主机的内联 SSH 终端", - "sshTerminalNoHost": "未配置主机", - "sshTerminalConnect": "连接", - "sshTerminalAutoConnect": "加载时自动连接", "widgetQuickConnectName": "快速连接", "widgetQuickConnectDesc": "一键启动按钮,适用于主机上的任何连接类型", - "connectionTypes": "连接类型", "connType_terminal": "终端", "connType_files": "文件管理器", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "重命名标签页", "openFileManager": "打开文件管理器", "dashboard": "仪表盘", - "homepage": "首页", "quickConnect": "快速连接", "sshTools": "SSH 工具", "history": "历史记录", @@ -1895,9 +1752,7 @@ "serverStatsCard": "服务器统计", "panelMain": "主面板", "panelSide": "侧面板", - "justNow": "刚刚", - "serviceLinks": "服务链接", - "homepagePreview": "主页预览" + "justNow": "刚刚" }, "donation": { "title": "喜欢 Termix 吗?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "拖拽卡片重新排序 · 拖拽列分隔线调整列宽 · 拖拽卡片底部边缘调整高度 · 移至垃圾桶移除", "empty": "空", "clear": "清除", - "serviceLinksTitle": "服务链接", - "serviceLinksEmpty": "暂无服务链接", "serviceLinksAddLabel": "标签", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "添加", - "serviceLinksLabelPlaceholder": "我的服务", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "输入有效的网址", - "serviceLinksAddFailed": "添加服务链接失败", "viewServerDetails": "查看服务器详情" }, "admin": { diff --git a/src/ui/locales/translated/zh_TW.json b/src/ui/locales/translated/zh_TW.json index eb1645f0e..8f409cbf5 100644 --- a/src/ui/locales/translated/zh_TW.json +++ b/src/ui/locales/translated/zh_TW.json @@ -195,9 +195,6 @@ "arrangeUnlocked": "解鎖拖曳即可重新排列" }, "homepage": { - "title": "首頁", - "addWidget": "新增小工具", - "editWidget": "編輯小工具", "deleteWidget": "刪除", "widgetTypes": "小工具類型", "serviceLink": "服務連結", @@ -206,116 +203,40 @@ "notes": "筆記", "hostStatus": "主機狀態", "bookmarkList": "書籤", - "zoomIn": "放大", - "zoomOut": "縮小", - "resetView": "重設檢視", - "lockLayout": "鎖定佈局", - "unlockLayout": "解鎖佈局", - "noWidgets": "按右鍵或點擊 + 來新增您的第一個小工具", - "openFullView": "開啟完整檢視", - "previewTitle": "首頁預覽", - "cancel": "取消", - "save": "儲存", - "title_label": "標題", - "widgetTitlePlaceholder": "小工具標題(選填)", - "url": "URL", - "imageUrl": "自訂圖片 URL", - "imageUrlHint": "留空以自動使用網站圖標", - "showImage": "顯示圖片", - "description": "描述", - "color": "顏色", "icon": "圖示", "expanded": "預設展開", - "timezone": "時區", - "invalidTimezone": "時區無效。請使用 IANA 名稱,例如 America/New_York。", - "showSeconds": "顯示秒數", - "format12h": "12 小時制", "format24h": "24 小時制", - "content": "內容", - "backgroundColor": "背景顏色", "host": "主機", "showMetrics": "顯示效能指標", - "links": "連結", - "addLink": "新增連結", - "linkLabel": "標籤", "linkUrl": "URL", "removeLink": "移除", - "categoryLinks": "連結", - "categoryInfo": "資訊", - "categorySystem": "系統", "widgetServiceLinkDesc": "可點擊的方塊,連結至服務 URL", "widgetFolderDesc": "用於將相關小工具分組的容器", "widgetClockDesc": "具有可設定時區的即時時鐘", "widgetNotesDesc": "一個 Markdown 筆記小工具", "widgetHostStatusDesc": "顯示 SSH 主機的即時 CPU、記憶體與磁碟使用狀況", "widgetBookmarkListDesc": "快速連結清單", - "copyLink": "複製連結", - "linkCopied": "連結已複製!", - "location": "位置", - "temperatureUnit": "溫度單位", - "showForecast": "顯示 3 天天氣預報", - "scrolling": "允許捲動", - "feedUrl": "摘要來源 URL", - "maxItems": "最大項目數", - "showDescription": "顯示描述", "widgetWeatherName": "天氣", "widgetWeatherDesc": "任何地點的即時天氣", "widgetIframeName": "iFrame 嵌入", "widgetIframeDesc": "在 iframe 中嵌入任何 URL 的內容", - "widgetRssName": "RSS 摘要", "widgetRssDesc": "顯示來自 RSS 或 Atom 摘要的項目", "dragToFolder": "拖曳小工具至此處,或按 + 新增", "showDisk": "顯示磁碟使用量", "addToFolder": "新增小工具至資料夾", - "noHostSelected": "未選取主機", "selectHost": "選擇主機...", - "displayedMetrics": "顯示的指標", - "metricCpu": "CPU", - "metricMemory": "記憶體", - "metricDisk": "磁碟", - "metricUptime": "運作時間", - "metricSystem": "系統", - "metricNetwork": "網路", - "metricProcesses": "程序", - "categoryMonitoring": "監控", "loading": "載入中...", "allClear": "一切正常", - "noPingUrls": "未設定 URL", - "pingLabel": "標籤", - "addPingUrl": "新增 URL", - "showLatency": "顯示延遲", - "refreshInterval": "重新整理間隔", - "seconds": "秒", - "filterActivityTypes": "篩選類型", - "filterTypesHint": "留空以顯示全部", - "showTimestamp": "顯示時間戳記", - "uptimeUnavailable": "運作時間無法取得", - "uptimeLabel": "運作時間", - "overviewVersion": "版本", "overviewUpdate": "最新版本", - "overviewUpdateLabel": "更新", - "overviewUpdateAvailable": "有可用更新", - "overviewDatabase": "資料庫", - "overviewUptime": "運作時間", - "noHosts": "未設定任何主機", - "hostGridHosts": "主機", - "hostGridAllHint": "留空以顯示所有主機", - "columns": "欄", - "showIp": "顯示 IP 位址", "connectionType": "連線類型", - "layout": "版面配置", - "showStatus": "顯示狀態", "showHostName": "顯示主機名稱", "noDockerActivity": "無 Docker 活動", - "noActivity": "無活動", "showAcknowledged": "顯示已確認", "widgetMetricsChartName": "指標圖表", "widgetMetricsChartDesc": "主機的歷史 CPU、記憶體、磁碟或網路圖表", "widgetHostGridName": "主機方格", "widgetHostGridDesc": "SSH 主機狀態的方格檢視", - "widgetPingStatusName": "Ping 狀態", "widgetPingStatusDesc": "一個或多個 URL 的 HTTP ping 狀態", - "widgetRecentActivityName": "近期活動", "widgetRecentActivityDesc": "可捲動的近期 Termix 活動動態", "widgetTermixUptimeName": "Termix 運作時間", "widgetTermixUptimeDesc": "Termix 伺服器的即時運作時間計數器", @@ -347,67 +268,8 @@ "widgetSearchLinksDesc": "具有內嵌輸入的快速搜尋捷徑按鈕", "widgetLinkTreeName": "連結樹", "widgetLinkTreeDesc": "附有標題的連結群組", - "calMon": "週一", - "calTue": "週二", - "calWed": "週三", - "calThu": "週四", - "calFri": "週五", - "calSat": "週六", - "calSun": "週日", - "startOnMonday": "從週一開始", - "countdownNoDate": "未設定目標日期", - "countdownPast": "目標日期已過", - "countdownDays": "天", - "countdownHours": "小時", - "countdownMinutes": "分鐘", - "countdownSeconds": "秒", - "countdownLabel": "標籤", - "countdownLabelPlaceholder": "例如:發佈日", - "countdownShowDays": "顯示天數", - "countdownShowHours": "顯示小時", - "targetDate": "目標日期", - "searchEngine": "搜尋引擎", - "customSearchUrl": "自訂搜尋 URL", - "searchPlaceholder": "搜尋...", - "searchGo": "搜尋", - "searchPlaceholderLabel": "佔位文字", - "searchPlaceholderHint": "顯示在搜尋輸入框內的文字", - "openInNewTab": "在新分頁中開啟", - "searchQueryPlaceholder": "輸入查詢...", - "noSearchShortcuts": "尚未設定捷徑", - "addSearchShortcut": "新增捷徑", - "fontSize": "字型大小", - "textAlign": "文字對齊", - "fontWeight": "字型粗細", - "clearColor": "清除顏色", - "imageFit": "圖片填滿方式", - "imageLinkUrl": "連結 URL", - "noImage": "未設定圖片 URL", - "altText": "替代文字", - "altTextPlaceholder": "描述圖片", - "renderMarkdown": "轉譯 Markdown", - "displayMode": "顯示模式", - "displayField": "顯示欄位", - "jsonPath": "JSON 路徑", - "customApiLabel": "標籤", - "customApiLabelPlaceholder": "例如:溫度", - "customApiUnit": "單位", - "customApiNoUrl": "未設定 API URL", - "customApiError": "擷取失敗", - "customApiNotArray": "回應非陣列", - "addService": "新增服務", - "showLabels": "顯示標籤", - "iconSize": "圖示大小", - "noDashboardLinks": "未設定儀表板連結", - "noLimit": "無限制", - "sectionHeading": "區段標題", - "addSection": "新增區段", - "compactMode": "精簡模式", "showDetailed": "顯示詳細資訊", - "selectHosts": "選取主機", "allHosts": "所有主機", - "listLayout": "清單", - "gridLayout": "格線", "terminal": "終端機", "files": "檔案", "docker": "Docker", @@ -422,12 +284,8 @@ "accentColor": "輔色", "widgetSshTerminalName": "SSH 終端機", "widgetSshTerminalDesc": "連線至已設定主機的內嵌 SSH 終端機", - "sshTerminalNoHost": "未設定主機", - "sshTerminalConnect": "連線", - "sshTerminalAutoConnect": "載入時自動連線", "widgetQuickConnectName": "快速連線", "widgetQuickConnectDesc": "用於跨主機任何連線類型的一鍵啟動按鈕", - "connectionTypes": "連線類型", "connType_terminal": "終端機", "connType_files": "檔案管理員", "connType_docker": "Docker", @@ -685,7 +543,6 @@ "renameTab": "重新命名分頁", "openFileManager": "開啟檔案管理員", "dashboard": "儀表板", - "homepage": "首頁", "quickConnect": "快速連線", "sshTools": "SSH 工具", "history": "歷史記錄", @@ -1895,9 +1752,7 @@ "serverStatsCard": "伺服器統計", "panelMain": "主要", "panelSide": "側邊", - "justNow": "剛剛", - "serviceLinks": "服務連結", - "homepagePreview": "首頁預覽" + "justNow": "剛剛" }, "donation": { "title": "喜歡 Termix 嗎?", @@ -1926,15 +1781,8 @@ "editModeInstructions": "拖曳卡片以重新排序 · 拖曳欄分隔線以調整欄寬 · 拖曳卡片底部邊緣以調整高度 · 拖曳至垃圾桶以移除", "empty": "空", "clear": "清除", - "serviceLinksTitle": "服務連結", - "serviceLinksEmpty": "尚無服務連結", "serviceLinksAddLabel": "標籤", "serviceLinksAddUrl": "URL", - "serviceLinksAdd": "新增", - "serviceLinksLabelPlaceholder": "我的服務", - "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", - "serviceLinksInvalidUrl": "輸入有效的網址", - "serviceLinksAddFailed": "新增服務連結失敗", "viewServerDetails": "檢視伺服器詳細資訊" }, "admin": { diff --git a/src/ui/main-axios.ts b/src/ui/main-axios.ts index 64a9fa0e2..d6dd2594e 100644 --- a/src/ui/main-axios.ts +++ b/src/ui/main-axios.ts @@ -764,9 +764,6 @@ function initializeApiInstances() { // Authentication API (port 30001) authApi = createApiInstance(getApiUrl("", 30001), "AUTH"); - // Dashboard API (port 30006) - dashboardApi = createApiInstance(getApiUrl("", 30006), "DASHBOARD"); - // RBAC API (port 30001) rbacApi = createApiInstance(getApiUrl("", 30001), "RBAC"); @@ -775,9 +772,6 @@ function initializeApiInstances() { getApiUrl("/tmux_monitor", 30010), "TMUX_MONITOR", ); - - // Homepage API (port 30012) - homepageApi = createApiInstance(getApiUrl("/homepage", 30012), "HOMEPAGE"); } // Host Management API (port 30001) - supports SSH, RDP, VNC, Telnet @@ -791,18 +785,12 @@ export let fileManagerApi: AxiosInstance; // Authentication API (port 30001) export let authApi: AxiosInstance; -// Dashboard API (port 30006) -export let dashboardApi: AxiosInstance; - // RBAC API (port 30001) export let rbacApi: AxiosInstance; // Tmux Monitor API (port 30010) --- tmux-monitor --- export let tmuxMonitorApi: AxiosInstance; -// Homepage API (port 30012) -export let homepageApi: AxiosInstance; - // Pre-initialize with default values to avoid undefined errors during early mounting initializeApiInstances(); @@ -1862,20 +1850,12 @@ export { export { getSnippets, executeSnippet } from "@/api/snippets-api"; // ============================================================================ -export type { - UptimeInfo, - RecentActivityItem, - ServiceLink, -} from "@/api/dashboard-api"; +export type { UptimeInfo, RecentActivityItem } from "@/api/dashboard-api"; export { getUptime, getRecentActivity, logActivity, resetRecentActivity, - getServiceLinks, - createServiceLink, - deleteServiceLink, - updateServiceLink, } from "@/api/dashboard-api"; // ============================================================================ diff --git a/src/ui/plugin-host/app.ts b/src/ui/plugin-host/app.ts index 02a1e9db9..f9f1a19e6 100644 --- a/src/ui/plugin-host/app.ts +++ b/src/ui/plugin-host/app.ts @@ -23,7 +23,7 @@ import { registerDashboardCard, type DashboardCardRenderProps, } from "@/dashboard/dashboard-cards-registry"; -import { registerWidget } from "@/features/homepage/widgets/WidgetRegistry"; +import { registerHomepageWidgetType } from "./homepage-widget-registry"; import { registerSettingsComponent } from "@/settings/settings-components"; import { declareActionSlot, @@ -33,7 +33,7 @@ import { } from "@/shell/action-registry"; import { pluginApiFor, pluginFetch, pluginWsUrl } from "@/lib/plugin-transport"; import { registerPluginComponent } from "./component-registry"; -import type { WidgetTypeDefinition } from "@/types/homepage-types"; +import type { RegisteredHomepageWidget } from "./homepage-widget-registry"; import type { LucideIcon } from "lucide-react"; import { registerLoginMethod, @@ -265,6 +265,7 @@ export function createPluginApp( pluginId, titleKey: key(card.titleKey), defaultHeight: card.defaultHeight, + defaultPanel: card.defaultPanel, component: scoped( card.component as unknown as ComponentType, ), @@ -274,13 +275,14 @@ export function createPluginApp( registerHomepageWidget(widget) { return track( - registerWidget({ + registerHomepageWidgetType({ ...widget, + pluginId, component: scoped(widget.component), editFormComponent: widget.editFormComponent ? scoped(widget.editFormComponent) : undefined, - } as unknown as WidgetTypeDefinition), + } as unknown as RegisteredHomepageWidget), ); }, diff --git a/src/ui/plugin-host/bridge.ts b/src/ui/plugin-host/bridge.ts index 89ec7ce49..a1ca0e091 100644 --- a/src/ui/plugin-host/bridge.ts +++ b/src/ui/plugin-host/bridge.ts @@ -1,9 +1,17 @@ import { useCallback, useEffect, useMemo, useState } from "react"; import { enabledHostProtocols } from "@/sidebar/host-protocols"; +import { useHostActions } from "@/sidebar/host-contributions"; +import { tabTypeForActivity, useTabTypes } from "@/shell/tab-registry"; +import { + getHomepageWidgetType, + useHomepageWidgetTypes, +} from "./homepage-widget-registry"; import { useTranslation as useI18nTranslation } from "react-i18next"; import { toast } from "sonner"; import { __setPluginHost, + type HomepageWidgetContribution, + type HostActionContribution, type PluginHostBridge, type PluginHostRecord, type SettingsScope, @@ -294,6 +302,29 @@ export const pluginHostBridge: PluginHostBridge = { ...(entry.reason ? { reason: entry.reason } : {}), }; }, + + useHostActions: () => useHostActions() as unknown as HostActionContribution[], + + useActivityTypes: () => { + const defs = useTabTypes(); + const types = new Set(["file_manager"]); + for (const def of defs) { + for (const type of def.activityTypes ?? []) types.add(type); + } + return [...types]; + }, + + activityTarget: (type) => { + const def = tabTypeForActivity(type); + if (!def) return undefined; + return { icon: def.icon, tab: def.id, titleKey: def.titleKey }; + }, + + useHomepageWidgetTypes: () => + useHomepageWidgetTypes() as unknown as HomepageWidgetContribution[], + homepageWidgetType: (id) => + getHomepageWidgetType(id) as unknown as + HomepageWidgetContribution | undefined, }; /** Installs the bridge. Idempotent. */ diff --git a/src/ui/plugin-host/homepage-widget-registry.ts b/src/ui/plugin-host/homepage-widget-registry.ts new file mode 100644 index 000000000..5b174163a --- /dev/null +++ b/src/ui/plugin-host/homepage-widget-registry.ts @@ -0,0 +1,33 @@ +import type { ComponentType } from "react"; +import { createRegistry } from "@/lib/registry"; + +/** + * A homepage widget type any plugin contributes through + * app.registerHomepageWidget. Core owns this registry so the homepage + * plugin's canvas can read it without every widget-contributing plugin + * depending on homepage being enabled. + */ +export interface RegisteredHomepageWidget { + id: string; + pluginId?: string; + name: string; + description: string; + category: "links" | "info" | "system" | "monitoring"; + icon: React.ReactNode; + defaultConfig: Record; + defaultSize: { w: number; h: number }; + minSize: { w: number; h: number }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + component: ComponentType; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + editFormComponent?: ComponentType; +} + +const registry = createRegistry(); + +export const registerHomepageWidgetType = registry.register; +export const unregisterHomepageWidgetType = registry.unregister; +export const getHomepageWidgetType = registry.get; +export const listHomepageWidgetTypes = registry.list; +export const useHomepageWidgetTypes = registry.useList; +export const resetHomepageWidgetTypes = registry.reset; diff --git a/src/ui/plugin-host/sdk-ui.ts b/src/ui/plugin-host/sdk-ui.ts index 5eb178143..de04415fd 100644 --- a/src/ui/plugin-host/sdk-ui.ts +++ b/src/ui/plugin-host/sdk-ui.ts @@ -74,6 +74,7 @@ export { ActionSlot, ComponentSlot } from "@/shell/ActionSlot"; // Components other plugins offer by id (app.registerComponent), rendered with // a fallback while their plugin is off. export { PluginComponent } from "@/plugin-host/component-registry"; +export { PluginViewPlaceholder } from "@/plugin-host/PluginViewPlaceholder"; // More primitives and hooks. export { cn } from "@/lib/utils"; @@ -90,8 +91,8 @@ export { useUiPreferencesContext, } from "@/contexts/UiPreferencesContext"; // Homepage widget pieces, for plugins that register a widget. -export { WidgetTitle } from "@/features/homepage/widgets/WidgetTitle"; -export { runVisibleInterval } from "@/features/homepage/use-visible-interval"; +export { WidgetTitle } from "@/lib/widget-title"; +export { runVisibleInterval } from "@/lib/visible-interval"; export { useIsMobile } from "@/hooks/use-mobile"; export { PassphraseDialog } from "@/ssh/dialogs/PassphraseDialog"; export { OPKSSHDialog } from "@/ssh/dialogs/OPKSSHDialog"; @@ -138,7 +139,18 @@ export { useConnectionDefaults } from "@/contexts/ConnectionDefaultsContext"; // password for sudo autofill, the open tab record, the user's keybindings and // host terminal options. export { getCookie } from "@/main-axios"; -export { logActivity } from "@/api/dashboard-api"; +export { + logActivity, + getRecentActivity, + getUptime, + type RecentActivityItem, + type UptimeInfo, +} from "@/api/dashboard-api"; +export { + getVersionInfo, + getDatabaseHealth, + type VersionInfo, +} from "@/api/system-status-api"; export { getHostPassword } from "@/api/credentials-api"; export { patchOpenTab, diff --git a/src/ui/shell/shell-layout.ts b/src/ui/shell/shell-layout.ts index 8e2f230c1..ef1ce604c 100644 --- a/src/ui/shell/shell-layout.ts +++ b/src/ui/shell/shell-layout.ts @@ -18,20 +18,10 @@ import { getTabType } from "./tab-registry"; * purpose: the shell always keeps one alive as the fallback tab, so it is * not a meaningful part of an arrangement. */ -const CORE_CAPTURABLE = new Set([ - "homepage", - "termix-id", - "macros", - "ssh-tools", -]); +const CORE_CAPTURABLE = new Set(["termix-id", "macros", "ssh-tools"]); /** Core types reopened as singletons, with an optional preselected host. */ -const CORE_SINGLETON = new Set([ - "homepage", - "termix-id", - "macros", - "ssh-tools", -]); +const CORE_SINGLETON = new Set(["termix-id", "macros", "ssh-tools"]); /** Core tab types that are never part of a saved arrangement. */ const CORE_UNSAVED = new Set([ diff --git a/src/ui/shell/tabUtils.tsx b/src/ui/shell/tabUtils.tsx index c21bd84cd..56e7d790a 100644 --- a/src/ui/shell/tabUtils.tsx +++ b/src/ui/shell/tabUtils.tsx @@ -2,7 +2,6 @@ import { Braces, LayoutDashboard, - LayoutGrid, LayoutPanelLeft, Server, Settings, @@ -31,11 +30,6 @@ const DashboardTab = lazy(() => default: m.DashboardTab, })), ); -const HomepageCanvas = lazy(() => - import("@/features/homepage/HomepageCanvas").then((m) => ({ - default: m.HomepageCanvas, - })), -); // Rail panels promoted to full tabs. const TermixIdPanel = lazy(() => import("@/sidebar/TermixIdPanel").then((m) => ({ default: m.TermixIdPanel })), @@ -114,8 +108,6 @@ export function tabIcon(type: TabType) { return ; case "admin-settings": return ; - case "homepage": - return ; case "termix-id": return ; case "macros": @@ -211,9 +203,6 @@ export function renderTabContent(tab: Tab, context: TabRenderContext) { />, ); - case "homepage": - return withTabSuspense(); - case "termix-id": return withTabSuspense( diff --git a/src/ui/sidebar/AppRail.tsx b/src/ui/sidebar/AppRail.tsx index 472b6696a..4b6247dac 100644 --- a/src/ui/sidebar/AppRail.tsx +++ b/src/ui/sidebar/AppRail.tsx @@ -28,11 +28,6 @@ export type CoreRailView = export type RailView = CoreRailView | (string & {}); -export type HideableRailView = - | Exclude - | "homepage" - | (string & {}); - type RailItem = | { kind?: undefined; diff --git a/src/ui/sidebar/InterfacePresetSettings.tsx b/src/ui/sidebar/InterfacePresetSettings.tsx index 894c9aabe..5f2451321 100644 --- a/src/ui/sidebar/InterfacePresetSettings.tsx +++ b/src/ui/sidebar/InterfacePresetSettings.tsx @@ -20,6 +20,7 @@ import { import { useUiPreferencesContext } from "@/contexts/UiPreferencesContext"; import { applyPresetSideEffects } from "@/lib/apply-ui-preset"; import { + HOMEPAGE_AREA_KEY, UI_AREA_KEYS, type UiAreaKey, type UiPreset, @@ -38,7 +39,7 @@ const PRESET_ICONS = { } as const; /** Areas that have nothing worth listing as a per-area override. */ -const HIDDEN_OVERRIDE_AREAS = new Set(["homepage"]); +const HIDDEN_OVERRIDE_AREAS = new Set([HOMEPAGE_AREA_KEY]); export function InterfacePresetSettings({ onRunSetupAgain, diff --git a/src/ui/tests/lib/apply-ui-preset.test.ts b/src/ui/tests/lib/apply-ui-preset.test.ts new file mode 100644 index 000000000..414ae9771 --- /dev/null +++ b/src/ui/tests/lib/apply-ui-preset.test.ts @@ -0,0 +1,71 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; + +const registered = vi.hoisted(() => ({ + cards: new Map< + string, + { defaultHeight?: number; defaultPanel?: "main" | "side" } + >(), +})); + +vi.mock("@/dashboard/dashboard-cards-registry", () => ({ + getRegisteredDashboardCard: (id: string) => registered.cards.get(id), +})); + +const { buildDashboardSlots } = await import("../../lib/apply-ui-preset.js"); + +afterEach(() => { + registered.cards.clear(); +}); + +describe("buildDashboardSlots", () => { + it("places core cards in the main panel by default", () => { + const slots = buildDashboardSlots(["stats_bar", "quick_actions"]); + expect(slots.map((s) => s.panel)).toEqual(["main", "main"]); + expect(slots.map((s) => s.height)).toEqual([96, 160]); + }); + + it("keeps recent_activity in the side panel", () => { + const slots = buildDashboardSlots(["stats_bar", "recent_activity"]); + expect(slots.find((s) => s.id === "recent_activity")?.panel).toBe("side"); + }); + + it("reads a plugin card's own height and panel from the registry", () => { + registered.cards.set("service_links", { + defaultHeight: 200, + defaultPanel: "side", + }); + const slots = buildDashboardSlots(["stats_bar", "service_links"]); + const link = slots.find((s) => s.id === "service_links"); + expect(link?.panel).toBe("side"); + expect(link?.height).toBe(200); + }); + + it("defaults an unregistered plugin card to the main panel with no fixed height", () => { + const slots = buildDashboardSlots(["some_plugin_card"]); + expect(slots).toEqual([ + { + key: "some_plugin_card_0", + id: "some_plugin_card", + panel: "main", + order: 0, + height: null, + }, + ]); + }); + + it("orders main and side cards independently", () => { + registered.cards.set("service_links", { defaultPanel: "side" }); + const slots = buildDashboardSlots([ + "stats_bar", + "service_links", + "quick_actions", + "recent_activity", + ]); + expect(slots.map((s) => [s.id, s.panel, s.order])).toEqual([ + ["stats_bar", "main", 0], + ["service_links", "side", 0], + ["quick_actions", "main", 1], + ["recent_activity", "side", 1], + ]); + }); +}); diff --git a/src/ui/tests/plugin-host/registries.test.tsx b/src/ui/tests/plugin-host/registries.test.tsx index b9bd23ffd..fecd5849f 100644 --- a/src/ui/tests/plugin-host/registries.test.tsx +++ b/src/ui/tests/plugin-host/registries.test.tsx @@ -3,6 +3,10 @@ import { useState } from "react"; import { fireEvent, render, screen, waitFor } from "@testing-library/react"; import { Puzzle } from "lucide-react"; import { + homepageWidgetType, + useActivityTypes, + useHomepageWidgetTypes, + useHostActions, usePermission, useTranslation, type TermixApp, @@ -35,6 +39,7 @@ import { resetRegisteredRailItems } from "@/sidebar/rail-items"; import { resetTabTypes } from "@/shell/tab-registry"; import { resetPanels } from "@/shell/panel-registry"; import { resetDashboardCards } from "@/dashboard/dashboard-cards-registry"; +import { resetHomepageWidgetTypes } from "@/plugin-host/homepage-widget-registry"; import { resetSettingsComponents } from "@/settings/settings-components"; import { resetActionRegistry } from "@/shell/action-registry"; import { resetPluginStore } from "@/plugin-host/plugin-store"; @@ -82,9 +87,11 @@ function activate(app: TermixApp) { titleKey: "title", }); app.registerPanel("fixture-panel", () => ); - app.registerTab("fixture-tab", ({ host }) => ( - tab for {host?.name ?? "nobody"} - )); + app.registerTab( + "fixture-tab", + ({ host }) => tab for {host?.name ?? "nobody"}, + { activityTypes: ["fixture_activity"] }, + ); app.registerHostEditorSection({ id: "fixture-section", group: "ssh", @@ -125,6 +132,17 @@ function activate(app: TermixApp) { ), }); app.registerSettingsComponent("probe", PermissionProbe); + app.registerHomepageWidget({ + id: "fixture-widget", + name: "Fixture Widget", + description: "A fixture widget", + category: "info", + icon: , + defaultConfig: {}, + defaultSize: { w: 4, h: 4 }, + minSize: { w: 2, h: 2 }, + component: () => fixture widget, + }); } let rendered: RenderedPluginApp | null = null; @@ -150,6 +168,7 @@ afterEach(async () => { resetHostEditorSections(); resetPaletteEntries(); resetPluginStore(); + resetHomepageWidgetTypes(); }); const host = (overrides: Partial = {}) => @@ -259,6 +278,37 @@ describe("registries through the app object", () => { expect(resolveHostTabType(on)).toBe("fixture-tab"); }); + it("exposes registered host actions through the SDK's useHostActions", async () => { + await mount(); + function Probe() { + const actions = useHostActions(); + return {actions.map((a) => a.id).join(",")}; + } + render(); + expect(await screen.findByText("fixture-connect")).toBeTruthy(); + }); + + it("exposes a registered tab's activityTypes through useActivityTypes", async () => { + await mount(); + function Probe() { + const types = useActivityTypes(); + return {types.join(",")}; + } + render(); + expect(await screen.findByText(/fixture_activity/)).toBeTruthy(); + }); + + it("registers a homepage widget type readable through the SDK", async () => { + await mount(); + expect(homepageWidgetType("fixture-widget")?.name).toBe("Fixture Widget"); + function Probe() { + const types = useHomepageWidgetTypes(); + return {types.map((w) => w.id).join(",")}; + } + render(); + expect(await screen.findByText("fixture-widget")).toBeTruthy(); + }); + it("offers a per-host palette entry that runs against the shell", async () => { const app = await mount(); const target = host({ enableFixture: true } as Partial);