mirror of
https://github.com/nextcloud/server.git
synced 2026-02-03 20:41:22 -05:00
Merge pull request #57695 from nextcloud/dependabot/npm_and_yarn/nextcloud/eslint-config-9.0.0-rc.7
build(deps-dev): bump @nextcloud/eslint-config from 9.0.0-rc.6 to 9.0.0-rc.7
This commit is contained in:
commit
7321ec7f23
189 changed files with 721 additions and 712 deletions
|
|
@ -22,7 +22,7 @@
|
|||
<label for="replacement-search-input">{{ t('dav', 'Out of office replacement (optional)') }}</label>
|
||||
<NcSelectUsers
|
||||
v-model="replacementUser"
|
||||
input-id="replacement-search-input"
|
||||
inputId="replacement-search-input"
|
||||
:loading="searchLoading"
|
||||
:placeholder="t('dav', 'Name of the replacement')"
|
||||
:options="options"
|
||||
|
|
|
|||
|
|
@ -76,20 +76,20 @@ async function save() {
|
|||
<CalendarAvailability
|
||||
v-model:slots="slots"
|
||||
:loading="loading"
|
||||
:l10n-to="t('dav', 'to')"
|
||||
:l10n-delete-slot="t('dav', 'Delete slot')"
|
||||
:l10n-empty-day="t('dav', 'No working hours set')"
|
||||
:l10n-add-slot="t('dav', 'Add slot')"
|
||||
:l10n-week-day-list-label="t('dav', 'Weekdays')"
|
||||
:l10n-monday="t('dav', 'Monday')"
|
||||
:l10n-tuesday="t('dav', 'Tuesday')"
|
||||
:l10n-wednesday="t('dav', 'Wednesday')"
|
||||
:l10n-thursday="t('dav', 'Thursday')"
|
||||
:l10n-friday="t('dav', 'Friday')"
|
||||
:l10n-saturday="t('dav', 'Saturday')"
|
||||
:l10n-sunday="t('dav', 'Sunday')"
|
||||
:l10n-start-picker-label="(dayName) => t('dav', 'Pick a start time for {dayName}', { dayName })"
|
||||
:l10n-end-picker-label="(dayName) => t('dav', 'Pick a end time for {dayName}', { dayName })" />
|
||||
:l10nTo="t('dav', 'to')"
|
||||
:l10nDeleteSlot="t('dav', 'Delete slot')"
|
||||
:l10nEmptyDay="t('dav', 'No working hours set')"
|
||||
:l10nAddSlot="t('dav', 'Add slot')"
|
||||
:l10nWeekDayListLabel="t('dav', 'Weekdays')"
|
||||
:l10nMonday="t('dav', 'Monday')"
|
||||
:l10nTuesday="t('dav', 'Tuesday')"
|
||||
:l10nWednesday="t('dav', 'Wednesday')"
|
||||
:l10nThursday="t('dav', 'Thursday')"
|
||||
:l10nFriday="t('dav', 'Friday')"
|
||||
:l10nSaturday="t('dav', 'Saturday')"
|
||||
:l10nSunday="t('dav', 'Sunday')"
|
||||
:l10nStartPickerLabel="(dayName) => t('dav', 'Pick a start time for {dayName}', { dayName })"
|
||||
:l10nEndPickerLabel="(dayName) => t('dav', 'Pick a end time for {dayName}', { dayName })" />
|
||||
|
||||
<NcCheckboxRadioSwitch v-model="automated">
|
||||
{{ t('dav', 'Automatically set user status to "Do not disturb" outside of availability to mute all notifications.') }}
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@
|
|||
<template>
|
||||
<div class="example-contact-settings">
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="enableDefaultContact"
|
||||
:modelValue="enableDefaultContact"
|
||||
type="switch"
|
||||
@update:model-value="updateEnableDefaultContact">
|
||||
@update:modelValue="updateEnableDefaultContact">
|
||||
{{ t('dav', "Add example contact to user's address book when they first log in") }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
<div v-if="enableDefaultContact" class="example-contact-settings__buttons">
|
||||
|
|
|
|||
|
|
@ -6,10 +6,10 @@
|
|||
<template>
|
||||
<div class="example-event-settings">
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="createExampleEvent"
|
||||
:modelValue="createExampleEvent"
|
||||
:disabled="savingConfig"
|
||||
type="switch"
|
||||
@update:model-value="updateCreateExampleEvent">
|
||||
@update:modelValue="updateCreateExampleEvent">
|
||||
{{ t('dav', "Add example event to user's calendar when they first log in") }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
<div
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<template>
|
||||
<NcSettingsSection
|
||||
:name="t('dav', 'Calendar server')"
|
||||
:doc-url="userSyncCalendarsDocUrl">
|
||||
:docUrl="userSyncCalendarsDocUrl">
|
||||
<!-- Can use v-html as:
|
||||
- t passes the translated string through DOMPurify.sanitize,
|
||||
- replacement strings are not user-controlled. -->
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ async function onSubmit() {
|
|||
required
|
||||
name="confirmPassword"
|
||||
:error="!!confirmPassword && !passwordMatch"
|
||||
:helper-text="(passwordMatch || !confirmPassword) ? '' : t('encryption', 'Passwords fields do not match')"
|
||||
:helperText="(passwordMatch || !confirmPassword) ? '' : t('encryption', 'Passwords fields do not match')"
|
||||
:label="t('encryption', 'Repeat recovery key password')" />
|
||||
|
||||
<NcButton type="submit" :variant="recoveryEnabled ? 'error' : 'primary'">
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ async function onSubmit() {
|
|||
required
|
||||
name="confirmPassword"
|
||||
:error="!passwordMatch && !!confirmPassword"
|
||||
:helper-text="(passwordMatch || !confirmPassword) ? '' : t('encryption', 'Passwords fields do not match')"
|
||||
:helperText="(passwordMatch || !confirmPassword) ? '' : t('encryption', 'Passwords fields do not match')"
|
||||
:label="t('encryption', 'Repeat new recovery key password')" />
|
||||
|
||||
<NcButton type="submit" variant="primary">
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ async function reloadStatus() {
|
|||
|
||||
<SettingsPersonalChangePrivateKey
|
||||
v-else-if="initialized === InitStatus.InitExecuted"
|
||||
:recovery-enabled-for-user
|
||||
:recoveryEnabledForUser
|
||||
@updated="reloadStatus" />
|
||||
<SettingsPersonalEnableRecovery
|
||||
v-else-if="personalSettings.recoveryEnabled && personalSettings.privateKeySet"
|
||||
|
|
|
|||
|
|
@ -156,7 +156,7 @@ async function updateAppConfig(key: string, value: boolean) {
|
|||
<NcSettingsSection
|
||||
:name="t('federatedfilesharing', 'Federated Cloud Sharing')"
|
||||
:description="t('federatedfilesharing', 'Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing.')"
|
||||
:doc-url="sharingFederatedDocUrl">
|
||||
:docUrl="sharingFederatedDocUrl">
|
||||
<NcCheckboxRadioSwitch
|
||||
v-model="state.outgoingServer2serverShareEnabled"
|
||||
type="switch">
|
||||
|
|
@ -188,17 +188,17 @@ async function updateAppConfig(key: string, value: boolean) {
|
|||
|
||||
<NcCheckboxRadioSwitch
|
||||
type="switch"
|
||||
:model-value="state.lookupServerEnabled"
|
||||
:modelValue="state.lookupServerEnabled"
|
||||
disabled
|
||||
@update:model-value="showLookupServerConfirmation">
|
||||
@update:modelValue="showLookupServerConfirmation">
|
||||
{{ t('federatedfilesharing', 'Search global and public address book for people') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
|
||||
<NcCheckboxRadioSwitch
|
||||
type="switch"
|
||||
:model-value="state.lookupServerUploadEnabled"
|
||||
:modelValue="state.lookupServerUploadEnabled"
|
||||
disabled
|
||||
@update:model-value="showLookupServerUploadConfirmation">
|
||||
@update:modelValue="showLookupServerUploadConfirmation">
|
||||
{{ t('federatedfilesharing', 'Allow people to publish their data to a global and public address book') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
</fieldset>
|
||||
|
|
|
|||
|
|
@ -76,18 +76,18 @@ async function copyCloudId(): Promise<void> {
|
|||
<NcSettingsSection
|
||||
:name="t('federatedfilesharing', 'Federated Cloud')"
|
||||
:description="t('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 })"
|
||||
:doc-url="docUrlFederated">
|
||||
:docUrl="docUrlFederated">
|
||||
<NcInputField
|
||||
class="federated-cloud__cloud-id"
|
||||
readonly
|
||||
:label="t('federatedfilesharing', 'Your Federated Cloud ID')"
|
||||
:model-value="cloudId"
|
||||
:modelValue="cloudId"
|
||||
:success="isCopied"
|
||||
show-trailing-button
|
||||
:trailing-button-label="copyLinkTooltip"
|
||||
@trailing-button-click="copyCloudId">
|
||||
showTrailingButton
|
||||
:trailingButtonLabel="copyLinkTooltip"
|
||||
@trailingButtonClick="copyCloudId">
|
||||
<template #trailing-button-icon>
|
||||
<IconCheck v-if="isCopied" :size="20" fill-color="var(--color-border-success)" />
|
||||
<IconCheck v-if="isCopied" :size="20" fillColor="var(--color-border-success)" />
|
||||
<IconClipboard v-else :size="20" />
|
||||
</template>
|
||||
</NcInputField>
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ const buttons = computed<INcDialogButtons>(() => [
|
|||
<template>
|
||||
<NcDialog
|
||||
:buttons="buttons"
|
||||
:is-form="passwordRequired"
|
||||
:isForm="passwordRequired"
|
||||
:name="t('federatedfilesharing', 'Remote share')"
|
||||
@submit="emit('close', true, password)">
|
||||
<p>
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ async function processSharesToConfirm() {
|
|||
* @param {string} share.name name of the shared folder
|
||||
* @param {string} share.token authentication token
|
||||
* @param {boolean} passwordProtected true if the share is password protected
|
||||
* @param {Function} callback the callback
|
||||
* @param {(status: boolean, share: Record<string, unknown> & { password?: string }) => void} callback the callback
|
||||
*/
|
||||
function showAddExternalDialog(share, passwordProtected, callback) {
|
||||
const owner = share.ownerDisplayName || share.owner
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ function onDelete(server: ITrustedServer) {
|
|||
<template>
|
||||
<NcSettingsSection
|
||||
:name="t('federation', 'Trusted servers')"
|
||||
:doc-url="adminSettings.docUrl"
|
||||
:docUrl="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"
|
||||
|
|
@ -52,10 +52,10 @@ function onDelete(server: ITrustedServer) {
|
|||
: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">
|
||||
:enterFromClass="$style.transition_hidden"
|
||||
:enterActiveClass="$style.transition_active"
|
||||
:leaveActiveClass="$style.transition_active"
|
||||
:leaveToClass="$style.transition_hidden">
|
||||
<TrustedServer
|
||||
v-for="server in trustedServers"
|
||||
:key="server.id"
|
||||
|
|
|
|||
|
|
@ -383,7 +383,12 @@ export default defineComponent({
|
|||
this.$nextTick(() => {
|
||||
this.$el.scrollTop = scrollTop
|
||||
logger.debug(`VirtualList: scrolling to index ${index}`, {
|
||||
clampedIndex, scrollTop, columnCount: this.columnCount, total: this.totalRowCount, visibleRows: this.visibleRows, beforeHeight: this.beforeHeight,
|
||||
clampedIndex,
|
||||
scrollTop,
|
||||
columnCount: this.columnCount,
|
||||
total: this.totalRowCount,
|
||||
visibleRows: this.visibleRows,
|
||||
beforeHeight: this.beforeHeight,
|
||||
})
|
||||
})
|
||||
},
|
||||
|
|
|
|||
|
|
@ -78,8 +78,8 @@ watch(authMechanisms, () => {
|
|||
<template>
|
||||
<NcDialog
|
||||
v-model:open="open"
|
||||
is-form
|
||||
:content-classes="$style.externalStorageDialog"
|
||||
isForm
|
||||
:contentClasses="$style.externalStorageDialog"
|
||||
:name="internalStorage.id ? t('files_external', 'Edit storage') : t('files_external', 'Add storage')"
|
||||
@submit="$emit('close', internalStorage)"
|
||||
@update:open="$event || $emit('close')">
|
||||
|
|
@ -99,7 +99,7 @@ watch(authMechanisms, () => {
|
|||
v-model="backend"
|
||||
:options="backends"
|
||||
:disabled="!!(internalStorage.id && internalStorage.backend)"
|
||||
:input-label="t('files_external', 'External storage')"
|
||||
:inputLabel="t('files_external', 'External storage')"
|
||||
label="name"
|
||||
required />
|
||||
|
||||
|
|
@ -107,7 +107,7 @@ watch(authMechanisms, () => {
|
|||
v-model="authMechanism"
|
||||
:options="authMechanisms"
|
||||
:disabled="!internalStorage.backend || authMechanisms.length <= 1 || !!(internalStorage.id && internalStorage.authMechanism)"
|
||||
:input-label="t('files_external', 'Authentication')"
|
||||
:inputLabel="t('files_external', 'Authentication')"
|
||||
label="name"
|
||||
required />
|
||||
|
||||
|
|
@ -121,7 +121,7 @@ watch(authMechanisms, () => {
|
|||
v-if="authMechanism"
|
||||
v-model="internalStorage.backendOptions"
|
||||
:class="$style.externalStorageDialog__configuration"
|
||||
:auth-mechanism="authMechanism" />
|
||||
:authMechanism="authMechanism" />
|
||||
|
||||
<template #actions>
|
||||
<NcButton v-if="storage.id" @click="$emit('close')">
|
||||
|
|
|
|||
|
|
@ -59,9 +59,9 @@ async function onSearch(pattern: string) {
|
|||
<template>
|
||||
<NcSelectUsers
|
||||
v-model="model"
|
||||
keep-open
|
||||
keepOpen
|
||||
multiple
|
||||
:options="entities"
|
||||
:input-label="t('files_external', 'Restrict to')"
|
||||
:inputLabel="t('files_external', 'Restrict to')"
|
||||
@search="debouncedSearch" />
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -39,8 +39,8 @@ watch(() => props.configuration, () => {
|
|||
v-show="!(configOption.flags & ConfigurationFlag.Hidden)"
|
||||
:key="configOption.value"
|
||||
v-model="modelValue[configKey]!"
|
||||
:config-key="configKey"
|
||||
:config-option="configOption" />
|
||||
:configKey="configKey"
|
||||
:configOption="configOption" />
|
||||
</fieldset>
|
||||
</template>
|
||||
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ const checkFilesystem = computed({
|
|||
:aria-labelledby="idButton">
|
||||
<NcSelect
|
||||
v-model="checkFilesystem"
|
||||
:input-label="t('files_external', 'Check filesystem changes')"
|
||||
:inputLabel="t('files_external', 'Check filesystem changes')"
|
||||
:options="checkFilesystemOptions" />
|
||||
|
||||
<NcCheckboxRadioSwitch v-model="modelValue.readonly" type="switch">
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ const storages = computed(() => {
|
|||
<ExternalStorageTableRow
|
||||
v-for="storage in storages"
|
||||
:key="storage.id"
|
||||
:is-admin
|
||||
:isAdmin
|
||||
:storage="storage" />
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
|
|||
|
|
@ -115,13 +115,13 @@ async function reloadStatus() {
|
|||
<NcChip
|
||||
v-for="group of storage.applicableGroups"
|
||||
:key="group"
|
||||
:icon-path="mdiAccountGroupOutline"
|
||||
no-close
|
||||
:iconPath="mdiAccountGroupOutline"
|
||||
noClose
|
||||
:text="group" />
|
||||
<NcUserBubble
|
||||
v-for="user of users"
|
||||
:key="user.user"
|
||||
:display-name="user.displayName"
|
||||
:displayName="user.displayName"
|
||||
:size="24"
|
||||
:user="user.user" />
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -57,13 +57,13 @@ async function generateKeys() {
|
|||
v-show="!(configOption.flags & ConfigurationFlag.Hidden)"
|
||||
:key="configOption.value"
|
||||
v-model="modelValue[configKey]!"
|
||||
:config-key="configKey"
|
||||
:config-option="configOption" />
|
||||
:configKey="configKey"
|
||||
:configOption="configOption" />
|
||||
|
||||
<NcSelect
|
||||
v-model="keySize"
|
||||
:clearable="false"
|
||||
:input-label="t('files_external', 'Key size')"
|
||||
:inputLabel="t('files_external', 'Key size')"
|
||||
:options="[1024, 2048, 4096]"
|
||||
required />
|
||||
|
||||
|
|
|
|||
|
|
@ -29,11 +29,11 @@ const dialogButtons: InstanceType<typeof NcDialog>['buttons'] = [{
|
|||
<NcDialog
|
||||
:buttons="dialogButtons"
|
||||
class="external-storage-auth"
|
||||
close-on-click-outside
|
||||
closeOnClickOutside
|
||||
data-cy-external-storage-auth
|
||||
is-form
|
||||
isForm
|
||||
:name="t('files_external', 'Storage credentials')"
|
||||
out-transition
|
||||
outTransition
|
||||
@submit="$emit('close', { login, password })"
|
||||
@update:open="$emit('close')">
|
||||
<!-- Header -->
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ async function addStorage(storage?: Partial<IStorage>) {
|
|||
|
||||
<template>
|
||||
<NcSettingsSection
|
||||
:doc-url="settings.docUrl"
|
||||
:docUrl="settings.docUrl"
|
||||
:name="t('files_external', 'External storage')"
|
||||
:description="
|
||||
t('files_external', 'External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices.')
|
||||
|
|
|
|||
|
|
@ -114,9 +114,9 @@ function onInput(): void {
|
|||
<NcDialog
|
||||
v-if="opened"
|
||||
:name="t('files_reminders', `Set reminder for '{fileName}'`, { fileName: node.displayname })"
|
||||
out-transition
|
||||
outTransition
|
||||
size="small"
|
||||
close-on-click-outside
|
||||
closeOnClickOutside
|
||||
@closing="onClose">
|
||||
<form
|
||||
id="set-custom-reminder-form"
|
||||
|
|
|
|||
|
|
@ -23,8 +23,7 @@ function getFirstWorkdayOfWeek() {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param date
|
||||
* @param date - The date to get the week number for
|
||||
*/
|
||||
function getWeek(date: Date) {
|
||||
const dateClone = new Date(date)
|
||||
|
|
@ -35,9 +34,8 @@ function getWeek(date: Date) {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param a
|
||||
* @param b
|
||||
* @param a - First date
|
||||
* @param b - Second date
|
||||
*/
|
||||
function isSameWeek(a: Date, b: Date) {
|
||||
return getWeek(a) === getWeek(b)
|
||||
|
|
@ -45,9 +43,8 @@ function isSameWeek(a: Date, b: Date) {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param a
|
||||
* @param b
|
||||
* @param a - First date
|
||||
* @param b - Second date
|
||||
*/
|
||||
function isSameDate(a: Date, b: Date) {
|
||||
return a.getDate() === b.getDate()
|
||||
|
|
@ -56,8 +53,7 @@ function isSameDate(a: Date, b: Date) {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param dateTime
|
||||
* @param dateTime - The preset to get the date for
|
||||
*/
|
||||
export function getDateTime(dateTime: DateTimePreset): null | Date {
|
||||
const matchPreset: Record<DateTimePreset, () => null | Date> = {
|
||||
|
|
@ -126,8 +122,7 @@ export function getInitialCustomDueDate(): Date {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param dueDate
|
||||
* @param dueDate - The date to format as a string
|
||||
*/
|
||||
export function getDateString(dueDate: Date): string {
|
||||
let formatOptions: Intl.DateTimeFormatOptions = {
|
||||
|
|
@ -166,8 +161,7 @@ export function getDateString(dueDate: Date): string {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param dueDate
|
||||
* @param dueDate - The date to format as a string
|
||||
*/
|
||||
export function getVerboseDateString(dueDate: Date): string {
|
||||
let formatOptions: Intl.DateTimeFormatOptions = {
|
||||
|
|
|
|||
|
|
@ -356,8 +356,7 @@ export default defineComponent({
|
|||
value: this.emails,
|
||||
key: 'emails',
|
||||
scope: 'shareWith',
|
||||
},
|
||||
{
|
||||
}, {
|
||||
value: true,
|
||||
key: 'enabled',
|
||||
scope: 'fileRequest',
|
||||
|
|
|
|||
|
|
@ -112,7 +112,8 @@ export default defineComponent({
|
|||
|
||||
setup() {
|
||||
return {
|
||||
n, t,
|
||||
n,
|
||||
t,
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,8 @@
|
|||
|
||||
<script lang="ts" setup>
|
||||
import {
|
||||
type Component, type PropType,
|
||||
type Component,
|
||||
type PropType,
|
||||
|
||||
computed,
|
||||
} from 'vue'
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<template>
|
||||
<NcListItem
|
||||
class="version"
|
||||
:force-display-actions="true"
|
||||
:forceDisplayActions="true"
|
||||
:actions-aria-label="t('files_versions', 'Actions for version from {versionHumanExplicitDate}', { versionHumanExplicitDate })"
|
||||
:data-files-versions-version="version.fileVersion"
|
||||
:href="downloadURL"
|
||||
|
|
@ -49,9 +49,9 @@
|
|||
class="avatar"
|
||||
:user="version.author ?? undefined"
|
||||
:size="20"
|
||||
disable-menu
|
||||
disable-tooltip
|
||||
hide-status />
|
||||
disableMenu
|
||||
disableTooltip
|
||||
hideStatus />
|
||||
<div
|
||||
class="version__info__author_name"
|
||||
:title="versionAuthor">
|
||||
|
|
@ -66,7 +66,7 @@
|
|||
<div class="version__info version__info__subline">
|
||||
<NcDateTime
|
||||
class="version__info__date"
|
||||
relative-time="short"
|
||||
relativeTime="short"
|
||||
:timestamp="version.mtime" />
|
||||
<!-- Separate dot to improve alignment -->
|
||||
<span>•</span>
|
||||
|
|
@ -79,7 +79,7 @@
|
|||
<NcActionButton
|
||||
v-if="enableLabeling && hasUpdatePermissions"
|
||||
data-cy-files-versions-version-action="label"
|
||||
:close-after-click="true"
|
||||
:closeAfterClick="true"
|
||||
@click="labelUpdate">
|
||||
<template #icon>
|
||||
<Pencil :size="22" />
|
||||
|
|
@ -89,7 +89,7 @@
|
|||
<NcActionButton
|
||||
v-if="!isCurrent && canView && canCompare"
|
||||
data-cy-files-versions-version-action="compare"
|
||||
:close-after-click="true"
|
||||
:closeAfterClick="true"
|
||||
@click="compareVersion">
|
||||
<template #icon>
|
||||
<FileCompare :size="22" />
|
||||
|
|
@ -99,7 +99,7 @@
|
|||
<NcActionButton
|
||||
v-if="!isCurrent && hasUpdatePermissions"
|
||||
data-cy-files-versions-version-action="restore"
|
||||
:close-after-click="true"
|
||||
:closeAfterClick="true"
|
||||
@click="restoreVersion">
|
||||
<template #icon>
|
||||
<BackupRestore :size="22" />
|
||||
|
|
@ -110,7 +110,7 @@
|
|||
v-if="isDownloadable"
|
||||
data-cy-files-versions-version-action="download"
|
||||
:href="downloadURL"
|
||||
:close-after-click="true"
|
||||
:closeAfterClick="true"
|
||||
:download="downloadURL">
|
||||
<template #icon>
|
||||
<Download :size="22" />
|
||||
|
|
@ -120,7 +120,7 @@
|
|||
<NcActionButton
|
||||
v-if="!isCurrent && enableDeletion && hasDeletePermissions"
|
||||
data-cy-files-versions-version-action="delete"
|
||||
:close-after-click="true"
|
||||
:closeAfterClick="true"
|
||||
@click="deleteVersion">
|
||||
<template #icon>
|
||||
<Delete :size="22" />
|
||||
|
|
@ -133,7 +133,6 @@
|
|||
|
||||
<script lang="ts" setup>
|
||||
import type { INode } from '@nextcloud/files'
|
||||
import type { PropType } from 'vue'
|
||||
import type { Version } from '../utils/versions.ts'
|
||||
|
||||
import { getCurrentUser } from '@nextcloud/auth'
|
||||
|
|
@ -154,44 +153,23 @@ import Pencil from 'vue-material-design-icons/PencilOutline.vue'
|
|||
import Delete from 'vue-material-design-icons/TrashCanOutline.vue'
|
||||
import Download from 'vue-material-design-icons/TrayArrowDown.vue'
|
||||
|
||||
const props = defineProps({
|
||||
version: {
|
||||
type: Object as PropType<Version>,
|
||||
required: true,
|
||||
},
|
||||
const props = defineProps<{
|
||||
version: Version
|
||||
node: INode
|
||||
isCurrent: boolean
|
||||
isFirstVersion: boolean
|
||||
loadPreview: boolean
|
||||
canView: boolean
|
||||
canCompare: boolean
|
||||
}>()
|
||||
|
||||
node: {
|
||||
type: Object as PropType<INode>,
|
||||
required: true,
|
||||
},
|
||||
|
||||
isCurrent: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
isFirstVersion: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
loadPreview: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
canView: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
canCompare: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
})
|
||||
|
||||
const emit = defineEmits(['click', 'compare', 'restore', 'delete', 'label-update-request'])
|
||||
const emit = defineEmits<{
|
||||
click: [version: Version]
|
||||
compare: [version: Version]
|
||||
restore: [version: Version]
|
||||
delete: [version: Version]
|
||||
labelUpdateRequest: []
|
||||
}>()
|
||||
|
||||
const previewLoaded = ref(false)
|
||||
const previewErrored = ref(false)
|
||||
|
|
@ -287,7 +265,7 @@ const isDownloadable = computed(() => {
|
|||
* Label update request
|
||||
*/
|
||||
function labelUpdate() {
|
||||
emit('label-update-request')
|
||||
emit('labelUpdateRequest')
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -318,7 +296,7 @@ function click(event: MouseEvent) {
|
|||
event.preventDefault()
|
||||
}
|
||||
|
||||
emit('click', { version: props.version })
|
||||
emit('click', props.version)
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -328,7 +306,7 @@ function compareVersion() {
|
|||
if (!props.canView) {
|
||||
throw new Error('Cannot compare version of this file')
|
||||
}
|
||||
emit('compare', { version: props.version })
|
||||
emit('compare', props.version)
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@
|
|||
<template>
|
||||
<NcDialog
|
||||
:buttons="dialogButtons"
|
||||
content-classes="version-label-modal"
|
||||
is-form
|
||||
contentClasses="version-label-modal"
|
||||
isForm
|
||||
:open="open"
|
||||
size="normal"
|
||||
:name="t('files_versions', 'Name this version')"
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
ref="rowsContainer"
|
||||
class="vs-rows-container"
|
||||
:style="rowsContainerStyle">
|
||||
<slot :visible-sections="visibleSections" />
|
||||
<slot :visibleSections="visibleSections" />
|
||||
<slot name="loader" />
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
ref="rowsContainer"
|
||||
class="vs-rows-container"
|
||||
:style="rowsContainerStyle">
|
||||
<slot :visible-sections="visibleSections" />
|
||||
<slot :visibleSections="visibleSections" />
|
||||
<slot name="loader" />
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -96,7 +96,7 @@ export default defineComponent({
|
|||
},
|
||||
},
|
||||
|
||||
emits: ['need-content'],
|
||||
emits: ['needContent'],
|
||||
|
||||
data() {
|
||||
return {
|
||||
|
|
@ -234,7 +234,7 @@ export default defineComponent({
|
|||
|
||||
/**
|
||||
* Whether the user is near the bottom.
|
||||
* If true, then the need-content event will be emitted.
|
||||
* If true, then the needContent event will be emitted.
|
||||
*/
|
||||
isNearBottom(): boolean {
|
||||
const buffer = this.containerHeight * this.bottomBufferRatio
|
||||
|
|
@ -257,15 +257,15 @@ export default defineComponent({
|
|||
isNearBottom(value) {
|
||||
logger.debug('[VirtualScrolling] isNearBottom changed', { value })
|
||||
if (value) {
|
||||
this.$emit('need-content')
|
||||
this.$emit('needContent')
|
||||
}
|
||||
},
|
||||
|
||||
visibleSections() {
|
||||
// Re-emit need-content when rows is updated and isNearBottom is still true.
|
||||
// Re-emit needContent when rows is updated and isNearBottom is still true.
|
||||
// If the height of added rows is under `bottomBufferRatio`, `isNearBottom` will still be true so we need more content.
|
||||
if (this.isNearBottom) {
|
||||
this.$emit('need-content')
|
||||
this.$emit('needContent')
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -6,24 +6,24 @@
|
|||
<div v-if="node" class="versions-tab__container">
|
||||
<VirtualScrolling
|
||||
:sections="sections"
|
||||
:header-height="0">
|
||||
:headerHeight="0">
|
||||
<template #default="{ visibleSections }">
|
||||
<ul :aria-label="t('files_versions', 'File versions')" data-files-versions-versions-list>
|
||||
<template v-if="visibleSections.length === 1">
|
||||
<VersionEntry
|
||||
v-for="(row) of visibleSections[0].rows"
|
||||
:key="row.items[0].version.mtime"
|
||||
:can-view="canView"
|
||||
:can-compare="canCompare"
|
||||
:load-preview="active"
|
||||
:canView="canView"
|
||||
:canCompare="canCompare"
|
||||
:loadPreview="active"
|
||||
:version="row.items[0].version"
|
||||
:node="node"
|
||||
:is-current="row.items[0].version.mtime === currentVersionMtime"
|
||||
:is-first-version="row.items[0].version.mtime === initialVersionMtime"
|
||||
:isCurrent="row.items[0].version.mtime === currentVersionMtime"
|
||||
:isFirstVersion="row.items[0].version.mtime === initialVersionMtime"
|
||||
@click="openVersion"
|
||||
@compare="compareVersion"
|
||||
@restore="handleRestore"
|
||||
@label-update-request="handleLabelUpdateRequest(row.items[0].version)"
|
||||
@labelUpdateRequest="handleLabelUpdateRequest(row.items[0].version)"
|
||||
@delete="handleDelete" />
|
||||
</template>
|
||||
</ul>
|
||||
|
|
@ -234,10 +234,9 @@ async function handleDelete(version: Version) {
|
|||
}
|
||||
|
||||
/**
|
||||
* @param payload - The event payload
|
||||
* @param payload.version - The version to open
|
||||
* @param version - The version to open
|
||||
*/
|
||||
function openVersion({ version }: { version: Version }) {
|
||||
function openVersion(version: Version) {
|
||||
if (props.node === null) {
|
||||
return
|
||||
}
|
||||
|
|
@ -261,10 +260,9 @@ function openVersion({ version }: { version: Version }) {
|
|||
}
|
||||
|
||||
/**
|
||||
* @param payload - The event payload
|
||||
* @param payload.version - The version to compare
|
||||
* @param version - The version to compare
|
||||
*/
|
||||
function compareVersion({ version }: { version: Version }) {
|
||||
function compareVersion(version: Version) {
|
||||
const _versions = versions.value.map((version) => ({ ...version, previewUrl: undefined }))
|
||||
|
||||
window.OCA.Viewer.compare(
|
||||
|
|
|
|||
|
|
@ -37,9 +37,9 @@ defineEmits<{
|
|||
v-if="client.clientSecret"
|
||||
:class="$style.oAuthItem__clientSecret"
|
||||
:aria-label="t('oauth2', 'Secret key')"
|
||||
as-text
|
||||
:model-value="client.clientSecret"
|
||||
show-trailing-button />
|
||||
asText
|
||||
:modelValue="client.clientSecret"
|
||||
showTrailingButton />
|
||||
<span v-else>*****</span>
|
||||
</td>
|
||||
<td>
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ async function addClient() {
|
|||
<NcSettingsSection
|
||||
:name="t('oauth2', 'OAuth 2.0 clients')"
|
||||
:description="t('oauth2', 'OAuth 2.0 allows external services to request access to {instanceName}.', { instanceName })"
|
||||
:doc-url="oauthDocLink">
|
||||
:docUrl="oauthDocLink">
|
||||
<table v-if="clients.length > 0" :class="[$style.oauthApp__table, { [$style.oauthApp__table_withSecret]: showSecretWarning }]">
|
||||
<thead>
|
||||
<tr>
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ function openStatusModal() {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<NcContent app-name="profile">
|
||||
<NcContent appName="profile">
|
||||
<NcAppContent>
|
||||
<div class="profile__header">
|
||||
<div class="profile__header__container">
|
||||
|
|
@ -146,9 +146,9 @@ function openStatusModal() {
|
|||
:class="{ interactive: isCurrentUser }"
|
||||
:user="profileParameters.userId"
|
||||
:size="180"
|
||||
:disable-menu="true"
|
||||
:disable-tooltip="true"
|
||||
:is-no-user="!profileParameters.isUserAvatarVisible"
|
||||
:disableMenu="true"
|
||||
:disableTooltip="true"
|
||||
:isNoUser="!profileParameters.isUserAvatarVisible"
|
||||
@click.prevent.stop="openStatusModal" />
|
||||
|
||||
<div class="user-actions">
|
||||
|
|
@ -170,7 +170,7 @@ function openStatusModal() {
|
|||
<NcActionLink
|
||||
v-for="action in otherActions"
|
||||
:key="action.id"
|
||||
:close-after-click="true"
|
||||
:closeAfterClick="true"
|
||||
:href="action.target"
|
||||
:target="action.id === 'phone' ? '_self' : '_blank'">
|
||||
<template #icon>
|
||||
|
|
@ -201,14 +201,14 @@ function openStatusModal() {
|
|||
<h3 v-if="profileParameters.headline" class="profile__blocks-headline">
|
||||
{{ profileParameters.headline }}
|
||||
</h3>
|
||||
<NcRichText v-if="profileParameters.biography" :text="profileParameters.biography" use-extended-markdown />
|
||||
<NcRichText v-if="profileParameters.biography" :text="profileParameters.biography" useExtendedMarkdown />
|
||||
|
||||
<!-- additional entries, use it with cautious -->
|
||||
<ProfileSection
|
||||
v-for="section in sortedSections"
|
||||
:key="section.id"
|
||||
:section="section"
|
||||
:user-id="profileParameters.userId" />
|
||||
:userId="profileParameters.userId" />
|
||||
</template>
|
||||
<NcEmptyContent
|
||||
v-else
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@
|
|||
<NcSettingsSection
|
||||
:name="t('settings', 'Machine translation')"
|
||||
:description="t('settings', 'Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment.')">
|
||||
<draggable v-model="settings['ai.translation_provider_preferences']" @change="saveChanges">
|
||||
<VueDraggable v-model="settings['ai.translation_provider_preferences']" @change="saveChanges">
|
||||
<div v-for="(providerClass, i) in settings['ai.translation_provider_preferences']" :key="providerClass" class="draggable__item">
|
||||
<DragVerticalIcon /> <span class="draggable__number">{{ i + 1 }}</span> {{ translationProviders.find(p => p.class === providerClass)?.name }}
|
||||
<NcButton aria-label="Move up" variant="tertiary" @click="moveUp(i)">
|
||||
|
|
@ -63,7 +63,7 @@
|
|||
</template>
|
||||
</NcButton>
|
||||
</div>
|
||||
</draggable>
|
||||
</VueDraggable>
|
||||
</NcSettingsSection>
|
||||
<NcSettingsSection
|
||||
:name="t('settings', 'Image generation')"
|
||||
|
|
@ -124,7 +124,7 @@ import axios from '@nextcloud/axios'
|
|||
import { loadState } from '@nextcloud/initial-state'
|
||||
import { generateUrl } from '@nextcloud/router'
|
||||
import { nextTick } from 'vue'
|
||||
import draggable from 'vuedraggable'
|
||||
import VueDraggable from 'vuedraggable'
|
||||
import NcButton from '@nextcloud/vue/components/NcButton'
|
||||
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
|
||||
import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
|
||||
|
|
@ -141,7 +141,7 @@ export default {
|
|||
NcCheckboxRadioSwitch,
|
||||
NcSettingsSection,
|
||||
NcSelect,
|
||||
draggable,
|
||||
VueDraggable,
|
||||
DragVerticalIcon,
|
||||
ArrowDownIcon,
|
||||
ArrowUpIcon,
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ async function saveSetting(key: string, value: unknown) {
|
|||
</h4>
|
||||
<NcSelect
|
||||
v-model="selectedApps"
|
||||
keep-open
|
||||
keepOpen
|
||||
multiple
|
||||
:placeholder="t('theming', 'Global default apps')"
|
||||
:options="allApps" />
|
||||
|
|
|
|||
|
|
@ -18,40 +18,40 @@ const ADMIN_INFO = loadState<AdminThemingInfo>('theming', 'adminThemingInfo')
|
|||
<NcSettingsSection
|
||||
:name="t('theming', 'Theming')"
|
||||
:description="t('theming', 'Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users.')"
|
||||
:doc-url="ADMIN_INFO.docUrl"
|
||||
:docUrl="ADMIN_INFO.docUrl"
|
||||
data-admin-theming-settings>
|
||||
<div :class="$style.adminSectionTheming">
|
||||
<!-- Name, web link, slogan... fields -->
|
||||
<TextField
|
||||
name="name"
|
||||
:label="t('theming', 'Name')"
|
||||
default-value="Nextcloud"
|
||||
defaultValue="Nextcloud"
|
||||
maxlength="250" />
|
||||
<TextField
|
||||
name="url"
|
||||
:label="t('theming', 'Web link')"
|
||||
default-value="https://nextcloud.com"
|
||||
defaultValue="https://nextcloud.com"
|
||||
placeholder="https://…"
|
||||
type="url"
|
||||
maxlength="500" />
|
||||
<TextField
|
||||
name="slogan"
|
||||
:label="t('theming', 'Slogan')"
|
||||
:default-value="t('settings', 'a safe home for all your data')"
|
||||
:defaultValue="t('settings', 'a safe home for all your data')"
|
||||
maxlength="500" />
|
||||
<hr>
|
||||
|
||||
<TextField
|
||||
name="legalNoticeUrl"
|
||||
:label="t('theming', 'Legal notice link')"
|
||||
default-value=""
|
||||
defaultValue=""
|
||||
type="url"
|
||||
placeholder="https://…"
|
||||
maxlength="500" />
|
||||
<TextField
|
||||
name="privacyPolicyUrl"
|
||||
:label="t('theming', 'Privacy policy link')"
|
||||
default-value=""
|
||||
defaultValue=""
|
||||
type="url"
|
||||
placeholder="https://…"
|
||||
maxlength="500" />
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ async function toggleBackground(value: boolean) {
|
|||
<ColorPickerField
|
||||
name="primaryColor"
|
||||
:label="t('theming', 'Primary color')"
|
||||
default-value="#00679e"
|
||||
defaultValue="#00679e"
|
||||
@updated="refreshStyles">
|
||||
<template #description>
|
||||
{{ t('theming', 'Set the default primary color, used to highlight important elements.') }}
|
||||
|
|
@ -83,7 +83,7 @@ async function toggleBackground(value: boolean) {
|
|||
<ColorPickerField
|
||||
name="backgroundColor"
|
||||
:label="t('theming', 'Background color')"
|
||||
:default-value="defaultBackgroundColor"
|
||||
:defaultValue="defaultBackgroundColor"
|
||||
@updated="refreshStyles">
|
||||
<template #description>
|
||||
{{ t('theming', 'When no background image is set the background color will be used.') }}
|
||||
|
|
|
|||
|
|
@ -151,8 +151,8 @@ function updateStatusInfo(index: number) {
|
|||
:app="app"
|
||||
:aria-details="ariaDetails"
|
||||
:aria-describedby="statusInfoId"
|
||||
:is-first="index === 0 || !!appList[index - 1]!.default"
|
||||
:is-last="index === appList.length - 1"
|
||||
:isFirst="index === 0 || !!appList[index - 1]!.default"
|
||||
:isLast="index === appList.length - 1"
|
||||
v-on="app.default
|
||||
? {}
|
||||
: {
|
||||
|
|
|
|||
|
|
@ -144,8 +144,8 @@ async function saveSetting(key: string, value: unknown) {
|
|||
<AppOrderSelector
|
||||
:class="$style.userSectionAppMenu__selector"
|
||||
:aria-details="ariaDetailsAppOrder"
|
||||
:model-value="appOrder"
|
||||
@update:model-value="updateAppOrder" />
|
||||
:modelValue="appOrder"
|
||||
@update:modelValue="updateAppOrder" />
|
||||
|
||||
<NcButton
|
||||
data-test-id="btn-apporder-reset"
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ const textColor = computed(() => getTextColor(previewColor.value))
|
|||
<NcColorPicker
|
||||
:id
|
||||
v-model="previewColor"
|
||||
advanced-fields
|
||||
advancedFields
|
||||
@submit="modelValue = $event!">
|
||||
<NcButton
|
||||
:class="$style.colorPickerField__button"
|
||||
|
|
|
|||
|
|
@ -51,9 +51,9 @@ watchDebounced(modelValue, (value) => {
|
|||
:readonly="isSaving"
|
||||
:success="isSaved"
|
||||
:type
|
||||
:show-trailing-button="modelValue !== defaultValue"
|
||||
:trailing-button-icon="defaultValue ? 'undo' : 'close'"
|
||||
@trailing-button-click="reset">
|
||||
:showTrailingButton="modelValue !== defaultValue"
|
||||
:trailingButtonIcon="defaultValue ? 'undo' : 'close'"
|
||||
@trailingButtonClick="reset">
|
||||
<template v-if="isSaving" #icon>
|
||||
<NcLoadingIcon />
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<NcNoteCard
|
||||
v-if="!isThemeable"
|
||||
:text="notThemeableErrorMessage"
|
||||
show-alert
|
||||
showAlert
|
||||
type="error" />
|
||||
<template v-else>
|
||||
<AdminSectionTheming />
|
||||
|
|
|
|||
|
|
@ -38,9 +38,9 @@
|
|||
<h3>{{ t('theming', 'Misc accessibility options') }}</h3>
|
||||
<NcCheckboxRadioSwitch
|
||||
type="checkbox"
|
||||
:model-value="enableBlurFilter === 'yes'"
|
||||
:modelValue="enableBlurFilter === 'yes'"
|
||||
:indeterminate="enableBlurFilter === ''"
|
||||
@update:model-value="changeEnableBlurFilter">
|
||||
@update:modelValue="changeEnableBlurFilter">
|
||||
{{ t('theming', 'Enable blur background filter (may increase GPU load)') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
</NcSettingsSection>
|
||||
|
|
@ -50,8 +50,8 @@
|
|||
</NcNoteCard>
|
||||
|
||||
<template v-else>
|
||||
<UserSectionPrimaryColor ref="primaryColor" @refresh-styles="refreshGlobalStyles" />
|
||||
<UserSectionBackground @refresh-styles="refreshGlobalStyles" />
|
||||
<UserSectionPrimaryColor ref="primaryColor" @refreshStyles="refreshGlobalStyles" />
|
||||
<UserSectionBackground @refreshStyles="refreshGlobalStyles" />
|
||||
</template>
|
||||
|
||||
<UserSectionHotkeys />
|
||||
|
|
|
|||
|
|
@ -10,36 +10,36 @@
|
|||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Backup (Replica) Host')"
|
||||
:model-value="ldapConfigProxy.ldapBackupHost"
|
||||
:helper-text="t('user_ldap', 'Give an optional backup host. It must be a replica of the main LDAP/AD server.')"
|
||||
:modelValue="ldapConfigProxy.ldapBackupHost"
|
||||
:helperText="t('user_ldap', 'Give an optional backup host. It must be a replica of the main LDAP/AD server.')"
|
||||
@change="(event) => ldapConfigProxy.ldapBackupHost = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
type="number"
|
||||
:model-value="ldapConfigProxy.ldapBackupPort"
|
||||
:modelValue="ldapConfigProxy.ldapBackupPort"
|
||||
:label="t('user_ldap', 'Backup (Replica) Port')"
|
||||
@change="(event) => ldapConfigProxy.ldapBackupPort = event.target.value" />
|
||||
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="ldapConfigProxy.ldapOverrideMainServer === '1'"
|
||||
:modelValue="ldapConfigProxy.ldapOverrideMainServer === '1'"
|
||||
type="switch"
|
||||
:aria-label="t('user_ldap', 'Only connect to the replica server.')"
|
||||
@update:model-value="ldapConfigProxy.ldapOverrideMainServer = $event ? '1' : '0'">
|
||||
@update:modelValue="ldapConfigProxy.ldapOverrideMainServer = $event ? '1' : '0'">
|
||||
{{ t('user_ldap', 'Disable Main Server') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="ldapConfigProxy.turnOffCertCheck === '1'"
|
||||
:modelValue="ldapConfigProxy.turnOffCertCheck === '1'"
|
||||
:aria-label="t('user_ldap', 'Not recommended, use it for testing only! If connection only works with this option, import the LDAP server\'s SSL certificate in your {instanceName} server.', { instanceName })"
|
||||
@update:model-value="ldapConfigProxy.turnOffCertCheck = $event ? '1' : '0'">
|
||||
@update:modelValue="ldapConfigProxy.turnOffCertCheck = $event ? '1' : '0'">
|
||||
{{ t('user_ldap', 'Turn off SSL certificate validation.') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
|
||||
<NcTextField
|
||||
type="number"
|
||||
:label="t('user_ldap', 'Cache Time-To-Live')"
|
||||
:model-value="ldapConfigProxy.ldapCacheTTL"
|
||||
:helper-text="t('user_ldap', 'in seconds. A change empties the cache.')"
|
||||
:modelValue="ldapConfigProxy.ldapCacheTTL"
|
||||
:helperText="t('user_ldap', 'in seconds. A change empties the cache.')"
|
||||
@change="(event) => ldapConfigProxy.ldapCacheTTL = event.target.value" />
|
||||
</details>
|
||||
|
||||
|
|
@ -48,52 +48,52 @@
|
|||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:model-value="ldapConfigProxy.ldapUserDisplayName"
|
||||
:modelValue="ldapConfigProxy.ldapUserDisplayName"
|
||||
:label="t('user_ldap', 'User Display Name Field')"
|
||||
:helper-text="t('user_ldap', 'The LDAP attribute to use to generate the user\'s display name.')"
|
||||
:helperText="t('user_ldap', 'The LDAP attribute to use to generate the user\'s display name.')"
|
||||
@change="(event) => ldapConfigProxy.ldapUserDisplayName = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:model-value="ldapConfigProxy.ldapUserDisplayName2"
|
||||
:modelValue="ldapConfigProxy.ldapUserDisplayName2"
|
||||
:label="t('user_ldap', '2nd User Display Name Field')"
|
||||
:helper-text="t('user_ldap', 'Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«.')"
|
||||
:helperText="t('user_ldap', 'Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«.')"
|
||||
@change="(event) => ldapConfigProxy.ldapUserDisplayName2 = event.target.value" />
|
||||
|
||||
<NcTextArea
|
||||
:model-value="ldapConfigProxy.ldapBaseUsers"
|
||||
:modelValue="ldapConfigProxy.ldapBaseUsers"
|
||||
:placeholder="t('user_ldap', 'One User Base DN per line')"
|
||||
:label="t('user_ldap', 'Base User Tree')"
|
||||
@change="(event) => ldapConfigProxy.ldapBaseUsers = event.target.value" />
|
||||
|
||||
<NcTextArea
|
||||
:model-value="ldapConfigProxy.ldapAttributesForUserSearch"
|
||||
:modelValue="ldapConfigProxy.ldapAttributesForUserSearch"
|
||||
:placeholder="t('user_ldap', 'Optional; one attribute per line')"
|
||||
:label="t('user_ldap', 'User Search Attributes')"
|
||||
@change="(event) => ldapConfigProxy.ldapAttributesForUserSearch = event.target.value" />
|
||||
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="ldapConfigProxy.markRemnantsAsDisabled === '1'"
|
||||
:modelValue="ldapConfigProxy.markRemnantsAsDisabled === '1'"
|
||||
:aria-label="t('user_ldap', 'When switched on, users imported from LDAP which are then missing will be disabled')"
|
||||
@update:model-value="ldapConfigProxy.markRemnantsAsDisabled = $event ? '1' : '0'">
|
||||
@update:modelValue="ldapConfigProxy.markRemnantsAsDisabled = $event ? '1' : '0'">
|
||||
{{ t('user_ldap', 'Disable users missing from LDAP') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:model-value="ldapConfigProxy.ldapGroupDisplayName"
|
||||
:modelValue="ldapConfigProxy.ldapGroupDisplayName"
|
||||
:label="t('user_ldap', 'Group Display Name Field')"
|
||||
:title="t('user_ldap', 'The LDAP attribute to use to generate the groups\'s display name.')"
|
||||
@change="(event) => ldapConfigProxy.ldapGroupDisplayName = event.target.value" />
|
||||
|
||||
<NcTextArea
|
||||
:model-value="ldapConfigProxy.ldapBaseGroups"
|
||||
:modelValue="ldapConfigProxy.ldapBaseGroups"
|
||||
:placeholder="t('user_ldap', 'One Group Base DN per line')"
|
||||
:label="t('user_ldap', 'Base Group Tree')"
|
||||
@change="(event) => ldapConfigProxy.ldapBaseGroups = event.target.value" />
|
||||
|
||||
<NcTextArea
|
||||
:model-value="ldapConfigProxy.ldapAttributesForGroupSearch"
|
||||
:modelValue="ldapConfigProxy.ldapAttributesForGroupSearch"
|
||||
:placeholder="t('user_ldap', 'Optional; one attribute per line')"
|
||||
:label="t('user_ldap', 'Group Search Attributes')"
|
||||
@change="(event) => ldapConfigProxy.ldapAttributesForGroupSearch = event.target.value" />
|
||||
|
|
@ -101,40 +101,40 @@
|
|||
<NcSelect
|
||||
v-model="ldapConfigProxy.ldapGroupMemberAssocAttr"
|
||||
:options="Object.keys(groupMemberAssociation)"
|
||||
:input-label="t('user_ldap', 'Group-Member association')">
|
||||
<template #option="{ label: configId }">
|
||||
{{ groupMemberAssociation[configId] }}
|
||||
:inputLabel="t('user_ldap', 'Group-Member association')">
|
||||
<template #option="{ label }">
|
||||
{{ groupMemberAssociation[label] }}
|
||||
</template>
|
||||
<template #selected-option="{ label: configId }">
|
||||
{{ groupMemberAssociation[configId] }}
|
||||
<template #selected-option="{ label }">
|
||||
{{ groupMemberAssociation[label] }}
|
||||
</template>
|
||||
</NcSelect>
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Dynamic Group Member URL')"
|
||||
:model-value="ldapConfigProxy.ldapDynamicGroupMemberURL"
|
||||
:helper-text="t('user_ldap', 'The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)')"
|
||||
:modelValue="ldapConfigProxy.ldapDynamicGroupMemberURL"
|
||||
:helperText="t('user_ldap', 'The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)')"
|
||||
@change="(event) => ldapConfigProxy.ldapDynamicGroupMemberURL = event.target.value" />
|
||||
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="ldapConfigProxy.ldapNestedGroups === '1'"
|
||||
:modelValue="ldapConfigProxy.ldapNestedGroups === '1'"
|
||||
:aria-label="t('user_ldap', 'When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)')"
|
||||
@update:model-value="ldapConfigProxy.ldapNestedGroups = $event ? '1' : '0'">
|
||||
@update:modelValue="ldapConfigProxy.ldapNestedGroups = $event ? '1' : '0'">
|
||||
{{ t('user_ldap', 'Nested Groups') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
|
||||
<NcTextField
|
||||
type="number"
|
||||
:label="t('user_ldap', 'Paging chunksize')"
|
||||
:model-value="ldapConfigProxy.ldapPagingSize"
|
||||
:helper-text="t('user_ldap', 'Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)')"
|
||||
:modelValue="ldapConfigProxy.ldapPagingSize"
|
||||
:helperText="t('user_ldap', 'Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)')"
|
||||
@change="(event) => ldapConfigProxy.ldapPagingSize = event.target.value" />
|
||||
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="ldapConfigProxy.turnOnPasswordChange === '1'"
|
||||
:modelValue="ldapConfigProxy.turnOnPasswordChange === '1'"
|
||||
:aria-label="t('user_ldap', 'Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server.')"
|
||||
@update:model-value="ldapConfigProxy.turnOnPasswordChange = $event ? '1' : '0'">
|
||||
@update:modelValue="ldapConfigProxy.turnOnPasswordChange = $event ? '1' : '0'">
|
||||
{{ t('user_ldap', 'Enable LDAP password changes per user') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
<span class="tablecell">
|
||||
|
|
@ -144,8 +144,8 @@
|
|||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Default password policy DN')"
|
||||
:model-value="ldapConfigProxy.ldapDefaultPPolicyDN"
|
||||
:helper-text="t('user_ldap', 'The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling.')"
|
||||
:modelValue="ldapConfigProxy.ldapDefaultPPolicyDN"
|
||||
:helperText="t('user_ldap', 'The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling.')"
|
||||
@change="(event) => ldapConfigProxy.ldapDefaultPPolicyDN = event.target.value" />
|
||||
</details>
|
||||
|
||||
|
|
@ -154,37 +154,37 @@
|
|||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:model-value="ldapConfigProxy.ldapQuotaAttribute"
|
||||
:modelValue="ldapConfigProxy.ldapQuotaAttribute"
|
||||
:label="t('user_ldap', 'Quota Field')"
|
||||
:helper-text="t('user_ldap', 'Leave empty for user\'s default quota. Otherwise, specify an LDAP/AD attribute.')"
|
||||
:helperText="t('user_ldap', 'Leave empty for user\'s default quota. Otherwise, specify an LDAP/AD attribute.')"
|
||||
@change="(event) => ldapConfigProxy.ldapQuotaAttribute = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:model-value="ldapConfigProxy.ldapQuotaDefault"
|
||||
:modelValue="ldapConfigProxy.ldapQuotaDefault"
|
||||
:label="t('user_ldap', 'Quota Default')"
|
||||
:helper-text="t('user_ldap', 'Override default quota for LDAP users who do not have a quota set in the Quota Field.')"
|
||||
:helperText="t('user_ldap', 'Override default quota for LDAP users who do not have a quota set in the Quota Field.')"
|
||||
@change="(event) => ldapConfigProxy.ldapQuotaDefault = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:model-value="ldapConfigProxy.ldapEmailAttribute"
|
||||
:modelValue="ldapConfigProxy.ldapEmailAttribute"
|
||||
:label="t('user_ldap', 'Email Field')"
|
||||
:helper-text="t('user_ldap', 'Set the user\'s email from their LDAP attribute. Leave it empty for default behaviour.')"
|
||||
:helperText="t('user_ldap', 'Set the user\'s email from their LDAP attribute. Leave it empty for default behaviour.')"
|
||||
@change="(event) => ldapConfigProxy.ldapEmailAttribute = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'User Home Folder Naming Rule')"
|
||||
:model-value="ldapConfigProxy.homeFolderNamingRule"
|
||||
:helper-text="t('user_ldap', 'Leave empty for username (default). Otherwise, specify an LDAP/AD attribute.')"
|
||||
:modelValue="ldapConfigProxy.homeFolderNamingRule"
|
||||
:helperText="t('user_ldap', 'Leave empty for username (default). Otherwise, specify an LDAP/AD attribute.')"
|
||||
@change="(event) => ldapConfigProxy.homeFolderNamingRule = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', '`$home` Placeholder Field')"
|
||||
:model-value="ldapConfigProxy.ldapExtStorageHomeAttribute"
|
||||
:helper-text="t('user_ldap', '$home in an external storage configuration will be replaced with the value of the specified attribute')"
|
||||
:modelValue="ldapConfigProxy.ldapExtStorageHomeAttribute"
|
||||
:helperText="t('user_ldap', '$home in an external storage configuration will be replaced with the value of the specified attribute')"
|
||||
@change="(event) => ldapConfigProxy.ldapExtStorageHomeAttribute = event.target.value" />
|
||||
</details>
|
||||
|
||||
|
|
@ -194,71 +194,71 @@
|
|||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Phone Field')"
|
||||
:model-value="ldapConfigProxy.ldapAttributePhone"
|
||||
:helper-text="t('user_ldap', 'User profile Phone will be set from the specified attribute')"
|
||||
:modelValue="ldapConfigProxy.ldapAttributePhone"
|
||||
:helperText="t('user_ldap', 'User profile Phone will be set from the specified attribute')"
|
||||
@change="(event) => ldapConfigProxy.ldapAttributePhone = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Website Field')"
|
||||
:model-value="ldapConfigProxy.ldapAttributeWebsite"
|
||||
:helper-text="t('user_ldap', 'User profile Website will be set from the specified attribute')"
|
||||
:modelValue="ldapConfigProxy.ldapAttributeWebsite"
|
||||
:helperText="t('user_ldap', 'User profile Website will be set from the specified attribute')"
|
||||
@change="(event) => ldapConfigProxy.ldapAttributeWebsite = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Address Field')"
|
||||
:model-value="ldapConfigProxy.ldapAttributeAddress"
|
||||
:helper-text="t('user_ldap', 'User profile Address will be set from the specified attribute')"
|
||||
:modelValue="ldapConfigProxy.ldapAttributeAddress"
|
||||
:helperText="t('user_ldap', 'User profile Address will be set from the specified attribute')"
|
||||
@change="(event) => ldapConfigProxy.ldapAttributeAddress = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Twitter Field')"
|
||||
:model-value="ldapConfigProxy.ldapAttributeTwitter"
|
||||
:helper-text="t('user_ldap', 'User profile Twitter will be set from the specified attribute')"
|
||||
:modelValue="ldapConfigProxy.ldapAttributeTwitter"
|
||||
:helperText="t('user_ldap', 'User profile Twitter will be set from the specified attribute')"
|
||||
@change="(event) => ldapConfigProxy.ldapAttributeTwitter = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Fediverse Field')"
|
||||
:model-value="ldapConfigProxy.ldapAttributeFediverse"
|
||||
:helper-text="t('user_ldap', 'User profile Fediverse will be set from the specified attribute')"
|
||||
:modelValue="ldapConfigProxy.ldapAttributeFediverse"
|
||||
:helperText="t('user_ldap', 'User profile Fediverse will be set from the specified attribute')"
|
||||
@change="(event) => ldapConfigProxy.ldapAttributeFediverse = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Organisation Field')"
|
||||
:model-value="ldapConfigProxy.ldapAttributeOrganisation"
|
||||
:helper-text="t('user_ldap', 'User profile Organisation will be set from the specified attribute')"
|
||||
:modelValue="ldapConfigProxy.ldapAttributeOrganisation"
|
||||
:helperText="t('user_ldap', 'User profile Organisation will be set from the specified attribute')"
|
||||
@change="(event) => ldapConfigProxy.ldapAttributeOrganisation = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Role Field')"
|
||||
:model-value="ldapConfigProxy.ldapAttributeRole"
|
||||
:helper-text="t('user_ldap', 'User profile Role will be set from the specified attribute')"
|
||||
:modelValue="ldapConfigProxy.ldapAttributeRole"
|
||||
:helperText="t('user_ldap', 'User profile Role will be set from the specified attribute')"
|
||||
@change="(event) => ldapConfigProxy.ldapAttributeRole = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Headline Field')"
|
||||
:model-value="ldapConfigProxy.ldapAttributeHeadline"
|
||||
:helper-text="t('user_ldap', 'User profile Headline will be set from the specified attribute')"
|
||||
:modelValue="ldapConfigProxy.ldapAttributeHeadline"
|
||||
:helperText="t('user_ldap', 'User profile Headline will be set from the specified attribute')"
|
||||
@change="(event) => ldapConfigProxy.ldapAttributeHeadline = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Biography Field')"
|
||||
:model-value="ldapConfigProxy.ldapAttributeBiography"
|
||||
:helper-text="t('user_ldap', 'User profile Biography will be set from the specified attribute')"
|
||||
:modelValue="ldapConfigProxy.ldapAttributeBiography"
|
||||
:helperText="t('user_ldap', 'User profile Biography will be set from the specified attribute')"
|
||||
@change="(event) => ldapConfigProxy.ldapAttributeBiography = event.target.value" />
|
||||
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Birthdate Field')"
|
||||
:model-value="ldapConfigProxy.ldapAttributeBirthDate"
|
||||
:helper-text="t('user_ldap', 'User profile Date of birth will be set from the specified attribute')"
|
||||
:modelValue="ldapConfigProxy.ldapAttributeBirthDate"
|
||||
:helperText="t('user_ldap', 'User profile Date of birth will be set from the specified attribute')"
|
||||
@change="(event) => ldapConfigProxy.ldapAttributeBirthDate = event.target.value" />
|
||||
</details>
|
||||
</fieldset>
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
aria-describedby="ldap_expert_username_attr"
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'Internal Username Attribute:')"
|
||||
:model-value="ldapConfigProxy.ldapExpertUsernameAttr"
|
||||
:modelValue="ldapConfigProxy.ldapExpertUsernameAttr"
|
||||
@change="(event) => ldapConfigProxy.ldapExpertUsernameAttr = event.target.value" />
|
||||
</div>
|
||||
|
||||
|
|
@ -26,12 +26,12 @@
|
|||
aria-describedby="ldap_expert_uuid_user_attr"
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'UUID Attribute for Users')"
|
||||
:model-value="ldapConfigProxy.ldapExpertUUIDUserAttr"
|
||||
:modelValue="ldapConfigProxy.ldapExpertUUIDUserAttr"
|
||||
@change="(event) => ldapConfigProxy.ldapExpertUUIDUserAttr = event.target.value" />
|
||||
<NcTextField
|
||||
autocomplete="off"
|
||||
:label="t('user_ldap', 'UUID Attribute for Groups')"
|
||||
:model-value="ldapConfigProxy.ldapExpertUUIDGroupAttr"
|
||||
:modelValue="ldapConfigProxy.ldapExpertUUIDGroupAttr"
|
||||
@change="(event) => ldapConfigProxy.ldapExpertUUIDGroupAttr = event.target.value" />
|
||||
</div>
|
||||
</fieldset>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
class="ldap-wizard__groups__group-filter-groups__select"
|
||||
:options="groupObjectClasses"
|
||||
:disabled="ldapConfigProxy.ldapGroupFilterMode === '1'"
|
||||
:input-label="t('user_ldap', 'Only these object classes:')"
|
||||
:inputLabel="t('user_ldap', 'Only these object classes:')"
|
||||
:multiple="true" />
|
||||
|
||||
<NcSelect
|
||||
|
|
@ -22,14 +22,14 @@
|
|||
class="ldap-wizard__groups__group-filter-groups__select"
|
||||
:options="groupGroups"
|
||||
:disabled="ldapConfigProxy.ldapGroupFilterMode === '1'"
|
||||
:input-label="t('user_ldap', 'Only from these groups:')"
|
||||
:inputLabel="t('user_ldap', 'Only from these groups:')"
|
||||
:multiple="true" />
|
||||
</div>
|
||||
|
||||
<div class="ldap-wizard__groups__line ldap-wizard__groups__groups-filter">
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="ldapConfigProxy.ldapGroupFilterMode === '1'"
|
||||
@update:model-value="toggleFilterMode">
|
||||
:modelValue="ldapConfigProxy.ldapGroupFilterMode === '1'"
|
||||
@update:modelValue="toggleFilterMode">
|
||||
{{ t('user_ldap', 'Edit LDAP Query') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
|
||||
|
|
@ -37,7 +37,7 @@
|
|||
<NcTextArea
|
||||
v-model="ldapConfigProxy.ldapGroupFilter"
|
||||
:placeholder="t('user_ldap', 'Edit LDAP Query')"
|
||||
:helper-text="t('user_ldap', 'The filter specifies which LDAP groups shall have access to the {instanceName} instance.', { instanceName })" />
|
||||
:helperText="t('user_ldap', 'The filter specifies which LDAP groups shall have access to the {instanceName} instance.', { instanceName })" />
|
||||
</div>
|
||||
<div v-else>
|
||||
<span>{{ t('user_ldap', 'LDAP Filter:') }}</span>
|
||||
|
|
@ -127,8 +127,9 @@ async function countGroups() {
|
|||
}
|
||||
|
||||
/**
|
||||
* Toggle filter mode
|
||||
*
|
||||
* @param value
|
||||
* @param value - new value
|
||||
*/
|
||||
async function toggleFilterMode(value: boolean) {
|
||||
if (value) {
|
||||
|
|
|
|||
|
|
@ -9,41 +9,41 @@
|
|||
</legend>
|
||||
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="ldapConfigProxy.ldapLoginFilterUsername === '1'"
|
||||
:modelValue="ldapConfigProxy.ldapLoginFilterUsername === '1'"
|
||||
:description="t('user_ldap', 'Allows login against the LDAP/AD username, which is either \'uid\' or \'sAMAccountName\' and will be detected.')"
|
||||
@update:model-value="ldapConfigProxy.ldapLoginFilterUsername = $event ? '1' : '0'">
|
||||
@update:modelValue="ldapConfigProxy.ldapLoginFilterUsername = $event ? '1' : '0'">
|
||||
{{ t('user_ldap', 'LDAP/AD Username:') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="ldapConfigProxy.ldapLoginFilterEmail === '1'"
|
||||
:modelValue="ldapConfigProxy.ldapLoginFilterEmail === '1'"
|
||||
:description="t('user_ldap', 'Allows login against an email attribute. \'mail\' and \'mailPrimaryAddress\' allowed.')"
|
||||
@update:model-value="ldapConfigProxy.ldapLoginFilterEmail = $event ? '1' : '0'">
|
||||
@update:modelValue="ldapConfigProxy.ldapLoginFilterEmail = $event ? '1' : '0'">
|
||||
{{ t('user_ldap', 'LDAP/AD Email Address:') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
|
||||
<div class="ldap-wizard__login__line ldap-wizard__login__login-attributes">
|
||||
<NcSelect
|
||||
v-model="ldapLoginFilterAttributes"
|
||||
keep-open
|
||||
keepOpen
|
||||
:disabled="ldapLoginFilterMode"
|
||||
:options="filteredLoginFilterOptions"
|
||||
:input-label="t('user_ldap', 'Other Attributes:')"
|
||||
:inputLabel="t('user_ldap', 'Other Attributes:')"
|
||||
:multiple="true" />
|
||||
</div>
|
||||
|
||||
<div class="ldap-wizard__login__line ldap-wizard__login__user-login-filter">
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="ldapLoginFilterMode"
|
||||
@update:model-value="toggleFilterMode">
|
||||
:modelValue="ldapLoginFilterMode"
|
||||
@update:modelValue="toggleFilterMode">
|
||||
{{ t('user_ldap', 'Edit LDAP Query') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
|
||||
<NcTextArea
|
||||
v-if="ldapLoginFilterMode"
|
||||
:model-value="ldapConfigProxy.ldapLoginFilter"
|
||||
:modelValue="ldapConfigProxy.ldapLoginFilter"
|
||||
:placeholder="t('user_ldap', 'Edit LDAP Query')"
|
||||
:helper-text="t('user_ldap', 'Defines the filter to apply, when login is attempted. `%%uid` replaces the username in the login action. Example: `uid=%%uid`')"
|
||||
:helperText="t('user_ldap', 'Defines the filter to apply, when login is attempted. `%%uid` replaces the username in the login action. Example: `uid=%%uid`')"
|
||||
@change="(event) => ldapConfigProxy.ldapLoginFilter = event.target.value" />
|
||||
<div v-else>
|
||||
<span>{{ t('user_ldap', 'LDAP Filter:') }}</span>
|
||||
|
|
@ -54,7 +54,7 @@
|
|||
<div class="ldap-wizard__login__line">
|
||||
<NcTextField
|
||||
v-model="testUsername"
|
||||
:helper-text="t('user_ldap', 'Attempts to receive a DN for the given login name and the current login filter')"
|
||||
:helperText="t('user_ldap', 'Attempts to receive a DN for the given login name and the current login filter')"
|
||||
:label="t('user_ldap', 'Test Login name')"
|
||||
autocomplete="off" />
|
||||
|
||||
|
|
@ -73,7 +73,7 @@ import { showError, showSuccess, showWarning } from '@nextcloud/dialogs'
|
|||
import { t } from '@nextcloud/l10n'
|
||||
import { NcButton, NcCheckboxRadioSwitch, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'
|
||||
import { storeToRefs } from 'pinia'
|
||||
import { computed, ref } from 'vue'
|
||||
import { computed, onBeforeMount, ref } from 'vue'
|
||||
import { callWizard, showEnableAutomaticFilterInfo } from '../../services/ldapConfigService.ts'
|
||||
import { useLDAPConfigsStore } from '../../store/configs.ts'
|
||||
|
||||
|
|
@ -99,18 +99,18 @@ const ldapLoginFilterAttributes = computed({
|
|||
const ldapLoginFilterMode = computed(() => ldapConfigProxy.value.ldapLoginFilterMode === '1')
|
||||
const filteredLoginFilterOptions = computed(() => loginFilterOptions.value.filter((option) => !ldapLoginFilterAttributes.value.includes(option)))
|
||||
|
||||
onBeforeMount(init)
|
||||
|
||||
/**
|
||||
*
|
||||
* Initialize login filter options
|
||||
*/
|
||||
async function init() {
|
||||
const response = await callWizard('determineAttributes', props.configId)
|
||||
loginFilterOptions.value = response.options?.ldap_loginfilter_attributes ?? []
|
||||
}
|
||||
|
||||
init()
|
||||
|
||||
/**
|
||||
*
|
||||
* Get user login filter
|
||||
*/
|
||||
async function getUserLoginFilter() {
|
||||
if (ldapConfigProxy.value.ldapLoginFilterMode === '0') {
|
||||
|
|
@ -121,7 +121,7 @@ async function getUserLoginFilter() {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Verify login name
|
||||
*/
|
||||
async function verifyLoginName() {
|
||||
try {
|
||||
|
|
@ -155,8 +155,9 @@ async function verifyLoginName() {
|
|||
}
|
||||
|
||||
/**
|
||||
* Toggle filter mode
|
||||
*
|
||||
* @param value
|
||||
* @param value - new value
|
||||
*/
|
||||
async function toggleFilterMode(value: boolean) {
|
||||
if (value) {
|
||||
|
|
|
|||
|
|
@ -6,10 +6,10 @@
|
|||
<fieldset class="ldap-wizard__server">
|
||||
<div class="ldap-wizard__server__line">
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="ldapConfigProxy.ldapConfigurationActive === '1'"
|
||||
:modelValue="ldapConfigProxy.ldapConfigurationActive === '1'"
|
||||
type="switch"
|
||||
:aria-label="t('user_ldap', 'When unchecked, this configuration will be skipped.')"
|
||||
@update:model-value="ldapConfigProxy.ldapConfigurationActive = $event ? '1' : '0'">
|
||||
@update:modelValue="ldapConfigProxy.ldapConfigurationActive = $event ? '1' : '0'">
|
||||
{{ t('user_ldap', 'Configuration active') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
|
||||
|
|
@ -33,15 +33,15 @@
|
|||
|
||||
<div class="ldap-wizard__server__line">
|
||||
<NcTextField
|
||||
:model-value="ldapConfigProxy.ldapHost"
|
||||
:helper-text="t('user_ldap', 'You can omit the protocol, unless you require SSL. If so, start with ldaps://')"
|
||||
:modelValue="ldapConfigProxy.ldapHost"
|
||||
:helperText="t('user_ldap', 'You can omit the protocol, unless you require SSL. If so, start with ldaps://')"
|
||||
:label="t('user_ldap', 'Host')"
|
||||
placeholder="ldaps://localhost"
|
||||
autocomplete="off"
|
||||
@change="(event) => ldapConfigProxy.ldapHost = event.target.value" />
|
||||
<div class="ldap-wizard__server__host__port">
|
||||
<NcTextField
|
||||
:model-value="ldapConfigProxy.ldapPort"
|
||||
:modelValue="ldapConfigProxy.ldapPort"
|
||||
:label="t('user_ldap', 'Port')"
|
||||
placeholder="389"
|
||||
type="number"
|
||||
|
|
@ -56,7 +56,7 @@
|
|||
<div class="ldap-wizard__server__line">
|
||||
<NcTextField
|
||||
v-model="localLdapAgentName"
|
||||
:helper-text="t('user_ldap', 'The DN of the client user with which the bind shall be done. For anonymous access, leave DN and Password empty.')"
|
||||
:helperText="t('user_ldap', 'The DN of the client user with which the bind shall be done. For anonymous access, leave DN and Password empty.')"
|
||||
:label="t('user_ldap', 'User DN')"
|
||||
placeholder="uid=agent,dc=example,dc=com"
|
||||
autocomplete="off" />
|
||||
|
|
@ -66,7 +66,7 @@
|
|||
<NcTextField
|
||||
v-model="localLdapAgentPassword"
|
||||
type="password"
|
||||
:helper-text="t('user_ldap', 'For anonymous access, leave DN and Password empty.')"
|
||||
:helperText="t('user_ldap', 'For anonymous access, leave DN and Password empty.')"
|
||||
:label="t('user_ldap', 'Password')"
|
||||
autocomplete="off" />
|
||||
|
||||
|
|
@ -78,9 +78,9 @@
|
|||
<div class="ldap-wizard__server__line">
|
||||
<NcTextArea
|
||||
:label="t('user_ldap', 'Base DN')"
|
||||
:model-value="ldapConfigProxy.ldapBase"
|
||||
:modelValue="ldapConfigProxy.ldapBase"
|
||||
:placeholder="t('user_ldap', 'One Base DN per line')"
|
||||
:helper-text="t('user_ldap', 'You can specify Base DN for users and groups in the Advanced tab')"
|
||||
:helperText="t('user_ldap', 'You can specify Base DN for users and groups in the Advanced tab')"
|
||||
@change="(event) => ldapConfigProxy.ldapBase = event.target.value" />
|
||||
|
||||
<NcButton :disabled="loadingGuessBaseDN || needsToSaveCredentials" @click="guessBaseDN">
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
:disabled="ldapConfigProxy.ldapUserFilterMode === '1'"
|
||||
class="ldap-wizard__users__user-filter-object-class__select"
|
||||
:options="userObjectClasses"
|
||||
:input-label="t('user_ldap', 'Only these object classes:')"
|
||||
:inputLabel="t('user_ldap', 'Only these object classes:')"
|
||||
:multiple="true" />
|
||||
{{ t('user_ldap', 'The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin.') }}
|
||||
</div>
|
||||
|
|
@ -23,14 +23,14 @@
|
|||
class="ldap-wizard__users__user-filter-groups__select"
|
||||
:disabled="ldapConfigProxy.ldapUserFilterMode === '1'"
|
||||
:options="userGroups"
|
||||
:input-label="t('user_ldap', 'Only from these groups:')"
|
||||
:inputLabel="t('user_ldap', 'Only from these groups:')"
|
||||
:multiple="true" />
|
||||
</div>
|
||||
|
||||
<div class="ldap-wizard__users__line ldap-wizard__users__user-filter">
|
||||
<NcCheckboxRadioSwitch
|
||||
:model-value="ldapConfigProxy.ldapUserFilterMode === '1'"
|
||||
@update:model-value="toggleFilterMode">
|
||||
:modelValue="ldapConfigProxy.ldapUserFilterMode === '1'"
|
||||
@update:modelValue="toggleFilterMode">
|
||||
{{ t('user_ldap', 'Edit LDAP Query') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
<NcTextArea
|
||||
v-model="ldapConfigProxy.ldapUserFilter"
|
||||
:placeholder="t('user_ldap', 'Edit LDAP Query')"
|
||||
:helper-text="t('user_ldap', 'The filter specifies which LDAP users shall have access to the {instanceName} instance.', { instanceName })" />
|
||||
:helperText="t('user_ldap', 'The filter specifies which LDAP users shall have access to the {instanceName} instance.', { instanceName })" />
|
||||
</div>
|
||||
<div v-else>
|
||||
<label>{{ t('user_ldap', 'LDAP Filter:') }}</label>
|
||||
|
|
@ -62,7 +62,7 @@ import { getCapabilities } from '@nextcloud/capabilities'
|
|||
import { t } from '@nextcloud/l10n'
|
||||
import { NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcSelect, NcTextArea } from '@nextcloud/vue'
|
||||
import { storeToRefs } from 'pinia'
|
||||
import { computed, ref } from 'vue'
|
||||
import { computed, onBeforeMount, ref } from 'vue'
|
||||
import { callWizard, showEnableAutomaticFilterInfo } from '../../services/ldapConfigService.ts'
|
||||
import { useLDAPConfigsStore } from '../../store/configs.ts'
|
||||
|
||||
|
|
@ -92,8 +92,10 @@ const ldapUserFilterGroups = computed({
|
|||
set(value) { ldapConfigProxy.value.ldapUserFilterGroups = value.join(';') },
|
||||
})
|
||||
|
||||
onBeforeMount(init)
|
||||
|
||||
/**
|
||||
*
|
||||
* Initialize user filter options
|
||||
*/
|
||||
async function init() {
|
||||
const response1 = await callWizard('determineUserObjectClasses', props.configId)
|
||||
|
|
@ -107,10 +109,8 @@ async function init() {
|
|||
ldapConfigs.value[props.configId]!.ldapUserFilterGroups = (response2.changes?.ldap_userfilter_groups as string[] | undefined)?.join(';') ?? ''
|
||||
}
|
||||
|
||||
init()
|
||||
|
||||
/**
|
||||
*
|
||||
* Reload filters
|
||||
*/
|
||||
async function reloadFilters() {
|
||||
if (ldapConfigProxy.value.ldapUserFilterMode === '0') {
|
||||
|
|
@ -125,7 +125,7 @@ async function reloadFilters() {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Count users
|
||||
*/
|
||||
async function countUsers() {
|
||||
try {
|
||||
|
|
@ -138,8 +138,9 @@ async function countUsers() {
|
|||
}
|
||||
|
||||
/**
|
||||
* Toggle filter mode
|
||||
*
|
||||
* @param value
|
||||
* @param value - new value
|
||||
*/
|
||||
async function toggleFilterMode(value: boolean) {
|
||||
if (value) {
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ export type WizardAction
|
|||
| 'testLoginName'
|
||||
|
||||
/**
|
||||
*
|
||||
* Create a new LDAP configuration
|
||||
*/
|
||||
export async function createConfig() {
|
||||
const response = await axios.post(generateOcsUrl('apps/user_ldap/api/v1/config')) as AxiosResponse<OCSResponse<{ configID: string }>>
|
||||
|
|
@ -43,8 +43,9 @@ export async function createConfig() {
|
|||
}
|
||||
|
||||
/**
|
||||
* Copy an existing LDAP configuration
|
||||
*
|
||||
* @param configId
|
||||
* @param configId - ID of the configuration to copy
|
||||
*/
|
||||
export async function copyConfig(configId: string) {
|
||||
const params = new FormData()
|
||||
|
|
@ -60,8 +61,9 @@ export async function copyConfig(configId: string) {
|
|||
}
|
||||
|
||||
/**
|
||||
* Get an LDAP configuration
|
||||
*
|
||||
* @param configId
|
||||
* @param configId - ID of the configuration to fetch
|
||||
*/
|
||||
export async function getConfig(configId: string): Promise<LDAPConfig> {
|
||||
const response = await axios.get(generateOcsUrl('apps/user_ldap/api/v1/config/{configId}', { configId })) as AxiosResponse<OCSResponse<LDAPConfig>>
|
||||
|
|
@ -70,9 +72,10 @@ export async function getConfig(configId: string): Promise<LDAPConfig> {
|
|||
}
|
||||
|
||||
/**
|
||||
* Update an LDAP configuration
|
||||
*
|
||||
* @param configId
|
||||
* @param config
|
||||
* @param configId - ID of the configuration to update
|
||||
* @param config - Partial configuration data to update
|
||||
*/
|
||||
export async function updateConfig(configId: string, config: Partial<LDAPConfig>): Promise<LDAPConfig> {
|
||||
const response = await axios.put(
|
||||
|
|
@ -86,8 +89,9 @@ export async function updateConfig(configId: string, config: Partial<LDAPConfig>
|
|||
}
|
||||
|
||||
/**
|
||||
* Delete an LDAP configuration
|
||||
*
|
||||
* @param configId
|
||||
* @param configId - ID of the configuration to delete
|
||||
*/
|
||||
export async function deleteConfig(configId: string): Promise<boolean> {
|
||||
try {
|
||||
|
|
@ -110,8 +114,9 @@ export async function deleteConfig(configId: string): Promise<boolean> {
|
|||
}
|
||||
|
||||
/**
|
||||
* Test an LDAP configuration
|
||||
*
|
||||
* @param configId
|
||||
* @param configId - ID of the configuration to test
|
||||
*/
|
||||
export async function testConfiguration(configId: string) {
|
||||
const params = new FormData()
|
||||
|
|
@ -124,8 +129,9 @@ export async function testConfiguration(configId: string) {
|
|||
}
|
||||
|
||||
/**
|
||||
* Clear LDAP mapping
|
||||
*
|
||||
* @param subject
|
||||
* @param subject - 'user' or 'group'
|
||||
*/
|
||||
export async function clearMapping(subject: 'user' | 'group') {
|
||||
const isConfirmed = await confirmOperation(
|
||||
|
|
@ -152,10 +158,11 @@ export async function clearMapping(subject: 'user' | 'group') {
|
|||
}
|
||||
|
||||
/**
|
||||
* Call wizard action
|
||||
*
|
||||
* @param action
|
||||
* @param configId
|
||||
* @param extraParams
|
||||
* @param action - The wizard action to call
|
||||
* @param configId - ID of the configuration
|
||||
* @param extraParams - Additional parameters for the wizard action
|
||||
*/
|
||||
export async function callWizard(action: WizardAction, configId: string, extraParams: Record<string, string> = {}) {
|
||||
const params = new FormData()
|
||||
|
|
@ -189,7 +196,7 @@ export async function callWizard(action: WizardAction, configId: string, extraPa
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Show info dialog when enabling automatic filter mode
|
||||
*/
|
||||
export async function showEnableAutomaticFilterInfo() {
|
||||
return await confirmOperation(
|
||||
|
|
@ -199,9 +206,10 @@ export async function showEnableAutomaticFilterInfo() {
|
|||
}
|
||||
|
||||
/**
|
||||
* Show confirmation dialog for dangerous operations
|
||||
*
|
||||
* @param name
|
||||
* @param text
|
||||
* @param name - Dialog title
|
||||
* @param text - Dialog text
|
||||
*/
|
||||
export async function confirmOperation(name: string, text: string): Promise<boolean> {
|
||||
let result = false
|
||||
|
|
|
|||
|
|
@ -17,9 +17,10 @@ export const useLDAPConfigsStore = defineStore('ldap-configs', () => {
|
|||
const updatingConfig = ref(0)
|
||||
|
||||
/**
|
||||
* Get a proxy for the LDAP configuration that automatically updates the backend on property set
|
||||
*
|
||||
* @param configId
|
||||
* @param postSetHooks
|
||||
* @param configId - ID of the configuration
|
||||
* @param postSetHooks - Optional hooks to call after a property has been set
|
||||
*/
|
||||
function getConfigProxy<J>(configId: string, postSetHooks: Partial<Record<keyof LDAPConfig, (value: J) => void>> = {}) {
|
||||
if (ldapConfigs.value[configId] === undefined) {
|
||||
|
|
@ -49,7 +50,7 @@ export const useLDAPConfigsStore = defineStore('ldap-configs', () => {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Create a new LDAP configuration
|
||||
*/
|
||||
async function create() {
|
||||
const configId = await createConfig()
|
||||
|
|
@ -59,8 +60,9 @@ export const useLDAPConfigsStore = defineStore('ldap-configs', () => {
|
|||
}
|
||||
|
||||
/**
|
||||
* Copy an existing LDAP configuration
|
||||
*
|
||||
* @param fromConfigId
|
||||
* @param fromConfigId - ID of the configuration to copy
|
||||
*/
|
||||
async function _copyConfig(fromConfigId: string) {
|
||||
if (ldapConfigs.value[fromConfigId] === undefined) {
|
||||
|
|
@ -75,8 +77,9 @@ export const useLDAPConfigsStore = defineStore('ldap-configs', () => {
|
|||
}
|
||||
|
||||
/**
|
||||
* Delete an LDAP configuration
|
||||
*
|
||||
* @param configId
|
||||
* @param configId - ID of the configuration to delete
|
||||
*/
|
||||
async function removeConfig(configId: string) {
|
||||
const result = await deleteConfig(configId)
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
v-if="selectedConfigId !== undefined"
|
||||
v-model="selectedConfigId"
|
||||
:options="Object.keys(ldapConfigs)"
|
||||
:input-label="t('user_ldap', 'Select LDAP Config')">
|
||||
:inputLabel="t('user_ldap', 'Select LDAP Config')">
|
||||
<template #option="{ label: configId }">
|
||||
{{ `${configId}: ${ldapConfigs[configId]?.ldapHost ?? ''}` }}
|
||||
</template>
|
||||
|
|
@ -43,24 +43,24 @@
|
|||
v-for="(tabLabel, tabId) in tabs"
|
||||
:key="tabId"
|
||||
v-model="selectedTab"
|
||||
:button-variant="true"
|
||||
:buttonVariant="true"
|
||||
:value="tabId"
|
||||
type="radio"
|
||||
:disabled="tabId !== 'server' && !selectedConfigHasServerInfo"
|
||||
button-variant-grouped="horizontal">
|
||||
buttonVariantGrouped="horizontal">
|
||||
{{ tabLabel }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ServerTab v-if="selectedTab === 'server'" :config-id="selectedConfigId" />
|
||||
<UsersTab v-else-if="selectedTab === 'users'" :config-id="selectedConfigId" />
|
||||
<LoginTab v-else-if="selectedTab === 'login'" :config-id="selectedConfigId" />
|
||||
<GroupsTab v-else-if="selectedTab === 'groups'" :config-id="selectedConfigId" />
|
||||
<ExpertTab v-else-if="selectedTab === 'expert'" :config-id="selectedConfigId" />
|
||||
<AdvancedTab v-else-if="selectedTab === 'advanced'" :config-id="selectedConfigId" />
|
||||
<ServerTab v-if="selectedTab === 'server'" :configId="selectedConfigId" />
|
||||
<UsersTab v-else-if="selectedTab === 'users'" :configId="selectedConfigId" />
|
||||
<LoginTab v-else-if="selectedTab === 'login'" :configId="selectedConfigId" />
|
||||
<GroupsTab v-else-if="selectedTab === 'groups'" :configId="selectedConfigId" />
|
||||
<ExpertTab v-else-if="selectedTab === 'expert'" :configId="selectedConfigId" />
|
||||
<AdvancedTab v-else-if="selectedTab === 'advanced'" :configId="selectedConfigId" />
|
||||
|
||||
<WizardControls class="ldap-wizard__controls" :config-id="selectedConfigId" />
|
||||
<WizardControls class="ldap-wizard__controls" :configId="selectedConfigId" />
|
||||
</div>
|
||||
|
||||
<div class="ldap-wizard__clear-mapping">
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ function onSubmit() {
|
|||
autocomplete="off"
|
||||
autocapitalize="off"
|
||||
:error="hasInvalidPassword"
|
||||
:helper-text="hasInvalidPassword ? t('user_ldap', 'Wrong password.') : ''"
|
||||
:helperText="hasInvalidPassword ? t('user_ldap', 'Wrong password.') : ''"
|
||||
:label="t('user_ldap', 'Current password')"
|
||||
required
|
||||
spellcheck="false"
|
||||
|
|
|
|||
|
|
@ -9,13 +9,13 @@
|
|||
{{ t('user_status', 'Clear status after') }}
|
||||
</label>
|
||||
<NcSelect
|
||||
input-id="clearStatus"
|
||||
inputId="clearStatus"
|
||||
class="clear-at-select__select"
|
||||
:options="options"
|
||||
:model-value="option"
|
||||
:modelValue="option"
|
||||
:clearable="false"
|
||||
placement="top"
|
||||
label-outside
|
||||
labelOutside
|
||||
@option:selected="select" />
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -19,10 +19,10 @@
|
|||
maxlength="80"
|
||||
:disabled="disabled"
|
||||
:placeholder="t('user_status', 'What is your status?')"
|
||||
:model-value="message"
|
||||
:modelValue="message"
|
||||
type="text"
|
||||
:label="t('user_status', 'What is your status?')"
|
||||
@update:model-value="onChange" />
|
||||
@update:modelValue="onChange" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -11,10 +11,10 @@
|
|||
<PredefinedStatus
|
||||
v-for="status in predefinedStatuses"
|
||||
:key="status.id"
|
||||
:message-id="status.id"
|
||||
:messageId="status.id"
|
||||
:icon="status.icon"
|
||||
:message="status.message"
|
||||
:clear-at="status.clearAt"
|
||||
:clearAt="status.clearAt"
|
||||
:selected="lastSelected === status.id"
|
||||
@select="selectStatus(status)" />
|
||||
</ul>
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@
|
|||
<template>
|
||||
<NcModal
|
||||
size="normal"
|
||||
label-id="user_status-set-dialog"
|
||||
labelId="user_status-set-dialog"
|
||||
dark
|
||||
:set-return-focus="setReturnFocus"
|
||||
:setReturnFocus="setReturnFocus"
|
||||
@close="closeModal">
|
||||
<div class="set-status-modal">
|
||||
<!-- Status selector -->
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
:icon="icon"
|
||||
:message="editedMessage"
|
||||
@change="setMessage"
|
||||
@select-icon="setIcon" />
|
||||
@selectIcon="setIcon" />
|
||||
<NcButton
|
||||
v-if="messageId === 'vacationing'"
|
||||
:href="absencePageUrl"
|
||||
|
|
@ -58,10 +58,10 @@
|
|||
:icon="backupIcon"
|
||||
:message="backupMessage"
|
||||
@select="revertBackupFromServer" />
|
||||
<PredefinedStatusesList @select-status="selectPredefinedMessage" />
|
||||
<PredefinedStatusesList @selectStatus="selectPredefinedMessage" />
|
||||
<ClearAtSelect
|
||||
:clear-at="clearAt"
|
||||
@select-clear-at="setClearAt" />
|
||||
:clearAt="clearAt"
|
||||
@selectClearAt="setClearAt" />
|
||||
<div class="status-buttons">
|
||||
<NcButton
|
||||
:wide="true"
|
||||
|
|
|
|||
|
|
@ -684,8 +684,7 @@ const Dialogs = {
|
|||
}
|
||||
$(dialogId).ocdialog('close')
|
||||
},
|
||||
},
|
||||
{
|
||||
}, {
|
||||
text: t('core', 'Continue'),
|
||||
classes: 'continue',
|
||||
click: function() {
|
||||
|
|
|
|||
|
|
@ -97,6 +97,7 @@ export default {
|
|||
return
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @stylistic/exp-list-style
|
||||
const animation = el.animate?.(
|
||||
[
|
||||
{ opacity: 1 },
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@
|
|||
|
||||
import {
|
||||
showError,
|
||||
showInfo, showMessage,
|
||||
showInfo,
|
||||
showMessage,
|
||||
showSuccess,
|
||||
showWarning,
|
||||
} from '@nextcloud/dialogs'
|
||||
|
|
|
|||
|
|
@ -48,7 +48,8 @@ import { spawnDialog } from '@nextcloud/vue/functions/dialog'
|
|||
import {
|
||||
type Ref,
|
||||
|
||||
computed, ref,
|
||||
computed,
|
||||
ref,
|
||||
} from 'vue'
|
||||
import NcButton from '@nextcloud/vue/components/NcButton'
|
||||
import NcHeaderMenu from '@nextcloud/vue/components/NcHeaderMenu'
|
||||
|
|
|
|||
|
|
@ -93,7 +93,8 @@ export default {
|
|||
const version = list[id]
|
||||
const name = agents[id]?.browser
|
||||
return this.t('core', '{name} version {version} and above', {
|
||||
name, version,
|
||||
name,
|
||||
version,
|
||||
})
|
||||
}).filter((entry) => entry !== null)
|
||||
},
|
||||
|
|
|
|||
2
dist/1142-1142.js
vendored
Normal file
2
dist/1142-1142.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/1142-1142.js.map
vendored
Normal file
1
dist/1142-1142.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/1142-1142.js.map.license
vendored
Symbolic link
1
dist/1142-1142.js.map.license
vendored
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
1142-1142.js.license
|
||||
2
dist/6692-6692.js
vendored
Normal file
2
dist/6692-6692.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/6692-6692.js.map
vendored
Normal file
1
dist/6692-6692.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/6692-6692.js.map.license
vendored
Symbolic link
1
dist/6692-6692.js.map.license
vendored
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
6692-6692.js.license
|
||||
2
dist/6784-6784.js
vendored
2
dist/6784-6784.js
vendored
File diff suppressed because one or more lines are too long
1
dist/6784-6784.js.map
vendored
1
dist/6784-6784.js.map
vendored
File diff suppressed because one or more lines are too long
1
dist/6784-6784.js.map.license
vendored
1
dist/6784-6784.js.map.license
vendored
|
|
@ -1 +0,0 @@
|
|||
6784-6784.js.license
|
||||
2
dist/8309-8309.js
vendored
2
dist/8309-8309.js
vendored
File diff suppressed because one or more lines are too long
1
dist/8309-8309.js.map
vendored
1
dist/8309-8309.js.map
vendored
File diff suppressed because one or more lines are too long
1
dist/8309-8309.js.map.license
vendored
1
dist/8309-8309.js.map.license
vendored
|
|
@ -1 +0,0 @@
|
|||
8309-8309.js.license
|
||||
2
dist/AuthMechanismRsa-C8S2vI1A.chunk.mjs
vendored
2
dist/AuthMechanismRsa-C8S2vI1A.chunk.mjs
vendored
|
|
@ -1,2 +0,0 @@
|
|||
import{b as g,p as y,q as v,c as p,u as o,o as n,N as h,w as _,g as V,t as k,s as x,r as M,j as d,e as f,F as q,C as w,E as U,G as j}from"./runtime-dom.esm-bundler-OnXpa8v9.chunk.mjs";import{c as C}from"./index-BT4wQaDP.chunk.mjs";import{a as E}from"./index-JpgrUA2Z-nZKKuBvr.chunk.mjs";import{t as s}from"./translation-DoG5ZELJ-gw0g4US-.chunk.mjs";import{g as N}from"./createElementId-DhjFt1I9--Zqj3wLs.chunk.mjs";import{c as S}from"./NcNoteCard-CVhtNL04-CJazPt2C.chunk.mjs";import{N as A}from"./NcSelect-Czzsi3P_-C6N5izGc.chunk.mjs";import{N as K}from"./NcCheckboxRadioSwitch-BCSKF7Tk-DUHTT_Np.chunk.mjs";import{N as z}from"./NcPasswordField-djttkA5Q-Dyr2DfKl.chunk.mjs";import{_ as B}from"./TrashCanOutline-DxP9to3z.chunk.mjs";import{C as c,a as b}from"./types-BrEQjG8Y.chunk.mjs";import{l as G}from"./logger-CrDakPzW.chunk.mjs";const P=g({__name:"ConfigurationEntry",props:y({configKey:{},configOption:{}},{modelValue:{type:[String,Boolean],default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const a=v(e,"modelValue");return(t,i)=>e.configOption.type!==o(c).Boolean?(n(),p(h(e.configOption.type===o(c).Password?o(z):o(B)),{key:0,modelValue:a.value,"onUpdate:modelValue":i[0]||(i[0]=l=>a.value=l),name:e.configKey,required:!(e.configOption.flags&o(b).Optional),label:e.configOption.value,title:e.configOption.tooltip},null,8,["modelValue","name","required","label","title"])):(n(),p(o(K),{key:1,modelValue:a.value,"onUpdate:modelValue":i[1]||(i[1]=l=>a.value=l),type:"switch",title:e.configOption.tooltip},{default:_(()=>[V(k(e.configOption.value),1)]),_:1},8,["modelValue","title"]))}}),R=g({__name:"AuthMechanismRsa",props:y({authMechanism:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const a=v(e,"modelValue"),t=M();x(t,()=>{t.value&&(a.value.private_key="",a.value.public_key="")});async function i(){try{const{data:l}=await C.post(N("/apps/files_external/ajax/public_key.php"),{keyLength:t.value});a.value.private_key=l.data.private_key,a.value.public_key=l.data.public_key}catch(l){G.error("Error generating RSA key pair",{error:l}),E(s("files_external","Error generating key pair"))}}return(l,m)=>(n(),d("div",null,[(n(!0),d(q,null,w(e.authMechanism.configuration,(r,u)=>U((n(),p(P,{key:r.value,modelValue:a.value[u],"onUpdate:modelValue":O=>a.value[u]=O,"config-key":u,"config-option":r},null,8,["modelValue","onUpdate:modelValue","config-key","config-option"])),[[j,!(r.flags&o(b).Hidden)]])),128)),f(o(A),{modelValue:t.value,"onUpdate:modelValue":m[0]||(m[0]=r=>t.value=r),clearable:!1,"input-label":o(s)("files_external","Key size"),options:[1024,2048,4096],required:""},null,8,["modelValue","input-label"]),f(o(S),{disabled:!t.value,wide:"",onClick:i},{default:_(()=>[V(k(o(s)("files_external","Generate keys")),1)]),_:1},8,["disabled"])]))}}),$=Object.freeze(Object.defineProperty({__proto__:null,default:R},Symbol.toStringTag,{value:"Module"}));export{$ as A,P as _};
|
||||
//# sourceMappingURL=AuthMechanismRsa-C8S2vI1A.chunk.mjs.map
|
||||
2
dist/AuthMechanismRsa-je5836Yr.chunk.mjs
vendored
Normal file
2
dist/AuthMechanismRsa-je5836Yr.chunk.mjs
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
import{b as g,p as y,q as v,c as p,u as o,o as n,N as h,w as _,g as V,t as b,s as x,r as M,j as d,e as f,F as q,C as w,E as K,G as U}from"./runtime-dom.esm-bundler-OnXpa8v9.chunk.mjs";import{c as j}from"./index-BT4wQaDP.chunk.mjs";import{a as C}from"./index-JpgrUA2Z-nZKKuBvr.chunk.mjs";import{t as s}from"./translation-DoG5ZELJ-gw0g4US-.chunk.mjs";import{g as E}from"./createElementId-DhjFt1I9--Zqj3wLs.chunk.mjs";import{c as N}from"./NcNoteCard-CVhtNL04-CJazPt2C.chunk.mjs";import{N as S}from"./NcSelect-Czzsi3P_-C6N5izGc.chunk.mjs";import{N as A}from"./NcCheckboxRadioSwitch-BCSKF7Tk-DUHTT_Np.chunk.mjs";import{N as L}from"./NcPasswordField-djttkA5Q-Dyr2DfKl.chunk.mjs";import{_ as z}from"./TrashCanOutline-DxP9to3z.chunk.mjs";import{C as c,a as k}from"./types-BrEQjG8Y.chunk.mjs";import{l as B}from"./logger-CrDakPzW.chunk.mjs";const P=g({__name:"ConfigurationEntry",props:y({configKey:{},configOption:{}},{modelValue:{type:[String,Boolean],default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const a=v(e,"modelValue");return(t,i)=>e.configOption.type!==o(c).Boolean?(n(),p(h(e.configOption.type===o(c).Password?o(L):o(z)),{key:0,modelValue:a.value,"onUpdate:modelValue":i[0]||(i[0]=l=>a.value=l),name:e.configKey,required:!(e.configOption.flags&o(k).Optional),label:e.configOption.value,title:e.configOption.tooltip},null,8,["modelValue","name","required","label","title"])):(n(),p(o(A),{key:1,modelValue:a.value,"onUpdate:modelValue":i[1]||(i[1]=l=>a.value=l),type:"switch",title:e.configOption.tooltip},{default:_(()=>[V(b(e.configOption.value),1)]),_:1},8,["modelValue","title"]))}}),R=g({__name:"AuthMechanismRsa",props:y({authMechanism:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const a=v(e,"modelValue"),t=M();x(t,()=>{t.value&&(a.value.private_key="",a.value.public_key="")});async function i(){try{const{data:l}=await j.post(E("/apps/files_external/ajax/public_key.php"),{keyLength:t.value});a.value.private_key=l.data.private_key,a.value.public_key=l.data.public_key}catch(l){B.error("Error generating RSA key pair",{error:l}),C(s("files_external","Error generating key pair"))}}return(l,m)=>(n(),d("div",null,[(n(!0),d(q,null,w(e.authMechanism.configuration,(r,u)=>K((n(),p(P,{key:r.value,modelValue:a.value[u],"onUpdate:modelValue":O=>a.value[u]=O,configKey:u,configOption:r},null,8,["modelValue","onUpdate:modelValue","configKey","configOption"])),[[U,!(r.flags&o(k).Hidden)]])),128)),f(o(S),{modelValue:t.value,"onUpdate:modelValue":m[0]||(m[0]=r=>t.value=r),clearable:!1,inputLabel:o(s)("files_external","Key size"),options:[1024,2048,4096],required:""},null,8,["modelValue","inputLabel"]),f(o(N),{disabled:!t.value,wide:"",onClick:i},{default:_(()=>[V(b(o(s)("files_external","Generate keys")),1)]),_:1},8,["disabled"])]))}}),$=Object.freeze(Object.defineProperty({__proto__:null,default:R},Symbol.toStringTag,{value:"Module"}));export{$ as A,P as _};
|
||||
//# sourceMappingURL=AuthMechanismRsa-je5836Yr.chunk.mjs.map
|
||||
File diff suppressed because one or more lines are too long
2
dist/CredentialsDialog-DkvNr3nu.chunk.mjs
vendored
2
dist/CredentialsDialog-DkvNr3nu.chunk.mjs
vendored
|
|
@ -1,2 +0,0 @@
|
|||
import{t}from"./translation-DoG5ZELJ-gw0g4US-.chunk.mjs";import{N as m}from"./index-JpgrUA2Z-nZKKuBvr.chunk.mjs";import{N as d}from"./NcNoteCard-CVhtNL04-CJazPt2C.chunk.mjs";import{N as p}from"./NcPasswordField-djttkA5Q-Dyr2DfKl.chunk.mjs";import{_ as c}from"./TrashCanOutline-DxP9to3z.chunk.mjs";import{b as g,c as f,o as h,w as x,e as s,u as e,r as n}from"./runtime-dom.esm-bundler-OnXpa8v9.chunk.mjs";import"./index-6_gsQFyp.chunk.mjs";import"./index-xFugdZPW.chunk.mjs";import"./createElementId-DhjFt1I9--Zqj3wLs.chunk.mjs";import"./mdi-jSyRgDgA.chunk.mjs";import"./index-BT4wQaDP.chunk.mjs";import"./string_decoder-BO00msnV.chunk.mjs";import"./NcInputField-Bwsh2aHY-Bu0D97at.chunk.mjs";const D=g({__name:"CredentialsDialog",emits:["close"],setup(_){const o=n(""),r=n(""),u=[{label:t("files_external","Confirm"),type:"submit",variant:"primary"}];return(i,a)=>(h(),f(e(m),{buttons:u,class:"external-storage-auth","close-on-click-outside":"","data-cy-external-storage-auth":"","is-form":"",name:e(t)("files_external","Storage credentials"),"out-transition":"",onSubmit:a[2]||(a[2]=l=>i.$emit("close",{login:o.value,password:r.value})),"onUpdate:open":a[3]||(a[3]=l=>i.$emit("close"))},{default:x(()=>[s(e(d),{class:"external-storage-auth__header",text:e(t)("files_external","To access the storage, you need to provide the authentication credentials."),type:"info"},null,8,["text"]),s(e(c),{modelValue:o.value,"onUpdate:modelValue":a[0]||(a[0]=l=>o.value=l),autofocus:"",class:"external-storage-auth__login","data-cy-external-storage-auth-dialog-login":"",label:e(t)("files_external","Login"),placeholder:e(t)("files_external","Enter the storage login"),minlength:"2",name:"login",required:""},null,8,["modelValue","label","placeholder"]),s(e(p),{modelValue:r.value,"onUpdate:modelValue":a[1]||(a[1]=l=>r.value=l),class:"external-storage-auth__password","data-cy-external-storage-auth-dialog-password":"",label:e(t)("files_external","Password"),placeholder:e(t)("files_external","Enter the storage password"),name:"password",required:""},null,8,["modelValue","label","placeholder"])]),_:1},8,["name"]))}});export{D as default};
|
||||
//# sourceMappingURL=CredentialsDialog-DkvNr3nu.chunk.mjs.map
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"version":3,"file":"CredentialsDialog-DkvNr3nu.chunk.mjs","sources":["../build/frontend/apps/files_external/src/views/CredentialsDialog.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport { t } from '@nextcloud/l10n'\nimport { ref } from 'vue'\nimport NcDialog from '@nextcloud/vue/components/NcDialog'\nimport NcNoteCard from '@nextcloud/vue/components/NcNoteCard'\nimport NcPasswordField from '@nextcloud/vue/components/NcPasswordField'\nimport NcTextField from '@nextcloud/vue/components/NcTextField'\n\ndefineEmits<{\n\tclose: [payload?: { login: string, password: string }]\n}>()\n\nconst login = ref('')\nconst password = ref('')\n\nconst dialogButtons: InstanceType<typeof NcDialog>['buttons'] = [{\n\tlabel: t('files_external', 'Confirm'),\n\ttype: 'submit',\n\tvariant: 'primary',\n}]\n</script>\n\n<template>\n\t<NcDialog\n\t\t:buttons=\"dialogButtons\"\n\t\tclass=\"external-storage-auth\"\n\t\tclose-on-click-outside\n\t\tdata-cy-external-storage-auth\n\t\tis-form\n\t\t:name=\"t('files_external', 'Storage credentials')\"\n\t\tout-transition\n\t\t@submit=\"$emit('close', { login, password })\"\n\t\t@update:open=\"$emit('close')\">\n\t\t<!-- Header -->\n\t\t<NcNoteCard\n\t\t\tclass=\"external-storage-auth__header\"\n\t\t\t:text=\"t('files_external', 'To access the storage, you need to provide the authentication credentials.')\"\n\t\t\ttype=\"info\" />\n\n\t\t<!-- Login -->\n\t\t<NcTextField\n\t\t\tv-model=\"login\"\n\t\t\tautofocus\n\t\t\tclass=\"external-storage-auth__login\"\n\t\t\tdata-cy-external-storage-auth-dialog-login\n\t\t\t:label=\"t('files_external', 'Login')\"\n\t\t\t:placeholder=\"t('files_external', 'Enter the storage login')\"\n\t\t\tminlength=\"2\"\n\t\t\tname=\"login\"\n\t\t\trequired />\n\n\t\t<!-- Password -->\n\t\t<NcPasswordField\n\t\t\tv-model=\"password\"\n\t\t\tclass=\"external-storage-auth__password\"\n\t\t\tdata-cy-external-storage-auth-dialog-password\n\t\t\t:label=\"t('files_external', 'Password')\"\n\t\t\t:placeholder=\"t('files_external', 'Enter the storage password')\"\n\t\t\tname=\"password\"\n\t\t\trequired />\n\t</NcDialog>\n</template>\n"],"names":["login","ref","password","dialogButtons","t","_createBlock","_unref","NcDialog","_cache","$event","$emit","_createVNode","NcNoteCard","NcTextField","NcPasswordField"],"mappings":"kvBAiBA,MAAMA,EAAQC,EAAI,EAAE,EACdC,EAAWD,EAAI,EAAE,EAEjBE,EAA0D,CAAC,CAChE,MAAOC,EAAE,iBAAkB,SAAS,EACpC,KAAM,SACN,QAAS,SAAA,CACT,oBAIAC,EAqCWC,EAAAC,CAAA,EAAA,CApCT,QAASJ,EACV,MAAM,wBACN,yBAAA,GACA,gCAAA,GACA,UAAA,GACC,KAAMG,EAAAF,CAAA,EAAC,iBAAA,qBAAA,EACR,iBAAA,GACC,SAAMI,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEC,EAAAA,MAAK,QAAA,CAAA,MAAYV,EAAA,eAAOE,EAAA,MAAQ,GACxC,+BAAaQ,EAAAA,MAAK,OAAA,EAAA,aAEnB,IAGe,CAHfC,EAGeL,EAAAM,CAAA,EAAA,CAFd,MAAM,gCACL,KAAMN,EAAAF,CAAA,EAAC,iBAAA,4EAAA,EACR,KAAK,MAAA,mBAGNO,EASYL,EAAAO,CAAA,EAAA,YARFb,EAAA,2CAAAA,EAAK,MAAAS,GACd,UAAA,GACA,MAAM,+BACN,6CAAA,GACC,MAAOH,EAAAF,CAAA,EAAC,iBAAA,OAAA,EACR,YAAaE,EAAAF,CAAA,EAAC,iBAAA,yBAAA,EACf,UAAU,IACV,KAAK,QACL,SAAA,EAAA,+CAGDO,EAOYL,EAAAQ,CAAA,EAAA,YANFZ,EAAA,2CAAAA,EAAQ,MAAAO,GACjB,MAAM,kCACN,gDAAA,GACC,MAAOH,EAAAF,CAAA,EAAC,iBAAA,UAAA,EACR,YAAaE,EAAAF,CAAA,EAAC,iBAAA,4BAAA,EACf,KAAK,WACL,SAAA,EAAA"}
|
||||
2
dist/CredentialsDialog-tP25sKHn.chunk.mjs
vendored
Normal file
2
dist/CredentialsDialog-tP25sKHn.chunk.mjs
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
import{t}from"./translation-DoG5ZELJ-gw0g4US-.chunk.mjs";import{N as m}from"./index-JpgrUA2Z-nZKKuBvr.chunk.mjs";import{N as d}from"./NcNoteCard-CVhtNL04-CJazPt2C.chunk.mjs";import{N as p}from"./NcPasswordField-djttkA5Q-Dyr2DfKl.chunk.mjs";import{_ as c}from"./TrashCanOutline-DxP9to3z.chunk.mjs";import{b as g,c as f,o as h,w as x,e as s,u as e,r as n}from"./runtime-dom.esm-bundler-OnXpa8v9.chunk.mjs";import"./index-6_gsQFyp.chunk.mjs";import"./index-xFugdZPW.chunk.mjs";import"./createElementId-DhjFt1I9--Zqj3wLs.chunk.mjs";import"./mdi-jSyRgDgA.chunk.mjs";import"./index-BT4wQaDP.chunk.mjs";import"./string_decoder-BO00msnV.chunk.mjs";import"./NcInputField-Bwsh2aHY-Bu0D97at.chunk.mjs";const $=g({__name:"CredentialsDialog",emits:["close"],setup(_){const o=n(""),r=n(""),u=[{label:t("files_external","Confirm"),type:"submit",variant:"primary"}];return(i,a)=>(h(),f(e(m),{buttons:u,class:"external-storage-auth",closeOnClickOutside:"","data-cy-external-storage-auth":"",isForm:"",name:e(t)("files_external","Storage credentials"),outTransition:"",onSubmit:a[2]||(a[2]=l=>i.$emit("close",{login:o.value,password:r.value})),"onUpdate:open":a[3]||(a[3]=l=>i.$emit("close"))},{default:x(()=>[s(e(d),{class:"external-storage-auth__header",text:e(t)("files_external","To access the storage, you need to provide the authentication credentials."),type:"info"},null,8,["text"]),s(e(c),{modelValue:o.value,"onUpdate:modelValue":a[0]||(a[0]=l=>o.value=l),autofocus:"",class:"external-storage-auth__login","data-cy-external-storage-auth-dialog-login":"",label:e(t)("files_external","Login"),placeholder:e(t)("files_external","Enter the storage login"),minlength:"2",name:"login",required:""},null,8,["modelValue","label","placeholder"]),s(e(p),{modelValue:r.value,"onUpdate:modelValue":a[1]||(a[1]=l=>r.value=l),class:"external-storage-auth__password","data-cy-external-storage-auth-dialog-password":"",label:e(t)("files_external","Password"),placeholder:e(t)("files_external","Enter the storage password"),name:"password",required:""},null,8,["modelValue","label","placeholder"])]),_:1},8,["name"]))}});export{$ as default};
|
||||
//# sourceMappingURL=CredentialsDialog-tP25sKHn.chunk.mjs.map
|
||||
1
dist/CredentialsDialog-tP25sKHn.chunk.mjs.map
vendored
Normal file
1
dist/CredentialsDialog-tP25sKHn.chunk.mjs.map
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"CredentialsDialog-tP25sKHn.chunk.mjs","sources":["../build/frontend/apps/files_external/src/views/CredentialsDialog.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport { t } from '@nextcloud/l10n'\nimport { ref } from 'vue'\nimport NcDialog from '@nextcloud/vue/components/NcDialog'\nimport NcNoteCard from '@nextcloud/vue/components/NcNoteCard'\nimport NcPasswordField from '@nextcloud/vue/components/NcPasswordField'\nimport NcTextField from '@nextcloud/vue/components/NcTextField'\n\ndefineEmits<{\n\tclose: [payload?: { login: string, password: string }]\n}>()\n\nconst login = ref('')\nconst password = ref('')\n\nconst dialogButtons: InstanceType<typeof NcDialog>['buttons'] = [{\n\tlabel: t('files_external', 'Confirm'),\n\ttype: 'submit',\n\tvariant: 'primary',\n}]\n</script>\n\n<template>\n\t<NcDialog\n\t\t:buttons=\"dialogButtons\"\n\t\tclass=\"external-storage-auth\"\n\t\tcloseOnClickOutside\n\t\tdata-cy-external-storage-auth\n\t\tisForm\n\t\t:name=\"t('files_external', 'Storage credentials')\"\n\t\toutTransition\n\t\t@submit=\"$emit('close', { login, password })\"\n\t\t@update:open=\"$emit('close')\">\n\t\t<!-- Header -->\n\t\t<NcNoteCard\n\t\t\tclass=\"external-storage-auth__header\"\n\t\t\t:text=\"t('files_external', 'To access the storage, you need to provide the authentication credentials.')\"\n\t\t\ttype=\"info\" />\n\n\t\t<!-- Login -->\n\t\t<NcTextField\n\t\t\tv-model=\"login\"\n\t\t\tautofocus\n\t\t\tclass=\"external-storage-auth__login\"\n\t\t\tdata-cy-external-storage-auth-dialog-login\n\t\t\t:label=\"t('files_external', 'Login')\"\n\t\t\t:placeholder=\"t('files_external', 'Enter the storage login')\"\n\t\t\tminlength=\"2\"\n\t\t\tname=\"login\"\n\t\t\trequired />\n\n\t\t<!-- Password -->\n\t\t<NcPasswordField\n\t\t\tv-model=\"password\"\n\t\t\tclass=\"external-storage-auth__password\"\n\t\t\tdata-cy-external-storage-auth-dialog-password\n\t\t\t:label=\"t('files_external', 'Password')\"\n\t\t\t:placeholder=\"t('files_external', 'Enter the storage password')\"\n\t\t\tname=\"password\"\n\t\t\trequired />\n\t</NcDialog>\n</template>\n"],"names":["login","ref","password","dialogButtons","t","_createBlock","_unref","NcDialog","_cache","$event","$emit","_createVNode","NcNoteCard","NcTextField","NcPasswordField"],"mappings":"kvBAiBA,MAAMA,EAAQC,EAAI,EAAE,EACdC,EAAWD,EAAI,EAAE,EAEjBE,EAA0D,CAAC,CAChE,MAAOC,EAAE,iBAAkB,SAAS,EACpC,KAAM,SACN,QAAS,SAAA,CACT,oBAIAC,EAqCWC,EAAAC,CAAA,EAAA,CApCT,QAASJ,EACV,MAAM,wBACN,oBAAA,GACA,gCAAA,GACA,OAAA,GACC,KAAMG,EAAAF,CAAA,EAAC,iBAAA,qBAAA,EACR,cAAA,GACC,SAAMI,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEC,EAAAA,MAAK,QAAA,CAAA,MAAYV,EAAA,eAAOE,EAAA,MAAQ,GACxC,+BAAaQ,EAAAA,MAAK,OAAA,EAAA,aAEnB,IAGe,CAHfC,EAGeL,EAAAM,CAAA,EAAA,CAFd,MAAM,gCACL,KAAMN,EAAAF,CAAA,EAAC,iBAAA,4EAAA,EACR,KAAK,MAAA,mBAGNO,EASYL,EAAAO,CAAA,EAAA,YARFb,EAAA,2CAAAA,EAAK,MAAAS,GACd,UAAA,GACA,MAAM,+BACN,6CAAA,GACC,MAAOH,EAAAF,CAAA,EAAC,iBAAA,OAAA,EACR,YAAaE,EAAAF,CAAA,EAAC,iBAAA,yBAAA,EACf,UAAU,IACV,KAAK,QACL,SAAA,EAAA,+CAGDO,EAOYL,EAAAQ,CAAA,EAAA,YANFZ,EAAA,2CAAAA,EAAQ,MAAAO,GACjB,MAAM,kCACN,gDAAA,GACC,MAAOH,EAAAF,CAAA,EAAC,iBAAA,UAAA,EACR,YAAaE,EAAAF,CAAA,EAAC,iBAAA,4BAAA,EACf,KAAK,WACL,SAAA,EAAA"}
|
||||
26
dist/FilesVersionsSidebarTab-BeV1M9zD.chunk.mjs
vendored
Normal file
26
dist/FilesVersionsSidebarTab-BeV1M9zD.chunk.mjs
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/FilesVersionsSidebarTab-BeV1M9zD.chunk.mjs.map
vendored
Normal file
1
dist/FilesVersionsSidebarTab-BeV1M9zD.chunk.mjs.map
vendored
Normal file
File diff suppressed because one or more lines are too long
26
dist/FilesVersionsSidebarTab-CLmRYBES.chunk.mjs
vendored
26
dist/FilesVersionsSidebarTab-CLmRYBES.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
2
dist/SetStatusModal-CKw6F7G_.chunk.mjs
vendored
2
dist/SetStatusModal-CKw6F7G_.chunk.mjs
vendored
File diff suppressed because one or more lines are too long
1
dist/SetStatusModal-CKw6F7G_.chunk.mjs.map
vendored
1
dist/SetStatusModal-CKw6F7G_.chunk.mjs.map
vendored
File diff suppressed because one or more lines are too long
2
dist/SetStatusModal-DkKVqd80.chunk.mjs
vendored
Normal file
2
dist/SetStatusModal-DkKVqd80.chunk.mjs
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/SetStatusModal-DkKVqd80.chunk.mjs.map
vendored
Normal file
1
dist/SetStatusModal-DkKVqd80.chunk.mjs.map
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