diff --git a/assets/vue/components/Breadcrumb.vue b/assets/vue/components/Breadcrumb.vue index cab5d10f626..acda8e2c98b 100644 --- a/assets/vue/components/Breadcrumb.vue +++ b/assets/vue/components/Breadcrumb.vue @@ -232,7 +232,24 @@ function resolveSettingsSectionLabel(nsRaw) { watchEffect(() => { if ("/" === route.fullPath) return itemList.value = [] +// special-case accessurl routes + if (/^\/resources\/accessurl\/[^\/]+\/delete(?:\/|$)/.test(route.path)) { + itemList.value = [] + itemList.value.push({ + label: t("Administration"), + url: "/main/admin/index.php", + }) + + itemList.value.push({ + label: t("Multiple access URL / Branding"), + url: "/main/admin/access_urls.php", + }) + + itemList.value.push({ label: t("Delete access") }) + + return + } if (buildManualBreadcrumbIfNeeded()) return // Static route categories diff --git a/assets/vue/router/index.js b/assets/vue/router/index.js index 1a8ca46af89..05a2f790e7c 100644 --- a/assets/vue/router/index.js +++ b/assets/vue/router/index.js @@ -66,6 +66,12 @@ const router = createRouter({ showBreadcrumb: false, }, }, + { + path: '/resources/accessurl/:id/delete', + name: 'AccessUrlDelete', + component: () => import('../views/accessurl/DeleteAccessUrl.vue'), + props: route => ({ id: Number(route.params.id) }) + }, { path: "/home", name: "Home", diff --git a/assets/vue/services/accessurlService.js b/assets/vue/services/accessurlService.js index db938e2e2eb..cee947951ea 100644 --- a/assets/vue/services/accessurlService.js +++ b/assets/vue/services/accessurlService.js @@ -11,6 +11,51 @@ export async function findUserActivePortals(userIri) { return items } +async function getUrl(id) { + const apiUrl = `/api/access_urls/${encodeURIComponent(id)}`; + try { + const resp = await fetch(apiUrl, { + credentials: "same-origin", + headers: { Accept: "application/json" }, + }); + if (resp.ok) { + const contentType = resp.headers.get("content-type") || ""; + return contentType.includes("application/json") ? resp.json() : { url: await resp.text() }; + } + } catch (err) { + } +} + +async function deleteAccessUrl(id, confirmValue, secToken = "") { + const url = `/api/access_urls/${encodeURIComponent(id)}` + const resp = await fetch(url, { + method: "DELETE", + credentials: "same-origin", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + ...(secToken ? { "X-CSRF-Token": secToken } : {}), + }, + body: JSON.stringify({ confirm_value: String(confirmValue) }), + }) + + if (!resp.ok) { + const txt = await resp.text() + throw new Error(txt || "Delete failed") + } + + const contentType = resp.headers.get("content-type") || "" + if (contentType.includes("application/json")) { + return resp.json() + } + return { message: await resp.text(), redirectUrl: "/main/admin/access_urls.php" } +} + +export default { + deleteAccessUrl, + getUrl, +} + export async function findAll() { const { items } = await baseService.getCollection("/api/access_urls") diff --git a/assets/vue/views/accessurl/DeleteAccessUrl.vue b/assets/vue/views/accessurl/DeleteAccessUrl.vue new file mode 100644 index 00000000000..c42b76332fc --- /dev/null +++ b/assets/vue/views/accessurl/DeleteAccessUrl.vue @@ -0,0 +1,104 @@ + + + diff --git a/public/main/admin/access_urls.php b/public/main/admin/access_urls.php index 7d6c6e40f38..1495cbef950 100644 --- a/public/main/admin/access_urls.php +++ b/public/main/admin/access_urls.php @@ -76,7 +76,7 @@ } $parameters['sec_token'] = Security::get_token(); - +echo ''; // Checking if the admin is registered in all sites if (!api_is_admin_in_all_active_urls()) { // Get the list of unregistered urls @@ -213,8 +213,11 @@ ); if ($u->getId() !== 1) { - $rowActions .= '' . + // build a link to the Vue route that will open DeleteAccessUrl.vue + $urlEncoded = rawurlencode($u->getUrl()); + $secTokenEncoded = rawurlencode($parameters['sec_token']); + $vueHref = api_get_path(WEB_PATH) . 'resources/accessurl/' . $u->getId() . '/delete?url=' . $urlEncoded . '&sec_token=' . $secTokenEncoded; + $rowActions .= '' . Display::getMdiIcon('delete', 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Delete')) . ''; }