nextcloud/dist/federation-settings-admin.mjs.map
Ferdinand Thiessen b4b5986be9 chore: compile assets
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-01-27 23:52:40 +01:00

1 line
No EOL
18 KiB
Text

{"version":3,"file":"federation-settings-admin.mjs","sources":["../build/frontend/apps/federation/src/services/api.ts","../build/frontend/apps/federation/src/services/logger.ts","../build/frontend/apps/federation/src/components/AddTrustedServerForm.vue","../build/frontend/apps/federation/src/components/TrustedServer.vue","../build/frontend/apps/federation/src/views/AdminSettings.vue","../build/frontend/apps/federation/src/settings-admin.ts"],"sourcesContent":["/*!\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { OCSResponse } from '@nextcloud/typings/ocs'\n\nimport axios, { isAxiosError } from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nexport const TrustedServerStatus = Object.freeze({\n\t/** after a user list was exchanged at least once successfully */\n\tSTATUS_OK: 1,\n\t/** waiting for shared secret or initial user list exchange */\n\tSTATUS_PENDING: 2,\n\t/** something went wrong, misconfigured server, software bug,... user interaction needed */\n\tSTATUS_FAILURE: 3,\n\t/** remote server revoked access */\n\tSTATUS_ACCESS_REVOKED: 4,\n})\n\nexport interface ITrustedServer {\n\tid: number\n\turl: string\n\tstatus: typeof TrustedServerStatus[keyof typeof TrustedServerStatus]\n}\n\nexport class ApiError extends Error {}\n\n/**\n * Add a new trusted server\n *\n * @param url - The new URL to add\n */\nexport async function addServer(url: string): Promise<ITrustedServer> {\n\ttry {\n\t\tconst { data } = await axios.post<OCSResponse<Omit<ITrustedServer, 'status'>>>(\n\t\t\tgenerateOcsUrl('apps/federation/trusted-servers'),\n\t\t\t{ url },\n\t\t)\n\n\t\tconst serverData = data.ocs.data\n\t\treturn {\n\t\t\tid: serverData.id,\n\t\t\turl: serverData.url,\n\t\t\tstatus: TrustedServerStatus.STATUS_PENDING,\n\t\t}\n\t} catch (error) {\n\t\tthrow mapError(error)\n\t}\n}\n\n/**\n * @param id - The id of the trusted server to remove\n */\nexport async function deleteServer(id: number): Promise<void> {\n\ttry {\n\t\tawait axios.delete(generateOcsUrl(`apps/federation/trusted-servers/${id}`))\n\t} catch (error) {\n\t\tthrow mapError(error)\n\t}\n}\n\n/**\n * Error handling for API calls\n *\n * @param error - The catch error\n */\nfunction mapError(error: unknown): ApiError | unknown {\n\tif (isAxiosError(error) && error.response?.data?.ocs) {\n\t\treturn new ApiError((error.response.data as OCSResponse).ocs.meta.message, { cause: error })\n\t}\n\treturn error\n}\n","/*!\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport const logger = getLoggerBuilder().setApp('federation').build()\n","<!--\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { ITrustedServer } from '../services/api.ts'\n\nimport { mdiPlus } from '@mdi/js'\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { t } from '@nextcloud/l10n'\nimport { nextTick, ref, useTemplateRef } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport NcTextField from '@nextcloud/vue/components/NcTextField'\nimport { addServer, ApiError } from '../services/api.ts'\nimport { logger } from '../services/logger.ts'\n\nconst emit = defineEmits<{\n\tadd: [server: ITrustedServer]\n}>()\n\nconst formElement = useTemplateRef<HTMLFormElement>('form')\nconst newServerUrl = ref('')\n\n/**\n * Handle add trusted server form submission\n */\nasync function onAdd() {\n\ttry {\n\t\tconst server = await addServer(newServerUrl.value)\n\t\tnewServerUrl.value = ''\n\t\temit('add', server)\n\n\t\tnextTick(() => formElement.value?.reset()) // Reset native form validation state\n\t\tshowSuccess(t('federation', 'Added to the list of trusted servers'))\n\t} catch (error) {\n\t\tlogger.error('Failed to add trusted server', { error })\n\t\tif (error instanceof ApiError) {\n\t\t\tshowError(error.message)\n\t\t} else {\n\t\t\tshowError(t('federation', 'Could not add trusted server. Please try again later.'))\n\t\t}\n\t}\n}\n</script>\n\n<template>\n\t<form ref=\"form\" @submit.prevent=\"onAdd\">\n\t\t<h3 :class=\"$style.addTrustedServerForm__heading\">\n\t\t\t{{ t('federation', 'Add trusted server') }}\n\t\t</h3>\n\t\t<div :class=\"$style.addTrustedServerForm__wrapper\">\n\t\t\t<NcTextField\n\t\t\t\tv-model=\"newServerUrl\"\n\t\t\t\t:label=\"t('federation', 'Server url')\"\n\t\t\t\tplaceholder=\"https://…\"\n\t\t\t\trequired\n\t\t\t\ttype=\"url\" />\n\t\t\t<NcButton\n\t\t\t\t:class=\"$style.addTrustedServerForm__submitButton\"\n\t\t\t\t:aria-label=\"t('federation', 'Add')\"\n\t\t\t\t:title=\"t('federation', 'Add')\"\n\t\t\t\ttype=\"submit\"\n\t\t\t\tvariant=\"primary\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiPlus\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\t\t</div>\n\t</form>\n</template>\n\n<style module>\n.addTrustedServerForm__heading {\n\tfont-size: 1.2rem;\n\tmargin-block: 0.5lh 0.25lh;\n}\n\n.addTrustedServerForm__wrapper {\n\tdisplay: flex;\n\tgap: var(--default-grid-baseline);\n\talign-items: end;\n\tmax-width: 600px;\n}\n\n.addTrustedServerForm__submitButton {\n\tmax-height: var(--default-clickable-area);\n}\n</style>\n","<!--\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { ITrustedServer } from '../services/api.ts'\n\nimport { mdiCheckNetworkOutline, mdiCloseNetworkOutline, mdiHelpNetworkOutline, mdiTrashCanOutline } from '@mdi/js'\nimport { showError } from '@nextcloud/dialogs'\nimport { t } from '@nextcloud/l10n'\nimport { computed, ref } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\nimport { TrustedServerStatus } from '../services/api.ts'\nimport { deleteServer } from '../services/api.ts'\nimport { logger } from '../services/logger.ts'\n\nconst props = defineProps<{\n\tserver: ITrustedServer\n}>()\n\nconst emit = defineEmits<{\n\tdelete: [ITrustedServer]\n}>()\n\nconst isLoading = ref(false)\n\nconst hasError = computed(() => props.server.status === TrustedServerStatus.STATUS_FAILURE)\nconst serverIcon = computed(() => {\n\tswitch (props.server.status) {\n\t\tcase TrustedServerStatus.STATUS_OK:\n\t\t\treturn mdiCheckNetworkOutline\n\t\tcase TrustedServerStatus.STATUS_PENDING:\n\t\tcase TrustedServerStatus.STATUS_ACCESS_REVOKED:\n\t\t\treturn mdiHelpNetworkOutline\n\t\tcase TrustedServerStatus.STATUS_FAILURE:\n\t\tdefault:\n\t\t\treturn mdiCloseNetworkOutline\n\t}\n})\n\nconst serverStatus = computed(() => {\n\tswitch (props.server.status) {\n\t\tcase TrustedServerStatus.STATUS_OK:\n\t\t\treturn [t('federation', 'Server ok'), t('federation', 'User list was exchanged at least once successfully with the remote server.')]\n\t\tcase TrustedServerStatus.STATUS_PENDING:\n\t\t\treturn [t('federation', 'Server pending'), t('federation', 'Waiting for shared secret or initial user list exchange.')]\n\t\tcase TrustedServerStatus.STATUS_ACCESS_REVOKED:\n\t\t\treturn [t('federation', 'Server access revoked'), t('federation', 'Server access revoked')]\n\t\tcase TrustedServerStatus.STATUS_FAILURE:\n\t\tdefault:\n\t\t\treturn [t('federation', 'Server failure'), t('federation', 'Connection to the remote server failed or the remote server is misconfigured.')]\n\t}\n})\n\n/**\n * Emit delete event\n */\nasync function onDelete() {\n\ttry {\n\t\tisLoading.value = true\n\t\tawait deleteServer(props.server.id)\n\t\temit('delete', props.server)\n\t} catch (error) {\n\t\tisLoading.value = false\n\t\tlogger.error('Failed to delete trusted server', { error })\n\t\tshowError(t('federation', 'Failed to delete trusted server. Please try again later.'))\n\t}\n}\n</script>\n\n<template>\n\t<li :class=\"$style.trustedServer\">\n\t\t<NcIconSvgWrapper\n\t\t\t:class=\"{\n\t\t\t\t[$style.trustedServer__icon_error]: hasError,\n\t\t\t}\"\n\t\t\t:path=\"serverIcon\"\n\t\t\t:name=\"serverStatus[0]\"\n\t\t\t:title=\"serverStatus[1]\" />\n\n\t\t<code :class=\"$style.trustedServer__url\" v-text=\"server.url\" />\n\n\t\t<NcButton\n\t\t\t:aria-label=\"t('federation', 'Delete')\"\n\t\t\t:title=\"t('federation', 'Delete')\"\n\t\t\t:disabled=\"isLoading\"\n\t\t\t@click=\"onDelete\">\n\t\t\t<template #icon>\n\t\t\t\t<NcLoadingIcon v-if=\"isLoading\" />\n\t\t\t\t<NcIconSvgWrapper v-else :path=\"mdiTrashCanOutline\" />\n\t\t\t</template>\n\t\t</NcButton>\n\t</li>\n</template>\n\n<style module>\n.trustedServer {\n\tdisplay: flex;\n\tflex-direction: row;\n\tgap: var(--default-grid-baseline);\n\talign-items: center;\n\tborder-radius: var(--border-radius-element);\n\tpadding-inline-start: var(--default-grid-baseline);\n}\n\n.trustedServer:hover {\n\tbackground-color: var(--color-background-hover);\n}\n\n.trustedServer__icon_error {\n\tcolor: var(--color-element-error);\n}\n\n.trustedServer__url {\n\tpadding-inline: 1ch;\n\tflex: 1 0 auto;\n}\n</style>\n","<!--\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { ITrustedServer } from '../services/api.ts'\n\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { computed, ref } from 'vue'\nimport NcNoteCard from '@nextcloud/vue/components/NcNoteCard'\nimport NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'\nimport AddTrustedServerForm from '../components/AddTrustedServerForm.vue'\nimport TrustedServer from '../components/TrustedServer.vue'\nimport { TrustedServerStatus } from '../services/api.ts'\n\nconst adminSettings = loadState<{ docUrl: string, trustedServers: ITrustedServer[] }>('federation', 'adminSettings')\nconst trustedServers = ref(adminSettings.trustedServers)\nconst showPendingServerInfo = computed(() => trustedServers.value.some((server) => server.status === TrustedServerStatus.STATUS_PENDING))\n\n/**\n * Handle add trusted server form submission\n *\n * @param server - The server to add\n */\nasync function onAdd(server: ITrustedServer) {\n\ttrustedServers.value.unshift(server)\n}\n\n/**\n * Handle delete trusted server event\n *\n * @param server - The server to delete\n */\nfunction onDelete(server: ITrustedServer) {\n\ttrustedServers.value = trustedServers.value.filter((s) => s.id !== server.id)\n}\n</script>\n\n<template>\n\t<NcSettingsSection\n\t\t:name=\"t('federation', 'Trusted servers')\"\n\t\t:docUrl=\"adminSettings.docUrl\"\n\t\t:description=\"t('federation', 'Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share.')\">\n\t\t<NcNoteCard\n\t\t\tv-if=\"showPendingServerInfo\"\n\t\t\ttype=\"info\"\n\t\t\t:text=\"t('federation', 'Each server must validate the other. This process may require a few cron cycles.')\" />\n\n\t\t<TransitionGroup\n\t\t\t:class=\"$style.federationAdminSettings__trustedServersList\"\n\t\t\t:aria-label=\"t('federation', 'Trusted servers')\"\n\t\t\ttag=\"ul\"\n\t\t\t:enterFromClass=\"$style.transition_hidden\"\n\t\t\t:enterActiveClass=\"$style.transition_active\"\n\t\t\t:leaveActiveClass=\"$style.transition_active\"\n\t\t\t:leaveToClass=\"$style.transition_hidden\">\n\t\t\t<TrustedServer\n\t\t\t\tv-for=\"server in trustedServers\"\n\t\t\t\t:key=\"server.id\"\n\t\t\t\t:class=\"$style.federationAdminSettings__trustedServersListItem\"\n\t\t\t\t:server=\"server\"\n\t\t\t\t@delete=\"onDelete\" />\n\t\t</TransitionGroup>\n\n\t\t<AddTrustedServerForm @add=\"onAdd\" />\n\t</NcSettingsSection>\n</template>\n\n<style module>\n.federationAdminSettings__trustedServersList {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-grid-baseline);\n\twidth: fit-content;\n}\n\n.federationAdminSettings__trustedServersListItem {\n\twidth: 100%;\n}\n\n.transition_active {\n\ttransition: all 0.5s ease;\n}\n\n.transition_hidden {\n\topacity: 0;\n\ttransform: translateX(30px);\n}\n</style>\n","/*!\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { createApp } from 'vue'\nimport AdminSettings from './views/AdminSettings.vue'\n\nconst app = createApp(AdminSettings)\napp.mount('#federation-admin-settings')\n"],"names":["TrustedServerStatus","ApiError","addServer","url","data","axios","generateOcsUrl","serverData","error","mapError","deleteServer","id","isAxiosError","logger","getLoggerBuilder","emit","__emit","formElement","useTemplateRef","newServerUrl","ref","onAdd","server","nextTick","showSuccess","t","showError","_createElementBlock","_createElementVNode","_normalizeClass","$style","_unref","_createVNode","NcTextField","$event","NcButton","NcIconSvgWrapper","mdiPlus","props","__props","isLoading","hasError","computed","serverIcon","mdiCheckNetworkOutline","mdiHelpNetworkOutline","mdiCloseNetworkOutline","serverStatus","onDelete","_toDisplayString","_createBlock","NcLoadingIcon","mdiTrashCanOutline","adminSettings","loadState","trustedServers","showPendingServerInfo","s","NcSettingsSection","NcNoteCard","_TransitionGroup","_Fragment","_renderList","TrustedServer","AddTrustedServerForm","app","createApp","AdminSettings"],"mappings":"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"}