{"version":3,"file":"index.mjs","sources":["../src/CalendarAvailability.vue","../src/utils/logger.js","../src/convert.js"],"sourcesContent":["<!--\n  - SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: MIT\n-->\n<template>\n\t<ul class=\"week-day-container\" :aria-label=\"l10nWeekDayListLabel\">\n\t\t<template v-for=\"day in internalSlots\">\n\t\t\t<li :key=\"`day-label-${day.id}`\" class=\"day-container\">\n\t\t\t\t<div class=\"label-weekday\">\n\t\t\t\t\t<span :id=\"day.displayName + '-label'\">{{ day.displayName }}</span>\n\t\t\t\t</div>\n\t\t\t\t<div :key=\"`day-slots-${day.id}`\" class=\"availability-slots\">\n\t\t\t\t\t<div class=\"availability-slot-group\">\n\t\t\t\t\t\t<template v-for=\"(slot, idx) in day.slots\">\n\t\t\t\t\t\t\t<div :key=\"`slot-${day.id}-${idx}`\" class=\"availability-slot\">\n\t\t\t\t\t\t\t\t<NcDateTimePickerNative :id=\"`start-${day.id}-${idx}`\"\n\t\t\t\t\t\t\t\t\tv-model=\"slot.start\"\n\t\t\t\t\t\t\t\t\ttype=\"time\"\n\t\t\t\t\t\t\t\t\t:label=\"l10nStartPickerLabel?.(day.displayName)\"\n\t\t\t\t\t\t\t\t\t:hide-label=\"true\"\n\t\t\t\t\t\t\t\t\tclass=\"start-date\"\n\t\t\t\t\t\t\t\t\t@change=\"onChangeSlots\" />\n\t\t\t\t\t\t\t\t<span class=\"to-text\">\n\t\t\t\t\t\t\t\t\t{{ l10nTo }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<NcDateTimePickerNative :id=\"`end-${day.id}-${idx}`\"\n\t\t\t\t\t\t\t\t\tv-model=\"slot.end\"\n\t\t\t\t\t\t\t\t\ttype=\"time\"\n\t\t\t\t\t\t\t\t\t:label=\"l10nEndPickerLabel?.(day.displayName)\"\n\t\t\t\t\t\t\t\t\t:hide-label=\"true\"\n\t\t\t\t\t\t\t\t\tclass=\"end-date\"\n\t\t\t\t\t\t\t\t\t@change=\"onChangeSlots\" />\n\t\t\t\t\t\t\t\t<NcButton :key=\"`slot-${day.id}-${idx}-btn`\"\n\t\t\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\t\t\tclass=\"button\"\n\t\t\t\t\t\t\t\t\t:aria-label=\"l10nDeleteSlot\"\n\t\t\t\t\t\t\t\t\t:title=\"l10nDeleteSlot\"\n\t\t\t\t\t\t\t\t\t@click=\"removeSlot(day, idx)\">\n\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t<IconDelete :size=\"20\" />\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span v-if=\"day.slots.length === 0\"\n\t\t\t\t\t\tclass=\"empty-content\">\n\t\t\t\t\t\t{{ l10nEmptyDay }}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<NcButton :key=\"`add-slot-${day.id}`\"\n\t\t\t\t\t:disabled=\"loading\"\n\t\t\t\t\tclass=\"add-another button\"\n\t\t\t\t\t:title=\"l10nAddSlot\"\n\t\t\t\t\t:aria-label=\"l10nAddSlot\"\n\t\t\t\t\t@click=\"addSlot(day)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<IconAdd :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcButton>\n\t\t\t</li>\n\t\t</template>\n\t</ul>\n</template>\n\n<script>\nimport NcDateTimePickerNative from '@nextcloud/vue/dist/Components/NcDateTimePickerNative.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport IconDelete from 'vue-material-design-icons/Delete.vue'\nimport IconAdd from 'vue-material-design-icons/Plus.vue'\n\nimport { getFirstDay } from '@nextcloud/l10n'\n\nexport default {\n\tname: 'CalendarAvailability',\n\tcomponents: {\n\t\tNcDateTimePickerNative,\n\t\tNcButton,\n\t\tIconAdd,\n\t\tIconDelete,\n\t},\n\tprops: {\n\t\tslots: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tl10nTo: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tl10nDeleteSlot: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tl10nEmptyDay: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tl10nAddSlot: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tl10nWeekDayListLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Weekdays',\n\t\t},\n\t\tl10nMonday: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tl10nTuesday: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tl10nWednesday: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tl10nThursday: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tl10nFriday: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tl10nSaturday: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tl10nSunday: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tl10nStartPickerLabel: {\n\t\t\ttype: Function,\n\t\t\tdefault: (dayName) => `Pick a start time for ${dayName}`,\n\t\t},\n\t\tl10nEndPickerLabel: {\n\t\t\ttype: Function,\n\t\t\tdefault: (dayName) => `Pick a end time for ${dayName}`,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tinternalSlots: this.slotsToInternalData(this.slots),\n\t\t}\n\t},\n\twatch: {\n\t\tslots() {\n\t\t\tthis.internalSlots = this.slotsToInternalData(this.slots)\n\t\t},\n\t},\n\tmethods: {\n\t\ttimeStampSlotsToDateObjectSlots(slots) {\n\t\t\treturn slots.map(slot => ({\n\t\t\t\tstart: new Date(slot.start * 1000),\n\t\t\t\tend: new Date(slot.end * 1000),\n\t\t\t}))\n\t\t},\n\t\tslotsToInternalData() {\n\t\t\tconst moToSa = [\n\t\t\t\t{\n\t\t\t\t\tid: 'MO',\n\t\t\t\t\tdisplayName: this.l10nMonday,\n\t\t\t\t\tslots: this.timeStampSlotsToDateObjectSlots(this.slots.MO),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'TU',\n\t\t\t\t\tdisplayName: this.l10nTuesday,\n\t\t\t\t\tslots: this.timeStampSlotsToDateObjectSlots(this.slots.TU),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'WE',\n\t\t\t\t\tdisplayName: this.l10nWednesday,\n\t\t\t\t\tslots: this.timeStampSlotsToDateObjectSlots(this.slots.WE),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'TH',\n\t\t\t\t\tdisplayName: this.l10nThursday,\n\t\t\t\t\tslots: this.timeStampSlotsToDateObjectSlots(this.slots.TH),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'FR',\n\t\t\t\t\tdisplayName: this.l10nFriday,\n\t\t\t\t\tslots: this.timeStampSlotsToDateObjectSlots(this.slots.FR),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'SA',\n\t\t\t\t\tdisplayName: this.l10nSaturday,\n\t\t\t\t\tslots: this.timeStampSlotsToDateObjectSlots(this.slots.SA),\n\t\t\t\t},\n\t\t\t]\n\t\t\tconst sunday = {\n\t\t\t\tid: 'SU',\n\t\t\t\tdisplayName: this.l10nSunday,\n\t\t\t\tslots: this.timeStampSlotsToDateObjectSlots(this.slots.SU),\n\t\t\t}\n\n\t\t\treturn getFirstDay() === 1 ? [...moToSa, sunday] : [sunday, ...moToSa]\n\t\t},\n\t\tinternalDataToSlots() {\n\t\t\tconst converted = {}\n\t\t\tthis.internalSlots.forEach(({ id, slots }) => {\n\t\t\t\tconverted[id] = slots.map(slot => ({\n\t\t\t\t\tstart: Math.round(slot.start.getTime() / 1000),\n\t\t\t\t\tend: Math.round(slot.end.getTime() / 1000),\n\t\t\t\t}))\n\t\t\t})\n\t\t\treturn converted\n\t\t},\n\t\taddSlot(day) {\n\t\t\tconst start = new Date()\n\t\t\tstart.setHours(9, 0, 0, 0)\n\t\t\tconst end = new Date()\n\t\t\tend.setHours(17, 0, 0, 0)\n\n\t\t\tday.slots.push({\n\t\t\t\tstart,\n\t\t\t\tend,\n\t\t\t})\n\n\t\t\tthis.onChangeSlots()\n\t\t},\n\t\tremoveSlot(day, idx) {\n\t\t\tday.slots.splice(idx, 1)\n\n\t\t\tthis.onChangeSlots()\n\t\t},\n\t\tonChangeSlots() {\n\t\t\tthis.$emit('update:slots', this.internalDataToSlots())\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.availability-day {\n\tpadding: 0 10px 0 10px;\n\tposition: absolute;\n}\n.availability-slots {\n\tmax-width: 332px;\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: flex-start;\n\twhite-space: nowrap;\n}\n.availability-slot {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n}\n.availability-slot-group {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n.time-zone {\n\tpadding: 32px 12px 12px 0;\n}\n.week-day-container {\n\tbox-sizing: border-box;\n\tmargin-bottom: 32px;\n\tmax-width: 500px;\n\twidth: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: flex-start;\n}\n.button {\n\talign-self: flex-end;\n}\n.label-weekday {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: flex-start;\n\tmin-width: 77px;\n\twidth: 77px;\n\n\t> span {\n\t\theight: 50px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n}\n.add-another {\n\tbackground-color: transparent;\n\tborder: none;\n\topacity: .5;\n\tdisplay: inline-flex;\n\tpadding: 0;\n\tmargin: 0;\n\tmargin-bottom: 3px;\n\n\t&:hover {\n\t\topacity: 1;\n\t}\n}\n.to-text {\n\tpadding-right: 12px;\n}\n.time-zone-text{\n\tpadding-left: 22px;\n}\n.empty-content {\n\tcolor: var(--color-text-lighter);\n\tdisplay: inline-flex;\n\talign-items: center;\n}\n.start-date {\n\tpadding-right: 12px;\n}\n.day-container {\n\tdisplay: flex;\n\tmax-width: 500px;\n\twidth: 100%;\n\tgap: 24px;\n\tborder-top: 1px solid var(--color-border);\n\tpadding-top: calc(3 * var(--default-grid-baseline));\n\tmargin-top: calc(2 * var(--default-grid-baseline));\n\talign-items: center;\n\n\t& > button {\n\t\talign-self: center;\n\t}\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: MIT\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.detectUser()\n\t.setApp('@nextcloud/calendar-availability-vue')\n\t.build()\n","/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: MIT\n */\n\nimport { getZoneString } from 'icalzone'\nimport ICAL from 'ical.js'\nimport { v4 as uuidv4 } from 'uuid'\nimport logger from './utils/logger.js'\n\n/**\n *\n */\nexport function getEmptySlots() {\n\treturn {\n\t\tMO: [],\n\t\tTU: [],\n\t\tWE: [],\n\t\tTH: [],\n\t\tFR: [],\n\t\tSA: [],\n\t\tSU: [],\n\t}\n}\n\n/**\n *\n * @param vavailability\n */\nexport function vavailabilityToSlots(vavailability) {\n\tconst parsedIcal = ICAL.parse(vavailability)\n\n\tconst vcalendarComp = new ICAL.Component(parsedIcal)\n\tconst vavailabilityComp = vcalendarComp.getFirstSubcomponent('vavailability')\n\n\tlet timezoneId\n\tconst timezoneComp = vcalendarComp.getFirstSubcomponent('vtimezone')\n\tif (timezoneComp) {\n\t\ttimezoneId = timezoneComp.getFirstProperty('tzid').getFirstValue()\n\t}\n\n\tconst availableComps = vavailabilityComp.getAllSubcomponents('available')\n\t// Combine all AVAILABLE blocks into a week of slots\n\tconst slots = getEmptySlots()\n\tavailableComps.forEach((availableComp) => {\n\t\tconst startIcalDate = availableComp.getFirstProperty('dtstart').getFirstValue()\n\t\tconst endIcalDate = availableComp.getFirstProperty('dtend').getFirstValue()\n\t\tconst rrule = availableComp.getFirstProperty('rrule')\n\n\t\t// Prevent date to be converted to local time zone (and to be shifted by the utc offset).\n\t\t// Instead, set hh:mm directly as if they are in the component's time zone.\n\t\tconst start = new Date()\n\t\tstart.setHours(startIcalDate.hour, startIcalDate.minute, 0, 0)\n\t\tconst end = new Date()\n\t\tend.setHours(endIcalDate.hour, endIcalDate.minute, 0, 0)\n\n\t\tif (rrule.getFirstValue().freq !== 'WEEKLY') {\n\t\t\tlogger.warn('rrule not supported', {\n\t\t\t\trrule: rrule.toICALString(),\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\trrule.getFirstValue().getComponent('BYDAY').forEach(day => {\n\t\t\tslots[day].push({\n\t\t\t\tstart: start.getTime() / 1000,\n\t\t\t\tend: end.getTime() / 1000,\n\t\t\t})\n\t\t})\n\t})\n\n\treturn {\n\t\tslots,\n\t\ttimezoneId,\n\t}\n}\n\n/**\n *\n * @param slots\n * @param timezoneId\n */\nexport function slotsToVavailability(slots, timezoneId) {\n\tconst vcalendarComp = new ICAL.Component('vcalendar')\n\tvcalendarComp.addPropertyWithValue('prodid', 'Nextcloud DAV app')\n\n\t// Store time zone info\n\t// If possible we use the info from a time zone database\n\tconst predefinedTimezoneIcal = getZoneString(timezoneId)\n\tif (predefinedTimezoneIcal) {\n\t\tconst timezoneComp = new ICAL.Component(ICAL.parse(predefinedTimezoneIcal))\n\t\tvcalendarComp.addSubcomponent(timezoneComp)\n\t} else {\n\t\t// Fall back to a simple markup\n\t\tconst timezoneComp = new ICAL.Component('vtimezone')\n\t\ttimezoneComp.addPropertyWithValue('tzid', timezoneId)\n\t\tvcalendarComp.addSubcomponent(timezoneComp)\n\t}\n\n\t// Store availability info\n\tconst vavailabilityComp = new ICAL.Component('vavailability')\n\n\t// Deduplicate by start and end time\n\tconst deduplicated = slots.reduce((acc, slot) => {\n\t\tconst start = new Date(slot.start * 1000)\n\t\tconst end = new Date(slot.end * 1000)\n\n\t\tconst key = [\n\t\t\tstart.getHours(),\n\t\t\tstart.getMinutes(),\n\t\t\tend.getHours(),\n\t\t\tend.getMinutes(),\n\t\t].join('-')\n\n\t\treturn {\n\t\t\t...acc,\n\t\t\t[key]: [...(acc[key] ?? []), slot],\n\t\t}\n\t}, {})\n\n\t// Create an AVAILABILITY component for every recurring slot\n\tObject.keys(deduplicated).map(key => {\n\t\tconst slots = deduplicated[key]\n\t\tconst start = slots[0].start\n\t\tconst end = slots[0].end\n\t\t// Combine days but make them also unique\n\t\tconst days = slots.map(slot => slot.day).filter((day, index, self) => self.indexOf(day) === index)\n\n\t\tconst availableComp = new ICAL.Component('available')\n\n\t\t// Define DTSTART and DTEND\n\t\tconst startTimeProp = availableComp.addPropertyWithValue('dtstart', ICAL.Time.fromJSDate(new Date(start * 1000), false))\n\t\tstartTimeProp.setParameter('tzid', timezoneId)\n\t\tconst endTimeProp = availableComp.addPropertyWithValue('dtend', ICAL.Time.fromJSDate(new Date(end * 1000), false))\n\t\tendTimeProp.setParameter('tzid', timezoneId)\n\n\t\t// Add mandatory UID\n\t\tavailableComp.addPropertyWithValue('uid', uuidv4())\n\n\t\t// TODO: add optional summary\n\n\t\t// Define RRULE\n\t\tavailableComp.addPropertyWithValue('rrule', {\n\t\t\tfreq: 'WEEKLY',\n\t\t\tbyday: days,\n\t\t})\n\n\t\treturn availableComp\n\t}).map(vavailabilityComp.addSubcomponent.bind(vavailabilityComp))\n\n\tvcalendarComp.addSubcomponent(vavailabilityComp)\n\n\treturn vcalendarComp.toString()\n}\n"],"names":["slots","uuidv4"],"mappings":"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"}