From c1cbe97b7beef8ecfbcca77db1a5004fedce713f Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 5 May 2025 12:05:38 +0900 Subject: [PATCH] wip --- locales/index.d.ts | 24 +++- locales/ja-JP.yml | 10 +- packages/frontend/src/os.ts | 28 +++-- packages/frontend/src/pages/welcome.setup.vue | 108 +++++++++++++++--- 4 files changed, 139 insertions(+), 31 deletions(-) diff --git a/locales/index.d.ts b/locales/index.d.ts index ea1ec42082..55f4804293 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -11634,7 +11634,7 @@ export interface Locale extends ILocale { */ "serverSetting": string; /** - * このウィザードで簡単に最適なサーバーの設定を行えます。 + * このウィザードで簡単に最適なサーバーの設定が行えます。 */ "youCanEasilyConfigureOptimalServerSettingsWithThisWizard": string; /** @@ -11698,7 +11698,7 @@ export interface Locale extends ILocale { "large": string; }; /** - * 大規模なサーバーでは、データベースのレプリケーションなど、高度なインフラストラクチャーの知識が必要になる場合があります。 + * 大規模なサーバーでは、ロードバランシングやデータベースのレプリケーションなど、高度なインフラストラクチャーの知識が必要になる場合があります。 */ "largeScaleServerAdvice": string; /** @@ -11713,14 +11713,30 @@ export interface Locale extends ILocale { * Fediverseと接続することは「連合」とも呼ばれます。 */ "doYouConnectToFediverse_description2": string; + /** + * 連合可能なサーバーの指定など、高度な設定も後ほど可能です。 + */ + "youCanConfigureMoreFederationSettingsLater": string; /** * 以下の設定が推奨されます */ "followingSettingsAreRecommended": string; /** - * この設定で始める + * この設定を適用 */ - "startWithTheseSettings": string; + "applyTheseSettings": string; + /** + * 設定をスキップ + */ + "skipSettings": string; + /** + * 設定が完了しました! + */ + "settingsCompleted": string; + /** + * お疲れ様でした。準備が整ったので、さっそくサーバーの使用を開始できます。 + */ + "settingsCompleted_description": string; /** * 寄付のお願い */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 69ca11c752..9c63bff6c8 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -3112,7 +3112,7 @@ _serverSetupWizard: firstCreateAccount: "まずは、管理者アカウントを作成しましょう。" accountCreated: "管理者アカウントが作成されました!" serverSetting: "サーバーの設定" - youCanEasilyConfigureOptimalServerSettingsWithThisWizard: "このウィザードで簡単に最適なサーバーの設定を行えます。" + youCanEasilyConfigureOptimalServerSettingsWithThisWizard: "このウィザードで簡単に最適なサーバーの設定が行えます。" settingsYouMakeHereCanBeChangedLater: "ここでの設定は、あとからでも変更できます。" howWillYouUseMisskey: "Misskeyをどのように使いますか?" _use: @@ -3129,12 +3129,16 @@ _serverSetupWizard: small: "100人以下 (小規模)" medium: "100人以上1000人以下 (中規模)" large: "1000人以上 (大規模)" - largeScaleServerAdvice: "大規模なサーバーでは、データベースのレプリケーションなど、高度なインフラストラクチャーの知識が必要になる場合があります。" + largeScaleServerAdvice: "大規模なサーバーでは、ロードバランシングやデータベースのレプリケーションなど、高度なインフラストラクチャーの知識が必要になる場合があります。" doYouConnectToFediverse: "Fediverseと接続しますか?" doYouConnectToFediverse_description1: "分散型サーバーで構成されるネットワーク(Fediverse)に接続すると、他のサーバーと相互にコンテンツのやり取りが可能です。" doYouConnectToFediverse_description2: "Fediverseと接続することは「連合」とも呼ばれます。" + youCanConfigureMoreFederationSettingsLater: "連合可能なサーバーの指定など、高度な設定も後ほど可能です。" followingSettingsAreRecommended: "以下の設定が推奨されます" - startWithTheseSettings: "この設定で始める" + applyTheseSettings: "この設定を適用" + skipSettings: "設定をスキップ" + settingsCompleted: "設定が完了しました!" + settingsCompleted_description: "お疲れ様でした。準備が整ったので、さっそくサーバーの使用を開始できます。" donationRequest: "寄付のお願い" _donationRequest: text1: "Misskeyは有志によって開発されている無料のソフトウェアです。" diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts index 813b49635d..d891525782 100644 --- a/packages/frontend/src/os.ts +++ b/packages/frontend/src/os.ts @@ -547,18 +547,24 @@ export function success(): Promise { }); } -export function waiting(text?: string | null): Promise { - return new Promise(resolve => { - const showing = ref(true); - const { dispose } = popup(MkWaitingDialog, { - success: false, - showing: showing, - text, - }, { - done: () => resolve(), - closed: () => dispose(), - }); +export function waiting(text?: string | null): () => void { + window.document.body.setAttribute('inert', 'true'); + + const showing = ref(true); + const { dispose } = popup(MkWaitingDialog, { + success: false, + showing: showing, + text, + }, { + closed: () => { + window.document.body.removeAttribute('inert'); + dispose(); + }, }); + + return () => { + showing.value = false; + }; } export function form(title: string, f: F): Promise<{ canceled: true, result?: undefined } | { canceled?: false, result: GetFormResultType }> { diff --git a/packages/frontend/src/pages/welcome.setup.vue b/packages/frontend/src/pages/welcome.setup.vue index 016494dd83..c728b02a37 100644 --- a/packages/frontend/src/pages/welcome.setup.vue +++ b/packages/frontend/src/pages/welcome.setup.vue @@ -110,15 +110,15 @@ SPDX-License-Identifier: AGPL-3.0-only
@@ -134,9 +134,9 @@ SPDX-License-Identifier: AGPL-3.0-only
- - - + + + {{ i18n.ts.advice }}: {{ i18n.ts._serverSetupWizard.largeScaleServerAdvice }} @@ -148,12 +148,14 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description1 }}
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description2 }}
+
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description1 }}
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description2 }}
+ + {{ i18n.ts._serverSetupWizard.youCanConfigureMoreFederationSettingsLater }}
@@ -166,19 +168,32 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._serverSettings.openRegistration }}:
{{ !serverSettings.disableRegistration ? i18n.ts.yes : i18n.ts.no }}
+
+
{{ i18n.ts.emailRequiredForSignup }}:
+
{{ serverSettings.emailRequiredForSignup ? i18n.ts.yes : i18n.ts.no }}
+
{{ i18n.ts.federation }}:
{{ serverSettings.federation === 'none' ? i18n.ts.no : i18n.ts.all }}
- - {{ i18n.ts._serverSetupWizard.startWithTheseSettings }} + + {{ i18n.ts._serverSetupWizard.applyTheseSettings }}
-
- - {{ i18n.ts.next }} + + {{ i18n.ts._serverSetupWizard.skipSettings }} + +
+
+
+
{{ i18n.ts._serverSetupWizard.settingsCompleted }}
+
{{ i18n.ts._serverSetupWizard.settingsCompleted_description }}
+
+
+ + {{ i18n.ts.start }}
@@ -192,6 +207,7 @@ SPDX-License-Identifier: AGPL-3.0-only import { computed, ref } from 'vue'; import * as Misskey from 'misskey-js'; import { host, version } from '@@/js/config.js'; +import { ROLE_POLICIES } from '@@/js/const.js'; import MkButton from '@/components/MkButton.vue'; import MkInput from '@/components/MkInput.vue'; import * as os from '@/os.js'; @@ -209,7 +225,6 @@ const setupPassword = ref(''); const accountCreating = ref(false); const accountCreated = ref(false); const step = ref(0); -const qStep = ref(0); const q_name = ref(''); const q_use = ref('one'); const q_scale = ref('small'); @@ -218,16 +233,50 @@ const q_federation = ref('yes'); const serverSettings = computed(() => { return { disableRegistration: q_use.value !== 'open', + emailRequiredForSignup: q_use.value === 'open', federation: q_federation.value === 'yes' ? 'all' : 'none', }; }); +const defaultPolicies = computed(() => { + let driveCapacityMb; + if (q_use.value === 'one') { + driveCapacityMb = 8192; + } else if (q_use.value === 'group') { + driveCapacityMb = 1000; + } else if (q_use.value === 'open') { + driveCapacityMb = 100; + } + + let rateLimitFactor; + if (q_use.value === 'one') { + rateLimitFactor = 0.3; + } else if (q_use.value === 'group') { + rateLimitFactor = 0.7; + } else if (q_use.value === 'open') { + if (q_scale.value === 'small') { + rateLimitFactor = 1; + } else if (q_scale.value === 'medium') { + rateLimitFactor = 1.25; + } else if (q_scale.value === 'large') { + rateLimitFactor = 1.5; + } + } + + return { + rateLimitFactor, + driveCapacityMb, + } satisfies Partial>; +}); + let token; function createAccount() { if (accountCreating.value) return; accountCreating.value = true; + const _close = os.waiting(); + misskeyApi('admin/accounts/create', { username: username.value, password: password.value, @@ -254,8 +303,41 @@ function createAccount() { title, text, }); + }).finally(() => { + _close(); }); } + +function applySettings() { + const _close = os.waiting(); + Promise.all([ + misskeyApi('admin/update-meta', { + ...serverSettings.value, + name: q_name.value === '' ? undefined : q_name.value, + }, token), + misskeyApi('admin/roles/update-default-policies', { + policies: defaultPolicies.value, + }, token), + ]).then(() => { + step.value++; + }).catch((err) => { + os.alert({ + type: 'error', + title: err.code, + text: err.message, + }); + }).finally(() => { + _close(); + }); +} + +function skipSettings() { + step.value++; +} + +function finish() { + login(token); +}