mirror of
https://github.com/nextcloud/server.git
synced 2026-03-21 18:11:02 -04:00
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
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:
commit
8cc588fc42
180 changed files with 1126 additions and 343 deletions
|
|
@ -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()
|
||||
})
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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: '');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
90
apps/federation/src/components/AddTrustedServerForm.vue
Normal file
90
apps/federation/src/components/AddTrustedServerForm.vue
Normal 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>
|
||||
121
apps/federation/src/components/TrustedServer.vue
Normal file
121
apps/federation/src/components/TrustedServer.vue
Normal 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>
|
||||
107
apps/federation/src/services/api.spec.ts
Normal file
107
apps/federation/src/services/api.spec.ts
Normal 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)
|
||||
})
|
||||
})
|
||||
74
apps/federation/src/services/api.ts
Normal file
74
apps/federation/src/services/api.ts
Normal 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
|
||||
}
|
||||
8
apps/federation/src/services/logger.ts
Normal file
8
apps/federation/src/services/logger.ts
Normal 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()
|
||||
10
apps/federation/src/settings-admin.ts
Normal file
10
apps/federation/src/settings-admin.ts
Normal 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')
|
||||
91
apps/federation/src/views/AdminSettings.vue
Normal file
91
apps/federation/src/views/AdminSettings.vue
Normal 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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
|||
1
build/frontend/apps/federation
Symbolic link
1
build/frontend/apps/federation
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
../../../apps/federation
|
||||
|
|
@ -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'),
|
||||
|
|
|
|||
|
|
@ -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
26
dist/FilesVersionsSidebarTab-CNKpFJer.chunk.mjs
vendored
Normal file
26
dist/FilesVersionsSidebarTab-CNKpFJer.chunk.mjs
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
26
dist/FilesVersionsSidebarTab-DJtegyy8.chunk.mjs
vendored
26
dist/FilesVersionsSidebarTab-DJtegyy8.chunk.mjs
vendored
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
File diff suppressed because one or more lines are too long
|
|
@ -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
File diff suppressed because one or more lines are too long
|
|
@ -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
File diff suppressed because one or more lines are too long
|
|
@ -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
File diff suppressed because one or more lines are too long
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -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
|
|
@ -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
2
dist/dav-settings-admin-caldav.mjs
vendored
2
dist/dav-settings-admin-caldav.mjs
vendored
|
|
@ -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
|
||||
|
|
|
|||
2
dist/dav-settings-admin-example-content.mjs
vendored
2
dist/dav-settings-admin-example-content.mjs
vendored
File diff suppressed because one or more lines are too long
2
dist/dav-settings-personal-availability.mjs
vendored
2
dist/dav-settings-personal-availability.mjs
vendored
File diff suppressed because one or more lines are too long
2
dist/federatedfilesharing-init-files.mjs
vendored
2
dist/federatedfilesharing-init-files.mjs
vendored
|
|
@ -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
|
||||
|
|
|
|||
2
dist/federatedfilesharing-settings-admin.mjs
vendored
2
dist/federatedfilesharing-settings-admin.mjs
vendored
File diff suppressed because one or more lines are too long
|
|
@ -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
|
||||
|
|
|
|||
1
dist/federation-federation-settings-admin-BS5o4xuy.chunk.css
vendored
Normal file
1
dist/federation-federation-settings-admin-BS5o4xuy.chunk.css
vendored
Normal 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
7
dist/federation-settings-admin.css
vendored
Normal 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
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
Loading…
Reference in a new issue