Merge pull request #57341 from nextcloud/refactor/federation-vue3
Some checks are pending
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Integration sqlite / changes (push) Waiting to run
Integration sqlite / integration-sqlite (master, 8.4, main, --tags ~@large files_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, capabilities_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, collaboration_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, comments_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, dav_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, federation_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, file_conversions) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, files_reminders) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, filesdrop_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, ldap_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, openldap_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, openldap_numerical_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, remoteapi_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, routing_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, setup_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, sharees_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, sharing_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, theming_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, videoverification_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite-summary (push) Blocked by required conditions
Psalm static code analysis / static-code-analysis (push) Waiting to run
Psalm static code analysis / static-code-analysis-security (push) Waiting to run
Psalm static code analysis / static-code-analysis-ocp (push) Waiting to run
Psalm static code analysis / static-code-analysis-ncu (push) Waiting to run

refactor(federation): migrate app frontend (admin settings) to Vue 3
This commit is contained in:
Ferdinand Thiessen 2026-01-05 20:07:18 +01:00 committed by GitHub
commit 8cc588fc42
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
180 changed files with 1126 additions and 343 deletions

View file

@ -1,116 +0,0 @@
/*!
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
/**
* @param $ - The jQuery instance
*/
(function($) {
// ocFederationAddServer
$.fn.ocFederationAddServer = function() {
/* Go easy on jquery and define some vars
========================================================================== */
const $wrapper = $(this),
// Buttons
$btnAddServer = $wrapper.find('#ocFederationAddServerButton'),
$btnSubmit = $wrapper.find('#ocFederationSubmit'),
// Inputs
$inpServerUrl = $wrapper.find('#serverUrl'),
// misc
$msgBox = $wrapper.find('#ocFederationAddServer .msg'),
$srvList = $wrapper.find('#listOfTrustedServers')
/* Interaction
========================================================================== */
$btnAddServer.on('click', function() {
$btnAddServer.addClass('hidden')
$wrapper.find('.serverUrl').removeClass('hidden')
$inpServerUrl
.focus()
})
// trigger server removal
$srvList.on('click', 'li > .icon-delete', function() {
const $this = $(this).parent()
const id = $this.attr('id')
removeServer(id)
})
$btnSubmit.on('click', function() {
addServer($inpServerUrl.val())
})
$inpServerUrl.on('change keyup', function(e) {
const url = $(this).val()
// toggle add-button visibility based on input length
if (url.length > 0) { $btnSubmit.removeClass('hidden') } else { $btnSubmit.addClass('hidden') }
if (e.keyCode === 13) { // add server on "enter"
addServer(url)
} else if (e.keyCode === 27) { // hide input filed again in ESC
$btnAddServer.removeClass('hidden')
$inpServerUrl.val('').addClass('hidden')
$btnSubmit.addClass('hidden')
}
})
}
/* private Functions
========================================================================== */
/**
*
* @param url
*/
function addServer(url) {
OC.msg.startSaving('#ocFederationAddServer .msg')
$.post(
OC.getRootPath() + '/ocs/v2.php/apps/federation/trusted-servers',
{
url,
},
null,
'json',
).done(function({ ocs }) {
const data = ocs.data
$('#serverUrl').attr('value', '')
$('#listOfTrustedServers').prepend($('<li>')
.attr('id', data.id)
.html('<span class="status indeterminate"></span>'
+ data.url
+ '<span class="icon icon-delete"></span>'))
OC.msg.finishedSuccess('#ocFederationAddServer .msg', data.message)
})
.fail(function(jqXHR) {
OC.msg.finishedError('#ocFederationAddServer .msg', JSON.parse(jqXHR.responseText).ocs.meta.message)
})
}
/**
*
* @param id
*/
function removeServer(id) {
$.ajax({
url: OC.getRootPath() + '/ocs/v2.php/apps/federation/trusted-servers/' + id,
type: 'DELETE',
success: function(response) {
$('#ocFederationSettings').find('#' + id).remove()
},
})
}
})(jQuery)
window.addEventListener('DOMContentLoaded', function() {
$('#ocFederationSettings').ocFederationAddServer()
})

View file

@ -18,11 +18,13 @@ use OCP\Federation\Events\TrustedServerRemovedEvent;
class Application extends App implements IBootstrap {
public const APP_ID = 'federation';
/**
* @param array $urlParams
*/
public function __construct($urlParams = []) {
parent::__construct('federation', $urlParams);
parent::__construct(self::APP_ID, $urlParams);
}
public function register(IRegistrationContext $context): void {

View file

@ -1,19 +1,25 @@
<?php
/**
/*!
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Federation\Settings;
use OCA\Federation\AppInfo\Application;
use OCA\Federation\TrustedServers;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\Settings\IDelegatedSettings;
use OCP\Util;
class Admin implements IDelegatedSettings {
public function __construct(
private TrustedServers $trustedServers,
private IInitialState $initialState,
private IURLGenerator $urlGenerator,
private IL10N $l,
) {
}
@ -24,9 +30,14 @@ class Admin implements IDelegatedSettings {
public function getForm() {
$parameters = [
'trustedServers' => $this->trustedServers->getServers(),
'docUrl' => $this->urlGenerator->linkToDocs('admin-sharing-federated') . '#configuring-trusted-nextcloud-servers',
];
return new TemplateResponse('federation', 'settings-admin', $parameters, '');
$this->initialState->provideInitialState('adminSettings', $parameters);
Util::addStyle(Application::APP_ID, 'settings-admin');
Util::addScript(Application::APP_ID, 'settings-admin');
return new TemplateResponse(Application::APP_ID, 'settings-admin', renderAs: '');
}
/**

View file

@ -0,0 +1,90 @@
<!--
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
import type { ITrustedServer } from '../services/api.ts'
import { mdiPlus } from '@mdi/js'
import { showError, showSuccess } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
import { nextTick, ref, useTemplateRef } from 'vue'
import NcButton from '@nextcloud/vue/components/NcButton'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
import NcTextField from '@nextcloud/vue/components/NcTextField'
import { addServer, ApiError } from '../services/api.ts'
import { logger } from '../services/logger.ts'
const emit = defineEmits<{
add: [server: ITrustedServer]
}>()
const formElement = useTemplateRef<HTMLFormElement>('form')
const newServerUrl = ref('')
/**
* Handle add trusted server form submission
*/
async function onAdd() {
try {
const server = await addServer(newServerUrl.value)
newServerUrl.value = ''
emit('add', server)
nextTick(() => formElement.value?.reset()) // Reset native form validation state
showSuccess(t('federation', 'Added to the list of trusted servers'))
} catch (error) {
logger.error('Failed to add trusted server', { error })
if (error instanceof ApiError) {
showError(error.message)
} else {
showError(t('federation', 'Could not add trusted server. Please try again later.'))
}
}
}
</script>
<template>
<form ref="form" @submit.prevent="onAdd">
<h3 :class="$style.addTrustedServerForm__heading">
{{ t('federation', 'Add trusted server') }}
</h3>
<div :class="$style.addTrustedServerForm__wrapper">
<NcTextField
v-model="newServerUrl"
:label="t('federation', 'Server url')"
placeholder="https://…"
required
type="url" />
<NcButton
:class="$style.addTrustedServerForm__submitButton"
:aria-label="t('federation', 'Add')"
:title="t('federation', 'Add')"
type="submit"
variant="primary">
<template #icon>
<NcIconSvgWrapper :path="mdiPlus" />
</template>
</NcButton>
</div>
</form>
</template>
<style module>
.addTrustedServerForm__heading {
font-size: 1.2rem;
margin-block: 0.5lh 0.25lh;
}
.addTrustedServerForm__wrapper {
display: flex;
gap: var(--default-grid-baseline);
align-items: end;
max-width: 600px;
}
.addTrustedServerForm__submitButton {
max-height: var(--default-clickable-area);
}
</style>

View file

@ -0,0 +1,121 @@
<!--
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
import type { ITrustedServer } from '../services/api.ts'
import { mdiCheckNetworkOutline, mdiCloseNetworkOutline, mdiHelpNetworkOutline, mdiTrashCanOutline } from '@mdi/js'
import { showError } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
import { computed, ref } from 'vue'
import NcButton from '@nextcloud/vue/components/NcButton'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import { TrustedServerStatus } from '../services/api.ts'
import { deleteServer } from '../services/api.ts'
import { logger } from '../services/logger.ts'
const props = defineProps<{
server: ITrustedServer
}>()
const emit = defineEmits<{
delete: [ITrustedServer]
}>()
const isLoading = ref(false)
const hasError = computed(() => props.server.status === TrustedServerStatus.STATUS_FAILURE)
const serverIcon = computed(() => {
switch (props.server.status) {
case TrustedServerStatus.STATUS_OK:
return mdiCheckNetworkOutline
case TrustedServerStatus.STATUS_PENDING:
case TrustedServerStatus.STATUS_ACCESS_REVOKED:
return mdiHelpNetworkOutline
case TrustedServerStatus.STATUS_FAILURE:
default:
return mdiCloseNetworkOutline
}
})
const serverStatus = computed(() => {
switch (props.server.status) {
case TrustedServerStatus.STATUS_OK:
return [t('federation', 'Server ok'), t('federation', 'User list was exchanged at least once successfully with the remote server.')]
case TrustedServerStatus.STATUS_PENDING:
return [t('federation', 'Server pending'), t('federation', 'Waiting for shared secret or initial user list exchange.')]
case TrustedServerStatus.STATUS_ACCESS_REVOKED:
return [t('federation', 'Server access revoked'), t('federation', 'Server access revoked')]
case TrustedServerStatus.STATUS_FAILURE:
default:
return [t('federation', 'Server failure'), t('federation', 'Connection to the remote server failed or the remote server is misconfigured.')]
}
})
/**
* Emit delete event
*/
async function onDelete() {
try {
isLoading.value = true
await deleteServer(props.server.id)
emit('delete', props.server)
} catch (error) {
isLoading.value = false
logger.error('Failed to delete trusted server', { error })
showError(t('federation', 'Failed to delete trusted server. Please try again later.'))
}
}
</script>
<template>
<li :class="$style.trustedServer">
<NcIconSvgWrapper
:class="{
[$style.trustedServer__icon_error]: hasError,
}"
:path="serverIcon"
:name="serverStatus[0]"
:title="serverStatus[1]" />
<code :class="$style.trustedServer__url" v-text="server.url" />
<NcButton
:aria-label="t('federation', 'Delete')"
:title="t('federation', 'Delete')"
:disabled="isLoading"
@click="onDelete">
<template #icon>
<NcLoadingIcon v-if="isLoading" />
<NcIconSvgWrapper v-else :path="mdiTrashCanOutline" />
</template>
</NcButton>
</li>
</template>
<style module>
.trustedServer {
display: flex;
flex-direction: row;
gap: var(--default-grid-baseline);
align-items: center;
border-radius: var(--border-radius-element);
padding-inline-start: var(--default-grid-baseline);
}
.trustedServer:hover {
background-color: var(--color-background-hover);
}
.trustedServer__icon_error {
color: var(--color-element-error);
}
.trustedServer__url {
padding-inline: 1ch;
flex: 1 0 auto;
}
</style>

View file

@ -0,0 +1,107 @@
/*!
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { http, HttpResponse } from 'msw'
import { setupServer } from 'msw/node'
import { afterAll, afterEach, beforeAll, describe, expect, test } from 'vitest'
import { addServer, ApiError, deleteServer, TrustedServerStatus } from './api.ts'
export const handlers = [
http.post('/ocs/v2.php/apps/federation/trusted-servers', async ({ request }) => {
const { url } = (await request.json()) as { url: string }
if (url === 'https://network-error.com') {
return HttpResponse.error()
}
if (url === 'https://existing-server.com') {
return HttpResponse.json({
ocs: {
meta: {
status: 'failure',
statuscode: 409,
message: 'Server already exists',
},
},
}, { status: 409 })
}
return HttpResponse.json({
ocs: {
meta: {
status: 'ok',
},
data: {
id: 1,
url,
},
},
})
}),
http.delete('/ocs/v2.php/apps/federation/trusted-servers/:id', async ({ params }) => {
if (params.id === '1') {
return HttpResponse.json({
ocs: {
meta: {
status: 'ok',
},
},
})
}
if (params.id === '2') {
return HttpResponse.json({
ocs: {
meta: {
status: 'failure',
statuscode: 404,
message: 'Server does not exist',
},
},
}, { status: 404 })
}
return HttpResponse.error()
}),
]
const server = setupServer(...handlers)
beforeAll(() => server.listen())
afterEach(() => server.resetHandlers())
afterAll(() => server.close())
describe('addServer', () => {
test('returns a trusted server object on success', async () => {
const server = await addServer('https://trusted-server.com')
expect(server).toEqual({
id: 1,
url: 'https://trusted-server.com',
status: TrustedServerStatus.STATUS_PENDING,
})
})
test('throws API error when already added', async () => {
await expect(() => addServer('https://existing-server.com')).rejects.toThrowError(ApiError)
await expect(() => addServer('https://existing-server.com')).rejects.toThrow('Server already exists')
})
test('throws error when network error occurs', async () => {
await expect(() => addServer('https://network-error.com')).rejects.toThrowError(Error)
await expect(() => addServer('https://network-error.com')).rejects.not.toThrowError(ApiError)
})
})
describe('deleteServer', () => {
test('resolves on success', async () => {
await expect(deleteServer(1)).resolves.not.toThrow()
})
test('throws API error when already added', async () => {
await expect(() => deleteServer(2)).rejects.toThrowError(ApiError)
await expect(() => deleteServer(2)).rejects.toThrow('Server does not exist')
})
test('throws error when network error occurs', async () => {
await expect(() => deleteServer(3)).rejects.toThrowError(Error)
await expect(() => deleteServer(3)).rejects.not.toThrowError(ApiError)
})
})

View file

@ -0,0 +1,74 @@
/*!
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import type { OCSResponse } from '@nextcloud/typings/ocs'
import axios, { isAxiosError } from '@nextcloud/axios'
import { generateOcsUrl } from '@nextcloud/router'
export const TrustedServerStatus = Object.freeze({
/** after a user list was exchanged at least once successfully */
STATUS_OK: 1,
/** waiting for shared secret or initial user list exchange */
STATUS_PENDING: 2,
/** something went wrong, misconfigured server, software bug,... user interaction needed */
STATUS_FAILURE: 3,
/** remote server revoked access */
STATUS_ACCESS_REVOKED: 4,
})
export interface ITrustedServer {
id: number
url: string
status: typeof TrustedServerStatus[keyof typeof TrustedServerStatus]
}
export class ApiError extends Error {}
/**
* Add a new trusted server
*
* @param url - The new URL to add
*/
export async function addServer(url: string): Promise<ITrustedServer> {
try {
const { data } = await axios.post<OCSResponse<Omit<ITrustedServer, 'status'>>>(
generateOcsUrl('apps/federation/trusted-servers'),
{ url },
)
const serverData = data.ocs.data
return {
id: serverData.id,
url: serverData.url,
status: TrustedServerStatus.STATUS_PENDING,
}
} catch (error) {
throw mapError(error)
}
}
/**
* @param id - The id of the trusted server to remove
*/
export async function deleteServer(id: number): Promise<void> {
try {
await axios.delete(generateOcsUrl(`apps/federation/trusted-servers/${id}`))
} catch (error) {
throw mapError(error)
}
}
/**
* Error handling for API calls
*
* @param error - The catch error
*/
function mapError(error: unknown): ApiError | unknown {
if (isAxiosError(error) && error.response?.data?.ocs) {
return new ApiError((error.response.data as OCSResponse).ocs.meta.message, { cause: error })
}
return error
}

View file

@ -0,0 +1,8 @@
/*!
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { getLoggerBuilder } from '@nextcloud/logger'
export const logger = getLoggerBuilder().setApp('federation').build()

View file

@ -0,0 +1,10 @@
/*!
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { createApp } from 'vue'
import AdminSettings from './views/AdminSettings.vue'
const app = createApp(AdminSettings)
app.mount('#federation-admin-settings')

View file

@ -0,0 +1,91 @@
<!--
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
import type { ITrustedServer } from '../services/api.ts'
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import { computed, ref } from 'vue'
import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
import NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'
import AddTrustedServerForm from '../components/AddTrustedServerForm.vue'
import TrustedServer from '../components/TrustedServer.vue'
import { TrustedServerStatus } from '../services/api.ts'
const adminSettings = loadState<{ docUrl: string, trustedServers: ITrustedServer[] }>('federation', 'adminSettings')
const trustedServers = ref(adminSettings.trustedServers)
const showPendingServerInfo = computed(() => trustedServers.value.some((server) => server.status === TrustedServerStatus.STATUS_PENDING))
/**
* Handle add trusted server form submission
*
* @param server - The server to add
*/
async function onAdd(server: ITrustedServer) {
trustedServers.value.unshift(server)
}
/**
* Handle delete trusted server event
*
* @param server - The server to delete
*/
function onDelete(server: ITrustedServer) {
trustedServers.value = trustedServers.value.filter((s) => s.id !== server.id)
}
</script>
<template>
<NcSettingsSection
:name="t('federation', 'Trusted servers')"
:doc-url="adminSettings.docUrl"
: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.')">
<NcNoteCard
v-if="showPendingServerInfo"
type="info"
:text="t('federation', 'Each server must validate the other. This process may require a few cron cycles.')" />
<TransitionGroup
:class="$style.federationAdminSettings__trustedServersList"
:aria-label="t('federation', 'Trusted servers')"
tag="ul"
:enter-from-class="$style.transition_hidden"
:enter-active-class="$style.transition_active"
:leave-active-class="$style.transition_active"
:leave-to-class="$style.transition_hidden">
<TrustedServer
v-for="server in trustedServers"
:key="server.id"
:class="$style.federationAdminSettings__trustedServersListItem"
:server="server"
@delete="onDelete" />
</TransitionGroup>
<AddTrustedServerForm @add="onAdd" />
</NcSettingsSection>
</template>
<style module>
.federationAdminSettings__trustedServersList {
display: flex;
flex-direction: column;
gap: var(--default-grid-baseline);
width: fit-content;
}
.federationAdminSettings__trustedServersListItem {
width: 100%;
}
.transition_active {
transition: all 0.5s ease;
}
.transition_hidden {
opacity: 0;
transform: translateX(30px);
}
</style>

View file

@ -1,64 +1,7 @@
<?php
/**
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
use OCA\Federation\TrustedServers;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\Server;
use OCP\Util;
/** @var IL10N $l */
Util::addScript('federation', 'settings-admin');
Util::addStyle('federation', 'settings-admin');
$urlGenerator = Server::get(IURLGenerator::class);
$documentationLink = $urlGenerator->linkToDocs('admin-sharing-federated') . '#configuring-trusted-nextcloud-servers';
$documentationLabel = $l->t('External documentation for Federated Cloud Sharing');
?>
<div id="ocFederationSettings" class="section">
<h2>
<?php p($l->t('Trusted servers')); ?>
<a target="_blank" rel="noreferrer noopener" class="icon-info"
title="<?php p($documentationLabel);?>"
href="<?php p($documentationLink); ?>"></a>
</h2>
<p class="settings-hint"><?php p($l->t('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.')); ?></p>
<p class="settings-hint"><?php p($l->t('Each server must validate the other. This process may require a few cron cycles.')); ?></p>
<ul id="listOfTrustedServers">
<?php foreach ($_['trustedServers'] as $trustedServer) { ?>
<li id="<?php p($trustedServer['id']); ?>">
<?php if ((int)$trustedServer['status'] === TrustedServers::STATUS_OK) { ?>
<span class="status success"></span>
<?php
} elseif (
(int)$trustedServer['status'] === TrustedServers::STATUS_PENDING
|| (int)$trustedServer['status'] === TrustedServers::STATUS_ACCESS_REVOKED
) { ?>
<span class="status indeterminate"></span>
<?php } else {?>
<span class="status error"></span>
<?php } ?>
<?php p($trustedServer['url']); ?>
<span class="icon icon-delete"></span>
</li>
<?php } ?>
</ul>
<div id="ocFederationAddServer">
<button id="ocFederationAddServerButton"><?php p($l->t('+ Add trusted server')); ?></button>
<div class="serverUrl hidden">
<div class="serverUrl-block">
<label for="serverUrl"><?php p($l->t('Trusted server')); ?></label>
<input id="serverUrl" type="text" value="" placeholder="<?php p($l->t('Trusted server')); ?>" name="server_url"/>
<button id="ocFederationSubmit" class="hidden"><?php p($l->t('Add')); ?></button>
</div>
<span class="msg"></span>
</div>
</div>
</div>
<div id="federation-admin-settings"></div>

View file

@ -10,24 +10,35 @@ namespace OCA\Federation\Tests\Settings;
use OCA\Federation\Settings\Admin;
use OCA\Federation\TrustedServers;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
use OCP\IL10N;
use OCP\IURLGenerator;
use PHPUnit\Framework\MockObject\MockObject;
use Test\TestCase;
class AdminTest extends TestCase {
private TrustedServers&MockObject $trustedServers;
private IInitialState&MockObject $initialState;
private IURLGenerator&MockObject $urlGenerator;
private Admin $admin;
protected function setUp(): void {
parent::setUp();
$this->trustedServers = $this->createMock(TrustedServers::class);
$this->initialState = $this->createMock(IInitialState::class);
$this->urlGenerator = $this->createMock(IURLGenerator::class);
$this->admin = new Admin(
$this->trustedServers,
$this->initialState,
$this->urlGenerator,
$this->createMock(IL10N::class)
);
}
public function testGetForm(): void {
$this->urlGenerator->method('linkToDocs')
->with('admin-sharing-federated')
->willReturn('docs://federated_sharing');
$this->trustedServers
->expects($this->once())
->method('getServers')
@ -35,8 +46,15 @@ class AdminTest extends TestCase {
$params = [
'trustedServers' => ['myserver', 'secondserver'],
'docUrl' => 'docs://federated_sharing#configuring-trusted-nextcloud-servers',
];
$expected = new TemplateResponse('federation', 'settings-admin', $params, '');
$this->initialState
->expects($this->once())
->method('provideInitialState')
->with('adminSettings', $params);
$expected = new TemplateResponse('federation', 'settings-admin', renderAs: '');
$this->assertEquals($expected, $this->admin->getForm());
}

View file

@ -0,0 +1 @@
../../../apps/federation

View file

@ -12,6 +12,9 @@ const modules = {
'settings-admin-example-content': resolve(import.meta.dirname, 'apps/dav/src', 'settings-admin-example-content.ts'),
'settings-personal-availability': resolve(import.meta.dirname, 'apps/dav/src', 'settings-personal-availability.ts'),
},
federation: {
'settings-admin': resolve(import.meta.dirname, 'apps/federation/src', 'settings-admin.ts'),
},
federatedfilesharing: {
'init-files': resolve(import.meta.dirname, 'apps/federatedfilesharing/src', 'init-files.js'),
'settings-admin': resolve(import.meta.dirname, 'apps/federatedfilesharing/src', 'settings-admin.ts'),

View file

@ -1,2 +1,2 @@
import{r as u,b as p,a as h,_ as C}from"./_plugin-vue_export-helper-DM8WuWZR.chunk.mjs";import{j as _,E as i,o as e,H as o,F as s,x as y,e as H,f as n,y as d,b,z as f}from"./string_decoder-BycPOoxV.chunk.mjs";const k={name:"HelpCircleIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},A=["aria-hidden","aria-label"],v=["fill","width","height"],z={d:"M15.07,11.25L14.17,12.17C13.45,12.89 13,13.5 13,15H11V14.5C11,13.39 11.45,12.39 12.17,11.67L13.41,10.41C13.78,10.05 14,9.55 14,9C14,7.89 13.1,7 12,7A2,2 0 0,0 10,9H8A4,4 0 0,1 12,5A4,4 0 0,1 16,9C16,9.88 15.64,10.67 15.07,11.25M13,19H11V17H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z"},V={key:0};function w(a,l,t,c,g,m){return e(),i("span",f(a.$attrs,{"aria-hidden":t.title?null:"true","aria-label":t.title,class:"material-design-icon help-circle-icon",role:"img",onClick:l[0]||(l[0]=r=>a.$emit("click",r))}),[(e(),i("svg",{fill:t.fillColor,class:"material-design-icon__svg",width:t.size,height:t.size,viewBox:"0 0 24 24"},[o("path",z,[t.title?(e(),i("title",V,n(t.title),1)):s("",!0)])],8,v))],16,A)}const x=p(k,[["render",w]]);u();const M={class:"settings-section"},S={class:"settings-section__name"},$=["aria-label","href","title"],I={key:0,class:"settings-section__desc"},N=_({__name:"NcSettingsSection",props:{name:{},description:{default:""},docUrl:{default:""}},setup(a){const l=h("External documentation");return(t,c)=>(e(),i("div",M,[o("h2",S,[H(n(t.name)+" ",1),t.docUrl?(e(),i("a",{key:0,"aria-label":d(l),class:"settings-section__info",href:t.docUrl,rel:"noreferrer nofollow",target:"_blank",title:d(l)},[b(x,{size:20})],8,$)):s("",!0)]),t.description?(e(),i("p",I,n(t.description),1)):s("",!0),y(t.$slots,"default",{},void 0,!0)]))}}),P=p(N,[["__scopeId","data-v-9cedb949"]]),U={name:"ContentCopyIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},B=["aria-hidden","aria-label"],E=["fill","width","height"],L={d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"},Z={key:0};function j(a,l,t,c,g,m){return e(),i("span",f(a.$attrs,{"aria-hidden":t.title?null:"true","aria-label":t.title,class:"material-design-icon content-copy-icon",role:"img",onClick:l[0]||(l[0]=r=>a.$emit("click",r))}),[(e(),i("svg",{fill:t.fillColor,class:"material-design-icon__svg",width:t.size,height:t.size,viewBox:"0 0 24 24"},[o("path",L,[t.title?(e(),i("title",Z,n(t.title),1)):s("",!0)])],8,E))],16,B)}const T=C(U,[["render",j]]);export{T as I,P as N};
//# sourceMappingURL=ContentCopy-OVTnXxZC.chunk.mjs.map
import{r as u,b as p,a as h,_ as C}from"./_plugin-vue_export-helper-CXvX4IZ0.chunk.mjs";import{j as _,E as i,o as e,H as o,F as s,x as y,e as H,f as n,y as d,b,z as f}from"./string_decoder-BY7m9-pN.chunk.mjs";const k={name:"HelpCircleIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},A=["aria-hidden","aria-label"],v=["fill","width","height"],z={d:"M15.07,11.25L14.17,12.17C13.45,12.89 13,13.5 13,15H11V14.5C11,13.39 11.45,12.39 12.17,11.67L13.41,10.41C13.78,10.05 14,9.55 14,9C14,7.89 13.1,7 12,7A2,2 0 0,0 10,9H8A4,4 0 0,1 12,5A4,4 0 0,1 16,9C16,9.88 15.64,10.67 15.07,11.25M13,19H11V17H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z"},V={key:0};function w(a,l,t,c,g,m){return e(),i("span",f(a.$attrs,{"aria-hidden":t.title?null:"true","aria-label":t.title,class:"material-design-icon help-circle-icon",role:"img",onClick:l[0]||(l[0]=r=>a.$emit("click",r))}),[(e(),i("svg",{fill:t.fillColor,class:"material-design-icon__svg",width:t.size,height:t.size,viewBox:"0 0 24 24"},[o("path",z,[t.title?(e(),i("title",V,n(t.title),1)):s("",!0)])],8,v))],16,A)}const x=p(k,[["render",w]]);u();const M={class:"settings-section"},S={class:"settings-section__name"},$=["aria-label","href","title"],I={key:0,class:"settings-section__desc"},N=_({__name:"NcSettingsSection",props:{name:{},description:{default:""},docUrl:{default:""}},setup(a){const l=h("External documentation");return(t,c)=>(e(),i("div",M,[o("h2",S,[H(n(t.name)+" ",1),t.docUrl?(e(),i("a",{key:0,"aria-label":d(l),class:"settings-section__info",href:t.docUrl,rel:"noreferrer nofollow",target:"_blank",title:d(l)},[b(x,{size:20})],8,$)):s("",!0)]),t.description?(e(),i("p",I,n(t.description),1)):s("",!0),y(t.$slots,"default",{},void 0,!0)]))}}),P=p(N,[["__scopeId","data-v-9cedb949"]]),U={name:"ContentCopyIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},B=["aria-hidden","aria-label"],E=["fill","width","height"],L={d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"},Z={key:0};function j(a,l,t,c,g,m){return e(),i("span",f(a.$attrs,{"aria-hidden":t.title?null:"true","aria-label":t.title,class:"material-design-icon content-copy-icon",role:"img",onClick:l[0]||(l[0]=r=>a.$emit("click",r))}),[(e(),i("svg",{fill:t.fillColor,class:"material-design-icon__svg",width:t.size,height:t.size,viewBox:"0 0 24 24"},[o("path",L,[t.title?(e(),i("title",Z,n(t.title),1)):s("",!0)])],8,E))],16,B)}const T=C(U,[["render",j]]);export{T as I,P as N};
//# sourceMappingURL=ContentCopy-nRBsf6Ta.chunk.mjs.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,2 +1,2 @@
import{j as N,m as h,u as V,J as j,p as q,s as n,E as u,o as i,H as p,F as d,K as z,c as t,z as A,f as v,L as E,x as y,w as G,y as s,e as H,G as J}from"./string_decoder-BycPOoxV.chunk.mjs";import{i as g,b as K,c as m,N as o,d as x}from"./NcNoteCard-CVhtNL04-BuDL6zff.chunk.mjs";import{b as M,f as S}from"./_plugin-vue_export-helper-DM8WuWZR.chunk.mjs";const D={class:"input-field__main-wrapper"},P=["id","aria-describedby","disabled","placeholder","type","value"],Q=["for"],R={class:"input-field__icon input-field__icon--leading"},U={key:2,class:"input-field__icon input-field__icon--trailing"},W=["id"],X=N({inheritAttrs:!1,__name:"NcInputField",props:h({class:{default:""},inputClass:{default:""},id:{default:()=>S()},label:{default:void 0},labelOutside:{type:Boolean},type:{default:"text"},placeholder:{default:void 0},showTrailingButton:{type:Boolean},trailingButtonLabel:{default:void 0},success:{type:Boolean},error:{type:Boolean},helperText:{default:""},disabled:{type:Boolean},pill:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:h(["trailingButtonClick"],["update:modelValue"]),setup(c,{expose:B,emit:k}){const r=V(c,"modelValue"),l=c,$=k;B({focus:O,select:F});const f=j(),b=q("input"),T=n(()=>l.showTrailingButton||l.success),w=n(()=>{if(l.placeholder)return l.placeholder;if(l.label)return g?l.label:""}),_=n(()=>l.label||l.labelOutside),C=n(()=>{const e=[];return l.helperText&&e.push(`${l.id}-helper-text`),f["aria-describedby"]&&e.push(String(f["aria-describedby"])),e.join(" ")||void 0});function O(e){b.value.focus(e)}function F(){b.value.select()}function I(e){const a=e.target;r.value=l.type==="number"&&typeof r.value=="number"?parseFloat(a.value):a.value}return(e,a)=>(i(),u("div",{class:J(["input-field",[{"input-field--disabled":e.disabled,"input-field--error":e.error,"input-field--label-outside":e.labelOutside||!_.value,"input-field--leading-icon":!!e.$slots.icon,"input-field--trailing-icon":T.value,"input-field--pill":e.pill,"input-field--success":e.success,"input-field--legacy":s(g)},e.$props.class]])},[p("div",D,[p("input",A(e.$attrs,{id:e.id,ref:"input","aria-describedby":C.value,"aria-live":"polite",class:["input-field__input",e.inputClass],disabled:e.disabled,placeholder:w.value,type:e.type,value:r.value.toString(),onInput:I}),null,16,P),!e.labelOutside&&_.value?(i(),u("label",{key:0,class:"input-field__label",for:e.id},v(e.label),9,Q)):d("",!0),z(p("div",R,[y(e.$slots,"icon",{},void 0,!0)],512),[[E,!!e.$slots.icon]]),e.showTrailingButton?(i(),t(K,{key:1,class:"input-field__trailing-button","aria-label":e.trailingButtonLabel,disabled:e.disabled,variant:"tertiary-no-background",onClick:a[0]||(a[0]=L=>$("trailingButtonClick",L))},{icon:G(()=>[y(e.$slots,"trailing-button-icon",{},void 0,!0)]),_:3},8,["aria-label","disabled"])):e.success||e.error?(i(),u("div",U,[e.success?(i(),t(o,{key:0,path:s(m)},null,8,["path"])):(i(),t(o,{key:1,path:s(x)},null,8,["path"]))])):d("",!0)]),e.helperText?(i(),u("p",{key:0,id:`${e.id}-helper-text`,class:"input-field__helper-text-message"},[e.success?(i(),t(o,{key:0,class:"input-field__helper-text-message__icon",path:s(m),inline:""},null,8,["path"])):e.error?(i(),t(o,{key:1,class:"input-field__helper-text-message__icon",path:s(x),inline:""},null,8,["path"])):d("",!0),H(" "+v(e.helperText),1)],8,W)):d("",!0)],2))}}),le=M(X,[["__scopeId","data-v-a0e80f48"]]);export{le as N};
//# sourceMappingURL=NcInputField-Bwsh2aHY-DMKjn_ao.chunk.mjs.map
import{j as N,m as h,u as V,J as j,p as q,s as n,E as u,o as i,H as p,F as d,K as z,c as t,z as A,f as v,L as E,x as y,w as G,y as s,e as H,G as J}from"./string_decoder-BY7m9-pN.chunk.mjs";import{i as g,b as K,c as m,N as o,d as x}from"./NcNoteCard-CVhtNL04-B9GbPOf_.chunk.mjs";import{b as M,f as S}from"./_plugin-vue_export-helper-CXvX4IZ0.chunk.mjs";const D={class:"input-field__main-wrapper"},P=["id","aria-describedby","disabled","placeholder","type","value"],Q=["for"],R={class:"input-field__icon input-field__icon--leading"},U={key:2,class:"input-field__icon input-field__icon--trailing"},W=["id"],X=N({inheritAttrs:!1,__name:"NcInputField",props:h({class:{default:""},inputClass:{default:""},id:{default:()=>S()},label:{default:void 0},labelOutside:{type:Boolean},type:{default:"text"},placeholder:{default:void 0},showTrailingButton:{type:Boolean},trailingButtonLabel:{default:void 0},success:{type:Boolean},error:{type:Boolean},helperText:{default:""},disabled:{type:Boolean},pill:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:h(["trailingButtonClick"],["update:modelValue"]),setup(c,{expose:B,emit:k}){const r=V(c,"modelValue"),l=c,$=k;B({focus:O,select:F});const f=j(),b=q("input"),T=n(()=>l.showTrailingButton||l.success),w=n(()=>{if(l.placeholder)return l.placeholder;if(l.label)return g?l.label:""}),_=n(()=>l.label||l.labelOutside),C=n(()=>{const e=[];return l.helperText&&e.push(`${l.id}-helper-text`),f["aria-describedby"]&&e.push(String(f["aria-describedby"])),e.join(" ")||void 0});function O(e){b.value.focus(e)}function F(){b.value.select()}function I(e){const a=e.target;r.value=l.type==="number"&&typeof r.value=="number"?parseFloat(a.value):a.value}return(e,a)=>(i(),u("div",{class:J(["input-field",[{"input-field--disabled":e.disabled,"input-field--error":e.error,"input-field--label-outside":e.labelOutside||!_.value,"input-field--leading-icon":!!e.$slots.icon,"input-field--trailing-icon":T.value,"input-field--pill":e.pill,"input-field--success":e.success,"input-field--legacy":s(g)},e.$props.class]])},[p("div",D,[p("input",A(e.$attrs,{id:e.id,ref:"input","aria-describedby":C.value,"aria-live":"polite",class:["input-field__input",e.inputClass],disabled:e.disabled,placeholder:w.value,type:e.type,value:r.value.toString(),onInput:I}),null,16,P),!e.labelOutside&&_.value?(i(),u("label",{key:0,class:"input-field__label",for:e.id},v(e.label),9,Q)):d("",!0),z(p("div",R,[y(e.$slots,"icon",{},void 0,!0)],512),[[E,!!e.$slots.icon]]),e.showTrailingButton?(i(),t(K,{key:1,class:"input-field__trailing-button","aria-label":e.trailingButtonLabel,disabled:e.disabled,variant:"tertiary-no-background",onClick:a[0]||(a[0]=L=>$("trailingButtonClick",L))},{icon:G(()=>[y(e.$slots,"trailing-button-icon",{},void 0,!0)]),_:3},8,["aria-label","disabled"])):e.success||e.error?(i(),u("div",U,[e.success?(i(),t(o,{key:0,path:s(m)},null,8,["path"])):(i(),t(o,{key:1,path:s(x)},null,8,["path"]))])):d("",!0)]),e.helperText?(i(),u("p",{key:0,id:`${e.id}-helper-text`,class:"input-field__helper-text-message"},[e.success?(i(),t(o,{key:0,class:"input-field__helper-text-message__icon",path:s(m),inline:""},null,8,["path"])):e.error?(i(),t(o,{key:1,class:"input-field__helper-text-message__icon",path:s(x),inline:""},null,8,["path"])):d("",!0),H(" "+v(e.helperText),1)],8,W)):d("",!0)],2))}}),le=M(X,[["__scopeId","data-v-a0e80f48"]]);export{le as N};
//# sourceMappingURL=NcInputField-Bwsh2aHY-lfIcluT2.chunk.mjs.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,2 +1,2 @@
import{l as V,N as S,m as C,a as N}from"./NcNoteCard-CVhtNL04-BuDL6zff.chunk.mjs";import{c as F}from"./index-D6zY57LV.chunk.mjs";import{j as M,m as c,u as v,k as $,n as j,p as q,q as m,s as h,c as z,o as H,v as I,w as f,x as L,b as O,y as l,z as U}from"./string_decoder-BycPOoxV.chunk.mjs";import{r as A,b as D,g as E,a as n}from"./_plugin-vue_export-helper-DM8WuWZR.chunk.mjs";import{d as G}from"./index-DpibbgL8.chunk.mjs";import{N as J}from"./NcInputField-Bwsh2aHY-DMKjn_ao.chunk.mjs";A();const K=M({__name:"NcPasswordField",props:c({class:{},inputClass:{default:""},id:{},label:{},labelOutside:{type:Boolean},placeholder:{},showTrailingButton:{type:Boolean,default:!0},success:{type:Boolean},error:{type:Boolean},helperText:{},disabled:{type:Boolean},pill:{type:Boolean},checkPasswordStrength:{type:Boolean},minlength:{default:void 0},asText:{type:Boolean}},{modelValue:{default:""},modelModifiers:{},visible:{type:Boolean,default:!1},visibleModifiers:{}}),emits:c(["valid","invalid"],["update:modelValue","update:visible"]),setup(o,{expose:y,emit:w}){const s=v(o,"modelValue"),a=v(o,"visible"),t=o,d=w;$(s,G(B,500)),y({focus:_,select:k});const{password_policy:b}=j(),u=q("inputField"),i=m(""),r=m(),g=h(()=>{const e={...t};return delete e.checkPasswordStrength,delete e.minlength,delete e.asText,delete e.error,delete e.helperText,delete e.inputClass,delete e.success,e}),x=h(()=>t.minlength??(t.checkPasswordStrength?b?.minLength:void 0)??void 0);async function B(){if(t.checkPasswordStrength)try{const{data:e}=await F.post(E("apps/password_policy/api/v1/validate"),{password:s.value});if(r.value=e.ocs.data.passed,e.ocs.data.passed){i.value=n("Password is secure"),d("valid");return}i.value=e.ocs.data.reason,d("invalid")}catch(e){V.error("Password policy returned an error",{error:e})}}function T(){a.value=!a.value}function _(e){u.value.focus(e)}function k(){u.value.select()}return(e,p)=>(H(),z(J,U(g.value,{ref:"inputField",modelValue:s.value,"onUpdate:modelValue":p[0]||(p[0]=P=>s.value=P),error:e.error||r.value===!1,"helper-text":e.helperText||i.value,"input-class":[e.inputClass,{"password-field__input--secure-text":!a.value&&e.asText}],minlength:x.value,success:e.success||r.value===!0,"trailing-button-label":a.value?l(n)("Hide password"):l(n)("Show password"),type:a.value||e.asText?"text":"password",onTrailingButtonClick:T}),I({"trailing-button-icon":f(()=>[O(S,{path:a.value?l(C):l(N)},null,8,["path"])]),_:2},[e.$slots.icon?{name:"icon",fn:f(()=>[L(e.$slots,"icon",{},void 0,!0)]),key:"0"}:void 0]),1040,["modelValue","error","helper-text","input-class","minlength","success","trailing-button-label","type"]))}}),ee=D(K,[["__scopeId","data-v-b2684de6"]]);export{ee as N};
//# sourceMappingURL=NcPasswordField-djttkA5Q-mXbWWJbB.chunk.mjs.map
import{l as V,N as S,m as C,a as N}from"./NcNoteCard-CVhtNL04-B9GbPOf_.chunk.mjs";import{c as F}from"./index-CYNbcBtJ.chunk.mjs";import{j as M,m as c,u as v,k as $,n as j,p as q,q as m,s as h,c as z,o as H,v as I,w as f,x as L,b as O,y as l,z as U}from"./string_decoder-BY7m9-pN.chunk.mjs";import{r as A,b as D,g as E,a as n}from"./_plugin-vue_export-helper-CXvX4IZ0.chunk.mjs";import{d as G}from"./index-DpibbgL8.chunk.mjs";import{N as J}from"./NcInputField-Bwsh2aHY-lfIcluT2.chunk.mjs";A();const K=M({__name:"NcPasswordField",props:c({class:{},inputClass:{default:""},id:{},label:{},labelOutside:{type:Boolean},placeholder:{},showTrailingButton:{type:Boolean,default:!0},success:{type:Boolean},error:{type:Boolean},helperText:{},disabled:{type:Boolean},pill:{type:Boolean},checkPasswordStrength:{type:Boolean},minlength:{default:void 0},asText:{type:Boolean}},{modelValue:{default:""},modelModifiers:{},visible:{type:Boolean,default:!1},visibleModifiers:{}}),emits:c(["valid","invalid"],["update:modelValue","update:visible"]),setup(o,{expose:y,emit:w}){const s=v(o,"modelValue"),a=v(o,"visible"),t=o,d=w;$(s,G(B,500)),y({focus:_,select:k});const{password_policy:b}=j(),u=q("inputField"),i=m(""),r=m(),g=h(()=>{const e={...t};return delete e.checkPasswordStrength,delete e.minlength,delete e.asText,delete e.error,delete e.helperText,delete e.inputClass,delete e.success,e}),x=h(()=>t.minlength??(t.checkPasswordStrength?b?.minLength:void 0)??void 0);async function B(){if(t.checkPasswordStrength)try{const{data:e}=await F.post(E("apps/password_policy/api/v1/validate"),{password:s.value});if(r.value=e.ocs.data.passed,e.ocs.data.passed){i.value=n("Password is secure"),d("valid");return}i.value=e.ocs.data.reason,d("invalid")}catch(e){V.error("Password policy returned an error",{error:e})}}function T(){a.value=!a.value}function _(e){u.value.focus(e)}function k(){u.value.select()}return(e,p)=>(H(),z(J,U(g.value,{ref:"inputField",modelValue:s.value,"onUpdate:modelValue":p[0]||(p[0]=P=>s.value=P),error:e.error||r.value===!1,"helper-text":e.helperText||i.value,"input-class":[e.inputClass,{"password-field__input--secure-text":!a.value&&e.asText}],minlength:x.value,success:e.success||r.value===!0,"trailing-button-label":a.value?l(n)("Hide password"):l(n)("Show password"),type:a.value||e.asText?"text":"password",onTrailingButtonClick:T}),I({"trailing-button-icon":f(()=>[O(S,{path:a.value?l(C):l(N)},null,8,["path"])]),_:2},[e.$slots.icon?{name:"icon",fn:f(()=>[L(e.$slots,"icon",{},void 0,!0)]),key:"0"}:void 0]),1040,["modelValue","error","helper-text","input-class","minlength","success","trailing-button-label","type"]))}}),ee=D(K,[["__scopeId","data-v-b2684de6"]]);export{ee as N};
//# sourceMappingURL=NcPasswordField-djttkA5Q-C4ZiKUpl.chunk.mjs.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
import{c as T}from"./index-D6zY57LV.chunk.mjs";import{j as p,m as q,u as g,s as o,k as h,n as w,E as f,F as x,o as m,G as y}from"./string_decoder-BycPOoxV.chunk.mjs";import{r as l,d as b,b as D,a as s,g as B}from"./_plugin-vue_export-helper-DM8WuWZR.chunk.mjs";import{l as I}from"./NcNoteCard-CVhtNL04-BuDL6zff.chunk.mjs";const S=`<!--
import{c as T}from"./index-CYNbcBtJ.chunk.mjs";import{j as p,m as q,u as g,s as o,k as h,n as w,E as f,F as x,o as m,G as y}from"./string_decoder-BY7m9-pN.chunk.mjs";import{r as l,d as b,b as D,a as s,g as B}from"./_plugin-vue_export-helper-CXvX4IZ0.chunk.mjs";import{l as I}from"./NcNoteCard-CVhtNL04-B9GbPOf_.chunk.mjs";const S=`<!--
- SPDX-FileCopyrightText: 2020 Google Inc.
- SPDX-License-Identifier: Apache-2.0
-->
@ -44,4 +44,4 @@ import{c as T}from"./index-D6zY57LV.chunk.mjs";import{j as p,m as q,u as g,s as
d="m424-296 282-282-56-56-226 226-114-114-56 56 170 170Zm56 216q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z"/>
</svg>
`;l(),l(b);function M(a){switch(a){case"away":return s("away");case"busy":return s("busy");case"dnd":return s("do not disturb");case"online":return s("online");case"invisible":return s("invisible");case"offline":return s("offline");default:return a}}const L=["aria-hidden","aria-label","innerHTML"],C=p({__name:"NcUserStatusIcon",props:q({user:{default:void 0},ariaHidden:{type:[Boolean,String],default:!1}},{status:{},statusModifiers:{}}),emits:["update:status"],setup(a){const e=g(a,"status"),i=a,v=o(()=>e.value&&["invisible","offline"].includes(e.value)),n=o(()=>e.value&&(!i.ariaHidden||i.ariaHidden==="false")?s("User status: {status}",{status:M(e.value)}):void 0);h(()=>i.user,async r=>{if(!e.value&&r&&w()?.user_status?.enabled)try{const{data:t}=await T.get(B("/apps/user_status/api/v1/statuses/{user}",{user:r}));e.value=t.ocs?.data?.status}catch(t){I.debug("Error while fetching user status",{error:t})}},{immediate:!0});const c={online:Z,away:S,busy:P,dnd:X,invisible:u,offline:u},d=o(()=>e.value&&c[e.value]);return(r,t)=>e.value?(m(),f("span",{key:0,class:y(["user-status-icon",{"user-status-icon--invisible":v.value}]),"aria-hidden":!n.value||void 0,"aria-label":n.value,role:"img",innerHTML:d.value},null,10,L)):x("",!0)}}),A=D(C,[["__scopeId","data-v-881a79fb"]]);export{A as N,M as g};
//# sourceMappingURL=NcUserStatusIcon-CGEf7fej-DG3KCpud.chunk.mjs.map
//# sourceMappingURL=NcUserStatusIcon-CGEf7fej-liZS007Z.chunk.mjs.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,2 +1,2 @@
import{N as f,s as b,t as k,u as w}from"./NcNoteCard-CVhtNL04-BuDL6zff.chunk.mjs";import{r as x,a as c,_ as C}from"./_plugin-vue_export-helper-DM8WuWZR.chunk.mjs";import{N as h}from"./NcInputField-Bwsh2aHY-DMKjn_ao.chunk.mjs";import{j as _,m as I,u as M,p as O,s as j,c as d,o as l,v as z,w as g,x as E,y as a,z as y,E as p,H as F,F as N,f as S}from"./string_decoder-BycPOoxV.chunk.mjs";x();const q=_({__name:"NcTextField",props:I({class:{},inputClass:{},id:{},label:{},labelOutside:{type:Boolean},type:{},placeholder:{},showTrailingButton:{type:Boolean},trailingButtonLabel:{default:void 0},success:{type:Boolean},error:{type:Boolean},helperText:{},disabled:{type:Boolean},pill:{type:Boolean},trailingButtonIcon:{default:"close"}},{modelValue:{default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(o,{expose:i}){const e=M(o,"modelValue"),s=o;i({focus:B,select:v});const r=O("inputField"),m={arrowEnd:c("Save changes"),close:c("Clear text"),undo:c("Undo changes")},u=new Set(Object.keys(h.props)),V=j(()=>{const t=Object.fromEntries(Object.entries(s).filter(([n])=>u.has(n)));return t.trailingButtonLabel??=m[s.trailingButtonIcon],t});function B(t){r.value.focus(t)}function v(){r.value.select()}return(t,n)=>(l(),d(a(h),y(V.value,{ref:"inputField",modelValue:e.value,"onUpdate:modelValue":n[0]||(n[0]=H=>e.value=H)}),z({_:2},[t.$slots.icon?{name:"icon",fn:g(()=>[E(t.$slots,"icon")]),key:"0"}:void 0,t.type!=="search"?{name:"trailing-button-icon",fn:g(()=>[t.trailingButtonIcon==="arrowEnd"?(l(),d(a(f),{key:0,directional:"",path:a(b)},null,8,["path"])):(l(),d(a(f),{key:1,path:t.trailingButtonIcon==="undo"?a(k):a(w)},null,8,["path"]))]),key:"1"}:void 0]),1040,["modelValue"]))}}),T={name:"TrashCanOutlineIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},$=["aria-hidden","aria-label"],A=["fill","width","height"],L={d:"M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M7,6H17V19H7V6M9,8V17H11V8H9M13,8V17H15V8H13Z"},U={key:0};function D(o,i,e,s,r,m){return l(),p("span",y(o.$attrs,{"aria-hidden":e.title?null:"true","aria-label":e.title,class:"material-design-icon trash-can-outline-icon",role:"img",onClick:i[0]||(i[0]=u=>o.$emit("click",u))}),[(l(),p("svg",{fill:e.fillColor,class:"material-design-icon__svg",width:e.size,height:e.size,viewBox:"0 0 24 24"},[F("path",L,[e.title?(l(),p("title",U,S(e.title),1)):N("",!0)])],8,A))],16,$)}const G=C(T,[["render",D]]);export{G as D,q as _};
//# sourceMappingURL=TrashCanOutline-CC4vElfR.chunk.mjs.map
import{N as f,s as b,t as k,u as w}from"./NcNoteCard-CVhtNL04-B9GbPOf_.chunk.mjs";import{r as x,a as c,_ as C}from"./_plugin-vue_export-helper-CXvX4IZ0.chunk.mjs";import{N as h}from"./NcInputField-Bwsh2aHY-lfIcluT2.chunk.mjs";import{j as _,m as I,u as M,p as O,s as j,c as d,o as l,v as z,w as g,x as E,y as a,z as y,E as p,H as F,F as N,f as S}from"./string_decoder-BY7m9-pN.chunk.mjs";x();const q=_({__name:"NcTextField",props:I({class:{},inputClass:{},id:{},label:{},labelOutside:{type:Boolean},type:{},placeholder:{},showTrailingButton:{type:Boolean},trailingButtonLabel:{default:void 0},success:{type:Boolean},error:{type:Boolean},helperText:{},disabled:{type:Boolean},pill:{type:Boolean},trailingButtonIcon:{default:"close"}},{modelValue:{default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(o,{expose:i}){const e=M(o,"modelValue"),s=o;i({focus:B,select:v});const r=O("inputField"),m={arrowEnd:c("Save changes"),close:c("Clear text"),undo:c("Undo changes")},u=new Set(Object.keys(h.props)),V=j(()=>{const t=Object.fromEntries(Object.entries(s).filter(([n])=>u.has(n)));return t.trailingButtonLabel??=m[s.trailingButtonIcon],t});function B(t){r.value.focus(t)}function v(){r.value.select()}return(t,n)=>(l(),d(a(h),y(V.value,{ref:"inputField",modelValue:e.value,"onUpdate:modelValue":n[0]||(n[0]=H=>e.value=H)}),z({_:2},[t.$slots.icon?{name:"icon",fn:g(()=>[E(t.$slots,"icon")]),key:"0"}:void 0,t.type!=="search"?{name:"trailing-button-icon",fn:g(()=>[t.trailingButtonIcon==="arrowEnd"?(l(),d(a(f),{key:0,directional:"",path:a(b)},null,8,["path"])):(l(),d(a(f),{key:1,path:t.trailingButtonIcon==="undo"?a(k):a(w)},null,8,["path"]))]),key:"1"}:void 0]),1040,["modelValue"]))}}),T={name:"TrashCanOutlineIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},$=["aria-hidden","aria-label"],A=["fill","width","height"],L={d:"M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M7,6H17V19H7V6M9,8V17H11V8H9M13,8V17H15V8H13Z"},U={key:0};function D(o,i,e,s,r,m){return l(),p("span",y(o.$attrs,{"aria-hidden":e.title?null:"true","aria-label":e.title,class:"material-design-icon trash-can-outline-icon",role:"img",onClick:i[0]||(i[0]=u=>o.$emit("click",u))}),[(l(),p("svg",{fill:e.fillColor,class:"material-design-icon__svg",width:e.size,height:e.size,viewBox:"0 0 24 24"},[F("path",L,[e.title?(l(),p("title",U,S(e.title),1)):N("",!0)])],8,A))],16,$)}const G=C(T,[["render",D]]);export{G as D,q as _};
//# sourceMappingURL=TrashCanOutline-B3cqckGn.chunk.mjs.map

File diff suppressed because one or more lines are too long

View file

@ -1,2 +1,2 @@
import{_ as s}from"./_plugin-vue_export-helper-DM8WuWZR.chunk.mjs";import{E as t,o as l,H as o,F as n,f as c,z as d}from"./string_decoder-BycPOoxV.chunk.mjs";const k='<svg xmlns="http://www.w3.org/2000/svg" id="mdi-check" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" /></svg>',g={name:"TrayArrowDownIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},m=["aria-hidden","aria-label"],h=["fill","width","height"],p={d:"M2 12H4V17H20V12H22V17C22 18.11 21.11 19 20 19H4C2.9 19 2 18.11 2 17V12M12 15L17.55 9.54L16.13 8.13L13 11.25V2H11V11.25L7.88 8.13L6.46 9.55L12 15Z"},w={key:0};function L(r,a,i,f,u,v){return l(),t("span",d(r.$attrs,{"aria-hidden":i.title?null:"true","aria-label":i.title,class:"material-design-icon tray-arrow-down-icon",role:"img",onClick:a[0]||(a[0]=e=>r.$emit("click",e))}),[(l(),t("svg",{fill:i.fillColor,class:"material-design-icon__svg",width:i.size,height:i.size,viewBox:"0 0 24 24"},[o("path",p,[i.title?(l(),t("title",w,c(i.title),1)):n("",!0)])],8,h))],16,m)}const y=s(g,[["render",L]]);export{y as D,k as s};
//# sourceMappingURL=TrayArrowDown-C-BqUyi0.chunk.mjs.map
import{_ as s}from"./_plugin-vue_export-helper-CXvX4IZ0.chunk.mjs";import{E as t,o as l,H as o,F as n,f as c,z as d}from"./string_decoder-BY7m9-pN.chunk.mjs";const k='<svg xmlns="http://www.w3.org/2000/svg" id="mdi-check" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" /></svg>',g={name:"TrayArrowDownIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},m=["aria-hidden","aria-label"],h=["fill","width","height"],p={d:"M2 12H4V17H20V12H22V17C22 18.11 21.11 19 20 19H4C2.9 19 2 18.11 2 17V12M12 15L17.55 9.54L16.13 8.13L13 11.25V2H11V11.25L7.88 8.13L6.46 9.55L12 15Z"},w={key:0};function L(r,a,i,f,u,v){return l(),t("span",d(r.$attrs,{"aria-hidden":i.title?null:"true","aria-label":i.title,class:"material-design-icon tray-arrow-down-icon",role:"img",onClick:a[0]||(a[0]=e=>r.$emit("click",e))}),[(l(),t("svg",{fill:i.fillColor,class:"material-design-icon__svg",width:i.size,height:i.size,viewBox:"0 0 24 24"},[o("path",p,[i.title?(l(),t("title",w,c(i.title),1)):n("",!0)])],8,h))],16,m)}const y=s(g,[["render",L]]);export{y as D,k as s};
//# sourceMappingURL=TrayArrowDown-BJd7KhmL.chunk.mjs.map

View file

@ -1 +1 @@
{"version":3,"file":"TrayArrowDown-C-BqUyi0.chunk.mjs","sources":["../node_modules/@mdi/svg/svg/check.svg?raw","../node_modules/vue-material-design-icons/TrayArrowDown.vue"],"sourcesContent":["export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" id=\\\"mdi-check\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\\\" /></svg>\"","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon tray-arrow-down-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M2 12H4V17H20V12H22V17C22 18.11 21.11 19 20 19H4C2.9 19 2 18.11 2 17V12M12 15L17.55 9.54L16.13 8.13L13 11.25V2H11V11.25L7.88 8.13L6.46 9.55L12 15Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"TrayArrowDownIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>"],"names":["svgCheck","_sfc_main","_hoisted_3","_createElementBlock","_mergeProps","_ctx","$props","_cache","$event","_createElementVNode","_openBlock"],"mappings":"8JAAA,MAAAA,EAAe,wJCoBVC,EAAU,CACb,KAAM,oBACN,MAAO,CAAC,OAAO,EACf,MAAO,CACL,MAAO,CACL,KAAM,QAER,UAAW,CACT,KAAM,OACN,QAAS,gBAEX,KAAM,CACJ,KAAM,OACN,QAAS,EACX,CACF,CACF,6DAxBYC,EAAA,CAAA,EAAE,oJAAoJ,+CAXhKC,EAeO,OAfPC,EAAcC,EAAA,OAAM,CACb,cAAaC,EAAA,MAAK,KAAA,OAClB,aAAYA,EAAA,MACb,MAAM,4CACN,KAAK,MACJ,QAAKC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEH,EAAA,MAAK,QAAUG,CAAM,WACjCL,EAQM,MAAA,CARA,KAAMG,EAAA,UACP,MAAM,4BACL,MAAOA,EAAA,KACP,OAAQA,EAAA,KACT,QAAQ,cACXG,EAEO,OAFPP,EAEO,CADQI,EAAA,OAAbI,EAAA,EAAAP,EAAuC,YAAhBG,EAAA,KAAK,EAAA,CAAA","x_google_ignoreList":[0,1]}
{"version":3,"file":"TrayArrowDown-BJd7KhmL.chunk.mjs","sources":["../node_modules/@mdi/svg/svg/check.svg?raw","../node_modules/vue-material-design-icons/TrayArrowDown.vue"],"sourcesContent":["export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" id=\\\"mdi-check\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\\\" /></svg>\"","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon tray-arrow-down-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M2 12H4V17H20V12H22V17C22 18.11 21.11 19 20 19H4C2.9 19 2 18.11 2 17V12M12 15L17.55 9.54L16.13 8.13L13 11.25V2H11V11.25L7.88 8.13L6.46 9.55L12 15Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"TrayArrowDownIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>"],"names":["svgCheck","_sfc_main","_hoisted_3","_createElementBlock","_mergeProps","_ctx","$props","_cache","$event","_createElementVNode","_openBlock"],"mappings":"8JAAA,MAAAA,EAAe,wJCoBVC,EAAU,CACb,KAAM,oBACN,MAAO,CAAC,OAAO,EACf,MAAO,CACL,MAAO,CACL,KAAM,QAER,UAAW,CACT,KAAM,OACN,QAAS,gBAEX,KAAM,CACJ,KAAM,OACN,QAAS,EACX,CACF,CACF,6DAxBYC,EAAA,CAAA,EAAE,oJAAoJ,+CAXhKC,EAeO,OAfPC,EAAcC,EAAA,OAAM,CACb,cAAaC,EAAA,MAAK,KAAA,OAClB,aAAYA,EAAA,MACb,MAAM,4CACN,KAAK,MACJ,QAAKC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEH,EAAA,MAAK,QAAUG,CAAM,WACjCL,EAQM,MAAA,CARA,KAAMG,EAAA,UACP,MAAM,4BACL,MAAOA,EAAA,KACP,OAAQA,EAAA,KACT,QAAQ,cACXG,EAEO,OAFPP,EAEO,CADQI,EAAA,OAAbI,EAAA,EAAAP,EAAuC,YAAhBG,EAAA,KAAK,EAAA,CAAA","x_google_ignoreList":[0,1]}

View file

@ -1,2 +1,2 @@
import{r as f,t as m,a as e}from"./_plugin-vue_export-helper-DM8WuWZR.chunk.mjs";f(m);class t{constructor(n,o,s,i){this.r=n,this.g=o,this.b=s,this.name=i,this.r=Math.min(n,255),this.g=Math.min(o,255),this.b=Math.min(s,255),this.name=i}get color(){const n=o=>`00${o.toString(16)}`.slice(-2);return`#${n(this.r)}${n(this.g)}${n(this.b)}`}}function p(r,n,o){return{r:(o.r-n.r)/r,g:(o.g-n.g)/r,b:(o.b-n.b)/r}}function a(r,n,o){const s=[];s.push(n);const i=p(r,n,o);for(let c=1;c<r;c++){const w=Math.floor(n.r+i.r*c),g=Math.floor(n.g+i.g*c),b=Math.floor(n.b+i.b*c);s.push(new t(w,g,b))}return s}const h=new t(182,70,157,e("Purple")),l=new t(221,203,85,e("Gold")),u=new t(0,130,201,e("Nextcloud blue")),d=new t(0,0,0,e("Black")),B=new t(255,255,255,e("White")),$=[h,new t(191,103,139,e("Rosy brown")),new t(201,136,121,e("Feldspar")),new t(211,169,103,e("Whiskey")),l,new t(165,184,114,e("Olivine")),new t(110,166,143,e("Acapulco")),new t(55,148,172,e("Boston Blue")),u,new t(45,115,190,e("Mariner")),new t(91,100,179,e("Blue Violet")),new t(136,85,168,e("Deluge"))];function x(r){const n=a(r,h,l),o=a(r,l,u),s=a(r,u,h);return n.concat(o).concat(s)}export{d as C,B as a,t as b,$ as d,x as g};
//# sourceMappingURL=colors-Go3zmZRD-CR3eBara.chunk.mjs.map
import{r as f,t as m,a as e}from"./_plugin-vue_export-helper-CXvX4IZ0.chunk.mjs";f(m);class t{constructor(n,o,s,i){this.r=n,this.g=o,this.b=s,this.name=i,this.r=Math.min(n,255),this.g=Math.min(o,255),this.b=Math.min(s,255),this.name=i}get color(){const n=o=>`00${o.toString(16)}`.slice(-2);return`#${n(this.r)}${n(this.g)}${n(this.b)}`}}function p(r,n,o){return{r:(o.r-n.r)/r,g:(o.g-n.g)/r,b:(o.b-n.b)/r}}function a(r,n,o){const s=[];s.push(n);const i=p(r,n,o);for(let c=1;c<r;c++){const w=Math.floor(n.r+i.r*c),g=Math.floor(n.g+i.g*c),b=Math.floor(n.b+i.b*c);s.push(new t(w,g,b))}return s}const h=new t(182,70,157,e("Purple")),l=new t(221,203,85,e("Gold")),u=new t(0,130,201,e("Nextcloud blue")),d=new t(0,0,0,e("Black")),B=new t(255,255,255,e("White")),$=[h,new t(191,103,139,e("Rosy brown")),new t(201,136,121,e("Feldspar")),new t(211,169,103,e("Whiskey")),l,new t(165,184,114,e("Olivine")),new t(110,166,143,e("Acapulco")),new t(55,148,172,e("Boston Blue")),u,new t(45,115,190,e("Mariner")),new t(91,100,179,e("Blue Violet")),new t(136,85,168,e("Deluge"))];function x(r){const n=a(r,h,l),o=a(r,l,u),s=a(r,u,h);return n.concat(o).concat(s)}export{d as C,B as a,t as b,$ as d,x as g};
//# sourceMappingURL=colors-Go3zmZRD-S7FgV1KG.chunk.mjs.map

File diff suppressed because one or more lines are too long

View file

@ -1,2 +1,2 @@
import{i as m,A as h,B as w,C as g,D as y}from"./string_decoder-BycPOoxV.chunk.mjs";import{c as D}from"./_plugin-vue_export-helper-DM8WuWZR.chunk.mjs";import{a as E,u as b}from"./index-Bamwag0s.chunk.mjs";import{l as u,N,a as $,b as A,P as i}from"./index-wSAHvg0K.chunk.mjs";const T=function(e=""){let t=i.NONE;return e&&((e.includes("C")||e.includes("K"))&&(t|=i.CREATE),e.includes("G")&&(t|=i.READ),(e.includes("W")||e.includes("N")||e.includes("V"))&&(t|=i.UPDATE),e.includes("D")&&(t|=i.DELETE),e.includes("R")&&(t|=i.SHARE)),t},_=["d:getcontentlength","d:getcontenttype","d:getetag","d:getlastmodified","d:creationdate","d:displayname","d:quota-available-bytes","d:resourcetype","nc:has-preview","nc:is-encrypted","nc:mount-type","oc:comments-unread","oc:favorite","oc:fileid","oc:owner-display-name","oc:owner-id","oc:permissions","oc:size"],f={d:"DAV:",nc:"http://nextcloud.org/ns",oc:"http://owncloud.org/ns",ocs:"http://open-collaboration-services.org/ns"},L=function(e,t={nc:"http://nextcloud.org/ns"}){typeof window._nc_dav_properties>"u"&&(window._nc_dav_properties=[..._],window._nc_dav_namespaces={...f});const o={...window._nc_dav_namespaces,...t};if(window._nc_dav_properties.find(n=>n===e))return u.warn(`${e} already registered`,{prop:e}),!1;if(e.startsWith("<")||e.split(":").length!==2)return u.error(`${e} is not valid. See example: 'oc:fileid'`,{prop:e}),!1;const s=e.split(":")[0];return o[s]?(window._nc_dav_properties.push(e),window._nc_dav_namespaces=o,!0):(u.error(`${e} namespace unknown`,{prop:e,namespaces:o}),!1)},P=function(){return typeof window._nc_dav_properties>"u"&&(window._nc_dav_properties=[..._]),window._nc_dav_properties.map(e=>`<${e} />`).join(" ")},S=function(){return typeof window._nc_dav_namespaces>"u"&&(window._nc_dav_namespaces={...f}),Object.keys(window._nc_dav_namespaces).map(e=>`xmlns:${e}="${window._nc_dav_namespaces?.[e]}"`).join(" ")};function x(){return m()?`/files/${h()}`:`/files/${w()?.uid}`}const R=x();function q(){const e=D("dav");return m()?e.replace("remote.php","public.php"):e}const v=q(),z=function(e=v,t={}){const o=E(e,{headers:t});function s(n){o.setHeaders({...t,"X-Requested-With":"XMLHttpRequest",requesttoken:n??""})}return y(s),s(g()),b().patch("fetch",(n,a)=>{const r=a.headers;return r?.method&&(a.method=r.method,delete r.method),fetch(n,a)}),o},W=function(e,t=R,o=v){let s=w()?.uid;if(m())s=s??"anonymous";else if(!s)throw new Error("No user id found");const n=e.props,a=T(n?.permissions),r=String(n?.["owner-id"]||s),l=n.fileid||0,d=new Date(Date.parse(e.lastmod)),c=new Date(Date.parse(n.creationdate)),p={id:l,source:`${o}${e.filename}`,mtime:!isNaN(d.getTime())&&d.getTime()!==0?d:void 0,crtime:!isNaN(c.getTime())&&c.getTime()!==0?c:void 0,mime:e.mime||"application/octet-stream",displayname:n.displayname!==void 0?String(n.displayname):void 0,size:n?.size||Number.parseInt(n.getcontentlength||"0"),status:l<0?N.FAILED:void 0,permissions:a,owner:r,root:t,attributes:{...e,...n,hasPreview:n?.["has-preview"]}};return delete p.attributes?.props,e.type==="file"?new $(p):new A(p)};export{S as a,P as b,W as c,v as d,z as g,L as r};
//# sourceMappingURL=dav-B_fZ4j3M.chunk.mjs.map
import{i as m,A as h,B as w,C as g,D as y}from"./string_decoder-BY7m9-pN.chunk.mjs";import{c as D}from"./_plugin-vue_export-helper-CXvX4IZ0.chunk.mjs";import{a as E,u as b}from"./index-HgP8VlAw.chunk.mjs";import{l as u,N,a as $,b as A,P as i}from"./index-Cp1VzrI8.chunk.mjs";const T=function(e=""){let t=i.NONE;return e&&((e.includes("C")||e.includes("K"))&&(t|=i.CREATE),e.includes("G")&&(t|=i.READ),(e.includes("W")||e.includes("N")||e.includes("V"))&&(t|=i.UPDATE),e.includes("D")&&(t|=i.DELETE),e.includes("R")&&(t|=i.SHARE)),t},_=["d:getcontentlength","d:getcontenttype","d:getetag","d:getlastmodified","d:creationdate","d:displayname","d:quota-available-bytes","d:resourcetype","nc:has-preview","nc:is-encrypted","nc:mount-type","oc:comments-unread","oc:favorite","oc:fileid","oc:owner-display-name","oc:owner-id","oc:permissions","oc:size"],f={d:"DAV:",nc:"http://nextcloud.org/ns",oc:"http://owncloud.org/ns",ocs:"http://open-collaboration-services.org/ns"},L=function(e,t={nc:"http://nextcloud.org/ns"}){typeof window._nc_dav_properties>"u"&&(window._nc_dav_properties=[..._],window._nc_dav_namespaces={...f});const o={...window._nc_dav_namespaces,...t};if(window._nc_dav_properties.find(n=>n===e))return u.warn(`${e} already registered`,{prop:e}),!1;if(e.startsWith("<")||e.split(":").length!==2)return u.error(`${e} is not valid. See example: 'oc:fileid'`,{prop:e}),!1;const s=e.split(":")[0];return o[s]?(window._nc_dav_properties.push(e),window._nc_dav_namespaces=o,!0):(u.error(`${e} namespace unknown`,{prop:e,namespaces:o}),!1)},P=function(){return typeof window._nc_dav_properties>"u"&&(window._nc_dav_properties=[..._]),window._nc_dav_properties.map(e=>`<${e} />`).join(" ")},S=function(){return typeof window._nc_dav_namespaces>"u"&&(window._nc_dav_namespaces={...f}),Object.keys(window._nc_dav_namespaces).map(e=>`xmlns:${e}="${window._nc_dav_namespaces?.[e]}"`).join(" ")};function x(){return m()?`/files/${h()}`:`/files/${w()?.uid}`}const R=x();function q(){const e=D("dav");return m()?e.replace("remote.php","public.php"):e}const v=q(),z=function(e=v,t={}){const o=E(e,{headers:t});function s(n){o.setHeaders({...t,"X-Requested-With":"XMLHttpRequest",requesttoken:n??""})}return y(s),s(g()),b().patch("fetch",(n,a)=>{const r=a.headers;return r?.method&&(a.method=r.method,delete r.method),fetch(n,a)}),o},W=function(e,t=R,o=v){let s=w()?.uid;if(m())s=s??"anonymous";else if(!s)throw new Error("No user id found");const n=e.props,a=T(n?.permissions),r=String(n?.["owner-id"]||s),l=n.fileid||0,d=new Date(Date.parse(e.lastmod)),c=new Date(Date.parse(n.creationdate)),p={id:l,source:`${o}${e.filename}`,mtime:!isNaN(d.getTime())&&d.getTime()!==0?d:void 0,crtime:!isNaN(c.getTime())&&c.getTime()!==0?c:void 0,mime:e.mime||"application/octet-stream",displayname:n.displayname!==void 0?String(n.displayname):void 0,size:n?.size||Number.parseInt(n.getcontentlength||"0"),status:l<0?N.FAILED:void 0,permissions:a,owner:r,root:t,attributes:{...e,...n,hasPreview:n?.["has-preview"]}};return delete p.attributes?.props,e.type==="file"?new $(p):new A(p)};export{S as a,P as b,W as c,v as d,z as g,L as r};
//# sourceMappingURL=dav-DeUNzbml.chunk.mjs.map

File diff suppressed because one or more lines are too long

View file

@ -1,2 +1,2 @@
import{l as i,c as y,t as u,r as v,o as b,w as l,H as n,b as m,e as c,f as r,h as g}from"./string_decoder-BycPOoxV.chunk.mjs";import{c as R}from"./index-D6zY57LV.chunk.mjs";import{_ as E,e as C}from"./_plugin-vue_export-helper-DM8WuWZR.chunk.mjs";import{N as S}from"./NcCheckboxRadioSwitch-BCSKF7Tk-Y9hEk7hU.chunk.mjs";import{N as V}from"./ContentCopy-OVTnXxZC.chunk.mjs";import"./index-DpibbgL8.chunk.mjs";import"./mdi-C5IU8XSu.chunk.mjs";const h=i("dav","userSyncCalendarsDocUrl","#"),k={name:"CalDavSettings",components:{NcCheckboxRadioSwitch:S,NcSettingsSection:V},setup(){return{t:u}},data(){return{userSyncCalendarsDocUrl:h,sendInvitations:i("dav","sendInvitations"),generateBirthdayCalendar:i("dav","generateBirthdayCalendar"),sendEventReminders:i("dav","sendEventReminders"),sendEventRemindersToSharedUsers:i("dav","sendEventRemindersToSharedUsers"),sendEventRemindersPush:i("dav","sendEventRemindersPush")}},computed:{hint(){return u("dav","Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}.").replace("{calendarappstoreopen}",'<a target="_blank" href="../apps/office/calendar">').replace("{calendardocopen}",`<a target="_blank" href="${h}" rel="noreferrer noopener">`).replace(/\{linkclose\}/g,"</a>")},sendInvitationsHelpText(){return u("dav","Please make sure to properly set up {emailopen}the email server{linkclose}.").replace("{emailopen}",'<a href="../admin#mail_general_settings">').replace("{linkclose}","</a>")},sendEventRemindersHelpText(){return u("dav","Please make sure to properly set up {emailopen}the email server{linkclose}.").replace("{emailopen}",'<a href="../admin#mail_general_settings">').replace("{linkclose}","</a>")}},watch:{generateBirthdayCalendar(d){const e=d?"/apps/dav/enableBirthdayCalendar":"/apps/dav/disableBirthdayCalendar";R.post(C(e))},sendInvitations(d){OCP.AppConfig.setValue("dav","sendInvitations",d?"yes":"no")},sendEventReminders(d){OCP.AppConfig.setValue("dav","sendEventReminders",d?"yes":"no")},sendEventRemindersToSharedUsers(d){OCP.AppConfig.setValue("dav","sendEventRemindersToSharedUsers",d?"yes":"no")},sendEventRemindersPush(d){OCP.AppConfig.setValue("dav","sendEventRemindersPush",d?"yes":"no")}}},T=["innerHTML"],w=["innerHTML"],_=["innerHTML"],U={class:"indented"},P={class:"indented"};function H(d,e,x,s,a,p){const o=v("NcCheckboxRadioSwitch"),f=v("NcSettingsSection");return b(),y(f,{name:s.t("dav","Calendar server"),"doc-url":a.userSyncCalendarsDocUrl},{default:l(()=>[n("p",{class:"settings-hint",innerHTML:p.hint},null,8,T),n("p",null,[m(o,{id:"caldavSendInvitations",modelValue:a.sendInvitations,"onUpdate:modelValue":e[0]||(e[0]=t=>a.sendInvitations=t),type:"switch"},{default:l(()=>[c(r(s.t("dav","Send invitations to attendees")),1)]),_:1},8,["modelValue"]),n("em",{innerHTML:p.sendInvitationsHelpText},null,8,w)]),n("p",null,[m(o,{id:"caldavGenerateBirthdayCalendar",modelValue:a.generateBirthdayCalendar,"onUpdate:modelValue":e[1]||(e[1]=t=>a.generateBirthdayCalendar=t),type:"switch",class:"checkbox"},{default:l(()=>[c(r(s.t("dav","Automatically generate a birthday calendar")),1)]),_:1},8,["modelValue"]),n("em",null,r(s.t("dav","Birthday calendars will be generated by a background job.")),1),e[5]||(e[5]=n("br",null,null,-1)),n("em",null,r(s.t("dav","Hence they will not be available immediately after enabling but will show up after some time.")),1)]),n("p",null,[m(o,{id:"caldavSendEventReminders",modelValue:a.sendEventReminders,"onUpdate:modelValue":e[2]||(e[2]=t=>a.sendEventReminders=t),type:"switch"},{default:l(()=>[c(r(s.t("dav","Send notifications for events")),1)]),_:1},8,["modelValue"]),n("em",{innerHTML:p.sendEventRemindersHelpText},null,8,_),e[6]||(e[6]=n("br",null,null,-1)),n("em",null,r(s.t("dav","Notifications are sent via background jobs, so these must occur often enough.")),1)]),n("p",U,[m(o,{id:"caldavSendEventRemindersToSharedGroupMembers",modelValue:a.sendEventRemindersToSharedUsers,"onUpdate:modelValue":e[3]||(e[3]=t=>a.sendEventRemindersToSharedUsers=t),type:"switch",disabled:!a.sendEventReminders},{default:l(()=>[c(r(s.t("dav","Send reminder notifications to calendar sharees as well")),1)]),_:1},8,["modelValue","disabled"]),n("em",null,r(s.t("dav","Reminders are always sent to organizers and attendees.")),1)]),n("p",P,[m(o,{id:"caldavSendEventRemindersPush",modelValue:a.sendEventRemindersPush,"onUpdate:modelValue":e[4]||(e[4]=t=>a.sendEventRemindersPush=t),type:"switch",disabled:!a.sendEventReminders},{default:l(()=>[c(r(s.t("dav","Enable notifications for events via push")),1)]),_:1},8,["modelValue","disabled"])])]),_:1},8,["name","doc-url"])}const I=E(k,[["render",H],["__scopeId","data-v-84465bd0"]]),B=g(I);B.mount("#settings-admin-caldav");
import{l as i,c as y,t as u,r as v,o as b,w as l,H as n,b as m,e as c,f as r,h as g}from"./string_decoder-BY7m9-pN.chunk.mjs";import{c as R}from"./index-CYNbcBtJ.chunk.mjs";import{_ as E,e as C}from"./_plugin-vue_export-helper-CXvX4IZ0.chunk.mjs";import{N as S}from"./NcCheckboxRadioSwitch-BCSKF7Tk-CeXacauf.chunk.mjs";import{N as V}from"./ContentCopy-nRBsf6Ta.chunk.mjs";import"./index-DpibbgL8.chunk.mjs";import"./mdi-BK4BBTPr.chunk.mjs";const h=i("dav","userSyncCalendarsDocUrl","#"),k={name:"CalDavSettings",components:{NcCheckboxRadioSwitch:S,NcSettingsSection:V},setup(){return{t:u}},data(){return{userSyncCalendarsDocUrl:h,sendInvitations:i("dav","sendInvitations"),generateBirthdayCalendar:i("dav","generateBirthdayCalendar"),sendEventReminders:i("dav","sendEventReminders"),sendEventRemindersToSharedUsers:i("dav","sendEventRemindersToSharedUsers"),sendEventRemindersPush:i("dav","sendEventRemindersPush")}},computed:{hint(){return u("dav","Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}.").replace("{calendarappstoreopen}",'<a target="_blank" href="../apps/office/calendar">').replace("{calendardocopen}",`<a target="_blank" href="${h}" rel="noreferrer noopener">`).replace(/\{linkclose\}/g,"</a>")},sendInvitationsHelpText(){return u("dav","Please make sure to properly set up {emailopen}the email server{linkclose}.").replace("{emailopen}",'<a href="../admin#mail_general_settings">').replace("{linkclose}","</a>")},sendEventRemindersHelpText(){return u("dav","Please make sure to properly set up {emailopen}the email server{linkclose}.").replace("{emailopen}",'<a href="../admin#mail_general_settings">').replace("{linkclose}","</a>")}},watch:{generateBirthdayCalendar(d){const e=d?"/apps/dav/enableBirthdayCalendar":"/apps/dav/disableBirthdayCalendar";R.post(C(e))},sendInvitations(d){OCP.AppConfig.setValue("dav","sendInvitations",d?"yes":"no")},sendEventReminders(d){OCP.AppConfig.setValue("dav","sendEventReminders",d?"yes":"no")},sendEventRemindersToSharedUsers(d){OCP.AppConfig.setValue("dav","sendEventRemindersToSharedUsers",d?"yes":"no")},sendEventRemindersPush(d){OCP.AppConfig.setValue("dav","sendEventRemindersPush",d?"yes":"no")}}},T=["innerHTML"],w=["innerHTML"],_=["innerHTML"],U={class:"indented"},P={class:"indented"};function H(d,e,x,s,a,p){const o=v("NcCheckboxRadioSwitch"),f=v("NcSettingsSection");return b(),y(f,{name:s.t("dav","Calendar server"),"doc-url":a.userSyncCalendarsDocUrl},{default:l(()=>[n("p",{class:"settings-hint",innerHTML:p.hint},null,8,T),n("p",null,[m(o,{id:"caldavSendInvitations",modelValue:a.sendInvitations,"onUpdate:modelValue":e[0]||(e[0]=t=>a.sendInvitations=t),type:"switch"},{default:l(()=>[c(r(s.t("dav","Send invitations to attendees")),1)]),_:1},8,["modelValue"]),n("em",{innerHTML:p.sendInvitationsHelpText},null,8,w)]),n("p",null,[m(o,{id:"caldavGenerateBirthdayCalendar",modelValue:a.generateBirthdayCalendar,"onUpdate:modelValue":e[1]||(e[1]=t=>a.generateBirthdayCalendar=t),type:"switch",class:"checkbox"},{default:l(()=>[c(r(s.t("dav","Automatically generate a birthday calendar")),1)]),_:1},8,["modelValue"]),n("em",null,r(s.t("dav","Birthday calendars will be generated by a background job.")),1),e[5]||(e[5]=n("br",null,null,-1)),n("em",null,r(s.t("dav","Hence they will not be available immediately after enabling but will show up after some time.")),1)]),n("p",null,[m(o,{id:"caldavSendEventReminders",modelValue:a.sendEventReminders,"onUpdate:modelValue":e[2]||(e[2]=t=>a.sendEventReminders=t),type:"switch"},{default:l(()=>[c(r(s.t("dav","Send notifications for events")),1)]),_:1},8,["modelValue"]),n("em",{innerHTML:p.sendEventRemindersHelpText},null,8,_),e[6]||(e[6]=n("br",null,null,-1)),n("em",null,r(s.t("dav","Notifications are sent via background jobs, so these must occur often enough.")),1)]),n("p",U,[m(o,{id:"caldavSendEventRemindersToSharedGroupMembers",modelValue:a.sendEventRemindersToSharedUsers,"onUpdate:modelValue":e[3]||(e[3]=t=>a.sendEventRemindersToSharedUsers=t),type:"switch",disabled:!a.sendEventReminders},{default:l(()=>[c(r(s.t("dav","Send reminder notifications to calendar sharees as well")),1)]),_:1},8,["modelValue","disabled"]),n("em",null,r(s.t("dav","Reminders are always sent to organizers and attendees.")),1)]),n("p",P,[m(o,{id:"caldavSendEventRemindersPush",modelValue:a.sendEventRemindersPush,"onUpdate:modelValue":e[4]||(e[4]=t=>a.sendEventRemindersPush=t),type:"switch",disabled:!a.sendEventReminders},{default:l(()=>[c(r(s.t("dav","Enable notifications for events via push")),1)]),_:1},8,["modelValue","disabled"])])]),_:1},8,["name","doc-url"])}const I=E(k,[["render",H],["__scopeId","data-v-84465bd0"]]),B=g(I);B.mount("#settings-admin-caldav");
//# sourceMappingURL=dav-settings-admin-caldav.mjs.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,2 +1,2 @@
import{c as d,i as _}from"./index-D6zY57LV.chunk.mjs";import{N as y,a as b,b as R,s as f}from"./index-JpgrUA2Z-C7mmv1ig.chunk.mjs";import{j as v,q as D,s as S,t,c as u,o as h,w as O,H as k,F as q,f as C,y as i,G as F,l as P,I as x}from"./string_decoder-BycPOoxV.chunk.mjs";import{_ as N,e as m}from"./_plugin-vue_export-helper-DM8WuWZR.chunk.mjs";import{N as E}from"./NcPasswordField-djttkA5Q-mXbWWJbB.chunk.mjs";import{l as j}from"./logger-RoYqwI_e.chunk.mjs";import"./index-DpibbgL8.chunk.mjs";import"./NcNoteCard-CVhtNL04-BuDL6zff.chunk.mjs";import"./mdi-C5IU8XSu.chunk.mjs";import"./NcInputField-Bwsh2aHY-DMKjn_ao.chunk.mjs";const I=v({__name:"RemoteShareDialog",props:{name:{},owner:{},remote:{},passwordRequired:{type:Boolean}},emits:["close"],setup(e,{emit:r}){const s=e,a=r,o=D(""),n=S(()=>[{label:t("federatedfilesharing","Cancel"),callback:()=>a("close",!1)},{label:t("federatedfilesharing","Add remote share"),type:s.passwordRequired?"submit":void 0,variant:"primary",callback:()=>a("close",!0,o.value)}]);return(p,l)=>(h(),u(i(y),{buttons:n.value,"is-form":e.passwordRequired,name:i(t)("federatedfilesharing","Remote share"),onSubmit:l[1]||(l[1]=w=>a("close",!0,o.value))},{default:O(()=>[k("p",null,C(i(t)("federatedfilesharing","Do you want to add the remote share {name} from {owner}@{remote}?",{name:e.name,owner:e.owner,remote:e.remote})),1),e.passwordRequired?(h(),u(i(E),{key:0,modelValue:o.value,"onUpdate:modelValue":l[0]||(l[0]=w=>o.value=w),class:F(p.$style.remoteShareDialog__password),label:i(t)("federatedfilesharing","Remote share password")},null,8,["modelValue","class","label"])):q("",!0)]),_:1},8,["buttons","is-form","name"]))}}),M="_remoteShareDialog__password_1ccpy_2",T={remoteShareDialog__password:M},U={$style:T},V=N(I,[["__cssModules",U]]);async function $(e,r,s,a=!1){const[o,n]=await b(V,{name:e,owner:r,remote:s,passwordRequired:a});if(a&&o)return n;if(!o)throw new Error("Dialog was cancelled")}window.addEventListener("DOMContentLoaded",()=>{H(),P("federatedfilesharing","notificationsEnabled",!0)!==!0&&L(),x("notifications:action:executed",({action:e,notification:r})=>{r.app==="files_sharing"&&r.object_type==="remote_share"&&e.type==="POST"&&c()})});function c(){if(!window?.OCP?.Files?.Router?.goToRoute){window.location.reload();return}window.OCP.Files.Router.goToRoute(null,{...window.OCP.Files.Router.params,fileid:void 0},{...window.OCP.Files.Router.query,dir:"/",openfile:void 0})}function H(){const e=window.OC.Util.History.parseUrlQuery();if(e.remote&&e.token&&e.name){const r=(s,a)=>{s!==!1&&d.post(m("apps/federatedfilesharing/askForFederatedShare"),{remote:a.remote,token:a.token,owner:a.owner,ownerDisplayName:a.ownerDisplayName||a.owner,name:a.name,password:a.password||""}).then(({data:o})=>{Object.hasOwn(o,"legacyMount")?c():R(o.message)}).catch(o=>{j.error("Error while processing incoming share",{error:o}),_(o)&&o.response.data.message?f(o.response.data.message):f(t("federatedfilesharing","Incoming share could not be processed"))})};location.hash="",e.passwordProtected=parseInt(e.protected,10)===1,g(e,e.passwordProtected,r)}}async function L(){const{data:e}=await d.get(m("/apps/files_sharing/api/externalShares"));for(let r=0;r<e.length;++r)g(e[r],!1,function(s,a){s===!1?d.delete(m("/apps/files_sharing/api/externalShares/"+a.id)):d.post(m("/apps/files_sharing/api/externalShares"),{id:a.id}).then(()=>c())})}function g(e,r,s){const a=e.ownerDisplayName||e.owner,o=e.name,n=e.remote.replace(/^https?:\/\//,"").replace(/\/$/,"");$(o,a,n,r).then(p=>s(!0,{...e,password:p})).catch(()=>s(!1,e))}
import{c as d,i as _}from"./index-CYNbcBtJ.chunk.mjs";import{N as y,a as b,b as R,s as f}from"./index-JpgrUA2Z-Bcb7_yWp.chunk.mjs";import{j as v,q as D,s as S,t,c as u,o as h,w as O,H as k,F as q,f as C,y as i,G as F,l as P,I as x}from"./string_decoder-BY7m9-pN.chunk.mjs";import{_ as N,e as m}from"./_plugin-vue_export-helper-CXvX4IZ0.chunk.mjs";import{N as E}from"./NcPasswordField-djttkA5Q-C4ZiKUpl.chunk.mjs";import{l as j}from"./logger-BeDi325r.chunk.mjs";import"./index-DpibbgL8.chunk.mjs";import"./NcNoteCard-CVhtNL04-B9GbPOf_.chunk.mjs";import"./mdi-BK4BBTPr.chunk.mjs";import"./NcInputField-Bwsh2aHY-lfIcluT2.chunk.mjs";const I=v({__name:"RemoteShareDialog",props:{name:{},owner:{},remote:{},passwordRequired:{type:Boolean}},emits:["close"],setup(e,{emit:r}){const s=e,a=r,o=D(""),n=S(()=>[{label:t("federatedfilesharing","Cancel"),callback:()=>a("close",!1)},{label:t("federatedfilesharing","Add remote share"),type:s.passwordRequired?"submit":void 0,variant:"primary",callback:()=>a("close",!0,o.value)}]);return(p,l)=>(h(),u(i(y),{buttons:n.value,"is-form":e.passwordRequired,name:i(t)("federatedfilesharing","Remote share"),onSubmit:l[1]||(l[1]=w=>a("close",!0,o.value))},{default:O(()=>[k("p",null,C(i(t)("federatedfilesharing","Do you want to add the remote share {name} from {owner}@{remote}?",{name:e.name,owner:e.owner,remote:e.remote})),1),e.passwordRequired?(h(),u(i(E),{key:0,modelValue:o.value,"onUpdate:modelValue":l[0]||(l[0]=w=>o.value=w),class:F(p.$style.remoteShareDialog__password),label:i(t)("federatedfilesharing","Remote share password")},null,8,["modelValue","class","label"])):q("",!0)]),_:1},8,["buttons","is-form","name"]))}}),M="_remoteShareDialog__password_1ccpy_2",T={remoteShareDialog__password:M},U={$style:T},V=N(I,[["__cssModules",U]]);async function $(e,r,s,a=!1){const[o,n]=await b(V,{name:e,owner:r,remote:s,passwordRequired:a});if(a&&o)return n;if(!o)throw new Error("Dialog was cancelled")}window.addEventListener("DOMContentLoaded",()=>{H(),P("federatedfilesharing","notificationsEnabled",!0)!==!0&&L(),x("notifications:action:executed",({action:e,notification:r})=>{r.app==="files_sharing"&&r.object_type==="remote_share"&&e.type==="POST"&&c()})});function c(){if(!window?.OCP?.Files?.Router?.goToRoute){window.location.reload();return}window.OCP.Files.Router.goToRoute(null,{...window.OCP.Files.Router.params,fileid:void 0},{...window.OCP.Files.Router.query,dir:"/",openfile:void 0})}function H(){const e=window.OC.Util.History.parseUrlQuery();if(e.remote&&e.token&&e.name){const r=(s,a)=>{s!==!1&&d.post(m("apps/federatedfilesharing/askForFederatedShare"),{remote:a.remote,token:a.token,owner:a.owner,ownerDisplayName:a.ownerDisplayName||a.owner,name:a.name,password:a.password||""}).then(({data:o})=>{Object.hasOwn(o,"legacyMount")?c():R(o.message)}).catch(o=>{j.error("Error while processing incoming share",{error:o}),_(o)&&o.response.data.message?f(o.response.data.message):f(t("federatedfilesharing","Incoming share could not be processed"))})};location.hash="",e.passwordProtected=parseInt(e.protected,10)===1,g(e,e.passwordProtected,r)}}async function L(){const{data:e}=await d.get(m("/apps/files_sharing/api/externalShares"));for(let r=0;r<e.length;++r)g(e[r],!1,function(s,a){s===!1?d.delete(m("/apps/files_sharing/api/externalShares/"+a.id)):d.post(m("/apps/files_sharing/api/externalShares"),{id:a.id}).then(()=>c())})}function g(e,r,s){const a=e.ownerDisplayName||e.owner,o=e.name,n=e.remote.replace(/^https?:\/\//,"").replace(/\/$/,"");$(o,a,n,r).then(p=>s(!0,{...e,password:p})).catch(()=>s(!1,e))}
//# sourceMappingURL=federatedfilesharing-init-files.mjs.map

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
import{E as d,o,H as i,F as I,f as l,z as S,j,l as f,t as a,q as N,s as w,c as _,w as r,b as h,y as e,e as s,M as q,Q as E,h as J}from"./string_decoder-BycPOoxV.chunk.mjs";import{d as z}from"./index-JpgrUA2Z-C7mmv1ig.chunk.mjs";import{_ as M,i as x}from"./_plugin-vue_export-helper-DM8WuWZR.chunk.mjs";import{b}from"./NcNoteCard-CVhtNL04-BuDL6zff.chunk.mjs";import{N as Q}from"./NcInputField-Bwsh2aHY-DMKjn_ao.chunk.mjs";import{I as W,N as G}from"./ContentCopy-OVTnXxZC.chunk.mjs";import"./modulepreload-polyfill-BxzAKjcf.chunk.mjs";import"./mdi-C5IU8XSu.chunk.mjs";const K={name:"CheckIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},V=["aria-hidden","aria-label"],X=["fill","width","height"],ee={d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"},ae={key:0};function te(c,n,t,k,p,y){return o(),d("span",S(c.$attrs,{"aria-hidden":t.title?null:"true","aria-label":t.title,class:"material-design-icon check-icon",role:"img",onClick:n[0]||(n[0]=g=>c.$emit("click",g))}),[(o(),d("svg",{fill:t.fillColor,class:"material-design-icon__svg",width:t.size,height:t.size,viewBox:"0 0 24 24"},[i("path",ee,[t.title?(o(),d("title",ae,l(t.title),1)):I("",!0)])],8,X))],16,V)}const ie=M(K,[["render",te]]),re={name:"WebIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},le=["aria-hidden","aria-label"],oe=["fill","width","height"],ne={d:"M16.36,14C16.44,13.34 16.5,12.68 16.5,12C16.5,11.32 16.44,10.66 16.36,10H19.74C19.9,10.64 20,11.31 20,12C20,12.69 19.9,13.36 19.74,14M14.59,19.56C15.19,18.45 15.65,17.25 15.97,16H18.92C17.96,17.65 16.43,18.93 14.59,19.56M14.34,14H9.66C9.56,13.34 9.5,12.68 9.5,12C9.5,11.32 9.56,10.65 9.66,10H14.34C14.43,10.65 14.5,11.32 14.5,12C14.5,12.68 14.43,13.34 14.34,14M12,19.96C11.17,18.76 10.5,17.43 10.09,16H13.91C13.5,17.43 12.83,18.76 12,19.96M8,8H5.08C6.03,6.34 7.57,5.06 9.4,4.44C8.8,5.55 8.35,6.75 8,8M5.08,16H8C8.35,17.25 8.8,18.45 9.4,19.56C7.57,18.93 6.03,17.65 5.08,16M4.26,14C4.1,13.36 4,12.69 4,12C4,11.31 4.1,10.64 4.26,10H7.64C7.56,10.66 7.5,11.32 7.5,12C7.5,12.68 7.56,13.34 7.64,14M12,4.03C12.83,5.23 13.5,6.57 13.91,8H10.09C10.5,6.57 11.17,5.23 12,4.03M18.92,8H15.97C15.65,6.75 15.19,5.55 14.59,4.44C16.43,5.07 17.96,6.34 18.92,8M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z"},se={key:0};function de(c,n,t,k,p,y){return o(),d("span",S(c.$attrs,{"aria-hidden":t.title?null:"true","aria-label":t.title,class:"material-design-icon web-icon",role:"img",onClick:n[0]||(n[0]=g=>c.$emit("click",g))}),[(o(),d("svg",{fill:t.fillColor,class:"material-design-icon__svg",width:t.size,height:t.size,viewBox:"0 0 24 24"},[i("path",ne,[t.title?(o(),d("title",se,l(t.title),1)):I("",!0)])],8,oe))],16,le)}const ce=M(re,[["render",de]]),ue={class:"social-button"},fe=["src"],he=["src"],pe=["src"],ge={style:{margin:"10px 0"}},me=["href"],Ce=j({__name:"PersonalSettings",setup(c){const n=window.OC.theme.productName,t=f("federatedfilesharing","color"),k=f("federatedfilesharing","textColor"),p=f("federatedfilesharing","cloudId"),y=f("federatedfilesharing","docUrlFederated"),g=f("federatedfilesharing","logoPath"),m=f("federatedfilesharing","reference"),F=x("core","facebook"),L=x("core","mastodon"),D=x("core","bluesky"),U=a("federatedfilesharing","Share with me through my #Nextcloud Federated Cloud ID, see {url}",{url:m}),R=a("federatedfilesharing","Share with me through my #Nextcloud Federated Cloud ID"),A=`https://mastodon.social/?text=${encodeURIComponent(R)}&url=${encodeURIComponent(m)}`,B=`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(m)}`,T=`https://bsky.app/intent/compose?text=${encodeURIComponent(U)}`,O=new URL(g,location.origin),v=N(!1),C=N(!1),$=w(()=>`
import{E as d,o,H as i,F as I,f as l,z as S,j,l as f,t as a,q as N,s as w,c as _,w as r,b as h,y as e,e as s,M as q,R as E,h as J}from"./string_decoder-BY7m9-pN.chunk.mjs";import{d as z}from"./index-JpgrUA2Z-Bcb7_yWp.chunk.mjs";import{_ as M,i as x}from"./_plugin-vue_export-helper-CXvX4IZ0.chunk.mjs";import{b}from"./NcNoteCard-CVhtNL04-B9GbPOf_.chunk.mjs";import{N as W}from"./NcInputField-Bwsh2aHY-lfIcluT2.chunk.mjs";import{I as G,N as K}from"./ContentCopy-nRBsf6Ta.chunk.mjs";import"./modulepreload-polyfill-BxzAKjcf.chunk.mjs";import"./mdi-BK4BBTPr.chunk.mjs";const Q={name:"CheckIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},V=["aria-hidden","aria-label"],X=["fill","width","height"],ee={d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"},ae={key:0};function te(c,n,t,k,p,y){return o(),d("span",S(c.$attrs,{"aria-hidden":t.title?null:"true","aria-label":t.title,class:"material-design-icon check-icon",role:"img",onClick:n[0]||(n[0]=g=>c.$emit("click",g))}),[(o(),d("svg",{fill:t.fillColor,class:"material-design-icon__svg",width:t.size,height:t.size,viewBox:"0 0 24 24"},[i("path",ee,[t.title?(o(),d("title",ae,l(t.title),1)):I("",!0)])],8,X))],16,V)}const ie=M(Q,[["render",te]]),re={name:"WebIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},le=["aria-hidden","aria-label"],oe=["fill","width","height"],ne={d:"M16.36,14C16.44,13.34 16.5,12.68 16.5,12C16.5,11.32 16.44,10.66 16.36,10H19.74C19.9,10.64 20,11.31 20,12C20,12.69 19.9,13.36 19.74,14M14.59,19.56C15.19,18.45 15.65,17.25 15.97,16H18.92C17.96,17.65 16.43,18.93 14.59,19.56M14.34,14H9.66C9.56,13.34 9.5,12.68 9.5,12C9.5,11.32 9.56,10.65 9.66,10H14.34C14.43,10.65 14.5,11.32 14.5,12C14.5,12.68 14.43,13.34 14.34,14M12,19.96C11.17,18.76 10.5,17.43 10.09,16H13.91C13.5,17.43 12.83,18.76 12,19.96M8,8H5.08C6.03,6.34 7.57,5.06 9.4,4.44C8.8,5.55 8.35,6.75 8,8M5.08,16H8C8.35,17.25 8.8,18.45 9.4,19.56C7.57,18.93 6.03,17.65 5.08,16M4.26,14C4.1,13.36 4,12.69 4,12C4,11.31 4.1,10.64 4.26,10H7.64C7.56,10.66 7.5,11.32 7.5,12C7.5,12.68 7.56,13.34 7.64,14M12,4.03C12.83,5.23 13.5,6.57 13.91,8H10.09C10.5,6.57 11.17,5.23 12,4.03M18.92,8H15.97C15.65,6.75 15.19,5.55 14.59,4.44C16.43,5.07 17.96,6.34 18.92,8M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z"},se={key:0};function de(c,n,t,k,p,y){return o(),d("span",S(c.$attrs,{"aria-hidden":t.title?null:"true","aria-label":t.title,class:"material-design-icon web-icon",role:"img",onClick:n[0]||(n[0]=g=>c.$emit("click",g))}),[(o(),d("svg",{fill:t.fillColor,class:"material-design-icon__svg",width:t.size,height:t.size,viewBox:"0 0 24 24"},[i("path",ne,[t.title?(o(),d("title",se,l(t.title),1)):I("",!0)])],8,oe))],16,le)}const ce=M(re,[["render",de]]),ue={class:"social-button"},fe=["src"],he=["src"],pe=["src"],ge={style:{margin:"10px 0"}},me=["href"],Ce=j({__name:"PersonalSettings",setup(c){const n=window.OC.theme.productName,t=f("federatedfilesharing","color"),k=f("federatedfilesharing","textColor"),p=f("federatedfilesharing","cloudId"),y=f("federatedfilesharing","docUrlFederated"),g=f("federatedfilesharing","logoPath"),m=f("federatedfilesharing","reference"),F=x("core","facebook"),L=x("core","mastodon"),D=x("core","bluesky"),R=a("federatedfilesharing","Share with me through my #Nextcloud Federated Cloud ID, see {url}",{url:m}),U=a("federatedfilesharing","Share with me through my #Nextcloud Federated Cloud ID"),A=`https://mastodon.social/?text=${encodeURIComponent(U)}&url=${encodeURIComponent(m)}`,B=`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(m)}`,T=`https://bsky.app/intent/compose?text=${encodeURIComponent(R)}`,O=new URL(g,location.origin),v=N(!1),C=N(!1),$=w(()=>`
padding:10px;
background-color:${t};
color:${k};
@ -6,5 +6,5 @@ import{E as d,o,H as i,F as I,f as l,z as S,j,l as f,t as a,q as N,s as w,c as _
padding-inline-start:4px;`),H=`background-image:url(${O});width:50px;height:30px;position:relative;top:8px;background-size:contain;display:inline-block;background-repeat:no-repeat; background-position: center center;`,P=w(()=>`<a target="_blank" rel="noreferrer noopener" href="${m}" style="${$.value}">
<span style="${H}"></span>
${a("federatedfilesharing","Share with me via Nextcloud")}
</a>`),Y=w(()=>C.value?a("federatedfilesharing","Cloud ID copied"):a("federatedfilesharing","Copy"));async function Z(){try{await navigator.clipboard.writeText(p),z(a("federatedfilesharing","Cloud ID copied"))}catch{window.prompt(a("federatedfilesharing","Clipboard not available. Please copy the cloud ID manually."),p)}C.value=!0,z(a("federatedfilesharing","Copied!")),setTimeout(()=>{C.value=!1},2e3)}return(ye,u)=>(o(),_(e(G),{name:e(a)("federatedfilesharing","Federated Cloud"),description:e(a)("federatedfilesharing","You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com",{productName:e(n)}),"doc-url":e(y)},{default:r(()=>[h(e(Q),{class:"federated-cloud__cloud-id",readonly:"",label:e(a)("federatedfilesharing","Your Federated Cloud ID"),"model-value":e(p),success:C.value,"show-trailing-button":"","trailing-button-label":Y.value,onTrailingButtonClick:Z},{"trailing-button-icon":r(()=>[C.value?(o(),_(ie,{key:0,size:20,"fill-color":"var(--color-border-success)"})):(o(),_(W,{key:1,size:20}))]),_:1},8,["label","model-value","success","trailing-button-label"]),i("p",ue,[s(l(e(a)("federatedfilesharing","Share it so your friends can share files with you:")),1),u[1]||(u[1]=i("br",null,null,-1)),h(e(b),{href:T},{icon:r(()=>[i("img",{class:"social-button__icon",src:e(D)},null,8,fe)]),default:r(()=>[s(l(e(a)("federatedfilesharing","Bluesky"))+" ",1)]),_:1}),h(e(b),{href:B},{icon:r(()=>[i("img",{class:"social-button__icon social-button__icon--bright",src:e(F)},null,8,he)]),default:r(()=>[s(l(e(a)("federatedfilesharing","Facebook"))+" ",1)]),_:1}),h(e(b),{href:A},{icon:r(()=>[i("img",{class:"social-button__icon",src:e(L)},null,8,pe)]),default:r(()=>[s(l(e(a)("federatedfilesharing","Mastodon"))+" ",1)]),_:1}),h(e(b),{class:"social-button__website-button",onClick:u[0]||(u[0]=ve=>v.value=!v.value)},{icon:r(()=>[h(ce,{size:20})]),default:r(()=>[s(" "+l(e(a)("federatedfilesharing","Add to your website")),1)]),_:1})]),v.value?(o(),d(q,{key:0},[i("p",ge,[i("a",{target:"_blank",rel:"noreferrer noopener",href:e(m),style:E($.value)},[i("span",{style:H}),s(" "+l(e(a)("federatedfilesharing","Share with me via {productName}",{productName:e(n)})),1)],12,me)]),i("p",null,[s(l(e(a)("federatedfilesharing","HTML Code:"))+" ",1),u[2]||(u[2]=i("br",null,null,-1)),i("pre",null,l(P.value),1)])],64)):I("",!0)]),_:1},8,["name","description","doc-url"]))}}),be=M(Ce,[["__scopeId","data-v-0b473172"]]),ke=J(be);ke.mount("#vue-personal-federated");
</a>`),Y=w(()=>C.value?a("federatedfilesharing","Cloud ID copied"):a("federatedfilesharing","Copy"));async function Z(){try{await navigator.clipboard.writeText(p),z(a("federatedfilesharing","Cloud ID copied"))}catch{window.prompt(a("federatedfilesharing","Clipboard not available. Please copy the cloud ID manually."),p)}C.value=!0,z(a("federatedfilesharing","Copied!")),setTimeout(()=>{C.value=!1},2e3)}return(ye,u)=>(o(),_(e(K),{name:e(a)("federatedfilesharing","Federated Cloud"),description:e(a)("federatedfilesharing","You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com",{productName:e(n)}),"doc-url":e(y)},{default:r(()=>[h(e(W),{class:"federated-cloud__cloud-id",readonly:"",label:e(a)("federatedfilesharing","Your Federated Cloud ID"),"model-value":e(p),success:C.value,"show-trailing-button":"","trailing-button-label":Y.value,onTrailingButtonClick:Z},{"trailing-button-icon":r(()=>[C.value?(o(),_(ie,{key:0,size:20,"fill-color":"var(--color-border-success)"})):(o(),_(G,{key:1,size:20}))]),_:1},8,["label","model-value","success","trailing-button-label"]),i("p",ue,[s(l(e(a)("federatedfilesharing","Share it so your friends can share files with you:")),1),u[1]||(u[1]=i("br",null,null,-1)),h(e(b),{href:T},{icon:r(()=>[i("img",{class:"social-button__icon",src:e(D)},null,8,fe)]),default:r(()=>[s(l(e(a)("federatedfilesharing","Bluesky"))+" ",1)]),_:1}),h(e(b),{href:B},{icon:r(()=>[i("img",{class:"social-button__icon social-button__icon--bright",src:e(F)},null,8,he)]),default:r(()=>[s(l(e(a)("federatedfilesharing","Facebook"))+" ",1)]),_:1}),h(e(b),{href:A},{icon:r(()=>[i("img",{class:"social-button__icon",src:e(L)},null,8,pe)]),default:r(()=>[s(l(e(a)("federatedfilesharing","Mastodon"))+" ",1)]),_:1}),h(e(b),{class:"social-button__website-button",onClick:u[0]||(u[0]=ve=>v.value=!v.value)},{icon:r(()=>[h(ce,{size:20})]),default:r(()=>[s(" "+l(e(a)("federatedfilesharing","Add to your website")),1)]),_:1})]),v.value?(o(),d(q,{key:0},[i("p",ge,[i("a",{target:"_blank",rel:"noreferrer noopener",href:e(m),style:E($.value)},[i("span",{style:H}),s(" "+l(e(a)("federatedfilesharing","Share with me via {productName}",{productName:e(n)})),1)],12,me)]),i("p",null,[s(l(e(a)("federatedfilesharing","HTML Code:"))+" ",1),u[2]||(u[2]=i("br",null,null,-1)),i("pre",null,l(P.value),1)])],64)):I("",!0)]),_:1},8,["name","description","doc-url"]))}}),be=M(Ce,[["__scopeId","data-v-0b473172"]]),ke=J(be);ke.mount("#vue-personal-federated");
//# sourceMappingURL=federatedfilesharing-settings-personal.mjs.map

View file

@ -0,0 +1 @@
._addTrustedServerForm__heading_14ngv_2{font-size:1.2rem;margin-block:.5lh .25lh}._addTrustedServerForm__wrapper_14ngv_7{display:flex;gap:var(--default-grid-baseline);align-items:end;max-width:600px}._addTrustedServerForm__submitButton_14ngv_14{max-height:var(--default-clickable-area)}._trustedServer_1wqey_2{display:flex;flex-direction:row;gap:var(--default-grid-baseline);align-items:center;border-radius:var(--border-radius-element);padding-inline-start:var(--default-grid-baseline)}._trustedServer_1wqey_2:hover{background-color:var(--color-background-hover)}._trustedServer__icon_error_1wqey_15{color:var(--color-element-error)}._trustedServer__url_1wqey_19{padding-inline:1ch;flex:1 0 auto}._federationAdminSettings__trustedServersList_z3uvu_2{display:flex;flex-direction:column;gap:var(--default-grid-baseline);width:fit-content}._federationAdminSettings__trustedServersListItem_z3uvu_9{width:100%}._transition_active_z3uvu_13{transition:all .5s ease}._transition_hidden_z3uvu_17{opacity:0;transform:translate(30px)}

7
dist/federation-settings-admin.css vendored Normal file
View file

@ -0,0 +1,7 @@
/* extracted by css-entry-points-plugin */
@import './federation-federation-settings-admin-BS5o4xuy.chunk.css';
@import './NcNoteCard-CVhtNL04-DopLwvn9.chunk.css';
@import './ContentCopy-D7mIRwIy.chunk.css';
@import './mdi-BYHcrfvW.chunk.css';
@import './index-JpgrUA2Z-PxDoi4mB.chunk.css';
@import './NcInputField-Bwsh2aHY-_gyGHRGx.chunk.css';

2
dist/federation-settings-admin.mjs vendored Normal file

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show more