@arcblock/did-connect-service 4.1.42 → 4.1.44
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 +3 -3
- package/dist/assets/{admin-core.d42d34ce.js → admin-core.6e3d6ce9.js} +22 -19
- package/dist/assets/{admin-extra.da2c9785.js → admin-extra.82aff2c7.js} +1 -1
- package/dist/assets/{admin.d99b416e.css → admin.314473a7.css} +3 -1
- package/dist/handlers/auth-handler.d.ts.map +1 -1
- package/dist/handlers/auth-handler.js +2 -0
- package/dist/handlers/auth-handler.js.map +1 -1
- package/dist/handlers/branding-handler.d.ts.map +1 -1
- package/dist/handlers/branding-handler.js +5 -41
- package/dist/handlers/branding-handler.js.map +1 -1
- package/dist/handlers/did-connect-handler.d.ts.map +1 -1
- package/dist/handlers/did-connect-handler.js +2 -0
- package/dist/handlers/did-connect-handler.js.map +1 -1
- package/dist/handlers/email-login-handler.d.ts.map +1 -1
- package/dist/handlers/email-login-handler.js +1 -0
- package/dist/handlers/email-login-handler.js.map +1 -1
- package/dist/handlers/oauth-handler.d.ts.map +1 -1
- package/dist/handlers/oauth-handler.js +4 -0
- package/dist/handlers/oauth-handler.js.map +1 -1
- package/dist/handlers/passkey-handler.d.ts.map +1 -1
- package/dist/handlers/passkey-handler.js +6 -2
- package/dist/handlers/passkey-handler.js.map +1 -1
- package/dist/handlers/team-handler.d.ts.map +1 -1
- package/dist/handlers/team-handler.js +1 -0
- package/dist/handlers/team-handler.js.map +1 -1
- package/dist/http/security-headers.d.ts +38 -0
- package/dist/http/security-headers.d.ts.map +1 -0
- package/dist/http/security-headers.js +67 -0
- package/dist/http/security-headers.js.map +1 -0
- package/dist/locale.d.ts +4 -1
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +11 -5
- package/dist/locale.js.map +1 -1
- package/dist/pages/admin/i18n.d.ts.map +1 -1
- package/dist/pages/admin/i18n.js +0 -4
- 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 +60 -26
- package/dist/pages/admin/index.js.map +1 -1
- package/dist/pages/admin/scripts/utils.d.ts +1 -1
- package/dist/pages/admin/scripts/utils.d.ts.map +1 -1
- package/dist/pages/admin/scripts/utils.js +21 -0
- package/dist/pages/admin/scripts/utils.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 +3 -1
- package/dist/pages/admin/styles.js.map +1 -1
- package/dist/pages/admin/tab-members.d.ts +1 -1
- package/dist/pages/admin/tab-members.d.ts.map +1 -1
- package/dist/pages/admin/tab-members.js +1 -1
- package/dist/pages/admin/tab-profile-accounts.d.ts.map +1 -1
- package/dist/pages/admin/tab-profile-accounts.js +1 -19
- package/dist/pages/admin/tab-profile-accounts.js.map +1 -1
- package/dist/store/d1-store.d.ts +12 -1
- package/dist/store/d1-store.d.ts.map +1 -1
- package/dist/store/d1-store.js +69 -12
- package/dist/store/d1-store.js.map +1 -1
- package/dist/theme-utils.d.ts +20 -0
- package/dist/theme-utils.d.ts.map +1 -1
- package/dist/theme-utils.js +62 -0
- package/dist/theme-utils.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/migrations/0022_connected_account_last_login_domain.sql +6 -0
- package/package.json +3 -3
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { assetUrl } from "../../asset-registry.js";
|
|
8
8
|
import { DEFAULT_LANGUAGE_ROWS, resolvePageLocale } from "../../locale.js";
|
|
9
|
+
import { LEGACY_THEME_PREFER_KEY, WEB_MODE_STORAGE_KEY } from "../../theme-utils.js";
|
|
9
10
|
import { adminT, getClientI18nScript } from "./i18n.js";
|
|
10
11
|
// Client-side scripts (TOAST/UTILS/API/DIALOG/ROUTER + all tab *_SCRIPT consts) are
|
|
11
12
|
// no longer inlined here — they ship as external cacheable bundles (admin-core.js +
|
|
@@ -21,13 +22,13 @@ import { invitationsTabHtml } from "./tab-invitations.js";
|
|
|
21
22
|
import { membersTabHtml } from "./tab-members.js";
|
|
22
23
|
import { profileTabHtml } from "./tab-profile.js";
|
|
23
24
|
import { settingsTabHtml } from "./tab-settings.js";
|
|
24
|
-
const ICON_GLOBE = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none"
|
|
25
|
+
const ICON_GLOBE = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>`;
|
|
25
26
|
const ICON_MENU = `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none"><path fill="currentColor" d="M3 18h18v-2H3zm0-5h18v-2H3zm0-7v2h18V6z"/></svg>`;
|
|
26
27
|
const ICON_CLOSE = `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none"><path fill="currentColor" d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>`;
|
|
27
28
|
const ICON_CHECK = `<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="M5 13l4 4L19 7" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
const
|
|
29
|
+
// lucide sun/moon — same set as the arc AUP header so both toggles read alike
|
|
30
|
+
const ICON_MOON = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg>`;
|
|
31
|
+
const ICON_SUN = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2"/><path d="M12 20v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/><path d="M2 12h2"/><path d="M20 12h2"/><path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/></svg>`;
|
|
31
32
|
const MEMBERS_EXTRA_STYLES = /* css */ `
|
|
32
33
|
/* Action cell: relative anchor for the absolute menu */
|
|
33
34
|
.action-cell { position: relative; width: 40px; text-align: center; }
|
|
@@ -46,12 +47,13 @@ export function buildAdminPageHTML(data) {
|
|
|
46
47
|
const externalTabs = data.externalTabs || [];
|
|
47
48
|
const defaultTab = isUserPage ? "profile" : isAdmin ? "members" : isInstance ? "members" : "profile";
|
|
48
49
|
const dataThemeAttr = theme === "light" ? ' data-theme="light"' : theme === "auto" ? ' data-theme="auto"' : "";
|
|
49
|
-
// Theme icon
|
|
50
|
-
|
|
51
|
-
const
|
|
50
|
+
// Theme icon shows the effective theme (sun = light, moon = dark); click flips light ↔ dark.
|
|
51
|
+
// auto is not a clickable state — the client script resolves it against the OS before paint.
|
|
52
|
+
const themeIcon = theme === "light" ? ICON_SUN : ICON_MOON;
|
|
53
|
+
const themeTitle = theme === "light" ? t("header.themeLight") : t("header.themeDark");
|
|
52
54
|
// Pre-render theme icons/titles as JSON for client-side use (avoids esbuild variable renaming issues)
|
|
53
|
-
const themeIconsJSON = JSON.stringify({ dark: ICON_MOON, light: ICON_SUN
|
|
54
|
-
const themeTitlesJSON = JSON.stringify({ dark: t("header.themeDark"), light: t("header.themeLight")
|
|
55
|
+
const themeIconsJSON = JSON.stringify({ dark: ICON_MOON, light: ICON_SUN });
|
|
56
|
+
const themeTitlesJSON = JSON.stringify({ dark: t("header.themeDark"), light: t("header.themeLight") });
|
|
55
57
|
// Language popover items — from instance config, fallback to en+zh self-names
|
|
56
58
|
const configuredLangs = data.languages && data.languages.length > 0
|
|
57
59
|
? data.languages
|
|
@@ -242,7 +244,7 @@ function signOut() {
|
|
|
242
244
|
location.href = "/.well-known/service/api/did/logout?return_to=" + encodeURIComponent(location.pathname + location.search);
|
|
243
245
|
}
|
|
244
246
|
|
|
245
|
-
// ─── Theme: click to
|
|
247
|
+
// ─── Theme: click to flip light ↔ dark (no reload) ──────────
|
|
246
248
|
var __currentTheme = '${theme}';
|
|
247
249
|
|
|
248
250
|
function resolveEffectiveTheme(val) {
|
|
@@ -265,21 +267,50 @@ function applyThemeToDOM(theme) {
|
|
|
265
267
|
}
|
|
266
268
|
var btn = document.getElementById('theme-btn');
|
|
267
269
|
if (btn) {
|
|
268
|
-
btn.innerHTML = __themeIcons[
|
|
269
|
-
btn.title = __themeTitles[
|
|
270
|
+
btn.innerHTML = __themeIcons[effective] || '';
|
|
271
|
+
btn.title = __themeTitles[effective] || '';
|
|
270
272
|
}
|
|
271
273
|
}
|
|
272
274
|
|
|
275
|
+
var MODE_KEY = '${WEB_MODE_STORAGE_KEY}';
|
|
276
|
+
var LEGACY_KEY = '${LEGACY_THEME_PREFER_KEY}';
|
|
277
|
+
|
|
278
|
+
function readSharedMode() {
|
|
279
|
+
try {
|
|
280
|
+
var mode = localStorage.getItem(MODE_KEY);
|
|
281
|
+
if (mode === 'light' || mode === 'dark' || mode === 'auto') return mode;
|
|
282
|
+
var legacy = localStorage.getItem(LEGACY_KEY);
|
|
283
|
+
if (legacy === 'light' || legacy === 'dark') return legacy;
|
|
284
|
+
if (legacy === 'system') return 'auto';
|
|
285
|
+
} catch (e) {}
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
function clearLegacyThemeKeys() {
|
|
290
|
+
try {
|
|
291
|
+
localStorage.removeItem(LEGACY_KEY);
|
|
292
|
+
sessionStorage.removeItem(LEGACY_KEY);
|
|
293
|
+
sessionStorage.removeItem(MODE_KEY);
|
|
294
|
+
} catch (e) {}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function persistWebMode(next) {
|
|
298
|
+
document.cookie = 'did_connect_theme=' + next + ';path=/;max-age=31536000';
|
|
299
|
+
try { localStorage.setItem(MODE_KEY, next); } catch (e) {}
|
|
300
|
+
clearLegacyThemeKeys();
|
|
301
|
+
if (next === 'light' || next === 'dark') {
|
|
302
|
+
document.cookie = 'arc_mode=' + next + ';path=/;max-age=31536000;SameSite=Lax';
|
|
303
|
+
} else {
|
|
304
|
+
document.cookie = 'arc_mode=;path=/;max-age=0;SameSite=Lax';
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Two states like the arc header. From auto, flip the theme the user is actually
|
|
309
|
+
// seeing — every click must produce a visible change.
|
|
273
310
|
function switchTheme() {
|
|
274
|
-
var next = __currentTheme === 'dark' ? 'light' :
|
|
311
|
+
var next = resolveEffectiveTheme(__currentTheme) === 'dark' ? 'light' : 'dark';
|
|
275
312
|
__currentTheme = next;
|
|
276
|
-
|
|
277
|
-
// Sync with @blocklet/theme storage key so Payment Kit header and iframe content stay in sync
|
|
278
|
-
try {
|
|
279
|
-
var btp = next === 'auto' ? 'system' : next;
|
|
280
|
-
localStorage.setItem('blocklet_theme_prefer', btp);
|
|
281
|
-
sessionStorage.setItem('blocklet_theme_prefer', btp);
|
|
282
|
-
} catch(e) {}
|
|
313
|
+
persistWebMode(next);
|
|
283
314
|
applyThemeToDOM(next);
|
|
284
315
|
}
|
|
285
316
|
|
|
@@ -288,13 +319,16 @@ window.matchMedia('(prefers-color-scheme: light)').addEventListener('change', fu
|
|
|
288
319
|
if (__currentTheme === 'auto') applyThemeToDOM('auto');
|
|
289
320
|
});
|
|
290
321
|
|
|
291
|
-
//
|
|
322
|
+
// An existing web-mode (or a one-time legacy key) wins over the server-rendered
|
|
323
|
+
// cookie. Do not write the server theme into web-mode — that clobbers arc.
|
|
324
|
+
var sharedMode = readSharedMode();
|
|
325
|
+
if (sharedMode) {
|
|
326
|
+
if (sharedMode !== __currentTheme) __currentTheme = sharedMode;
|
|
327
|
+
persistWebMode(sharedMode);
|
|
328
|
+
} else {
|
|
329
|
+
clearLegacyThemeKeys();
|
|
330
|
+
}
|
|
292
331
|
applyThemeToDOM(__currentTheme);
|
|
293
|
-
try {
|
|
294
|
-
var _btp = __currentTheme === 'auto' ? 'system' : __currentTheme;
|
|
295
|
-
localStorage.setItem('blocklet_theme_prefer', _btp);
|
|
296
|
-
sessionStorage.setItem('blocklet_theme_prefer', _btp);
|
|
297
|
-
} catch(e) {}
|
|
298
332
|
|
|
299
333
|
// ─── Language popover ────────────────────────────────────────────────
|
|
300
334
|
function applyLocale(lang) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pages/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACxD,oFAAoF;AACpF,oFAAoF;AACpF,kFAAkF;AAClF,2CAA2C;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAgCpD,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pages/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACxD,oFAAoF;AACpF,oFAAoF;AACpF,kFAAkF;AAClF,2CAA2C;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAgCpD,MAAM,UAAU,GAAG,+TAA+T,CAAC;AACnV,MAAM,SAAS,GAAG,8KAA8K,CAAC;AACjM,MAAM,UAAU,GAAG,4OAA4O,CAAC;AAChQ,MAAM,UAAU,GAAG,yNAAyN,CAAC;AAC7O,8EAA8E;AAC9E,MAAM,SAAS,GAAG,8PAA8P,CAAC;AACjR,MAAM,QAAQ,GAAG,icAAic,CAAC;AAEnd,MAAM,oBAAoB,GAAG,SAAS,CAAC;;;CAGtC,CAAC;AAGF,MAAM,UAAU,kBAAkB,CAAC,IAAmB;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;IACnC,MAAM,CAAC,GAAG,CAAC,GAAW,EAAE,MAA+B,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;IACrC,6DAA6D;IAC7D,MAAM,OAAO,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,OAAO,CAAC;IACxB,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,MAAM,aAAa,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/G,6FAA6F;IAC7F,6FAA6F;IAC7F,MAAM,SAAS,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,MAAM,UAAU,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAEtF,sGAAsG;IACtG,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5E,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAEvG,8EAA8E;IAC9E,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QACjE,CAAC,CAAC,IAAI,CAAC,SAAS;QAChB,CAAC,CAAC,qBAAqB,CAAC;IAC1B,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnF,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,2BAA2B,GAAG,2BAA2B,GAAG,CAAC,KAAK,gCAAgC,KAAK,UAAU,GAAG,CAAC,KAAK,QAAQ,CAAC;IAC5I,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE/C,OAAO,UAAU,CAAC;cACN,QAAQ,IAAI,aAAa;;;;WAI5B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC;;;;iCAIvF,QAAQ,CAAC,YAAY,CAAC;iCACtB,QAAQ,CAAC,WAAW,CAAC;IAClD,OAAO,CAAC,CAAC,CAAC,UAAU,oBAAoB,UAAU,CAAC,CAAC,CAAC,EAAE;;;yDAGF,QAAQ;;;;iGAIgC,SAAS;;UAEhG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;sCAChE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;;QAE7F,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;;;QAGrD,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gHAC+E,CAAC,CAAC,iBAAiB,CAAC,KAAK,UAAU;;wCAE3G,CAAC,CAAC,iBAAiB,CAAC;YAChD,gBAAgB;;aAEf,CAAC,CAAC,CAAC,EAAE;kFACgE,UAAU,KAAK,SAAS;;;;;;;kEAOxC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;qCACnF,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;;;;YAI7E,CAAC,CAAC,mBAAmB,CAAC;;UAExB,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC;;YAErC,CAAC,CAAC,kBAAkB,CAAC;eAClB,CAAC,CAAC,CAAC,EAAE;UACV,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,sDAAsD,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;;YAEpG,CAAC,CAAC,UAAU,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;eAC9C,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;;YAIb,CAAC,CAAC,gBAAgB,CAAC;;;;;;;;;;YAUnB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC;6DACF,UAAU;;;;;UAK7D,CAAC,CAAC,cAAc,CAAC;QACnB,OAAO,CAAC,CAAC,CAAC;;UAER,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;QACnC,OAAO,CAAC,CAAC,CAAC;;UAER,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;QACvC,OAAO,CAAC,CAAC,CAAC;;UAER,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;;;UAGnC,CAAC,CAAC,iBAAiB,CAAC;QACtB,OAAO,CAAC,CAAC,CAAC;;UAER,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;QAClC,OAAO,CAAC,CAAC,CAAC;;UAER,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;QACpC,OAAO,CAAC,CAAC,CAAC;;UAER,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;QACtC,OAAO,CAAC,CAAC,CAAC;;UAER,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;;;;;2EAKmC,CAAC,CAAC,cAAc,CAAC;MACtF,OAAO,CAAC,CAAC,CAAC,wEAAwE,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;MACnH,OAAO,CAAC,CAAC,CAAC,gFAAgF,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;MAC/H,OAAO,CAAC,CAAC,CAAC,8EAA8E,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;mFAC9C,CAAC,CAAC,iBAAiB,CAAC;MACjG,OAAO,CAAC,CAAC,CAAC,sEAAsE,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;MAChH,OAAO,CAAC,CAAC,CAAC,0EAA0E,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;MACtH,OAAO,CAAC,CAAC,CAAC,8EAA8E,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;MAC5H,OAAO,CAAC,CAAC,CAAC,0EAA0E,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;;;;MAIlH,cAAc,CAAC,CAAC,CAAC;MACjB,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;MAChC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;MACpC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;MAC9B,iBAAiB,CAAC,CAAC,CAAC;MACpB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;MAC/B,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;MACjC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;MACnC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;;;eAGxB,QAAQ,CAAC,gBAAgB,CAAC;eAC1B,QAAQ,CAAC,OAAO,CAAC;;;;eAIjB,QAAQ,CAAC,eAAe,CAAC;EACtC,OAAO,CAAC,CAAC,CAAC,gBAAgB,QAAQ,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;;;EAGtE,mBAAmB,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA6CL,KAAK;;;;;;;qBAOR,cAAc;sBACb,eAAe;;;;;;;;;;;;;;;;;;;kBAmBnB,oBAAoB;oBAClB,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA4J3B,UAAU;;;EAGxB,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;;QAE1B,CAAC;AACT,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Utility functions — time formatting, clipboard, DID truncation, initials.
|
|
3
3
|
*/
|
|
4
|
-
export declare const UTILS_SCRIPT = "\nfunction relativeTime(iso) {\n var diff = Date.now() - new Date(iso).getTime();\n var abs = Math.abs(diff);\n var future = diff < 0;\n var s = Math.floor(abs / 1000);\n var m = Math.floor(s / 60);\n var h = Math.floor(m / 60);\n var d = Math.floor(h / 24);\n var label;\n if (d > 0) label = __t(\"time.dh\", { d: d, h: (h % 24) });\n else if (h > 0) label = __t(\"time.hm\", { h: h, m: (m % 60) });\n else if (m > 0) label = __t(\"time.min\", { m: m });\n else return __t(\"time.justNow\");\n return future ? __t(\"time.in\", { label: label }) : __t(\"time.ago\", { label: label });\n}\n\nfunction absoluteTime(iso) {\n var d = new Date(iso);\n var pad = function(n) { return n < 10 ? \"0\" + n : \"\" + n; };\n return d.getFullYear() + \"-\" + pad(d.getMonth() + 1) + \"-\" + pad(d.getDate())\n + \" \" + pad(d.getHours()) + \":\" + pad(d.getMinutes()) + \":\" + pad(d.getSeconds());\n}\n\nfunction copyToClipboard(text) {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(text).then(function() {\n showToast(__t(\"common.copied\"), \"success\");\n }).catch(function() {\n fallbackCopy(text);\n });\n } else {\n fallbackCopy(text);\n }\n}\n\nfunction fallbackCopy(text) {\n var input = document.createElement(\"input\");\n input.value = text;\n document.body.appendChild(input);\n input.select();\n document.execCommand(\"copy\");\n input.remove();\n showToast(__t(\"common.copied\"), \"success\");\n}\n\n// Delegate to the canonical implementation from @arcblock/did-connect-core\n// (exposed globally by the <did-address> IIFE bundle as __DidAddressBundle.truncateDid)\nfunction truncateDid(did) {\n return __DidAddressBundle.truncateDid(did);\n}\n\nfunction initials(name) {\n if (!name) return \"?\";\n var parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) return (parts[0][0] + parts[1][0]).toUpperCase();\n return name.slice(0, 2).toUpperCase();\n}\n\nfunction escapeHtml(str) {\n var div = document.createElement(\"div\");\n div.textContent = str;\n // The DOM round-trip above only neutralizes & < > (per HTML text-node\n // serialization rules); quotes are not special in text content, so a raw\n // '\"' / \"'\" survives and can break out of a quoted HTML attribute\n // (e.g. <img src=\"...\">, onclick=\"fn('...')\"). Escape them explicitly.\n return div.innerHTML.replace(/\"/g, \""\").replace(/'/g, \"'\");\n}\n\n// Generate a shimmer skeleton table: cols = column count, rows = row count\nfunction skeletonTable(cols, rows) {\n var widths = [70, 45, 60, 55, 65, 50, 60, 30];\n var cells = '';\n for (var i = 0; i < cols; i++) {\n cells += '<td><span class=\"skel\" style=\"width:' + widths[i % widths.length] + '%;height:13px;\"></span></td>';\n }\n var row = '<tr class=\"skel-row\">' + cells + '</tr>';\n var tbody = '';\n for (var j = 0; j < rows; j++) tbody += row;\n return '<table class=\"table\"><tbody>' + tbody + '</tbody></table>';\n}\n\n/** Generate shimmer skeleton rows for list-style containers. */\nfunction skeletonRows(rows) {\n var widths = [45, 65, 55];\n var html = '';\n for (var i = 0; i < rows; i++) {\n html += '<div class=\"settings-row\"><span class=\"skel\" style=\"width:' + widths[i % widths.length] + '%;height:13px;\"></span></div>';\n }\n return html;\n}\n\n// \u2500\u2500\u2500 Submit lock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Busy state for a button: disabled + aria-busy + the .btn-loading spinner.\nfunction setButtonBusy(btn, busy) {\n if (!btn) return;\n btn.disabled = busy;\n btn.setAttribute(\"aria-busy\", busy ? \"true\" : \"false\");\n if (busy) btn.classList.add(\"btn-loading\");\n else btn.classList.remove(\"btn-loading\");\n}\n\n// Wrap a mutation handler so it can never run concurrently with itself: while\n// one run is pending, further calls are dropped, and the button that fired it\n// (the live event's currentTarget when invoked from an inline onclick) shows\n// the busy state until the run settles. Every button-driven handler that sends\n// a POST/PUT/DELETE goes through this \u2014 a double-click must never send twice.\n// The handler must return its promise (async function, or \"return api(...)\").\nfunction submitOnce(fn) {\n var pending = false;\n return function() {\n if (pending) return;\n var evt = window.event;\n var target = evt && evt.currentTarget;\n var btn = target && target.tagName === \"BUTTON\" ? target : null;\n pending = true;\n setButtonBusy(btn, true);\n var self = this;\n var args = arguments;\n var done = function() { pending = false; setButtonBusy(btn, false); };\n return Promise.resolve().then(function() { return fn.apply(self, args); }).then(\n function(result) { done(); return result; },\n function(err) { done(); console.error(\"submit failed\", err); }\n );\n };\n}\n\nfunction renderAvatar(avatarUrl, fullName, size) {\n size = size || \"\";\n var cls = \"avatar\" + (size ? \" avatar-\" + size : \"\");\n if (avatarUrl) {\n var sep = avatarUrl.indexOf(\"?\") >= 0 ? \"&\" : \"?\";\n var src = avatarUrl + sep + \"t=\" + Date.now() + (size === \"sm\" ? \"&s=64\" : \"\");\n return '<div class=\"' + cls + '\">'\n + '<img src=\"' + escapeHtml(src) + '\" '\n + 'onerror=\"this.style.display=\\'none\\';this.nextSibling.style.display=\\'flex\\'\">'\n + '<span class=\"avatar-fallback\" style=\"display:none\">' + escapeHtml(initials(fullName)) + '</span>'\n + '</div>';\n }\n return '<div class=\"' + cls + '\"><span class=\"avatar-fallback\">' + escapeHtml(initials(fullName)) + '</span></div>';\n}\n";
|
|
4
|
+
export declare const UTILS_SCRIPT = "\nfunction relativeTime(iso) {\n var diff = Date.now() - new Date(iso).getTime();\n var abs = Math.abs(diff);\n var future = diff < 0;\n var s = Math.floor(abs / 1000);\n var m = Math.floor(s / 60);\n var h = Math.floor(m / 60);\n var d = Math.floor(h / 24);\n var label;\n if (d > 0) label = __t(\"time.dh\", { d: d, h: (h % 24) });\n else if (h > 0) label = __t(\"time.hm\", { h: h, m: (m % 60) });\n else if (m > 0) label = __t(\"time.min\", { m: m });\n else return __t(\"time.justNow\");\n return future ? __t(\"time.in\", { label: label }) : __t(\"time.ago\", { label: label });\n}\n\nfunction absoluteTime(iso) {\n var d = new Date(iso);\n var pad = function(n) { return n < 10 ? \"0\" + n : \"\" + n; };\n return d.getFullYear() + \"-\" + pad(d.getMonth() + 1) + \"-\" + pad(d.getDate())\n + \" \" + pad(d.getHours()) + \":\" + pad(d.getMinutes()) + \":\" + pad(d.getSeconds());\n}\n\n/** Created / Last used rows shared by the profile card and the member detail. */\nfunction renderAccountTimeRows(a) {\n var rows = \"\";\n if (a.createdAt) {\n rows += '<div class=\"ca-bound-time\">';\n rows += '<span class=\"ca-bound-time-label\">' + __t(\"profile.createdAt\") + '</span>';\n rows += '<span class=\"ca-bound-time-value\">' + escapeHtml(absoluteTime(a.createdAt)) + '</span>';\n rows += '</div>';\n }\n if (a.lastLoginAt) {\n var lastUsed = absoluteTime(a.lastLoginAt);\n if (a.lastLoginDomain) lastUsed += \" \u00B7 \" + a.lastLoginDomain;\n rows += '<div class=\"ca-bound-time\">';\n rows += '<span class=\"ca-bound-time-label\">' + __t(\"profile.lastUsed\") + '</span>';\n rows += '<span class=\"ca-bound-time-value\">' + escapeHtml(lastUsed) + '</span>';\n rows += '</div>';\n }\n if (!rows) return \"\";\n return '<div class=\"ca-bound-times\">' + rows + '</div>';\n}\n\nfunction copyToClipboard(text) {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(text).then(function() {\n showToast(__t(\"common.copied\"), \"success\");\n }).catch(function() {\n fallbackCopy(text);\n });\n } else {\n fallbackCopy(text);\n }\n}\n\nfunction fallbackCopy(text) {\n var input = document.createElement(\"input\");\n input.value = text;\n document.body.appendChild(input);\n input.select();\n document.execCommand(\"copy\");\n input.remove();\n showToast(__t(\"common.copied\"), \"success\");\n}\n\n// Delegate to the canonical implementation from @arcblock/did-connect-core\n// (exposed globally by the <did-address> IIFE bundle as __DidAddressBundle.truncateDid)\nfunction truncateDid(did) {\n return __DidAddressBundle.truncateDid(did);\n}\n\nfunction initials(name) {\n if (!name) return \"?\";\n var parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) return (parts[0][0] + parts[1][0]).toUpperCase();\n return name.slice(0, 2).toUpperCase();\n}\n\nfunction escapeHtml(str) {\n var div = document.createElement(\"div\");\n div.textContent = str;\n // The DOM round-trip above only neutralizes & < > (per HTML text-node\n // serialization rules); quotes are not special in text content, so a raw\n // '\"' / \"'\" survives and can break out of a quoted HTML attribute\n // (e.g. <img src=\"...\">, onclick=\"fn('...')\"). Escape them explicitly.\n return div.innerHTML.replace(/\"/g, \""\").replace(/'/g, \"'\");\n}\n\n// Generate a shimmer skeleton table: cols = column count, rows = row count\nfunction skeletonTable(cols, rows) {\n var widths = [70, 45, 60, 55, 65, 50, 60, 30];\n var cells = '';\n for (var i = 0; i < cols; i++) {\n cells += '<td><span class=\"skel\" style=\"width:' + widths[i % widths.length] + '%;height:13px;\"></span></td>';\n }\n var row = '<tr class=\"skel-row\">' + cells + '</tr>';\n var tbody = '';\n for (var j = 0; j < rows; j++) tbody += row;\n return '<table class=\"table\"><tbody>' + tbody + '</tbody></table>';\n}\n\n/** Generate shimmer skeleton rows for list-style containers. */\nfunction skeletonRows(rows) {\n var widths = [45, 65, 55];\n var html = '';\n for (var i = 0; i < rows; i++) {\n html += '<div class=\"settings-row\"><span class=\"skel\" style=\"width:' + widths[i % widths.length] + '%;height:13px;\"></span></div>';\n }\n return html;\n}\n\n// \u2500\u2500\u2500 Submit lock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Busy state for a button: disabled + aria-busy + the .btn-loading spinner.\nfunction setButtonBusy(btn, busy) {\n if (!btn) return;\n btn.disabled = busy;\n btn.setAttribute(\"aria-busy\", busy ? \"true\" : \"false\");\n if (busy) btn.classList.add(\"btn-loading\");\n else btn.classList.remove(\"btn-loading\");\n}\n\n// Wrap a mutation handler so it can never run concurrently with itself: while\n// one run is pending, further calls are dropped, and the button that fired it\n// (the live event's currentTarget when invoked from an inline onclick) shows\n// the busy state until the run settles. Every button-driven handler that sends\n// a POST/PUT/DELETE goes through this \u2014 a double-click must never send twice.\n// The handler must return its promise (async function, or \"return api(...)\").\nfunction submitOnce(fn) {\n var pending = false;\n return function() {\n if (pending) return;\n var evt = window.event;\n var target = evt && evt.currentTarget;\n var btn = target && target.tagName === \"BUTTON\" ? target : null;\n pending = true;\n setButtonBusy(btn, true);\n var self = this;\n var args = arguments;\n var done = function() { pending = false; setButtonBusy(btn, false); };\n return Promise.resolve().then(function() { return fn.apply(self, args); }).then(\n function(result) { done(); return result; },\n function(err) { done(); console.error(\"submit failed\", err); }\n );\n };\n}\n\nfunction renderAvatar(avatarUrl, fullName, size) {\n size = size || \"\";\n var cls = \"avatar\" + (size ? \" avatar-\" + size : \"\");\n if (avatarUrl) {\n var sep = avatarUrl.indexOf(\"?\") >= 0 ? \"&\" : \"?\";\n var src = avatarUrl + sep + \"t=\" + Date.now() + (size === \"sm\" ? \"&s=64\" : \"\");\n return '<div class=\"' + cls + '\">'\n + '<img src=\"' + escapeHtml(src) + '\" '\n + 'onerror=\"this.style.display=\\'none\\';this.nextSibling.style.display=\\'flex\\'\">'\n + '<span class=\"avatar-fallback\" style=\"display:none\">' + escapeHtml(initials(fullName)) + '</span>'\n + '</div>';\n }\n return '<div class=\"' + cls + '\"><span class=\"avatar-fallback\">' + escapeHtml(initials(fullName)) + '</span></div>';\n}\n";
|
|
5
5
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/pages/admin/scripts/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/pages/admin/scripts/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,YAAY,utNAkKxB,CAAC"}
|
|
@@ -25,6 +25,27 @@ function absoluteTime(iso) {
|
|
|
25
25
|
+ " " + pad(d.getHours()) + ":" + pad(d.getMinutes()) + ":" + pad(d.getSeconds());
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
/** Created / Last used rows shared by the profile card and the member detail. */
|
|
29
|
+
function renderAccountTimeRows(a) {
|
|
30
|
+
var rows = "";
|
|
31
|
+
if (a.createdAt) {
|
|
32
|
+
rows += '<div class="ca-bound-time">';
|
|
33
|
+
rows += '<span class="ca-bound-time-label">' + __t("profile.createdAt") + '</span>';
|
|
34
|
+
rows += '<span class="ca-bound-time-value">' + escapeHtml(absoluteTime(a.createdAt)) + '</span>';
|
|
35
|
+
rows += '</div>';
|
|
36
|
+
}
|
|
37
|
+
if (a.lastLoginAt) {
|
|
38
|
+
var lastUsed = absoluteTime(a.lastLoginAt);
|
|
39
|
+
if (a.lastLoginDomain) lastUsed += " · " + a.lastLoginDomain;
|
|
40
|
+
rows += '<div class="ca-bound-time">';
|
|
41
|
+
rows += '<span class="ca-bound-time-label">' + __t("profile.lastUsed") + '</span>';
|
|
42
|
+
rows += '<span class="ca-bound-time-value">' + escapeHtml(lastUsed) + '</span>';
|
|
43
|
+
rows += '</div>';
|
|
44
|
+
}
|
|
45
|
+
if (!rows) return "";
|
|
46
|
+
return '<div class="ca-bound-times">' + rows + '</div>';
|
|
47
|
+
}
|
|
48
|
+
|
|
28
49
|
function copyToClipboard(text) {
|
|
29
50
|
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
30
51
|
navigator.clipboard.writeText(text).then(function() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/pages/admin/scripts/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/pages/admin/scripts/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkKpC,CAAC"}
|