@arcblock/did-connect-service 4.1.37 → 4.1.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_generated/asset-bytes.js +1 -1
- package/dist/_generated/asset-manifest.js +5 -5
- package/dist/_generated/header-bundle-string.d.ts +1 -1
- package/dist/_generated/header-bundle-string.d.ts.map +1 -1
- package/dist/_generated/header-bundle-string.js +1 -1
- package/dist/_generated/header-bundle-string.js.map +1 -1
- package/dist/_generated/login-bundle-string.d.ts +1 -1
- package/dist/_generated/login-bundle-string.d.ts.map +1 -1
- package/dist/_generated/login-bundle-string.js +1 -1
- package/dist/_generated/login-bundle-string.js.map +1 -1
- package/dist/assets/{admin-extra.979f5e56.js → admin-extra.c7a0720f.js} +3 -3
- package/dist/assets/{admin.f5f577f9.css → admin.ab0009f2.css} +22 -2
- package/dist/assets/{header.94d9e46b.js → header.8703ab26.js} +5 -5
- package/dist/assets/login.60fd0777.js +731 -0
- package/dist/assets/{login.7b12c6dc.css → login.a9c8b434.css} +11 -0
- package/dist/handler-errors.d.ts +868 -3
- package/dist/handler-errors.d.ts.map +1 -1
- package/dist/handler-errors.js +1067 -26
- package/dist/handler-errors.js.map +1 -1
- package/dist/handlers/access-key-connect-handler.d.ts.map +1 -1
- package/dist/handlers/access-key-connect-handler.js +20 -11
- package/dist/handlers/access-key-connect-handler.js.map +1 -1
- package/dist/handlers/access-key-handler.d.ts.map +1 -1
- package/dist/handlers/access-key-handler.js +18 -7
- package/dist/handlers/access-key-handler.js.map +1 -1
- package/dist/handlers/account-merge-handler.d.ts +2 -0
- package/dist/handlers/account-merge-handler.d.ts.map +1 -1
- package/dist/handlers/account-merge-handler.js +34 -29
- package/dist/handlers/account-merge-handler.js.map +1 -1
- package/dist/handlers/admin-instance-handler.d.ts.map +1 -1
- package/dist/handlers/admin-instance-handler.js +21 -17
- package/dist/handlers/admin-instance-handler.js.map +1 -1
- package/dist/handlers/auth-handler.d.ts.map +1 -1
- package/dist/handlers/auth-handler.js +14 -10
- package/dist/handlers/auth-handler.js.map +1 -1
- package/dist/handlers/blocklet-js-handler.d.ts.map +1 -1
- package/dist/handlers/blocklet-js-handler.js +2 -1
- package/dist/handlers/blocklet-js-handler.js.map +1 -1
- package/dist/handlers/branding-handler.d.ts +1 -0
- package/dist/handlers/branding-handler.d.ts.map +1 -1
- package/dist/handlers/branding-handler.js +15 -8
- package/dist/handlers/branding-handler.js.map +1 -1
- package/dist/handlers/did-connect-handler.d.ts +1 -0
- package/dist/handlers/did-connect-handler.d.ts.map +1 -1
- package/dist/handlers/did-connect-handler.js +40 -18
- package/dist/handlers/did-connect-handler.js.map +1 -1
- package/dist/handlers/email-login-handler.d.ts +81 -0
- package/dist/handlers/email-login-handler.d.ts.map +1 -1
- package/dist/handlers/email-login-handler.js +124 -23
- package/dist/handlers/email-login-handler.js.map +1 -1
- package/dist/handlers/federation-admin-handler.js +2 -2
- package/dist/handlers/federation-admin-handler.js.map +1 -1
- package/dist/handlers/oauth-handler.d.ts +1 -0
- package/dist/handlers/oauth-handler.d.ts.map +1 -1
- package/dist/handlers/oauth-handler.js +42 -53
- package/dist/handlers/oauth-handler.js.map +1 -1
- package/dist/handlers/passkey-handler.d.ts +1 -0
- package/dist/handlers/passkey-handler.d.ts.map +1 -1
- package/dist/handlers/passkey-handler.js +51 -37
- package/dist/handlers/passkey-handler.js.map +1 -1
- package/dist/handlers/team-handler.d.ts +2 -0
- package/dist/handlers/team-handler.d.ts.map +1 -1
- package/dist/handlers/team-handler.js +57 -35
- package/dist/handlers/team-handler.js.map +1 -1
- package/dist/locale.d.ts +40 -4
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +109 -34
- package/dist/locale.js.map +1 -1
- package/dist/pages/admin/i18n.d.ts.map +1 -1
- package/dist/pages/admin/i18n.js +1411 -6
- package/dist/pages/admin/i18n.js.map +1 -1
- package/dist/pages/admin/index.d.ts.map +1 -1
- package/dist/pages/admin/index.js +9 -5
- package/dist/pages/admin/index.js.map +1 -1
- package/dist/pages/admin/styles.d.ts +1 -1
- package/dist/pages/admin/styles.d.ts.map +1 -1
- package/dist/pages/admin/styles.js +22 -2
- package/dist/pages/admin/styles.js.map +1 -1
- package/dist/pages/admin/tab-branding.d.ts.map +1 -1
- package/dist/pages/admin/tab-branding.js +4 -6
- package/dist/pages/admin/tab-branding.js.map +1 -1
- package/dist/pages/admin-instances-page.d.ts +218 -0
- package/dist/pages/admin-instances-page.d.ts.map +1 -1
- package/dist/pages/admin-instances-page.js +133 -24
- package/dist/pages/admin-instances-page.js.map +1 -1
- package/dist/pages/error-page.d.ts +37 -0
- package/dist/pages/error-page.d.ts.map +1 -1
- package/dist/pages/error-page.js +33 -1
- package/dist/pages/error-page.js.map +1 -1
- package/dist/pages/gen-access-key-page.d.ts +126 -0
- package/dist/pages/gen-access-key-page.d.ts.map +1 -1
- package/dist/pages/gen-access-key-page.js +72 -20
- package/dist/pages/gen-access-key-page.js.map +1 -1
- package/dist/pages/homepage.d.ts +98 -0
- package/dist/pages/homepage.d.ts.map +1 -1
- package/dist/pages/homepage.js +66 -15
- package/dist/pages/homepage.js.map +1 -1
- package/dist/pages/invite-page.d.ts +90 -0
- package/dist/pages/invite-page.d.ts.map +1 -1
- package/dist/pages/invite-page.js +66 -17
- package/dist/pages/invite-page.js.map +1 -1
- package/dist/pages/login-page.d.ts +8 -0
- package/dist/pages/login-page.d.ts.map +1 -1
- package/dist/pages/login-page.js +12 -2
- package/dist/pages/login-page.js.map +1 -1
- package/dist/pages/oauth-callback-page.d.ts +52 -1
- package/dist/pages/oauth-callback-page.d.ts.map +1 -1
- package/dist/pages/oauth-callback-page.js +85 -8
- package/dist/pages/oauth-callback-page.js.map +1 -1
- package/package.json +3 -3
- package/dist/assets/login.566f858e.js +0 -720
|
@@ -4,5 +4,223 @@
|
|
|
4
4
|
* Pattern: embedded LoginPage + registration form + registered instance list.
|
|
5
5
|
* Follows gen-access-key-page.ts architecture.
|
|
6
6
|
*/
|
|
7
|
+
export declare const ADMIN_INSTANCES_I18N: {
|
|
8
|
+
readonly en: {
|
|
9
|
+
readonly title: "Instance Registration";
|
|
10
|
+
readonly backToAdmin: "Back to Admin";
|
|
11
|
+
readonly registerHeading: "Register Instance";
|
|
12
|
+
readonly appPskLabel: "App PSK (Permanent Secret Key) *";
|
|
13
|
+
readonly appPskPlaceholder: "Permanent secret key";
|
|
14
|
+
readonly appPskHint: "Required. Used to derive the Instance DID.";
|
|
15
|
+
readonly instanceDidLabel: "Instance DID (auto-derived)";
|
|
16
|
+
readonly derivedDidPlaceholder: "Enter App PSK to see derived DID";
|
|
17
|
+
readonly appSkLabel: "App SK (Current Secret Key) *";
|
|
18
|
+
readonly appSkPlaceholder: "Current session secret key";
|
|
19
|
+
readonly appEkLabel: "App EK (Encryption Key)";
|
|
20
|
+
readonly appEkPlaceholder: "Optional encryption key (BLOCKLET_APP_EK)";
|
|
21
|
+
readonly appEkHint: "Used by consumers to decrypt AES-encrypted data (e.g. Stripe keys). From BLOCKLET_APP_EK.";
|
|
22
|
+
readonly appNameLabel: "App Name";
|
|
23
|
+
readonly appNamePlaceholder: "Optional display name";
|
|
24
|
+
readonly ownerDidLabel: "Owner DID";
|
|
25
|
+
readonly ownerDidPlaceholder: "Optional owner DID";
|
|
26
|
+
readonly ownerDidHint: "If provided, creates owner membership for this DID.";
|
|
27
|
+
readonly hostsLabel: "Hosts";
|
|
28
|
+
readonly hostsPlaceholder: "Optional, comma-separated (e.g. app.example.com, alt.example.com)";
|
|
29
|
+
readonly hostsHint: "Routes these hosts to this instance. Rejected if a host is already bound elsewhere.";
|
|
30
|
+
readonly registerBtn: "Register Instance";
|
|
31
|
+
readonly registeredHeading: "Registered Instances";
|
|
32
|
+
readonly loading: "Loading...";
|
|
33
|
+
readonly editHeading: "Edit Instance: ";
|
|
34
|
+
readonly editAppNameLabel: "App Name";
|
|
35
|
+
readonly editAppNamePlaceholder: "Display name";
|
|
36
|
+
readonly editAppSkLabel: "App SK (Current Secret Key)";
|
|
37
|
+
readonly keepCurrentPlaceholder: "Leave empty to keep current";
|
|
38
|
+
readonly editAppPskLabel: "App PSK (Permanent Secret Key)";
|
|
39
|
+
readonly editAppEkLabel: "App EK (Encryption Key)";
|
|
40
|
+
readonly editAppEkPlaceholder: "BLOCKLET_APP_EK — leave empty to keep current";
|
|
41
|
+
readonly editAppEkHint: "Used to decrypt AES-encrypted data (e.g. Stripe keys)";
|
|
42
|
+
readonly editOwnerDidLabel: "Owner DID";
|
|
43
|
+
readonly editOwnerDidPlaceholder: "Leave empty to skip";
|
|
44
|
+
readonly cancel: "Cancel";
|
|
45
|
+
readonly save: "Save";
|
|
46
|
+
readonly adminRequired: "Admin access required.";
|
|
47
|
+
readonly noInstances: "No registered instances.";
|
|
48
|
+
readonly unnamed: "(unnamed)";
|
|
49
|
+
readonly registeredTime: "Registered: {time}";
|
|
50
|
+
readonly members: "Members";
|
|
51
|
+
readonly edit: "Edit";
|
|
52
|
+
readonly delete: "Delete";
|
|
53
|
+
readonly failedToLoad: "Failed to load instances.";
|
|
54
|
+
readonly registeredStatus: "Registered: {did}";
|
|
55
|
+
readonly registrationFailed: "Registration failed";
|
|
56
|
+
readonly networkError: "Network error";
|
|
57
|
+
readonly confirmDelete: "Delete instance {did}?";
|
|
58
|
+
readonly deleteFailed: "Delete failed";
|
|
59
|
+
readonly noChanges: "No changes to save.";
|
|
60
|
+
readonly updateFailed: "Update failed";
|
|
61
|
+
};
|
|
62
|
+
readonly zh: {
|
|
63
|
+
readonly title: "实例注册";
|
|
64
|
+
readonly backToAdmin: "返回管理后台";
|
|
65
|
+
readonly registerHeading: "注册实例";
|
|
66
|
+
readonly appPskLabel: "App PSK(永久密钥)*";
|
|
67
|
+
readonly appPskPlaceholder: "永久密钥";
|
|
68
|
+
readonly appPskHint: "必填。用于派生实例 DID。";
|
|
69
|
+
readonly instanceDidLabel: "实例 DID(自动派生)";
|
|
70
|
+
readonly derivedDidPlaceholder: "输入 App PSK 以查看派生的 DID";
|
|
71
|
+
readonly appSkLabel: "App SK(当前密钥)*";
|
|
72
|
+
readonly appSkPlaceholder: "当前会话密钥";
|
|
73
|
+
readonly appEkLabel: "App EK(加密密钥)";
|
|
74
|
+
readonly appEkPlaceholder: "可选的加密密钥(BLOCKLET_APP_EK)";
|
|
75
|
+
readonly appEkHint: "供接入方解密 AES 加密的数据(如 Stripe 密钥)。来自 BLOCKLET_APP_EK。";
|
|
76
|
+
readonly appNameLabel: "应用名称";
|
|
77
|
+
readonly appNamePlaceholder: "可选的显示名称";
|
|
78
|
+
readonly ownerDidLabel: "Owner DID";
|
|
79
|
+
readonly ownerDidPlaceholder: "可选的 owner DID";
|
|
80
|
+
readonly ownerDidHint: "若填写,将为该 DID 创建 owner 成员身份。";
|
|
81
|
+
readonly hostsLabel: "Hosts";
|
|
82
|
+
readonly hostsPlaceholder: "可选,逗号分隔(如 app.example.com, alt.example.com)";
|
|
83
|
+
readonly hostsHint: "将这些 host 路由到该实例。若某 host 已绑定到其他实例则会被拒绝。";
|
|
84
|
+
readonly registerBtn: "注册实例";
|
|
85
|
+
readonly registeredHeading: "已注册的实例";
|
|
86
|
+
readonly loading: "加载中…";
|
|
87
|
+
readonly editHeading: "编辑实例:";
|
|
88
|
+
readonly editAppNameLabel: "应用名称";
|
|
89
|
+
readonly editAppNamePlaceholder: "显示名称";
|
|
90
|
+
readonly editAppSkLabel: "App SK(当前密钥)";
|
|
91
|
+
readonly keepCurrentPlaceholder: "留空则保持当前值";
|
|
92
|
+
readonly editAppPskLabel: "App PSK(永久密钥)";
|
|
93
|
+
readonly editAppEkLabel: "App EK(加密密钥)";
|
|
94
|
+
readonly editAppEkPlaceholder: "BLOCKLET_APP_EK —— 留空则保持当前值";
|
|
95
|
+
readonly editAppEkHint: "用于解密 AES 加密的数据(如 Stripe 密钥)";
|
|
96
|
+
readonly editOwnerDidLabel: "Owner DID";
|
|
97
|
+
readonly editOwnerDidPlaceholder: "留空则跳过";
|
|
98
|
+
readonly cancel: "取消";
|
|
99
|
+
readonly save: "保存";
|
|
100
|
+
readonly adminRequired: "需要管理员权限。";
|
|
101
|
+
readonly noInstances: "暂无已注册的实例。";
|
|
102
|
+
readonly unnamed: "(未命名)";
|
|
103
|
+
readonly registeredTime: "注册时间:{time}";
|
|
104
|
+
readonly members: "成员";
|
|
105
|
+
readonly edit: "编辑";
|
|
106
|
+
readonly delete: "删除";
|
|
107
|
+
readonly failedToLoad: "加载实例失败。";
|
|
108
|
+
readonly registeredStatus: "已注册:{did}";
|
|
109
|
+
readonly registrationFailed: "注册失败";
|
|
110
|
+
readonly networkError: "网络错误";
|
|
111
|
+
readonly confirmDelete: "删除实例 {did}?";
|
|
112
|
+
readonly deleteFailed: "删除失败";
|
|
113
|
+
readonly noChanges: "没有需要保存的更改。";
|
|
114
|
+
readonly updateFailed: "更新失败";
|
|
115
|
+
};
|
|
116
|
+
readonly "zh-TW": {
|
|
117
|
+
readonly title: "實例註冊";
|
|
118
|
+
readonly backToAdmin: "返回管理主控台";
|
|
119
|
+
readonly registerHeading: "註冊實例";
|
|
120
|
+
readonly appPskLabel: "App PSK(永久金鑰)*";
|
|
121
|
+
readonly appPskPlaceholder: "永久金鑰";
|
|
122
|
+
readonly appPskHint: "必填。用於衍生實例 DID。";
|
|
123
|
+
readonly instanceDidLabel: "實例 DID(自動衍生)";
|
|
124
|
+
readonly derivedDidPlaceholder: "輸入 App PSK 以查看衍生的 DID";
|
|
125
|
+
readonly appSkLabel: "App SK(目前金鑰)*";
|
|
126
|
+
readonly appSkPlaceholder: "目前工作階段金鑰";
|
|
127
|
+
readonly appEkLabel: "App EK(加密金鑰)";
|
|
128
|
+
readonly appEkPlaceholder: "選填的加密金鑰(BLOCKLET_APP_EK)";
|
|
129
|
+
readonly appEkHint: "供接入方解密 AES 加密的資料(如 Stripe 金鑰)。來自 BLOCKLET_APP_EK。";
|
|
130
|
+
readonly appNameLabel: "應用程式名稱";
|
|
131
|
+
readonly appNamePlaceholder: "選填的顯示名稱";
|
|
132
|
+
readonly ownerDidLabel: "Owner DID";
|
|
133
|
+
readonly ownerDidPlaceholder: "選填的 owner DID";
|
|
134
|
+
readonly ownerDidHint: "若填寫,將為該 DID 建立擁有者成員身分。";
|
|
135
|
+
readonly hostsLabel: "Hosts";
|
|
136
|
+
readonly hostsPlaceholder: "選填,以逗號分隔(如 app.example.com, alt.example.com)";
|
|
137
|
+
readonly hostsHint: "將這些 host 路由到此實例。若某個 host 已繫結到其他實例則會被拒絕。";
|
|
138
|
+
readonly registerBtn: "註冊實例";
|
|
139
|
+
readonly registeredHeading: "已註冊的實例";
|
|
140
|
+
readonly loading: "載入中…";
|
|
141
|
+
readonly editHeading: "編輯實例:";
|
|
142
|
+
readonly editAppNameLabel: "應用程式名稱";
|
|
143
|
+
readonly editAppNamePlaceholder: "顯示名稱";
|
|
144
|
+
readonly editAppSkLabel: "App SK(目前金鑰)";
|
|
145
|
+
readonly keepCurrentPlaceholder: "留空則保持目前的值";
|
|
146
|
+
readonly editAppPskLabel: "App PSK(永久金鑰)";
|
|
147
|
+
readonly editAppEkLabel: "App EK(加密金鑰)";
|
|
148
|
+
readonly editAppEkPlaceholder: "BLOCKLET_APP_EK —— 留空則保持目前的值";
|
|
149
|
+
readonly editAppEkHint: "用於解密 AES 加密的資料(如 Stripe 金鑰)";
|
|
150
|
+
readonly editOwnerDidLabel: "Owner DID";
|
|
151
|
+
readonly editOwnerDidPlaceholder: "留空則略過";
|
|
152
|
+
readonly cancel: "取消";
|
|
153
|
+
readonly save: "儲存";
|
|
154
|
+
readonly adminRequired: "需要管理員權限。";
|
|
155
|
+
readonly noInstances: "尚無已註冊的實例。";
|
|
156
|
+
readonly unnamed: "(未命名)";
|
|
157
|
+
readonly registeredTime: "註冊時間:{time}";
|
|
158
|
+
readonly members: "成員";
|
|
159
|
+
readonly edit: "編輯";
|
|
160
|
+
readonly delete: "刪除";
|
|
161
|
+
readonly failedToLoad: "載入實例失敗。";
|
|
162
|
+
readonly registeredStatus: "已註冊:{did}";
|
|
163
|
+
readonly registrationFailed: "註冊失敗";
|
|
164
|
+
readonly networkError: "網路錯誤";
|
|
165
|
+
readonly confirmDelete: "刪除實例 {did}?";
|
|
166
|
+
readonly deleteFailed: "刪除失敗";
|
|
167
|
+
readonly noChanges: "沒有需要儲存的變更。";
|
|
168
|
+
readonly updateFailed: "更新失敗";
|
|
169
|
+
};
|
|
170
|
+
readonly ja: {
|
|
171
|
+
readonly title: "インスタンス登録";
|
|
172
|
+
readonly backToAdmin: "管理コンソールに戻る";
|
|
173
|
+
readonly registerHeading: "インスタンスを登録";
|
|
174
|
+
readonly appPskLabel: "App PSK(永続シークレットキー)*";
|
|
175
|
+
readonly appPskPlaceholder: "永続シークレットキー";
|
|
176
|
+
readonly appPskHint: "必須です。インスタンス DID の導出に使用します。";
|
|
177
|
+
readonly instanceDidLabel: "インスタンス DID(自動導出)";
|
|
178
|
+
readonly derivedDidPlaceholder: "App PSK を入力すると導出された DID が表示されます";
|
|
179
|
+
readonly appSkLabel: "App SK(現在のシークレットキー)*";
|
|
180
|
+
readonly appSkPlaceholder: "現在のセッションキー";
|
|
181
|
+
readonly appEkLabel: "App EK(暗号化キー)";
|
|
182
|
+
readonly appEkPlaceholder: "任意の暗号化キー(BLOCKLET_APP_EK)";
|
|
183
|
+
readonly appEkHint: "利用側が AES で暗号化されたデータ(Stripe キーなど)を復号するために使用します。BLOCKLET_APP_EK の値です。";
|
|
184
|
+
readonly appNameLabel: "アプリ名";
|
|
185
|
+
readonly appNamePlaceholder: "任意の表示名";
|
|
186
|
+
readonly ownerDidLabel: "Owner DID";
|
|
187
|
+
readonly ownerDidPlaceholder: "任意の owner DID";
|
|
188
|
+
readonly ownerDidHint: "入力すると、この DID のオーナーメンバーシップを作成します。";
|
|
189
|
+
readonly hostsLabel: "Hosts";
|
|
190
|
+
readonly hostsPlaceholder: "任意。カンマ区切り(例: app.example.com, alt.example.com)";
|
|
191
|
+
readonly hostsHint: "これらの host をこのインスタンスへルーティングします。すでに他のインスタンスへ紐づいている host は拒否されます。";
|
|
192
|
+
readonly registerBtn: "インスタンスを登録";
|
|
193
|
+
readonly registeredHeading: "登録済みインスタンス";
|
|
194
|
+
readonly loading: "読み込み中…";
|
|
195
|
+
readonly editHeading: "インスタンスを編集:";
|
|
196
|
+
readonly editAppNameLabel: "アプリ名";
|
|
197
|
+
readonly editAppNamePlaceholder: "表示名";
|
|
198
|
+
readonly editAppSkLabel: "App SK(現在のシークレットキー)";
|
|
199
|
+
readonly keepCurrentPlaceholder: "空欄のままにすると現在の値を保持します";
|
|
200
|
+
readonly editAppPskLabel: "App PSK(永続シークレットキー)";
|
|
201
|
+
readonly editAppEkLabel: "App EK(暗号化キー)";
|
|
202
|
+
readonly editAppEkPlaceholder: "BLOCKLET_APP_EK — 空欄のままにすると現在の値を保持します";
|
|
203
|
+
readonly editAppEkHint: "AES で暗号化されたデータ(Stripe キーなど)の復号に使用します";
|
|
204
|
+
readonly editOwnerDidLabel: "Owner DID";
|
|
205
|
+
readonly editOwnerDidPlaceholder: "空欄のままにするとスキップします";
|
|
206
|
+
readonly cancel: "キャンセル";
|
|
207
|
+
readonly save: "保存";
|
|
208
|
+
readonly adminRequired: "管理者権限が必要です。";
|
|
209
|
+
readonly noInstances: "登録済みのインスタンスはありません。";
|
|
210
|
+
readonly unnamed: "(名称未設定)";
|
|
211
|
+
readonly registeredTime: "登録日時:{time}";
|
|
212
|
+
readonly members: "メンバー";
|
|
213
|
+
readonly edit: "編集";
|
|
214
|
+
readonly delete: "削除";
|
|
215
|
+
readonly failedToLoad: "インスタンスの読み込みに失敗しました。";
|
|
216
|
+
readonly registeredStatus: "登録済み:{did}";
|
|
217
|
+
readonly registrationFailed: "登録に失敗しました";
|
|
218
|
+
readonly networkError: "ネットワークエラー";
|
|
219
|
+
readonly confirmDelete: "インスタンス {did} を削除しますか?";
|
|
220
|
+
readonly deleteFailed: "削除に失敗しました";
|
|
221
|
+
readonly noChanges: "保存する変更はありません。";
|
|
222
|
+
readonly updateFailed: "更新に失敗しました";
|
|
223
|
+
};
|
|
224
|
+
};
|
|
7
225
|
export declare function buildAdminInstancesPageHTML(locale?: string): string;
|
|
8
226
|
//# sourceMappingURL=admin-instances-page.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-instances-page.d.ts","sourceRoot":"","sources":["../../src/pages/admin-instances-page.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"admin-instances-page.d.ts","sourceRoot":"","sources":["../../src/pages/admin-instances-page.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2N+B,CAAC;AAuLjE,wBAAgB,2BAA2B,CAAC,MAAM,SAAO,GAAG,MAAM,CAmXjE"}
|
|
@@ -5,18 +5,12 @@
|
|
|
5
5
|
* Follows gen-access-key-page.ts architecture.
|
|
6
6
|
*/
|
|
7
7
|
import { assetUrl } from "../asset-registry.js";
|
|
8
|
+
import { resolvePageLocale } from "../locale.js";
|
|
8
9
|
/** Escape string for safe embedding inside <script> — prevents XSS. */
|
|
9
10
|
function escapeForScript(s) {
|
|
10
11
|
return s.replace(/<\/(script)/gi, "<\\/$1");
|
|
11
12
|
}
|
|
12
|
-
|
|
13
|
-
* Admin-instances-page copy, localized. `en` is the default fallback for any
|
|
14
|
-
* unknown locale. Technical identifiers (App PSK/SK/EK, Instance DID, Owner DID,
|
|
15
|
-
* Hosts, BLOCKLET_APP_EK) are intentionally kept untranslated — they are field
|
|
16
|
-
* names / env-var names, not prose. Only the descriptive/instructional text is
|
|
17
|
-
* localized.
|
|
18
|
-
*/
|
|
19
|
-
const ADMIN_INSTANCES_I18N = {
|
|
13
|
+
export const ADMIN_INSTANCES_I18N = {
|
|
20
14
|
en: {
|
|
21
15
|
title: "Instance Registration",
|
|
22
16
|
backToAdmin: "Back to Admin",
|
|
@@ -59,15 +53,15 @@ const ADMIN_INSTANCES_I18N = {
|
|
|
59
53
|
adminRequired: "Admin access required.",
|
|
60
54
|
noInstances: "No registered instances.",
|
|
61
55
|
unnamed: "(unnamed)",
|
|
62
|
-
|
|
56
|
+
registeredTime: "Registered: {time}",
|
|
63
57
|
members: "Members",
|
|
64
58
|
edit: "Edit",
|
|
65
59
|
delete: "Delete",
|
|
66
60
|
failedToLoad: "Failed to load instances.",
|
|
67
|
-
|
|
61
|
+
registeredStatus: "Registered: {did}",
|
|
68
62
|
registrationFailed: "Registration failed",
|
|
69
63
|
networkError: "Network error",
|
|
70
|
-
|
|
64
|
+
confirmDelete: "Delete instance {did}?",
|
|
71
65
|
deleteFailed: "Delete failed",
|
|
72
66
|
noChanges: "No changes to save.",
|
|
73
67
|
updateFailed: "Update failed",
|
|
@@ -113,19 +107,127 @@ const ADMIN_INSTANCES_I18N = {
|
|
|
113
107
|
adminRequired: "需要管理员权限。",
|
|
114
108
|
noInstances: "暂无已注册的实例。",
|
|
115
109
|
unnamed: "(未命名)",
|
|
116
|
-
|
|
110
|
+
registeredTime: "注册时间:{time}",
|
|
117
111
|
members: "成员",
|
|
118
112
|
edit: "编辑",
|
|
119
113
|
delete: "删除",
|
|
120
114
|
failedToLoad: "加载实例失败。",
|
|
121
|
-
|
|
115
|
+
registeredStatus: "已注册:{did}",
|
|
122
116
|
registrationFailed: "注册失败",
|
|
123
117
|
networkError: "网络错误",
|
|
124
|
-
|
|
118
|
+
confirmDelete: "删除实例 {did}?",
|
|
125
119
|
deleteFailed: "删除失败",
|
|
126
120
|
noChanges: "没有需要保存的更改。",
|
|
127
121
|
updateFailed: "更新失败",
|
|
128
122
|
},
|
|
123
|
+
"zh-TW": {
|
|
124
|
+
title: "實例註冊",
|
|
125
|
+
backToAdmin: "返回管理主控台",
|
|
126
|
+
registerHeading: "註冊實例",
|
|
127
|
+
appPskLabel: "App PSK(永久金鑰)*",
|
|
128
|
+
appPskPlaceholder: "永久金鑰",
|
|
129
|
+
appPskHint: "必填。用於衍生實例 DID。",
|
|
130
|
+
instanceDidLabel: "實例 DID(自動衍生)",
|
|
131
|
+
derivedDidPlaceholder: "輸入 App PSK 以查看衍生的 DID",
|
|
132
|
+
appSkLabel: "App SK(目前金鑰)*",
|
|
133
|
+
appSkPlaceholder: "目前工作階段金鑰",
|
|
134
|
+
appEkLabel: "App EK(加密金鑰)",
|
|
135
|
+
appEkPlaceholder: "選填的加密金鑰(BLOCKLET_APP_EK)",
|
|
136
|
+
appEkHint: "供接入方解密 AES 加密的資料(如 Stripe 金鑰)。來自 BLOCKLET_APP_EK。",
|
|
137
|
+
appNameLabel: "應用程式名稱",
|
|
138
|
+
appNamePlaceholder: "選填的顯示名稱",
|
|
139
|
+
ownerDidLabel: "Owner DID",
|
|
140
|
+
ownerDidPlaceholder: "選填的 owner DID",
|
|
141
|
+
ownerDidHint: "若填寫,將為該 DID 建立擁有者成員身分。",
|
|
142
|
+
hostsLabel: "Hosts",
|
|
143
|
+
hostsPlaceholder: "選填,以逗號分隔(如 app.example.com, alt.example.com)",
|
|
144
|
+
hostsHint: "將這些 host 路由到此實例。若某個 host 已繫結到其他實例則會被拒絕。",
|
|
145
|
+
registerBtn: "註冊實例",
|
|
146
|
+
registeredHeading: "已註冊的實例",
|
|
147
|
+
loading: "載入中…",
|
|
148
|
+
editHeading: "編輯實例:",
|
|
149
|
+
editAppNameLabel: "應用程式名稱",
|
|
150
|
+
editAppNamePlaceholder: "顯示名稱",
|
|
151
|
+
editAppSkLabel: "App SK(目前金鑰)",
|
|
152
|
+
keepCurrentPlaceholder: "留空則保持目前的值",
|
|
153
|
+
editAppPskLabel: "App PSK(永久金鑰)",
|
|
154
|
+
editAppEkLabel: "App EK(加密金鑰)",
|
|
155
|
+
editAppEkPlaceholder: "BLOCKLET_APP_EK —— 留空則保持目前的值",
|
|
156
|
+
editAppEkHint: "用於解密 AES 加密的資料(如 Stripe 金鑰)",
|
|
157
|
+
editOwnerDidLabel: "Owner DID",
|
|
158
|
+
editOwnerDidPlaceholder: "留空則略過",
|
|
159
|
+
cancel: "取消",
|
|
160
|
+
save: "儲存",
|
|
161
|
+
adminRequired: "需要管理員權限。",
|
|
162
|
+
noInstances: "尚無已註冊的實例。",
|
|
163
|
+
unnamed: "(未命名)",
|
|
164
|
+
registeredTime: "註冊時間:{time}",
|
|
165
|
+
members: "成員",
|
|
166
|
+
edit: "編輯",
|
|
167
|
+
delete: "刪除",
|
|
168
|
+
failedToLoad: "載入實例失敗。",
|
|
169
|
+
registeredStatus: "已註冊:{did}",
|
|
170
|
+
registrationFailed: "註冊失敗",
|
|
171
|
+
networkError: "網路錯誤",
|
|
172
|
+
confirmDelete: "刪除實例 {did}?",
|
|
173
|
+
deleteFailed: "刪除失敗",
|
|
174
|
+
noChanges: "沒有需要儲存的變更。",
|
|
175
|
+
updateFailed: "更新失敗",
|
|
176
|
+
},
|
|
177
|
+
ja: {
|
|
178
|
+
title: "インスタンス登録",
|
|
179
|
+
backToAdmin: "管理コンソールに戻る",
|
|
180
|
+
registerHeading: "インスタンスを登録",
|
|
181
|
+
appPskLabel: "App PSK(永続シークレットキー)*",
|
|
182
|
+
appPskPlaceholder: "永続シークレットキー",
|
|
183
|
+
appPskHint: "必須です。インスタンス DID の導出に使用します。",
|
|
184
|
+
instanceDidLabel: "インスタンス DID(自動導出)",
|
|
185
|
+
derivedDidPlaceholder: "App PSK を入力すると導出された DID が表示されます",
|
|
186
|
+
appSkLabel: "App SK(現在のシークレットキー)*",
|
|
187
|
+
appSkPlaceholder: "現在のセッションキー",
|
|
188
|
+
appEkLabel: "App EK(暗号化キー)",
|
|
189
|
+
appEkPlaceholder: "任意の暗号化キー(BLOCKLET_APP_EK)",
|
|
190
|
+
appEkHint: "利用側が AES で暗号化されたデータ(Stripe キーなど)を復号するために使用します。BLOCKLET_APP_EK の値です。",
|
|
191
|
+
appNameLabel: "アプリ名",
|
|
192
|
+
appNamePlaceholder: "任意の表示名",
|
|
193
|
+
ownerDidLabel: "Owner DID",
|
|
194
|
+
ownerDidPlaceholder: "任意の owner DID",
|
|
195
|
+
ownerDidHint: "入力すると、この DID のオーナーメンバーシップを作成します。",
|
|
196
|
+
hostsLabel: "Hosts",
|
|
197
|
+
hostsPlaceholder: "任意。カンマ区切り(例: app.example.com, alt.example.com)",
|
|
198
|
+
hostsHint: "これらの host をこのインスタンスへルーティングします。すでに他のインスタンスへ紐づいている host は拒否されます。",
|
|
199
|
+
registerBtn: "インスタンスを登録",
|
|
200
|
+
registeredHeading: "登録済みインスタンス",
|
|
201
|
+
loading: "読み込み中…",
|
|
202
|
+
editHeading: "インスタンスを編集:",
|
|
203
|
+
editAppNameLabel: "アプリ名",
|
|
204
|
+
editAppNamePlaceholder: "表示名",
|
|
205
|
+
editAppSkLabel: "App SK(現在のシークレットキー)",
|
|
206
|
+
keepCurrentPlaceholder: "空欄のままにすると現在の値を保持します",
|
|
207
|
+
editAppPskLabel: "App PSK(永続シークレットキー)",
|
|
208
|
+
editAppEkLabel: "App EK(暗号化キー)",
|
|
209
|
+
editAppEkPlaceholder: "BLOCKLET_APP_EK — 空欄のままにすると現在の値を保持します",
|
|
210
|
+
editAppEkHint: "AES で暗号化されたデータ(Stripe キーなど)の復号に使用します",
|
|
211
|
+
editOwnerDidLabel: "Owner DID",
|
|
212
|
+
editOwnerDidPlaceholder: "空欄のままにするとスキップします",
|
|
213
|
+
cancel: "キャンセル",
|
|
214
|
+
save: "保存",
|
|
215
|
+
adminRequired: "管理者権限が必要です。",
|
|
216
|
+
noInstances: "登録済みのインスタンスはありません。",
|
|
217
|
+
unnamed: "(名称未設定)",
|
|
218
|
+
registeredTime: "登録日時:{time}",
|
|
219
|
+
members: "メンバー",
|
|
220
|
+
edit: "編集",
|
|
221
|
+
delete: "削除",
|
|
222
|
+
failedToLoad: "インスタンスの読み込みに失敗しました。",
|
|
223
|
+
registeredStatus: "登録済み:{did}",
|
|
224
|
+
registrationFailed: "登録に失敗しました",
|
|
225
|
+
networkError: "ネットワークエラー",
|
|
226
|
+
confirmDelete: "インスタンス {did} を削除しますか?",
|
|
227
|
+
deleteFailed: "削除に失敗しました",
|
|
228
|
+
noChanges: "保存する変更はありません。",
|
|
229
|
+
updateFailed: "更新に失敗しました",
|
|
230
|
+
},
|
|
129
231
|
};
|
|
130
232
|
const PAGE_STYLES = /* css */ `
|
|
131
233
|
.hidden { display: none !important; }
|
|
@@ -309,28 +411,28 @@ const PAGE_STYLES = /* css */ `
|
|
|
309
411
|
`;
|
|
310
412
|
export function buildAdminInstancesPageHTML(locale = "en") {
|
|
311
413
|
const apiPrefix = "/.well-known/service/api/did";
|
|
312
|
-
const
|
|
313
|
-
const t = ADMIN_INSTANCES_I18N[
|
|
414
|
+
const { code, htmlLang } = resolvePageLocale(locale);
|
|
415
|
+
const t = ADMIN_INSTANCES_I18N[code];
|
|
314
416
|
const clientI18n = JSON.stringify({
|
|
315
417
|
adminRequired: t.adminRequired,
|
|
316
418
|
noInstances: t.noInstances,
|
|
317
419
|
unnamed: t.unnamed,
|
|
318
|
-
|
|
420
|
+
registeredTime: t.registeredTime,
|
|
319
421
|
members: t.members,
|
|
320
422
|
edit: t.edit,
|
|
321
423
|
delete: t.delete,
|
|
322
424
|
failedToLoad: t.failedToLoad,
|
|
323
|
-
|
|
425
|
+
registeredStatus: t.registeredStatus,
|
|
324
426
|
registrationFailed: t.registrationFailed,
|
|
325
427
|
networkError: t.networkError,
|
|
326
|
-
|
|
428
|
+
confirmDelete: t.confirmDelete,
|
|
327
429
|
deleteFailed: t.deleteFailed,
|
|
328
430
|
noChanges: t.noChanges,
|
|
329
431
|
updateFailed: t.updateFailed,
|
|
330
432
|
derivedDidPlaceholder: t.derivedDidPlaceholder,
|
|
331
433
|
});
|
|
332
434
|
return /* html */ `<!DOCTYPE html>
|
|
333
|
-
<html lang="${
|
|
435
|
+
<html lang="${htmlLang}">
|
|
334
436
|
<head>
|
|
335
437
|
<meta charset="utf-8" />
|
|
336
438
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
@@ -446,6 +548,7 @@ export function buildAdminInstancesPageHTML(locale = "en") {
|
|
|
446
548
|
var apiPrefix = '${escapeForScript(apiPrefix)}';
|
|
447
549
|
var adminApi = '/.well-known/service/api/admin/instances';
|
|
448
550
|
var I18N = ${clientI18n};
|
|
551
|
+
var HTML_LANG = ${JSON.stringify(htmlLang)};
|
|
449
552
|
// Looked up by editInstance/deleteInstance instead of passing appName through
|
|
450
553
|
// an onclick= string — see escapeHtml below for why entity-escaping alone
|
|
451
554
|
// can't fully neutralize a value re-embedded as a JS string inside onclick.
|
|
@@ -510,12 +613,12 @@ export function buildAdminInstancesPageHTML(locale = "en") {
|
|
|
510
613
|
data.instances.forEach(function(inst) {
|
|
511
614
|
var name = inst.appName ? escapeHtml(inst.appName) : I18N.unnamed;
|
|
512
615
|
var didHtml = '<did-address did="' + escapeHtml(inst.instanceDid) + '" compact></did-address>';
|
|
513
|
-
var time = inst.registeredAt ? new Date(inst.registeredAt).toLocaleString() : '';
|
|
616
|
+
var time = inst.registeredAt ? new Date(inst.registeredAt).toLocaleString(HTML_LANG) : '';
|
|
514
617
|
html += '<li class="instance-item">'
|
|
515
618
|
+ '<div class="instance-info">'
|
|
516
619
|
+ '<div class="instance-name">' + name + '</div>'
|
|
517
620
|
+ '<div class="instance-did">' + didHtml + '</div>'
|
|
518
|
-
+ (time ? '<div class="instance-time">' + I18N.
|
|
621
|
+
+ (time ? '<div class="instance-time">' + fill(I18N.registeredTime, { time: escapeHtml(time) }) + '</div>' : '')
|
|
519
622
|
+ '</div>'
|
|
520
623
|
+ '<div style="display:flex;gap:8px;align-items:center">'
|
|
521
624
|
+ '<button class="btn-secondary" onclick="location.href=\\'/.well-known/service/admin?instance=' + encodeURIComponent(inst.instanceDid) + '#members\\'">' + I18N.members + '</button>'
|
|
@@ -533,6 +636,12 @@ export function buildAdminInstancesPageHTML(locale = "en") {
|
|
|
533
636
|
});
|
|
534
637
|
}
|
|
535
638
|
|
|
639
|
+
function fill(template, values) {
|
|
640
|
+
var out = template;
|
|
641
|
+
for (var key in values) out = out.split('{' + key + '}').join(values[key]);
|
|
642
|
+
return out;
|
|
643
|
+
}
|
|
644
|
+
|
|
536
645
|
function escapeHtml(s) {
|
|
537
646
|
var d = document.createElement('div');
|
|
538
647
|
d.textContent = s;
|
|
@@ -573,7 +682,7 @@ export function buildAdminInstancesPageHTML(locale = "en") {
|
|
|
573
682
|
.then(function(r) { return r.json(); })
|
|
574
683
|
.then(function(data) {
|
|
575
684
|
if (data.ok) {
|
|
576
|
-
status.innerHTML = I18N.
|
|
685
|
+
status.innerHTML = fill(I18N.registeredStatus, { did: '<did-address did="' + escapeHtml(data.instanceDid) + '" compact></did-address>' });
|
|
577
686
|
status.className = 'success';
|
|
578
687
|
form.reset();
|
|
579
688
|
document.getElementById('derived-did').textContent = I18N.derivedDidPlaceholder;
|
|
@@ -595,7 +704,7 @@ export function buildAdminInstancesPageHTML(locale = "en") {
|
|
|
595
704
|
var deleting = null; // instanceDid whose DELETE is in flight — a second click must not resend
|
|
596
705
|
window.deleteInstance = function(did) {
|
|
597
706
|
if (deleting) return;
|
|
598
|
-
if (!confirm(I18N.
|
|
707
|
+
if (!confirm(fill(I18N.confirmDelete, { did: did }))) return;
|
|
599
708
|
deleting = did;
|
|
600
709
|
fetch(adminApi + '/' + encodeURIComponent(did), {
|
|
601
710
|
method: 'DELETE',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-instances-page.js","sourceRoot":"","sources":["../../src/pages/admin-instances-page.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-instances-page.js","sourceRoot":"","sources":["../../src/pages/admin-instances-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,40 @@
|
|
|
2
2
|
* Minimal error page — used for 403 (Forbidden), 404 (Not Found), etc.
|
|
3
3
|
* Styled with design tokens so it adapts to dark/light theme.
|
|
4
4
|
*/
|
|
5
|
+
type ErrorPageCopy = {
|
|
6
|
+
accountBlockedTitle: string;
|
|
7
|
+
accountBlockedMessage: string;
|
|
8
|
+
notTeamMemberTitle: string;
|
|
9
|
+
notTeamMemberMessage: string;
|
|
10
|
+
};
|
|
11
|
+
/** The two 403 sentences. Action-button labels stay with the caller. */
|
|
12
|
+
export declare const ERROR_PAGE_COPY: {
|
|
13
|
+
readonly en: {
|
|
14
|
+
readonly accountBlockedTitle: "Account Blocked";
|
|
15
|
+
readonly accountBlockedMessage: "Your account has been blocked. Please contact the administrator.";
|
|
16
|
+
readonly notTeamMemberTitle: "Access Denied";
|
|
17
|
+
readonly notTeamMemberMessage: "You are not a member of this team.";
|
|
18
|
+
};
|
|
19
|
+
readonly zh: {
|
|
20
|
+
readonly accountBlockedTitle: "账户已封禁";
|
|
21
|
+
readonly accountBlockedMessage: "您的账户已被封禁,请联系管理员。";
|
|
22
|
+
readonly notTeamMemberTitle: "拒绝访问";
|
|
23
|
+
readonly notTeamMemberMessage: "您不是该团队的成员。";
|
|
24
|
+
};
|
|
25
|
+
readonly "zh-TW": {
|
|
26
|
+
readonly accountBlockedTitle: "帳號已封鎖";
|
|
27
|
+
readonly accountBlockedMessage: "您的帳號已被封鎖,請聯絡管理員。";
|
|
28
|
+
readonly notTeamMemberTitle: "拒絕存取";
|
|
29
|
+
readonly notTeamMemberMessage: "您不是此團隊的成員。";
|
|
30
|
+
};
|
|
31
|
+
readonly ja: {
|
|
32
|
+
readonly accountBlockedTitle: "アカウントは停止されています";
|
|
33
|
+
readonly accountBlockedMessage: "あなたのアカウントは停止されています。管理者にお問い合わせください。";
|
|
34
|
+
readonly notTeamMemberTitle: "アクセスが拒否されました";
|
|
35
|
+
readonly notTeamMemberMessage: "あなたはこのチームのメンバーではありません。";
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export declare function errorPageCopy(locale?: string): ErrorPageCopy;
|
|
5
39
|
export interface ErrorPageOptions {
|
|
6
40
|
status: number;
|
|
7
41
|
title: string;
|
|
@@ -16,6 +50,9 @@ export interface ErrorPageOptions {
|
|
|
16
50
|
label: string;
|
|
17
51
|
href: string;
|
|
18
52
|
};
|
|
53
|
+
/** Internal locale code. Omitted or unknown → `<html lang="en">`. */
|
|
54
|
+
locale?: string;
|
|
19
55
|
}
|
|
20
56
|
export declare function buildErrorPageHTML(opts: ErrorPageOptions): string;
|
|
57
|
+
export {};
|
|
21
58
|
//# sourceMappingURL=error-page.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-page.d.ts","sourceRoot":"","sources":["../../src/pages/error-page.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"error-page.d.ts","sourceRoot":"","sources":["../../src/pages/error-page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,KAAK,aAAa,GAAG;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;CAyB+B,CAAC;AAE5D,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAE5D;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,gCAAgC;IAChC,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CA8BjE"}
|
package/dist/pages/error-page.js
CHANGED
|
@@ -3,6 +3,37 @@
|
|
|
3
3
|
* Styled with design tokens so it adapts to dark/light theme.
|
|
4
4
|
*/
|
|
5
5
|
import { assetUrl } from "../asset-registry.js";
|
|
6
|
+
import { resolvePageLocale } from "../locale.js";
|
|
7
|
+
/** The two 403 sentences. Action-button labels stay with the caller. */
|
|
8
|
+
export const ERROR_PAGE_COPY = {
|
|
9
|
+
en: {
|
|
10
|
+
accountBlockedTitle: "Account Blocked",
|
|
11
|
+
accountBlockedMessage: "Your account has been blocked. Please contact the administrator.",
|
|
12
|
+
notTeamMemberTitle: "Access Denied",
|
|
13
|
+
notTeamMemberMessage: "You are not a member of this team.",
|
|
14
|
+
},
|
|
15
|
+
zh: {
|
|
16
|
+
accountBlockedTitle: "账户已封禁",
|
|
17
|
+
accountBlockedMessage: "您的账户已被封禁,请联系管理员。",
|
|
18
|
+
notTeamMemberTitle: "拒绝访问",
|
|
19
|
+
notTeamMemberMessage: "您不是该团队的成员。",
|
|
20
|
+
},
|
|
21
|
+
"zh-TW": {
|
|
22
|
+
accountBlockedTitle: "帳號已封鎖",
|
|
23
|
+
accountBlockedMessage: "您的帳號已被封鎖,請聯絡管理員。",
|
|
24
|
+
notTeamMemberTitle: "拒絕存取",
|
|
25
|
+
notTeamMemberMessage: "您不是此團隊的成員。",
|
|
26
|
+
},
|
|
27
|
+
ja: {
|
|
28
|
+
accountBlockedTitle: "アカウントは停止されています",
|
|
29
|
+
accountBlockedMessage: "あなたのアカウントは停止されています。管理者にお問い合わせください。",
|
|
30
|
+
notTeamMemberTitle: "アクセスが拒否されました",
|
|
31
|
+
notTeamMemberMessage: "あなたはこのチームのメンバーではありません。",
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
export function errorPageCopy(locale) {
|
|
35
|
+
return ERROR_PAGE_COPY[resolvePageLocale(locale).code];
|
|
36
|
+
}
|
|
6
37
|
export function buildErrorPageHTML(opts) {
|
|
7
38
|
const actionBtn = opts.action
|
|
8
39
|
? `<a class="btn" href="${escapeAttr(opts.action.href)}">${escapeHTML(opts.action.label)}</a>`
|
|
@@ -10,8 +41,9 @@ export function buildErrorPageHTML(opts) {
|
|
|
10
41
|
const secondaryBtn = opts.secondaryAction
|
|
11
42
|
? `<a class="btn btn-secondary" href="${escapeAttr(opts.secondaryAction.href)}">${escapeHTML(opts.secondaryAction.label)}</a>`
|
|
12
43
|
: "";
|
|
44
|
+
const { htmlLang } = resolvePageLocale(opts.locale);
|
|
13
45
|
return /* html */ `<!DOCTYPE html>
|
|
14
|
-
<html lang="
|
|
46
|
+
<html lang="${htmlLang}">
|
|
15
47
|
<head>
|
|
16
48
|
<meta charset="utf-8" />
|
|
17
49
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-page.js","sourceRoot":"","sources":["../../src/pages/error-page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"error-page.js","sourceRoot":"","sources":["../../src/pages/error-page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAwB,MAAM,cAAc,CAAC;AASvE,wEAAwE;AACxE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,EAAE,EAAE;QACF,mBAAmB,EAAE,iBAAiB;QACtC,qBAAqB,EAAE,kEAAkE;QACzF,kBAAkB,EAAE,eAAe;QACnC,oBAAoB,EAAE,oCAAoC;KAC3D;IACD,EAAE,EAAE;QACF,mBAAmB,EAAE,OAAO;QAC5B,qBAAqB,EAAE,kBAAkB;QACzC,kBAAkB,EAAE,MAAM;QAC1B,oBAAoB,EAAE,YAAY;KACnC;IACD,OAAO,EAAE;QACP,mBAAmB,EAAE,OAAO;QAC5B,qBAAqB,EAAE,kBAAkB;QACzC,kBAAkB,EAAE,MAAM;QAC1B,oBAAoB,EAAE,YAAY;KACnC;IACD,EAAE,EAAE;QACF,mBAAmB,EAAE,gBAAgB;QACrC,qBAAqB,EAAE,oCAAoC;QAC3D,kBAAkB,EAAE,cAAc;QAClC,oBAAoB,EAAE,wBAAwB;KAC/C;CACwD,CAAC;AAE5D,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,OAAO,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC;AAcD,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM;QAC3B,CAAC,CAAC,wBAAwB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;QAC9F,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe;QACvC,CAAC,CAAC,sCAAsC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM;QAC9H,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC;cACN,QAAQ;;;;WAIX,IAAI,CAAC,MAAM,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;iCACjB,QAAQ,CAAC,YAAY,CAAC;WAC5C,YAAY;;;;8BAIO,IAAI,CAAC,MAAM;UAC/B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;SACvB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;;QAEzB,SAAS;QACT,YAAY;;;;QAIZ,CAAC;AACT,CAAC;AAED,MAAM,YAAY,GAAG,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8D9B,CAAC;AAEF,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAChF,CAAC"}
|