@arcblock/did-connect-service 4.1.8 → 4.1.10
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 +1 -1
- package/dist/assets/admin-core.a13c2729.js +1461 -0
- package/dist/handlers/auth-handler.d.ts.map +1 -1
- package/dist/handlers/auth-handler.js +3 -0
- package/dist/handlers/auth-handler.js.map +1 -1
- package/dist/handlers/team-handler.d.ts.map +1 -1
- package/dist/handlers/team-handler.js +30 -7
- package/dist/handlers/team-handler.js.map +1 -1
- package/dist/pages/admin/i18n.d.ts.map +1 -1
- package/dist/pages/admin/i18n.js +12 -2
- package/dist/pages/admin/i18n.js.map +1 -1
- package/dist/pages/admin/tab-access-keys.d.ts +1 -1
- package/dist/pages/admin/tab-access-keys.d.ts.map +1 -1
- package/dist/pages/admin/tab-access-keys.js +71 -7
- package/dist/pages/admin/tab-access-keys.js.map +1 -1
- package/package.json +3 -3
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
type TFn = (key: string, params?: Record<string, string>) => string;
|
|
5
5
|
export declare function accessKeysTabHtml(t: TFn): string;
|
|
6
|
-
export declare const ACCESS_KEYS_TAB_SCRIPT = "\nvar akPage = 1;\nvar akPageSize = 20;\nvar akSearchTimer = null;\n\nfunction debounceAkSearch() {\n clearTimeout(akSearchTimer);\n akSearchTimer = setTimeout(function() { loadAccessKeys(1); }, 300);\n}\n\nasync function loadAccessKeys(page) {\n akPage = page || 1;\n var search = document.getElementById(\"ak-search\").value.trim();\n var qs = \"?page=\" + akPage + \"&pageSize=\" + akPageSize;\n if (search) qs += \"&search=\" + encodeURIComponent(search);\n document.getElementById(\"ak-table-wrap\").innerHTML = skeletonTable(7, 5);\n document.getElementById(\"ak-pagination\").innerHTML = \"\";\n var data = await apiRaw(\"GET\", \"/.well-known/service/api/access-keys\" + qs);\n if (!data || data.error) {\n document.getElementById(\"ak-table-wrap\").innerHTML = '<div class=\"empty-state\"><div class=\"empty-state-title\">' + __t(\"accessKeys.loadFailed\") + '</div></div>';\n return;\n }\n renderAccessKeys(data.keys, { total: data.total, page: data.page, pageSize: data.pageSize });\n}\n\nfunction renderAccessKeys(keys, paging) {\n var wrap = document.getElementById(\"ak-table-wrap\");\n if (!keys || keys.length === 0) {\n wrap.innerHTML = '<div class=\"empty-state\"><div class=\"empty-state-icon\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4\"/></svg></div><div class=\"empty-state-title\">' + __t(\"accessKeys.noKeys\") + '</div><div class=\"empty-state-desc\">' + __t(\"accessKeys.noKeysHint\") + '</div></div>';\n document.getElementById(\"ak-pagination\").innerHTML = \"\";\n return;\n }\n\n var html = '<table class=\"table\"><thead><tr><th>' + __t(\"accessKeys.col.keyId\") + '</th><th>' + __t(\"accessKeys.col.role\") + '</th><th class=\"col-hide-sm\">' + __t(\"accessKeys.col.remark\") + '</th><th class=\"col-hide-md\">' + __t(\"accessKeys.col.createdBy\") + '</th><th>' + __t(\"accessKeys.col.expires\") + '</th><th class=\"col-hide-md\">' + __t(\"accessKeys.col.lastUsed\") + '</th><th>' + __t(\"common.actions\") + '</th></tr></thead><tbody>';\n keys.forEach(function(k) {\n var keyIdHtml = '<did-address did=\"' + escapeHtml(k.accessKeyId) + '\" compact></did-address>';\n var roleBadge = '<span class=\"badge badge-' + k.role + '\">' + __t(\"common.\" + k.role) + '</span>';\n var remark = k.remark ? escapeHtml(k.remark.length > 40 ? k.remark.slice(0, 40) + \"...\" : k.remark) : '<span style=\"color:var(--text-secondary)\">\u2014</span>';\n var creator = k.createdByName\n ? escapeHtml(k.createdByName)\n : '<did-address did=\"' + escapeHtml(k.createdBy) + '\" compact></did-address>';\n var expiry = k.expireAt ? (new Date(k.expireAt) < new Date() ? '<span style=\"color:var(--error)\">' + __t(\"common.expired\") + '</span>' : relativeTime(k.expireAt)) : __t(\"common.never\");\n var lastUsed = k.lastUsedAt ? relativeTime(k.lastUsedAt) : __t(\"common.never\");\n var deleteLabel = k.remark ? escapeHtml(k.remark) : truncateDid(k.accessKeyId);\n\n html += '<tr>';\n html += '<td><code style=\"font-size:12px\">' + keyIdHtml + '</code></td>';\n html += '<td>' + roleBadge + '</td>';\n html += '<td class=\"col-hide-sm\">' + remark + '</td>';\n html += '<td class=\"col-hide-md\">' + creator + '</td>';\n html += '<td>' + expiry + '</td>';\n html += '<td class=\"col-hide-md\">' + lastUsed + '</td>';\n html += '<td class=\"action-cell\"><button class=\"action-trigger\" onclick=\"event.stopPropagation();toggleActionMenu(this)\">\u22EF</button><div class=\"action-menu\"><button class=\"action-menu-item\" onclick=\"event.stopPropagation();openEditAkDialog(\\''+k.accessKeyId+'\\')\">' + __t(\"common.edit\") + '</button><div class=\"action-menu-sep\"></div><button class=\"action-menu-item danger\" onclick=\"event.stopPropagation();confirmDeleteAk(\\''+k.accessKeyId+'\\',\\''+escapeHtml(deleteLabel)+'\\')\">' + __t(\"common.delete\") + '</button></div></td>';\n html += '</tr>';\n });\n html += '</tbody></table>';\n wrap.innerHTML = html;\n\n renderPagination(\"ak-pagination\", paging, loadAccessKeys);\n}\n\nfunction openCreateAkDialog() {\n var callerRole = __caller.role;\n var roleOptions = '<option value=\"guest\">Guest</option>';\n if (callerRole === \"member\" || callerRole === \"admin\" || callerRole === \"owner\") roleOptions += '<option value=\"member\"' + (callerRole === \"member\" ? ' selected' : '') + '>Member</option>';\n if (callerRole === \"admin\" || callerRole === \"owner\") roleOptions += '<option value=\"admin\"' + (callerRole === \"admin\" ? ' selected' : '') + '>Admin</option>';\n if (callerRole === \"owner\") roleOptions += '<option value=\"owner\">Owner</option>';\n\n var expiryOptions = '<option value=\"\">' + __t(\"accessKeys.expirations.never\") + '</option><option value=\"7d\">' + __t(\"accessKeys.expirations.days7\") + '</option><option value=\"30d\">' + __t(\"accessKeys.expirations.days30\") + '</option><option value=\"90d\">' + __t(\"accessKeys.expirations.days90\") + '</option><option value=\"custom\">' + __t(\"accessKeys.expirations.custom\") + '</option>';\n\n var html = '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.role\") + '</label><select class=\"select\" id=\"ak-create-role\">' + roleOptions + '</select></div>';\n html += '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.remark\") + '</label><input type=\"text\" class=\"input\" id=\"ak-create-remark\" placeholder=\"' + __t(\"accessKeys.remarkPlaceholder\") + '\" maxlength=\"200\" /></div>';\n html += '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.expiration\") + '</label><select class=\"select\" id=\"ak-create-expiry\" onchange=\"toggleAkCustomExpiry()\">' + expiryOptions + '</select></div>';\n html += '<div class=\"form-group hidden\" id=\"ak-custom-expiry-wrap\"><label class=\"form-label\">' + __t(\"accessKeys.customDate\") + '</label><input type=\"datetime-local\" class=\"input\" id=\"ak-create-custom-expiry\" /></div>';\n\n openDialog(__t(\"accessKeys.createTitle\"), html, __t(\"common.save\"), async function() {\n var role = document.getElementById(\"ak-create-role\").value;\n var remark = document.getElementById(\"ak-create-remark\").value;\n var expirySelect = document.getElementById(\"ak-create-expiry\").value;\n var expireAt = null;\n\n if (expirySelect === \"custom\") {\n var customDate = document.getElementById(\"ak-create-custom-expiry\").value;\n if (!customDate) { showToast(__t(\"accessKeys.selectExpDate\"), \"error\"); return; }\n expireAt = new Date(customDate).toISOString();\n } else if (expirySelect) {\n var days = parseInt(expirySelect);\n expireAt = new Date(Date.now() + days * 86400000).toISOString();\n }\n\n var result = await apiRaw(\"POST\", \"/.well-known/service/api/access-keys\", { role: role, remark: remark, expireAt: expireAt });\n if (!result || result.error) {\n showToast(result ? result.error : __t(\"accessKeys.createFailed\"), \"error\");\n return;\n }\n\n closeDialog();\n showSecretDialog(result.accessKeySecret);\n loadAccessKeys(1);\n });\n}\n\nfunction toggleAkCustomExpiry() {\n var sel = document.getElementById(\"ak-create-expiry\").value;\n var wrap = document.getElementById(\"ak-custom-expiry-wrap\");\n if (sel === \"custom\") wrap.classList.remove(\"hidden\");\n else wrap.classList.add(\"hidden\");\n}\n\nfunction showSecretDialog(secret) {\n var html = '<div style=\"margin-bottom:12px;color:var(--error);font-weight:500\">' + __t(\"accessKeys.secretWarning\") + '</div>';\n var copyIconSvg = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>';\n var copyBtnStyle = 'position:absolute;top:4px;right:4px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:var(--bg-base);border:1px solid var(--border);border-radius:4px;cursor:pointer;color:var(--text-secondary);transition:color 0.15s,border-color 0.15s';\n html += '<div style=\"position:relative\"><code id=\"ak-secret-display\" style=\"display:block;padding:12px 40px 12px 12px;background:var(--bg-base);border:1px solid var(--border);border-radius:6px;font-size:13px;word-break:break-all;user-select:all;overflow-wrap:anywhere\">' + escapeHtml(secret) + '</code>';\n html += '<button id=\"ak-copy-btn\" style=\"' + copyBtnStyle + '\" onclick=\"copyAkSecret()\" title=\"' + __t(\"common.copy\") + '\">' + copyIconSvg + '</button></div>';\n var curlCmd = 'curl -H \"Authorization: Bearer ' + secret + '\" ' + location.origin + '/.well-known/service/api/did/session';\n html += '<div style=\"margin-top:12px;font-size:13px;color:var(--text-secondary)\"><strong>' + __t(\"accessKeys.usage\") + '</strong></div>';\n html += '<div style=\"position:relative;margin-top:6px\"><code id=\"ak-curl-display\" style=\"display:block;padding:12px 40px 12px 12px;background:var(--bg-base);border:1px solid var(--border);border-radius:6px;font-size:12px;word-break:break-all;overflow-wrap:anywhere;user-select:all\">' + escapeHtml(curlCmd) + '</code>';\n html += '<button id=\"ak-curl-copy-btn\" style=\"' + copyBtnStyle + '\" onclick=\"copyAkCurl()\" title=\"' + __t(\"common.copy\") + '\">' + copyIconSvg + '</button></div>';\n\n openDialog(__t(\"accessKeys.secretTitle\"), html, __t(\"accessKeys.done\"), function() {\n document.getElementById(\"ak-secret-display\").textContent = \"\";\n closeDialog();\n });\n}\n\nfunction copyAkCurl() {\n var text = document.getElementById(\"ak-curl-display\").textContent;\n var btn = document.getElementById(\"ak-curl-copy-btn\");\n var origHtml = btn.innerHTML;\n function onCopied() {\n btn.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 13l4 4L19 7\"/></svg>';\n btn.style.color = \"var(--green)\";\n setTimeout(function() { btn.innerHTML = origHtml; btn.style.color = \"\"; }, 2000);\n }\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(text).then(onCopied).catch(function() {\n fallbackCopy(text);\n onCopied();\n });\n } else {\n fallbackCopy(text);\n onCopied();\n }\n}\n\nfunction copyAkSecret() {\n var text = document.getElementById(\"ak-secret-display\").textContent;\n var btn = document.getElementById(\"ak-copy-btn\");\n var origHtml = btn.innerHTML;\n function onCopied() {\n btn.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 13l4 4L19 7\"/></svg>';\n btn.style.color = \"var(--green)\";\n setTimeout(function() { btn.innerHTML = origHtml; btn.style.color = \"\"; }, 2000);\n }\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(text).then(onCopied).catch(function() {\n fallbackCopy(text);\n onCopied();\n });\n } else {\n fallbackCopy(text);\n onCopied();\n }\n}\n\nasync function openEditAkDialog(accessKeyId) {\n var data = await apiRaw(\"GET\", \"/.well-known/service/api/access-keys/\" + encodeURIComponent(accessKeyId));\n if (!data || data.error) { showToast(__t(\"accessKeys.loadKeyFailed\"), \"error\"); return; }\n\n var html = '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.col.keyId\") + '</label><code style=\"font-size:12px\">' + escapeHtml(data.accessKeyId) + '</code></div>';\n html += '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.role\") + '</label><span class=\"badge badge-' + data.role + '\">' + __t(\"common.\" + data.role) + '</span></div>';\n html += '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.remark\") + '</label><input type=\"text\" class=\"input\" id=\"ak-edit-remark\" value=\"' + escapeHtml(data.remark || \"\") + '\" maxlength=\"200\" /></div>';\n html += '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.expiration\") + '</label><input type=\"datetime-local\" class=\"input\" id=\"ak-edit-expiry\" value=\"' + (data.expireAt ? data.expireAt.slice(0,16) : \"\") + '\" /> <label style=\"margin-top:4px;display:block;font-size:13px\"><input type=\"checkbox\" id=\"ak-edit-no-expiry\"' + (data.expireAt ? \"\" : \" checked\") + ' onchange=\"toggleAkEditExpiry()\" /> ' + __t(\"accessKeys.neverExpires\") + '</label></div>';\n\n openDialog(__t(\"accessKeys.editTitle\"), html, __t(\"common.save\"), async function() {\n var remark = document.getElementById(\"ak-edit-remark\").value;\n var noExpiry = document.getElementById(\"ak-edit-no-expiry\").checked;\n var expireAt = noExpiry ? null : (document.getElementById(\"ak-edit-expiry\").value ? new Date(document.getElementById(\"ak-edit-expiry\").value).toISOString() : undefined);\n\n var body = { remark: remark };\n if (expireAt !== undefined) body.expireAt = expireAt;\n\n var result = await apiRaw(\"PUT\", \"/.well-known/service/api/access-keys/\" + encodeURIComponent(accessKeyId), body);\n if (!result || result.error) {\n showToast(result ? result.error : __t(\"accessKeys.updateFailed\"), \"error\");\n return;\n }\n closeDialog();\n showToast(__t(\"accessKeys.keyUpdated\"), \"success\");\n loadAccessKeys(akPage);\n });\n}\n\nfunction toggleAkEditExpiry() {\n var noExpiry = document.getElementById(\"ak-edit-no-expiry\").checked;\n document.getElementById(\"ak-edit-expiry\").disabled = noExpiry;\n}\n\nfunction confirmDeleteAk(accessKeyId, label) {\n openDialog(__t(\"accessKeys.deleteTitle\"), '<p>' + __t(\"accessKeys.deleteMsg\", { label: escapeHtml(label) }) + '</p><p style=\"color:var(--error)\">' + __t(\"accessKeys.deleteWarning\") + '</p>', __t(\"common.delete\"), async function() {\n var result = await apiRaw(\"DELETE\", \"/.well-known/service/api/access-keys/\" + encodeURIComponent(accessKeyId));\n if (result && result.error) {\n showToast(result.error, \"error\");\n return;\n }\n closeDialog();\n showToast(__t(\"accessKeys.keyDeleted\"), \"success\");\n loadAccessKeys(akPage);\n });\n}\n\n// Direct API call (bypasses team handler's /team prefix)\nasync function apiRaw(method, path, body) {\n try {\n var opts = { method: method, headers: { \"Accept\": \"application/json\" } };\n if (body !== undefined) {\n opts.headers[\"Content-Type\"] = \"application/json\";\n opts.body = JSON.stringify(body);\n }\n var res = await fetch(path, opts);\n if (res.status === 204) return {};\n return await res.json();\n } catch(e) {\n return null;\n }\n}\n\nregisterTab(\"access-keys\", function() { loadAccessKeys(1); });\n";
|
|
6
|
+
export declare const ACCESS_KEYS_TAB_SCRIPT = "\nvar akPage = 1;\nvar akPageSize = 20;\nvar akSearchTimer = null;\n\nfunction debounceAkSearch() {\n clearTimeout(akSearchTimer);\n akSearchTimer = setTimeout(function() { loadAccessKeys(1); }, 300);\n}\n\nasync function loadAccessKeys(page) {\n akPage = page || 1;\n var search = document.getElementById(\"ak-search\").value.trim();\n var qs = \"?page=\" + akPage + \"&pageSize=\" + akPageSize;\n if (search) qs += \"&search=\" + encodeURIComponent(search);\n document.getElementById(\"ak-table-wrap\").innerHTML = skeletonTable(7, 5);\n document.getElementById(\"ak-pagination\").innerHTML = \"\";\n var data = await apiRaw(\"GET\", \"/.well-known/service/api/access-keys\" + qs);\n if (!data || data.error) {\n document.getElementById(\"ak-table-wrap\").innerHTML = '<div class=\"empty-state\"><div class=\"empty-state-title\">' + __t(\"accessKeys.loadFailed\") + '</div></div>';\n return;\n }\n renderAccessKeys(data.keys, { total: data.total, page: data.page, pageSize: data.pageSize });\n}\n\nfunction renderAccessKeys(keys, paging) {\n var wrap = document.getElementById(\"ak-table-wrap\");\n if (!keys || keys.length === 0) {\n wrap.innerHTML = '<div class=\"empty-state\"><div class=\"empty-state-icon\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4\"/></svg></div><div class=\"empty-state-title\">' + __t(\"accessKeys.noKeys\") + '</div><div class=\"empty-state-desc\">' + __t(\"accessKeys.noKeysHint\") + '</div></div>';\n document.getElementById(\"ak-pagination\").innerHTML = \"\";\n return;\n }\n\n var html = '<table class=\"table\"><thead><tr><th>' + __t(\"accessKeys.col.keyId\") + '</th><th>' + __t(\"accessKeys.col.role\") + '</th><th class=\"col-hide-sm\">' + __t(\"accessKeys.col.remark\") + '</th><th class=\"col-hide-md\">' + __t(\"accessKeys.col.createdBy\") + '</th><th>' + __t(\"accessKeys.col.expires\") + '</th><th class=\"col-hide-md\">' + __t(\"accessKeys.col.lastUsed\") + '</th><th>' + __t(\"common.actions\") + '</th></tr></thead><tbody>';\n keys.forEach(function(k) {\n var keyIdHtml = '<did-address did=\"' + escapeHtml(k.accessKeyId) + '\" compact></did-address>';\n var roleBadge = '<span class=\"badge badge-' + k.role + '\">' + __t(\"common.\" + k.role) + '</span>';\n var remark = k.remark ? escapeHtml(k.remark.length > 40 ? k.remark.slice(0, 40) + \"...\" : k.remark) : '<span style=\"color:var(--text-secondary)\">\u2014</span>';\n var creator = k.createdByName\n ? escapeHtml(k.createdByName)\n : '<did-address did=\"' + escapeHtml(k.createdBy) + '\" compact></did-address>';\n var expiry = k.expireAt ? (new Date(k.expireAt) < new Date() ? '<span style=\"color:var(--error)\">' + __t(\"common.expired\") + '</span>' : relativeTime(k.expireAt)) : __t(\"common.never\");\n var lastUsed = k.lastUsedAt ? relativeTime(k.lastUsedAt) : __t(\"common.never\");\n var deleteLabel = k.remark ? escapeHtml(k.remark) : truncateDid(k.accessKeyId);\n\n html += '<tr>';\n html += '<td><code style=\"font-size:12px\">' + keyIdHtml + '</code></td>';\n html += '<td>' + roleBadge + '</td>';\n html += '<td class=\"col-hide-sm\">' + remark + '</td>';\n html += '<td class=\"col-hide-md\">' + creator + '</td>';\n html += '<td>' + expiry + '</td>';\n html += '<td class=\"col-hide-md\">' + lastUsed + '</td>';\n html += '<td class=\"action-cell\"><button class=\"action-trigger\" onclick=\"event.stopPropagation();toggleActionMenu(this)\">\u22EF</button><div class=\"action-menu\"><button class=\"action-menu-item\" onclick=\"event.stopPropagation();openEditAkDialog(\\''+k.accessKeyId+'\\')\">' + __t(\"common.edit\") + '</button><div class=\"action-menu-sep\"></div><button class=\"action-menu-item danger\" onclick=\"event.stopPropagation();confirmDeleteAk(\\''+k.accessKeyId+'\\',\\''+escapeHtml(deleteLabel)+'\\')\">' + __t(\"common.delete\") + '</button></div></td>';\n html += '</tr>';\n });\n html += '</tbody></table>';\n wrap.innerHTML = html;\n\n renderPagination(\"ak-pagination\", paging, loadAccessKeys);\n}\n\nfunction openCreateAkDialog() {\n var callerRole = __caller.role;\n var roleOptions = '<option value=\"guest\">Guest</option>';\n if (callerRole === \"member\" || callerRole === \"admin\" || callerRole === \"owner\") roleOptions += '<option value=\"member\"' + (callerRole === \"member\" ? ' selected' : '') + '>Member</option>';\n if (callerRole === \"admin\" || callerRole === \"owner\") roleOptions += '<option value=\"admin\"' + (callerRole === \"admin\" ? ' selected' : '') + '>Admin</option>';\n if (callerRole === \"owner\") roleOptions += '<option value=\"owner\">Owner</option>';\n\n var expiryOptions = '<option value=\"\">' + __t(\"accessKeys.expirations.never\") + '</option><option value=\"7d\">' + __t(\"accessKeys.expirations.days7\") + '</option><option value=\"30d\">' + __t(\"accessKeys.expirations.days30\") + '</option><option value=\"90d\">' + __t(\"accessKeys.expirations.days90\") + '</option><option value=\"custom\">' + __t(\"accessKeys.expirations.custom\") + '</option>';\n\n var html = '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.role\") + '</label><select class=\"select\" id=\"ak-create-role\">' + roleOptions + '</select></div>';\n html += '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.remark\") + '</label><input type=\"text\" class=\"input\" id=\"ak-create-remark\" placeholder=\"' + __t(\"accessKeys.remarkPlaceholder\") + '\" maxlength=\"200\" /></div>';\n html += '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.expiration\") + '</label><select class=\"select\" id=\"ak-create-expiry\" onchange=\"toggleAkCustomExpiry()\">' + expiryOptions + '</select></div>';\n html += '<div class=\"form-group hidden\" id=\"ak-custom-expiry-wrap\"><label class=\"form-label\">' + __t(\"accessKeys.customDate\") + '</label><input type=\"datetime-local\" class=\"input\" id=\"ak-create-custom-expiry\" /></div>';\n\n openDialog(__t(\"accessKeys.createTitle\"), html, __t(\"common.save\"), async function() {\n var role = document.getElementById(\"ak-create-role\").value;\n var remark = document.getElementById(\"ak-create-remark\").value;\n var expirySelect = document.getElementById(\"ak-create-expiry\").value;\n var expireAt = null;\n\n if (expirySelect === \"custom\") {\n var customDate = document.getElementById(\"ak-create-custom-expiry\").value;\n if (!customDate) { showToast(__t(\"accessKeys.selectExpDate\"), \"error\"); return; }\n expireAt = new Date(customDate).toISOString();\n } else if (expirySelect) {\n var days = parseInt(expirySelect);\n expireAt = new Date(Date.now() + days * 86400000).toISOString();\n }\n\n var result = await apiRaw(\"POST\", \"/.well-known/service/api/access-keys\", { role: role, remark: remark, expireAt: expireAt });\n if (!result || result.error) {\n showToast(result ? result.error : __t(\"accessKeys.createFailed\"), \"error\");\n return;\n }\n\n closeDialog();\n showSecretDialog(result.accessKeySecret);\n loadAccessKeys(1);\n });\n}\n\nfunction toggleAkCustomExpiry() {\n var sel = document.getElementById(\"ak-create-expiry\").value;\n var wrap = document.getElementById(\"ak-custom-expiry-wrap\");\n if (sel === \"custom\") wrap.classList.remove(\"hidden\");\n else wrap.classList.add(\"hidden\");\n}\n\n// Slugify a display name into something safe to use as an MCP server name\n// (lowercase, alnum + hyphens). Falls back to a fixed default when empty.\nfunction akSlug(s) {\n var slug = String(s || \"\").toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\");\n return slug || \"did-connect\";\n}\n\nvar __akSnippets = null;\n\nfunction showSecretDialog(secret) {\n var html = '<div style=\"margin-bottom:12px;color:var(--error);font-weight:500\">' + __t(\"accessKeys.secretWarning\") + '</div>';\n var copyIconSvg = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>';\n var copyBtnStyle = 'position:absolute;top:4px;right:4px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:var(--bg-base);border:1px solid var(--border);border-radius:4px;cursor:pointer;color:var(--text-secondary);transition:color 0.15s,border-color 0.15s';\n html += '<div style=\"position:relative\"><code id=\"ak-secret-display\" style=\"display:block;padding:12px 40px 12px 12px;background:var(--bg-base);border:1px solid var(--border);border-radius:6px;font-size:13px;word-break:break-all;user-select:all;overflow-wrap:anywhere\">' + escapeHtml(secret) + '</code>';\n html += '<button id=\"ak-copy-btn\" style=\"' + copyBtnStyle + '\" onclick=\"copyAkSecret()\" title=\"' + __t(\"common.copy\") + '\">' + copyIconSvg + '</button></div>';\n\n var mcpUrl = location.origin + \"/mcp\";\n var serverName = akSlug(__pageData && __pageData.appName);\n\n __akSnippets = {\n curl: {\n label: __t(\"accessKeys.tabCurl\"),\n hint: \"\",\n code: 'curl -H \"Authorization: Bearer ' + secret + '\" ' + location.origin + '/.well-known/service/api/did/session',\n },\n claude: {\n label: __t(\"accessKeys.tabClaude\"),\n hint: \"\",\n code: 'claude mcp add --transport http ' + serverName + ' ' + mcpUrl + ' --header \"Authorization: Bearer ' + secret + '\"',\n },\n codex: {\n label: __t(\"accessKeys.tabCodex\"),\n hint: __t(\"accessKeys.addToConfig\", { file: \"~/.codex/config.toml\" }),\n code: '[mcp_servers.' + serverName + ']\\nurl = \"' + mcpUrl + '\"\\nhttp_headers = { \"Authorization\" = \"Bearer ' + secret + '\" }',\n },\n cursor: {\n label: __t(\"accessKeys.tabCursor\"),\n hint: __t(\"accessKeys.addToConfig\", { file: \"mcp.json\" }),\n code: '{\\n \"mcpServers\": {\\n \"' + serverName + '\": {\\n \"url\": \"' + mcpUrl + '\",\\n \"headers\": {\\n \"Authorization\": \"Bearer ' + secret + '\"\\n }\\n }\\n }\\n}',\n },\n };\n\n html += '<div style=\"margin-top:16px;font-size:13px;color:var(--text-secondary)\"><strong>' + __t(\"accessKeys.usage\") + '</strong></div>';\n html += '<div style=\"display:flex;gap:4px;margin-top:8px;border-bottom:1px solid var(--border)\">';\n [\"curl\", \"claude\", \"codex\", \"cursor\"].forEach(function(key) {\n var isActive = key === \"curl\";\n html += '<button type=\"button\" class=\"ak-tab-btn\" data-ak-tab=\"' + key + '\" onclick=\"switchAkTab(\\'' + key + '\\')\" style=\"padding:6px 12px;font-size:12px;font-weight:500;border:none;background:none;cursor:pointer;color:' + (isActive ? \"var(--text-white)\" : \"var(--text-tertiary)\") + ';border-bottom:2px solid ' + (isActive ? \"var(--text-white)\" : \"transparent\") + '\">' + __akSnippets[key].label + '</button>';\n });\n html += '</div>';\n html += '<div id=\"ak-snippet-hint\" style=\"margin-top:8px;font-size:12px;color:var(--text-secondary);display:none\"></div>';\n html += '<div style=\"position:relative;margin-top:6px\"><pre id=\"ak-snippet-display\" style=\"margin:0;display:block;padding:12px 40px 12px 12px;background:var(--bg-base);border:1px solid var(--border);border-radius:6px;font-size:12px;white-space:pre-wrap;word-break:break-all;overflow-wrap:anywhere;user-select:all;font-family:inherit\"></pre>';\n html += '<button id=\"ak-snippet-copy-btn\" style=\"' + copyBtnStyle + '\" onclick=\"copyAkSnippet()\" title=\"' + __t(\"common.copy\") + '\">' + copyIconSvg + '</button></div>';\n\n openDialog(__t(\"accessKeys.secretTitle\"), html, __t(\"accessKeys.done\"), function() {\n document.getElementById(\"ak-secret-display\").textContent = \"\";\n __akSnippets = null;\n closeDialog();\n });\n\n switchAkTab(\"curl\");\n}\n\nfunction switchAkTab(key) {\n var snippet = __akSnippets && __akSnippets[key];\n if (!snippet) return;\n\n document.querySelectorAll(\".ak-tab-btn\").forEach(function(btn) {\n var isActive = btn.getAttribute(\"data-ak-tab\") === key;\n btn.style.color = isActive ? \"var(--text-white)\" : \"var(--text-tertiary)\";\n btn.style.borderBottomColor = isActive ? \"var(--text-white)\" : \"transparent\";\n });\n\n var hintEl = document.getElementById(\"ak-snippet-hint\");\n if (hintEl) {\n hintEl.textContent = snippet.hint || \"\";\n hintEl.style.display = snippet.hint ? \"block\" : \"none\";\n }\n var displayEl = document.getElementById(\"ak-snippet-display\");\n if (displayEl) displayEl.textContent = snippet.code;\n}\n\nfunction copyAkSnippet() {\n var text = document.getElementById(\"ak-snippet-display\").textContent;\n var btn = document.getElementById(\"ak-snippet-copy-btn\");\n var origHtml = btn.innerHTML;\n function onCopied() {\n btn.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 13l4 4L19 7\"/></svg>';\n btn.style.color = \"var(--green)\";\n setTimeout(function() { btn.innerHTML = origHtml; btn.style.color = \"\"; }, 2000);\n }\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(text).then(onCopied).catch(function() {\n fallbackCopy(text);\n onCopied();\n });\n } else {\n fallbackCopy(text);\n onCopied();\n }\n}\n\nfunction copyAkSecret() {\n var text = document.getElementById(\"ak-secret-display\").textContent;\n var btn = document.getElementById(\"ak-copy-btn\");\n var origHtml = btn.innerHTML;\n function onCopied() {\n btn.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 13l4 4L19 7\"/></svg>';\n btn.style.color = \"var(--green)\";\n setTimeout(function() { btn.innerHTML = origHtml; btn.style.color = \"\"; }, 2000);\n }\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(text).then(onCopied).catch(function() {\n fallbackCopy(text);\n onCopied();\n });\n } else {\n fallbackCopy(text);\n onCopied();\n }\n}\n\nasync function openEditAkDialog(accessKeyId) {\n var data = await apiRaw(\"GET\", \"/.well-known/service/api/access-keys/\" + encodeURIComponent(accessKeyId));\n if (!data || data.error) { showToast(__t(\"accessKeys.loadKeyFailed\"), \"error\"); return; }\n\n var html = '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.col.keyId\") + '</label><code style=\"font-size:12px\">' + escapeHtml(data.accessKeyId) + '</code></div>';\n html += '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.role\") + '</label><span class=\"badge badge-' + data.role + '\">' + __t(\"common.\" + data.role) + '</span></div>';\n html += '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.remark\") + '</label><input type=\"text\" class=\"input\" id=\"ak-edit-remark\" value=\"' + escapeHtml(data.remark || \"\") + '\" maxlength=\"200\" /></div>';\n html += '<div class=\"form-group\"><label class=\"form-label\">' + __t(\"accessKeys.expiration\") + '</label><input type=\"datetime-local\" class=\"input\" id=\"ak-edit-expiry\" value=\"' + (data.expireAt ? data.expireAt.slice(0,16) : \"\") + '\" /> <label style=\"margin-top:4px;display:block;font-size:13px\"><input type=\"checkbox\" id=\"ak-edit-no-expiry\"' + (data.expireAt ? \"\" : \" checked\") + ' onchange=\"toggleAkEditExpiry()\" /> ' + __t(\"accessKeys.neverExpires\") + '</label></div>';\n\n openDialog(__t(\"accessKeys.editTitle\"), html, __t(\"common.save\"), async function() {\n var remark = document.getElementById(\"ak-edit-remark\").value;\n var noExpiry = document.getElementById(\"ak-edit-no-expiry\").checked;\n var expireAt = noExpiry ? null : (document.getElementById(\"ak-edit-expiry\").value ? new Date(document.getElementById(\"ak-edit-expiry\").value).toISOString() : undefined);\n\n var body = { remark: remark };\n if (expireAt !== undefined) body.expireAt = expireAt;\n\n var result = await apiRaw(\"PUT\", \"/.well-known/service/api/access-keys/\" + encodeURIComponent(accessKeyId), body);\n if (!result || result.error) {\n showToast(result ? result.error : __t(\"accessKeys.updateFailed\"), \"error\");\n return;\n }\n closeDialog();\n showToast(__t(\"accessKeys.keyUpdated\"), \"success\");\n loadAccessKeys(akPage);\n });\n}\n\nfunction toggleAkEditExpiry() {\n var noExpiry = document.getElementById(\"ak-edit-no-expiry\").checked;\n document.getElementById(\"ak-edit-expiry\").disabled = noExpiry;\n}\n\nfunction confirmDeleteAk(accessKeyId, label) {\n openDialog(__t(\"accessKeys.deleteTitle\"), '<p>' + __t(\"accessKeys.deleteMsg\", { label: escapeHtml(label) }) + '</p><p style=\"color:var(--error)\">' + __t(\"accessKeys.deleteWarning\") + '</p>', __t(\"common.delete\"), async function() {\n var result = await apiRaw(\"DELETE\", \"/.well-known/service/api/access-keys/\" + encodeURIComponent(accessKeyId));\n if (result && result.error) {\n showToast(result.error, \"error\");\n return;\n }\n closeDialog();\n showToast(__t(\"accessKeys.keyDeleted\"), \"success\");\n loadAccessKeys(akPage);\n });\n}\n\n// Direct API call (bypasses team handler's /team prefix)\nasync function apiRaw(method, path, body) {\n try {\n var opts = { method: method, headers: { \"Accept\": \"application/json\" } };\n if (body !== undefined) {\n opts.headers[\"Content-Type\"] = \"application/json\";\n opts.body = JSON.stringify(body);\n }\n var res = await fetch(path, opts);\n if (res.status === 204) return {};\n return await res.json();\n } catch(e) {\n return null;\n }\n}\n\nregisterTab(\"access-keys\", function() { loadAccessKeys(1); });\n";
|
|
7
7
|
export {};
|
|
8
8
|
//# sourceMappingURL=tab-access-keys.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-access-keys.d.ts","sourceRoot":"","sources":["../../../src/pages/admin/tab-access-keys.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;AAEpE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAoBhD;AAED,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"tab-access-keys.d.ts","sourceRoot":"","sources":["../../../src/pages/admin/tab-access-keys.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;AAEpE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAoBhD;AAED,eAAO,MAAM,sBAAsB,m/jBAqSlC,CAAC"}
|
|
@@ -131,26 +131,90 @@ function toggleAkCustomExpiry() {
|
|
|
131
131
|
else wrap.classList.add("hidden");
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
+
// Slugify a display name into something safe to use as an MCP server name
|
|
135
|
+
// (lowercase, alnum + hyphens). Falls back to a fixed default when empty.
|
|
136
|
+
function akSlug(s) {
|
|
137
|
+
var slug = String(s || "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
138
|
+
return slug || "did-connect";
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
var __akSnippets = null;
|
|
142
|
+
|
|
134
143
|
function showSecretDialog(secret) {
|
|
135
144
|
var html = '<div style="margin-bottom:12px;color:var(--error);font-weight:500">' + __t("accessKeys.secretWarning") + '</div>';
|
|
136
145
|
var copyIconSvg = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>';
|
|
137
146
|
var copyBtnStyle = 'position:absolute;top:4px;right:4px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:var(--bg-base);border:1px solid var(--border);border-radius:4px;cursor:pointer;color:var(--text-secondary);transition:color 0.15s,border-color 0.15s';
|
|
138
147
|
html += '<div style="position:relative"><code id="ak-secret-display" style="display:block;padding:12px 40px 12px 12px;background:var(--bg-base);border:1px solid var(--border);border-radius:6px;font-size:13px;word-break:break-all;user-select:all;overflow-wrap:anywhere">' + escapeHtml(secret) + '</code>';
|
|
139
148
|
html += '<button id="ak-copy-btn" style="' + copyBtnStyle + '" onclick="copyAkSecret()" title="' + __t("common.copy") + '">' + copyIconSvg + '</button></div>';
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
149
|
+
|
|
150
|
+
var mcpUrl = location.origin + "/mcp";
|
|
151
|
+
var serverName = akSlug(__pageData && __pageData.appName);
|
|
152
|
+
|
|
153
|
+
__akSnippets = {
|
|
154
|
+
curl: {
|
|
155
|
+
label: __t("accessKeys.tabCurl"),
|
|
156
|
+
hint: "",
|
|
157
|
+
code: 'curl -H "Authorization: Bearer ' + secret + '" ' + location.origin + '/.well-known/service/api/did/session',
|
|
158
|
+
},
|
|
159
|
+
claude: {
|
|
160
|
+
label: __t("accessKeys.tabClaude"),
|
|
161
|
+
hint: "",
|
|
162
|
+
code: 'claude mcp add --transport http ' + serverName + ' ' + mcpUrl + ' --header "Authorization: Bearer ' + secret + '"',
|
|
163
|
+
},
|
|
164
|
+
codex: {
|
|
165
|
+
label: __t("accessKeys.tabCodex"),
|
|
166
|
+
hint: __t("accessKeys.addToConfig", { file: "~/.codex/config.toml" }),
|
|
167
|
+
code: '[mcp_servers.' + serverName + ']\\nurl = "' + mcpUrl + '"\\nhttp_headers = { "Authorization" = "Bearer ' + secret + '" }',
|
|
168
|
+
},
|
|
169
|
+
cursor: {
|
|
170
|
+
label: __t("accessKeys.tabCursor"),
|
|
171
|
+
hint: __t("accessKeys.addToConfig", { file: "mcp.json" }),
|
|
172
|
+
code: '{\\n "mcpServers": {\\n "' + serverName + '": {\\n "url": "' + mcpUrl + '",\\n "headers": {\\n "Authorization": "Bearer ' + secret + '"\\n }\\n }\\n }\\n}',
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
html += '<div style="margin-top:16px;font-size:13px;color:var(--text-secondary)"><strong>' + __t("accessKeys.usage") + '</strong></div>';
|
|
177
|
+
html += '<div style="display:flex;gap:4px;margin-top:8px;border-bottom:1px solid var(--border)">';
|
|
178
|
+
["curl", "claude", "codex", "cursor"].forEach(function(key) {
|
|
179
|
+
var isActive = key === "curl";
|
|
180
|
+
html += '<button type="button" class="ak-tab-btn" data-ak-tab="' + key + '" onclick="switchAkTab(\\'' + key + '\\')" style="padding:6px 12px;font-size:12px;font-weight:500;border:none;background:none;cursor:pointer;color:' + (isActive ? "var(--text-white)" : "var(--text-tertiary)") + ';border-bottom:2px solid ' + (isActive ? "var(--text-white)" : "transparent") + '">' + __akSnippets[key].label + '</button>';
|
|
181
|
+
});
|
|
182
|
+
html += '</div>';
|
|
183
|
+
html += '<div id="ak-snippet-hint" style="margin-top:8px;font-size:12px;color:var(--text-secondary);display:none"></div>';
|
|
184
|
+
html += '<div style="position:relative;margin-top:6px"><pre id="ak-snippet-display" style="margin:0;display:block;padding:12px 40px 12px 12px;background:var(--bg-base);border:1px solid var(--border);border-radius:6px;font-size:12px;white-space:pre-wrap;word-break:break-all;overflow-wrap:anywhere;user-select:all;font-family:inherit"></pre>';
|
|
185
|
+
html += '<button id="ak-snippet-copy-btn" style="' + copyBtnStyle + '" onclick="copyAkSnippet()" title="' + __t("common.copy") + '">' + copyIconSvg + '</button></div>';
|
|
144
186
|
|
|
145
187
|
openDialog(__t("accessKeys.secretTitle"), html, __t("accessKeys.done"), function() {
|
|
146
188
|
document.getElementById("ak-secret-display").textContent = "";
|
|
189
|
+
__akSnippets = null;
|
|
147
190
|
closeDialog();
|
|
148
191
|
});
|
|
192
|
+
|
|
193
|
+
switchAkTab("curl");
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function switchAkTab(key) {
|
|
197
|
+
var snippet = __akSnippets && __akSnippets[key];
|
|
198
|
+
if (!snippet) return;
|
|
199
|
+
|
|
200
|
+
document.querySelectorAll(".ak-tab-btn").forEach(function(btn) {
|
|
201
|
+
var isActive = btn.getAttribute("data-ak-tab") === key;
|
|
202
|
+
btn.style.color = isActive ? "var(--text-white)" : "var(--text-tertiary)";
|
|
203
|
+
btn.style.borderBottomColor = isActive ? "var(--text-white)" : "transparent";
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
var hintEl = document.getElementById("ak-snippet-hint");
|
|
207
|
+
if (hintEl) {
|
|
208
|
+
hintEl.textContent = snippet.hint || "";
|
|
209
|
+
hintEl.style.display = snippet.hint ? "block" : "none";
|
|
210
|
+
}
|
|
211
|
+
var displayEl = document.getElementById("ak-snippet-display");
|
|
212
|
+
if (displayEl) displayEl.textContent = snippet.code;
|
|
149
213
|
}
|
|
150
214
|
|
|
151
|
-
function
|
|
152
|
-
var text = document.getElementById("ak-
|
|
153
|
-
var btn = document.getElementById("ak-
|
|
215
|
+
function copyAkSnippet() {
|
|
216
|
+
var text = document.getElementById("ak-snippet-display").textContent;
|
|
217
|
+
var btn = document.getElementById("ak-snippet-copy-btn");
|
|
154
218
|
var origHtml = btn.innerHTML;
|
|
155
219
|
function onCopied() {
|
|
156
220
|
btn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 13l4 4L19 7"/></svg>';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-access-keys.js","sourceRoot":"","sources":["../../../src/pages/admin/tab-access-keys.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,iBAAiB,CAAC,CAAM;IACtC,OAAO,UAAU,CAAC;;8BAEU,CAAC,CAAC,kBAAkB,CAAC;4BACvB,CAAC,CAAC,iBAAiB,CAAC;;;;;0EAK0B,CAAC,CAAC,mBAAmB,CAAC;;4EAEpB,CAAC,CAAC,sBAAsB,CAAC;;;;;;;;CAQpG,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC
|
|
1
|
+
{"version":3,"file":"tab-access-keys.js","sourceRoot":"","sources":["../../../src/pages/admin/tab-access-keys.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,iBAAiB,CAAC,CAAM;IACtC,OAAO,UAAU,CAAC;;8BAEU,CAAC,CAAC,kBAAkB,CAAC;4BACvB,CAAC,CAAC,iBAAiB,CAAC;;;;;0EAK0B,CAAC,CAAC,mBAAmB,CAAC;;4EAEpB,CAAC,CAAC,sBAAsB,CAAC;;;;;;;;CAQpG,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqS9C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arcblock/did-connect-service",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.10",
|
|
4
4
|
"description": "Multi-runtime authentication service framework — Passkey, DID Connect, OAuth, Email, Team, RBAC",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -58,8 +58,8 @@
|
|
|
58
58
|
"ufo": "^1.6.4",
|
|
59
59
|
"ultrahtml": "^1.6.0",
|
|
60
60
|
"valibot": "^1.3.1",
|
|
61
|
-
"@arcblock/did-connect-
|
|
62
|
-
"@arcblock/did-connect-
|
|
61
|
+
"@arcblock/did-connect-js": "^4.1.10",
|
|
62
|
+
"@arcblock/did-connect-core": "^4.1.10"
|
|
63
63
|
},
|
|
64
64
|
"optionalDependencies": {
|
|
65
65
|
"@aigne/afs": "^1.11.0-beta.13"
|