w-web-perm 1.1.12 → 1.1.14
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/README.md +222 -123
- package/dist/css/app.f24c5e50.css +1 -0
- package/dist/index.tmp +1 -1
- package/dist/js/app-legacy.033deb22.js +1 -0
- package/dist/js/app.033deb22.js +1 -0
- package/dist/js/{chunk-vendors.3e9e3ef1.js → chunk-vendors-legacy.b0bbb5ac.js} +4 -4
- package/dist/js/{chunk-vendors-legacy.3e9e3ef1.js → chunk-vendors.b0bbb5ac.js} +4 -4
- package/dist/w-web-perm.umd.js +2 -2
- package/dist/w-web-perm.umd.js.map +1 -1
- package/docs/WWebPerm.html +91 -6
- package/docs/global.html +29525 -1424
- package/docs/index.html +2 -2
- package/docs/server_WWebPerm.mjs.html +155 -175
- package/docs/server_cascadeWrite.mjs.html +204 -0
- package/docs/server_dataChannel.mjs.html +3 -3
- package/docs/server_keyCheck.mjs.html +480 -0
- package/docs/server_lockSave.mjs.html +2 -2
- package/docs/server_maskLog.mjs.html +2 -2
- package/docs/server_procCore.mjs.html +383 -60
- package/docs/server_staLogs_resolveShellWorker.mjs.html +2 -2
- package/docs/server_syncCore.mjs.html +533 -0
- package/docs/server_syncKeep.mjs.html +318 -0
- package/docs/server_tools_authRefsAudit.mjs.html +247 -0
- package/docs/server_tools_authRefsClean.mjs.html +335 -0
- package/docs/server_tools_fromTools.mjs.html +797 -0
- package/docs/server_tools_isMain.mjs.html +103 -0
- package/docs/server_tools_nameDupReport.mjs.html +313 -0
- package/docs/server_validateRows.mjs.html +2 -2
- package/docs/server_wrapInjected.mjs.html +3 -3
- package/docs/src_fetchJson.mjs.html +2 -2
- package/docs/src_getPermUserInfor.mjs.html +175 -0
- package/docs/src_js_applySaved.mjs.html +128 -0
- package/docs/src_js_cellEditing.mjs.html +163 -0
- package/docs/src_js_cvKpToArr.mjs.html +2 -2
- package/docs/src_js_cvKpToObj.mjs.html +44 -33
- package/docs/src_js_draftSync.mjs.html +218 -0
- package/docs/src_js_eachOwn.mjs.html +3 -3
- package/docs/src_js_editorRefRows.mjs.html +356 -0
- package/docs/src_js_externalRows.mjs.html +362 -0
- package/docs/src_js_externalUi.mjs.html +226 -0
- package/docs/src_js_findRefRows.mjs.html +107 -0
- package/docs/src_js_findTouchedDup.mjs.html +150 -0
- package/docs/src_js_fmtLossyMsg.mjs.html +2 -2
- package/docs/src_js_fromAudit.mjs.html +489 -0
- package/docs/src_js_getAddImpact.mjs.html +269 -0
- package/docs/src_js_getAuthWarn.mjs.html +463 -0
- package/docs/src_js_getCascadePreview.mjs.html +258 -0
- package/docs/src_js_getDelRefCount.mjs.html +210 -0
- package/docs/src_js_getEffMode.mjs.html +92 -0
- package/docs/src_js_getKpLossy.mjs.html +47 -52
- package/docs/src_js_getNameErrs.mjs.html +266 -0
- package/docs/src_js_getOwn.mjs.html +3 -3
- package/docs/src_js_getPropKey.mjs.html +109 -0
- package/docs/src_js_getRuleEnable.mjs.html +2 -2
- package/docs/src_js_isAuthMode.mjs.html +4 -4
- package/docs/src_js_joinNames.mjs.html +2 -2
- package/docs/src_js_legendFit.mjs.html +2 -2
- package/docs/src_js_pairRowsToSnapshot.mjs.html +156 -0
- package/docs/src_js_refAudit.mjs.html +359 -0
- package/docs/src_js_refCascade.mjs.html +572 -0
- package/docs/src_js_refIdentity.mjs.html +500 -0
- package/docs/src_js_relDialogSend.mjs.html +199 -0
- package/docs/src_js_rowDigest.mjs.html +195 -0
- package/docs/src_plugins_dataReloadGuard.mjs.html +109 -0
- package/docs/src_plugins_reuseDeletedIds.mjs.html +2 -2
- package/docs/src_plugins_submitGuard.mjs.html +2 -2
- package/g_authRefsClean.mjs +79 -0
- package/g_fixFromType.mjs +92 -0
- package/g_initialData.mjs +3 -3
- package/g_provideGrups.mjs +1 -1
- package/g_providePemis.mjs +1 -1
- package/g_provideTargets.mjs +1 -1
- package/g_provideUsers.mjs +1 -1
- package/g_purgeFrom.mjs +127 -0
- package/package.json +2 -2
- package/server/WWebPerm.mjs +153 -173
- package/server/cascadeWrite.mjs +132 -0
- package/server/dataChannel.mjs +1 -1
- package/server/keyCheck.mjs +408 -0
- package/server/procCore.mjs +381 -58
- package/server/procLang.mjs +338 -3
- package/server/provideTabs.mjs +6 -4
- package/server/syncCore.mjs +461 -0
- package/server/syncKeep.mjs +246 -0
- package/server/tools/authRefsAudit.mjs +175 -0
- package/server/tools/authRefsClean.mjs +263 -0
- package/server/tools/fromTools.mjs +725 -0
- package/server/tools/isMain.mjs +31 -0
- package/server/tools/nameDupReport.mjs +241 -0
- package/server/wrapInjected.mjs +1 -1
- package/src/components/LayoutContentGrups.vue +445 -75
- package/src/components/LayoutContentPemis.vue +444 -75
- package/src/components/LayoutContentTargets.vue +292 -25
- package/src/components/LayoutContentUsers.vue +383 -97
- package/src/components/VeCgrups.vue +88 -129
- package/src/components/VeCpemis.vue +86 -129
- package/src/components/VeCrules.vue +15 -5
- package/src/components/VeGrupBlngUsers.vue +312 -91
- package/src/components/VePemiBlngGrups.vue +319 -101
- package/src/getPermUserInfor.mjs +10 -0
- package/src/js/applySaved.mjs +56 -0
- package/src/js/cellEditing.mjs +91 -0
- package/src/js/cvKpToObj.mjs +42 -31
- package/src/js/draftSync.mjs +146 -0
- package/src/js/eachOwn.mjs +1 -1
- package/src/js/editorRefRows.mjs +284 -0
- package/src/js/externalRows.mjs +290 -0
- package/src/js/externalUi.mjs +154 -0
- package/src/js/findRefRows.mjs +35 -0
- package/src/js/findTouchedDup.mjs +78 -0
- package/src/js/fromAudit.mjs +417 -0
- package/src/js/getAddImpact.mjs +197 -0
- package/src/js/getAuthWarn.mjs +391 -0
- package/src/js/getCascadePreview.mjs +186 -0
- package/src/js/getDelRefCount.mjs +138 -0
- package/src/js/getEffMode.mjs +20 -0
- package/src/js/getKpLossy.mjs +44 -49
- package/src/js/getNameErrs.mjs +194 -0
- package/src/js/getOwn.mjs +1 -1
- package/src/js/getPropKey.mjs +37 -0
- package/src/js/isAuthMode.mjs +2 -2
- package/src/js/pairRowsToSnapshot.mjs +84 -0
- package/src/js/refAudit.mjs +287 -0
- package/src/js/refCascade.mjs +500 -0
- package/src/js/refIdentity.mjs +428 -0
- package/src/js/relDialogSend.mjs +127 -0
- package/src/js/rowDigest.mjs +123 -0
- package/src/plugins/dataReloadGuard.mjs +37 -0
- package/src/plugins/mShare.mjs +144 -140
- package/src/plugins/mUI.mjs +3 -8
- package/src/schema/contracts/grups.mjs +8 -0
- package/src/schema/contracts/index.mjs +17 -0
- package/src/schema/contracts/pemis.mjs +8 -0
- package/src/schema/contracts/targets.mjs +8 -0
- package/src/schema/contracts/users.mjs +13 -0
- package/src/schema/tables/grups.mjs +4 -0
- package/src/schema/tables/pemis.mjs +4 -0
- package/src/schema/tables/targets.mjs +4 -0
- package/src/schema/tables/users.mjs +156 -152
- package/srv.mjs +19 -0
- package/dist/css/app.6918ec45.css +0 -1
- package/dist/js/app-legacy.7cb7e394.js +0 -1
- package/dist/js/app.7cb7e394.js +0 -1
- package/docs/src_js_getKeyOrderLost.mjs.html +0 -121
- package/docs/src_js_getKpWriteLost.mjs.html +0 -100
- package/docs/src_js_keepKeyOrder.mjs.html +0 -139
- package/src/js/getKeyOrderLost.mjs +0 -49
- package/src/js/getKpWriteLost.mjs +0 -28
- package/src/js/keepKeyOrder.mjs +0 -67
package/server/procLang.mjs
CHANGED
|
@@ -146,9 +146,220 @@ let kpLang = {
|
|
|
146
146
|
eng: `Duplicate field value in saved data`,
|
|
147
147
|
cht: `儲存資料的欄位值重複`,
|
|
148
148
|
},
|
|
149
|
-
|
|
150
|
-
eng: `Not saved: the
|
|
151
|
-
cht:
|
|
149
|
+
nameDuplicate: { //後台整表寫入: 群組/權限之名稱重複(本次造成或觸及者; 歷史既有重複原樣送回不拒), 整次拒存、資料未變更(規則帳本 R-NAME-UNIQ-02, ADR-034)
|
|
150
|
+
eng: `Not saved: the name is duplicated. Group names and permission names must be unique. Nothing was changed.`,
|
|
151
|
+
cht: `未儲存:名稱重複。群組名稱與權限名稱不得重複。資料未變更。`,
|
|
152
|
+
},
|
|
153
|
+
authLossyBlocked: { //編輯器對「物件形式無法無損表示」之授權資料拒存(規則帳本 R-AUTH-LOSSY-01, 主控複審 R4; run04 起「同名同時 OR 與 AND」, 順序部分隨 ADR-033 移除; run05 起另含「啟用而無字串名稱之項目」, R-PRINCIPLE-00 f; run06 起「啟用的項目其合併模式皆缺漏或不合法」一格放寬為可存〔方案 A 原樣寫回, ADR-035 Update 2026-10-22〕, 文字去掉該項); {names} 為受影響之名稱
|
|
154
|
+
eng: `Not saved: the authorization settings for {names} contain entries the editor cannot write without changing access (the same name set to both OR and AND, or an entry without a usable name). Nothing was changed. Please correct the source data first.`,
|
|
155
|
+
cht: `未儲存:{names} 的授權設定含有編輯器無法在不改變授權下寫出的項目(同一名稱同時以 OR 與 AND 設定,或項目沒有可用的名稱)。資料未變更,請先修正資料來源。`,
|
|
156
|
+
},
|
|
157
|
+
//授權資料衝突之頁面提示(規則帳本 R-PRINCIPLE-00 原則 3「遇衝突:收嚴+提示」、R-AUTH-WARN-01): 警告圖示(三角形驚嘆號)之 tooltip; 偵測與代入見 src/js/getAuthWarn.mjs; {names} 為受影響之名稱、{kind} 為被引用者種類(warnKindGrup/warnKindPemi)、{n} 為筆數
|
|
158
|
+
warnKindGrup: {
|
|
159
|
+
eng: `permission group`,
|
|
160
|
+
cht: `權限群組`,
|
|
161
|
+
},
|
|
162
|
+
warnKindPemi: {
|
|
163
|
+
eng: `permission`,
|
|
164
|
+
cht: `權限`,
|
|
165
|
+
},
|
|
166
|
+
warnRefDangling: { //c: 引用之名稱查無實體
|
|
167
|
+
eng: `Not found in the {kind} list: {names}. Each is still counted as an entry with no authorization (an OR entry adds nothing; an AND entry leaves nothing granted). Restore it or remove it.`,
|
|
168
|
+
cht: `在{kind}清單中找不到:{names}。仍視為一個沒有任何授權的項目(OR 項目不增加授權;AND 項目使結果為空)。請還原或移除。`,
|
|
169
|
+
},
|
|
170
|
+
warnRefAmbiguous: { //d: 引用之名稱對到多筆(歷史同名)
|
|
171
|
+
eng: `Matches several {kind}s with the same name: {names}. Only the authorization they all share is used (intersection). Rename or delete the duplicates.`,
|
|
172
|
+
cht: `對到多筆同名的{kind}:{names}。僅採用它們共同擁有的授權(交集)。請將同名項目改名或刪除。`,
|
|
173
|
+
},
|
|
174
|
+
warnRefModeInvalid: { //e: mode 缺或非 OR/AND
|
|
175
|
+
eng: `The merge mode is missing or invalid: {names}. It is treated as AND, but only as a restriction: it never grants access on its own.`,
|
|
176
|
+
cht: `合併模式缺漏或不合法:{names}。系統視為 AND,且僅作為限制,不會單獨授予任何授權。`,
|
|
177
|
+
},
|
|
178
|
+
warnRefBothModes: { //b: 同名同時有 OR 與 AND
|
|
179
|
+
eng: `Set as both OR and AND: {names}. The editor cannot save this without changing access, so saving is refused until the source data is fixed.`,
|
|
180
|
+
cht: `同時以 OR 與 AND 設定:{names}。編輯器無法在不改變授權下儲存,於資料來源修正前將拒絕儲存。`,
|
|
181
|
+
},
|
|
182
|
+
warnRefEmptyName: { //f: 名稱為空字串
|
|
183
|
+
eng: `An entry has an empty name. It is kept as it is and matches only a {kind} whose name is empty.`,
|
|
184
|
+
cht: `有項目的名稱為空字串。照原樣保留,且僅與名稱為空字串的{kind}相符。`,
|
|
185
|
+
},
|
|
186
|
+
warnRefNoName: { //f: 名稱不是字串
|
|
187
|
+
eng: `An entry has no usable name ({names}). The editor cannot keep it, so saving is refused until the source data is fixed.`,
|
|
188
|
+
cht: `有項目沒有可用的名稱({names})。編輯器無法保留,於資料來源修正前將拒絕儲存。`,
|
|
189
|
+
},
|
|
190
|
+
warnDataUnparsable: { //格式無法判讀(JSON5 解析失敗或非物件/陣列): 伺服端視為沒有任何授權(收嚴)
|
|
191
|
+
eng: `The authorization data cannot be parsed (invalid format). It is treated as granting nothing. Correct the source data or set it again and save.`,
|
|
192
|
+
cht: `授權資料的格式無法解析,系統視為沒有任何授權。請修正資料來源,或重新設定後儲存。`,
|
|
193
|
+
},
|
|
194
|
+
warnRuleConflict: { //a: crules 同一管理對象重複列且有勾與沒勾並存
|
|
195
|
+
eng: `Listed more than once, with both checked and unchecked: {names}. It is treated as unchecked (n).`,
|
|
196
|
+
cht: `重複列出且有勾與沒勾並存:{names}。系統視為沒勾選(n)。`,
|
|
197
|
+
},
|
|
198
|
+
warnNameHistDup: { //g: 歷史同名列(非本次編輯造成)
|
|
199
|
+
eng: `This name is shared by {n} rows (existing duplicates, not caused by this edit). Anything that refers to it by name uses only what the rows share. Rename or delete the extra rows.`,
|
|
200
|
+
cht: `此名稱由 {n} 筆資料共用(既有的重複,並非本次編輯造成)。以名稱引用它的授權僅採用各筆共同的部分。請將多餘的資料改名或刪除。`,
|
|
201
|
+
},
|
|
202
|
+
warnDupRowsInconsistent: { //編輯器: 同名之列設定不一致而拒存
|
|
203
|
+
eng: `Not saved: rows with the same name have different settings ({names}). Nothing was changed. Please make them identical, or fix the duplicate names first.`,
|
|
204
|
+
cht: `未儲存:同名的列設定不一致({names})。資料未變更,請先使其一致,或先修正同名資料。`,
|
|
205
|
+
},
|
|
206
|
+
//@@U1-KEYS
|
|
207
|
+
//使用者清單頁: 歷史既有(庫內原樣、非本次編輯造成)之同名/同 email/空值/格式不符不擋存, 僅於該儲存格顯示警告圖示(規則帳本 R-PRINCIPLE-00 g、h); 本次造成者仍擋存並顯示 userNameEmpty/userNameDuplicate/userEmail* 既有文字. {n} 為共用該值之使用者數
|
|
208
|
+
warnUserNameHistDup: {
|
|
209
|
+
eng: `This name is shared by {n} users (existing duplicates, not caused by this edit). This does not block saving. If name is the sign-in key, signing in with it is refused until the duplicates are fixed.`,
|
|
210
|
+
cht: `此名稱由 {n} 位使用者共用(既有的重複,並非本次編輯造成),不影響儲存。若以名稱作為登入對應鍵,在重複修正前該名稱將無法登入。`,
|
|
211
|
+
},
|
|
212
|
+
warnUserEmailHistDup: {
|
|
213
|
+
eng: `This email is shared by {n} users (existing duplicates, not caused by this edit). This does not block saving. If email is the sign-in key, signing in with it is refused until the duplicates are fixed.`,
|
|
214
|
+
cht: `此 Email 由 {n} 位使用者共用(既有的重複,並非本次編輯造成),不影響儲存。若以 Email 作為登入對應鍵,在重複修正前該 Email 將無法登入。`,
|
|
215
|
+
},
|
|
216
|
+
warnUserNameHistEmpty: {
|
|
217
|
+
eng: `This user has no valid name (existing data, not caused by this edit). This does not block saving.`,
|
|
218
|
+
cht: `此使用者尚未給予有效名稱(既有資料,並非本次編輯造成),不影響儲存。`,
|
|
219
|
+
},
|
|
220
|
+
warnUserEmailHistEmpty: {
|
|
221
|
+
eng: `This user has no email (existing data, not caused by this edit). This does not block saving. If email is the sign-in key, this user cannot sign in.`,
|
|
222
|
+
cht: `此使用者尚未給予 Email(既有資料,並非本次編輯造成),不影響儲存。若以 Email 作為登入對應鍵,此使用者將無法登入。`,
|
|
223
|
+
},
|
|
224
|
+
warnUserEmailHistInvalid: {
|
|
225
|
+
eng: `The email format of this user is invalid (existing data, not caused by this edit). This does not block saving.`,
|
|
226
|
+
cht: `此使用者的 Email 格式錯誤(既有資料,並非本次編輯造成),不影響儲存。`,
|
|
227
|
+
},
|
|
228
|
+
//刪除群組/權限前之確認(規則帳本 R-PRINCIPLE-00 c、d、原則 6、適用表 n; ADR-036; src/js/getDelRefCount.mjs:getDelConfirmText): 刪除時引用它之引用端(群組頁為使用者 cgrups、權限頁為群組 cpemis)於同一次寫入內被連帶清理(移除該引用),
|
|
229
|
+
//故不再是「授權被收回」: 其中以 AND 引用者, 引用被移除後其 AND 限制解除, 授權可能變多. 單一框、單一問句, 依下列三個數量組合選鍵:
|
|
230
|
+
// {n} 為將被移除引用之引用端數(任何 mode、含停用項目); {m} 為其中以 AND 引用者(限制解除); {w} 為引用的名稱有多筆同名(歷史同名)而只刪其一(各候選之交集變寬)之引用端數(名稱仍有實體, 不清理, 不計入 {n})
|
|
231
|
+
// confirmDelRefs(n)、confirmDelRefsAnd(n、m)、confirmDelRefsDup(n、w)、confirmDelRefsAndDup(n、m、w); confirmDelDupRefs 僅有 w, 其 {n} 即 w 之數量
|
|
232
|
+
confirmDelRefsGrup: {
|
|
233
|
+
eng: `The reference to the selected group(s) will be removed from {n} user(s). Delete anyway?`,
|
|
234
|
+
cht: `將自 {n} 位使用者移除對所選群組的引用。確定刪除?`,
|
|
235
|
+
},
|
|
236
|
+
confirmDelRefsPemi: {
|
|
237
|
+
eng: `The reference to the selected permission(s) will be removed from {n} group(s). Delete anyway?`,
|
|
238
|
+
cht: `將自 {n} 個群組移除對所選權限的引用。確定刪除?`,
|
|
239
|
+
},
|
|
240
|
+
confirmDelRefsAndGrup: {
|
|
241
|
+
eng: `The reference to the selected group(s) will be removed from {n} user(s). For the {m} user(s) that refer to it with AND, the restriction will be lifted and their authorization may increase. Delete anyway?`,
|
|
242
|
+
cht: `將自 {n} 位使用者移除對所選群組的引用;其中 {m} 位以 AND 引用,移除後其限制解除,授權可能變多。確定刪除?`,
|
|
243
|
+
},
|
|
244
|
+
confirmDelRefsAndPemi: {
|
|
245
|
+
eng: `The reference to the selected permission(s) will be removed from {n} group(s). For the {m} group(s) that refer to it with AND, the restriction will be lifted and their authorization may increase. Delete anyway?`,
|
|
246
|
+
cht: `將自 {n} 個群組移除對所選權限的引用;其中 {m} 個以 AND 引用,移除後其限制解除,授權可能變多。確定刪除?`,
|
|
247
|
+
},
|
|
248
|
+
confirmDelDupRefsGrup: {
|
|
249
|
+
eng: `{n} user(s) refer to a group name that is shared by several groups. If you delete one of them, those users' authorization may increase. Delete anyway?`,
|
|
250
|
+
cht: `有 {n} 位使用者引用的群組名稱有多筆同名資料,刪除其中一筆後,其授權可能變多。確定刪除?`,
|
|
251
|
+
},
|
|
252
|
+
confirmDelDupRefsPemi: {
|
|
253
|
+
eng: `{n} group(s) refer to a permission name that is shared by several permissions. If you delete one of them, the authorization of those groups may increase. Delete anyway?`,
|
|
254
|
+
cht: `有 {n} 個群組引用的權限名稱有多筆同名資料,刪除其中一筆後,其授權可能變多。確定刪除?`,
|
|
255
|
+
},
|
|
256
|
+
confirmDelRefsDupGrup: {
|
|
257
|
+
eng: `The reference to the selected group(s) will be removed from {n} user(s). Also, {w} user(s) refer to a group name that is shared by several groups; if you delete one of them, those users' authorization may increase. Delete anyway?`,
|
|
258
|
+
cht: `將自 {n} 位使用者移除對所選群組的引用;另有 {w} 位使用者引用的群組名稱有多筆同名資料,刪除其中一筆後,其授權可能變多。確定刪除?`,
|
|
259
|
+
},
|
|
260
|
+
confirmDelRefsDupPemi: {
|
|
261
|
+
eng: `The reference to the selected permission(s) will be removed from {n} group(s). Also, {w} group(s) refer to a permission name that is shared by several permissions; if you delete one of them, the authorization of those groups may increase. Delete anyway?`,
|
|
262
|
+
cht: `將自 {n} 個群組移除對所選權限的引用;另有 {w} 個群組引用的權限名稱有多筆同名資料,刪除其中一筆後,其授權可能變多。確定刪除?`,
|
|
263
|
+
},
|
|
264
|
+
confirmDelRefsAndDupGrup: {
|
|
265
|
+
eng: `The reference to the selected group(s) will be removed from {n} user(s). For the {m} user(s) that refer to it with AND, the restriction will be lifted and their authorization may increase. Also, {w} user(s) refer to a group name that is shared by several groups; if you delete one of them, those users' authorization may increase. Delete anyway?`,
|
|
266
|
+
cht: `將自 {n} 位使用者移除對所選群組的引用,其中 {m} 位以 AND 引用,移除後其限制解除,授權可能變多;另有 {w} 位使用者引用的群組名稱有多筆同名資料,刪除其中一筆後,其授權可能變多。確定刪除?`,
|
|
267
|
+
},
|
|
268
|
+
confirmDelRefsAndDupPemi: {
|
|
269
|
+
eng: `The reference to the selected permission(s) will be removed from {n} group(s). For the {m} group(s) that refer to it with AND, the restriction will be lifted and their authorization may increase. Also, {w} group(s) refer to a permission name that is shared by several permissions; if you delete one of them, the authorization of those groups may increase. Delete anyway?`,
|
|
270
|
+
cht: `將自 {n} 個群組移除對所選權限的引用,其中 {m} 個以 AND 引用,移除後其限制解除,授權可能變多;另有 {w} 個群組引用的權限名稱有多筆同名資料,刪除其中一筆後,其授權可能變多。確定刪除?`,
|
|
271
|
+
},
|
|
272
|
+
//儲存前之引用連帶預覽(ADR-036; src/js/getCascadePreview.mjs): 群組/權限改名時, 引用它之引用端(使用者 cgrups/群組 cpemis)於同一次寫入內連帶改名; 標的頁刪除或改 id 時, 引用它之權限 crules 項目被連帶清理(標的 id 即名稱, 改 id 不級聯).
|
|
273
|
+
//{n} 為受影響之引用端數、{list} 為名單(改名為「舊→新」, 至多 5 個, 其餘以 cascadeListMore 帶總數)、{e} 為其中來源為外部應用(from 非空)者
|
|
274
|
+
confirmSaveRenameRefsGrup: {
|
|
275
|
+
eng: `After saving, the group references of {n} user(s) will be updated to the new names of these renamed group(s): {list}. Continue?`,
|
|
276
|
+
cht: `儲存後將一併更新 {n} 位使用者對下列已改名群組的引用:{list}。是否繼續?`,
|
|
277
|
+
},
|
|
278
|
+
confirmSaveRenameRefsExtGrup: {
|
|
279
|
+
eng: `After saving, the group references of {n} user(s) will be updated to the new names of these renamed group(s): {list}. The source of {e} of them is an external application; their references may be overwritten by external data at the next external sync. Continue?`,
|
|
280
|
+
cht: `儲存後將一併更新 {n} 位使用者對下列已改名群組的引用:{list}。其中 {e} 位來源為外部應用,下次外部同步時可能被外部資料覆寫。是否繼續?`,
|
|
281
|
+
},
|
|
282
|
+
confirmSaveRenameRefsPemi: {
|
|
283
|
+
eng: `After saving, the permission references of {n} group(s) will be updated to the new names of these renamed permission(s): {list}. Continue?`,
|
|
284
|
+
cht: `儲存後將一併更新 {n} 個群組對下列已改名權限的引用:{list}。是否繼續?`,
|
|
285
|
+
},
|
|
286
|
+
confirmSaveRenameRefsExtPemi: {
|
|
287
|
+
eng: `After saving, the permission references of {n} group(s) will be updated to the new names of these renamed permission(s): {list}. The source of {e} of them is an external application; their references may be overwritten by external data at the next external sync. Continue?`,
|
|
288
|
+
cht: `儲存後將一併更新 {n} 個群組對下列已改名權限的引用:{list}。其中 {e} 個來源為外部應用,下次外部同步時可能被外部資料覆寫。是否繼續?`,
|
|
289
|
+
},
|
|
290
|
+
confirmSaveDelRefsTarget: {
|
|
291
|
+
eng: `The settings for the following target(s) (deleted or renamed) will be removed from the rules of {n} permission(s): {list}. Save anyway?`,
|
|
292
|
+
cht: `將自 {n} 個權限的規則移除對下列管控對象的設定(已刪除或已改名):{list}。確定儲存?`,
|
|
293
|
+
},
|
|
294
|
+
cascadeListMore: { //名單超過 5 個時附於其後, {n} 為總數
|
|
295
|
+
eng: `… ({n} in total)`,
|
|
296
|
+
cht: `…等 {n} 個`,
|
|
297
|
+
},
|
|
298
|
+
//儲存成功且有引用端因改名被連帶更新時之成功訊息(只描述改名; 群組頁/權限頁): {n} 為前端 store 之預覽筆數(nRenameHolders, 伺服端以實際為準);
|
|
299
|
+
//無改名連帶時、刪除所致之連帶清理(筆數已於刪除確認框告知)與標的頁, 一律維持原成功訊息(grupSaveGrupsSuccess/pemiSavePemisSuccess/targetSaveTargetsSuccess)
|
|
300
|
+
grupSaveGrupsSuccessCascade: {
|
|
301
|
+
eng: `Save permission groups successfully. The group references of {n} user(s) were updated to the new name(s).`,
|
|
302
|
+
cht: `儲存權限群組數據成功,已將 {n} 位使用者對已改名群組的引用一併更新為新名稱。`,
|
|
303
|
+
},
|
|
304
|
+
pemiSavePemisSuccessCascade: {
|
|
305
|
+
eng: `Save permissions successfully. The permission references of {n} group(s) were updated to the new name(s).`,
|
|
306
|
+
cht: `儲存權限數據成功,已將 {n} 個群組對已改名權限的引用一併更新為新名稱。`,
|
|
307
|
+
},
|
|
308
|
+
//@@U2-KEYS
|
|
309
|
+
//@@S-KEYS
|
|
310
|
+
//@@M-KEYS
|
|
311
|
+
relationRowsStale: { //反向關聯對話框存檔時, 對話框內有列所對應的使用者/群組已被刪除或改名而整次拒存(規則帳本 R-REL-PAIR-01, ADR-032); {names} 為受影響之名稱
|
|
312
|
+
eng: `Not saved: the list changed while this dialog was open (removed or renamed: {names}). Nothing was changed. Please close this dialog, reload the page and try again.`,
|
|
313
|
+
cht: `未儲存:此對話框開啟期間清單已有異動(已刪除或改名:{names})。資料未變更,請關閉對話框並重新整理頁面後再操作。`,
|
|
314
|
+
},
|
|
315
|
+
//@@UI1-KEYS
|
|
316
|
+
//F-23/F-26 清單頁(標的/權限/群組/使用者)之外部列與外部同步提示(R-PRINCIPLE-00 原則 3「收嚴+提示」、原則 5; R-EXT-OWN-01; ADR-037; src/js/externalUi.mjs、src/js/getAddImpact.mjs):
|
|
317
|
+
// externalRowLocked 外部列首欄鎖頭圖示之 tooltip({from} 為來源); externalRowsNotice/externalRowsNoticeTarget 清單上方提示({n} 為外部列數; 標的無指派欄故另一鍵);
|
|
318
|
+
// syncWarnIdRenumber 外部同步疑似來源鍵(srcKey)重編之警示({from} 來源、{n} 筆數; 口徑:同名異 srcKey, perm-run04 起文案同此口徑); externalRowDelBlocked 勾選含外部列而被略過之提示({n}); nameUsedByExternal 後台列與外部列撞名之儲存前提示({name}、{from});
|
|
319
|
+
// confirmAddRefs* 新增撞「懸空名」(仍被啟用中之引用指向、查無實體)之確認: {list} 新名稱(至多 5 個)、{n} 受影響之引用端數、{m} 其中以 AND 引用者(標的之 crules 項目無 mode, 無 AND 句)
|
|
320
|
+
externalRowLocked: {
|
|
321
|
+
eng: `Synchronized from external source "{from}". Read-only here.`,
|
|
322
|
+
cht: `由外部來源「{from}」同步,於此為唯讀。`,
|
|
323
|
+
},
|
|
324
|
+
externalRowsNotice: {
|
|
325
|
+
eng: `{n} row(s) are synchronized from an external source. Their identity fields are read-only and they cannot be deleted here; only their assignment settings can be changed.`,
|
|
326
|
+
cht: `有 {n} 筆資料由外部來源同步。其身分欄位於此為唯讀且不可刪除,僅可修改其授權指派設定。`,
|
|
327
|
+
},
|
|
328
|
+
externalRowsNoticeTarget: {
|
|
329
|
+
eng: `{n} row(s) are synchronized from an external source. They are read-only and cannot be deleted here.`,
|
|
330
|
+
cht: `有 {n} 筆資料由外部來源同步,於此為唯讀且不可刪除。`,
|
|
331
|
+
},
|
|
332
|
+
syncWarnIdRenumber: { //perm-run04 起口徑為「同名異來源鍵(srcKey)」(外部匯入依 srcKey 差異同步, 外部端不得送 id); 鍵名沿用以免動前端接線
|
|
333
|
+
eng: `The external source "{from}" appears to have renumbered its source keys ({n} item(s) now carry a name that previously belonged to an item with a different source key). Each synchronization removes the old items and cleans up the references to them, which may erase the assignments made here. Please ask the source to keep the srcKey of each item stable.`,
|
|
334
|
+
cht: `外部來源「{from}」疑似重編來源鍵(有 {n} 筆項目的名稱,先前屬於不同來源鍵之項目)。每次同步會移除舊項目並連帶清理其引用,可能抹掉在此做的指派。請來源端保持來源鍵(srcKey)穩定。`,
|
|
335
|
+
},
|
|
336
|
+
externalRowDelBlocked: {
|
|
337
|
+
eng: `{n} selected row(s) are synchronized from an external source and cannot be deleted here. They were skipped.`,
|
|
338
|
+
cht: `所選資料中有 {n} 筆由外部來源同步,無法在此刪除,已略過。`,
|
|
339
|
+
},
|
|
340
|
+
nameUsedByExternal: {
|
|
341
|
+
eng: `External source "{from}" already uses the name "{name}".`,
|
|
342
|
+
cht: `外部來源「{from}」已使用此名稱「{name}」。`,
|
|
343
|
+
},
|
|
344
|
+
confirmAddRefsGrup: {
|
|
345
|
+
eng: `Adding the group(s) "{list}": {n} user(s) already refer to the name, so after saving they will get (or be limited by) the permissions of the new group(s). Add anyway?`,
|
|
346
|
+
cht: `新增群組「{list}」後,將有 {n} 位使用者取得或受此群組限制(其授權設定原已引用此名稱)。確定新增?`,
|
|
347
|
+
},
|
|
348
|
+
confirmAddRefsAndGrup: {
|
|
349
|
+
eng: `Adding the group(s) "{list}": {n} user(s) already refer to the name, so after saving they will get (or be limited by) the permissions of the new group(s); {m} of them refer to it with AND. Add anyway?`,
|
|
350
|
+
cht: `新增群組「{list}」後,將有 {n} 位使用者(其中 {m} 位以 AND 引用)取得或受此群組限制(其授權設定原已引用此名稱)。確定新增?`,
|
|
351
|
+
},
|
|
352
|
+
confirmAddRefsPemi: {
|
|
353
|
+
eng: `Adding the permission(s) "{list}": {n} group(s) already refer to the name, so after saving they will get (or be limited by) the new permission(s). Add anyway?`,
|
|
354
|
+
cht: `新增權限「{list}」後,將有 {n} 個群組取得或受此權限限制(其授權設定原已引用此名稱)。確定新增?`,
|
|
355
|
+
},
|
|
356
|
+
confirmAddRefsAndPemi: {
|
|
357
|
+
eng: `Adding the permission(s) "{list}": {n} group(s) already refer to the name, so after saving they will get (or be limited by) the new permission(s); {m} of them refer to it with AND. Add anyway?`,
|
|
358
|
+
cht: `新增權限「{list}」後,將有 {n} 個群組(其中 {m} 個以 AND 引用)取得或受此權限限制(其授權設定原已引用此名稱)。確定新增?`,
|
|
359
|
+
},
|
|
360
|
+
confirmAddRefsTarget: {
|
|
361
|
+
eng: `Adding the target(s) "{list}": the rules of {n} permission(s) already contain settings for the name, so after saving those settings will take effect for the new target(s). Add anyway?`,
|
|
362
|
+
cht: `新增管控對象「{list}」後,將有 {n} 個權限的規則取得此管控對象的設定(其規則原已寫有此名稱)。確定新增?`,
|
|
152
363
|
},
|
|
153
364
|
saveInProgress: { //同一操作者之同表儲存處理中再送出 (ADR-025)
|
|
154
365
|
eng: `The previous save is still in progress. Please do not submit again.`,
|
|
@@ -172,6 +383,126 @@ let kpLang = {
|
|
|
172
383
|
eng: `Not all changes were written, and some may have taken effect. Please reload the page and check before making changes.`,
|
|
173
384
|
cht: `資料寫入未全部完成,部分變更可能已生效,請重新整理頁面確認後再操作`,
|
|
174
385
|
},
|
|
386
|
+
//引用連帶(改名級聯/刪除連帶清理; R-PRINCIPLE-00 原則 6、適用表 m/n; R-REF-CASCADE-01): 伺服端預檢被拒(零變更)之固定訊息, 動態細節只入 srLog
|
|
387
|
+
renameCascadeDupGroup: {
|
|
388
|
+
eng: `Not saved: a renamed item shares its old name with other existing items, so the references to it cannot be updated safely. Nothing was changed. Please delete or rename the duplicates first (save them separately), then rename it.`,
|
|
389
|
+
cht: `未儲存:被改名的項目與其他既有項目同名,無法安全地連帶更新引用。資料未變更。請先清理同名項目(分次儲存)後再改名。`,
|
|
390
|
+
},
|
|
391
|
+
renameCascadeNameInUse: {
|
|
392
|
+
eng: `Not saved: a new name is still referenced by settings of items that no longer exist, so the renamed item would take over those references. Nothing was changed. Please clean up the dangling references first, or choose another name.`,
|
|
393
|
+
cht: `未儲存:新名稱仍被已不存在之項目的授權設定引用,改名後會被這些引用接管。資料未變更。請先清理懸空引用,或改用其他名稱。`,
|
|
394
|
+
},
|
|
395
|
+
renameCascadeConflict: {
|
|
396
|
+
eng: `Not saved: a setting contains both the old and the new name, so its references cannot be updated automatically. Nothing was changed.`,
|
|
397
|
+
cht: `未儲存:有授權設定同時含有舊名稱與新名稱,無法自動更新引用。資料未變更。`,
|
|
398
|
+
},
|
|
399
|
+
renameCascadeUnsupported: {
|
|
400
|
+
eng: `Not saved: a setting that refers to the renamed or deleted item contains a value that cannot be safely rewritten (such as a non-finite number), so its references cannot be updated automatically. Nothing was changed. Please fix that setting first.`,
|
|
401
|
+
cht: `未儲存:引用此項目之授權設定含有無法安全改寫的內容(如非有限數值),無法自動更新引用。資料未變更,請先修正該授權設定。`,
|
|
402
|
+
},
|
|
403
|
+
saveCascadePartial: {
|
|
404
|
+
eng: `The related references may be out of sync with this change (the automatic restore failed). Please do not make further changes and contact the system administrator to run the reference audit.`,
|
|
405
|
+
cht: `相關的授權引用可能與本次變更不一致(自動還原失敗)。請勿再變更資料,並通知系統管理者執行引用稽核。`,
|
|
406
|
+
},
|
|
407
|
+
//F-23/F-26(外部列保護與過期快照; R-PRINCIPLE-00 原則 3、5; R-EXT-OWN-01、R-BASELINE-01, ADR-037): 後台整表寫入被拒(零變更)之固定訊息, 動態細節(來源、筆數、原因)只入 srLog
|
|
408
|
+
saveFromNotAllowed: {
|
|
409
|
+
eng: `Not saved: rows saved here must have an empty "From" value (rows with a source are managed by the external source). Nothing was changed.`,
|
|
410
|
+
cht: `未儲存:於此儲存之列其「來源」須為空白(有來源之列由外部來源管理)。資料未變更。`,
|
|
411
|
+
},
|
|
412
|
+
saveExternalRowChanged: {
|
|
413
|
+
eng: `Not saved: rows synchronized from an external source cannot be deleted here, and only their assignment settings can be changed. Nothing was changed. Please change them at the external source.`,
|
|
414
|
+
cht: `未儲存:由外部來源同步之列不可在此刪除,且僅能修改其授權指派設定。資料未變更,請至外部來源端處理。`,
|
|
415
|
+
},
|
|
416
|
+
saveStale: {
|
|
417
|
+
eng: `Not saved: the data changed (by someone else or by an external synchronization) after this page was loaded. Nothing was changed. Please reload the page and try again.`,
|
|
418
|
+
cht: `未儲存:載入此頁面後資料已被他人或外部同步更新。資料未變更,請重新整理頁面後再操作。`,
|
|
419
|
+
},
|
|
420
|
+
//R-PRINCIPLE-00 原則 7(多人同時編輯, 2026-10-22; ADR-037 Update run11): 有未存編輯時他人或外部同步改了本表 → 清單頁保留草稿並顯示 staleDraftNotice(附「重新載入」鈕 staleDraftReload);
|
|
421
|
+
//反向關聯對話框(開框後資料已被更新)顯示 staleDraftNoticeDialog. 存檔時由伺服端以表雜湊比對拒收, 訊息仍為 saveStale(不改其文字)
|
|
422
|
+
staleDraftNotice: {
|
|
423
|
+
eng: `The data was updated by someone else or by an external synchronization after you started editing. Your unsaved edits are kept here, but saving now will be rejected. Click "Reload" to get the latest data (your unsaved edits will be discarded).`,
|
|
424
|
+
cht: `資料已被他人或外部同步更新。您尚未儲存的編輯仍保留於此,但現在儲存將被拒絕。請按「重新載入」取得最新資料(未儲存的編輯將被捨棄)。`,
|
|
425
|
+
},
|
|
426
|
+
staleDraftReload: {
|
|
427
|
+
eng: `Reload`,
|
|
428
|
+
cht: `重新載入`,
|
|
429
|
+
},
|
|
430
|
+
staleDraftNoticeDialog: {
|
|
431
|
+
eng: `The data was updated by someone else or by an external synchronization after this window was opened. Saving from this window will be rejected. Please close this window and open it again to get the latest data.`,
|
|
432
|
+
cht: `資料已被他人或外部同步更新,本視窗內的資料已過期,儲存將被拒絕。請關閉本視窗後重新開啟,以取得最新資料。`,
|
|
433
|
+
},
|
|
434
|
+
saveBaselineRequired: {
|
|
435
|
+
eng: `Not saved: changing the assignment settings of rows synchronized from an external source requires the latest loaded data, which this request did not carry. Nothing was changed. Please reload the page and try again.`,
|
|
436
|
+
cht: `未儲存:修改外部來源同步列之授權指派設定須附載入時之資料版本,此次請求未附。資料未變更,請重新整理頁面後再操作。`,
|
|
437
|
+
},
|
|
438
|
+
//perm-run01(多人同時編輯共用核心; 規則帳本 R-BASELINE-01、R-SUBJECT-ID-01; ADR-037 Update):
|
|
439
|
+
// saveBaselineFormat 基準格式或版本不識(升級前開啟之舊頁面所帶之套內舊版指紋, 或損壞之基準)→ 拒收、零寫入、提示重新載入(不降級為不帶基準; 原則 3);
|
|
440
|
+
// relSubjectChangedGrup/relSubjectChangedPemi 反向關聯對話框存檔時, 主體(群組/權限)已被刪除、改名或刪除後以同名重建(id 不同)→ 拒收、零寫入、提示重新載入(原則 3、6; 引用以名稱為準, 主體身分變了即引用會指向另一個實體); {name} 為開框時之主體名稱
|
|
441
|
+
saveBaselineFormat: {
|
|
442
|
+
eng: `Not saved: this page was opened with a different version of the system and its data version cannot be recognized. Nothing was changed. Please reload the page and try again.`,
|
|
443
|
+
cht: `未儲存:此頁面是以不同版本載入,其資料版本無法辨識。資料未變更,請重新整理頁面後再操作。`,
|
|
444
|
+
},
|
|
445
|
+
relSubjectChangedGrup: {
|
|
446
|
+
eng: `Not saved: the group "{name}" this window was opened for has been deleted, renamed or replaced by another group since then. Nothing was changed. Please close this window, reload the page and try again.`,
|
|
447
|
+
cht: `未儲存:本視窗所編輯的群組「{name}」自開啟後已被刪除、改名或被另一個群組取代。資料未變更,請關閉本視窗並重新整理頁面後再操作。`,
|
|
448
|
+
},
|
|
449
|
+
relSubjectChangedPemi: {
|
|
450
|
+
eng: `Not saved: the permission "{name}" this window was opened for has been deleted, renamed or replaced by another permission since then. Nothing was changed. Please close this window, reload the page and try again.`,
|
|
451
|
+
cht: `未儲存:本視窗所編輯的權限「{name}」自開啟後已被刪除、改名或被另一個權限取代。資料未變更,請關閉本視窗並重新整理頁面後再操作。`,
|
|
452
|
+
},
|
|
453
|
+
//perm-run02 範圍一(被引用實體身分; 規則帳本 R-SUBJECT-ID-01、R-REF-IDENTITY-01; ADR-037 Update(perm-run02)):
|
|
454
|
+
// saveSubjectChanged 反向關聯對話框存檔時, 伺服端於引用表鎖內新鮮讀取發現主體(群組/權限)已被刪除、改名或刪除後以同名重建(id 不同)→ 拒收、零寫入、提示重新載入(原則 3、4、6; 前端同判準先擋, 此為伺服端強制之固定訊息, 不含名稱);
|
|
455
|
+
// saveRefChanged 清單頁存檔時, 新增之啟用引用項所指的群組/權限/標的已被刪除、刪除後以同名重建(id 不同)、新增了同名實體, 或引用宣告不完整 → 拒收、零寫入、提示重新載入(不得把授權寫到同名新實體);
|
|
456
|
+
// saveIdentityFormat 身分宣告格式不合或該表無授權引用欄 → 拒收(不降級為不帶宣告)
|
|
457
|
+
saveSubjectChanged: {
|
|
458
|
+
eng: `Not saved: the group or permission this window was opened for has been deleted, renamed or replaced by another one since then. Nothing was changed. Please close this window, reload the page and try again.`,
|
|
459
|
+
cht: `未儲存:本視窗所編輯的群組或權限自開啟後已被刪除、改名或被另一個取代。資料未變更,請關閉本視窗並重新整理頁面後再操作。`,
|
|
460
|
+
},
|
|
461
|
+
saveRefChanged: {
|
|
462
|
+
eng: `Not saved: a group, permission or target you just assigned has been deleted or replaced by another one with the same name since this page was loaded. Nothing was changed. Please reload the page and try again.`,
|
|
463
|
+
cht: `未儲存:您剛指派的群組、權限或標的在載入此頁面後已被刪除,或被同名的另一個取代。資料未變更,請重新整理頁面後再操作。`,
|
|
464
|
+
},
|
|
465
|
+
saveIdentityFormat: {
|
|
466
|
+
eng: `Not saved: the identity information carried by this request is invalid. Nothing was changed. Please reload the page and try again.`,
|
|
467
|
+
cht: `未儲存:此次請求所附之身分資訊無效。資料未變更,請重新整理頁面後再操作。`,
|
|
468
|
+
},
|
|
469
|
+
//perm-run03 範圍一(被引用實體身分宣告改為強制必帶; 使用者 2026-10-23 裁示「這本來就該強制必帶吧? 要不然怎麼確認與驗證調用者身份?」; 規則帳本 R-REF-IDENTITY-01 規則 7、R-SUBJECT-ID-01 規則 5):
|
|
470
|
+
// saveIdentityRequired 存檔改變了引用(新增或移除啟用之引用項、新增列帶引用), 但請求未附(或未附完整)被引用實體之身分宣告 → 拒收、零寫入、提示重新載入(舊頁面或自寫客戶端未附宣告; 固定訊息, 不含名稱)
|
|
471
|
+
saveIdentityRequired: {
|
|
472
|
+
eng: `Not saved: the data was updated or this page is out of date (the request did not carry the identity of the groups, permissions or targets it changes). Nothing was changed. Please reload the page and try again.`,
|
|
473
|
+
cht: `未儲存:資料已更新或頁面過舊(此次請求未附所異動之群組、權限或標的之身分資訊)。資料未變更,請重新整理頁面後再操作。`,
|
|
474
|
+
},
|
|
475
|
+
//perm-run03 範圍四(寫入函數之角色檢查; dspec/使用者身分驗證原則.md 二.4): userNotAdmin 呼叫 updateTargets/updatePemis/updateGrups/updateUsers 者不是 perm users 表中有效之系統管理員(isAdmin='y') → 拒收、零寫入
|
|
476
|
+
userNotAdmin: {
|
|
477
|
+
eng: `Only system administrators can change this data`,
|
|
478
|
+
cht: `僅系統管理員可變更此資料`,
|
|
479
|
+
},
|
|
480
|
+
//perm-run03 範圍二(外部匯入改依來源鍵 srcKey 差異同步; dspec/外部匯入之定義與機制.md 第 9 節):
|
|
481
|
+
// srcKeyInvalid 批次內有列缺 srcKey、srcKey 為空或非字串(含長度/字元不合) → 整批拒收、零寫入; srcKeyDuplicate 同批 srcKey 重複 → 整批拒收;
|
|
482
|
+
// idNotAllowed 批次內有列帶 id(內部主鍵由本系統產生, 外部不得指定) → 整批拒收; srcKeyConflict 同 from 庫內有重複 srcKey(資料異常), 或同一 srcKey 被兩個庫內列主張(一個已有 srcKey、一個以 id 主張)而無法唯一配對 → 整批拒收、零寫入並提示人工處置(以 g_purgeFrom.mjs 清源後重匯入);
|
|
483
|
+
// loginIdCollision(perm-run04, 規則帳本 R-MAPKEY-04/R-MAPKEY-05; 規格第 9 節末 O1): mappingBy='id' 時外部列以 srcKey、後台列以 id 對應外部 token 之使用者 id; 登入識別值於兩列相同即撞值(登入會同時匹配多筆),
|
|
484
|
+
// perm-run05 起「不論 isActive」「含他來源外部列」(後台列 id↔外部列 srcKey、外部列 srcKey↔他來源外部列 srcKey), 訊息須同時涵蓋後台存檔與外部匯入兩種讀者並提示改用可唯一對應之鍵;
|
|
485
|
+
// 匯入批次(整批拒收、零寫入)與後台存檔(整次拒收、零變更)皆回此鍵, 登入時命中多筆另回 ambiguousUserFromPerm; 固定訊息, 不回顯 srcKey 與 id
|
|
486
|
+
srcKeyInvalid: {
|
|
487
|
+
eng: `Invalid srcKey: every row must carry a non-empty string srcKey`,
|
|
488
|
+
cht: `來源鍵 srcKey 無效:每列都須帶非空字串之 srcKey`,
|
|
489
|
+
},
|
|
490
|
+
srcKeyDuplicate: {
|
|
491
|
+
eng: `Duplicate srcKey in the batch`,
|
|
492
|
+
cht: `同一批次內來源鍵 srcKey 重複`,
|
|
493
|
+
},
|
|
494
|
+
idNotAllowed: {
|
|
495
|
+
eng: `The id is generated by this system and must not be provided`,
|
|
496
|
+
cht: `內部主鍵 id 由本系統產生,外部不得提供`,
|
|
497
|
+
},
|
|
498
|
+
srcKeyConflict: {
|
|
499
|
+
eng: `The existing data of this source cannot be matched uniquely by srcKey. Nothing was changed. Please contact the administrator`,
|
|
500
|
+
cht: `此來源之既有資料無法依 srcKey 唯一配對。資料未變更,請聯絡管理員處置`,
|
|
501
|
+
},
|
|
502
|
+
loginIdCollision: {
|
|
503
|
+
eng: `Nothing was changed: a login identifier (the id of an administrator-managed user, or the srcKey of a user synchronized from an external source) is also used by another user or another source, whether or not either user is enabled, so a login by id would match more than one user. Please use a value that identifies the user uniquely, or ask the deployer to map users by another unique key (for example the email)`,
|
|
504
|
+
cht: `資料未變更:有一筆資料的登入識別(後台使用者的 id,或外部同步使用者的 srcKey)與其他使用者或其他來源的相同(不論是否停用),依 id 登入時會同時符合多位使用者。請改用可唯一對應使用者的值,或請部署方改以其他可唯一對應的鍵(例如 email)進行對應`,
|
|
505
|
+
},
|
|
175
506
|
cannotGetUserId: {
|
|
176
507
|
eng: `Cannot get the user id`,
|
|
177
508
|
cht: `無法取得使用者 Id`,
|
|
@@ -200,6 +531,10 @@ let kpLang = {
|
|
|
200
531
|
eng: `Cannot find the user in permission system`,
|
|
201
532
|
cht: `無法於權限系統取得使用者`,
|
|
202
533
|
},
|
|
534
|
+
ambiguousUserFromPerm: { //登入查找: 以對應鍵(mappingBy)查 perm users(isActive='y')命中多於 1 筆, 拒絕而不取首筆(規則帳本 R-MAPKEY-02, ADR-034); 訊息不含使用者之對應值
|
|
535
|
+
eng: `Cannot identify the user in permission system: more than one active user matches`,
|
|
536
|
+
cht: `無法於權限系統確認使用者:有多位有效使用者符合`,
|
|
537
|
+
},
|
|
203
538
|
userNoPermission: {
|
|
204
539
|
eng: `User does not have permission`,
|
|
205
540
|
cht: `使用者權限不足`,
|
package/server/provideTabs.mjs
CHANGED
|
@@ -6,8 +6,10 @@ import fetchJson from '../src/fetchJson.mjs'
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
//kpKs
|
|
9
|
+
//perm-run03 起外部匯入依來源鍵 srcKey 差異同步(R-IMPORT-01、dspec/外部匯入之定義與機制.md): 每列須帶外部自訂之 srcKey(同一 from 內唯一且穩定), **不得送出 id**(內部主鍵由本系統產生, 送 id 整批拒收 idNotAllowed);
|
|
10
|
+
//targets 之 id 即標的名稱, 外部匯入時由 srcKey 衍生(id=srcKey), 故 targets 亦只送 srcKey
|
|
9
11
|
let ks_targets = [
|
|
10
|
-
'
|
|
12
|
+
'srcKey',
|
|
11
13
|
'order', //order大部分由外部給予, 得要開啟
|
|
12
14
|
'description',
|
|
13
15
|
'from',
|
|
@@ -17,7 +19,7 @@ let ks_targets = [
|
|
|
17
19
|
// 'timeUpdate',
|
|
18
20
|
]
|
|
19
21
|
let ks_pemis = [
|
|
20
|
-
'
|
|
22
|
+
'srcKey',
|
|
21
23
|
'order', //order大部分由外部給予, 得要開啟
|
|
22
24
|
'name',
|
|
23
25
|
'description',
|
|
@@ -29,7 +31,7 @@ let ks_pemis = [
|
|
|
29
31
|
// 'timeUpdate',
|
|
30
32
|
]
|
|
31
33
|
let ks_grups = [
|
|
32
|
-
'
|
|
34
|
+
'srcKey',
|
|
33
35
|
'order', //order大部分由外部給予, 得要開啟
|
|
34
36
|
'name',
|
|
35
37
|
'description',
|
|
@@ -41,7 +43,7 @@ let ks_grups = [
|
|
|
41
43
|
// 'timeUpdate',
|
|
42
44
|
]
|
|
43
45
|
let ks_users = [
|
|
44
|
-
'
|
|
46
|
+
'srcKey',
|
|
45
47
|
'order', //order大部分由外部給予, 得要開啟
|
|
46
48
|
'name',
|
|
47
49
|
'email',
|