Merge pull request #56067 from nextcloud/refactor/twofactor-vue3

refactor(twofactor_backupcodes): migrate to Typescript and Vue 3
This commit is contained in:
Ferdinand Thiessen 2025-11-01 13:41:04 +01:00 committed by GitHub
commit f67d90ab27
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
88 changed files with 490 additions and 486 deletions

View file

@ -9,6 +9,7 @@ declare(strict_types=1);
namespace OCA\TwoFactorBackupCodes\Settings;
use OCA\TwoFactorBackupCodes\AppInfo\Application;
use OCP\Authentication\TwoFactorAuth\IPersonalProviderSettings;
use OCP\Server;
use OCP\Template\ITemplate;
@ -16,6 +17,9 @@ use OCP\Template\ITemplateManager;
class Personal implements IPersonalProviderSettings {
public function getBody(): ITemplate {
return Server::get(ITemplateManager::class)->getTemplate('twofactor_backupcodes', 'personal');
\OCP\Util::addScript(Application::APP_ID, 'settings-personal');
\OCP\Util::addStyle(Application::APP_ID, 'settings-personal');
return Server::get(ITemplateManager::class)
->getTemplate('twofactor_backupcodes', 'personal');
}
}

View file

@ -1,16 +0,0 @@
/**
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import Axios from '@nextcloud/axios'
import { generateUrl } from '@nextcloud/router'
/**
*
*/
export function generateCodes() {
const url = generateUrl('/apps/twofactor_backupcodes/settings/create')
return Axios.post(url, {}).then((resp) => resp.data)
}

View file

@ -0,0 +1,28 @@
/**
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import axios from '@nextcloud/axios'
import { generateUrl } from '@nextcloud/router'
export interface ITwoFactorBackupCodesState {
enabled: boolean
total: number
used: number
}
export interface IApiResponse {
codes: string[]
state: ITwoFactorBackupCodesState
}
/**
* Generate new backup codes
*/
export async function generateCodes(): Promise<IApiResponse> {
const url = generateUrl('/apps/twofactor_backupcodes/settings/create')
const { data } = await axios.post<IApiResponse>(url)
return data
}

View file

@ -1,16 +0,0 @@
/**
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/**
* @param {any} data -
*/
export function print(data) {
const name = OC.theme.name || 'Nextcloud'
const newTab = window.open('', t('twofactor_backupcodes', '{name} backup codes', { name }))
newTab.document.write('<h1>' + t('twofactor_backupcodes', '{name} backup codes', { name }) + '</h1>')
newTab.document.write('<pre>' + data + '</pre>')
newTab.print()
newTab.close()
}

View file

@ -0,0 +1,39 @@
/*!
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { getCapabilities } from '@nextcloud/capabilities'
import { showError } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
/**
* Open a new tab and print the given backup codes
*
* @param data - The backup codes to print
*/
export function print(data: string[]): void {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const name = (getCapabilities() as any).theming.name || 'Nextcloud'
const newTab = window.open('', t('twofactor_backupcodes', '{name} backup codes', { name }))
if (!newTab) {
showError(t('twofactor_backupcodes', 'Unable to open a new tab for printing'))
throw new Error('Unable to open a new tab for printing')
}
const heading = newTab.document.createElement('h1')
heading.textContent = t('twofactor_backupcodes', '{name} backup codes', { name })
const pre = newTab.document.createElement('pre')
for (const code of data) {
const codeLine = newTab.document.createTextNode(code)
pre.appendChild(codeLine)
pre.appendChild(newTab.document.createElement('br'))
}
newTab.document.body.innerHTML = ''
newTab.document.body.appendChild(heading)
newTab.document.body.appendChild(pre)
newTab.print()
newTab.close()
}

View file

@ -8,3 +8,4 @@ import { getLoggerBuilder } from '@nextcloud/logger'
export const logger = getLoggerBuilder()
.detectLogLevel()
.setApp('twofactor_backupcodes')
.build()

View file

@ -0,0 +1,13 @@
/**
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { createPinia } from 'pinia'
import { createApp } from 'vue'
import PersonalSettings from './views/PersonalSettings.vue'
const pinia = createPinia()
const app = createApp(PersonalSettings)
app.use(pinia)
app.mount('#twofactor-backupcodes-settings')

View file

@ -1,19 +0,0 @@
/**
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { loadState } from '@nextcloud/initial-state'
import Vue from 'vue'
import PersonalSettings from './views/PersonalSettings.vue'
import store from './store.js'
Vue.prototype.t = t
const initialState = loadState('twofactor_backupcodes', 'state')
store.replaceState(initialState)
const View = Vue.extend(PersonalSettings)
new View({
store,
}).$mount('#twofactor-backupcodes-settings')

View file

@ -1,53 +0,0 @@
/**
* SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import Vue from 'vue'
import Vuex, { Store } from 'vuex'
import { generateCodes } from './service/BackupCodesService.js'
Vue.use(Vuex)
const state = {
enabled: false,
total: 0,
used: 0,
codes: [],
}
const mutations = {
setEnabled(state, enabled) {
Vue.set(state, 'enabled', enabled)
},
setTotal(state, total) {
Vue.set(state, 'total', total)
},
setUsed(state, used) {
Vue.set(state, 'used', used)
},
setCodes(state, codes) {
Vue.set(state, 'codes', codes)
},
}
const actions = {
generate({ commit }) {
commit('setEnabled', false)
return generateCodes().then(({ codes, state }) => {
commit('setEnabled', state.enabled)
commit('setTotal', state.total)
commit('setUsed', state.used)
commit('setCodes', codes)
return true
})
},
}
export default new Store({
strict: !PRODUCTION,
state,
mutations,
actions,
})

View file

@ -0,0 +1,42 @@
/**
* SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import type { ITwoFactorBackupCodesState } from '../service/BackupCodesService.ts'
import { loadState } from '@nextcloud/initial-state'
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { generateCodes } from '../service/BackupCodesService.ts'
const initialState = loadState<ITwoFactorBackupCodesState>('twofactor_backupcodes', 'state')
export const useStore = defineStore('twofactor_backupcodes', () => {
const enabled = ref(initialState.enabled)
const total = ref(initialState.total)
const used = ref(initialState.used)
const codes = ref<string[]>([])
/**
* Generate new backup codes and update the store state
*/
async function generate(): Promise<void> {
enabled.value = false
const { codes: newCodes, state } = await generateCodes()
enabled.value = state.enabled
total.value = state.total
used.value = state.used
codes.value = newCodes
}
return {
enabled,
total,
used,
codes,
generate,
}
})

View file

@ -2,12 +2,71 @@
- SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
import { getCapabilities } from '@nextcloud/capabilities'
import { showError } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
import { confirmPassword } from '@nextcloud/password-confirmation'
import { computed, ref } from 'vue'
import NcButton from '@nextcloud/vue/components/NcButton'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import { logger } from '../service/logger.ts'
import { print } from '../service/PrintService.js'
import { useStore } from '../store/index.ts'
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const instanceName = (getCapabilities() as any).theming.name ?? 'Nextcloud'
const store = useStore()
const generatingCodes = ref(false)
const hasCodes = computed(() => {
return store.codes && store.codes.length > 0
})
const downloadFilename = instanceName + '-backup-codes.txt'
const downloadUrl = computed(() => {
if (!hasCodes.value) {
return ''
}
return 'data:text/plain,' + encodeURIComponent(store.codes.reduce((prev, code) => {
return prev + code + '\n'
}, ''))
})
/**
* Generate new backup codes
*/
async function generateBackupCodes() {
await confirmPassword()
// Hide old codes
generatingCodes.value = true
try {
await store.generate()
} catch (error) {
logger.error('Error generating backup codes', { error })
showError(t('twofactor_backupcodes', 'An error occurred while generating your backup codes'))
} finally {
generatingCodes.value = false
}
}
/**
* Print the backup codes
*/
function printCodes() {
print(!store.codes || store.codes.length === 0 ? [] : store.codes)
}
</script>
<template>
<div class="backupcodes-settings">
<div :class="$style.backupcodesSettings">
<NcButton
v-if="!enabled"
id="generate-backup-codes"
v-if="!store.enabled"
:disabled="generatingCodes"
variant="primary"
@click="generateBackupCodes">
<template #icon>
<NcLoadingIcon v-if="generatingCodes" />
@ -15,39 +74,40 @@
{{ t('twofactor_backupcodes', 'Generate backup codes') }}
</NcButton>
<template v-else>
<p class="backupcodes-settings__codes">
<template v-if="!haveCodes">
{{ t('twofactor_backupcodes', 'Backup codes have been generated. {used} of {total} codes have been used.', { used, total }) }}
<p>
<template v-if="!hasCodes">
{{ t('twofactor_backupcodes', 'Backup codes have been generated. {used} of {total} codes have been used.', { used: store.used, total: store.total }) }}
</template>
<template v-else>
{{ t('twofactor_backupcodes', 'These are your backup codes. Please save and/or print them as you will not be able to read the codes again later.') }}
<ul>
<ul :aria-label="t('twofactor_backupcodes', 'List of backup codes')">
<li
v-for="code in codes"
v-for="code in store.codes"
:key="code"
class="backupcodes-settings__codes__code">
:class="$style.backupcodesSettings__code">
{{ code }}
</li>
</ul>
</template>
</p>
<p class="backupcodes-settings__actions">
<template v-if="haveCodes">
<p :class="$style.backupcodesSettings__actions">
<NcButton
id="generate-backup-codes"
variant="error"
@click="generateBackupCodes">
{{ t('twofactor_backupcodes', 'Regenerate backup codes') }}
</NcButton>
<template v-if="hasCodes">
<NcButton @click="printCodes">
{{ t('twofactor_backupcodes', 'Print backup codes') }}
</NcButton>
<NcButton
:href="downloadUrl"
:download="downloadFilename"
variant="primary">
{{ t('twofactor_backupcodes', 'Save backup codes') }}
</NcButton>
<NcButton @click="printCodes">
{{ t('twofactor_backupcodes', 'Print backup codes') }}
</NcButton>
</template>
<NcButton
id="generate-backup-codes"
@click="generateBackupCodes">
{{ t('twofactor_backupcodes', 'Regenerate backup codes') }}
</NcButton>
</p>
<p>
<em>
@ -58,113 +118,21 @@
</div>
</template>
<script>
import { confirmPassword } from '@nextcloud/password-confirmation'
import NcButton from '@nextcloud/vue/components/NcButton'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import { logger } from '../logger.ts'
import { print } from '../service/PrintService.js'
export default {
name: 'PersonalSettings',
components: {
NcButton,
NcLoadingIcon,
},
data() {
return {
generatingCodes: false,
}
},
computed: {
downloadUrl() {
if (!this.codes) {
return ''
}
return 'data:text/plain,' + encodeURIComponent(this.codes.reduce((prev, code) => {
return prev + code + '\r\n'
}, ''))
},
downloadFilename() {
const name = OC.theme.name || 'Nextcloud'
return name + '-backup-codes.txt'
},
enabled() {
return this.$store.state.enabled
},
total() {
return this.$store.state.total
},
used() {
return this.$store.state.used
},
codes() {
return this.$store.state.codes
},
name() {
return OC.theme.name || 'Nextcloud'
},
haveCodes() {
return this.codes && this.codes.length > 0
},
},
methods: {
generateBackupCodes() {
confirmPassword().then(() => {
// Hide old codes
this.generatingCodes = true
this.$store.dispatch('generate').then(() => {
this.generatingCodes = false
}).catch((err) => {
OC.Notification.showTemporary(t('twofactor_backupcodes', 'An error occurred while generating your backup codes'))
this.generatingCodes = false
throw err
})
}).catch(logger.error)
},
getPrintData(codes) {
if (!codes) {
return ''
}
return codes.reduce((prev, code) => {
return prev + code + '<br>'
}, '')
},
printCodes() {
print(this.getPrintData(this.codes))
},
},
<style module>
.backupcodesSettings {
display: flex;
flex-direction: column;
}
</script>
<style lang="scss" scoped>
.backupcodes-settings {
&__codes {
&__code {
font-family: monospace;
letter-spacing: 0.02em;
font-size: 1.2em;
}
}
.backupcodesSettings__code {
font-family: monospace;
letter-spacing: 0.02em;
font-size: 1.2em;
}
&__actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--default-grid-baseline);
}
.backupcodesSettings__actions {
display: flex;
flex-wrap: wrap;
gap: var(--default-grid-baseline);
}
</style>

View file

@ -5,8 +5,6 @@ declare(strict_types=1);
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
\OCP\Util::addScript('twofactor_backupcodes', 'settings', 'core');
?>
<div id="twofactor-backupcodes-settings"></div>

View file

@ -97,9 +97,6 @@ module.exports = {
'personal-theming': path.join(__dirname, 'apps/theming/src', 'personal-settings.js'),
'admin-theming': path.join(__dirname, 'apps/theming/src', 'admin-settings.js'),
},
twofactor_backupcodes: {
settings: path.join(__dirname, 'apps/twofactor_backupcodes/src', 'settings.js'),
},
updatenotification: {
init: path.join(__dirname, 'apps/updatenotification/src', 'init.ts'),
'view-changelog-page': path.join(__dirname, 'apps/updatenotification/src', 'view-changelog-page.ts'),

View file

@ -7,6 +7,9 @@ import { createAppConfig } from '@nextcloud/vite-config'
import { resolve } from 'node:path'
const modules = {
files_versions: {
'sidebar-tab': resolve(import.meta.dirname, 'apps/files_versions/src', 'sidebar_tab.ts'),
},
dav: {
'settings-admin-caldav': resolve(import.meta.dirname, 'apps/dav/src', 'settings-admin.ts'),
'settings-admin-example-content': resolve(import.meta.dirname, 'apps/dav/src', 'settings-admin-example-content.ts'),
@ -15,8 +18,8 @@ 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'),
twofactor_backupcodes: {
'settings-personal': resolve(import.meta.dirname, 'apps/twofactor_backupcodes/src', 'settings-personal.ts'),
},
}

View file

@ -81,7 +81,7 @@ This file is generated from multiple sources. Included packages:
- version: 1.2.1
- license: BSD-3-Clause
- marked
- version: 16.3.0
- version: 16.4.1
- license: MIT
- buffer
- version: 6.0.3

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
dist/check-BUfWmAQ9.chunk.mjs.map vendored Normal file

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

@ -592,7 +592,7 @@ This file is generated from multiple sources. Included packages:
- version: 4.17.21
- license: MIT
- marked
- version: 16.3.0
- version: 16.4.1
- license: MIT
- material-colors
- version: 1.2.6
@ -978,9 +978,6 @@ This file is generated from multiple sources. Included packages:
- vue
- version: 2.7.16
- license: MIT
- vuex
- version: 3.6.2
- license: MIT
- web-namespaces
- version: 2.0.1
- 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 './dav-dav-settings-admin-caldav-7NASuukx.chunk.css';
@import './_plugin-vue_export-helper-BE4hS1RR.chunk.css';
@import './NcSettingsSection-DFav6ob5-BFoYkIs3.chunk.css';

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-BF2IMoPZ.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,r as p,c as R,o as E,w as r,h as n,b as c,d as u,t as l,e as C,i as S,f as m,g as V}from"./NcSettingsSection-DFav6ob5-Dvi4WdiE.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";C.post(S(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 E(),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

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-admin-example-content-BvfG00pA.chunk.css';
@import './_plugin-vue_export-helper-BE4hS1RR.chunk.css';
@import './TrayArrowDown-seKZqyL0.chunk.css';
@import './NcSettingsSection-DFav6ob5-BFoYkIs3.chunk.css';
@import './check-seKZqyL0.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 './TrayArrowDown-seKZqyL0.chunk.css';
@import './NcSettingsSection-DFav6ob5-BFoYkIs3.chunk.css';
@import './check-seKZqyL0.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 './files_versions-files_versions-sidebar-tab-4BohXFH5.chunk.css';
@import './_plugin-vue_export-helper-BE4hS1RR.chunk.css';
@import './TrayArrowDown-seKZqyL0.chunk.css';
@import './NcSettingsSection-DFav6ob5-BFoYkIs3.chunk.css';
@import './check-seKZqyL0.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

2
dist/index-C0zE9_k9.chunk.mjs vendored Normal file

File diff suppressed because one or more lines are too long

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

@ -0,0 +1,11 @@
SPDX-License-Identifier: AGPL-3.0-or-later
SPDX-License-Identifier: MIT
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
This file is generated from multiple sources. Included packages:
- @nextcloud/password-confirmation
- version: 6.0.1
- license: MIT
- @nextcloud/vue
- version: 9.1.0
- license: AGPL-3.0-or-later

1
dist/index-C0zE9_k9.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: AGPL-3.0-or-later
SPDX-License-Identifier: MIT
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
This file is generated from multiple sources. Included packages:
- @nextcloud/password-confirmation
- version: 6.0.1
- license: MIT
- @nextcloud/vue
- version: 9.1.0
- license: AGPL-3.0-or-later

View file

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

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

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

View file

@ -1 +1 @@
{"version":3,"file":"logger-CU7k_5CV.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"}
{"version":3,"file":"logger-ZcpAppoJ.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":"+CAOO,MAAMA,EAASC,IACpB,OAAO,KAAK,EACZ,WAAA,EACA,MAAA"}

View file

@ -469,7 +469,7 @@ This file is generated from multiple sources. Included packages:
- version: 4.3.2
- license: MIT
- marked
- version: 16.3.0
- version: 16.4.1
- license: MIT
- material-colors
- version: 1.2.6

File diff suppressed because one or more lines are too long

View file

@ -722,9 +722,6 @@ This file is generated from multiple sources. Included packages:
- vue
- version: 2.7.16
- license: MIT
- vuex
- version: 3.6.2
- license: MIT
- webpack
- version: 5.102.1
- 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,3 +1,3 @@
/* extracted by css-entry-points-plugin */
@import './_plugin-vue_export-helper-BE4hS1RR.chunk.css';
@import './TrayArrowDown-seKZqyL0.chunk.css';
@import './NcSettingsSection-DFav6ob5-BFoYkIs3.chunk.css';
@import './check-seKZqyL0.chunk.css';

File diff suppressed because one or more lines are too long

View file

@ -1,14 +1,7 @@
SPDX-License-Identifier: AGPL-3.0-or-later
SPDX-License-Identifier: MIT
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
This file is generated from multiple sources. Included packages:
- @nextcloud/password-confirmation
- version: 6.0.1
- license: MIT
- @nextcloud/vue
- version: 9.1.0
- license: AGPL-3.0-or-later
- nextcloud-ui
- version: 1.0.0
- license: AGPL-3.0-or-later

File diff suppressed because one or more lines are too long

View file

@ -1,14 +1,7 @@
SPDX-License-Identifier: AGPL-3.0-or-later
SPDX-License-Identifier: MIT
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
This file is generated from multiple sources. Included packages:
- @nextcloud/password-confirmation
- version: 6.0.1
- license: MIT
- @nextcloud/vue
- version: 9.1.0
- license: AGPL-3.0-or-later
- nextcloud-ui
- version: 1.0.0
- license: AGPL-3.0-or-later

View file

@ -0,0 +1,4 @@
/* extracted by css-entry-points-plugin */
@import './twofactor_backupcodes-twofactor_backupcodes-settings-personal-Dny2IOsk.chunk.css';
@import './NcSettingsSection-DFav6ob5-BFoYkIs3.chunk.css';
@import './check-seKZqyL0.chunk.css';

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,12 @@
SPDX-License-Identifier: AGPL-3.0-or-later
SPDX-License-Identifier: MIT
SPDX-FileCopyrightText: Eduardo San Martin Morote
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
This file is generated from multiple sources. Included packages:
- nextcloud-ui
- version: 1.0.0
- license: AGPL-3.0-or-later
- pinia
- version: 3.0.3
- license: MIT

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,12 @@
SPDX-License-Identifier: AGPL-3.0-or-later
SPDX-License-Identifier: MIT
SPDX-FileCopyrightText: Eduardo San Martin Morote
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
This file is generated from multiple sources. Included packages:
- nextcloud-ui
- version: 1.0.0
- license: AGPL-3.0-or-later
- pinia
- version: 3.0.3
- license: MIT

File diff suppressed because one or more lines are too long

View file

@ -1,146 +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: AGPL-3.0-or-later
SPDX-License-Identifier: (MPL-2.0 OR Apache-2.0)
SPDX-FileCopyrightText: escape-html developers
SPDX-FileCopyrightText: debounce developers
SPDX-FileCopyrightText: atomiks
SPDX-FileCopyrightText: Tobias Koppers @sokra
SPDX-FileCopyrightText: T. Jameson Little <t.jameson.little@gmail.com>
SPDX-FileCopyrightText: Roman Shtylman <shtylman@gmail.com>
SPDX-FileCopyrightText: Roeland Jago Douma
SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
SPDX-FileCopyrightText: Matt Zabriskie
SPDX-FileCopyrightText: Guillaume Chau
SPDX-FileCopyrightText: GitHub Inc.
SPDX-FileCopyrightText: Feross Aboukhadijeh
SPDX-FileCopyrightText: Evan You
SPDX-FileCopyrightText: Eduardo San Martin Morote
SPDX-FileCopyrightText: Dr.-Ing. Mario Heiderich, Cure53 <mario@cure53.de> (https://cure53.de/)
SPDX-FileCopyrightText: David Clark
SPDX-FileCopyrightText: Christoph Wurst
This file is generated from multiple sources. Included packages:
- @floating-ui/core
- version: 1.7.3
- license: MIT
- @floating-ui/utils
- version: 0.2.10
- license: MIT
- @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
- semver
- version: 7.7.2
- license: ISC
- @nextcloud/event-bus
- version: 3.3.2
- license: GPL-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/vue
- version: 9.0.1
- license: AGPL-3.0-or-later
- vue-router
- version: 4.6.3
- license: MIT
- vue
- version: 3.5.22
- license: MIT
- @nextcloud/password-confirmation
- version: 6.0.1
- license: MIT
- @nextcloud/router
- version: 3.0.1
- license: GPL-3.0-or-later
- @nextcloud/vue
- version: 8.31.0
- license: AGPL-3.0-or-later
- @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
- axios
- version: 1.12.2
- license: MIT
- base64-js
- version: 1.5.1
- license: MIT
- css-loader
- version: 7.1.2
- license: MIT
- debounce
- version: 2.2.0
- license: MIT
- dompurify
- version: 3.2.7
- license: (MPL-2.0 OR Apache-2.0)
- escape-html
- version: 1.0.3
- license: MIT
- focus-trap
- version: 7.6.5
- license: MIT
- ieee754
- version: 1.2.1
- license: BSD-3-Clause
- buffer
- version: 6.0.3
- license: MIT
- process
- version: 0.11.10
- license: MIT
- style-loader
- version: 4.0.0
- license: MIT
- tabbable
- version: 6.2.0
- license: MIT
- vue-loader
- version: 15.11.1
- license: MIT
- vue
- version: 2.7.16
- license: MIT
- vuex
- version: 3.6.2
- license: MIT
- webpack
- version: 5.102.1
- 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 @@
twofactor_backupcodes-settings.js.license

View file

@ -0,0 +1 @@
._backupcodesSettings_bnkw8_2{display:flex;flex-direction:column}._backupcodesSettings__code_bnkw8_7{font-family:monospace;letter-spacing:.02em;font-size:1.2em}._backupcodesSettings__actions_bnkw8_13{display:flex;flex-wrap:wrap;gap:var(--default-grid-baseline)}

View file

@ -79,7 +79,7 @@ This file is generated from multiple sources. Included packages:
- version: 1.0.3
- license: MIT
- marked
- version: 16.3.0
- version: 16.4.1
- license: MIT
- process
- version: 0.11.10

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

@ -734,9 +734,6 @@ This file is generated from multiple sources. Included packages:
- vue
- version: 2.7.16
- license: MIT
- vuex
- version: 3.6.2
- license: MIT
- webpack
- version: 5.102.1
- license: MIT

File diff suppressed because one or more lines are too long

131
package-lock.json generated
View file

@ -18,6 +18,7 @@
"@nextcloud/password-confirmation": "^6.0.1",
"@nextcloud/paths": "^2.2.1",
"@nextcloud/vue": "^9.1.0",
"pinia": "^3.0.3",
"vue": "^3.5.22"
},
"devDependencies": {
@ -4509,6 +4510,30 @@
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
"license": "MIT"
},
"node_modules/@vue/devtools-kit": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz",
"integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==",
"license": "MIT",
"dependencies": {
"@vue/devtools-shared": "^7.7.7",
"birpc": "^2.3.0",
"hookable": "^5.5.3",
"mitt": "^3.0.1",
"perfect-debounce": "^1.0.0",
"speakingurl": "^14.0.1",
"superjson": "^2.2.2"
}
},
"node_modules/@vue/devtools-shared": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz",
"integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==",
"license": "MIT",
"dependencies": {
"rfdc": "^1.4.1"
}
},
"node_modules/@vue/language-core": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz",
@ -5316,6 +5341,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/birpc": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/birpc/-/birpc-2.6.1.tgz",
"integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/bl": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
@ -6204,6 +6238,21 @@
"license": "MIT",
"peer": true
},
"node_modules/copy-anything": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz",
"integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==",
"license": "MIT",
"dependencies": {
"is-what": "^5.2.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/core-js": {
"version": "3.46.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz",
@ -9220,6 +9269,12 @@
"minimalistic-crypto-utils": "^1.0.1"
}
},
"node_modules/hookable": {
"version": "5.5.3",
"resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
"integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
"license": "MIT"
},
"node_modules/hookified": {
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.2.tgz",
@ -10100,6 +10155,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-what": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz",
"integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==",
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@ -12049,6 +12116,12 @@
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/mitt": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
"integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
"license": "MIT"
},
"node_modules/mkdirp-classic": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
@ -12845,6 +12918,12 @@
"dev": true,
"license": "MIT"
},
"node_modules/perfect-debounce": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
"integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
"license": "MIT"
},
"node_modules/performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@ -12880,6 +12959,36 @@
"node": ">=0.10.0"
}
},
"node_modules/pinia": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.3.tgz",
"integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^7.7.2"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"typescript": ">=4.4.4",
"vue": "^2.7.0 || ^3.5.11"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/pinia/node_modules/@vue/devtools-api": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz",
"integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==",
"license": "MIT",
"dependencies": {
"@vue/devtools-kit": "^7.7.7"
}
},
"node_modules/pkg-dir": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
@ -13767,7 +13876,6 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
"dev": true,
"license": "MIT"
},
"node_modules/ripemd160": {
@ -14549,6 +14657,15 @@
"spdx-license-ids": "^3.0.0"
}
},
"node_modules/speakingurl": {
"version": "14.0.1",
"resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
"integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/spec-change": {
"version": "1.11.20",
"resolved": "https://registry.npmjs.org/spec-change/-/spec-change-1.11.20.tgz",
@ -15306,6 +15423,18 @@
"node": ">=18"
}
},
"node_modules/superjson": {
"version": "2.2.5",
"resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.5.tgz",
"integrity": "sha512-zWPTX96LVsA/eVYnqOM2+ofcdPqdS1dAF1LN4TS2/MWuUpfitd9ctTa87wt4xrYnZnkLtS69xpBdSxVBP5Rm6w==",
"license": "MIT",
"dependencies": {
"copy-anything": "^4"
},
"engines": {
"node": ">=16"
}
},
"node_modules/supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",

View file

@ -47,6 +47,7 @@
"@nextcloud/password-confirmation": "^6.0.1",
"@nextcloud/paths": "^2.2.1",
"@nextcloud/vue": "^9.1.0",
"pinia": "^3.0.3",
"vue": "^3.5.22"
},
"devDependencies": {