refactor(files_versions): Migrate to Vue3

Signed-off-by: Louis Chmn <louis@chmn.me>
This commit is contained in:
Louis Chmn 2025-10-23 19:59:45 +02:00
parent 2103410dac
commit 8dc64d794c
83 changed files with 1331 additions and 1665 deletions

View file

@ -23,6 +23,7 @@ class LoadAdditionalListener implements IEventListener {
// TODO: make sure to only include the sidebar script when
// we properly split it between files list and sidebar
Util::addScript(Application::APP_ID, 'files_versions');
Util::addStyle(Application::APP_ID, 'sidebar-tab');
Util::addScript(Application::APP_ID, 'sidebar-tab');
}
}

View file

@ -23,6 +23,7 @@ class LoadSidebarListener implements IEventListener {
// TODO: make sure to only include the sidebar script when
// we properly split it between files list and sidebar
Util::addScript(Application::APP_ID, 'files_versions');
Util::addStyle(Application::APP_ID, 'sidebar-tab');
Util::addScript(Application::APP_ID, 'sidebar-tab');
}
}

View file

@ -46,7 +46,7 @@
<span v-if="versionLabel"></span>
<NcAvatar
class="avatar"
:user="version.author"
:user="version.author ?? undefined"
:size="20"
disable-menu
disable-tooltip
@ -130,8 +130,9 @@
</NcListItem>
</template>
<script lang="ts">
<script lang="ts" setup>
import type { PropType } from 'vue'
import type { LegacyFileInfo } from '../../../files/src/services/FileInfo.ts'
import type { Version } from '../utils/versions.ts'
import { getCurrentUser } from '@nextcloud/auth'
@ -141,8 +142,7 @@ import { t } from '@nextcloud/l10n'
import moment from '@nextcloud/moment'
import { joinPaths } from '@nextcloud/paths'
import { getRootUrl } from '@nextcloud/router'
import Tooltip from '@nextcloud/vue/directives/Tooltip'
import { defineComponent } from 'vue'
import { computed, nextTick, ref } from 'vue'
import NcActionButton from '@nextcloud/vue/components/NcActionButton'
import NcActionLink from '@nextcloud/vue/components/NcActionLink'
import NcAvatar from '@nextcloud/vue/components/NcAvatar'
@ -155,193 +155,176 @@ 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 hasPermission = (permissions: number, permission: number): boolean => (permissions & permission) !== 0
export default defineComponent({
name: 'VersionEntry',
components: {
NcActionLink,
NcActionButton,
NcAvatar,
NcDateTime,
NcListItem,
BackupRestore,
Download,
FileCompare,
Pencil,
Delete,
ImageOffOutline,
const props = defineProps({
version: {
type: Object as PropType<Version>,
required: true,
},
directives: {
tooltip: Tooltip,
fileInfo: {
type: Object as PropType<LegacyFileInfo>,
required: true,
},
props: {
version: {
type: Object as PropType<Version>,
required: true,
},
fileInfo: {
type: Object,
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,
},
isCurrent: {
type: Boolean,
default: false,
},
emits: ['click', 'compare', 'restore', 'delete', 'label-update-request'],
data() {
return {
previewLoaded: false,
previewErrored: false,
capabilities: loadState('core', 'capabilities', { files: { version_labeling: false, version_deletion: false } }),
}
isFirstVersion: {
type: Boolean,
default: false,
},
computed: {
humanReadableSize() {
return formatFileSize(this.version.size)
},
versionLabel(): string {
const label = this.version.label ?? ''
if (this.isCurrent) {
if (label === '') {
return t('files_versions', 'Current version')
} else {
return `${label} (${t('files_versions', 'Current version')})`
}
}
if (this.isFirstVersion && label === '') {
return t('files_versions', 'Initial version')
}
return label
},
versionAuthor() {
if (!this.version.author || !this.version.authorName) {
return ''
}
if (this.version.author === getCurrentUser()?.uid) {
return t('files_versions', 'You')
}
return this.version.authorName ?? this.version.author
},
versionHumanExplicitDate(): string {
return moment(this.version.mtime).format('LLLL')
},
downloadURL(): string {
if (this.isCurrent) {
return getRootUrl() + joinPaths('/remote.php/webdav', this.fileInfo.path, this.fileInfo.name)
} else {
return getRootUrl() + this.version.url
}
},
enableLabeling(): boolean {
return this.capabilities.files.version_labeling === true
},
enableDeletion(): boolean {
return this.capabilities.files.version_deletion === true
},
hasDeletePermissions(): boolean {
return hasPermission(this.fileInfo.permissions, Permission.DELETE)
},
hasUpdatePermissions(): boolean {
return hasPermission(this.fileInfo.permissions, Permission.UPDATE)
},
isDownloadable(): boolean {
if ((this.fileInfo.permissions & Permission.READ) === 0) {
return false
}
// If the mount type is a share, ensure it got download permissions.
if (this.fileInfo.mountType === 'shared') {
const downloadAttribute = this.fileInfo.shareAttributes
.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download') || {}
// If the download attribute is set to false, the file is not downloadable
if (downloadAttribute?.value === false) {
return false
}
}
return true
},
loadPreview: {
type: Boolean,
default: false,
},
methods: {
labelUpdate() {
this.$emit('label-update-request')
},
canView: {
type: Boolean,
default: false,
},
restoreVersion() {
this.$emit('restore', this.version)
},
async deleteVersion() {
// Let @nc-vue properly remove the popover before we delete the version.
// This prevents @nc-vue from throwing a error.
await this.$nextTick()
await this.$nextTick()
this.$emit('delete', this.version)
},
click() {
if (!this.canView) {
window.location.href = this.downloadURL
return
}
this.$emit('click', { version: this.version })
},
compareVersion() {
if (!this.canView) {
throw new Error('Cannot compare version of this file')
}
this.$emit('compare', { version: this.version })
},
t,
canCompare: {
type: Boolean,
default: false,
},
})
const emit = defineEmits(['click', 'compare', 'restore', 'delete', 'label-update-request'])
const hasPermission = (permissions: number, permission: number): boolean => (permissions & permission) !== 0
const previewLoaded = ref(false)
const previewErrored = ref(false)
const capabilities = ref(loadState('core', 'capabilities', { files: { version_labeling: false, version_deletion: false } }))
const humanReadableSize = computed(() => {
return formatFileSize(props.version.size)
})
const versionLabel = computed(() => {
const label = props.version.label ?? ''
if (props.isCurrent) {
if (label === '') {
return t('files_versions', 'Current version')
} else {
return `${label} (${t('files_versions', 'Current version')})`
}
}
if (props.isFirstVersion && label === '') {
return t('files_versions', 'Initial version')
}
return label
})
const versionAuthor = computed(() => {
if (!props.version.author || !props.version.authorName) {
return ''
}
if (props.version.author === getCurrentUser()?.uid) {
return t('files_versions', 'You')
}
return props.version.authorName ?? props.version.author
})
const versionHumanExplicitDate = computed(() => {
return moment(props.version.mtime).format('LLLL')
})
const downloadURL = computed(() => {
if (props.isCurrent) {
return getRootUrl() + joinPaths('/remote.php/webdav', props.fileInfo.path, props.fileInfo.name)
} else {
return getRootUrl() + props.version.url
}
})
const enableLabeling = computed(() => {
return capabilities.value.files.version_labeling === true
})
const enableDeletion = computed(() => {
return capabilities.value.files.version_deletion === true
})
const hasDeletePermissions = computed(() => {
return hasPermission(props.fileInfo.permissions, Permission.DELETE)
})
const hasUpdatePermissions = computed(() => {
return hasPermission(props.fileInfo.permissions, Permission.UPDATE)
})
const isDownloadable = computed(() => {
if ((props.fileInfo.permissions & Permission.READ) === 0) {
return false
}
// If the mount type is a share, ensure it got download permissions.
if (props.fileInfo.mountType === 'shared') {
const downloadAttribute = props.fileInfo.shareAttributes
.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download') || {}
// If the download attribute is set to false, the file is not downloadable
if (downloadAttribute?.value === false) {
return false
}
}
return true
})
/**
*
*/
function labelUpdate() {
emit('label-update-request')
}
/**
*
*/
function restoreVersion() {
emit('restore', props.version)
}
/**
*
*/
async function deleteVersion() {
// Let @nc-vue properly remove the popover before we delete the version.
// This prevents @nc-vue from throwing a error.
await nextTick()
await nextTick()
emit('delete', props.version)
}
/**
*
*/
function click() {
if (!props.canView) {
window.location.href = downloadURL.value
return
}
emit('click', { version: props.version })
}
/**
*
*/
function compareVersion() {
if (!props.canView) {
throw new Error('Cannot compare version of this file')
}
emit('compare', { version: props.version })
}
</script>
<style scoped lang="scss">

View file

@ -11,13 +11,13 @@
size="normal"
:name="t('files_versions', 'Name this version')"
@update:open="$emit('update:open', $event)"
@submit="setVersionLabel(editedVersionLabel)">
@submit="setVersionLabel(internalLabel)">
<NcTextField
ref="labelInput"
v-model="internalLabel"
class="version-label-modal__input"
:label="t('files_versions', 'Version name')"
:placeholder="t('files_versions', 'Version name')"
:value.sync="editedVersionLabel" />
:placeholder="t('files_versions', 'Version name')" />
<p class="version-label-modal__info">
{{ t('files_versions', 'Named versions are persisted, and excluded from automatic cleanups when your storage quota is full.') }}
@ -25,96 +25,76 @@
</NcDialog>
</template>
<script lang="ts">
<script lang="ts" setup>
import svgCheck from '@mdi/svg/svg/check.svg?raw'
import { t } from '@nextcloud/l10n'
import { defineComponent } from 'vue'
import { computed, nextTick, ref, useTemplateRef, watchEffect } from 'vue'
import NcDialog from '@nextcloud/vue/components/NcDialog'
import NcTextField from '@nextcloud/vue/components/NcTextField'
type Focusable = Vue & { focus: () => void }
export default defineComponent({
name: 'VersionLabelDialog',
components: {
NcDialog,
NcTextField,
const props = defineProps({
open: {
type: Boolean,
default: false,
},
props: {
open: {
type: Boolean,
default: false,
},
versionLabel: {
type: String,
default: '',
},
},
data() {
return {
editedVersionLabel: '',
}
},
computed: {
dialogButtons() {
const buttons: unknown[] = []
if (this.versionLabel.trim() === '') {
// If there is no label just offer a cancel action that just closes the dialog
buttons.push({
label: t('files_versions', 'Cancel'),
})
} else {
// If there is already a label set, offer to remove the version label
buttons.push({
label: t('files_versions', 'Remove version name'),
type: 'reset',
variant: 'error',
callback: () => { this.setVersionLabel('') },
})
}
return [
...buttons,
{
label: t('files_versions', 'Save version name'),
icon: svgCheck,
type: 'submit',
variant: 'primary',
},
]
},
},
watch: {
versionLabel: {
immediate: true,
handler(label) {
this.editedVersionLabel = label ?? ''
},
},
open: {
immediate: true,
handler(open) {
if (open) {
this.$nextTick(() => (this.$refs.labelInput as Focusable).focus())
}
this.editedVersionLabel = this.versionLabel
},
},
},
methods: {
setVersionLabel(label: string) {
this.$emit('label-update', label)
},
t,
label: {
type: String,
default: '',
},
})
const emit = defineEmits(['update:open', 'update:label'])
const labelInput = useTemplateRef('labelInput')
const internalLabel = ref('')
const dialogButtons = computed(() => {
const buttons: unknown[] = []
if (props.label.trim() === '') {
// If there is no label just offer a cancel action that just closes the dialog
buttons.push({
label: t('files_versions', 'Cancel'),
})
} else {
// If there is already a label set, offer to remove the version label
buttons.push({
label: t('files_versions', 'Remove version name'),
type: 'reset',
variant: 'error',
callback: () => { setVersionLabel('') },
})
}
return [
...buttons,
{
label: t('files_versions', 'Save version name'),
icon: svgCheck,
type: 'submit',
variant: 'primary',
},
]
})
watchEffect(() => {
internalLabel.value = props.label ?? ''
})
watchEffect(() => {
if (props.open) {
nextTick(() => labelInput.value?.focus())
}
internalLabel.value = props.label
})
/**
*
* @param label - The new label
*/
function setVersionLabel(label: string) {
emit('update:label', label)
}
</script>
<style scoped lang="scss">

View file

@ -28,14 +28,14 @@ import {
defineComponent,
} from 'vue'
import logger from '../utils/logger.js'
import logger from '../utils/logger.ts'
interface RowItem {
export interface RowItem {
id: string // Unique id for the item.
key?: string // Unique key for the item.
}
interface Row {
export interface Row {
key: string // Unique key for the row.
height: number // The height of the row.
sectionKey: string // Unique key for the row.

View file

@ -1,60 +0,0 @@
/**
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import BackupRestore from '@mdi/svg/svg/backup-restore.svg?raw'
import { n, t } from '@nextcloud/l10n'
import VTooltipPlugin from 'v-tooltip'
import Vue from 'vue'
import VersionTab from './views/VersionTab.vue'
Vue.prototype.t = t
Vue.prototype.n = n
Vue.use(VTooltipPlugin)
// Init Sharing tab component
const View = Vue.extend(VersionTab)
let TabInstance = null
window.addEventListener('DOMContentLoaded', function() {
if (OCA.Files?.Sidebar === undefined) {
return
}
OCA.Files.Sidebar.registerTab(new OCA.Files.Sidebar.Tab({
id: 'version_vue',
name: t('files_versions', 'Versions'),
iconSvg: BackupRestore,
async mount(el, fileInfo, context) {
if (TabInstance) {
TabInstance.$destroy()
}
TabInstance = new View({
// Better integration with vue parent component
parent: context,
})
// Only mount after we have all the info we need
await TabInstance.update(fileInfo)
TabInstance.$mount(el)
},
update(fileInfo) {
TabInstance.update(fileInfo)
},
setIsActive(isActive) {
if (!TabInstance) {
return
}
TabInstance.setIsActive(isActive)
},
destroy() {
TabInstance.$destroy()
TabInstance = null
},
enabled(fileInfo) {
return !(fileInfo?.isDirectory() ?? true)
},
}))
})

View file

@ -0,0 +1,50 @@
/**
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import type { App, ComponentPublicInstance } from 'vue'
import BackupRestore from '@mdi/svg/svg/backup-restore.svg?raw'
import { t } from '@nextcloud/l10n'
import { createApp } from 'vue'
import FilesVersionsSidebarTab from './views/FilesVersionsSidebarTab.vue'
// Init FilesVersions tab component
let filesVersionsTabApp: App<Element> | null = null
let filesVersionsTabInstance: ComponentPublicInstance<typeof FilesVersionsSidebarTab> | null = null
window.addEventListener('DOMContentLoaded', function() {
if (window.OCA.Files?.Sidebar === undefined) {
return
}
window.OCA.Files.Sidebar.registerTab(new window.OCA.Files.Sidebar.Tab({
id: 'files_versions',
name: t('files_versions', 'Versions'),
iconSvg: BackupRestore,
async mount(el, fileInfo) {
// destroy previous instance if available
if (filesVersionsTabApp) {
filesVersionsTabApp.unmount()
}
filesVersionsTabApp = createApp(FilesVersionsSidebarTab)
filesVersionsTabInstance = filesVersionsTabApp.mount(el)
filesVersionsTabInstance.update(fileInfo)
},
update(fileInfo) {
filesVersionsTabInstance!.update(fileInfo)
},
setIsActive(isActive) {
filesVersionsTabInstance?.setIsActive(isActive)
},
destroy() {
filesVersionsTabApp?.unmount()
filesVersionsTabApp = null
},
enabled(fileInfo) {
return !(fileInfo?.isDirectory() ?? true)
},
}))
})

View file

@ -12,9 +12,9 @@ import axios from '@nextcloud/axios'
import moment from '@nextcloud/moment'
import { encodePath, joinPaths } from '@nextcloud/paths'
import { generateRemoteUrl, generateUrl } from '@nextcloud/router'
import client from '../utils/davClient.js'
import davRequest from '../utils/davRequest.js'
import logger from '../utils/logger.js'
import client from '../utils/davClient.ts'
import davRequest from '../utils/davRequest.ts'
import logger from '../utils/logger.ts'
export interface Version {
fileId: string // The id of the file associated to the version.

View file

@ -0,0 +1,315 @@
<!--
- SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<template>
<div v-if="fileInfo !== null" class="versions-tab__container">
<VirtualScrolling
:sections="sections"
:header-height="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="isActive"
:version="row.items[0].version"
:file-info="fileInfo"
:is-current="row.items[0].version.mtime === fileInfo.mtime"
:is-first-version="row.items[0].version.mtime === initialVersionMtime"
@click="openVersion"
@compare="compareVersion"
@restore="handleRestore"
@label-update-request="handleLabelUpdateRequest(row.items[0].version)"
@delete="handleDelete" />
</template>
</ul>
</template>
<template #loader>
<NcLoadingIcon v-if="loading" class="files-list-viewer__loader" />
</template>
</VirtualScrolling>
<VersionLabelDialog
v-if="editedVersion"
v-model:open="showVersionLabelForm"
:label="editedVersion.label"
@update:label="handleLabelUpdate" />
</div>
</template>
<script lang="ts" setup>
import type { LegacyFileInfo } from '../../../files/src/services/FileInfo.ts'
import type { Version } from '../utils/versions.ts'
import { getCurrentUser } from '@nextcloud/auth'
import { showError, showSuccess } from '@nextcloud/dialogs'
import { emit, subscribe, unsubscribe } from '@nextcloud/event-bus'
import { t } from '@nextcloud/l10n'
import { useIsMobile } from '@nextcloud/vue/composables/useIsMobile'
import path from 'path'
import { computed, onBeforeUnmount, onMounted, ref } from 'vue'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import VersionEntry from '../components/VersionEntry.vue'
import VersionLabelDialog from '../components/VersionLabelDialog.vue'
import VirtualScrolling from '../components/VirtualScrolling.vue'
import logger from '../utils/logger.ts'
import { deleteVersion, fetchVersions, restoreVersion, setVersionLabel } from '../utils/versions.ts'
const isMobile = useIsMobile()
const fileInfo = ref<LegacyFileInfo | null>(null)
const isActive = ref<boolean>(false)
const versions = ref<Version[]>([])
const loading = ref(false)
const showVersionLabelForm = ref(false)
const editedVersion = ref<Version | null>(null)
/**
* Order versions by mtime.
* Put the current version at the top.
*/
const orderedVersions = computed(() => {
return [...versions.value].sort((a, b) => {
if (fileInfo.value === null) {
return 0
}
if (a.mtime === fileInfo.value.mtime) {
return -1
} else if (b.mtime === fileInfo.value.mtime) {
return 1
} else {
return b.mtime - a.mtime
}
})
})
const sections = computed(() => {
const rows = orderedVersions.value.map((version) => ({ key: version.mtime.toString(), height: 68, sectionKey: 'versions', items: [{ id: version.mtime.toString(), version }] }))
return [{ key: 'versions', rows, height: 68 * orderedVersions.value.length }]
})
/**
* Return the mtime of the first version to display "Initial version" label
*/
const initialVersionMtime = computed(() => {
return versions.value
.map((version) => version.mtime)
.reduce((a, b) => Math.min(a, b))
})
const viewerFileInfo = computed(() => {
if (fileInfo.value === null) {
return null
}
// We need to remap bitmask to dav permissions as the file info we have is converted through client.js
let davPermissions = ''
if (fileInfo.value.permissions & 1) {
davPermissions += 'R'
}
if (fileInfo.value.permissions & 2) {
davPermissions += 'W'
}
if (fileInfo.value.permissions & 8) {
davPermissions += 'D'
}
return {
...fileInfo.value,
mime: fileInfo.value.mimetype,
basename: fileInfo.value.name,
filename: fileInfo.value.path + '/' + fileInfo.value.name,
permissions: davPermissions,
fileid: fileInfo.value.id,
}
})
const canView = computed(() => {
if (fileInfo.value === null) {
return false
}
return window.OCA.Viewer?.mimetypesCompare?.includes(fileInfo.value.mimetype)
})
const canCompare = computed(() => {
return !isMobile.value
})
onMounted(() => {
subscribe('files_versions:restore:restored', fetchVersions)
})
onBeforeUnmount(() => {
unsubscribe('files_versions:restore:restored', fetchVersions)
})
defineExpose({
/**
* Update current fileInfo and fetch new data
*
* @param _fileInfo the current file FileInfo
*/
async update(_fileInfo: LegacyFileInfo) {
fileInfo.value = _fileInfo
resetState()
internalFetchVersions()
},
/**
* @param _isActive whether the tab is active
*/
async setIsActive(_isActive: boolean) {
isActive.value = _isActive
},
})
/**
* Get the existing versions infos
*/
async function internalFetchVersions() {
try {
loading.value = true
versions.value = await fetchVersions(fileInfo.value)
} finally {
loading.value = false
}
}
/**
* Handle restored event from Version.vue
*
* @param version The version to restore
*/
async function handleRestore(version: Version) {
// Update local copy of fileInfo as rendering depends on it.
const oldFileInfo = fileInfo.value
fileInfo.value = {
...fileInfo.value,
size: version.size,
mtime: version.mtime,
}
const restoreStartedEventState = {
preventDefault: false,
fileInfo: fileInfo.value,
version,
}
emit('files_versions:restore:requested', restoreStartedEventState)
if (restoreStartedEventState.preventDefault) {
return
}
try {
await restoreVersion(version)
if (version.label) {
showSuccess(t('files_versions', `${version.label} restored`))
} else if (version.mtime === initialVersionMtime.value) {
showSuccess(t('files_versions', 'Initial version restored'))
} else {
showSuccess(t('files_versions', 'Version restored'))
}
emit('files_versions:restore:restored', version)
} catch {
fileInfo.value = oldFileInfo
showError(t('files_versions', 'Could not restore version'))
emit('files_versions:restore:failed', version)
}
}
/**
* Handle label-updated event from Version.vue
*
* @param version The version to update
*/
function handleLabelUpdateRequest(version: Version) {
showVersionLabelForm.value = true
editedVersion.value = version
}
/**
* Handle label-updated event from Version.vue
*
* @param newLabel The new label
*/
async function handleLabelUpdate(newLabel: string) {
if (editedVersion.value === null) {
throw new Error('editedVersion should be set at that point')
}
const oldLabel = editedVersion.value.label
editedVersion.value.label = newLabel
showVersionLabelForm.value = false
try {
await setVersionLabel(editedVersion.value, newLabel)
editedVersion.value = null
} catch (exception) {
editedVersion.value!.label = oldLabel
showError(t('files_versions', 'Could not set version label'))
logger.error('Could not set version label', { exception })
}
}
/**
* Handle deleted event from Version.vue
*
* @param version The version to delete
*/
async function handleDelete(version: Version) {
const index = versions.value.indexOf(version)
versions.value.splice(index, 1)
try {
await deleteVersion(version)
} catch {
versions.value.push(version)
showError(t('files_versions', 'Could not delete version'))
}
}
/**
* Reset the current view to its default state
*/
function resetState() {
versions.value = []
}
function openVersion({ version }: { version: Version }) {
if (fileInfo.value === null) {
return
}
// Open current file view instead of read only
if (version.mtime === fileInfo.value.mtime) {
window.OCA.Viewer.open({ fileInfo: viewerFileInfo.value })
return
}
window.OCA.Viewer.open({
fileInfo: {
...version,
// Versions previews are too small for our use case, so we override previewUrl
// to either point to the original file or original version.
filename: version.mtime === fileInfo.value.mtime ? path.join('files', getCurrentUser()?.uid ?? '', fileInfo.value.path, fileInfo.value.name) : version.filename,
previewUrl: undefined,
},
enableSidebar: false,
})
}
function compareVersion({ version }: { version: Version }) {
const _versions = versions.value.map((version) => ({ ...version, previewUrl: undefined }))
window.OCA.Viewer.compare(viewerFileInfo.value, _versions.find((v) => v.source === version.source))
}
</script>
<style lang="scss">
.versions-tab__container {
height: 100%;
}
</style>

View file

@ -1,316 +0,0 @@
<!--
- SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<template>
<div class="versions-tab__container">
<VirtualScrolling
v-slot="{ visibleSections }"
:sections="sections"
:header-height="0">
<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].mtime"
:can-view="canView"
:can-compare="canCompare"
:load-preview="isActive"
:version="row.items[0]"
:file-info="fileInfo"
:is-current="row.items[0].mtime === fileInfo.mtime"
:is-first-version="row.items[0].mtime === initialVersionMtime"
@click="openVersion"
@compare="compareVersion"
@restore="handleRestore"
@label-update-request="handleLabelUpdateRequest(row.items[0])"
@delete="handleDelete" />
</template>
</ul>
<NcLoadingIcon v-if="loading" slot="loader" class="files-list-viewer__loader" />
</VirtualScrolling>
<VersionLabelDialog
v-if="editedVersion"
:open.sync="showVersionLabelForm"
:version-label="editedVersion.label"
@label-update="handleLabelUpdate" />
</div>
</template>
<script>
import { getCurrentUser } from '@nextcloud/auth'
import { showError, showSuccess } from '@nextcloud/dialogs'
import { emit, subscribe, unsubscribe } from '@nextcloud/event-bus'
import { useIsMobile } from '@nextcloud/vue/composables/useIsMobile'
import path from 'path'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import VersionEntry from '../components/VersionEntry.vue'
import VersionLabelDialog from '../components/VersionLabelDialog.vue'
import VirtualScrolling from '../components/VirtualScrolling.vue'
import logger from '../utils/logger.js'
import { deleteVersion, fetchVersions, restoreVersion, setVersionLabel } from '../utils/versions.ts'
export default {
name: 'VersionTab',
components: {
VersionEntry,
VirtualScrolling,
VersionLabelDialog,
NcLoadingIcon,
},
setup() {
return {
isMobile: useIsMobile(),
}
},
data() {
return {
fileInfo: null,
isActive: false,
/** @type {import('../utils/versions.ts').Version[]} */
versions: [],
loading: false,
showVersionLabelForm: false,
editedVersion: null,
}
},
computed: {
sections() {
const rows = this.orderedVersions.map((version) => ({ key: version.mtime, height: 68, sectionKey: 'versions', items: [version] }))
return [{ key: 'versions', rows, height: 68 * this.orderedVersions.length }]
},
/**
* Order versions by mtime.
* Put the current version at the top.
*
* @return {import('../utils/versions.ts').Version[]}
*/
orderedVersions() {
return [...this.versions].sort((a, b) => {
if (a.mtime === this.fileInfo.mtime) {
return -1
} else if (b.mtime === this.fileInfo.mtime) {
return 1
} else {
return b.mtime - a.mtime
}
})
},
/**
* Return the mtime of the first version to display "Initial version" label
*
* @return {number}
*/
initialVersionMtime() {
return this.versions
.map((version) => version.mtime)
.reduce((a, b) => Math.min(a, b))
},
viewerFileInfo() {
// We need to remap bitmask to dav permissions as the file info we have is converted through client.js
let davPermissions = ''
if (this.fileInfo.permissions & 1) {
davPermissions += 'R'
}
if (this.fileInfo.permissions & 2) {
davPermissions += 'W'
}
if (this.fileInfo.permissions & 8) {
davPermissions += 'D'
}
return {
...this.fileInfo,
mime: this.fileInfo.mimetype,
basename: this.fileInfo.name,
filename: this.fileInfo.path + '/' + this.fileInfo.name,
permissions: davPermissions,
fileid: this.fileInfo.id,
}
},
/** @return {boolean} */
canView() {
return window.OCA.Viewer?.mimetypesCompare?.includes(this.fileInfo.mimetype)
},
canCompare() {
return !this.isMobile
},
},
mounted() {
subscribe('files_versions:restore:restored', this.fetchVersions)
},
beforeUnmount() {
unsubscribe('files_versions:restore:restored', this.fetchVersions)
},
methods: {
/**
* Update current fileInfo and fetch new data
*
* @param {object} fileInfo the current file FileInfo
*/
async update(fileInfo) {
this.fileInfo = fileInfo
this.resetState()
this.fetchVersions()
},
/**
* @param {boolean} isActive whether the tab is active
*/
async setIsActive(isActive) {
this.isActive = isActive
},
/**
* Get the existing versions infos
*/
async fetchVersions() {
try {
this.loading = true
this.versions = await fetchVersions(this.fileInfo)
} finally {
this.loading = false
}
},
/**
* Handle restored event from Version.vue
*
* @param {import('../utils/versions.ts').Version} version The version to restore
*/
async handleRestore(version) {
// Update local copy of fileInfo as rendering depends on it.
const oldFileInfo = this.fileInfo
this.fileInfo = {
...this.fileInfo,
size: version.size,
mtime: version.mtime,
}
const restoreStartedEventState = {
preventDefault: false,
fileInfo: this.fileInfo,
version,
}
emit('files_versions:restore:requested', restoreStartedEventState)
if (restoreStartedEventState.preventDefault) {
return
}
try {
await restoreVersion(version)
if (version.label) {
showSuccess(t('files_versions', `${version.label} restored`))
} else if (version.mtime === this.initialVersionMtime) {
showSuccess(t('files_versions', 'Initial version restored'))
} else {
showSuccess(t('files_versions', 'Version restored'))
}
emit('files_versions:restore:restored', version)
} catch {
this.fileInfo = oldFileInfo
showError(t('files_versions', 'Could not restore version'))
emit('files_versions:restore:failed', version)
}
},
/**
* Handle label-updated event from Version.vue
*
* @param {import('../utils/versions.ts').Version} version The version to update
*/
handleLabelUpdateRequest(version) {
this.showVersionLabelForm = true
this.editedVersion = version
},
/**
* Handle label-updated event from Version.vue
*
* @param {string} newLabel The new label
*/
async handleLabelUpdate(newLabel) {
const oldLabel = this.editedVersion.label
this.editedVersion.label = newLabel
this.showVersionLabelForm = false
try {
await setVersionLabel(this.editedVersion, newLabel)
this.editedVersion = null
} catch (exception) {
this.editedVersion.label = oldLabel
showError(this.t('files_versions', 'Could not set version label'))
logger.error('Could not set version label', { exception })
}
},
/**
* Handle deleted event from Version.vue
*
* @param {import('../utils/versions.ts').Version} version The version to delete
*/
async handleDelete(version) {
const index = this.versions.indexOf(version)
this.versions.splice(index, 1)
try {
await deleteVersion(version)
} catch {
this.versions.push(version)
showError(t('files_versions', 'Could not delete version'))
}
},
/**
* Reset the current view to its default state
*/
resetState() {
this.$set(this, 'versions', [])
},
openVersion({ version }) {
// Open current file view instead of read only
if (version.mtime === this.fileInfo.mtime) {
OCA.Viewer.open({ fileInfo: this.viewerFileInfo })
return
}
// Versions previews are too small for our use case, so we override previewUrl
// which makes the viewer render the original file.
// We also point to the original filename if the version is the current one.
const versions = this.versions.map((version) => ({
...version,
filename: version.mtime === this.fileInfo.mtime ? path.join('files', getCurrentUser()?.uid ?? '', this.fileInfo.path, this.fileInfo.name) : version.filename,
previewUrl: undefined,
}))
OCA.Viewer.open({
fileInfo: versions.find((v) => v.source === version.source),
enableSidebar: false,
})
},
compareVersion({ version }) {
const versions = this.versions.map((version) => ({ ...version, previewUrl: undefined }))
OCA.Viewer.compare(this.viewerFileInfo, versions.find((v) => v.source === version.source))
},
},
}
</script>
<style lang="scss">
.versions-tab__container {
height: 100%;
}
</style>

View file

@ -60,9 +60,6 @@ module.exports = {
files_trashbin: {
init: path.join(__dirname, 'apps/files_trashbin/src', 'files-init.ts'),
},
files_versions: {
files_versions: path.join(__dirname, 'apps/files_versions/src', 'files_versions_tab.js'),
},
oauth2: {
oauth2: path.join(__dirname, 'apps/oauth2/src', 'main.js'),
},

View file

@ -15,6 +15,9 @@ const modules = {
sharebymail: {
'admin-settings': resolve(import.meta.dirname, 'apps/sharebymail/src', 'settings-admin.ts'),
},
files_versions: {
'sidebar-tab': resolve(import.meta.dirname, 'apps/files_versions/src', 'sidebar_tab.ts'),
},
}
// convert modules to modules entries prefied with the app id

View file

@ -26,17 +26,17 @@ export function openVersionsPanel(fileName: string) {
// Open the versions tab
cy.window().then((win) => {
win.OCA.Files.Sidebar.setActiveTab('version_vue')
win.OCA.Files.Sidebar.setActiveTab('files_versions')
win.OCA.Files.Sidebar.open(`/${fileName}`)
})
// Wait for the versions list to be fetched
cy.wait('@getVersions')
cy.get('#tab-version_vue').should('be.visible', { timeout: 10000 })
cy.get('#tab-files_versions').should('be.visible', { timeout: 10000 })
}
export function toggleVersionMenu(index: number) {
cy.get('#tab-version_vue [data-files-versions-version]')
cy.get('#tab-files_versions [data-files-versions-version]')
.eq(index)
.find('button')
.click()

View file

@ -25,7 +25,7 @@ describe('Versions creation', () => {
cy.visit('/apps/files')
openVersionsPanel(randomFileName)
cy.get('#tab-version_vue').within(() => {
cy.get('#tab-files_versions').within(() => {
cy.get('[data-files-versions-version]').should('have.length', 3)
cy.get('[data-files-versions-version]').eq(0).contains('Current version')
cy.get('[data-files-versions-version]').eq(2).contains('Initial version')

View file

@ -28,7 +28,7 @@ describe('Versions expiration', () => {
cy.visit('/apps/files')
openVersionsPanel(randomFileName)
cy.get('#tab-version_vue').within(() => {
cy.get('#tab-files_versions').within(() => {
cy.get('[data-files-versions-version]').should('have.length', 1)
cy.get('[data-files-versions-version]').eq(0).contains('Current version')
})
@ -45,7 +45,7 @@ describe('Versions expiration', () => {
cy.visit('/apps/files')
openVersionsPanel(randomFileName)
cy.get('#tab-version_vue').within(() => {
cy.get('#tab-files_versions').within(() => {
cy.get('[data-files-versions-version]').should('have.length', 2)
cy.get('[data-files-versions-version]').eq(0).contains('Current version')
cy.get('[data-files-versions-version]').eq(1).contains('v1')

View file

@ -28,18 +28,18 @@ describe('Versions naming', () => {
it('Names the versions', () => {
nameVersion(2, 'v1')
cy.get('#tab-version_vue').within(() => {
cy.get('#tab-files_versions').within(() => {
cy.get('[data-files-versions-version]').eq(2).contains('v1')
cy.get('[data-files-versions-version]').eq(2).contains('Initial version').should('not.exist')
})
nameVersion(1, 'v2')
cy.get('#tab-version_vue').within(() => {
cy.get('#tab-files_versions').within(() => {
cy.get('[data-files-versions-version]').eq(1).contains('v2')
})
nameVersion(0, 'v3')
cy.get('#tab-version_vue').within(() => {
cy.get('#tab-files_versions').within(() => {
cy.get('[data-files-versions-version]').eq(0).contains('v3 (Current version)')
})
})
@ -53,18 +53,18 @@ describe('Versions naming', () => {
it('Names the versions', () => {
nameVersion(2, 'v1 - shared')
cy.get('#tab-version_vue').within(() => {
cy.get('#tab-files_versions').within(() => {
cy.get('[data-files-versions-version]').eq(2).contains('v1 - shared')
cy.get('[data-files-versions-version]').eq(2).contains('Initial version').should('not.exist')
})
nameVersion(1, 'v2 - shared')
cy.get('#tab-version_vue').within(() => {
cy.get('#tab-files_versions').within(() => {
cy.get('[data-files-versions-version]').eq(1).contains('v2 - shared')
})
nameVersion(0, 'v3 - shared')
cy.get('#tab-version_vue').within(() => {
cy.get('#tab-files_versions').within(() => {
cy.get('[data-files-versions-version]').eq(0).contains('v3 - shared (Current version)')
})
})

View file

@ -33,7 +33,7 @@ describe('Versions restoration', () => {
it('Restores initial version', () => {
restoreVersion(2)
cy.get('#tab-version_vue').within(() => {
cy.get('#tab-files_versions').within(() => {
cy.get('[data-files-versions-version]').should('have.length', 3)
cy.get('[data-files-versions-version]').eq(0).contains('Current version')
cy.get('[data-files-versions-version]').eq(2).contains('Initial version').should('not.exist')
@ -53,7 +53,7 @@ describe('Versions restoration', () => {
it('Restores initial version', () => {
restoreVersion(2)
cy.get('#tab-version_vue').within(() => {
cy.get('#tab-files_versions').within(() => {
cy.get('[data-files-versions-version]').should('have.length', 3)
cy.get('[data-files-versions-version]').eq(0).contains('Current version')
cy.get('[data-files-versions-version]').eq(2).contains('Initial version').should('not.exist')

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,6 @@
SPDX-License-Identifier: (MIT AND BSD-3-Clause)
SPDX-License-Identifier: AGPL-3.0-or-later
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: BSD-3-Clause
SPDX-License-Identifier: GPL-3.0-or-later
SPDX-License-Identifier: ISC
@ -8,6 +9,7 @@ SPDX-FileCopyrightText:
SPDX-FileCopyrightText: @nextcloud/dialogs developers
SPDX-FileCopyrightText: Anthony Fu <https://github.com/antfu>
SPDX-FileCopyrightText: Arnout Kazemier
SPDX-FileCopyrightText: Austin Andrews
SPDX-FileCopyrightText: Borys Serebrov
SPDX-FileCopyrightText: Calvin Metcalf
SPDX-FileCopyrightText: Calvin Metcalf <calvin.metcalf@gmail.com>
@ -39,6 +41,7 @@ SPDX-FileCopyrightText: Nathan Rajlich <nathan@tootallnate.net> (http://n8.io/)
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
SPDX-FileCopyrightText: Nick Frasser (https://nfrasser.com)
SPDX-FileCopyrightText: Raynos <raynos2@gmail.com>
SPDX-FileCopyrightText: Rob Cresswell <robcresswell@pm.me>
SPDX-FileCopyrightText: Roeland Jago Douma
SPDX-FileCopyrightText: Sindre Sorhus
SPDX-FileCopyrightText: Varun A P
@ -67,6 +70,9 @@ This file is generated from multiple sources. Included packages:
- @floating-ui/utils
- version: 0.2.10
- license: MIT
- @mdi/svg
- version: 7.4.47
- license: Apache-2.0
- @nextcloud/browser-storage
- version: 0.4.0
- license: GPL-3.0-or-later
@ -379,6 +385,9 @@ This file is generated from multiple sources. Included packages:
- vm-browserify
- version: 1.1.2
- license: MIT
- vue-material-design-icons
- version: 5.3.1
- license: MIT
- vue-router
- version: 4.6.3
- license: MIT

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,6 @@
SPDX-License-Identifier: (MIT AND BSD-3-Clause)
SPDX-License-Identifier: AGPL-3.0-or-later
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: BSD-3-Clause
SPDX-License-Identifier: GPL-3.0-or-later
SPDX-License-Identifier: ISC
@ -8,6 +9,7 @@ SPDX-FileCopyrightText:
SPDX-FileCopyrightText: @nextcloud/dialogs developers
SPDX-FileCopyrightText: Anthony Fu <https://github.com/antfu>
SPDX-FileCopyrightText: Arnout Kazemier
SPDX-FileCopyrightText: Austin Andrews
SPDX-FileCopyrightText: Borys Serebrov
SPDX-FileCopyrightText: Calvin Metcalf
SPDX-FileCopyrightText: Calvin Metcalf <calvin.metcalf@gmail.com>
@ -39,6 +41,7 @@ SPDX-FileCopyrightText: Nathan Rajlich <nathan@tootallnate.net> (http://n8.io/)
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
SPDX-FileCopyrightText: Nick Frasser (https://nfrasser.com)
SPDX-FileCopyrightText: Raynos <raynos2@gmail.com>
SPDX-FileCopyrightText: Rob Cresswell <robcresswell@pm.me>
SPDX-FileCopyrightText: Roeland Jago Douma
SPDX-FileCopyrightText: Sindre Sorhus
SPDX-FileCopyrightText: Varun A P
@ -67,6 +70,9 @@ This file is generated from multiple sources. Included packages:
- @floating-ui/utils
- version: 0.2.10
- license: MIT
- @mdi/svg
- version: 7.4.47
- license: Apache-2.0
- @nextcloud/browser-storage
- version: 0.4.0
- license: GPL-3.0-or-later
@ -379,6 +385,9 @@ This file is generated from multiple sources. Included packages:
- vm-browserify
- version: 1.1.2
- license: MIT
- vue-material-design-icons
- version: 5.3.1
- license: MIT
- vue-router
- version: 4.6.3
- license: MIT

File diff suppressed because one or more lines are too long

4
dist/core-common.js vendored

File diff suppressed because one or more lines are too long

View file

@ -31,7 +31,6 @@ SPDX-FileCopyrightText: Varun A P
SPDX-FileCopyrightText: Tobias Koppers @sokra
SPDX-FileCopyrightText: Titus Wormer <tituswormer@gmail.com> (https://wooorm.com)
SPDX-FileCopyrightText: Thorsten Lünborg
SPDX-FileCopyrightText: The Babel Team (https://babel.dev/team)
SPDX-FileCopyrightText: T. Jameson Little <t.jameson.little@gmail.com>
SPDX-FileCopyrightText: Stefan Thomas <justmoon@members.fsf.org> (http://www.justmoon.net)
SPDX-FileCopyrightText: Sindre Sorhus
@ -112,9 +111,6 @@ SPDX-FileCopyrightText:
This file is generated from multiple sources. Included packages:
- @babel/runtime
- version: 7.28.4
- license: MIT
- @ctrl/tinycolor
- version: 3.6.1
- license: MIT
@ -949,9 +945,6 @@ This file is generated from multiple sources. Included packages:
- util
- version: 0.12.5
- license: MIT
- v-tooltip
- version: 2.1.3
- license: MIT
- vfile-message
- version: 4.0.3
- license: MIT

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

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

View file

@ -1,4 +1,4 @@
/* extracted by css-entry-points-plugin */
@import './dav-dav-settings-admin-example-content-BvfG00pA.chunk.css';
@import './_plugin-vue_export-helper-BE4hS1RR.chunk.css';
@import './index-hZPKu-D6-nyVG1sMv.chunk.css';
@import './TrayArrowDown-nyVG1sMv.chunk.css';

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
/* extracted by css-entry-points-plugin */
@import './dav-dav-settings-personal-availability-Cj5tXAon.chunk.css';
@import './_plugin-vue_export-helper-BE4hS1RR.chunk.css';
@import './index-hZPKu-D6-nyVG1sMv.chunk.css';
@import './TrayArrowDown-nyVG1sMv.chunk.css';

File diff suppressed because one or more lines are too long

View file

@ -6,7 +6,6 @@ SPDX-License-Identifier: MPL-2.0
SPDX-FileCopyrightText: Christoph Wurst
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
SPDX-FileCopyrightText: Nick Singleton
SPDX-FileCopyrightText: Perry Mitchell <perry@perrymitchell.net>
SPDX-FileCopyrightText: Philipp Kewisch
SPDX-FileCopyrightText: Rob Cresswell <robcresswell@pm.me>
SPDX-FileCopyrightText: uuid developers
@ -36,6 +35,3 @@ This file is generated from multiple sources. Included packages:
- vue-material-design-icons
- version: 5.3.1
- license: MIT
- webdav
- version: 5.8.0
- license: MIT

File diff suppressed because one or more lines are too long

View file

@ -6,7 +6,6 @@ SPDX-License-Identifier: MPL-2.0
SPDX-FileCopyrightText: Christoph Wurst
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
SPDX-FileCopyrightText: Nick Singleton
SPDX-FileCopyrightText: Perry Mitchell <perry@perrymitchell.net>
SPDX-FileCopyrightText: Philipp Kewisch
SPDX-FileCopyrightText: Rob Cresswell <robcresswell@pm.me>
SPDX-FileCopyrightText: uuid developers
@ -36,6 +35,3 @@ This file is generated from multiple sources. Included packages:
- vue-material-design-icons
- version: 5.3.1
- license: MIT
- webdav
- version: 5.8.0
- license: MIT

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
.version[data-v-e3870fc8]{display:flex;flex-direction:row}.version__info[data-v-e3870fc8]{display:flex;flex-direction:row;align-items:center;gap:.5rem;color:var(--color-main-text);font-weight:500;overflow:hidden}.version__info__label[data-v-e3870fc8]{font-weight:700;overflow:hidden;text-overflow:ellipsis;min-width:110px}.version__info__author_name[data-v-e3870fc8],.version__info__date[data-v-e3870fc8]{overflow:hidden;text-overflow:ellipsis}.version__info__subline[data-v-e3870fc8]{color:var(--color-text-maxcontrast)}.version__image[data-v-e3870fc8]{width:3rem;height:3rem;border:1px solid var(--color-border);border-radius:var(--border-radius-large);display:flex;justify-content:center;color:var(--color-main-text)}.version-label-modal__info[data-v-6a69577b]{color:var(--color-text-maxcontrast);margin-block:calc(3 * var(--default-grid-baseline))}.version-label-modal__input[data-v-6a69577b]{margin-block-start:calc(2 * var(--default-grid-baseline))}.vs-container[data-v-52b628a8]{overflow-y:scroll;height:100%}.vs-rows-container[data-v-52b628a8]{box-sizing:border-box;will-change:scroll-position,padding;contain:layout paint style}.versions-tab__container{height:100%}

File diff suppressed because one or more lines are too long

View file

@ -1,881 +0,0 @@
SPDX-License-Identifier: MIT
SPDX-License-Identifier: ISC
SPDX-License-Identifier: GPL-3.0-or-later
SPDX-License-Identifier: BSD-3-Clause
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: AGPL-3.0-or-later
SPDX-License-Identifier: (MPL-2.0 OR Apache-2.0)
SPDX-License-Identifier: (MIT AND BSD-3-Clause)
SPDX-FileCopyrightText: string_decoder developers
SPDX-FileCopyrightText: ripemd160 developers
SPDX-FileCopyrightText: rhysd <lin90162@yahoo.co.jp>
SPDX-FileCopyrightText: readable-stream developers
SPDX-FileCopyrightText: qs developers
SPDX-FileCopyrightText: p-queue developers
SPDX-FileCopyrightText: omahlama
SPDX-FileCopyrightText: jden <jason@denizac.org>
SPDX-FileCopyrightText: inline-style-parser developers
SPDX-FileCopyrightText: inherits developers
SPDX-FileCopyrightText: escape-html developers
SPDX-FileCopyrightText: defunctzombie
SPDX-FileCopyrightText: debounce developers
SPDX-FileCopyrightText: date-fns developers
SPDX-FileCopyrightText: chenkai
SPDX-FileCopyrightText: browserify-sign developers
SPDX-FileCopyrightText: browserify-rsa developers
SPDX-FileCopyrightText: atomiks
SPDX-FileCopyrightText: Varun A P
SPDX-FileCopyrightText: Tobias Koppers @sokra
SPDX-FileCopyrightText: Titus Wormer <tituswormer@gmail.com> (https://wooorm.com)
SPDX-FileCopyrightText: The Babel Team (https://babel.dev/team)
SPDX-FileCopyrightText: T. Jameson Little <t.jameson.little@gmail.com>
SPDX-FileCopyrightText: Stefan Thomas <justmoon@members.fsf.org> (http://www.justmoon.net)
SPDX-FileCopyrightText: Sindre Sorhus
SPDX-FileCopyrightText: Shuhei Kagawa
SPDX-FileCopyrightText: Scott Cooper <scttcper@gmail.com>
SPDX-FileCopyrightText: Roman Shtylman <shtylman@gmail.com>
SPDX-FileCopyrightText: Roeland Jago Douma
SPDX-FileCopyrightText: Rob Cresswell <robcresswell@pm.me>
SPDX-FileCopyrightText: Raynos <raynos2@gmail.com>
SPDX-FileCopyrightText: Perry Mitchell <perry@perrymitchell.net>
SPDX-FileCopyrightText: Paul Vorbach <paul@vorba.ch> (http://paul.vorba.ch)
SPDX-FileCopyrightText: Paul Vorbach <paul@vorb.de> (http://vorb.de)
SPDX-FileCopyrightText: OpenJS Foundation and other contributors
SPDX-FileCopyrightText: Olivier Scherrer <pode.fr@gmail.com>
SPDX-FileCopyrightText: Nick Frasser (https://nfrasser.com)
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
SPDX-FileCopyrightText: Nathan Rajlich <nathan@tootallnate.net> (http://n8.io/)
SPDX-FileCopyrightText: Max <max@nextcloud.com>
SPDX-FileCopyrightText: Matt Zabriskie
SPDX-FileCopyrightText: Mathias Bynens
SPDX-FileCopyrightText: Mathias Buus (@mafintosh)
SPDX-FileCopyrightText: Mark <mark@remarkablemark.org>
SPDX-FileCopyrightText: Kirill Fomichev <fanatid@ya.ru> (https://github.com/fanatid)
SPDX-FileCopyrightText: Julian Gruber
SPDX-FileCopyrightText: Joyent
SPDX-FileCopyrightText: José F. Romaniello <jfromaniello@gmail.com> (http://joseoncode.com)
SPDX-FileCopyrightText: Jordan Humphreys <jordan@zurb.com>
SPDX-FileCopyrightText: Jordan Harband <ljharb@gmail.com>
SPDX-FileCopyrightText: Jordan Harband
SPDX-FileCopyrightText: Jordan Harbamd <ljharb@gmail.com>
SPDX-FileCopyrightText: Jonas Schade <derzade@gmail.com>
SPDX-FileCopyrightText: John-David Dalton <john.david.dalton@gmail.com>
SPDX-FileCopyrightText: John Hiesey
SPDX-FileCopyrightText: Jeff Sagal <sagalbot@gmail.com>
SPDX-FileCopyrightText: James Halliday
SPDX-FileCopyrightText: Jacob Clevenger<https://github.com/wheatjs>
SPDX-FileCopyrightText: Iskren Ivov Chernev <iskren.chernev@gmail.com> (https://github.com/ichernev)
SPDX-FileCopyrightText: Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)
SPDX-FileCopyrightText: Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)
SPDX-FileCopyrightText: Irakli Gozalishvili <rfobic@gmail.com> (http://jeditoolkit.com)
SPDX-FileCopyrightText: Guillaume Chau <guillaume.b.chau@gmail.com>
SPDX-FileCopyrightText: Guillaume Chau
SPDX-FileCopyrightText: GitHub Inc.
SPDX-FileCopyrightText: Feross Aboukhadijeh
SPDX-FileCopyrightText: Fedor Indutny <fedor@indutny.com>
SPDX-FileCopyrightText: Fedor Indutny
SPDX-FileCopyrightText: Evan You
SPDX-FileCopyrightText: Eugene Sharygin <eush77@gmail.com>
SPDX-FileCopyrightText: Eric Norris (https://github.com/ericnorris)
SPDX-FileCopyrightText: Eduardo San Martin Morote
SPDX-FileCopyrightText: Dylan Piercey <pierceydylan@gmail.com>
SPDX-FileCopyrightText: Dr.-Ing. Mario Heiderich, Cure53 <mario@cure53.de> (https://cure53.de/)
SPDX-FileCopyrightText: Dominic Tarr <dominic.tarr@gmail.com> (dominictarr.com)
SPDX-FileCopyrightText: David Clark
SPDX-FileCopyrightText: Daniel Cousens
SPDX-FileCopyrightText: Christoph Wurst
SPDX-FileCopyrightText: Calvin Metcalf <calvin.metcalf@gmail.com>
SPDX-FileCopyrightText: Calvin Metcalf
SPDX-FileCopyrightText: Borys Serebrov
SPDX-FileCopyrightText: Ben Drucker
SPDX-FileCopyrightText: Austin Andrews
SPDX-FileCopyrightText: Arnout Kazemier
SPDX-FileCopyrightText: Antoni Andre <antoniandre.web@gmail.com>
SPDX-FileCopyrightText: Anthony Fu <https://github.com/antfu>
SPDX-FileCopyrightText: Anthony Fu <anthonyfu117@hotmail.com>
SPDX-FileCopyrightText: Andrea Giammarchi
SPDX-FileCopyrightText: Amit Gupta (https://solothought.com)
SPDX-FileCopyrightText: Amit Gupta (https://amitkumargupta.work/)
SPDX-FileCopyrightText: Alkemics
SPDX-FileCopyrightText: @nextcloud/dialogs developers
SPDX-FileCopyrightText:
This file is generated from multiple sources. Included packages:
- @babel/runtime
- version: 7.28.4
- license: MIT
- @ctrl/tinycolor
- version: 3.6.1
- license: MIT
- @floating-ui/core
- version: 1.7.3
- license: MIT
- @floating-ui/dom
- version: 1.7.4
- license: MIT
- @floating-ui/utils
- version: 0.2.10
- license: MIT
- @mdi/svg
- version: 7.4.47
- license: Apache-2.0
- @nextcloud/auth
- version: 2.5.3
- license: GPL-3.0-or-later
- @nextcloud/axios
- version: 2.5.2
- license: GPL-3.0-or-later
- @nextcloud/browser-storage
- version: 0.5.0
- license: GPL-3.0-or-later
- @nextcloud/initial-state
- version: 2.2.0
- license: GPL-3.0-or-later
- @nextcloud/capabilities
- version: 1.2.0
- license: GPL-3.0-or-later
- @ckpack/vue-color
- version: 1.6.0
- license: MIT
- @nextcloud/browser-storage
- version: 0.4.0
- license: GPL-3.0-or-later
- @nextcloud/vue
- version: 9.0.1
- license: AGPL-3.0-or-later
- @vueuse/core
- version: 13.9.0
- license: MIT
- @vueuse/shared
- version: 13.9.0
- license: MIT
- eventemitter3
- version: 5.0.1
- license: MIT
- p-queue
- version: 9.0.0
- license: MIT
- rehype-react
- version: 8.0.0
- license: MIT
- splitpanes
- version: 4.0.4
- license: MIT
- vue-router
- version: 4.6.3
- license: MIT
- vue-select
- version: 4.0.0-beta.6
- license: MIT
- vue
- version: 3.5.22
- license: MIT
- @nextcloud/dialogs
- version: 7.1.0
- license: AGPL-3.0-or-later
- semver
- version: 7.7.2
- license: ISC
- @nextcloud/event-bus
- version: 3.3.2
- license: GPL-3.0-or-later
- @nextcloud/initial-state
- version: 2.2.0
- license: GPL-3.0-or-later
- @nextcloud/files
- version: 3.12.0
- license: AGPL-3.0-or-later
- @nextcloud/initial-state
- version: 3.0.0
- license: GPL-3.0-or-later
- @nextcloud/l10n
- version: 3.4.0
- license: GPL-3.0-or-later
- @nextcloud/logger
- version: 3.0.2
- license: GPL-3.0-or-later
- @nextcloud/moment
- version: 1.3.5
- license: GPL-3.0-or-later
- @nextcloud/paths
- version: 2.2.1
- license: GPL-3.0-or-later
- @nextcloud/router
- version: 3.0.1
- license: GPL-3.0-or-later
- @nextcloud/sharing
- version: 0.3.0
- license: GPL-3.0-or-later
- @nextcloud/browser-storage
- version: 0.4.0
- license: GPL-3.0-or-later
- @nextcloud/initial-state
- version: 2.2.0
- license: GPL-3.0-or-later
- @nextcloud/vue
- version: 8.31.0
- license: AGPL-3.0-or-later
- @ungap/structured-clone
- version: 1.3.0
- license: ISC
- @vue/devtools-api
- version: 6.6.4
- license: MIT
- @vue/reactivity
- version: 3.5.22
- license: MIT
- @vue/runtime-core
- version: 3.5.22
- license: MIT
- @vue/runtime-dom
- version: 3.5.22
- license: MIT
- @vue/shared
- version: 3.5.22
- license: MIT
- @vueuse/components
- version: 11.3.0
- license: MIT
- @vueuse/core
- version: 11.3.0
- license: MIT
- @vueuse/shared
- version: 11.3.0
- license: MIT
- bn.js
- version: 4.12.2
- license: MIT
- asn1.js
- version: 4.10.1
- license: MIT
- available-typed-arrays
- version: 1.0.7
- license: MIT
- axios
- version: 1.12.2
- license: MIT
- balanced-match
- version: 1.0.2
- license: MIT
- base-64
- version: 1.0.0
- license: MIT
- base64-js
- version: 1.5.1
- license: MIT
- blurhash
- version: 2.0.5
- license: MIT
- bn.js
- version: 5.2.2
- license: MIT
- brace-expansion
- version: 2.0.2
- license: MIT
- brorand
- version: 1.1.0
- license: MIT
- browserify-aes
- version: 1.2.0
- license: MIT
- browserify-cipher
- version: 1.0.1
- license: MIT
- browserify-des
- version: 1.0.2
- license: MIT
- browserify-rsa
- version: 4.1.1
- license: MIT
- browserify-sign
- version: 4.2.5
- license: ISC
- buffer-xor
- version: 1.0.3
- license: MIT
- buffer
- version: 5.7.1
- license: MIT
- builtin-status-codes
- version: 3.0.0
- license: MIT
- byte-length
- version: 1.0.2
- license: MIT
- call-bind-apply-helpers
- version: 1.0.2
- license: MIT
- call-bind
- version: 1.0.8
- license: MIT
- call-bound
- version: 1.0.4
- license: MIT
- cancelable-promise
- version: 4.3.1
- license: MIT
- charenc
- version: 0.0.2
- license: BSD-3-Clause
- cipher-base
- version: 1.0.7
- license: MIT
- comma-separated-tokens
- version: 2.0.3
- license: MIT
- core-util-is
- version: 1.0.3
- license: MIT
- bn.js
- version: 4.12.2
- license: MIT
- create-ecdh
- version: 4.0.4
- license: MIT
- create-hash
- version: 1.2.0
- license: MIT
- create-hmac
- version: 1.1.7
- license: MIT
- crypt
- version: 0.0.2
- license: BSD-3-Clause
- crypto-browserify
- version: 3.12.1
- license: MIT
- css-loader
- version: 7.1.2
- license: MIT
- date-fns
- version: 4.1.0
- license: MIT
- debounce
- version: 2.2.0
- license: MIT
- decode-named-character-reference
- version: 1.2.0
- license: MIT
- define-data-property
- version: 1.1.4
- license: MIT
- des.js
- version: 1.1.0
- license: MIT
- devlop
- version: 1.1.0
- license: MIT
- bn.js
- version: 4.12.2
- license: MIT
- diffie-hellman
- version: 5.0.3
- license: MIT
- dompurify
- version: 3.2.7
- license: (MPL-2.0 OR Apache-2.0)
- dunder-proto
- version: 1.0.1
- license: MIT
- bn.js
- version: 4.12.2
- license: MIT
- elliptic
- version: 6.6.1
- license: MIT
- emoji-mart-vue-fast
- version: 15.0.5
- license: BSD-3-Clause
- es-define-property
- version: 1.0.1
- license: MIT
- es-errors
- version: 1.3.0
- license: MIT
- es-object-atoms
- version: 1.1.1
- license: MIT
- escape-html
- version: 1.0.3
- license: MIT
- estree-util-is-identifier-name
- version: 3.0.0
- license: MIT
- events
- version: 3.3.0
- license: MIT
- evp_bytestokey
- version: 1.0.3
- license: MIT
- extend
- version: 3.0.2
- license: MIT
- floating-vue
- version: 1.0.0-beta.19
- license: MIT
- focus-trap
- version: 7.6.5
- license: MIT
- for-each
- version: 0.3.5
- license: MIT
- function-bind
- version: 1.1.2
- license: MIT
- generator-function
- version: 2.0.1
- license: MIT
- get-intrinsic
- version: 1.3.0
- license: MIT
- get-proto
- version: 1.0.1
- license: MIT
- gopd
- version: 1.2.0
- license: MIT
- has-property-descriptors
- version: 1.0.2
- license: MIT
- has-symbols
- version: 1.1.0
- license: MIT
- has-tostringtag
- version: 1.0.2
- license: MIT
- hash-base
- version: 3.0.5
- license: MIT
- hash.js
- version: 1.1.7
- license: MIT
- hasown
- version: 2.0.2
- license: MIT
- hast-util-is-element
- version: 3.0.0
- license: MIT
- hast-util-whitespace
- version: 3.0.0
- license: MIT
- property-information
- version: 7.1.0
- license: MIT
- hast-util-to-jsx-runtime
- version: 2.3.6
- license: MIT
- hmac-drbg
- version: 1.0.1
- license: MIT
- hot-patcher
- version: 2.0.1
- license: MIT
- https-browserify
- version: 1.0.0
- license: MIT
- ieee754
- version: 1.2.1
- license: BSD-3-Clause
- inherits
- version: 2.0.4
- license: ISC
- is-absolute-url
- version: 4.0.1
- license: MIT
- is-arguments
- version: 1.2.0
- license: MIT
- is-buffer
- version: 1.1.6
- license: MIT
- is-callable
- version: 1.2.7
- license: MIT
- is-generator-function
- version: 1.1.2
- license: MIT
- is-regex
- version: 1.2.1
- license: MIT
- is-typed-array
- version: 1.1.15
- license: MIT
- isarray
- version: 1.0.0
- license: MIT
- jquery
- version: 3.7.1
- license: MIT
- layerr
- version: 3.0.0
- license: MIT
- linkifyjs
- version: 4.3.2
- license: MIT
- lodash
- version: 4.17.21
- license: MIT
- material-colors
- version: 1.2.6
- license: ISC
- math-intrinsics
- version: 1.1.0
- license: MIT
- md5.js
- version: 1.3.5
- license: MIT
- md5
- version: 2.3.0
- license: BSD-3-Clause
- mdast-squeeze-paragraphs
- version: 6.0.0
- license: MIT
- escape-string-regexp
- version: 5.0.0
- license: MIT
- mdast-util-find-and-replace
- version: 3.0.2
- license: MIT
- mdast-util-from-markdown
- version: 2.0.2
- license: MIT
- mdast-util-newline-to-break
- version: 2.0.0
- license: MIT
- mdast-util-to-hast
- version: 13.2.0
- license: MIT
- mdast-util-to-string
- version: 4.0.0
- license: MIT
- micromark-core-commonmark
- version: 2.0.3
- license: MIT
- micromark-factory-destination
- version: 2.0.1
- license: MIT
- micromark-factory-label
- version: 2.0.1
- license: MIT
- micromark-factory-space
- version: 2.0.1
- license: MIT
- micromark-factory-title
- version: 2.0.1
- license: MIT
- micromark-factory-whitespace
- version: 2.0.1
- license: MIT
- micromark-util-character
- version: 2.1.1
- license: MIT
- micromark-util-chunked
- version: 2.0.1
- license: MIT
- micromark-util-classify-character
- version: 2.0.1
- license: MIT
- micromark-util-combine-extensions
- version: 2.0.1
- license: MIT
- micromark-util-decode-numeric-character-reference
- version: 2.0.2
- license: MIT
- micromark-util-decode-string
- version: 2.0.1
- license: MIT
- micromark-util-encode
- version: 2.0.1
- license: MIT
- micromark-util-html-tag-name
- version: 2.0.1
- license: MIT
- micromark-util-normalize-identifier
- version: 2.0.1
- license: MIT
- micromark-util-resolve-all
- version: 2.0.1
- license: MIT
- micromark-util-sanitize-uri
- version: 2.0.1
- license: MIT
- micromark-util-subtokenize
- version: 2.1.0
- license: MIT
- micromark
- version: 4.0.2
- license: MIT
- bn.js
- version: 4.12.2
- license: MIT
- miller-rabin
- version: 4.0.1
- license: MIT
- minimalistic-assert
- version: 1.0.1
- license: ISC
- minimalistic-crypto-utils
- version: 1.0.1
- license: MIT
- moment
- version: 2.30.1
- license: MIT
- nested-property
- version: 4.0.0
- license: MIT
- buffer
- version: 6.0.3
- license: MIT
- object-inspect
- version: 1.13.4
- license: MIT
- parse-asn1
- version: 5.1.9
- license: ISC
- path-posix
- version: 1.0.0
- license: ISC
- inherits
- version: 2.0.3
- license: ISC
- util
- version: 0.10.4
- license: MIT
- path
- version: 0.12.7
- license: MIT
- pbkdf2
- version: 3.1.5
- license: MIT
- possible-typed-array-names
- version: 1.1.0
- license: MIT
- process-nextick-args
- version: 2.0.1
- license: MIT
- process
- version: 0.11.10
- license: MIT
- bn.js
- version: 4.12.2
- license: MIT
- public-encrypt
- version: 4.0.3
- license: MIT
- punycode
- version: 1.4.1
- license: MIT
- qs
- version: 6.14.0
- license: BSD-3-Clause
- querystringify
- version: 2.2.0
- license: MIT
- randombytes
- version: 2.1.0
- license: MIT
- randomfill
- version: 1.0.4
- license: MIT
- safe-buffer
- version: 5.1.2
- license: MIT
- string_decoder
- version: 1.1.1
- license: MIT
- readable-stream
- version: 2.3.8
- license: MIT
- rehype-external-links
- version: 3.0.0
- license: MIT
- remark-breaks
- version: 4.0.0
- license: MIT
- remark-parse
- version: 11.0.0
- license: MIT
- remark-rehype
- version: 11.1.2
- license: MIT
- remark-unlink-protocols
- version: 1.0.0
- license: MIT
- requires-port
- version: 1.0.0
- license: MIT
- hash-base
- version: 3.1.2
- license: MIT
- ripemd160
- version: 2.0.3
- license: MIT
- safe-buffer
- version: 5.2.1
- license: MIT
- safe-regex-test
- version: 1.1.0
- license: MIT
- set-function-length
- version: 1.2.2
- license: MIT
- sha.js
- version: 2.4.12
- license: (MIT AND BSD-3-Clause)
- side-channel-list
- version: 1.0.0
- license: MIT
- side-channel-map
- version: 1.0.1
- license: MIT
- side-channel-weakmap
- version: 1.0.2
- license: MIT
- side-channel
- version: 1.1.0
- license: MIT
- space-separated-tokens
- version: 2.0.2
- license: MIT
- readable-stream
- version: 3.6.2
- license: MIT
- stream-browserify
- version: 3.0.0
- license: MIT
- readable-stream
- version: 3.6.2
- license: MIT
- stream-http
- version: 3.2.0
- license: MIT
- string_decoder
- version: 1.3.0
- license: MIT
- striptags
- version: 3.2.0
- license: MIT
- style-loader
- version: 4.0.0
- license: MIT
- inline-style-parser
- version: 0.2.4
- license: MIT
- style-to-object
- version: 1.0.11
- license: MIT
- style-to-js
- version: 1.1.18
- license: MIT
- tabbable
- version: 6.2.0
- license: MIT
- isarray
- version: 2.0.5
- license: MIT
- to-buffer
- version: 1.2.2
- license: MIT
- toastify-js
- version: 1.12.0
- license: MIT
- tributejs
- version: 5.1.3
- license: MIT
- trim-lines
- version: 3.0.1
- license: MIT
- trough
- version: 2.2.0
- license: MIT
- typed-array-buffer
- version: 1.0.3
- license: MIT
- typescript-event-target
- version: 1.1.1
- license: MIT
- unified
- version: 11.0.5
- license: MIT
- unist-builder
- version: 4.0.0
- license: MIT
- unist-util-is
- version: 6.0.0
- license: MIT
- unist-util-position
- version: 5.0.0
- license: MIT
- unist-util-stringify-position
- version: 4.0.0
- license: MIT
- unist-util-visit-parents
- version: 6.0.1
- license: MIT
- unist-util-visit
- version: 5.0.0
- license: MIT
- url-join
- version: 5.0.0
- license: MIT
- url-parse
- version: 1.5.10
- license: MIT
- url
- version: 0.11.4
- license: MIT
- util-deprecate
- version: 1.0.2
- license: MIT
- util
- version: 0.12.5
- license: MIT
- v-tooltip
- version: 2.1.3
- license: MIT
- vfile-message
- version: 4.0.3
- license: MIT
- vfile
- version: 6.0.3
- license: MIT
- vm-browserify
- version: 1.1.2
- license: MIT
- vue-demi
- version: 0.14.10
- license: MIT
- vue-loader
- version: 15.11.1
- license: MIT
- vue-material-design-icons
- version: 5.3.1
- license: MIT
- vue
- version: 2.7.16
- license: MIT
- fast-xml-parser
- version: 4.5.3
- license: MIT
- minimatch
- version: 9.0.5
- license: ISC
- strnum
- version: 1.1.2
- license: MIT
- webdav
- version: 5.8.0
- license: MIT
- webpack
- version: 5.102.0
- license: MIT
- which-typed-array
- version: 1.1.19
- license: MIT
- xtend
- version: 4.0.2
- license: MIT
- nextcloud
- version: 1.0.0
- license: AGPL-3.0-or-later

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
files_versions-files_versions.js.license

4
dist/files_versions-sidebar-tab.css vendored Normal file
View file

@ -0,0 +1,4 @@
/* extracted by css-entry-points-plugin */
@import './files_versions-files_versions-sidebar-tab-4BohXFH5.chunk.css';
@import './_plugin-vue_export-helper-BE4hS1RR.chunk.css';
@import './TrayArrowDown-nyVG1sMv.chunk.css';

397
dist/files_versions-sidebar-tab.mjs vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,68 @@
SPDX-License-Identifier: AGPL-3.0-or-later
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: GPL-3.0-or-later
SPDX-License-Identifier: MIT
SPDX-FileCopyrightText: Alkemics
SPDX-FileCopyrightText: Andris Reinman
SPDX-FileCopyrightText: Austin Andrews
SPDX-FileCopyrightText: Christoph Wurst
SPDX-FileCopyrightText: Denis Pushkarev
SPDX-FileCopyrightText: Iskren Ivov Chernev <iskren.chernev@gmail.com> (https://github.com/ichernev)
SPDX-FileCopyrightText: James Halliday
SPDX-FileCopyrightText: John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
SPDX-FileCopyrightText: Rob Cresswell <robcresswell@pm.me>
SPDX-FileCopyrightText: string_decoder developers
This file is generated from multiple sources. Included packages:
- @mdi/svg
- version: 7.4.47
- license: Apache-2.0
- @nextcloud/files
- version: 3.12.0
- license: AGPL-3.0-or-later
- @nextcloud/initial-state
- version: 2.2.0
- license: GPL-3.0-or-later
- @nextcloud/l10n
- version: 1.6.0
- license: GPL-3.0-or-later
- @nextcloud/moment
- version: 1.2.1
- license: GPL-3.0-or-later
- @nextcloud/paths
- version: 2.2.1
- license: GPL-3.0-or-later
- @nextcloud/sharing
- version: 0.2.5
- license: GPL-3.0-or-later
- @nextcloud/vue
- version: 9.0.1
- license: AGPL-3.0-or-later
- cancelable-promise
- version: 4.3.1
- license: MIT
- core-js
- version: 3.46.0
- license: MIT
- lodash.get
- version: 4.4.2
- license: MIT
- moment
- version: 2.30.1
- license: MIT
- nextcloud-ui
- version: 1.0.0
- license: AGPL-3.0-or-later
- node-gettext
- version: 3.0.0
- license: MIT
- path-browserify
- version: 1.0.1
- license: MIT
- string_decoder
- version: 1.1.1
- license: MIT
- vue-material-design-icons
- version: 5.3.1
- license: MIT

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,68 @@
SPDX-License-Identifier: AGPL-3.0-or-later
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: GPL-3.0-or-later
SPDX-License-Identifier: MIT
SPDX-FileCopyrightText: Alkemics
SPDX-FileCopyrightText: Andris Reinman
SPDX-FileCopyrightText: Austin Andrews
SPDX-FileCopyrightText: Christoph Wurst
SPDX-FileCopyrightText: Denis Pushkarev
SPDX-FileCopyrightText: Iskren Ivov Chernev <iskren.chernev@gmail.com> (https://github.com/ichernev)
SPDX-FileCopyrightText: James Halliday
SPDX-FileCopyrightText: John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
SPDX-FileCopyrightText: Rob Cresswell <robcresswell@pm.me>
SPDX-FileCopyrightText: string_decoder developers
This file is generated from multiple sources. Included packages:
- @mdi/svg
- version: 7.4.47
- license: Apache-2.0
- @nextcloud/files
- version: 3.12.0
- license: AGPL-3.0-or-later
- @nextcloud/initial-state
- version: 2.2.0
- license: GPL-3.0-or-later
- @nextcloud/l10n
- version: 1.6.0
- license: GPL-3.0-or-later
- @nextcloud/moment
- version: 1.2.1
- license: GPL-3.0-or-later
- @nextcloud/paths
- version: 2.2.1
- license: GPL-3.0-or-later
- @nextcloud/sharing
- version: 0.2.5
- license: GPL-3.0-or-later
- @nextcloud/vue
- version: 9.0.1
- license: AGPL-3.0-or-later
- cancelable-promise
- version: 4.3.1
- license: MIT
- core-js
- version: 3.46.0
- license: MIT
- lodash.get
- version: 4.4.2
- license: MIT
- moment
- version: 2.30.1
- license: MIT
- nextcloud-ui
- version: 1.0.0
- license: AGPL-3.0-or-later
- node-gettext
- version: 3.0.0
- license: MIT
- path-browserify
- version: 1.0.1
- license: MIT
- string_decoder
- version: 1.1.1
- license: MIT
- vue-material-design-icons
- version: 5.3.1
- license: MIT

11
dist/index-CfphtJqj.chunk.mjs vendored Normal file

File diff suppressed because one or more lines are too long

11
dist/index-CfphtJqj.chunk.mjs.license vendored Normal file
View file

@ -0,0 +1,11 @@
SPDX-License-Identifier: MIT
SPDX-FileCopyrightText: Perry Mitchell <perry@perrymitchell.net>
SPDX-FileCopyrightText: Rob Cresswell <robcresswell@pm.me>
This file is generated from multiple sources. Included packages:
- vue-material-design-icons
- version: 5.3.1
- license: MIT
- webdav
- version: 5.8.0
- license: MIT

1
dist/index-CfphtJqj.chunk.mjs.map vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,11 @@
SPDX-License-Identifier: MIT
SPDX-FileCopyrightText: Perry Mitchell <perry@perrymitchell.net>
SPDX-FileCopyrightText: Rob Cresswell <robcresswell@pm.me>
This file is generated from multiple sources. Included packages:
- vue-material-design-icons
- version: 5.3.1
- license: MIT
- webdav
- version: 5.8.0
- license: MIT

File diff suppressed because one or more lines are too long

View file

@ -1,2 +0,0 @@
import{g as t}from"./index-hZPKu-D6-DGE8lsH0.chunk.mjs";const o=t().setApp("dav").detectUser().build();export{o as l};
//# sourceMappingURL=logger-Cbb8pkmX.chunk.mjs.map

2
dist/logger-Zb8_gTh1.chunk.mjs vendored Normal file
View file

@ -0,0 +1,2 @@
import{g as t}from"./TrayArrowDown-D26Art6z.chunk.mjs";const o=t().setApp("dav").detectUser().build();export{o as l};
//# sourceMappingURL=logger-Zb8_gTh1.chunk.mjs.map

View file

@ -1 +1 @@
{"version":3,"file":"logger-Cbb8pkmX.chunk.mjs","sources":["../build/frontend/apps/dav/src/service/logger.ts"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport const logger = getLoggerBuilder()\n\t.setApp('dav')\n\t.detectUser()\n\t.build()\n"],"names":["logger","getLoggerBuilder"],"mappings":"wDAOO,MAAMA,EAASC,IACpB,OAAO,KAAK,EACZ,WAAA,EACA,MAAA"}
{"version":3,"file":"logger-Zb8_gTh1.chunk.mjs","sources":["../build/frontend/apps/dav/src/service/logger.ts"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport const logger = getLoggerBuilder()\n\t.setApp('dav')\n\t.detectUser()\n\t.build()\n"],"names":["logger","getLoggerBuilder"],"mappings":"uDAOO,MAAMA,EAASC,IACpB,OAAO,KAAK,EACZ,WAAA,EACA,MAAA"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -25,7 +25,6 @@ SPDX-FileCopyrightText: Varun A P
SPDX-FileCopyrightText: Tobias Koppers @sokra
SPDX-FileCopyrightText: Titus Wormer <tituswormer@gmail.com> (https://wooorm.com)
SPDX-FileCopyrightText: Thorsten Lünborg
SPDX-FileCopyrightText: The Babel Team (https://babel.dev/team)
SPDX-FileCopyrightText: T. Jameson Little <t.jameson.little@gmail.com>
SPDX-FileCopyrightText: Stefan Thomas <justmoon@members.fsf.org> (http://www.justmoon.net)
SPDX-FileCopyrightText: Sindre Sorhus
@ -54,7 +53,6 @@ SPDX-FileCopyrightText: Jeff Sagal <sagalbot@gmail.com>
SPDX-FileCopyrightText: James Halliday
SPDX-FileCopyrightText: Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)
SPDX-FileCopyrightText: Irakli Gozalishvili <rfobic@gmail.com> (http://jeditoolkit.com)
SPDX-FileCopyrightText: Guillaume Chau <guillaume.b.chau@gmail.com>
SPDX-FileCopyrightText: Guillaume Chau
SPDX-FileCopyrightText: GitHub Inc.
SPDX-FileCopyrightText: Feross Aboukhadijeh
@ -83,9 +81,6 @@ SPDX-FileCopyrightText:
This file is generated from multiple sources. Included packages:
- @babel/runtime
- version: 7.28.4
- license: MIT
- @ctrl/tinycolor
- version: 3.6.1
- license: MIT
@ -701,9 +696,6 @@ This file is generated from multiple sources. Included packages:
- util-deprecate
- version: 1.0.2
- license: MIT
- v-tooltip
- version: 2.1.3
- license: MIT
- vfile-message
- version: 4.0.3
- license: MIT

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -24,7 +24,6 @@ SPDX-FileCopyrightText: atomiks
SPDX-FileCopyrightText: Varun A P
SPDX-FileCopyrightText: Tobias Koppers @sokra
SPDX-FileCopyrightText: Titus Wormer <tituswormer@gmail.com> (https://wooorm.com)
SPDX-FileCopyrightText: The Babel Team (https://babel.dev/team)
SPDX-FileCopyrightText: T. Jameson Little <t.jameson.little@gmail.com>
SPDX-FileCopyrightText: Stefan Thomas <justmoon@members.fsf.org> (http://www.justmoon.net)
SPDX-FileCopyrightText: Sindre Sorhus
@ -81,9 +80,6 @@ SPDX-FileCopyrightText:
This file is generated from multiple sources. Included packages:
- @babel/runtime
- version: 7.28.4
- license: MIT
- @chenfengyuan/vue-qrcode
- version: 1.0.2
- license: MIT
@ -690,9 +686,6 @@ This file is generated from multiple sources. Included packages:
- util-deprecate
- version: 1.0.2
- license: MIT
- v-tooltip
- version: 2.1.3
- license: MIT
- vfile-message
- version: 4.0.3
- license: MIT

File diff suppressed because one or more lines are too long

View file

@ -1,3 +1,3 @@
/* extracted by css-entry-points-plugin */
@import './_plugin-vue_export-helper-BE4hS1RR.chunk.css';
@import './index-hZPKu-D6-nyVG1sMv.chunk.css';
@import './TrayArrowDown-nyVG1sMv.chunk.css';

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

46
package-lock.json generated
View file

@ -14,6 +14,7 @@
"@nextcloud/axios": "^2.5.2",
"@nextcloud/calendar-availability-vue": "^3.0.0",
"@nextcloud/dialogs": "^7.1.0",
"@nextcloud/moment": "^1.2.1",
"@nextcloud/password-confirmation": "^6.0.1",
"@nextcloud/paths": "^2.2.1",
"@nextcloud/vue": "^9.0.1",
@ -2385,6 +2386,29 @@
"npm": "^10.0.0"
}
},
"node_modules/@nextcloud/moment": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@nextcloud/moment/-/moment-1.2.1.tgz",
"integrity": "sha512-v/yfrZ4Jo8YM1v0DLXKjRLwKOhzE4Y6DcgyZAM1vJ5jOMvkHpICuTDJRw8oOtrr/1H6FqI6EMZcYogeGD+rwSA==",
"license": "GPL-3.0-or-later",
"dependencies": {
"@nextcloud/l10n": "^1.4.1",
"core-js": "^3.21.1",
"jed": "^1.1.1",
"moment": "^2.29.2",
"node-gettext": "^3.0.0"
}
},
"node_modules/@nextcloud/moment/node_modules/@nextcloud/l10n": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@nextcloud/l10n/-/l10n-1.6.0.tgz",
"integrity": "sha512-aKGlgrwN9OiafN791sYus0shfwNeU3PlrH6Oi9ISma6iJSvN6a8aJM8WGKCJ9pqBaTR5PrDuckuM/WnybBWb6A==",
"license": "GPL-3.0-or-later",
"dependencies": {
"core-js": "^3.6.4",
"node-gettext": "^3.0.0"
}
},
"node_modules/@nextcloud/password-confirmation": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/@nextcloud/password-confirmation/-/password-confirmation-6.0.1.tgz",
@ -10215,6 +10239,12 @@
"@pkgjs/parseargs": "^0.11.0"
}
},
"node_modules/jed": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz",
"integrity": "sha512-z35ZSEcXHxLW4yumw0dF6L464NT36vmx3wxJw8MDpraBcWuNVgUPZgPJKcu1HekNgwlMFNqol7i/IpSbjhqwqA==",
"license": "MIT"
},
"node_modules/jju": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
@ -10977,6 +11007,13 @@
"dev": true,
"license": "MIT"
},
"node_modules/lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
"deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.",
"license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@ -12128,7 +12165,6 @@
"version": "2.30.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
"integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
"dev": true,
"license": "MIT",
"engines": {
"node": "*"
@ -12241,6 +12277,14 @@
"url": "https://opencollective.com/node-fetch"
}
},
"node_modules/node-gettext": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/node-gettext/-/node-gettext-3.0.0.tgz",
"integrity": "sha512-/VRYibXmVoN6tnSAY2JWhNRhWYJ8Cd844jrZU/DwLVoI4vBI6ceYbd8i42sYZ9uOgDH3S7vslIKOWV/ZrT2YBA==",
"dependencies": {
"lodash.get": "^4.4.2"
}
},
"node_modules/node-releases": {
"version": "2.0.26",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz",

View file

@ -43,6 +43,7 @@
"@nextcloud/axios": "^2.5.2",
"@nextcloud/calendar-availability-vue": "^3.0.0",
"@nextcloud/dialogs": "^7.1.0",
"@nextcloud/moment": "^1.2.1",
"@nextcloud/password-confirmation": "^6.0.1",
"@nextcloud/paths": "^2.2.1",
"@nextcloud/vue": "^9.0.1",