UNPKG

@nextcloud/calendar-availability-vue

Version:

Weekly calendar availability component for Nextcloud apps

1 lines 20.9 kB
{"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\" :key=\"`day-label-${day.id}`\">\n\t\t\t<li 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\" :key=\"`slot-${day.id}-${idx}`\">\n\t\t\t\t\t\t\t<div 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 { NcButton, NcDateTimePickerNative } from '@nextcloud/vue'\nimport IconDelete from 'vue-material-design-icons/TrashCanOutline.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":["_createElementBlock","_Fragment","_renderList","_createElementVNode","_toDisplayString","_openBlock","_createVNode","_createBlock","slots","uuidv4"],"mappings":"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"}