{"version":3,"file":"files_reminders-init.mjs","sources":["../node_modules/@mdi/svg/svg/alarm-off.svg?raw","../build/frontend/apps/files_reminders/src/services/reminderService.ts","../build/frontend/apps/files_reminders/src/shared/utils.ts","../build/frontend/apps/files_reminders/src/files_actions/clearReminderAction.ts","../node_modules/@mdi/svg/svg/alarm.svg?raw","../build/frontend/apps/files_reminders/src/shared/logger.ts","../build/frontend/apps/files_reminders/src/components/SetCustomReminderModal.vue","../build/frontend/apps/files_reminders/src/services/customPicker.ts","../build/frontend/apps/files_reminders/src/files_actions/reminderStatusAction.ts","../node_modules/@mdi/svg/svg/calendar-clock.svg?raw","../build/frontend/apps/files_reminders/src/files_actions/setReminderMenuAction.ts","../build/frontend/apps/files_reminders/src/files_actions/setReminderCustomAction.ts","../build/frontend/apps/files_reminders/src/files_actions/setReminderSuggestionActions.ts","../build/frontend/apps/files_reminders/src/files-init.ts"],"sourcesContent":["export default \"\"","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\ninterface Reminder {\n\tdueDate: null | Date\n}\n\n/**\n * Get the reminder for a specific file\n *\n * @param fileId - The file id to get the reminder for\n */\nexport async function getReminder(fileId: number): Promise {\n\tconst url = generateOcsUrl('/apps/files_reminders/api/v1/{fileId}', { fileId })\n\tconst response = await axios.get(url)\n\tconst dueDate = response.data.ocs.data.dueDate ? new Date(response.data.ocs.data.dueDate) : null\n\n\treturn {\n\t\tdueDate,\n\t}\n}\n\n/**\n * Set a reminder for a specific file\n *\n * @param fileId - The file id to set the reminder for\n * @param dueDate - The due date for the reminder\n */\nexport async function setReminder(fileId: number, dueDate: Date): Promise<[]> {\n\tconst url = generateOcsUrl('/apps/files_reminders/api/v1/{fileId}', { fileId })\n\n\tconst response = await axios.put(url, {\n\t\tdueDate: dueDate.toISOString(), // timezone of string is always UTC\n\t})\n\n\treturn response.data.ocs.data\n}\n\n/**\n * Clear the reminder for a specific file\n *\n * @param fileId - The file id to clear the reminder for\n */\nexport async function clearReminder(fileId: number): Promise<[]> {\n\tconst url = generateOcsUrl('/apps/files_reminders/api/v1/{fileId}', { fileId })\n\tconst response = await axios.delete(url)\n\n\treturn response.data.ocs.data\n}\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getCanonicalLocale } from '@nextcloud/l10n'\n\nexport enum DateTimePreset {\n\tLaterToday = 'later-today',\n\tTomorrow = 'tomorrow',\n\tThisWeekend = 'this-weekend',\n\tNextWeek = 'next-week',\n}\n\n/**\n *\n */\nfunction getFirstWorkdayOfWeek() {\n\tconst now = new Date()\n\tnow.setHours(0, 0, 0, 0)\n\tnow.setDate(now.getDate() - now.getDay() + 1)\n\treturn new Date(now)\n}\n\n/**\n *\n * @param date\n */\nfunction getWeek(date: Date) {\n\tconst dateClone = new Date(date)\n\tdateClone.setHours(0, 0, 0, 0)\n\tconst firstDayOfYear = new Date(date.getFullYear(), 0, 1, 0, 0, 0, 0)\n\tconst daysFromFirstDay = (date.getTime() - firstDayOfYear.getTime()) / 86400000\n\treturn Math.ceil((daysFromFirstDay + firstDayOfYear.getDay() + 1) / 7)\n}\n\n/**\n *\n * @param a\n * @param b\n */\nfunction isSameWeek(a: Date, b: Date) {\n\treturn getWeek(a) === getWeek(b)\n\t\t&& a.getFullYear() === b.getFullYear()\n}\n\n/**\n *\n * @param a\n * @param b\n */\nfunction isSameDate(a: Date, b: Date) {\n\treturn a.getDate() === b.getDate()\n\t\t&& a.getMonth() === b.getMonth()\n\t\t&& a.getFullYear() === b.getFullYear()\n}\n\n/**\n *\n * @param dateTime\n */\nexport function getDateTime(dateTime: DateTimePreset): null | Date {\n\tconst matchPreset: Record null | Date> = {\n\t\t[DateTimePreset.LaterToday]: () => {\n\t\t\tconst now = new Date()\n\t\t\tconst evening = new Date()\n\t\t\tevening.setHours(18, 0, 0, 0)\n\t\t\tconst cutoff = new Date()\n\t\t\tcutoff.setHours(17, 0, 0, 0)\n\t\t\tif (now >= cutoff) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn evening\n\t\t},\n\n\t\t[DateTimePreset.Tomorrow]: () => {\n\t\t\tconst now = new Date()\n\t\t\tconst day = new Date()\n\t\t\tday.setDate(now.getDate() + 1)\n\t\t\tday.setHours(8, 0, 0, 0)\n\t\t\treturn day\n\t\t},\n\n\t\t[DateTimePreset.ThisWeekend]: () => {\n\t\t\tconst today = new Date()\n\t\t\tif (\n\t\t\t\t[\n\t\t\t\t\t5, // Friday\n\t\t\t\t\t6, // Saturday\n\t\t\t\t\t0, // Sunday\n\t\t\t\t].includes(today.getDay())\n\t\t\t) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst saturday = new Date()\n\t\t\tconst firstWorkdayOfWeek = getFirstWorkdayOfWeek()\n\t\t\tsaturday.setDate(firstWorkdayOfWeek.getDate() + 5)\n\t\t\tsaturday.setHours(8, 0, 0, 0)\n\t\t\treturn saturday\n\t\t},\n\n\t\t[DateTimePreset.NextWeek]: () => {\n\t\t\tconst today = new Date()\n\t\t\tif (today.getDay() === 0) { // Sunday\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst workday = new Date()\n\t\t\tconst firstWorkdayOfWeek = getFirstWorkdayOfWeek()\n\t\t\tworkday.setDate(firstWorkdayOfWeek.getDate() + 7)\n\t\t\tworkday.setHours(8, 0, 0, 0)\n\t\t\treturn workday\n\t\t},\n\t}\n\n\treturn matchPreset[dateTime]()\n}\n\n/**\n *\n */\nexport function getInitialCustomDueDate(): Date {\n\tconst now = new Date()\n\tconst dueDate = new Date()\n\tdueDate.setHours(now.getHours() + 2, 0, 0, 0)\n\treturn dueDate\n}\n\n/**\n *\n * @param dueDate\n */\nexport function getDateString(dueDate: Date): string {\n\tlet formatOptions: Intl.DateTimeFormatOptions = {\n\t\thour: 'numeric',\n\t\tminute: '2-digit',\n\t}\n\n\tconst today = new Date()\n\n\tif (!isSameDate(dueDate, today)) {\n\t\tformatOptions = {\n\t\t\t...formatOptions,\n\t\t\tweekday: 'short',\n\t\t}\n\t}\n\n\tif (!isSameWeek(dueDate, today)) {\n\t\tformatOptions = {\n\t\t\t...formatOptions,\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t}\n\t}\n\n\tif (dueDate.getFullYear() !== today.getFullYear()) {\n\t\tformatOptions = {\n\t\t\t...formatOptions,\n\t\t\tyear: 'numeric',\n\t\t}\n\t}\n\n\treturn dueDate.toLocaleString(\n\t\tgetCanonicalLocale(),\n\t\tformatOptions,\n\t)\n}\n\n/**\n *\n * @param dueDate\n */\nexport function getVerboseDateString(dueDate: Date): string {\n\tlet formatOptions: Intl.DateTimeFormatOptions = {\n\t\tmonth: 'long',\n\t\tday: 'numeric',\n\t\tweekday: 'long',\n\t\thour: 'numeric',\n\t\tminute: '2-digit',\n\t}\n\n\tconst today = new Date()\n\n\tif (dueDate.getFullYear() !== today.getFullYear()) {\n\t\tformatOptions = {\n\t\t\t...formatOptions,\n\t\t\tyear: 'numeric',\n\t\t}\n\t}\n\n\treturn dueDate.toLocaleString(\n\t\tgetCanonicalLocale(),\n\t\tformatOptions,\n\t)\n}\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { INode } from '@nextcloud/files'\n\nimport AlarmOffSvg from '@mdi/svg/svg/alarm-off.svg?raw'\nimport { emit } from '@nextcloud/event-bus'\nimport { FileAction } from '@nextcloud/files'\nimport { t } from '@nextcloud/l10n'\nimport { clearReminder } from '../services/reminderService.ts'\nimport { getVerboseDateString } from '../shared/utils.ts'\n\nexport const action = new FileAction({\n\tid: 'clear-reminder',\n\n\tdisplayName: () => t('files_reminders', 'Clear reminder'),\n\n\ttitle: (nodes: INode[]) => {\n\t\tconst node = nodes.at(0)!\n\t\tconst dueDate = new Date(node.attributes['reminder-due-date'])\n\t\treturn `${t('files_reminders', 'Clear reminder')} – ${getVerboseDateString(dueDate)}`\n\t},\n\n\ticonSvgInline: () => AlarmOffSvg,\n\n\tenabled: (nodes: INode[]) => {\n\t\t// Only allow on a single node\n\t\tif (nodes.length !== 1) {\n\t\t\treturn false\n\t\t}\n\t\tconst node = nodes.at(0)!\n\t\tconst dueDate = node.attributes['reminder-due-date']\n\t\treturn Boolean(dueDate)\n\t},\n\n\tasync exec(node: INode) {\n\t\tif (node.fileid) {\n\t\t\ttry {\n\t\t\t\tawait clearReminder(node.fileid)\n\t\t\t\tnode.attributes['reminder-due-date'] = ''\n\t\t\t\temit('files:node:updated', node)\n\t\t\t\treturn true\n\t\t\t} catch {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn null\n\t},\n\n\torder: 19,\n})\n","export default \"\"","/**\n * SPDX-FileCopyrightText: 2023 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('files_reminders')\n\t.detectUser()\n\t.build()\n","\n\n\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { INode } from '@nextcloud/files'\n\nimport { spawnDialog } from '@nextcloud/vue'\nimport SetCustomReminderModal from '../components/SetCustomReminderModal.vue'\n\n/**\n * @param node - The file or folder node to set the custom reminder for\n */\nexport async function pickCustomDate(node: INode): Promise {\n\tawait spawnDialog(SetCustomReminderModal, {\n\t\tnode,\n\t})\n}\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { INode } from '@nextcloud/files'\n\nimport AlarmSvg from '@mdi/svg/svg/alarm.svg?raw'\nimport { FileAction } from '@nextcloud/files'\nimport { t } from '@nextcloud/l10n'\nimport { pickCustomDate } from '../services/customPicker.ts'\nimport { getVerboseDateString } from '../shared/utils.ts'\n\nexport const action = new FileAction({\n\tid: 'reminder-status',\n\n\tinline: () => true,\n\n\tdisplayName: () => '',\n\n\ttitle: (nodes: INode[]) => {\n\t\tconst node = nodes.at(0)!\n\t\tconst dueDate = new Date(node.attributes['reminder-due-date'])\n\t\treturn `${t('files_reminders', 'Reminder set')} – ${getVerboseDateString(dueDate)}`\n\t},\n\n\ticonSvgInline: () => AlarmSvg,\n\n\tenabled: (nodes: INode[]) => {\n\t\t// Only allow on a single node\n\t\tif (nodes.length !== 1) {\n\t\t\treturn false\n\t\t}\n\t\tconst node = nodes.at(0)!\n\t\tconst dueDate = node.attributes['reminder-due-date']\n\t\treturn Boolean(dueDate)\n\t},\n\n\tasync exec(node: INode) {\n\t\tawait pickCustomDate(node)\n\t\treturn null\n\t},\n\n\torder: -15,\n})\n","export default \"\"","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { INode, View } from '@nextcloud/files'\n\nimport AlarmSvg from '@mdi/svg/svg/alarm.svg?raw'\nimport { FileAction } from '@nextcloud/files'\nimport { translate as t } from '@nextcloud/l10n'\n\nexport const SET_REMINDER_MENU_ID = 'set-reminder-menu'\n\nexport const action = new FileAction({\n\tid: SET_REMINDER_MENU_ID,\n\tdisplayName: () => t('files_reminders', 'Set reminder'),\n\ticonSvgInline: () => AlarmSvg,\n\n\tenabled: (nodes: INode[], view: View) => {\n\t\tif (view.id === 'trashbin') {\n\t\t\treturn false\n\t\t}\n\t\t// Only allow on a single INode\n\t\tif (nodes.length !== 1) {\n\t\t\treturn false\n\t\t}\n\t\tconst node = nodes.at(0)!\n\t\tconst dueDate = node.attributes['reminder-due-date']\n\t\treturn dueDate !== undefined\n\t},\n\n\tasync exec() {\n\t\treturn null\n\t},\n\n\torder: 20,\n})\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { INode, View } from '@nextcloud/files'\n\nimport CalendarClockSvg from '@mdi/svg/svg/calendar-clock.svg?raw'\nimport { FileAction } from '@nextcloud/files'\nimport { t } from '@nextcloud/l10n'\nimport { pickCustomDate } from '../services/customPicker.ts'\nimport { SET_REMINDER_MENU_ID } from './setReminderMenuAction.ts'\n\nexport const action = new FileAction({\n\tid: 'set-reminder-custom',\n\tdisplayName: () => t('files_reminders', 'Custom reminder'),\n\ttitle: () => t('files_reminders', 'Reminder at custom date & time'),\n\ticonSvgInline: () => CalendarClockSvg,\n\n\tenabled: (nodes: INode[], view: View) => {\n\t\tif (view.id === 'trashbin') {\n\t\t\treturn false\n\t\t}\n\t\t// Only allow on a single INode\n\t\tif (nodes.length !== 1) {\n\t\t\treturn false\n\t\t}\n\t\tconst node = nodes.at(0)!\n\t\tconst dueDate = node.attributes['reminder-due-date']\n\t\treturn dueDate !== undefined\n\t},\n\n\tparent: SET_REMINDER_MENU_ID,\n\n\tasync exec(file: INode) {\n\t\tpickCustomDate(file)\n\t\treturn null\n\t},\n\n\t// After presets\n\torder: 22,\n})\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { INode, View } from '@nextcloud/files'\n\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { emit } from '@nextcloud/event-bus'\nimport { FileAction } from '@nextcloud/files'\nimport { t } from '@nextcloud/l10n'\nimport { setReminder } from '../services/reminderService.ts'\nimport { logger } from '../shared/logger.ts'\nimport { DateTimePreset, getDateString, getDateTime, getVerboseDateString } from '../shared/utils.ts'\nimport { SET_REMINDER_MENU_ID } from './setReminderMenuAction.ts'\n\nimport './setReminderSuggestionActions.scss'\n\ninterface ReminderOption {\n\tdateTimePreset: DateTimePreset\n\tlabel: string\n\tariaLabel: string\n\tdateString?: string\n\tverboseDateString?: string\n\taction?: () => Promise\n}\n\nconst laterToday: ReminderOption = {\n\tdateTimePreset: DateTimePreset.LaterToday,\n\tlabel: t('files_reminders', 'Later today'),\n\tariaLabel: t('files_reminders', 'Set reminder for later today'),\n\tdateString: '',\n\tverboseDateString: '',\n}\n\nconst tomorrow: ReminderOption = {\n\tdateTimePreset: DateTimePreset.Tomorrow,\n\tlabel: t('files_reminders', 'Tomorrow'),\n\tariaLabel: t('files_reminders', 'Set reminder for tomorrow'),\n\tdateString: '',\n\tverboseDateString: '',\n}\n\nconst thisWeekend: ReminderOption = {\n\tdateTimePreset: DateTimePreset.ThisWeekend,\n\tlabel: t('files_reminders', 'This weekend'),\n\tariaLabel: t('files_reminders', 'Set reminder for this weekend'),\n\tdateString: '',\n\tverboseDateString: '',\n}\n\nconst nextWeek: ReminderOption = {\n\tdateTimePreset: DateTimePreset.NextWeek,\n\tlabel: t('files_reminders', 'Next week'),\n\tariaLabel: t('files_reminders', 'Set reminder for next week'),\n\tdateString: '',\n\tverboseDateString: '',\n}\n\n/**\n * Generate a file action for the given option\n *\n * @param option The option to generate the action for\n * @return The file action or null if the option should not be shown\n */\nfunction generateFileAction(option: ReminderOption): FileAction | null {\n\treturn new FileAction({\n\t\tid: `set-reminder-${option.dateTimePreset}`,\n\t\tdisplayName: () => `${option.label} – ${option.dateString}`,\n\t\ttitle: () => `${option.ariaLabel} – ${option.verboseDateString}`,\n\n\t\t// Empty svg to hide the icon\n\t\ticonSvgInline: () => '',\n\n\t\tenabled: (nodes: INode[], view: View) => {\n\t\t\tif (view.id === 'trashbin') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Only allow on a single INode\n\t\t\tif (nodes.length !== 1) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst node = nodes.at(0)!\n\t\t\tconst dueDate = node.attributes['reminder-due-date']\n\t\t\treturn dueDate !== undefined && Boolean(getDateTime(option.dateTimePreset))\n\t\t},\n\n\t\tparent: SET_REMINDER_MENU_ID,\n\n\t\tasync exec(node: INode) {\n\t\t\t// Can't really happen, but just in case™\n\t\t\tif (!node.fileid) {\n\t\t\t\tlogger.error('Failed to set reminder, missing file id')\n\t\t\t\tshowError(t('files_reminders', 'Failed to set reminder'))\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Set the reminder\n\t\t\ttry {\n\t\t\t\tconst dateTime = getDateTime(option.dateTimePreset)!\n\t\t\t\tawait setReminder(node.fileid, dateTime)\n\t\t\t\tnode.attributes['reminder-due-date'] = dateTime.toISOString()\n\t\t\t\temit('files:node:updated', node)\n\t\t\t\tshowSuccess(t('files_reminders', 'Reminder set for \"{fileName}\"', { fileName: node.basename }))\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Failed to set reminder', { error })\n\t\t\t\tshowError(t('files_reminders', 'Failed to set reminder'))\n\t\t\t}\n\t\t\t// Silent success as we display our own notification\n\t\t\treturn null\n\t\t},\n\n\t\torder: 21,\n\t})\n}\n\n[laterToday, tomorrow, thisWeekend, nextWeek].forEach((option) => {\n\t// Generate the initial date string\n\tconst dateTime = getDateTime(option.dateTimePreset)\n\tif (!dateTime) {\n\t\treturn\n\t}\n\toption.dateString = getDateString(dateTime)\n\toption.verboseDateString = getVerboseDateString(dateTime)\n\n\t// Update the date string every 30 minutes\n\tsetInterval(() => {\n\t\tconst dateTime = getDateTime(option.dateTimePreset)\n\t\tif (!dateTime) {\n\t\t\treturn\n\t\t}\n\n\t\t// update the submenu remind options strings\n\t\toption.dateString = getDateString(dateTime)\n\t\toption.verboseDateString = getVerboseDateString(dateTime)\n\t}, 1000 * 30 * 60)\n})\n\n// Generate the default preset actions\nexport const actions = [laterToday, tomorrow, thisWeekend, nextWeek]\n\t.map(generateFileAction) as FileAction[]\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { registerFileAction } from '@nextcloud/files'\nimport { registerDavProperty } from '@nextcloud/files/dav'\nimport { action as clearAction } from './files_actions/clearReminderAction.ts'\nimport { action as statusAction } from './files_actions/reminderStatusAction.ts'\nimport { action as customAction } from './files_actions/setReminderCustomAction.ts'\nimport { action as menuAction } from './files_actions/setReminderMenuAction.ts'\nimport { actions as suggestionActions } from './files_actions/setReminderSuggestionActions.ts'\n\nregisterDavProperty('nc:reminder-due-date', { nc: 'http://nextcloud.org/ns' })\n\nregisterFileAction(statusAction)\nregisterFileAction(clearAction)\nregisterFileAction(menuAction)\nregisterFileAction(customAction)\nsuggestionActions.forEach((action) => registerFileAction(action))\n"],"names":["AlarmOffSvg","setReminder","fileId","dueDate","url","generateOcsUrl","axios","clearReminder","DateTimePreset","getFirstWorkdayOfWeek","now","getWeek","date","firstDayOfYear","daysFromFirstDay","isSameWeek","a","b","isSameDate","getDateTime","dateTime","evening","cutoff","day","today","saturday","firstWorkdayOfWeek","workday","getInitialCustomDueDate","getDateString","formatOptions","getCanonicalLocale","getVerboseDateString","action","FileAction","t","nodes","node","emit","AlarmSvg","logger","getLoggerBuilder","props","__props","__emit","hasDueDate","ref","opened","isValid","customDueDate","nowDate","onBeforeMount","onMounted","input","setCustom","showError","emitEventBus","showSuccess","onClose","error","clear","onInput","_createBlock","_unref","NcDialog","_createVNode","NcButton","_createElementVNode","NcDateTimePickerNative","$event","NcNoteCard","_createTextVNode","_toDisplayString","NcDateTime","pickCustomDate","spawnDialog","SetCustomReminderModal","CalendarClockSvg","SET_REMINDER_MENU_ID","view","file","laterToday","tomorrow","thisWeekend","nextWeek","generateFileAction","option","actions","registerDavProperty","registerFileAction","statusAction","clearAction","menuAction","customAction","suggestionActions"],"mappings":"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","x_google_ignoreList":[0,4,9]}