Congratulations, github.com/nextcloud/activity is REUSE compliant! This project adopts the recommendations to make software licensing easy for humans and machines alike.
To add the badge to your project's README.md
file,
use the following snippet:
[](https://api.reuse.software/info/github.com/nextcloud/activity)
The API provides machine-readable artifacts for automatic analysis.
reuse spdx
command.
Commit bae957aff57ac80cc996b2f98215f6df324a384e
was checked on 02 Jun 2025 09:05:16 UTC
with the following result:
reuse.extract - ERROR - Could not parse 'AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcSettingsSection :name=\"t('activity', 'Notification')\">\n\t\t<NcCheckboxRadioSwitch\n\t\t\ttype=\"checkbox\"\n\t\t\t:checked=\"emailEnabled\"\n\t\t\t@update:checked=\"toggleEmailEnabled({ emailEnabled: $event })\">\n\t\t\t{{ t('activity', 'Enable notification emails') }}\n\t\t</NcCheckboxRadioSwitch>\n\t</NcSettingsSection>\n</template>\n\n<script>\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport { mapActions, mapState } from 'vuex'\n\nexport default {\n\tname: 'AdminSettings',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSettingsSection,\n\t},\n\n\tcomputed: {\n\t\t...mapState({\n\t\t\temailEnabled: 'emailEnabled',\n\t\t}),\n\n\t\tsettingDescription() {\n\t\t\tif (this.emailEnabled) {\n\t\t\t\treturn t('activity', 'Choose for which activities you want to get an email or push notification.')\n\t\t\t} else {\n\t\t\t\treturn t('activity', 'Choose for which activities you want to get a push notification.')\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.setEndpoint({ endpoint: '/apps/activity/settings/admin' })\n\t},\n\n\tmethods: {\n\t\t...mapActions([\n\t\t\t'setEndpoint',\n\t\t\t'toggleEmailEnabled',\n\t\t]),\n\t},\n}\n\n</script>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcSettingsSection\n\t\t:name=\"t('activity', 'Default settings')\"\n\t\t:description=\"t('activity', 'Configure the default notification settings for new accounts.')\">\n\t\t<ActivityGrid />\n\t</NcSettingsSection>\n</template>\n\n<script>\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport { mapActions } from 'vuex'\nimport ActivityGrid from '../components/ActivityGrid.vue'\n\nexport default {\n\tname: 'DefaultActivitySettings',\n\tcomponents: {\n\t\tActivityGrid,\n\t\tNcSettingsSection,\n\t},\n\n\tmounted() {\n\t\tthis.setEndpoint({ endpoint: '/apps/activity/settings/admin' })\n\t},\n\n\tmethods: {\n\t\t...mapActions(['setEndpoint']),\n\t},\n}\n\n</script>\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport Vue from 'vue'\nimport Vuex from 'vuex'\nimport AdminSettings from './views/AdminSettings.vue'\nimport DefaultActivitySettings from './views/DefaultActivitySettings.vue'\nimport store from './store/settings-store.js'\n\nVue.prototype.t = t\nVue.prototype.n = n\n\nVue.use(Vuex)\n\nexport default {\n\tadminSetting: new Vue({\n\t\tel: '#activity-admin-settings',\n\t\tstore,\n\t\tname: 'ActivityPersonalSettings',\n\t\trender: (h) => h(AdminSettings),\n\t}),\n\tdefaultSetting: new Vue({\n\t\tel: '#activity-default-settings',\n\t\tstore,\n\t\tname: 'ActivityDefaultSettings',\n\t\trender: (h) => h(DefaultActivitySettings),\n\t}),\n}\n"],"names":["_sfc_main","NcCheckboxRadioSwitch","NcSettingsSection","mapState","mapActions","ActivityGrid","Vue","t","n","Vuex","store","h","AdminSettings","DefaultActivitySettings"],"mappings":"+WAqBA,MAAAA,EAAA,CACA,KAAA,gBACA,WAAA,CACA,sBAAAC,EACA,kBAAAC,CACA,EAEA,SAAA,CACA,GAAAC,EAAA,CACA,aAAA,cACA,CAAA,EAEA,oBAAA,CACA,OAAA,KAAA,aACA,EAAA,WAAA,4EAAA,EAEA,EAAA,WAAA,kEAAA,CAEA,CACA,EAEA,SAAA,CACA,KAAA,YAAA,CAAA,SAAA,+BAAA,CAAA,CACA,EAEA,QAAA,CACA,GAAAC,EAAA,CACA,cACA,oBACA,CAAA,CACA,CACA,2YClCAJ,EAAA,CACA,KAAA,0BACA,WAAA,CACA,aAAAK,EACA,kBAAAH,CACA,EAEA,SAAA,CACA,KAAA,YAAA,CAAA,SAAA,+BAAA,CAAA,CACA,EAEA,QAAA,CACA,GAAAE,EAAA,CAAA,aAAA,CAAA,CACA,CACA,6RCpBAE,EAAI,UAAU,EAAIC,EAClBD,EAAI,UAAU,EAAIE,EAElBF,EAAI,IAAIG,CAAI,EAGG,IAAIH,EAAI,CA' reuse.extract - ERROR - 'js/activity-adminSettings.mjs.map' holds an SPDX expression that cannot be parsed, skipping the file reuse.extract - ERROR - Could not parse 'AGPL-3.0-or-later\n */\n\nimport { registerGlobalAPI } from './utils/api.js'\n\nregisterGlobalAPI()\n"],"names":["registerGlobalAPI"],"mappings":"+HAOAA,EAAkB"' reuse.extract - ERROR - 'js/activity-api.mjs.map' holds an SPDX expression that cannot be parsed, skipping the file reuse.extract - ERROR - Could not parse 'AGPL-3.0-or-later\n */\n\nimport LightningBolt from '@mdi/svg/svg/lightning-bolt.svg?raw'\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport Vue from 'vue'\n\nVue.prototype.t = t\nVue.prototype.n = n\n\n// Init Activity tab component\nlet ActivityTabView = null\nlet ActivityTabInstance = null\nconst activityTab = new OCA.Files.Sidebar.Tab({\n\tid: 'activity',\n\tname: t('activity', 'Activity'),\n\ticonSvg: LightningBolt,\n\n\tasync mount(el, fileInfo, context) {\n\t\t// only load if needed\n\t\tif (ActivityTabView === null) {\n\t\t\tconst { default: ActivityTab } = await import('./views/ActivityTab.vue')\n\t\t\tActivityTabView = ActivityTabView ?? Vue.extend(ActivityTab)\n\t\t}\n\t\t// destroy previous instance if available\n\t\tif (ActivityTabInstance) {\n\t\t\tActivityTabInstance.$destroy()\n\t\t}\n\t\tActivityTabInstance = new ActivityTabView({\n\t\t\t// Better integration with vue parent component\n\t\t\tparent: context,\n\t\t})\n\t\t// No need to await this, we will show a loading indicator instead\n\t\tActivityTabInstance.update(fileInfo)\n\t\tActivityTabInstance.$mount(el)\n\t},\n\tupdate(fileInfo) {\n\t\tActivityTabInstance.update(fileInfo)\n\t},\n\tdestroy() {\n\t\tActivityTabInstance.$destroy()\n\t\tActivityTabInstance = null\n\t},\n})\n\nwindow.addEventListener('DOMContentLoaded', async function() {\n\tif (OCA.Files && OCA.Files.Sidebar) {\n\t\tOCA.Files.Sidebar.registerTab(activityTab)\n\t\tconst { default: ActivityTab } = await import('./views/ActivityTab.vue')\n\t\tActivityTabView = ActivityTabView ?? Vue.extend(ActivityTab)\n\t}\n})\n"],"file":"js/activity-sidebar.mjs"' reuse.extract - ERROR - 'js/activity-sidebar.mjs.map' holds an SPDX expression that cannot be parsed, skipping the file reuse.extract - ERROR - Could not parse 'AGPL-3.0-or-later\n */\n\nimport type { ActivityFactoryQueryOptions, IActivityFactory, IActivityFilter, IActivitySidebarAction } from '../models/ActivityAPI.ts'\n\nimport logger from './logger.ts'\n\ndeclare global {\n\tinterface Window {\n\t\tOCA?: {\n\t\t\tActivity?: {\n\t\t\t\t/**\n\t\t\t\t * Register new actions for a given activity type\n\t\t\t\t */\n\t\t\t\tregisterSidebarEntries: (factory: IActivityFactory) => void\n\t\t\t\t/**\n\t\t\t\t * Register an external action that should be shown in the Activity sidebar panel\n\t\t\t\t */\n\t\t\t\tregisterSidebarAction: (action: IActivitySidebarAction) => void\n\t\t\t\t/**\n\t\t\t\t * Register an filter function to filter out activities on the sidebar, useful together with `registerSidebarEntries`\n\t\t\t\t */\n\t\t\t\tregisterSidebarFilter: (filter: IActivityFilter) => void\n\t\t\t\t__sidebar_actions: IActivitySidebarAction[]\n\t\t\t\t__sidebar_factories: IActivityFactory[]\n\t\t\t\t__sidebar_filters: IActivityFilter[]\n\t\t\t}\n\t\t\tViewer?: {\n\t\t\t\topen(options: { path?: string, fileInfo?: unknown }): void\n\t\t\t\tget mimetypes(): string[]\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Register the global API\n */\nexport function registerGlobalAPI() {\n\twindow.OCA = window.OCA ?? {}\n\twindow.OCA.Activity = {\n\t\t...window.OCA.Activity,\n\t\t__sidebar_actions: window.OCA.Activity?.__sidebar_actions ?? [],\n\t\t__sidebar_factories: window.OCA.Activity?.__sidebar_factories ?? [],\n\t\t__sidebar_filters: window.OCA.Activity?.__sidebar_filters ?? [],\n\n\t\tregisterSidebarAction(action: IActivitySidebarAction) {\n\t\t\twindow.OCA!.Activity!.__sidebar_actions.push(action)\n\t\t\tlogger.debug('Registered new sidebar action')\n\t\t},\n\n\t\tregisterSidebarEntries(factory: IActivityFactory) {\n\t\t\twindow!.OCA!.Activity!.__sidebar_factories.push(factory)\n\t\t\tlogger.debug('Registered new sidebar actions factory')\n\t\t},\n\n\t\tregisterSidebarFilter(filter: IActivityFilter) {\n\t\t\twindow!.OCA!.Activity!.__sidebar_filters.push(filter)\n\t\t},\n\t}\n\n\tlogger.info('Activity API registered')\n}\n\n/**\n * Get all external actions that should be showed in the Activity panel\n */\nexport function getSidebarActions() {\n\treturn window.OCA?.Activity?.__sidebar_actions ?? []\n}\n\n/**\n * Get all additional activity stream entries for a given file object\n *\n * @param options Filter options for the additonal entries\n */\nexport async function getAdditionalEntries(options: ActivityFactoryQueryOptions) {\n\tif (window.OCA?.Activity?.__sidebar_factories === undefined) {\n\t\treturn []\n\t}\n\n\tconst allPromises = window.OCA.Activity.__sidebar_factories.map(async (factory) => await factory(options))\n\treturn (await Promise.all(allPromises)).flat()\n}\n\n/**\n * Get all sidebar entry filters\n */\nexport function getActivityFilters() {\n\treturn window.OCA?.Activity?.__sidebar_filters ?? []\n}\n"],"names":["registerGlobalAPI","action","logger","factory","filter","getSidebarActions","getAdditionalEntries","options","allPromises","getActivityFilters"],"mappings":"gDAwCO,SAASA,GAAoB,CAC5B,OAAA,IAAM,OAAO,KAAO,CAAC,EAC5B,OAAO,IAAI,SAAW,CACrB,GAAG,OAAO,IAAI,SACd,kBAAmB,OAAO,IAAI,UAAU,mBAAqB,CAAC,EAC9D,oBAAqB,OAAO,IAAI,UAAU,qBAAuB,CAAC,EAClE,kBAAmB,OAAO,IAAI,UAAU,mBAAqB,CAAC,EAE9D,sBAAsBC,EAAgC,CACrD,OAAO,IAAK,SAAU,kBAAkB,KAAKA,CAAM,EACnDC,EAAO,MAAM,+BAA+B,CAC7C,EAEA,uBAAuBC,EAA2B,CACjD,OAAQ,IAAK,SAAU,oBAAoB,KAAKA,CAAO,EACvDD,EAAO,MAAM,wCAAwC,CACtD,EAEA,sBAAsBE,EAAyB,CAC9C,OAAQ,IAAK,SAAU,kBAAkB,KAAKA,CAAM,CAAA,CAEtD,EAEAF,EAAO,KAAK,yBAAyB,CACtC,CAKO,SAASG,GAAoB,CACnC,OAAO,OAAO,KAAK,UAAU,mBAAqB,CAAC,CACpD,CAOA,eAAsBC,EAAqBC,EAAsC,CAChF,GAAI,OAAO,KAAK,UAAU,sBAAwB,OACjD,MAAO,CAAC,EAGH,MAAAC,EAAc,OAAO,IAAI,SAAS,oBAAoB,IAAI,MAAOL,GAAY,MAAMA,EAAQI,CAAO,CAAC,EACzG,OAAQ,MAAM,QAAQ,IAAIC,CAAW,GAAG,KAAK,CAC9C,CAKO,SAASC,GAAqB,CACpC,OAAO,OAAO,KAAK,UAAU,mBAAqB,CAAC,CACpD"' reuse.extract - ERROR - 'js/api-CyyF6H6f.chunk.mjs.map' holds an SPDX expression that cannot be parsed, skipping the file reuse.extract - ERROR - Could not parse 'AGPL-3.0-or-later\n-->\n\n<template>\n\t<div ref=\"attachTarget\" />\n</template>\n\n<script setup lang=\"ts\">\nimport type { IActivitySidebarAction } from '../models/ActivityAPI.ts'\n\nimport { getCurrentInstance, onBeforeUnmount, onMounted, ref } from 'vue'\n\nconst props = defineProps<{\n\t/** The sidebar plugin */\n\tplugin: IActivitySidebarAction\n\tfileInfo: object | null\n}>()\n\nconst emit = defineEmits<{\n\t(e: 'reload-activities'): void\n}>()\n\nconst attachTarget = ref<HTMLDivElement>()\n\nonMounted(() => props.plugin.mount(attachTarget.value as HTMLDivElement, {\n\tcontext: getCurrentInstance()?.proxy,\n\tfileInfo: props.fileInfo,\n\treload: () => emit('reload-activities'),\n}))\nonBeforeUnmount(() => props.plugin.unmount())\n</script>\n","<!--\n - SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div\n\t\t:class=\"{ 'icon-loading': loading }\"\n\t\tclass=\"activity\">\n\t\t<!-- error message -->\n\t\t<NcEmptyContent v-if=\"error\" :name=\"error\">\n\t\t\t<template #icon>\n\t\t\t\t<NcIconSvgWrapper :svg=\"lightningBoltSVG\" />\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\t\t<template v-else>\n\t\t\t<!-- activities actions -->\n\t\t\t<div v-if=\"sidebarPlugins.length > 0\" class=\"activity__actions\">\n\t\t\t\t<ActivitySidebarPlugin\n\t\t\t\t\tv-for=\"plugin, index of sidebarPlugins\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t:plugin=\"plugin\"\n\t\t\t\t\t:file-info=\"fileInfo\"\n\t\t\t\t\t@reload-activities=\"getActivities()\" />\n\t\t\t</div>\n\n\t\t\t<!-- activities content -->\n\t\t\t<NcEmptyContent\n\t\t\t\tv-if=\"loading\"\n\t\t\t\tclass=\"activity__empty-content\"\n\t\t\t\t:name=\"t('activity', 'Loading activities')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon />\n\t\t\t\t</template>\n\t\t\t</NcEmptyContent>\n\t\t\t<NcEmptyContent\n\t\t\t\tv-else-if=\"activities.length === 0\"\n\t\t\t\tclass=\"activity__empty-content\"\n\t\t\t\t:name=\"t('activity', 'No activity yet')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<span class=\"icon-activity\" />\n\t\t\t\t</template>\n\t\t\t</NcEmptyContent>\n\t\t\t<ul v-else class=\"activity__list\">\n\t\t\t\t<ActivityComponent\n\t\t\t\t\tv-for=\"activity in activities\"\n\t\t\t\t\t:key=\"activity.id\"\n\t\t\t\t\t:activity=\"activity\"\n\t\t\t\t\t:show-previews=\"false\"\n\t\t\t\t\t@reload=\"getActivities()\" />\n\t\t\t</ul>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport lightningBoltSVG from '@mdi/svg/svg/lightning-bolt.svg?raw'\nimport axios from '@nextcloud/axios'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\nimport NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js'\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\nimport ActivityComponent from '../components/ActivityComponent.vue'\nimport ActivitySidebarPlugin from '../components/ActivitySidebarPlugin.vue'\nimport ActivityModel from '../models/ActivityModel.ts'\nimport { getActivityFilters, getAdditionalEntries, getSidebarActions } from '../utils/api.ts'\nimport logger from '../utils/logger.ts'\n\nexport default {\n\tname: 'ActivityTab',\n\tcomponents: {\n\t\tActivityComponent,\n\t\tNcEmptyContent,\n\t\tNcIconSvgWrapper,\n\t\tNcLoadingIcon,\n\t\tActivitySidebarPlugin,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\terror: '',\n\t\t\tloading: true,\n\t\t\tfileInfo: null,\n\t\t\tactivities: [],\n\t\t\tlightningBoltSVG,\n\t\t\tsidebarPlugins: [],\n\t\t}\n\t},\n\n\tmounted() {\n\t\tthis.sidebarPlugins = getSidebarActions()\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Update current fileInfo and fetch new activities\n\t\t *\n\t\t * @param fileInfo the current file FileInfo\n\t\t' reuse.extract - ERROR - 'js/ActivityTab-B3IKkXvI.chunk.mjs.map' holds an SPDX expression that cannot be parsed, skipping the file reuse.extract - ERROR - Could not parse 'AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcSettingsSection :name=\"t('activity', 'Daily activity summary')\">\n\t\t<NcCheckboxRadioSwitch\n\t\t\tdata-cy-checkbox\n\t\t\t:checked=\"activityDigestEnabled\"\n\t\t\t@update:checked=\"toggleActivityDigestEnabled({ activityDigestEnabled: $event })\">\n\t\t\t{{ t('activity', 'Send daily activity summary in the morning') }}\n\t\t</NcCheckboxRadioSwitch>\n\t</NcSettingsSection>\n</template>\n\n<script>\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport { mapActions, mapState } from 'vuex'\n\nexport default {\n\tname: 'DailySummary',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSettingsSection,\n\t},\n\n\tcomputed: {\n\t\t...mapState(['activityDigestEnabled']),\n\t},\n\n\tmounted() {\n\t\tthis.setEndpoint({ endpoint: '/apps/activity/settings' })\n\t},\n\n\tmethods: {\n\t\t...mapActions([\n\t\t\t'setEndpoint',\n\t\t\t'toggleActivityDigestEnabled',\n\t\t]),\n\t},\n}\n</script>\n","/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nexport default {\n\tEmailFrequency: {\n\t\tEMAIL_SEND_HOURLY: 0,\n\t\tEMAIL_SEND_DAILY: 1,\n\t\tEMAIL_SEND_WEEKLY: 2,\n\t\tEMAIL_SEND_ASAP: 3,\n\t},\n}\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div v-if=\"emailEnabled\">\n\t\t<p v-if=\"!isEmailSet\">\n\t\t\t<strong>{{ t('activity', 'You need to set up your email address before you can receive notification emails.') }}</strong>\n\t\t</p>\n\t\t<p>\n\t\t\t<label for=\"activity_setting_batchtime\" class=\"activity-frequency__label\">\n\t\t\t\t{{ t('activity', 'Send activity emails') }}\n\t\t\t</label>\n\t\t\t<select\n\t\t\t\tid=\"activity_setting_batchtime\"\n\t\t\t\tclass=\"notification-frequency__select\"\n\t\t\t\tname=\"activity_setting_batchtime\"\n\t\t\t\t@change=\"setSettingBatchtime({ settingBatchtime: $event.target.value })\">\n\t\t\t\t<option\n\t\t\t\t\t:value=\"EmailFrequency.EMAIL_SEND_ASAP\"\n\t\t\t\t\t:selected=\"settingBatchtime === EmailFrequency.EMAIL_SEND_ASAP\">\n\t\t\t\t\t{{ t('activity', 'As soon as possible') }}\n\t\t\t\t</option>\n\t\t\t\t<option\n\t\t\t\t\t:value=\"EmailFrequency.EMAIL_SEND_HOURLY\"\n\t\t\t\t\t:selected=\"settingBatchtime === EmailFrequency.EMAIL_SEND_HOURLY\">\n\t\t\t\t\t{{ t('activity', 'Hourly') }}\n\t\t\t\t</option>\n\t\t\t\t<option\n\t\t\t\t\t:value=\"EmailFrequency.EMAIL_SEND_DAILY\"\n\t\t\t\t\t:selected=\"settingBatchtime === EmailFrequency.EMAIL_SEND_DAILY\">\n\t\t\t\t\t{{ t('activity', 'Daily') }}\n\t\t\t\t</option>\n\t\t\t\t<option\n\t\t\t\t\t:value=\"EmailFrequency.EMAIL_SEND_WEEKLY\"\n\t\t\t\t\t:selected=\"settingBatchtime === EmailFrequency.EMAIL_SEND_WEEKLY\">\n\t\t\t\t\t{{ t('activity', 'Weekly') }}\n\t\t\t\t</option>\n\t\t\t</select>\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport { mapActions, mapState } from 'vuex'\nimport EmailFrequency from '../models/EmailFrequency.js'\n\nexport default {\n\tname: 'EmailSettings',\n\n\tdata() {\n\t\treturn {\n\t\t\tEmailFrequency: EmailFrequency.EmailFrequency,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t...mapState([\n\t\t\t'emailEnabled',\n\t\t\t'isEmailSet',\n\t\t\t'settingBatchtime',\n\t\t]),\n\t},\n\n\tmethods: {\n\t\t...mapActions(['setSettingBatchtime']),\n\t},\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.activity-frequency__label {\n\tmargin-top: 24px;\n\tdisplay: inline-block;\n}\n\n.notification-frequency__select {\n\tmargin-left: calc(var(--default-grid-baseline) * 2);\n}\n\n</style>\n","<!--\n - SPDX-FileCopyrightText:' reuse.extract - ERROR - 'js/activity-personalSettings.mjs.map' holds an SPDX expression that cannot be parsed, skipping the file reuse.extract - ERROR - Could not parse 'AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcSettingsSection :name=\"t('activity', 'Notification')\">\n\t\t<NcCheckboxRadioSwitch\n\t\t\ttype=\"checkbox\"\n\t\t\t:checked=\"emailEnabled\"\n\t\t\t@update:checked=\"toggleEmailEnabled({ emailEnabled: $event })\">\n\t\t\t{{ t('activity', 'Enable notification emails') }}\n\t\t</NcCheckboxRadioSwitch>\n\t</NcSettingsSection>\n</template>\n\n<script>\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport { mapActions, mapState } from 'vuex'\n\nexport default {\n\tname: 'AdminSettings',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSettingsSection,\n\t},\n\n\tcomputed: {\n\t\t...mapState({\n\t\t\temailEnabled: 'emailEnabled',\n\t\t}),\n\n\t\tsettingDescription() {\n\t\t\tif (this.emailEnabled) {\n\t\t\t\treturn t('activity', 'Choose for which activities you want to get an email or push notification.')\n\t\t\t} else {\n\t\t\t\treturn t('activity', 'Choose for which activities you want to get a push notification.')\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.setEndpoint({ endpoint: '/apps/activity/settings/admin' })\n\t},\n\n\tmethods: {\n\t\t...mapActions([\n\t\t\t'setEndpoint',\n\t\t\t'toggleEmailEnabled',\n\t\t]),\n\t},\n}\n\n</script>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcSettingsSection\n\t\t:name=\"t('activity', 'Default settings')\"\n\t\t:description=\"t('activity', 'Configure the default notification settings for new accounts.')\">\n\t\t<ActivityGrid />\n\t</NcSettingsSection>\n</template>\n\n<script>\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport { mapActions } from 'vuex'\nimport ActivityGrid from '../components/ActivityGrid.vue'\n\nexport default {\n\tname: 'DefaultActivitySettings',\n\tcomponents: {\n\t\tActivityGrid,\n\t\tNcSettingsSection,\n\t},\n\n\tmounted() {\n\t\tthis.setEndpoint({ endpoint: '/apps/activity/settings/admin' })\n\t},\n\n\tmethods: {\n\t\t...mapActions(['setEndpoint']),\n\t},\n}\n\n</script>\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport Vue from 'vue'\nimport Vuex from 'vuex'\nimport AdminSettings from './views/AdminSettings.vue'\nimport DefaultActivitySettings from './views/DefaultActivitySettings.vue'\nimport store from './store/settings-store.js'\n\nVue.prototype.t = t\nVue.prototype.n = n\n\nVue.use(Vuex)\n\nexport default {\n\tadminSetting: new Vue({\n\t\tel: '#activity-admin-settings',\n\t\tstore,\n\t\tname: 'ActivityPersonalSettings',\n\t\trender: (h) => h(AdminSettings),\n\t}),\n\tdefaultSetting: new Vue({\n\t\tel: '#activity-default-settings',\n\t\tstore,\n\t\tname: 'ActivityDefaultSettings',\n\t\trender: (h) => h(DefaultActivitySettings),\n\t}),\n}\n"],"names":["_sfc_main","NcCheckboxRadioSwitch","NcSettingsSection","mapState","mapActions","ActivityGrid","Vue","t","n","Vuex","store","h","AdminSettings","DefaultActivitySettings"],"mappings":"+WAqBA,MAAAA,EAAA,CACA,KAAA,gBACA,WAAA,CACA,sBAAAC,EACA,kBAAAC,CACA,EAEA,SAAA,CACA,GAAAC,EAAA,CACA,aAAA,cACA,CAAA,EAEA,oBAAA,CACA,OAAA,KAAA,aACA,EAAA,WAAA,4EAAA,EAEA,EAAA,WAAA,kEAAA,CAEA,CACA,EAEA,SAAA,CACA,KAAA,YAAA,CAAA,SAAA,+BAAA,CAAA,CACA,EAEA,QAAA,CACA,GAAAC,EAAA,CACA,cACA,oBACA,CAAA,CACA,CACA,2YClCAJ,EAAA,CACA,KAAA,0BACA,WAAA,CACA,aAAAK,EACA,kBAAAH,CACA,EAEA,SAAA,CACA,KAAA,YAAA,CAAA,SAAA,+BAAA,CAAA,CACA,EAEA,QAAA,CACA,GAAAE,EAAA,CAAA,aAAA,CAAA,CACA,CACA,6RCpBAE,EAAI,UAAU,EAAIC,EAClBD,EAAI,UAAU,EAAIE,EAElBF,EAAI,IAAIG,CAAI,EAGG,IAAIH,EAAI,CA' reuse.extract - ERROR - 'js/activity-adminSettings.mjs.map' holds an SPDX expression that cannot be parsed, skipping the file reuse.extract - ERROR - Could not parse 'AGPL-3.0-or-later\n */\n\nimport { registerGlobalAPI } from './utils/api.js'\n\nregisterGlobalAPI()\n"],"names":["registerGlobalAPI"],"mappings":"+HAOAA,EAAkB"' reuse.extract - ERROR - 'js/activity-api.mjs.map' holds an SPDX expression that cannot be parsed, skipping the file reuse.extract - ERROR - Could not parse 'AGPL-3.0-or-later\n */\n\nimport LightningBolt from '@mdi/svg/svg/lightning-bolt.svg?raw'\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport Vue from 'vue'\n\nVue.prototype.t = t\nVue.prototype.n = n\n\n// Init Activity tab component\nlet ActivityTabView = null\nlet ActivityTabInstance = null\nconst activityTab = new OCA.Files.Sidebar.Tab({\n\tid: 'activity',\n\tname: t('activity', 'Activity'),\n\ticonSvg: LightningBolt,\n\n\tasync mount(el, fileInfo, context) {\n\t\t// only load if needed\n\t\tif (ActivityTabView === null) {\n\t\t\tconst { default: ActivityTab } = await import('./views/ActivityTab.vue')\n\t\t\tActivityTabView = ActivityTabView ?? Vue.extend(ActivityTab)\n\t\t}\n\t\t// destroy previous instance if available\n\t\tif (ActivityTabInstance) {\n\t\t\tActivityTabInstance.$destroy()\n\t\t}\n\t\tActivityTabInstance = new ActivityTabView({\n\t\t\t// Better integration with vue parent component\n\t\t\tparent: context,\n\t\t})\n\t\t// No need to await this, we will show a loading indicator instead\n\t\tActivityTabInstance.update(fileInfo)\n\t\tActivityTabInstance.$mount(el)\n\t},\n\tupdate(fileInfo) {\n\t\tActivityTabInstance.update(fileInfo)\n\t},\n\tdestroy() {\n\t\tActivityTabInstance.$destroy()\n\t\tActivityTabInstance = null\n\t},\n})\n\nwindow.addEventListener('DOMContentLoaded', async function() {\n\tif (OCA.Files && OCA.Files.Sidebar) {\n\t\tOCA.Files.Sidebar.registerTab(activityTab)\n\t\tconst { default: ActivityTab } = await import('./views/ActivityTab.vue')\n\t\tActivityTabView = ActivityTabView ?? Vue.extend(ActivityTab)\n\t}\n})\n"],"file":"js/activity-sidebar.mjs"' reuse.extract - ERROR - 'js/activity-sidebar.mjs.map' holds an SPDX expression that cannot be parsed, skipping the file reuse.extract - ERROR - Could not parse 'AGPL-3.0-or-later\n */\n\nimport type { ActivityFactoryQueryOptions, IActivityFactory, IActivityFilter, IActivitySidebarAction } from '../models/ActivityAPI.ts'\n\nimport logger from './logger.ts'\n\ndeclare global {\n\tinterface Window {\n\t\tOCA?: {\n\t\t\tActivity?: {\n\t\t\t\t/**\n\t\t\t\t * Register new actions for a given activity type\n\t\t\t\t */\n\t\t\t\tregisterSidebarEntries: (factory: IActivityFactory) => void\n\t\t\t\t/**\n\t\t\t\t * Register an external action that should be shown in the Activity sidebar panel\n\t\t\t\t */\n\t\t\t\tregisterSidebarAction: (action: IActivitySidebarAction) => void\n\t\t\t\t/**\n\t\t\t\t * Register an filter function to filter out activities on the sidebar, useful together with `registerSidebarEntries`\n\t\t\t\t */\n\t\t\t\tregisterSidebarFilter: (filter: IActivityFilter) => void\n\t\t\t\t__sidebar_actions: IActivitySidebarAction[]\n\t\t\t\t__sidebar_factories: IActivityFactory[]\n\t\t\t\t__sidebar_filters: IActivityFilter[]\n\t\t\t}\n\t\t\tViewer?: {\n\t\t\t\topen(options: { path?: string, fileInfo?: unknown }): void\n\t\t\t\tget mimetypes(): string[]\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Register the global API\n */\nexport function registerGlobalAPI() {\n\twindow.OCA = window.OCA ?? {}\n\twindow.OCA.Activity = {\n\t\t...window.OCA.Activity,\n\t\t__sidebar_actions: window.OCA.Activity?.__sidebar_actions ?? [],\n\t\t__sidebar_factories: window.OCA.Activity?.__sidebar_factories ?? [],\n\t\t__sidebar_filters: window.OCA.Activity?.__sidebar_filters ?? [],\n\n\t\tregisterSidebarAction(action: IActivitySidebarAction) {\n\t\t\twindow.OCA!.Activity!.__sidebar_actions.push(action)\n\t\t\tlogger.debug('Registered new sidebar action')\n\t\t},\n\n\t\tregisterSidebarEntries(factory: IActivityFactory) {\n\t\t\twindow!.OCA!.Activity!.__sidebar_factories.push(factory)\n\t\t\tlogger.debug('Registered new sidebar actions factory')\n\t\t},\n\n\t\tregisterSidebarFilter(filter: IActivityFilter) {\n\t\t\twindow!.OCA!.Activity!.__sidebar_filters.push(filter)\n\t\t},\n\t}\n\n\tlogger.info('Activity API registered')\n}\n\n/**\n * Get all external actions that should be showed in the Activity panel\n */\nexport function getSidebarActions() {\n\treturn window.OCA?.Activity?.__sidebar_actions ?? []\n}\n\n/**\n * Get all additional activity stream entries for a given file object\n *\n * @param options Filter options for the additonal entries\n */\nexport async function getAdditionalEntries(options: ActivityFactoryQueryOptions) {\n\tif (window.OCA?.Activity?.__sidebar_factories === undefined) {\n\t\treturn []\n\t}\n\n\tconst allPromises = window.OCA.Activity.__sidebar_factories.map(async (factory) => await factory(options))\n\treturn (await Promise.all(allPromises)).flat()\n}\n\n/**\n * Get all sidebar entry filters\n */\nexport function getActivityFilters() {\n\treturn window.OCA?.Activity?.__sidebar_filters ?? []\n}\n"],"names":["registerGlobalAPI","action","logger","factory","filter","getSidebarActions","getAdditionalEntries","options","allPromises","getActivityFilters"],"mappings":"gDAwCO,SAASA,GAAoB,CAC5B,OAAA,IAAM,OAAO,KAAO,CAAC,EAC5B,OAAO,IAAI,SAAW,CACrB,GAAG,OAAO,IAAI,SACd,kBAAmB,OAAO,IAAI,UAAU,mBAAqB,CAAC,EAC9D,oBAAqB,OAAO,IAAI,UAAU,qBAAuB,CAAC,EAClE,kBAAmB,OAAO,IAAI,UAAU,mBAAqB,CAAC,EAE9D,sBAAsBC,EAAgC,CACrD,OAAO,IAAK,SAAU,kBAAkB,KAAKA,CAAM,EACnDC,EAAO,MAAM,+BAA+B,CAC7C,EAEA,uBAAuBC,EAA2B,CACjD,OAAQ,IAAK,SAAU,oBAAoB,KAAKA,CAAO,EACvDD,EAAO,MAAM,wCAAwC,CACtD,EAEA,sBAAsBE,EAAyB,CAC9C,OAAQ,IAAK,SAAU,kBAAkB,KAAKA,CAAM,CAAA,CAEtD,EAEAF,EAAO,KAAK,yBAAyB,CACtC,CAKO,SAASG,GAAoB,CACnC,OAAO,OAAO,KAAK,UAAU,mBAAqB,CAAC,CACpD,CAOA,eAAsBC,EAAqBC,EAAsC,CAChF,GAAI,OAAO,KAAK,UAAU,sBAAwB,OACjD,MAAO,CAAC,EAGH,MAAAC,EAAc,OAAO,IAAI,SAAS,oBAAoB,IAAI,MAAOL,GAAY,MAAMA,EAAQI,CAAO,CAAC,EACzG,OAAQ,MAAM,QAAQ,IAAIC,CAAW,GAAG,KAAK,CAC9C,CAKO,SAASC,GAAqB,CACpC,OAAO,OAAO,KAAK,UAAU,mBAAqB,CAAC,CACpD"' reuse.extract - ERROR - 'js/api-CyyF6H6f.chunk.mjs.map' holds an SPDX expression that cannot be parsed, skipping the file reuse.extract - ERROR - Could not parse 'AGPL-3.0-or-later\n-->\n\n<template>\n\t<div ref=\"attachTarget\" />\n</template>\n\n<script setup lang=\"ts\">\nimport type { IActivitySidebarAction } from '../models/ActivityAPI.ts'\n\nimport { getCurrentInstance, onBeforeUnmount, onMounted, ref } from 'vue'\n\nconst props = defineProps<{\n\t/** The sidebar plugin */\n\tplugin: IActivitySidebarAction\n\tfileInfo: object | null\n}>()\n\nconst emit = defineEmits<{\n\t(e: 'reload-activities'): void\n}>()\n\nconst attachTarget = ref<HTMLDivElement>()\n\nonMounted(() => props.plugin.mount(attachTarget.value as HTMLDivElement, {\n\tcontext: getCurrentInstance()?.proxy,\n\tfileInfo: props.fileInfo,\n\treload: () => emit('reload-activities'),\n}))\nonBeforeUnmount(() => props.plugin.unmount())\n</script>\n","<!--\n - SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div\n\t\t:class=\"{ 'icon-loading': loading }\"\n\t\tclass=\"activity\">\n\t\t<!-- error message -->\n\t\t<NcEmptyContent v-if=\"error\" :name=\"error\">\n\t\t\t<template #icon>\n\t\t\t\t<NcIconSvgWrapper :svg=\"lightningBoltSVG\" />\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\t\t<template v-else>\n\t\t\t<!-- activities actions -->\n\t\t\t<div v-if=\"sidebarPlugins.length > 0\" class=\"activity__actions\">\n\t\t\t\t<ActivitySidebarPlugin\n\t\t\t\t\tv-for=\"plugin, index of sidebarPlugins\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t:plugin=\"plugin\"\n\t\t\t\t\t:file-info=\"fileInfo\"\n\t\t\t\t\t@reload-activities=\"getActivities()\" />\n\t\t\t</div>\n\n\t\t\t<!-- activities content -->\n\t\t\t<NcEmptyContent\n\t\t\t\tv-if=\"loading\"\n\t\t\t\tclass=\"activity__empty-content\"\n\t\t\t\t:name=\"t('activity', 'Loading activities')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon />\n\t\t\t\t</template>\n\t\t\t</NcEmptyContent>\n\t\t\t<NcEmptyContent\n\t\t\t\tv-else-if=\"activities.length === 0\"\n\t\t\t\tclass=\"activity__empty-content\"\n\t\t\t\t:name=\"t('activity', 'No activity yet')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<span class=\"icon-activity\" />\n\t\t\t\t</template>\n\t\t\t</NcEmptyContent>\n\t\t\t<ul v-else class=\"activity__list\">\n\t\t\t\t<ActivityComponent\n\t\t\t\t\tv-for=\"activity in activities\"\n\t\t\t\t\t:key=\"activity.id\"\n\t\t\t\t\t:activity=\"activity\"\n\t\t\t\t\t:show-previews=\"false\"\n\t\t\t\t\t@reload=\"getActivities()\" />\n\t\t\t</ul>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport lightningBoltSVG from '@mdi/svg/svg/lightning-bolt.svg?raw'\nimport axios from '@nextcloud/axios'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\nimport NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js'\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\nimport ActivityComponent from '../components/ActivityComponent.vue'\nimport ActivitySidebarPlugin from '../components/ActivitySidebarPlugin.vue'\nimport ActivityModel from '../models/ActivityModel.ts'\nimport { getActivityFilters, getAdditionalEntries, getSidebarActions } from '../utils/api.ts'\nimport logger from '../utils/logger.ts'\n\nexport default {\n\tname: 'ActivityTab',\n\tcomponents: {\n\t\tActivityComponent,\n\t\tNcEmptyContent,\n\t\tNcIconSvgWrapper,\n\t\tNcLoadingIcon,\n\t\tActivitySidebarPlugin,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\terror: '',\n\t\t\tloading: true,\n\t\t\tfileInfo: null,\n\t\t\tactivities: [],\n\t\t\tlightningBoltSVG,\n\t\t\tsidebarPlugins: [],\n\t\t}\n\t},\n\n\tmounted() {\n\t\tthis.sidebarPlugins = getSidebarActions()\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Update current fileInfo and fetch new activities\n\t\t *\n\t\t * @param fileInfo the current file FileInfo\n\t\t' reuse.extract - ERROR - 'js/ActivityTab-B3IKkXvI.chunk.mjs.map' holds an SPDX expression that cannot be parsed, skipping the file reuse.extract - ERROR - Could not parse 'AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcSettingsSection :name=\"t('activity', 'Daily activity summary')\">\n\t\t<NcCheckboxRadioSwitch\n\t\t\tdata-cy-checkbox\n\t\t\t:checked=\"activityDigestEnabled\"\n\t\t\t@update:checked=\"toggleActivityDigestEnabled({ activityDigestEnabled: $event })\">\n\t\t\t{{ t('activity', 'Send daily activity summary in the morning') }}\n\t\t</NcCheckboxRadioSwitch>\n\t</NcSettingsSection>\n</template>\n\n<script>\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport { mapActions, mapState } from 'vuex'\n\nexport default {\n\tname: 'DailySummary',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSettingsSection,\n\t},\n\n\tcomputed: {\n\t\t...mapState(['activityDigestEnabled']),\n\t},\n\n\tmounted() {\n\t\tthis.setEndpoint({ endpoint: '/apps/activity/settings' })\n\t},\n\n\tmethods: {\n\t\t...mapActions([\n\t\t\t'setEndpoint',\n\t\t\t'toggleActivityDigestEnabled',\n\t\t]),\n\t},\n}\n</script>\n","/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nexport default {\n\tEmailFrequency: {\n\t\tEMAIL_SEND_HOURLY: 0,\n\t\tEMAIL_SEND_DAILY: 1,\n\t\tEMAIL_SEND_WEEKLY: 2,\n\t\tEMAIL_SEND_ASAP: 3,\n\t},\n}\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div v-if=\"emailEnabled\">\n\t\t<p v-if=\"!isEmailSet\">\n\t\t\t<strong>{{ t('activity', 'You need to set up your email address before you can receive notification emails.') }}</strong>\n\t\t</p>\n\t\t<p>\n\t\t\t<label for=\"activity_setting_batchtime\" class=\"activity-frequency__label\">\n\t\t\t\t{{ t('activity', 'Send activity emails') }}\n\t\t\t</label>\n\t\t\t<select\n\t\t\t\tid=\"activity_setting_batchtime\"\n\t\t\t\tclass=\"notification-frequency__select\"\n\t\t\t\tname=\"activity_setting_batchtime\"\n\t\t\t\t@change=\"setSettingBatchtime({ settingBatchtime: $event.target.value })\">\n\t\t\t\t<option\n\t\t\t\t\t:value=\"EmailFrequency.EMAIL_SEND_ASAP\"\n\t\t\t\t\t:selected=\"settingBatchtime === EmailFrequency.EMAIL_SEND_ASAP\">\n\t\t\t\t\t{{ t('activity', 'As soon as possible') }}\n\t\t\t\t</option>\n\t\t\t\t<option\n\t\t\t\t\t:value=\"EmailFrequency.EMAIL_SEND_HOURLY\"\n\t\t\t\t\t:selected=\"settingBatchtime === EmailFrequency.EMAIL_SEND_HOURLY\">\n\t\t\t\t\t{{ t('activity', 'Hourly') }}\n\t\t\t\t</option>\n\t\t\t\t<option\n\t\t\t\t\t:value=\"EmailFrequency.EMAIL_SEND_DAILY\"\n\t\t\t\t\t:selected=\"settingBatchtime === EmailFrequency.EMAIL_SEND_DAILY\">\n\t\t\t\t\t{{ t('activity', 'Daily') }}\n\t\t\t\t</option>\n\t\t\t\t<option\n\t\t\t\t\t:value=\"EmailFrequency.EMAIL_SEND_WEEKLY\"\n\t\t\t\t\t:selected=\"settingBatchtime === EmailFrequency.EMAIL_SEND_WEEKLY\">\n\t\t\t\t\t{{ t('activity', 'Weekly') }}\n\t\t\t\t</option>\n\t\t\t</select>\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport { mapActions, mapState } from 'vuex'\nimport EmailFrequency from '../models/EmailFrequency.js'\n\nexport default {\n\tname: 'EmailSettings',\n\n\tdata() {\n\t\treturn {\n\t\t\tEmailFrequency: EmailFrequency.EmailFrequency,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t...mapState([\n\t\t\t'emailEnabled',\n\t\t\t'isEmailSet',\n\t\t\t'settingBatchtime',\n\t\t]),\n\t},\n\n\tmethods: {\n\t\t...mapActions(['setSettingBatchtime']),\n\t},\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.activity-frequency__label {\n\tmargin-top: 24px;\n\tdisplay: inline-block;\n}\n\n.notification-frequency__select {\n\tmargin-left: calc(var(--default-grid-baseline) * 2);\n}\n\n</style>\n","<!--\n - SPDX-FileCopyrightText:' reuse.extract - ERROR - 'js/activity-personalSettings.mjs.map' holds an SPDX expression that cannot be parsed, skipping the file # SUMMARY * Bad licenses: 0 * Deprecated licenses: 0 * Licenses without file extension: 0 * Missing licenses: 0 * Unused licenses: 0 * Used licenses: CC0-1.0, AGPL-3.0-or-later, Apache-2.0, AGPL-3.0-only, MIT * Read errors: 0 * Files with copyright information: 455 / 455 * Files with license information: 455 / 455 Congratulations! Your project is compliant with version 3.3 of the REUSE Specification :-)