// Shared timetable group form view-model builder. const { normalizeTimeZone } = require('../../../../data/timetables'); const COMMON_TIME_ZONES = [ 'UTC', 'Europe/London', 'Europe/Dublin', 'Europe/Paris', 'Europe/Berlin', 'Europe/Madrid', 'America/New_York', 'America/Chicago', 'America/Denver', 'America/Los_Angeles', 'America/Toronto', 'America/Vancouver', 'America/Sao_Paulo', 'Asia/Dubai', 'Asia/Kolkata', 'Asia/Singapore', 'Asia/Tokyo', 'Asia/Seoul', 'Australia/Sydney', 'Pacific/Auckland' ]; function buildDefaultTimetableGroup() { return { id: null, name: '', shortDescription: '', timezone: 'Europe/London' }; } function formatDateTimeLocalValue(value, timeZone) { if (!value) { return ''; } const date = new Date(value); if (Number.isNaN(date.getTime())) { return ''; } const resolvedTimeZone = normalizeTimeZone(timeZone, 'Europe/London'); const parts = new Intl.DateTimeFormat('en-GB', { timeZone: resolvedTimeZone, hour12: false, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }).formatToParts(date).reduce(function (acc, part) { if (part && part.type && part.type !== 'literal') { acc[part.type] = part.value; } return acc; }, Object.create(null)); if (!parts.year || !parts.month || !parts.day || !parts.hour || !parts.minute) { return ''; } return [ String(parts.year).padStart(4, '0'), '-', String(parts.month).padStart(2, '0'), '-', String(parts.day).padStart(2, '0'), 'T', String(parts.hour).padStart(2, '0'), ':', String(parts.minute).padStart(2, '0') ].join(''); } function buildTimetableGroupFormViewModel(timetableGroup, timetableEntries, message, currentUser, isEdit, options) { const viewTimetableGroup = Object.assign(buildDefaultTimetableGroup(), timetableGroup || {}); viewTimetableGroup.timezone = normalizeTimeZone(viewTimetableGroup.timezone, 'Europe/London'); const viewOptions = options || {}; const viewTimetableEntries = Array.isArray(timetableEntries) && timetableEntries.length ? timetableEntries.map(function (entry) { return Object.assign({}, entry, { startValue: formatDateTimeLocalValue(entry.start_datetime, viewTimetableGroup.timezone), endValue: formatDateTimeLocalValue(entry.end_datetime, viewTimetableGroup.timezone) }); }) : [{ id: null, title: '', short_description: '', startValue: '', endValue: '', sort_order: 0 }]; return { title: isEdit ? 'Edit timetable group' : 'Add timetable group', active: 'timetables', message: message, currentUser: currentUser || null, messageVariant: viewOptions.messageVariant || '', isEdit: Boolean(isEdit), timetableGroup: viewTimetableGroup, timeZoneOptions: COMMON_TIME_ZONES, timetableEntries: viewTimetableEntries, inUse: Boolean(viewTimetableGroup.inUse), showSaveSecondaryActions: true, cancelConfirmMessage: "You've made changes. Are you sure you want to leave this page?", deleteConfirmMessage: isEdit ? 'Delete this timetable group?' : '', deleteDisabled: !isEdit || Boolean(viewTimetableGroup.inUse), formAction: isEdit && viewTimetableGroup.id ? '/data-sources/timetables/' + viewTimetableGroup.id : '/data-sources/timetables', formAttrs: 'data-async-save' + (isEdit ? ' data-async-save-close-url="/data-sources/timetables"' : ' data-async-save-new-redirect="response-url"') + ' data-async-save-new-url="/data-sources/timetables/new"', cancelUrl: '/data-sources/timetables', deleteUrl: isEdit && viewTimetableGroup.id ? '/data-sources/timetables/' + viewTimetableGroup.id + '/delete' : '', assetVersion: Date.now().toString(36) }; } module.exports = { buildTimetableGroupFormViewModel: buildTimetableGroupFormViewModel };