@royalschedule/maps 4.0.30 → 4.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Additio/from/courses.js.map +1 -1
- package/dist/Additio/from/events.js.map +1 -1
- package/dist/Additio/from/groups.js.map +1 -1
- package/dist/Additio/from/index.js.map +1 -1
- package/dist/Additio/from/locations.js.map +1 -1
- package/dist/Additio/from/persons.js.map +1 -1
- package/dist/Additio/from/schedules.d.ts +0 -1
- package/dist/Additio/from/schedules.js +4 -2
- package/dist/Additio/from/schedules.js.map +1 -1
- package/dist/Additio/from/teachers.js.map +1 -1
- package/dist/Additio/to/index.d.ts +2 -4
- package/dist/Additio/to/schedules.js +4 -2
- package/dist/Additio/to/schedules.js.map +1 -1
- package/dist/Admentum/from/courses.js.map +1 -1
- package/dist/Admentum/from/events.js.map +1 -1
- package/dist/Admentum/from/groups.js.map +1 -1
- package/dist/Admentum/from/index.js.map +1 -1
- package/dist/Admentum/from/locations.js.map +1 -1
- package/dist/Admentum/from/persons.js.map +1 -1
- package/dist/Admentum/from/schedules.d.ts +0 -1
- package/dist/Admentum/from/schedules.js +6 -3
- package/dist/Admentum/from/schedules.js.map +1 -1
- package/dist/Admentum/from/teachers.js.map +1 -1
- package/dist/Admentum/to/index.d.ts +0 -1
- package/dist/Admentum/to/schedules.js +7 -4
- package/dist/Admentum/to/schedules.js.map +1 -1
- package/dist/Excel/index.d.ts +4 -4
- package/dist/Excel/v1/from/index.js +1 -1
- package/dist/Excel/v1/from/index.js.map +1 -1
- package/dist/Excel/v1/index.d.ts +1 -1
- package/dist/Excel/v2/from/index.js +54 -45
- package/dist/Excel/v2/from/index.js.map +1 -1
- package/dist/Excel/v2/index.d.ts +4 -4
- package/dist/IdunSoft/from/courses.js.map +1 -1
- package/dist/IdunSoft/from/events.js +2 -1
- package/dist/IdunSoft/from/events.js.map +1 -1
- package/dist/IdunSoft/from/groups.js.map +1 -1
- package/dist/IdunSoft/from/index.js.map +1 -1
- package/dist/IdunSoft/from/locations.js.map +1 -1
- package/dist/IdunSoft/from/schedules.d.ts +0 -1
- package/dist/IdunSoft/from/schedules.js.map +1 -1
- package/dist/IdunSoft/from/teachers.js.map +1 -1
- package/dist/IdunSoft/to/index.d.ts +0 -1
- package/dist/IdunSoft/to/schedules.js +6 -3
- package/dist/IdunSoft/to/schedules.js.map +1 -1
- package/dist/InfoMentor/to/index.d.ts +0 -1
- package/dist/InfoMentor/to/schedules.js +2 -1
- package/dist/InfoMentor/to/schedules.js.map +1 -1
- package/dist/PlanDigital/from/index.js.map +1 -1
- package/dist/PlanDigital/from/schedules.js +11 -9
- package/dist/PlanDigital/from/schedules.js.map +1 -1
- package/dist/PlanDigital/index.d.ts +0 -1
- package/dist/Quiculum/file/to/index.d.ts +0 -1
- package/dist/Quiculum/file/to/schedules.js +9 -5
- package/dist/Quiculum/file/to/schedules.js.map +1 -1
- package/dist/RS/from/division.d.ts +0 -1
- package/dist/RS/from/division.js +2 -1
- package/dist/RS/from/division.js.map +1 -1
- package/dist/RS/from/index.js.map +1 -1
- package/dist/RS/from/schedules.d.ts +0 -1
- package/dist/RS/from/schedules.js.map +1 -1
- package/dist/RS/make-connected.d.ts +1 -3
- package/dist/RS/make-connected.js +42 -33
- package/dist/RS/make-connected.js.map +1 -1
- package/dist/RS/to/index.js.map +1 -1
- package/dist/RS/to/initial-configuration.js +6 -4
- package/dist/RS/to/initial-configuration.js.map +1 -1
- package/dist/RS/to/input/collections.js.map +1 -1
- package/dist/RS/to/input/default.js +2 -1
- package/dist/RS/to/input/default.js.map +1 -1
- package/dist/RS/to/input/dependencies.js +2 -1
- package/dist/RS/to/input/dependencies.js.map +1 -1
- package/dist/RS/to/input/dynamic-locked-times.js +2 -1
- package/dist/RS/to/input/dynamic-locked-times.js.map +1 -1
- package/dist/RS/to/input/events.js.map +1 -1
- package/dist/RS/to/input/groups.js.map +1 -1
- package/dist/RS/to/input/individuals.js +2 -1
- package/dist/RS/to/input/individuals.js.map +1 -1
- package/dist/RS/to/input/input.js +2 -1
- package/dist/RS/to/input/input.js.map +1 -1
- package/dist/RS/to/input/intervals.js +4 -2
- package/dist/RS/to/input/intervals.js.map +1 -1
- package/dist/RS/to/input/periods.js +4 -2
- package/dist/RS/to/input/periods.js.map +1 -1
- package/dist/RS/to/input/settings.js.map +1 -1
- package/dist/RS/to/input/teachers.js.map +1 -1
- package/dist/RS/to/input/util/attach-locked-times.js.map +1 -1
- package/dist/RS/to/input/util/parse-days.js.map +1 -1
- package/dist/RS/to/input/util/parse-group-references.js.map +1 -1
- package/dist/RS/to/input/util/parse-intervals.js +4 -2
- package/dist/RS/to/input/util/parse-intervals.js.map +1 -1
- package/dist/RS/to/input/util/parse-location-references.js +2 -1
- package/dist/RS/to/input/util/parse-location-references.js.map +1 -1
- package/dist/RS/to/input/util/parse-max-working-hours.js.map +1 -1
- package/dist/RS/to/input/util/parse-minimum-break-length.js.map +1 -1
- package/dist/RS/to/input/util/util.js +2 -1
- package/dist/RS/to/input/util/util.js.map +1 -1
- package/dist/RS/to/schedules.js.map +1 -1
- package/dist/RS/types/to.d.ts +0 -1
- package/dist/SS12000/from/activities.js +2 -1
- package/dist/SS12000/from/activities.js.map +1 -1
- package/dist/SS12000/from/calendar-events.js.map +1 -1
- package/dist/SS12000/from/duties.js.map +1 -1
- package/dist/SS12000/from/groups.js.map +1 -1
- package/dist/SS12000/from/index.js.map +1 -1
- package/dist/SS12000/from/persons.js.map +1 -1
- package/dist/SS12000/from/resources.js.map +1 -1
- package/dist/SS12000/from/rooms.js.map +1 -1
- package/dist/SS12000/from/syllabuses.js.map +1 -1
- package/dist/SS12000/index.d.ts +374 -194
- package/dist/SS12000/to/activities.js.map +1 -1
- package/dist/SS12000/to/calendar-events.js.map +1 -1
- package/dist/SS12000/to/common.js.map +1 -1
- package/dist/SS12000/to/duties.js.map +1 -1
- package/dist/SS12000/to/groups.js.map +1 -1
- package/dist/SS12000/to/index.d.ts +0 -1
- package/dist/SS12000/to/persons.js.map +1 -1
- package/dist/SS12000/to/resources.js.map +1 -1
- package/dist/SS12000/to/rooms.js.map +1 -1
- package/dist/SS12000/to/syllabuses.js.map +1 -1
- package/dist/SchoolSoft/api/from/index.js.map +1 -1
- package/dist/SchoolSoft/api/from/schedules.js +12 -8
- package/dist/SchoolSoft/api/from/schedules.js.map +1 -1
- package/dist/SchoolSoft/api/index.d.ts +7 -6
- package/dist/SchoolSoft/file/from/index.js.map +1 -1
- package/dist/SchoolSoft/file/from/schedules.js +87 -83
- package/dist/SchoolSoft/file/from/schedules.js.map +1 -1
- package/dist/SchoolSoft/file/index.d.ts +0 -1
- package/dist/SchoolSoft/file/to/index.d.ts +2 -3
- package/dist/SchoolSoft/file/to/schedules.js +2 -1
- package/dist/SchoolSoft/file/to/schedules.js.map +1 -1
- package/dist/SchoolSoft/index.d.ts +0 -1
- package/dist/Schoolity/txt/to/index.d.ts +0 -1
- package/dist/Schoolity/txt/to/schedules.js +12 -5
- package/dist/Schoolity/txt/to/schedules.js.map +1 -1
- package/dist/Skola24/mdb/from/course-and-events.js +5 -3
- package/dist/Skola24/mdb/from/course-and-events.js.map +1 -1
- package/dist/Skola24/mdb/from/groups.js.map +1 -1
- package/dist/Skola24/mdb/from/index.js.map +1 -1
- package/dist/Skola24/mdb/from/locations.js.map +1 -1
- package/dist/Skola24/mdb/from/schedule.d.ts +0 -1
- package/dist/Skola24/mdb/from/schedule.js.map +1 -1
- package/dist/Skola24/mdb/from/teachers.js.map +1 -1
- package/dist/Skola24/txt/from/calendar-exceptions.js +2 -1
- package/dist/Skola24/txt/from/calendar-exceptions.js.map +1 -1
- package/dist/Skola24/txt/from/division.js.map +1 -1
- package/dist/Skola24/txt/from/index.js.map +1 -1
- package/dist/Skola24/txt/from/period.js +34 -31
- package/dist/Skola24/txt/from/period.js.map +1 -1
- package/dist/Skola24/txt/from/schedules.d.ts +0 -1
- package/dist/Skola24/txt/from/schedules.js +10 -6
- package/dist/Skola24/txt/from/schedules.js.map +1 -1
- package/dist/Skola24/txt/from/util.js.map +1 -1
- package/dist/Skola24/txt/index.d.ts +0 -1
- package/dist/Skola24/txt/to/index.d.ts +0 -1
- package/dist/Skola24/txt/to/schedules.js +12 -5
- package/dist/Skola24/txt/to/schedules.js.map +1 -1
- package/dist/common/constants.js.map +1 -1
- package/dist/common/functions.js.map +1 -1
- package/dist/common/get-date.js.map +1 -1
- package/dist/common/make-chainable/index.js.map +1 -1
- package/dist/common/types.d.ts +3 -1
- package/dist/core/from/configurations.js.map +1 -1
- package/dist/core/from/courses.js.map +1 -1
- package/dist/core/from/events.js.map +1 -1
- package/dist/core/from/exceptions.js.map +1 -1
- package/dist/core/from/groups.js.map +1 -1
- package/dist/core/from/index.js.map +1 -1
- package/dist/core/from/locations.js.map +1 -1
- package/dist/core/from/locked-times.js.map +1 -1
- package/dist/core/from/overlap-groups.js.map +1 -1
- package/dist/core/from/periods.js.map +1 -1
- package/dist/core/from/persons.js.map +1 -1
- package/dist/core/from/root-intervals.js.map +1 -1
- package/dist/core/from/schedules.js.map +1 -1
- package/dist/core/from/settings.js.map +1 -1
- package/dist/core/from/syllabuses.js.map +1 -1
- package/dist/core/from/teachers.js.map +1 -1
- package/dist/core/index.d.ts +0 -1
- package/dist/core/interfaces/other/companies.js.map +1 -1
- package/dist/core/interfaces/other/operations.d.ts +0 -1
- package/dist/core/interfaces/vertices/companies.d.ts +0 -1
- package/dist/core/interfaces/vertices/configurations.d.ts +1 -2
- package/dist/core/interfaces/vertices/courses.d.ts +0 -1
- package/dist/core/interfaces/vertices/division-settings.d.ts +0 -1
- package/dist/core/interfaces/vertices/divisions.d.ts +0 -1
- package/dist/core/interfaces/vertices/events.d.ts +2 -1
- package/dist/core/interfaces/vertices/exceptions.d.ts +0 -1
- package/dist/core/interfaces/vertices/generations.d.ts +0 -2
- package/dist/core/interfaces/vertices/groups.d.ts +0 -1
- package/dist/core/interfaces/vertices/index.d.ts +14 -1
- package/dist/core/interfaces/vertices/locations.d.ts +0 -1
- package/dist/core/interfaces/vertices/locked-times.d.ts +0 -2
- package/dist/core/interfaces/vertices/overlap-groups.d.ts +0 -1
- package/dist/core/interfaces/vertices/periods.d.ts +0 -2
- package/dist/core/interfaces/vertices/persons.d.ts +0 -1
- package/dist/core/interfaces/vertices/properties/belongs-to.d.ts +0 -1
- package/dist/core/interfaces/vertices/properties/coalesced.d.ts +0 -1
- package/dist/core/interfaces/vertices/root-intervals.d.ts +0 -2
- package/dist/core/interfaces/vertices/syllabuses.d.ts +0 -1
- package/dist/core/interfaces/vertices/teachers.d.ts +0 -1
- package/dist/core/interfaces/vertices/threads.d.ts +31 -0
- package/dist/core/interfaces/vertices/users.d.ts +4 -2
- package/dist/core/interfaces/vertices/util/custom-vertex-export/index.d.ts +9 -8
- package/dist/core/interfaces/vertices/util/custom-vertex-export/util.d.ts +4 -4
- package/dist/core/interfaces/vertices/util/deep-vertex-export/index.d.ts +9 -8
- package/dist/core/interfaces/vertices/util/edges.d.ts +26 -8
- package/dist/core/interfaces/vertices/util/util.d.ts +24 -20
- package/dist/core/interfaces/vertices/util/vertex-query/index.d.ts +16 -11
- package/dist/core/interfaces/vertices/util/vertex.d.ts +2 -2
- package/dist/core/interfaces/vertices/vertex-query.d.ts +29 -26
- package/dist/core/interfaces/vertices/vertex-query.js +8 -0
- package/dist/core/interfaces/vertices/vertex-query.js.map +1 -1
- package/dist/core/to/configurations.js +2 -1
- package/dist/core/to/configurations.js.map +1 -1
- package/dist/core/to/courses.js +2 -1
- package/dist/core/to/courses.js.map +1 -1
- package/dist/core/to/division.js.map +1 -1
- package/dist/core/to/events.js +4 -2
- package/dist/core/to/events.js.map +1 -1
- package/dist/core/to/exceptions.js +2 -1
- package/dist/core/to/exceptions.js.map +1 -1
- package/dist/core/to/groups.js +2 -1
- package/dist/core/to/groups.js.map +1 -1
- package/dist/core/to/locations.js +2 -1
- package/dist/core/to/locations.js.map +1 -1
- package/dist/core/to/locked-times.js +2 -1
- package/dist/core/to/locked-times.js.map +1 -1
- package/dist/core/to/overlap-groups.js +2 -1
- package/dist/core/to/overlap-groups.js.map +1 -1
- package/dist/core/to/periods.js +2 -1
- package/dist/core/to/periods.js.map +1 -1
- package/dist/core/to/persons.js +2 -1
- package/dist/core/to/persons.js.map +1 -1
- package/dist/core/to/root-intervals.js +2 -1
- package/dist/core/to/root-intervals.js.map +1 -1
- package/dist/core/to/schedules.d.ts +0 -1
- package/dist/core/to/schedules.js.map +1 -1
- package/dist/core/to/settings.js +2 -1
- package/dist/core/to/settings.js.map +1 -1
- package/dist/core/to/syllabuses.js +2 -1
- package/dist/core/to/syllabuses.js.map +1 -1
- package/dist/core/to/teachers.js +2 -1
- package/dist/core/to/teachers.js.map +1 -1
- package/dist/core/to/util.d.ts +0 -2
- package/dist/core/to/util.js +2 -1
- package/dist/core/to/util.js.map +1 -1
- package/dist/core/types/index.d.ts +5 -1
- package/dist/core/util.js +2 -1
- package/dist/core/util.js.map +1 -1
- package/dist/identify/constants/index.js.map +1 -1
- package/dist/identify/index.js +2 -1
- package/dist/identify/index.js.map +1 -1
- package/dist/sdui/from/classes.js.map +1 -1
- package/dist/sdui/from/courses.js.map +1 -1
- package/dist/sdui/from/holidays.js.map +1 -1
- package/dist/sdui/from/index.js.map +1 -1
- package/dist/sdui/from/lessons.js.map +1 -1
- package/dist/sdui/from/rooms.js.map +1 -1
- package/dist/sdui/from/schedules.d.ts +0 -2
- package/dist/sdui/from/schedules.js.map +1 -1
- package/dist/sdui/from/school-years.js.map +1 -1
- package/dist/sdui/from/substitution-plans.js.map +1 -1
- package/dist/sdui/from/teachers.js.map +1 -1
- package/dist/sdui/to/classes.js.map +1 -1
- package/dist/sdui/to/courses.js.map +1 -1
- package/dist/sdui/to/holidays.js.map +1 -1
- package/dist/sdui/to/hours.js.map +1 -1
- package/dist/sdui/to/index.d.ts +0 -2
- package/dist/sdui/to/lessons.js.map +1 -1
- package/dist/sdui/to/rooms.js.map +1 -1
- package/dist/sdui/to/schedules.js.map +1 -1
- package/dist/sdui/to/school-years.js.map +1 -1
- package/dist/sdui/to/substitution-plans.js +6 -3
- package/dist/sdui/to/substitution-plans.js.map +1 -1
- package/dist/sdui/to/teachers.js.map +1 -1
- package/dist/vKlass/from/index.js.map +1 -1
- package/dist/vKlass/from/schedule.d.ts +0 -1
- package/dist/vKlass/from/schedule.js.map +1 -1
- package/dist/vKlass/to/schedules.js +17 -6
- package/dist/vKlass/to/schedules.js.map +1 -1
- package/package.json +1 -1
- package/dist/core/interfaces/index.d.ts +0 -23
- package/dist/core/interfaces/other/index.d.ts +0 -6
- package/dist/core/interfaces/vertices/util/index.d.ts +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["id: string","map","warnings: string[]","locationKeys: UnionToAllPossibleTuples<keyof Types.Location>","teacherKeys: UnionToAllPossibleTuples<keyof Types.Teacher>","studentKeys: UnionToAllPossibleTuples<keyof Types.Student>","groupKeys: UnionToAllPossibleTuples<keyof Types.Group>","courseKeys: UnionToAllPossibleTuples<keyof Types.Course>","settings: C_Settings","location: C_Location","teacher: C_Teacher","groupReference: string | undefined","sex: C_Person['sex']","person: C_Person","totalHours: number | undefined","minutesPerWeek: number | undefined","durations: number[]","x","event: C_Event","locationReferences: { groupIndex: number; to: string }[]","groupReferences: { to: string }[]","teacherReferences: { to: string }[]","course: C_Course"],"sources":["../../../../src/Excel/v1/from/index.ts"],"sourcesContent":["import { isString, pick, isNumber } from 'lodash-es';\nimport { nanoid } from 'nanoid';\nimport type { CoreTypes } from '../../../core';\nimport type { Types, UnionToAllPossibleTuples } from '../types';\nimport type { FromInterface } from '../../../common/types';\n\n\ntype C_Settings = Pick<CoreTypes.Serialized.Settings, 'discretization' | 'numDays' | 'dayStart' | 'dayEnd'>;\ntype C_Location = Omit<CoreTypes.Serialized.Location, '_id'>;\ntype C_Group = Omit<CoreTypes.Serialized.Group, '_id'>;\ntype C_Teacher = Omit<CoreTypes.Serialized.Teacher, '_id'>;\ntype C_Course = Omit<CoreTypes.Serialized.Course, '_id'>;\ntype C_Person = Omit<CoreTypes.Serialized.Person, '_id'>;\ntype C_Event = Omit<CoreTypes.Serialized.Event, '_id'>;\n\ntype Out = {\n settings: C_Settings;\n locations: C_Location[];\n teachers: C_Teacher[];\n persons: C_Person[];\n groups: C_Group[];\n courses: C_Course[];\n events: C_Event[];\n meta?: {\n warnings?: string[];\n // errors?: string[]; // TODO: implement error handling\n };\n};\n\nfunction generateId<T> (map: Map<string, T>) {\n // generate a unique id\n let id: string;\n do {\n id = nanoid();\n } while (map.has(id));\n\n return id;\n}\n\nfunction toMultipleOf5 (val: number | string) {\n const num = isString(val) ? parseInt(val) : val;\n\n // throw error if nan\n if (isNaN(num)) throw new Error(`toMultipleOf5: ${val} is not a number`);\n\n return Math.floor(num / 5) * 5;\n}\n\nfunction toInteger (val: number | string) {\n const num = isString(val) ? parseInt(val) : val;\n\n // throw error if nan\n if (isNaN(num)) throw new Error(`toInteger: ${val} is not a number`);\n\n return num;\n}\n\nfunction toString<T extends string | number | undefined, R = T extends undefined ? (string | undefined) : string> (x: T): R {\n if (x == undefined) return undefined as R;\n if (typeof x == 'string' && !x.length) return undefined as R;\n if (isNumber(x)) return x.toString() as R;\n return x.trim() as R;\n}\n\n\nfunction _schedules (\n source: Types.Source\n): Out {\n // gather all import related warnings/errors\n const warnings: string[] = [];\n // let errors: string[] = [];\n\n\n ////\n //// filter to only the fields we need and remove empty rows\n ////\n const locationKeys: UnionToAllPossibleTuples<keyof Types.Location> = ['name'];\n const teacherKeys: UnionToAllPossibleTuples<keyof Types.Teacher> = ['name'];\n const studentKeys: UnionToAllPossibleTuples<keyof Types.Student> = ['first_name', 'last_name', 'SSN', 'sex', 'group'];\n const groupKeys: UnionToAllPossibleTuples<keyof Types.Group> = ['name'];\n const courseKeys: UnionToAllPossibleTuples<keyof Types.Course> = ['name', 'subject', 'groups', 'teachers', 'locations', 'total_hours', 'minutes_per_week', 'lesson_durations'];\n source.locations = source.locations?.map(x => pick(x, locationKeys)).filter(x => Object.values(x).some(y => y !== undefined));\n source.teachers = source.teachers ?.map(x => pick(x, teacherKeys )).filter(x => Object.values(x).some(y => y !== undefined));\n source.students = source.students ?.map(x => pick(x, studentKeys )).filter(x => Object.values(x).some(y => y !== undefined));\n source.groups = source.groups ?.map(x => pick(x, groupKeys )).filter(x => Object.values(x).some(y => y !== undefined));\n source.courses = source.courses ?.map(x => pick(x, courseKeys )).filter(x => Object.values(x).some(y => y !== undefined));\n\n\n ////\n //// settings\n ////\n const settings: C_Settings = {\n discretization: 5,\n numDays: 5,\n dayStart: '08:00',\n dayEnd: '17:00',\n };\n if (!source.settings) {\n warnings.push('Could not find the settings tab.');\n }\n if (source.settings?.[0]?.number_of_days) {\n const numDays = source.settings?.[0]?.number_of_days;\n try {\n if (isNumber(numDays)) settings.numDays = numDays;\n else if (isString(numDays)) settings.numDays = parseInt(numDays);\n\n // must be 5 or 7\n if (settings.numDays !== 5 && settings.numDays !== 7) {\n warnings.push(`The number of days \"${numDays}\" is not 5 or 7.`);\n settings.numDays = 5;\n }\n } catch {\n warnings.push(`Could not parse the number of days \"${numDays}\" for the settings.`);\n }\n }\n\n\n ////\n //// locations\n ////\n const locationsIdMap = new Map<string, C_Location>();\n const locationsNameMap = new Map<string, C_Location>();\n if (!source.locations) {\n warnings.push('Could not find the locations tab.');\n }\n source.locations?.forEach(x => {\n const displayName = toString(x.name);\n if (!displayName) {\n warnings.push('Skipping a location without a name.');\n return;\n }\n\n if (locationsNameMap.has(displayName.toLowerCase())) {\n warnings.push(`The location \"${displayName}\" is defined multiple times.`);\n return;\n }\n\n const id = generateId(locationsIdMap);\n const location: C_Location = { id, displayName };\n locationsNameMap.set(displayName.toLowerCase(), location);\n locationsIdMap .set(id, location);\n });\n\n\n ////\n //// groups\n ////\n const groupsIdMap = new Map<string, C_Group>();\n const groupsNameMap = new Map<string, C_Group>();\n if (!source.groups) {\n warnings.push('Could not find the groups tab.');\n }\n source.groups?.forEach(x => {\n const displayName = toString(x.name);\n if (!displayName) {\n warnings.push('Skipping a group without a name.');\n return;\n }\n\n if (groupsNameMap.has(displayName.toLowerCase())) {\n warnings.push(`The group \"${displayName}\" is defined multiple times.`);\n return;\n }\n\n const id = generateId(groupsIdMap);\n const group = { id, displayName, species: 'class' } as C_Group;\n groupsNameMap.set(displayName.toLowerCase(), group);\n groupsIdMap .set(id, group);\n });\n\n\n ////\n //// teachers\n ////\n const teachersIdMap = new Map<string, C_Teacher>();\n const teachersNameMap = new Map<string, C_Teacher>();\n if (!source.teachers) {\n warnings.push('Could not find the teachers tab.');\n }\n source.teachers?.forEach(x => {\n const displayName = toString(x.name);\n if (!displayName) {\n warnings.push('Skipping a teacher without a name.');\n return;\n }\n\n if (teachersNameMap.has(displayName.toLowerCase())) {\n warnings.push(`The teacher \"${displayName}\" is defined multiple times.`);\n return;\n }\n\n const id = generateId(teachersIdMap);\n const teacher: C_Teacher = { id, displayName };\n teachersNameMap.set(displayName.toLowerCase(), teacher);\n teachersIdMap .set(id, teacher);\n });\n\n\n ////\n //// students\n ////\n const personsIdMap = new Map<string, C_Person>();\n if (!source.students) {\n warnings.push('Could not find the students tab.');\n }\n source.students?.forEach(x => {\n const firstName = toString(x.first_name);\n const lastName = toString(x.last_name );\n const SSN = toString(x.SSN );\n\n let groupReference: string | undefined = undefined;\n if (x.group) {\n const key = toString(x.group).toLowerCase();\n const ref = groupsNameMap.get(key); /// to lower case only!\n if (!ref) {\n warnings.push(`The group ${x.group} referenced from the student \"${firstName} ${lastName}\" does not exist.`);\n } else {\n groupReference = ref.id;\n }\n }\n\n let sex: C_Person['sex'];\n if (x.sex) {\n if (isString(x.sex) && x.sex.toLowerCase() == 'man') sex = 'Man';\n else if (isString(x.sex) && x.sex.toLowerCase() == 'woman') sex = 'Woman';\n else {\n warnings.push(`Unknown sex \"${ x.sex }\" for the student \"${firstName} ${lastName}\".`);\n }\n }\n\n const id = generateId(personsIdMap);\n const person: C_Person = { id, firstName, lastName, sex, group: groupReference, ...SSN && { SSN: { value: SSN } } };\n personsIdMap.set(id, person);\n });\n\n\n ////\n //// courses\n ////\n const coursesIdMap = new Map<string, C_Course>();\n const eventsIdMap = new Map<string, C_Event>();\n if (!source.courses) {\n warnings.push('Could not find the courses tab.');\n }\n source.courses?.forEach(x => {\n const courseId = generateId(coursesIdMap);\n const displayName = toString(x.name)?.trim();\n const subject = toString(x.subject);\n\n // try to parse the total hours as an integer\n let totalHours: number | undefined = undefined;\n if (x.total_hours) {\n try {\n totalHours = toInteger(x.total_hours);\n } catch {\n warnings.push(`The total hours \"${x.total_hours}\" for the course \"${displayName}\" is not an integer.`);\n }\n }\n\n // try to parse the minutes per week as an multiple of 5\n let minutesPerWeek: number | undefined = undefined;\n if (x.minutes_per_week) {\n try {\n minutesPerWeek = toMultipleOf5(x.minutes_per_week);\n } catch {\n warnings.push(`The minutes per week \"${x.minutes_per_week}\" for the course \"${displayName}\" is not an integer.`);\n }\n }\n\n // try to parse the lesson durations as an array of integers from which we will generate events\n if (x.lesson_durations) {\n try {\n let durations: number[] = [];\n if (isNumber(x.lesson_durations)) durations = [x.lesson_durations];\n else if (isString(x.lesson_durations)) durations = x.lesson_durations.split(',').map(x => x.trim())\n .map(x => parseInt(x));\n\n // truncate to multiple of 5 and filter out zero duration events\n durations = durations\n .map(x => {\n try {\n return toMultipleOf5(x);\n } catch {\n warnings.push(`The lesson duration \"${x}\" for the course \"${displayName}\" is not an integer.`);\n return undefined;\n }\n })\n .filter((x): x is number => {\n if (!x) {\n warnings.push(`The lesson duration for the course \"${displayName}\" becomes 0 when truncated to the nearest multiple of 5.`);\n return false;\n }\n return true;\n });\n\n durations.forEach(x => {\n const id = generateId(eventsIdMap);\n const event: C_Event = { id, course: courseId, preferredDuration: x };\n eventsIdMap.set(id, event);\n });\n } catch {\n warnings.push(`Could not parse the lesson durations \"${x.lesson_durations}\" for the course \"${displayName}\".`);\n }\n }\n\n // locations\n const locationReferences: { groupIndex: number; to: string }[] = [];\n\n toString(x.locations)?.split('+')\n .flatMap((x, i) => x.split(',').map(x => [i, x.trim().toLowerCase()] as [number, string]))\n .forEach(([i, x]) => {\n const ref = locationsNameMap.get(x);\n if (!ref) {\n warnings.push(`The location \"${x}\" referenced from the course \"${displayName}\" does not exist.`);\n return;\n }\n\n if (locationReferences.some(y => y.to == ref.id)) {\n warnings.push(`The location \"${x}\" is referenced multiple times from the course \"${displayName}\".`);\n return;\n }\n\n locationReferences.push({ groupIndex: i, to: ref.id });\n });\n\n // groups\n const groupReferences: { to: string }[] = [];\n toString(x.groups)?.split(',')\n .map(x => x.trim().toLowerCase())\n .forEach(x => {\n const ref = groupsNameMap.get(x);\n if (!ref) {\n warnings.push(`The group \"${x}\" referenced from the course \"${displayName}\" does not exist.`);\n return;\n }\n\n if (groupReferences.some(y => y.to == ref.id)) {\n warnings.push(`The group \"${x}\" is referenced multiple times from the course \"${displayName}\".`);\n return;\n }\n\n groupReferences.push({ to: ref.id });\n });\n\n // teachers\n const teacherReferences: { to: string }[] = [];\n toString(x.teachers)?.split(',')\n .map(x => x.trim().toLowerCase())\n .forEach(x => {\n const ref = teachersNameMap.get(x);\n if (!ref) {\n warnings.push(`The teacher \"${x}\" referenced from the course \"${displayName}\" does not exist.`);\n return;\n }\n\n if (teacherReferences.some(y => y.to == ref.id)) {\n warnings.push(`The teacher \"${x}\" is referenced multiple times from the course \"${displayName}\".`);\n return;\n }\n\n teacherReferences.push({ to: ref.id });\n });\n\n const course: C_Course = {\n id: courseId,\n groups: groupReferences,\n teachers: teacherReferences,\n locations: locationReferences.map(x => ({ groupIndex: x.groupIndex, locations: [x.to] })),\n expectedTotalHours: totalHours,\n plannedDuration: totalHours ? `${totalHours} hrs` : undefined,\n displayName, subject, minutesPerWeek,\n };\n coursesIdMap.set(courseId, course);\n });\n\n\n ////\n //// return\n ////\n return {\n settings,\n locations: [...locationsIdMap.values()],\n teachers: [...teachersIdMap .values()],\n persons: [...personsIdMap .values()],\n groups: [...groupsIdMap .values()],\n courses: [...coursesIdMap .values()],\n events: [...eventsIdMap .values()],\n meta: {\n // ...errors .length && { errors: errors },\n ...warnings.length && { warnings: warnings }\n }\n };\n}\n\n\nexport default {\n schedules: _schedules\n} satisfies FromInterface;"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["id: string","map","warnings: string[]","locationKeys: UnionToAllPossibleTuples<keyof Types.Location>","teacherKeys: UnionToAllPossibleTuples<keyof Types.Teacher>","studentKeys: UnionToAllPossibleTuples<keyof Types.Student>","groupKeys: UnionToAllPossibleTuples<keyof Types.Group>","courseKeys: UnionToAllPossibleTuples<keyof Types.Course>","settings: C_Settings","location: C_Location","teacher: C_Teacher","groupReference: string | undefined","sex: C_Person['sex']","person: C_Person","totalHours: number | undefined","minutesPerWeek: number | undefined","durations: number[]","x","event: C_Event","locationReferences: { groupIndex: number; to: string }[]","groupReferences: { to: string }[]","teacherReferences: { to: string }[]","course: C_Course"],"sources":["../../../../src/Excel/v1/from/index.ts"],"sourcesContent":["import { isString, pick, isNumber } from 'lodash-es';\nimport { nanoid } from 'nanoid';\nimport type { CoreTypes } from '../../../core';\nimport type { Types, UnionToAllPossibleTuples } from '../types';\nimport type { FromInterface } from '../../../common/types';\n\n\ntype C_Settings = Pick<CoreTypes.Serialized.Settings, 'discretization' | 'numDays' | 'dayStart' | 'dayEnd'>;\ntype C_Location = Omit<CoreTypes.Serialized.Location, '_id'>;\ntype C_Group = Omit<CoreTypes.Serialized.Group, '_id'>;\ntype C_Teacher = Omit<CoreTypes.Serialized.Teacher, '_id'>;\ntype C_Course = Omit<CoreTypes.Serialized.Course, '_id'>;\ntype C_Person = Omit<CoreTypes.Serialized.Person, '_id'>;\ntype C_Event = Omit<CoreTypes.Serialized.Event, '_id'>;\n\ntype Out = {\n settings: C_Settings;\n locations: C_Location[];\n teachers: C_Teacher[];\n persons: C_Person[];\n groups: C_Group[];\n courses: C_Course[];\n events: C_Event[];\n meta?: {\n warnings?: string[];\n // errors?: string[]; // TODO: implement error handling\n };\n};\n\nfunction generateId<T> (map: Map<string, T>) {\n // generate a unique id\n let id: string;\n do {\n id = nanoid();\n } while (map.has(id));\n\n return id;\n}\n\nfunction toMultipleOf5 (val: number | string) {\n const num = isString(val) ? parseInt(val) : val;\n\n // throw error if nan\n if (isNaN(num)) throw new Error(`toMultipleOf5: ${val} is not a number`);\n\n return Math.floor(num / 5) * 5;\n}\n\nfunction toInteger (val: number | string) {\n const num = isString(val) ? parseInt(val) : val;\n\n // throw error if nan\n if (isNaN(num)) throw new Error(`toInteger: ${val} is not a number`);\n\n return num;\n}\n\nfunction toString<T extends string | number | undefined, R = T extends undefined ? (string | undefined) : string> (x: T): R {\n if (x == undefined) return undefined as R;\n if (typeof x == 'string' && !x.length) return undefined as R;\n if (isNumber(x)) return x.toString() as R;\n return x.trim() as R;\n}\n\n\nfunction _schedules (\n source: Types.Source\n): Out {\n // gather all import related warnings/errors\n const warnings: string[] = [];\n // let errors: string[] = [];\n\n\n ////\n //// filter to only the fields we need and remove empty rows\n ////\n const locationKeys: UnionToAllPossibleTuples<keyof Types.Location> = ['name'];\n const teacherKeys: UnionToAllPossibleTuples<keyof Types.Teacher> = ['name'];\n const studentKeys: UnionToAllPossibleTuples<keyof Types.Student> = ['first_name', 'last_name', 'SSN', 'sex', 'group'];\n const groupKeys: UnionToAllPossibleTuples<keyof Types.Group> = ['name'];\n const courseKeys: UnionToAllPossibleTuples<keyof Types.Course> = ['name', 'subject', 'groups', 'teachers', 'locations', 'total_hours', 'minutes_per_week', 'lesson_durations'];\n source.locations = source.locations?.map(x => pick(x, locationKeys)).filter(x => Object.values(x).some(y => y !== undefined));\n source.teachers = source.teachers ?.map(x => pick(x, teacherKeys )).filter(x => Object.values(x).some(y => y !== undefined));\n source.students = source.students ?.map(x => pick(x, studentKeys )).filter(x => Object.values(x).some(y => y !== undefined));\n source.groups = source.groups ?.map(x => pick(x, groupKeys )).filter(x => Object.values(x).some(y => y !== undefined));\n source.courses = source.courses ?.map(x => pick(x, courseKeys )).filter(x => Object.values(x).some(y => y !== undefined));\n\n\n ////\n //// settings\n ////\n const settings: C_Settings = {\n discretization: 5,\n numDays: 5,\n dayStart: '08:00',\n dayEnd: '17:00',\n };\n if (!source.settings) {\n warnings.push('Could not find the settings tab.');\n }\n if (source.settings?.[0]?.number_of_days) {\n const numDays = source.settings?.[0]?.number_of_days;\n try {\n if (isNumber(numDays)) settings.numDays = numDays;\n else if (isString(numDays)) settings.numDays = parseInt(numDays);\n\n // must be 5 or 7\n if (settings.numDays !== 5 && settings.numDays !== 7) {\n warnings.push(`The number of days \"${numDays}\" is not 5 or 7.`);\n settings.numDays = 5;\n }\n } catch {\n warnings.push(`Could not parse the number of days \"${numDays}\" for the settings.`);\n }\n }\n\n\n ////\n //// locations\n ////\n const locationsIdMap = new Map<string, C_Location>();\n const locationsNameMap = new Map<string, C_Location>();\n if (!source.locations) {\n warnings.push('Could not find the locations tab.');\n }\n source.locations?.forEach(x => {\n const displayName = toString(x.name);\n if (!displayName) {\n warnings.push('Skipping a location without a name.');\n return;\n }\n\n if (locationsNameMap.has(displayName.toLowerCase())) {\n warnings.push(`The location \"${displayName}\" is defined multiple times.`);\n return;\n }\n\n const id = generateId(locationsIdMap);\n const location: C_Location = { id, displayName };\n locationsNameMap.set(displayName.toLowerCase(), location);\n locationsIdMap .set(id, location);\n });\n\n\n ////\n //// groups\n ////\n const groupsIdMap = new Map<string, C_Group>();\n const groupsNameMap = new Map<string, C_Group>();\n if (!source.groups) {\n warnings.push('Could not find the groups tab.');\n }\n source.groups?.forEach(x => {\n const displayName = toString(x.name);\n if (!displayName) {\n warnings.push('Skipping a group without a name.');\n return;\n }\n\n if (groupsNameMap.has(displayName.toLowerCase())) {\n warnings.push(`The group \"${displayName}\" is defined multiple times.`);\n return;\n }\n\n const id = generateId(groupsIdMap);\n const group = { id, displayName, species: 'class' } as C_Group;\n groupsNameMap.set(displayName.toLowerCase(), group);\n groupsIdMap .set(id, group);\n });\n\n\n ////\n //// teachers\n ////\n const teachersIdMap = new Map<string, C_Teacher>();\n const teachersNameMap = new Map<string, C_Teacher>();\n if (!source.teachers) {\n warnings.push('Could not find the teachers tab.');\n }\n source.teachers?.forEach(x => {\n const displayName = toString(x.name);\n if (!displayName) {\n warnings.push('Skipping a teacher without a name.');\n return;\n }\n\n if (teachersNameMap.has(displayName.toLowerCase())) {\n warnings.push(`The teacher \"${displayName}\" is defined multiple times.`);\n return;\n }\n\n const id = generateId(teachersIdMap);\n const teacher: C_Teacher = { id, displayName };\n teachersNameMap.set(displayName.toLowerCase(), teacher);\n teachersIdMap .set(id, teacher);\n });\n\n\n ////\n //// students\n ////\n const personsIdMap = new Map<string, C_Person>();\n if (!source.students) {\n warnings.push('Could not find the students tab.');\n }\n source.students?.forEach(x => {\n const firstName = toString(x.first_name);\n const lastName = toString(x.last_name );\n const SSN = toString(x.SSN );\n\n let groupReference: string | undefined = undefined;\n if (x.group) {\n const key = toString(x.group).toLowerCase();\n const ref = groupsNameMap.get(key); /// to lower case only!\n if (!ref) {\n warnings.push(`The group ${x.group} referenced from the student \"${firstName} ${lastName}\" does not exist.`);\n } else {\n groupReference = ref.id;\n }\n }\n\n let sex: C_Person['sex'];\n if (x.sex) {\n if (isString(x.sex) && x.sex.toLowerCase() == 'man') sex = 'Man';\n else if (isString(x.sex) && x.sex.toLowerCase() == 'woman') sex = 'Woman';\n else {\n warnings.push(`Unknown sex \"${ x.sex }\" for the student \"${firstName} ${lastName}\".`);\n }\n }\n\n const id = generateId(personsIdMap);\n const person: C_Person = { id, firstName, lastName, sex, group: groupReference, ...SSN && { SSN: { value: SSN } } };\n personsIdMap.set(id, person);\n });\n\n\n ////\n //// courses\n ////\n const coursesIdMap = new Map<string, C_Course>();\n const eventsIdMap = new Map<string, C_Event>();\n if (!source.courses) {\n warnings.push('Could not find the courses tab.');\n }\n source.courses?.forEach(x => {\n const courseId = generateId(coursesIdMap);\n const displayName = toString(x.name)?.trim();\n const subject = toString(x.subject);\n\n // try to parse the total hours as an integer\n let totalHours: number | undefined = undefined;\n if (x.total_hours) {\n try {\n totalHours = toInteger(x.total_hours);\n } catch {\n warnings.push(`The total hours \"${x.total_hours}\" for the course \"${displayName}\" is not an integer.`);\n }\n }\n\n // try to parse the minutes per week as an multiple of 5\n let minutesPerWeek: number | undefined = undefined;\n if (x.minutes_per_week) {\n try {\n minutesPerWeek = toMultipleOf5(x.minutes_per_week);\n } catch {\n warnings.push(`The minutes per week \"${x.minutes_per_week}\" for the course \"${displayName}\" is not an integer.`);\n }\n }\n\n // try to parse the lesson durations as an array of integers from which we will generate events\n if (x.lesson_durations) {\n try {\n let durations: number[] = [];\n if (isNumber(x.lesson_durations)) durations = [x.lesson_durations];\n else if (isString(x.lesson_durations)) durations = x.lesson_durations.split(',').map(x => x.trim())\n .map(x => parseInt(x));\n\n // truncate to multiple of 5 and filter out zero duration events\n durations = durations\n .map(x => {\n try {\n return toMultipleOf5(x);\n } catch {\n warnings.push(`The lesson duration \"${x}\" for the course \"${displayName}\" is not an integer.`);\n return undefined;\n }\n })\n .filter((x): x is number => {\n if (!x) {\n warnings.push(`The lesson duration for the course \"${displayName}\" becomes 0 when truncated to the nearest multiple of 5.`);\n return false;\n }\n return true;\n });\n\n durations.forEach(x => {\n const id = generateId(eventsIdMap);\n const event: C_Event = { id, course: courseId, preferredDuration: x };\n eventsIdMap.set(id, event);\n });\n } catch {\n warnings.push(`Could not parse the lesson durations \"${x.lesson_durations}\" for the course \"${displayName}\".`);\n }\n }\n\n // locations\n const locationReferences: { groupIndex: number; to: string }[] = [];\n\n toString(x.locations)?.split('+')\n .flatMap((x, i) => x.split(',').map(x => [i, x.trim().toLowerCase()] as [number, string]))\n .forEach(([i, x]) => {\n const ref = locationsNameMap.get(x);\n if (!ref) {\n warnings.push(`The location \"${x}\" referenced from the course \"${displayName}\" does not exist.`);\n return;\n }\n\n if (locationReferences.some(y => y.to == ref.id)) {\n warnings.push(`The location \"${x}\" is referenced multiple times from the course \"${displayName}\".`);\n return;\n }\n\n locationReferences.push({ groupIndex: i, to: ref.id });\n });\n\n // groups\n const groupReferences: { to: string }[] = [];\n toString(x.groups)?.split(',')\n .map(x => x.trim().toLowerCase())\n .forEach(x => {\n const ref = groupsNameMap.get(x);\n if (!ref) {\n warnings.push(`The group \"${x}\" referenced from the course \"${displayName}\" does not exist.`);\n return;\n }\n\n if (groupReferences.some(y => y.to == ref.id)) {\n warnings.push(`The group \"${x}\" is referenced multiple times from the course \"${displayName}\".`);\n return;\n }\n\n groupReferences.push({ to: ref.id });\n });\n\n // teachers\n const teacherReferences: { to: string }[] = [];\n toString(x.teachers)?.split(',')\n .map(x => x.trim().toLowerCase())\n .forEach(x => {\n const ref = teachersNameMap.get(x);\n if (!ref) {\n warnings.push(`The teacher \"${x}\" referenced from the course \"${displayName}\" does not exist.`);\n return;\n }\n\n if (teacherReferences.some(y => y.to == ref.id)) {\n warnings.push(`The teacher \"${x}\" is referenced multiple times from the course \"${displayName}\".`);\n return;\n }\n\n teacherReferences.push({ to: ref.id });\n });\n\n const course: C_Course = {\n id: courseId,\n groups: groupReferences,\n teachers: teacherReferences,\n locations: locationReferences.map(x => ({ groupIndex: x.groupIndex, locations: [x.to] })),\n expectedTotalHours: totalHours,\n plannedDuration: totalHours ? `${totalHours} hrs` : undefined,\n displayName, subject, minutesPerWeek,\n };\n coursesIdMap.set(courseId, course);\n });\n\n\n ////\n //// return\n ////\n return {\n settings,\n locations: [...locationsIdMap.values()],\n teachers: [...teachersIdMap .values()],\n persons: [...personsIdMap .values()],\n groups: [...groupsIdMap .values()],\n courses: [...coursesIdMap .values()],\n events: [...eventsIdMap .values()],\n meta: {\n // ...errors .length && { errors: errors },\n ...warnings.length && { warnings: warnings }\n }\n };\n}\n\n\nexport default {\n schedules: _schedules\n} satisfies FromInterface;"],"mappings":"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"}
|
package/dist/Excel/v1/index.d.ts
CHANGED
|
@@ -6,7 +6,6 @@ import { MaximumScheduleSpan } from "../../core/interfaces/vertices/properties/m
|
|
|
6
6
|
import { PlannedScheduledDuration } from "../../core/interfaces/vertices/properties/planned-scheduled-duration.js";
|
|
7
7
|
import { MinBreakLength } from "../../core/interfaces/vertices/properties/min-break-length.js";
|
|
8
8
|
import { Types } from "./types/index.js";
|
|
9
|
-
import "../../index.js";
|
|
10
9
|
import * as moment197 from "moment";
|
|
11
10
|
|
|
12
11
|
//#region src/Excel/v1/index.d.ts
|
|
@@ -193,6 +192,7 @@ declare class Map {
|
|
|
193
192
|
locations: [string];
|
|
194
193
|
}[] | undefined;
|
|
195
194
|
lockedTimes?: string[] | undefined;
|
|
195
|
+
threads?: string[] | undefined;
|
|
196
196
|
is?: "event" | undefined;
|
|
197
197
|
displayName?: string | undefined;
|
|
198
198
|
createdAt?: string | undefined;
|
|
@@ -127,7 +127,7 @@ function extractSyllabus(course, syllabusesCodeMap, syllabusesNameMap, warnings)
|
|
|
127
127
|
code: "invalid_syllabus_reference",
|
|
128
128
|
context: syllabusValue
|
|
129
129
|
});
|
|
130
|
-
return;
|
|
130
|
+
return void 0;
|
|
131
131
|
}
|
|
132
132
|
return syllabus.id;
|
|
133
133
|
}
|
|
@@ -370,7 +370,8 @@ function _schedules(source) {
|
|
|
370
370
|
const overlapGroupsKeyMap = /* @__PURE__ */ new Map();
|
|
371
371
|
if (!source.courses) warnings.push({ code: "missing_courses_sheet" });
|
|
372
372
|
source.courses?.forEach((x) => {
|
|
373
|
-
|
|
373
|
+
const mergeWith = toStringIfExists(x.merge_with);
|
|
374
|
+
if (mergeWith) return;
|
|
374
375
|
const ids = toStringIfExists(x.foreign_ID);
|
|
375
376
|
const displayName = toStringIfExists(x.name);
|
|
376
377
|
const subject = toStringIfExists(x.subject);
|
|
@@ -405,25 +406,29 @@ function _schedules(source) {
|
|
|
405
406
|
context: `${minutesPerWeek} min/week OR ${expectedTotalHours} hrs`
|
|
406
407
|
});
|
|
407
408
|
const plannedDuration = expectedTotalHours ? `${expectedTotalHours} hrs` : minutesPerWeek ? `${minutesPerWeek} min/week` : void 0;
|
|
408
|
-
if (x.lesson_durations)
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
409
|
+
if (x.lesson_durations) {
|
|
410
|
+
const _durations = typeof x.lesson_durations === "string" ? x.lesson_durations.split(",").map((x$1) => x$1.trim()) : [x.lesson_durations];
|
|
411
|
+
const durations = _durations.map((e) => {
|
|
412
|
+
try {
|
|
413
|
+
return toPositiveMultipleOf5(e);
|
|
414
|
+
} catch {
|
|
415
|
+
warnings.push({
|
|
416
|
+
code: "invalid_lesson_durations",
|
|
417
|
+
context: x.lesson_durations
|
|
418
|
+
});
|
|
419
|
+
return void 0;
|
|
420
|
+
}
|
|
421
|
+
}).filter((x$1) => x$1 !== void 0);
|
|
422
|
+
durations.forEach((x$1) => {
|
|
423
|
+
const id = generateId(eventsIdMap);
|
|
424
|
+
const event = {
|
|
425
|
+
id,
|
|
426
|
+
course: courseId,
|
|
427
|
+
preferredDuration: x$1
|
|
428
|
+
};
|
|
429
|
+
eventsIdMap.set(id, event);
|
|
430
|
+
});
|
|
431
|
+
}
|
|
427
432
|
if (x.overlap_group && toString(x.overlap_group)) {
|
|
428
433
|
const key = toString(x.overlap_group).toLowerCase();
|
|
429
434
|
const og = overlapGroupsKeyMap.get(key);
|
|
@@ -483,30 +488,34 @@ function _schedules(source) {
|
|
|
483
488
|
}));
|
|
484
489
|
const groups = extractGroups(x, groupsNameMap, warnings);
|
|
485
490
|
const teachers = extractTeachers(x, teachersNameMap, warnings);
|
|
486
|
-
if (x.lesson_durations)
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
491
|
+
if (x.lesson_durations) {
|
|
492
|
+
const _durations = typeof x.lesson_durations === "string" ? x.lesson_durations.split(",").map((x$1) => x$1.trim()) : [x.lesson_durations];
|
|
493
|
+
const durations = _durations.map((e) => {
|
|
494
|
+
try {
|
|
495
|
+
return toPositiveMultipleOf5(e);
|
|
496
|
+
} catch {
|
|
497
|
+
warnings.push({
|
|
498
|
+
code: "invalid_lesson_durations",
|
|
499
|
+
context: x.lesson_durations
|
|
500
|
+
});
|
|
501
|
+
return void 0;
|
|
502
|
+
}
|
|
503
|
+
}).filter((x$1) => x$1 !== void 0);
|
|
504
|
+
durations.forEach((preferredDuration) => {
|
|
505
|
+
const id = generateId(eventsIdMap);
|
|
506
|
+
const event = {
|
|
507
|
+
id,
|
|
508
|
+
course: mergeWith,
|
|
509
|
+
preferredDuration,
|
|
510
|
+
...displayName && { displayName },
|
|
511
|
+
...groups && { groups },
|
|
512
|
+
...teachers && { teachers },
|
|
513
|
+
...locations && { locations },
|
|
514
|
+
__raw: x
|
|
515
|
+
};
|
|
516
|
+
eventsIdMap.set(id, event);
|
|
517
|
+
});
|
|
518
|
+
}
|
|
510
519
|
});
|
|
511
520
|
return {
|
|
512
521
|
settings,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["id: string","map","locationReferences: { groupIndex: number; to: string }[]","x","groupReferences: { to: string }[]","teacherReferences: { to: string }[]","warnings: { code: Types.ErrorCode, context?: unknown }[]","settings: C_Settings","y: C_Syllabus","group: string | undefined","sex: C_Person['sex']","person: C_Person","expectedTotalHours: number | undefined","minutesPerWeek: number | undefined","event: C_Event","course: C_Course"],"sources":["../../../../src/Excel/v2/from/index.ts"],"sourcesContent":["import { isString, isNumber, countBy } from 'lodash-es';\nimport { nanoid } from 'nanoid';\nimport type { CoreTypes } from '../../../core';\nimport type { Types } from '../types';\nimport type { FromInterface } from '../../../common/types';\nimport { makeChainable } from '../../../common/make-chainable';\n\ntype C_Settings = Pick<CoreTypes.Serialized.Settings, 'discretization' | 'numDays' | 'dayStart' | 'dayEnd'>;\ntype C_Location = Omit<CoreTypes.Serialized.Location, '_id'> & { __raw: Types.Location };\ntype C_Group = Omit<CoreTypes.Serialized.Group, '_id'> & { __raw: Types.Group };\ntype C_Teacher = Omit<CoreTypes.Serialized.Teacher, '_id'> & { __raw: Types.Teacher };\ntype C_Course = Omit<CoreTypes.Serialized.Course, '_id'> & { __raw: Types.Course };\ntype C_Person = Omit<CoreTypes.Serialized.Person, '_id'> & { __raw: Types.Person };\ntype C_Event = Omit<CoreTypes.Serialized.Event, '_id'> & { __raw?: Types.Course };\ntype C_OverlapGroup = Omit<CoreTypes.Serialized.OverlapGroup, '_id'> & { /* raw: Types.OverlapGroup */ };\ntype C_Syllabus = Omit<CoreTypes.Serialized.Syllabus, '_id'> & { __raw?: Types.Syllabus };\n\ntype Out = {\n settings: C_Settings;\n locations: C_Location[];\n teachers: C_Teacher[];\n persons: C_Person[];\n groups: C_Group[];\n courses: C_Course[];\n events: C_Event[];\n overlapGroups: C_OverlapGroup[];\n syllabuses: C_Syllabus[];\n meta: {\n // errors?: string[];\n warnings?: { code: Types.ErrorCode, context?: unknown }[];\n };\n};\n\n\nfunction generateId (map: Map<string, unknown>) {\n // generate a unique id\n let id: string;\n do {\n id = nanoid(8);\n } while (map.has(id));\n\n return id;\n}\n\nfunction toPositiveMultipleOf5 (val: number | string) {\n const num = isString(val) ? parseInt(val) : val;\n\n // throw error if nan\n if (isNaN(num)) throw new Error(`toMultipleOf5: ${val} is not a number`);\n\n const res = Math.floor(num / 5) * 5;\n\n if (res <= 0) throw new Error(`toMultipleOf5: the result ${res} is not positive`);\n\n return res;\n}\n\nfunction toPositiveInteger (val: number | string) {\n const num = isString(val) ? parseInt(val) : val;\n\n // throw error if nan\n if (isNaN(num)) throw new Error(`toInteger: ${val} is not a number`);\n if (num <= 0) throw new Error(`toInteger: te result ${num} is not positive`);\n\n return num;\n}\n\n/**\n * Converts a string/number to a trimmed string\n */\nfunction toString (x: string | number): string {\n return isNumber(x)\n ? x.toString()\n : x.trim();\n}\n\n/**\n * Converts a possible nullish string/number to a trimmed string or undefined\n */\nfunction toStringIfExists (x: string | number | undefined | null): string | undefined {\n if (x == null) return undefined;\n return toString(x);\n}\n\nfunction extractLocations (\n course: Types.Course,\n locationsNameMap: Map<string, C_Location>,\n warnings: { code: Types.ErrorCode, context?: unknown }[],\n) {\n if (course.locations == null) return;\n const locationsStr = toString(course.locations);\n if (!locationsStr) return;\n\n const locationReferences: { groupIndex: number; to: string }[] = [];\n\n locationsStr.split('+')\n .flatMap((x, i) => x.split(',').map(x => [i, x.trim()] as [number, string]))\n .forEach(([i, x]) => {\n const key = x.toLowerCase();\n const ref = locationsNameMap.get(key);\n if (!ref) {\n warnings.push({ code: 'invalid_location_reference', context: x });\n return;\n }\n\n if (locationReferences.some(y => y.to == ref.id)) {\n warnings.push({ code: 'location_referenced_multiple_times', context: x });\n return;\n }\n\n locationReferences.push({ groupIndex: i, to: ref.id });\n });\n\n return locationReferences;\n}\n\nfunction extractGroups (\n course: Types.Course,\n groupsNameMap: Map<string, C_Group>,\n warnings: { code: Types.ErrorCode, context?: unknown }[],\n) {\n if (course.groups == null) return;\n const groupsStr = toString(course.groups);\n if (!groupsStr) return;\n\n const groupReferences: { to: string }[] = [];\n groupsStr.split(',').map(x => x.trim())\n .forEach(x => {\n const key = x.toLowerCase();\n const ref = groupsNameMap.get(key);\n if (!ref) {\n warnings.push({ code: 'invalid_group_reference', context: x });\n return;\n }\n\n if (groupReferences.some(y => y.to == ref.id)) {\n warnings.push({ code: 'group_referenced_multiple_times', context: x });\n return;\n }\n\n groupReferences.push({ to: ref.id });\n });\n\n return groupReferences;\n}\n\nfunction extractTeachers (\n course: Types.Course,\n teachersNameMap: Map<string, C_Teacher>,\n warnings: { code: Types.ErrorCode, context?: unknown }[],\n) {\n if (course.teachers == null) return;\n const teachersStr = toString(course.teachers);\n if (!teachersStr) return undefined;\n\n const teacherReferences: { to: string }[] = [];\n teachersStr.split(',').map(x => x.trim())\n .forEach(x => {\n const key = x.toLowerCase();\n const ref = teachersNameMap.get(key);\n if (!ref) {\n warnings.push({ code: 'invalid_teacher_reference', context: x });\n return;\n }\n\n if (teacherReferences.some(y => y.to == ref.id)) {\n warnings.push({ code: 'teacher_referenced_multiple_times', context: x });\n return;\n }\n\n teacherReferences.push({ to: ref.id });\n });\n\n return teacherReferences;\n}\n\nfunction extractSyllabus (\n course: Types.Course,\n syllabusesCodeMap: Map<string, C_Syllabus>,\n syllabusesNameMap: Map<string, C_Syllabus>,\n warnings: { code: Types.ErrorCode, context?: unknown }[],\n): string | undefined {\n if (course.syllabus == null) return undefined;\n const syllabusValue = toString(course.syllabus);\n if (!syllabusValue) return undefined;\n\n const syllabus = syllabusesCodeMap.get(syllabusValue) || syllabusesNameMap.get(syllabusValue.toLowerCase());\n\n if (!syllabus) {\n warnings.push({ code: 'invalid_syllabus_reference', context: syllabusValue });\n return undefined;\n }\n\n return syllabus.id;\n}\n\n\nfunction _schedules (\n source: Types.Source\n): Out {\n // gather all import related warnings/errors\n const warnings: { code: Types.ErrorCode, context?: unknown }[] = [];\n // let errors: string[] = [];\n\n source.settings = source.settings ?.filter(x => Object.values(x).some(y => toString(y).length > 0));\n source.locations = source.locations?.filter(x => Object.values(x).some(y => toString(y).length > 0));\n source.teachers = source.teachers ?.filter(x => Object.values(x).some(y => toString(y).length > 0));\n source.groups = source.groups ?.filter(x => Object.values(x).some(y => toString(y).length > 0));\n source.persons = source.persons ?.filter(x => Object.values(x).some(y => toString(y).length > 0));\n source.courses = source.courses ?.filter(x => Object.values(x).some(y => toString(y).length > 0));\n\n\n ////\n //// settings\n ////\n const settings: C_Settings = {\n discretization: 5,\n numDays: 5,\n dayStart: '08:00',\n dayEnd: '17:00',\n };\n if (!source.settings) {\n warnings.push({ code: 'missing_settings_sheet' });\n }\n if (source.settings?.[0]?.number_of_days) {\n const numDays = source.settings?.[0]?.number_of_days;\n try {\n settings.numDays = toPositiveInteger(numDays);\n\n // must be 5 or 7\n if (settings.numDays !== 5 && settings.numDays !== 7) {\n warnings.push({ code: 'invalid_number_of_days', context: numDays });\n settings.numDays = 5;\n }\n } catch {\n warnings.push({ code: 'invalid_number_of_days', context: numDays });\n }\n }\n\n ////\n //// syllabuses\n ////\n const syllabusesIdMap = new Map<string, C_Syllabus>();\n const syllabusesNameMap = new Map<string, C_Syllabus>();\n const syllabusesCodeMap = new Map<string, C_Syllabus>();\n if (!source.syllabuses) {\n // warnings.push({ code: 'missing_syllabus_sheet' });\n }\n source.syllabuses?.forEach(x => {\n const ids = toStringIfExists(x.foreign_ID );\n const subjectCode = toStringIfExists(x.subject_code);\n const subjectName = toStringIfExists(x.subject_name);\n const courseCode = toStringIfExists(x.course_code );\n const courseName = toStringIfExists(x.course_name );\n const schoolType = toStringIfExists(x.school_type );\n\n const id = toStringIfExists(x.ID) ?? generateId(syllabusesIdMap);\n if (syllabusesIdMap.has(id)) {\n warnings.push({ code: 'ignoring_duplicate_syllabus', context: `${subjectName} (${courseName})` });\n return;\n }\n\n if (!subjectName) {\n warnings.push({ code: 'missing_subject_name', context: x });\n return;\n }\n\n if (!schoolType) {\n warnings.push({ code: 'missing_school_type', context: x });\n return;\n }\n\n // create the syllabus object\n const y: C_Syllabus = {\n id,\n ...ids && { ids },\n ...subjectCode && { subjectCode },\n subjectName,\n ...courseCode && { courseCode },\n ...courseName && { courseName },\n schoolType,\n official: true, // always true for imported syllabuses\n __raw: x\n };\n syllabusesIdMap.set(id, y);\n const code = courseCode || subjectCode;\n const name = courseName || subjectName;\n if (code) syllabusesCodeMap.set(code, y);\n if (name) syllabusesNameMap.set(name.toLowerCase(), y);\n });\n\n\n ////\n //// locations, teachers\n ////\n const locationsIdMap = new Map<string, C_Location>();\n const locationsNameMap = new Map<string, C_Location>();\n const teachersIdMap = new Map<string, C_Teacher>();\n const teachersNameMap = new Map<string, C_Teacher>();\n [\n {\n name: { singular: 'location', plural: 'locations' } as const,\n data: source.locations,\n idMap: locationsIdMap,\n nameMap: locationsNameMap,\n },\n {\n name: { singular: 'teacher', plural: 'teachers' } as const,\n data: source.teachers,\n idMap: teachersIdMap,\n nameMap: teachersNameMap,\n }\n ].forEach(({ name, data, idMap, nameMap }) => {\n if (!data) {\n warnings.push({ code: `missing_${name.plural}_sheet` });\n }\n data?.forEach(x => {\n const ids = toStringIfExists(x.foreign_ID);\n const displayName = toStringIfExists(x.name );\n\n const id = toStringIfExists(x.ID) ?? generateId(idMap);\n if (idMap.has(id)) {\n warnings.push({ code: `ignoring_duplicate_${name.singular}`, context: displayName });\n return;\n }\n\n const y = {\n id,\n ...ids && { ids },\n ...displayName && { displayName },\n __raw: x\n };\n idMap.set(id, y);\n if (displayName) nameMap.set(displayName.toLowerCase(), y);\n });\n });\n\n\n ////\n //// groups\n ////\n const groupsIdMap = new Map<string, C_Group>();\n const groupsNameMap = new Map<string, C_Group>();\n if (!source.groups) {\n warnings.push({ code: 'missing_groups_sheet' });\n }\n source.groups?.forEach(x => {\n const ids = toStringIfExists(x.foreign_ID);\n const displayName = toStringIfExists(x.name );\n\n const id = toStringIfExists(x.ID) ?? generateId(groupsIdMap);\n if (groupsIdMap.has(id)) {\n warnings.push({ code: 'ignoring_duplicate_group', context: displayName });\n return;\n }\n\n // parent groups determine the species of the group\n const species = toStringIfExists(x.is_class) == '1' ? 'class' as const : undefined;\n\n const y = {\n id,\n ...ids && { ids },\n ...displayName && { displayName },\n ...species && { species },\n __raw: x\n } as C_Group;\n groupsIdMap.set(id, y);\n if (displayName) groupsNameMap.set(displayName.toLowerCase(), y);\n });\n\n\n ////\n //// persons\n ////\n const personsIdMap = new Map<string, C_Person>();\n const personsSsnMap = new Map<string, C_Person>();\n if (!source.persons) {\n warnings.push({ code: 'missing_persons_sheet' });\n }\n source.persons?.forEach(x => {\n const ids = toStringIfExists(x.foreign_ID);\n const firstName = toStringIfExists(x.first_name);\n const lastName = toStringIfExists(x.last_name );\n const SSN = toStringIfExists(x.SSN );\n\n const id = toStringIfExists(x.ID) ?? generateId(personsIdMap);\n if (personsIdMap.has(id)) {\n warnings.push({ code: 'ignoring_duplicate_person', context: `${firstName} ${lastName}` });\n return;\n }\n\n let group: string | undefined = undefined;\n if (x.group) {\n const key = toString(x.group).toLowerCase();\n const ref = groupsNameMap.get(key);\n if (!ref) {\n warnings.push({ code: 'invalid_group_reference', context: x.group });\n } else if (ref.species !== 'class') {\n warnings.push({ code: 'forbidden_group_reference', context: x.group });\n } else {\n group = ref.id;\n }\n }\n\n let sex: C_Person['sex'];\n if (x.sex) {\n if (isString(x.sex) && x.sex.toLowerCase() == 'man') sex = 'Man';\n else if (isString(x.sex) && x.sex.toLowerCase() == 'woman') sex = 'Woman';\n else {\n warnings.push({ code: 'invalid_sex', context: x.sex });\n }\n }\n\n const person: C_Person = {\n id,\n ...ids && { ids },\n ...firstName && { firstName },\n ...lastName && { lastName },\n ...sex && { sex },\n ...group && { group },\n ...SSN && { SSN: { value: SSN } },\n __raw: x\n };\n personsIdMap.set(id, person);\n if (SSN) personsSsnMap.set(SSN, person);\n });\n\n ////\n //// group.members (need to wait for persons to be parsed)\n ////\n groupsNameMap.forEach(x => {\n let duplicateReported = false;\n\n // ignore if no members\n if (!x.__raw.members) return;\n\n // parse and replace SSN by person id\n x.members = makeChainable(x.__raw.members)\n .chain(x => toString(x)\n .split(',')\n .map(x => x.trim())\n .filter(x => x != null)\n )\n .chain(x => countBy(x))\n .chain(y => Object.entries(y)\n .map(([ssn, count]) => {\n // ignore empty ssn\n if (!ssn) return;\n\n // warn if duplicate member\n if (!duplicateReported && count > 1) {\n warnings.push({ code: 'duplicate_group_member', context: x.displayName });\n duplicateReported = true;\n }\n\n // fetch person and warn if not found\n const person = personsSsnMap.get(ssn);\n if (!person) {\n warnings.push({ code: 'invalid_person_reference', context: ssn });\n return;\n }\n\n // warn if the group is a class and the person is already in a different class\n // (we also need to set the group of the person if it is empty)\n if (x.species == 'class') {\n if (!person.group) {\n person.group = x.id;\n }\n else if (person.group != x.id) {\n warnings.push({ code: 'person_in_multiple_classes', context: ssn });\n return;\n }\n }\n\n return person.id;\n })\n .filter(x => x != null)\n )\n .value;\n });\n\n\n ////\n //// courses\n ////\n const coursesIdMap = new Map<string, C_Course >();\n const eventsIdMap = new Map<string, C_Event >();\n const overlapGroupsKeyMap = new Map<string, C_OverlapGroup>();\n if (!source.courses) {\n warnings.push({ code: 'missing_courses_sheet' });\n }\n source.courses?.forEach(x => {\n // await loading events until courses are created\n const mergeWith = toStringIfExists(x.merge_with);\n if (mergeWith) return;\n\n const ids = toStringIfExists(x.foreign_ID);\n const displayName = toStringIfExists(x.name );\n const subject = toStringIfExists(x.subject );\n\n const courseId = toStringIfExists(x.ID) ?? generateId(coursesIdMap);\n if (coursesIdMap.has(courseId)) {\n warnings.push({ code: 'ignoring_duplicate_course', context: displayName + (subject ? ` (${subject})` : '') });\n return;\n }\n\n // try to parse the total hours as an integer\n let expectedTotalHours: number | undefined = undefined;\n if (x.total_hours) {\n try {\n expectedTotalHours = toPositiveInteger(x.total_hours);\n } catch {\n warnings.push({ code: 'invalid_total_hours', context: x.total_hours });\n }\n }\n\n // try to parse the minutes per week as an multiple of 5\n let minutesPerWeek: number | undefined = undefined;\n if (x.minutes_per_week) {\n try {\n minutesPerWeek = toPositiveMultipleOf5(x.minutes_per_week);\n } catch {\n warnings.push({ code: 'invalid_minutes_per_week', context: x.minutes_per_week });\n }\n }\n\n // only one of minutes_per_week or total_hours should be defined\n if (minutesPerWeek != null && expectedTotalHours != null) {\n warnings.push({ code: 'ambiguous_planned_duration', context: `${minutesPerWeek} min/week OR ${expectedTotalHours} hrs` });\n }\n const plannedDuration =\n expectedTotalHours\n ? `${expectedTotalHours} hrs` :\n minutesPerWeek\n ? `${minutesPerWeek} min/week` :\n undefined;\n\n\n // try to parse the lesson durations as an array of integers from which we will generate events\n if (x.lesson_durations) {\n const _durations = typeof x.lesson_durations === 'string'\n ? x.lesson_durations.split(',').map(x => x.trim())\n : [x.lesson_durations];\n\n // truncate to multiple of 5 and filter out zero duration events\n const durations = _durations\n .map(e => {\n try {\n return toPositiveMultipleOf5(e);\n } catch {\n warnings.push({ code: 'invalid_lesson_durations', context: x.lesson_durations });\n return undefined;\n }\n })\n .filter((x): x is number => x !== undefined);\n\n durations.forEach(x => {\n const id = generateId(eventsIdMap);\n const event: C_Event = { id, course: courseId, preferredDuration: x };\n eventsIdMap.set(id, event);\n });\n }\n\n // overlap group\n if (x.overlap_group && toString(x.overlap_group)) {\n const key = toString(x.overlap_group).toLowerCase();\n\n const og = overlapGroupsKeyMap.get(key);\n if (og) og.coalesced?.push({ toModel: 'courses', to: courseId });\n else {\n const id = generateId(overlapGroupsKeyMap);\n const coalesced = [{ toModel: 'courses' as const, to: courseId }];\n overlapGroupsKeyMap.set(key, { id, coalesced });\n }\n }\n\n const locations = extractLocations(x, locationsNameMap, warnings)?.map(x => ({ groupIndex: x.groupIndex, locations: [x.to] as [string] }));\n const groups = extractGroups (x, groupsNameMap, warnings);\n const teachers = extractTeachers (x, teachersNameMap, warnings);\n const syllabus = extractSyllabus(x, syllabusesCodeMap, syllabusesNameMap, warnings);\n\n const course: C_Course = {\n id: courseId,\n ...ids && { ids },\n ...displayName && { displayName },\n ...subject && { subject },\n /* TO BE DEPRECATED */ ...expectedTotalHours && { expectedTotalHours },\n /* TO BE DEPRECATED */ ...minutesPerWeek && { minutesPerWeek },\n ...plannedDuration && { plannedDuration },\n ...groups && { groups },\n ...teachers && { teachers },\n ...locations && { locations },\n ...syllabus && { syllabus },\n __raw: x\n };\n coursesIdMap.set(courseId, course);\n });\n\n\n ////\n //// events\n ////\n source.courses?.forEach(x => {\n // load courses\n const mergeWith = toStringIfExists(x.merge_with);\n if (!mergeWith) return;\n\n // ensure that the course to merge with exists\n if (!coursesIdMap.has(mergeWith)) {\n warnings.push({ code: 'invalid_course_reference', context: mergeWith });\n return;\n }\n\n const displayName = toStringIfExists(x.name);\n const locations = extractLocations(x, locationsNameMap, warnings)?.map(x => ({ groupIndex: x.groupIndex, locations: [x.to] as [string] }));\n const groups = extractGroups (x, groupsNameMap, warnings);\n const teachers = extractTeachers (x, teachersNameMap, warnings);\n\n // try to parse the lesson durations as an array of integers from which we will generate events\n if (x.lesson_durations) {\n const _durations = typeof x.lesson_durations === 'string'\n ? x.lesson_durations.split(',').map(x => x.trim())\n : [x.lesson_durations];\n\n // truncate to multiple of 5 and filter out zero duration events\n const durations = _durations\n .map(e => {\n try {\n return toPositiveMultipleOf5(e);\n } catch {\n warnings.push({ code: 'invalid_lesson_durations', context: x.lesson_durations });\n return undefined;\n }\n })\n .filter((x): x is number => x !== undefined);\n\n durations.forEach(preferredDuration => {\n const id = generateId(eventsIdMap);\n const event: C_Event = {\n id,\n course: mergeWith,\n preferredDuration: preferredDuration,\n ...displayName && { displayName },\n ...groups && { groups },\n ...teachers && { teachers },\n ...locations && { locations },\n __raw: x\n };\n eventsIdMap.set(id, event);\n });\n }\n });\n\n\n ////\n //// return\n ////\n return {\n settings,\n locations: [...locationsIdMap .values()],\n teachers: [...teachersIdMap .values()],\n persons: [...personsIdMap .values()],\n groups: [...groupsIdMap .values()],\n courses: [...coursesIdMap .values()],\n events: [...eventsIdMap .values()],\n overlapGroups: [...overlapGroupsKeyMap.values()],\n syllabuses: [...syllabusesIdMap .values()],\n meta: {\n // ...errors .length && { errors: errors },\n ...warnings.length && { warnings: warnings }\n }\n };\n}\n\n\nexport default {\n schedules: _schedules\n} satisfies FromInterface;"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["id: string","map","locationReferences: { groupIndex: number; to: string }[]","x","groupReferences: { to: string }[]","teacherReferences: { to: string }[]","warnings: { code: Types.ErrorCode, context?: unknown }[]","settings: C_Settings","y: C_Syllabus","group: string | undefined","sex: C_Person['sex']","person: C_Person","expectedTotalHours: number | undefined","minutesPerWeek: number | undefined","event: C_Event","course: C_Course"],"sources":["../../../../src/Excel/v2/from/index.ts"],"sourcesContent":["import { isString, isNumber, countBy } from 'lodash-es';\nimport { nanoid } from 'nanoid';\nimport type { CoreTypes } from '../../../core';\nimport type { Types } from '../types';\nimport type { FromInterface } from '../../../common/types';\nimport { makeChainable } from '../../../common/make-chainable';\n\ntype C_Settings = Pick<CoreTypes.Serialized.Settings, 'discretization' | 'numDays' | 'dayStart' | 'dayEnd'>;\ntype C_Location = Omit<CoreTypes.Serialized.Location, '_id'> & { __raw: Types.Location };\ntype C_Group = Omit<CoreTypes.Serialized.Group, '_id'> & { __raw: Types.Group };\ntype C_Teacher = Omit<CoreTypes.Serialized.Teacher, '_id'> & { __raw: Types.Teacher };\ntype C_Course = Omit<CoreTypes.Serialized.Course, '_id'> & { __raw: Types.Course };\ntype C_Person = Omit<CoreTypes.Serialized.Person, '_id'> & { __raw: Types.Person };\ntype C_Event = Omit<CoreTypes.Serialized.Event, '_id'> & { __raw?: Types.Course };\ntype C_OverlapGroup = Omit<CoreTypes.Serialized.OverlapGroup, '_id'> & { /* raw: Types.OverlapGroup */ };\ntype C_Syllabus = Omit<CoreTypes.Serialized.Syllabus, '_id'> & { __raw?: Types.Syllabus };\n\ntype Out = {\n settings: C_Settings;\n locations: C_Location[];\n teachers: C_Teacher[];\n persons: C_Person[];\n groups: C_Group[];\n courses: C_Course[];\n events: C_Event[];\n overlapGroups: C_OverlapGroup[];\n syllabuses: C_Syllabus[];\n meta: {\n // errors?: string[];\n warnings?: { code: Types.ErrorCode, context?: unknown }[];\n };\n};\n\n\nfunction generateId (map: Map<string, unknown>) {\n // generate a unique id\n let id: string;\n do {\n id = nanoid(8);\n } while (map.has(id));\n\n return id;\n}\n\nfunction toPositiveMultipleOf5 (val: number | string) {\n const num = isString(val) ? parseInt(val) : val;\n\n // throw error if nan\n if (isNaN(num)) throw new Error(`toMultipleOf5: ${val} is not a number`);\n\n const res = Math.floor(num / 5) * 5;\n\n if (res <= 0) throw new Error(`toMultipleOf5: the result ${res} is not positive`);\n\n return res;\n}\n\nfunction toPositiveInteger (val: number | string) {\n const num = isString(val) ? parseInt(val) : val;\n\n // throw error if nan\n if (isNaN(num)) throw new Error(`toInteger: ${val} is not a number`);\n if (num <= 0) throw new Error(`toInteger: te result ${num} is not positive`);\n\n return num;\n}\n\n/**\n * Converts a string/number to a trimmed string\n */\nfunction toString (x: string | number): string {\n return isNumber(x)\n ? x.toString()\n : x.trim();\n}\n\n/**\n * Converts a possible nullish string/number to a trimmed string or undefined\n */\nfunction toStringIfExists (x: string | number | undefined | null): string | undefined {\n if (x == null) return undefined;\n return toString(x);\n}\n\nfunction extractLocations (\n course: Types.Course,\n locationsNameMap: Map<string, C_Location>,\n warnings: { code: Types.ErrorCode, context?: unknown }[],\n) {\n if (course.locations == null) return;\n const locationsStr = toString(course.locations);\n if (!locationsStr) return;\n\n const locationReferences: { groupIndex: number; to: string }[] = [];\n\n locationsStr.split('+')\n .flatMap((x, i) => x.split(',').map(x => [i, x.trim()] as [number, string]))\n .forEach(([i, x]) => {\n const key = x.toLowerCase();\n const ref = locationsNameMap.get(key);\n if (!ref) {\n warnings.push({ code: 'invalid_location_reference', context: x });\n return;\n }\n\n if (locationReferences.some(y => y.to == ref.id)) {\n warnings.push({ code: 'location_referenced_multiple_times', context: x });\n return;\n }\n\n locationReferences.push({ groupIndex: i, to: ref.id });\n });\n\n return locationReferences;\n}\n\nfunction extractGroups (\n course: Types.Course,\n groupsNameMap: Map<string, C_Group>,\n warnings: { code: Types.ErrorCode, context?: unknown }[],\n) {\n if (course.groups == null) return;\n const groupsStr = toString(course.groups);\n if (!groupsStr) return;\n\n const groupReferences: { to: string }[] = [];\n groupsStr.split(',').map(x => x.trim())\n .forEach(x => {\n const key = x.toLowerCase();\n const ref = groupsNameMap.get(key);\n if (!ref) {\n warnings.push({ code: 'invalid_group_reference', context: x });\n return;\n }\n\n if (groupReferences.some(y => y.to == ref.id)) {\n warnings.push({ code: 'group_referenced_multiple_times', context: x });\n return;\n }\n\n groupReferences.push({ to: ref.id });\n });\n\n return groupReferences;\n}\n\nfunction extractTeachers (\n course: Types.Course,\n teachersNameMap: Map<string, C_Teacher>,\n warnings: { code: Types.ErrorCode, context?: unknown }[],\n) {\n if (course.teachers == null) return;\n const teachersStr = toString(course.teachers);\n if (!teachersStr) return undefined;\n\n const teacherReferences: { to: string }[] = [];\n teachersStr.split(',').map(x => x.trim())\n .forEach(x => {\n const key = x.toLowerCase();\n const ref = teachersNameMap.get(key);\n if (!ref) {\n warnings.push({ code: 'invalid_teacher_reference', context: x });\n return;\n }\n\n if (teacherReferences.some(y => y.to == ref.id)) {\n warnings.push({ code: 'teacher_referenced_multiple_times', context: x });\n return;\n }\n\n teacherReferences.push({ to: ref.id });\n });\n\n return teacherReferences;\n}\n\nfunction extractSyllabus (\n course: Types.Course,\n syllabusesCodeMap: Map<string, C_Syllabus>,\n syllabusesNameMap: Map<string, C_Syllabus>,\n warnings: { code: Types.ErrorCode, context?: unknown }[],\n): string | undefined {\n if (course.syllabus == null) return undefined;\n const syllabusValue = toString(course.syllabus);\n if (!syllabusValue) return undefined;\n\n const syllabus = syllabusesCodeMap.get(syllabusValue) || syllabusesNameMap.get(syllabusValue.toLowerCase());\n\n if (!syllabus) {\n warnings.push({ code: 'invalid_syllabus_reference', context: syllabusValue });\n return undefined;\n }\n\n return syllabus.id;\n}\n\n\nfunction _schedules (\n source: Types.Source\n): Out {\n // gather all import related warnings/errors\n const warnings: { code: Types.ErrorCode, context?: unknown }[] = [];\n // let errors: string[] = [];\n\n source.settings = source.settings ?.filter(x => Object.values(x).some(y => toString(y).length > 0));\n source.locations = source.locations?.filter(x => Object.values(x).some(y => toString(y).length > 0));\n source.teachers = source.teachers ?.filter(x => Object.values(x).some(y => toString(y).length > 0));\n source.groups = source.groups ?.filter(x => Object.values(x).some(y => toString(y).length > 0));\n source.persons = source.persons ?.filter(x => Object.values(x).some(y => toString(y).length > 0));\n source.courses = source.courses ?.filter(x => Object.values(x).some(y => toString(y).length > 0));\n\n\n ////\n //// settings\n ////\n const settings: C_Settings = {\n discretization: 5,\n numDays: 5,\n dayStart: '08:00',\n dayEnd: '17:00',\n };\n if (!source.settings) {\n warnings.push({ code: 'missing_settings_sheet' });\n }\n if (source.settings?.[0]?.number_of_days) {\n const numDays = source.settings?.[0]?.number_of_days;\n try {\n settings.numDays = toPositiveInteger(numDays);\n\n // must be 5 or 7\n if (settings.numDays !== 5 && settings.numDays !== 7) {\n warnings.push({ code: 'invalid_number_of_days', context: numDays });\n settings.numDays = 5;\n }\n } catch {\n warnings.push({ code: 'invalid_number_of_days', context: numDays });\n }\n }\n\n ////\n //// syllabuses\n ////\n const syllabusesIdMap = new Map<string, C_Syllabus>();\n const syllabusesNameMap = new Map<string, C_Syllabus>();\n const syllabusesCodeMap = new Map<string, C_Syllabus>();\n if (!source.syllabuses) {\n // warnings.push({ code: 'missing_syllabus_sheet' });\n }\n source.syllabuses?.forEach(x => {\n const ids = toStringIfExists(x.foreign_ID );\n const subjectCode = toStringIfExists(x.subject_code);\n const subjectName = toStringIfExists(x.subject_name);\n const courseCode = toStringIfExists(x.course_code );\n const courseName = toStringIfExists(x.course_name );\n const schoolType = toStringIfExists(x.school_type );\n\n const id = toStringIfExists(x.ID) ?? generateId(syllabusesIdMap);\n if (syllabusesIdMap.has(id)) {\n warnings.push({ code: 'ignoring_duplicate_syllabus', context: `${subjectName} (${courseName})` });\n return;\n }\n\n if (!subjectName) {\n warnings.push({ code: 'missing_subject_name', context: x });\n return;\n }\n\n if (!schoolType) {\n warnings.push({ code: 'missing_school_type', context: x });\n return;\n }\n\n // create the syllabus object\n const y: C_Syllabus = {\n id,\n ...ids && { ids },\n ...subjectCode && { subjectCode },\n subjectName,\n ...courseCode && { courseCode },\n ...courseName && { courseName },\n schoolType,\n official: true, // always true for imported syllabuses\n __raw: x\n };\n syllabusesIdMap.set(id, y);\n const code = courseCode || subjectCode;\n const name = courseName || subjectName;\n if (code) syllabusesCodeMap.set(code, y);\n if (name) syllabusesNameMap.set(name.toLowerCase(), y);\n });\n\n\n ////\n //// locations, teachers\n ////\n const locationsIdMap = new Map<string, C_Location>();\n const locationsNameMap = new Map<string, C_Location>();\n const teachersIdMap = new Map<string, C_Teacher>();\n const teachersNameMap = new Map<string, C_Teacher>();\n [\n {\n name: { singular: 'location', plural: 'locations' } as const,\n data: source.locations,\n idMap: locationsIdMap,\n nameMap: locationsNameMap,\n },\n {\n name: { singular: 'teacher', plural: 'teachers' } as const,\n data: source.teachers,\n idMap: teachersIdMap,\n nameMap: teachersNameMap,\n }\n ].forEach(({ name, data, idMap, nameMap }) => {\n if (!data) {\n warnings.push({ code: `missing_${name.plural}_sheet` });\n }\n data?.forEach(x => {\n const ids = toStringIfExists(x.foreign_ID);\n const displayName = toStringIfExists(x.name );\n\n const id = toStringIfExists(x.ID) ?? generateId(idMap);\n if (idMap.has(id)) {\n warnings.push({ code: `ignoring_duplicate_${name.singular}`, context: displayName });\n return;\n }\n\n const y = {\n id,\n ...ids && { ids },\n ...displayName && { displayName },\n __raw: x\n };\n idMap.set(id, y);\n if (displayName) nameMap.set(displayName.toLowerCase(), y);\n });\n });\n\n\n ////\n //// groups\n ////\n const groupsIdMap = new Map<string, C_Group>();\n const groupsNameMap = new Map<string, C_Group>();\n if (!source.groups) {\n warnings.push({ code: 'missing_groups_sheet' });\n }\n source.groups?.forEach(x => {\n const ids = toStringIfExists(x.foreign_ID);\n const displayName = toStringIfExists(x.name );\n\n const id = toStringIfExists(x.ID) ?? generateId(groupsIdMap);\n if (groupsIdMap.has(id)) {\n warnings.push({ code: 'ignoring_duplicate_group', context: displayName });\n return;\n }\n\n // parent groups determine the species of the group\n const species = toStringIfExists(x.is_class) == '1' ? 'class' as const : undefined;\n\n const y = {\n id,\n ...ids && { ids },\n ...displayName && { displayName },\n ...species && { species },\n __raw: x\n } as C_Group;\n groupsIdMap.set(id, y);\n if (displayName) groupsNameMap.set(displayName.toLowerCase(), y);\n });\n\n\n ////\n //// persons\n ////\n const personsIdMap = new Map<string, C_Person>();\n const personsSsnMap = new Map<string, C_Person>();\n if (!source.persons) {\n warnings.push({ code: 'missing_persons_sheet' });\n }\n source.persons?.forEach(x => {\n const ids = toStringIfExists(x.foreign_ID);\n const firstName = toStringIfExists(x.first_name);\n const lastName = toStringIfExists(x.last_name );\n const SSN = toStringIfExists(x.SSN );\n\n const id = toStringIfExists(x.ID) ?? generateId(personsIdMap);\n if (personsIdMap.has(id)) {\n warnings.push({ code: 'ignoring_duplicate_person', context: `${firstName} ${lastName}` });\n return;\n }\n\n let group: string | undefined = undefined;\n if (x.group) {\n const key = toString(x.group).toLowerCase();\n const ref = groupsNameMap.get(key);\n if (!ref) {\n warnings.push({ code: 'invalid_group_reference', context: x.group });\n } else if (ref.species !== 'class') {\n warnings.push({ code: 'forbidden_group_reference', context: x.group });\n } else {\n group = ref.id;\n }\n }\n\n let sex: C_Person['sex'];\n if (x.sex) {\n if (isString(x.sex) && x.sex.toLowerCase() == 'man') sex = 'Man';\n else if (isString(x.sex) && x.sex.toLowerCase() == 'woman') sex = 'Woman';\n else {\n warnings.push({ code: 'invalid_sex', context: x.sex });\n }\n }\n\n const person: C_Person = {\n id,\n ...ids && { ids },\n ...firstName && { firstName },\n ...lastName && { lastName },\n ...sex && { sex },\n ...group && { group },\n ...SSN && { SSN: { value: SSN } },\n __raw: x\n };\n personsIdMap.set(id, person);\n if (SSN) personsSsnMap.set(SSN, person);\n });\n\n ////\n //// group.members (need to wait for persons to be parsed)\n ////\n groupsNameMap.forEach(x => {\n let duplicateReported = false;\n\n // ignore if no members\n if (!x.__raw.members) return;\n\n // parse and replace SSN by person id\n x.members = makeChainable(x.__raw.members)\n .chain(x => toString(x)\n .split(',')\n .map(x => x.trim())\n .filter(x => x != null)\n )\n .chain(x => countBy(x))\n .chain(y => Object.entries(y)\n .map(([ssn, count]) => {\n // ignore empty ssn\n if (!ssn) return;\n\n // warn if duplicate member\n if (!duplicateReported && count > 1) {\n warnings.push({ code: 'duplicate_group_member', context: x.displayName });\n duplicateReported = true;\n }\n\n // fetch person and warn if not found\n const person = personsSsnMap.get(ssn);\n if (!person) {\n warnings.push({ code: 'invalid_person_reference', context: ssn });\n return;\n }\n\n // warn if the group is a class and the person is already in a different class\n // (we also need to set the group of the person if it is empty)\n if (x.species == 'class') {\n if (!person.group) {\n person.group = x.id;\n }\n else if (person.group != x.id) {\n warnings.push({ code: 'person_in_multiple_classes', context: ssn });\n return;\n }\n }\n\n return person.id;\n })\n .filter(x => x != null)\n )\n .value;\n });\n\n\n ////\n //// courses\n ////\n const coursesIdMap = new Map<string, C_Course >();\n const eventsIdMap = new Map<string, C_Event >();\n const overlapGroupsKeyMap = new Map<string, C_OverlapGroup>();\n if (!source.courses) {\n warnings.push({ code: 'missing_courses_sheet' });\n }\n source.courses?.forEach(x => {\n // await loading events until courses are created\n const mergeWith = toStringIfExists(x.merge_with);\n if (mergeWith) return;\n\n const ids = toStringIfExists(x.foreign_ID);\n const displayName = toStringIfExists(x.name );\n const subject = toStringIfExists(x.subject );\n\n const courseId = toStringIfExists(x.ID) ?? generateId(coursesIdMap);\n if (coursesIdMap.has(courseId)) {\n warnings.push({ code: 'ignoring_duplicate_course', context: displayName + (subject ? ` (${subject})` : '') });\n return;\n }\n\n // try to parse the total hours as an integer\n let expectedTotalHours: number | undefined = undefined;\n if (x.total_hours) {\n try {\n expectedTotalHours = toPositiveInteger(x.total_hours);\n } catch {\n warnings.push({ code: 'invalid_total_hours', context: x.total_hours });\n }\n }\n\n // try to parse the minutes per week as an multiple of 5\n let minutesPerWeek: number | undefined = undefined;\n if (x.minutes_per_week) {\n try {\n minutesPerWeek = toPositiveMultipleOf5(x.minutes_per_week);\n } catch {\n warnings.push({ code: 'invalid_minutes_per_week', context: x.minutes_per_week });\n }\n }\n\n // only one of minutes_per_week or total_hours should be defined\n if (minutesPerWeek != null && expectedTotalHours != null) {\n warnings.push({ code: 'ambiguous_planned_duration', context: `${minutesPerWeek} min/week OR ${expectedTotalHours} hrs` });\n }\n const plannedDuration =\n expectedTotalHours\n ? `${expectedTotalHours} hrs` :\n minutesPerWeek\n ? `${minutesPerWeek} min/week` :\n undefined;\n\n\n // try to parse the lesson durations as an array of integers from which we will generate events\n if (x.lesson_durations) {\n const _durations = typeof x.lesson_durations === 'string'\n ? x.lesson_durations.split(',').map(x => x.trim())\n : [x.lesson_durations];\n\n // truncate to multiple of 5 and filter out zero duration events\n const durations = _durations\n .map(e => {\n try {\n return toPositiveMultipleOf5(e);\n } catch {\n warnings.push({ code: 'invalid_lesson_durations', context: x.lesson_durations });\n return undefined;\n }\n })\n .filter((x): x is number => x !== undefined);\n\n durations.forEach(x => {\n const id = generateId(eventsIdMap);\n const event: C_Event = { id, course: courseId, preferredDuration: x };\n eventsIdMap.set(id, event);\n });\n }\n\n // overlap group\n if (x.overlap_group && toString(x.overlap_group)) {\n const key = toString(x.overlap_group).toLowerCase();\n\n const og = overlapGroupsKeyMap.get(key);\n if (og) og.coalesced?.push({ toModel: 'courses', to: courseId });\n else {\n const id = generateId(overlapGroupsKeyMap);\n const coalesced = [{ toModel: 'courses' as const, to: courseId }];\n overlapGroupsKeyMap.set(key, { id, coalesced });\n }\n }\n\n const locations = extractLocations(x, locationsNameMap, warnings)?.map(x => ({ groupIndex: x.groupIndex, locations: [x.to] as [string] }));\n const groups = extractGroups (x, groupsNameMap, warnings);\n const teachers = extractTeachers (x, teachersNameMap, warnings);\n const syllabus = extractSyllabus(x, syllabusesCodeMap, syllabusesNameMap, warnings);\n\n const course: C_Course = {\n id: courseId,\n ...ids && { ids },\n ...displayName && { displayName },\n ...subject && { subject },\n /* TO BE DEPRECATED */ ...expectedTotalHours && { expectedTotalHours },\n /* TO BE DEPRECATED */ ...minutesPerWeek && { minutesPerWeek },\n ...plannedDuration && { plannedDuration },\n ...groups && { groups },\n ...teachers && { teachers },\n ...locations && { locations },\n ...syllabus && { syllabus },\n __raw: x\n };\n coursesIdMap.set(courseId, course);\n });\n\n\n ////\n //// events\n ////\n source.courses?.forEach(x => {\n // load courses\n const mergeWith = toStringIfExists(x.merge_with);\n if (!mergeWith) return;\n\n // ensure that the course to merge with exists\n if (!coursesIdMap.has(mergeWith)) {\n warnings.push({ code: 'invalid_course_reference', context: mergeWith });\n return;\n }\n\n const displayName = toStringIfExists(x.name);\n const locations = extractLocations(x, locationsNameMap, warnings)?.map(x => ({ groupIndex: x.groupIndex, locations: [x.to] as [string] }));\n const groups = extractGroups (x, groupsNameMap, warnings);\n const teachers = extractTeachers (x, teachersNameMap, warnings);\n\n // try to parse the lesson durations as an array of integers from which we will generate events\n if (x.lesson_durations) {\n const _durations = typeof x.lesson_durations === 'string'\n ? x.lesson_durations.split(',').map(x => x.trim())\n : [x.lesson_durations];\n\n // truncate to multiple of 5 and filter out zero duration events\n const durations = _durations\n .map(e => {\n try {\n return toPositiveMultipleOf5(e);\n } catch {\n warnings.push({ code: 'invalid_lesson_durations', context: x.lesson_durations });\n return undefined;\n }\n })\n .filter((x): x is number => x !== undefined);\n\n durations.forEach(preferredDuration => {\n const id = generateId(eventsIdMap);\n const event: C_Event = {\n id,\n course: mergeWith,\n preferredDuration: preferredDuration,\n ...displayName && { displayName },\n ...groups && { groups },\n ...teachers && { teachers },\n ...locations && { locations },\n __raw: x\n };\n eventsIdMap.set(id, event);\n });\n }\n });\n\n\n ////\n //// return\n ////\n return {\n settings,\n locations: [...locationsIdMap .values()],\n teachers: [...teachersIdMap .values()],\n persons: [...personsIdMap .values()],\n groups: [...groupsIdMap .values()],\n courses: [...coursesIdMap .values()],\n events: [...eventsIdMap .values()],\n overlapGroups: [...overlapGroupsKeyMap.values()],\n syllabuses: [...syllabusesIdMap .values()],\n meta: {\n // ...errors .length && { errors: errors },\n ...warnings.length && { warnings: warnings }\n }\n };\n}\n\n\nexport default {\n schedules: _schedules\n} satisfies FromInterface;"],"mappings":"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"}
|
package/dist/Excel/v2/index.d.ts
CHANGED
|
@@ -6,8 +6,7 @@ import { MaximumScheduleSpan } from "../../core/interfaces/vertices/properties/m
|
|
|
6
6
|
import { PlannedScheduledDuration } from "../../core/interfaces/vertices/properties/planned-scheduled-duration.js";
|
|
7
7
|
import { MinBreakLength } from "../../core/interfaces/vertices/properties/min-break-length.js";
|
|
8
8
|
import { Types } from "./types/index.js";
|
|
9
|
-
import "
|
|
10
|
-
import * as moment199 from "moment";
|
|
9
|
+
import * as moment195 from "moment";
|
|
11
10
|
|
|
12
11
|
//#region src/Excel/v2/index.d.ts
|
|
13
12
|
declare class Map {
|
|
@@ -198,8 +197,8 @@ declare class Map {
|
|
|
198
197
|
createdAt?: string | undefined;
|
|
199
198
|
updatedAt?: string | undefined;
|
|
200
199
|
lastModifiedBy?: string | undefined;
|
|
201
|
-
start?: (
|
|
202
|
-
end?: (
|
|
200
|
+
start?: (moment195.Moment | string) | undefined;
|
|
201
|
+
end?: (moment195.Moment | string) | undefined;
|
|
203
202
|
potentialCenter?: string | undefined;
|
|
204
203
|
type?: string | undefined;
|
|
205
204
|
tags?: Tag[] | undefined;
|
|
@@ -242,6 +241,7 @@ declare class Map {
|
|
|
242
241
|
rank?: number | undefined;
|
|
243
242
|
locations: [string];
|
|
244
243
|
}[] | undefined;
|
|
244
|
+
threads?: string[] | undefined;
|
|
245
245
|
}, "_id"> & {
|
|
246
246
|
__raw?: Types.Course;
|
|
247
247
|
})[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"courses.js","names":[],"sources":["../../../src/IdunSoft/from/courses.ts"],"sourcesContent":["import type { Types as IdunSoftTypes } from '../types';\nimport type { OutTypes } from './schedules';\n\nexport default (courses: IdunSoftTypes.course[]): OutTypes.course[] => {\n return courses\n .reduce<OutTypes.course[]>((acc, course, index) => {\n const ids = course['Ämne'];\n if (!ids)\n throw new Error('A course does not have a unique key');\n\n if (acc.map(x => x.ids).includes(ids))\n throw new Error(`A course ID \"${ids}\" exists multiple times at indices ${ index } and ${ acc.findIndex(x => x.ids == ids) }`);\n\n return acc.concat({\n ids: ids,\n subject: course['Betygskod']\n });\n }, []);\n};"],"mappings":";AAGA,uBAAgB,YAAuD;AACrE,QAAO,QACJ,QAA2B,KAAK,QAAQ,UAAU;EACjD,MAAM,MAAM,OAAO;AACnB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM
|
|
1
|
+
{"version":3,"file":"courses.js","names":[],"sources":["../../../src/IdunSoft/from/courses.ts"],"sourcesContent":["import type { Types as IdunSoftTypes } from '../types';\nimport type { OutTypes } from './schedules';\n\nexport default (courses: IdunSoftTypes.course[]): OutTypes.course[] => {\n return courses\n .reduce<OutTypes.course[]>((acc, course, index) => {\n const ids = course['Ämne'];\n if (!ids)\n throw new Error('A course does not have a unique key');\n\n if (acc.map(x => x.ids).includes(ids))\n throw new Error(`A course ID \"${ids}\" exists multiple times at indices ${ index } and ${ acc.findIndex(x => x.ids == ids) }`);\n\n return acc.concat({\n ids: ids,\n subject: course['Betygskod']\n });\n }, []);\n};"],"mappings":";AAGA,uBAAgB,YAAuD;AACrE,QAAO,QACJ,QAA2B,KAAK,QAAQ,UAAU;EACjD,MAAM,MAAM,OAAO;AACnB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM;AAElB,MAAI,IAAI,KAAI,MAAK,EAAE,KAAK,SAAS,KAC/B,OAAM,IAAI,MAAM,gBAAgB,IAAI,qCAAsC,MAAO,OAAQ,IAAI,WAAU,MAAK,EAAE,OAAO;AAEvH,SAAO,IAAI,OAAO;GACP;GACT,SAAS,OAAO;;IAEjB"}
|
|
@@ -29,9 +29,10 @@ var events_default = (events) => {
|
|
|
29
29
|
const hours = Math.floor(event.Starttid * 24);
|
|
30
30
|
const minutes = (event.Starttid * 24 - hours) * 60;
|
|
31
31
|
const start$1 = Constants.FIRST_DAY.clone().add(day, "days").add(hours, "hours").add(minutes, "minutes");
|
|
32
|
+
const end$1 = start$1.clone().add(duration, "minutes");
|
|
32
33
|
return {
|
|
33
34
|
start: start$1,
|
|
34
|
-
end:
|
|
35
|
+
end: end$1
|
|
35
36
|
};
|
|
36
37
|
})();
|
|
37
38
|
const doc = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","names":["start","doc: OutTypes.event"],"sources":["../../../src/IdunSoft/from/events.ts"],"sourcesContent":["import { getDayIndex } from '../../core/util';\nimport { Constants } from '../../common/constants';\nimport type { Types as IdunSoftTypes } from '../types';\nimport type { OutTypes } from './schedules';\n\nexport default (events: IdunSoftTypes.fromEvent[]): OutTypes.event[] => {\n return events\n .reduce<OutTypes.event[]>((acc, event, index) => {\n const ids = event['LektionID'];\n if (!ids)\n throw new Error('An event does not have a unique key');\n\n if (acc.some(x => x.ids == ids))\n throw new Error(`An event ID \"${ids}\" exists multiple times at indices ${ index } and ${ acc.findIndex(x => x.ids == ids) }`);\n\n if (!event['Lektionslängd'])\n throw new Error(`An event [${ ids }] does not have a duration`);\n\n const duration = (() => {\n try {\n return parseInt(event['Lektionslängd'].split('min')[0]);\n } catch {\n throw new Error('duration have wrong structure');\n }\n })();\n\n const teachers = event['LärareID'] ? [...new Set(event['LärareID'].split(','))].map(to => ({ to })) : [];\n const groups = event['GruppID' ] ? [event['GruppID'] ].map(to => ({ to })) : [];\n const inLocations = event['RumID' ] ? [event['RumID'] ] : [];\n const locations = inLocations.map(x => ({ locations: [x] as [string] }));\n\n const preferredDuration = parseInt(event.Lektionslängd); // ASSUMED TO BE OF THE FORMAT '40', IS THIS TRUE?\n\n const { start, end } = (() => {\n if (event.Starttid == null || event.VeckodagID == null) return { start: undefined, end: undefined };\n\n const day = getDayIndex(event.VeckodagID);\n const hours = Math.floor(event.Starttid * 24);\n const minutes = (event.Starttid * 24 - hours) * 60;\n\n const start = Constants.FIRST_DAY\n .clone()\n .add(day, 'days')\n .add(hours, 'hours')\n .add(minutes, 'minutes');\n const end = start\n .clone()\n .add(duration, 'minutes');\n\n return { start, end };\n })();\n\n const doc: OutTypes.event = {\n ids: ids,\n course: event['Ämne'],\n preferredDuration,\n duration,\n teachers,\n groups,\n locations,\n inLocations,\n ...start && end && { start, end, parked: false }\n };\n return acc.concat(doc);\n }, []);\n};"],"mappings":";;;;AAKA,sBAAgB,WAAwD;AACtE,QAAO,OACJ,QAA0B,KAAK,OAAO,UAAU;EAC/C,MAAM,MAAM,MAAM;AAClB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM
|
|
1
|
+
{"version":3,"file":"events.js","names":["start","end","doc: OutTypes.event"],"sources":["../../../src/IdunSoft/from/events.ts"],"sourcesContent":["import { getDayIndex } from '../../core/util';\nimport { Constants } from '../../common/constants';\nimport type { Types as IdunSoftTypes } from '../types';\nimport type { OutTypes } from './schedules';\n\nexport default (events: IdunSoftTypes.fromEvent[]): OutTypes.event[] => {\n return events\n .reduce<OutTypes.event[]>((acc, event, index) => {\n const ids = event['LektionID'];\n if (!ids)\n throw new Error('An event does not have a unique key');\n\n if (acc.some(x => x.ids == ids))\n throw new Error(`An event ID \"${ids}\" exists multiple times at indices ${ index } and ${ acc.findIndex(x => x.ids == ids) }`);\n\n if (!event['Lektionslängd'])\n throw new Error(`An event [${ ids }] does not have a duration`);\n\n const duration = (() => {\n try {\n return parseInt(event['Lektionslängd'].split('min')[0]);\n } catch {\n throw new Error('duration have wrong structure');\n }\n })();\n\n const teachers = event['LärareID'] ? [...new Set(event['LärareID'].split(','))].map(to => ({ to })) : [];\n const groups = event['GruppID' ] ? [event['GruppID'] ].map(to => ({ to })) : [];\n const inLocations = event['RumID' ] ? [event['RumID'] ] : [];\n const locations = inLocations.map(x => ({ locations: [x] as [string] }));\n\n const preferredDuration = parseInt(event.Lektionslängd); // ASSUMED TO BE OF THE FORMAT '40', IS THIS TRUE?\n\n const { start, end } = (() => {\n if (event.Starttid == null || event.VeckodagID == null) return { start: undefined, end: undefined };\n\n const day = getDayIndex(event.VeckodagID);\n const hours = Math.floor(event.Starttid * 24);\n const minutes = (event.Starttid * 24 - hours) * 60;\n\n const start = Constants.FIRST_DAY\n .clone()\n .add(day, 'days')\n .add(hours, 'hours')\n .add(minutes, 'minutes');\n const end = start\n .clone()\n .add(duration, 'minutes');\n\n return { start, end };\n })();\n\n const doc: OutTypes.event = {\n ids: ids,\n course: event['Ämne'],\n preferredDuration,\n duration,\n teachers,\n groups,\n locations,\n inLocations,\n ...start && end && { start, end, parked: false }\n };\n return acc.concat(doc);\n }, []);\n};"],"mappings":";;;;AAKA,sBAAgB,WAAwD;AACtE,QAAO,OACJ,QAA0B,KAAK,OAAO,UAAU;EAC/C,MAAM,MAAM,MAAM;AAClB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM;AAElB,MAAI,IAAI,MAAK,MAAK,EAAE,OAAO,KACzB,OAAM,IAAI,MAAM,gBAAgB,IAAI,qCAAsC,MAAO,OAAQ,IAAI,WAAU,MAAK,EAAE,OAAO;AAEvH,MAAI,CAAC,MAAM,iBACT,OAAM,IAAI,MAAM,aAAc,IAAK;EAErC,MAAM,kBAAkB;AACtB,OAAI;AACF,WAAO,SAAS,MAAM,iBAAiB,MAAM,OAAO;WAC9C;AACN,UAAM,IAAI,MAAM;;;EAIpB,MAAM,WAAc,MAAM,cAAc,CAAC,GAAG,IAAI,IAAI,MAAM,YAAY,MAAM,OAAO,KAAI,QAAO,EAAE,SAAS;EACzG,MAAM,SAAc,MAAM,aAAc,CAAC,MAAM,YAAoC,KAAI,QAAO,EAAE,SAAS;EACzG,MAAM,cAAc,MAAM,WAAc,CAAC,MAAM,YAA0D;EACzG,MAAM,YAAc,YAAY,KAAI,OAAM,EAAE,WAAW,CAAC;EAExD,MAAM,oBAAoB,SAAS,MAAM;EAEzC,MAAM,EAAE,OAAO,eAAe;AAC5B,OAAI,MAAM,YAAY,QAAQ,MAAM,cAAc,KAAM,QAAO;IAAE,OAAO;IAAW,KAAK;;GAExF,MAAM,MAAU,YAAY,MAAM;GAClC,MAAM,QAAU,KAAK,MAAM,MAAM,WAAW;GAC5C,MAAM,WAAW,MAAM,WAAW,KAAK,SAAS;GAEhD,MAAMA,UAAQ,UAAU,UACrB,QACA,IAAI,KAAK,QACT,IAAI,OAAO,SACX,IAAI,SAAS;GAChB,MAAMC,QAAMD,QACT,QACA,IAAI,UAAU;AAEjB,UAAO;IAAE;IAAO;;;EAGlB,MAAME,MAAsB;GAClB;GACR,QAAQ,MAAM;GACd;GACA;GACA;GACA;GACA;GACA;GACA,GAAG,SAAS,OAAO;IAAE;IAAO;IAAK,QAAQ;;;AAE3C,SAAO,IAAI,OAAO;IACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groups.js","names":[],"sources":["../../../src/IdunSoft/from/groups.ts"],"sourcesContent":["import type { Types as IdunSoftTypes } from '../types';\nimport type { OutTypes } from './schedules';\n\nexport default (groups: IdunSoftTypes.group[]): OutTypes.group[] => {\n return groups\n .reduce<OutTypes.group[]>((acc, group, index) => {\n const ids = group['ID'];\n if (!ids)\n throw new Error('A group does not have a unique key');\n\n if (acc.some(x => x.ids == ids))\n throw new Error(`A group ID \"${ids}\" exist multiple times at indices ${ index } and ${ acc.findIndex(x => x.ids == ids) }`);\n\n return acc.concat({\n ids: ids,\n displayName: group['Klassnamn'],\n species: 'class',\n });\n }, []);\n};"],"mappings":";AAGA,sBAAgB,WAAoD;AAClE,QAAO,OACJ,QAA0B,KAAK,OAAO,UAAU;EAC/C,MAAM,MAAM,MAAM;AAClB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM
|
|
1
|
+
{"version":3,"file":"groups.js","names":[],"sources":["../../../src/IdunSoft/from/groups.ts"],"sourcesContent":["import type { Types as IdunSoftTypes } from '../types';\nimport type { OutTypes } from './schedules';\n\nexport default (groups: IdunSoftTypes.group[]): OutTypes.group[] => {\n return groups\n .reduce<OutTypes.group[]>((acc, group, index) => {\n const ids = group['ID'];\n if (!ids)\n throw new Error('A group does not have a unique key');\n\n if (acc.some(x => x.ids == ids))\n throw new Error(`A group ID \"${ids}\" exist multiple times at indices ${ index } and ${ acc.findIndex(x => x.ids == ids) }`);\n\n return acc.concat({\n ids: ids,\n displayName: group['Klassnamn'],\n species: 'class',\n });\n }, []);\n};"],"mappings":";AAGA,sBAAgB,WAAoD;AAClE,QAAO,OACJ,QAA0B,KAAK,OAAO,UAAU;EAC/C,MAAM,MAAM,MAAM;AAClB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM;AAElB,MAAI,IAAI,MAAK,MAAK,EAAE,OAAO,KACzB,OAAM,IAAI,MAAM,eAAe,IAAI,oCAAqC,MAAO,OAAQ,IAAI,WAAU,MAAK,EAAE,OAAO;AAErH,SAAO,IAAI,OAAO;GACH;GACb,aAAa,MAAM;GACnB,SAAa;;IAEd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_schedules"],"sources":["../../../src/IdunSoft/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../common/types';\nimport _schedules from './schedules';\n\nexport default {\n schedules: _schedules\n} satisfies FromInterface;"],"mappings":";;;AAGA,mBAAe,EACb,WAAWA
|
|
1
|
+
{"version":3,"file":"index.js","names":["_schedules"],"sources":["../../../src/IdunSoft/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../common/types';\nimport _schedules from './schedules';\n\nexport default {\n schedules: _schedules\n} satisfies FromInterface;"],"mappings":";;;AAGA,mBAAe,EACb,WAAWA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locations.js","names":[],"sources":["../../../src/IdunSoft/from/locations.ts"],"sourcesContent":["import type { Types as IdunSoftTypes } from '../types';\nimport type { OutTypes } from './schedules';\n\nexport default (locations: IdunSoftTypes.location[]): OutTypes.location[] => {\n return locations\n .reduce<OutTypes.location[]>((acc, location, index) => {\n const ids = location['ID'];\n if (!ids)\n throw new Error('A location does not have a unique key');\n\n if (acc.some(x => x.ids == ids))\n throw new Error(`A location ID \"${ids}\" exists multiple times at indices ${ index } and ${ acc.findIndex(x => x.ids == ids) }`);\n\n return acc.concat({\n ids: ids,\n displayName: location['Namn']\n });\n }, []);\n};"],"mappings":";AAGA,yBAAgB,cAA6D;AAC3E,QAAO,UACJ,QAA6B,KAAK,UAAU,UAAU;EACrD,MAAM,MAAM,SAAS;AACrB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM
|
|
1
|
+
{"version":3,"file":"locations.js","names":[],"sources":["../../../src/IdunSoft/from/locations.ts"],"sourcesContent":["import type { Types as IdunSoftTypes } from '../types';\nimport type { OutTypes } from './schedules';\n\nexport default (locations: IdunSoftTypes.location[]): OutTypes.location[] => {\n return locations\n .reduce<OutTypes.location[]>((acc, location, index) => {\n const ids = location['ID'];\n if (!ids)\n throw new Error('A location does not have a unique key');\n\n if (acc.some(x => x.ids == ids))\n throw new Error(`A location ID \"${ids}\" exists multiple times at indices ${ index } and ${ acc.findIndex(x => x.ids == ids) }`);\n\n return acc.concat({\n ids: ids,\n displayName: location['Namn']\n });\n }, []);\n};"],"mappings":";AAGA,yBAAgB,cAA6D;AAC3E,QAAO,UACJ,QAA6B,KAAK,UAAU,UAAU;EACrD,MAAM,MAAM,SAAS;AACrB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM;AAElB,MAAI,IAAI,MAAK,MAAK,EAAE,OAAO,KACzB,OAAM,IAAI,MAAM,kBAAkB,IAAI,qCAAsC,MAAO,OAAQ,IAAI,WAAU,MAAK,EAAE,OAAO;AAEzH,SAAO,IAAI,OAAO;GACH;GACb,aAAa,SAAS;;IAEvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedules.js","names":["_groups","_teachers","_locations","_courses","_events"],"sources":["../../../src/IdunSoft/from/schedules.ts"],"sourcesContent":["\nimport type { CoreTypes } from '../../core';\nimport type { Types as IdunSoftTypes } from '../types';\nimport _groups from './groups';\nimport _teachers from './teachers';\nimport _locations from './locations';\nimport _courses from './courses';\nimport _events from './events';\nimport type { InternalIdKey } from '../../core/types/common';\n\nexport namespace OutTypes {\n export type group = Omit<CoreTypes.Serialized.Group, InternalIdKey>;\n export type teacher = Omit<CoreTypes.Serialized.Teacher, InternalIdKey>;\n export type location = Omit<CoreTypes.Serialized.Location, InternalIdKey>;\n export type course = Omit<CoreTypes.Serialized.Course, InternalIdKey>;\n export type event = Omit<CoreTypes.Serialized.Event, InternalIdKey>;\n};\n\ntype Out = {\n groups: OutTypes.group[];\n teachers: OutTypes.teacher[];\n locations: OutTypes.location[];\n courses: OutTypes.course[];\n events: OutTypes.event[];\n};\n\nexport default function (schedule: Partial<IdunSoftTypes.schedule>): Out {\n return {\n groups: _groups (schedule['Grupp' ] ?? []),\n teachers: _teachers (schedule['Lärare' ] ?? []),\n locations: _locations(schedule['Rum' ] ?? []),\n courses: _courses (schedule['Ämne' ] ?? []),\n events: _events (schedule['Lektion'] ?? []),\n };\n}"],"mappings":";;;;;;;AA0BA,2BAAyB,UAAgD;AACvE,QAAO;EACL,QAAWA,eAAW,SAAS,YAAc
|
|
1
|
+
{"version":3,"file":"schedules.js","names":["_groups","_teachers","_locations","_courses","_events"],"sources":["../../../src/IdunSoft/from/schedules.ts"],"sourcesContent":["\nimport type { CoreTypes } from '../../core';\nimport type { Types as IdunSoftTypes } from '../types';\nimport _groups from './groups';\nimport _teachers from './teachers';\nimport _locations from './locations';\nimport _courses from './courses';\nimport _events from './events';\nimport type { InternalIdKey } from '../../core/types/common';\n\nexport namespace OutTypes {\n export type group = Omit<CoreTypes.Serialized.Group, InternalIdKey>;\n export type teacher = Omit<CoreTypes.Serialized.Teacher, InternalIdKey>;\n export type location = Omit<CoreTypes.Serialized.Location, InternalIdKey>;\n export type course = Omit<CoreTypes.Serialized.Course, InternalIdKey>;\n export type event = Omit<CoreTypes.Serialized.Event, InternalIdKey>;\n};\n\ntype Out = {\n groups: OutTypes.group[];\n teachers: OutTypes.teacher[];\n locations: OutTypes.location[];\n courses: OutTypes.course[];\n events: OutTypes.event[];\n};\n\nexport default function (schedule: Partial<IdunSoftTypes.schedule>): Out {\n return {\n groups: _groups (schedule['Grupp' ] ?? []),\n teachers: _teachers (schedule['Lärare' ] ?? []),\n locations: _locations(schedule['Rum' ] ?? []),\n courses: _courses (schedule['Ämne' ] ?? []),\n events: _events (schedule['Lektion'] ?? []),\n };\n}"],"mappings":";;;;;;;AA0BA,2BAAyB,UAAgD;AACvE,QAAO;EACL,QAAWA,eAAW,SAAS,YAAc;EAC7C,UAAWC,iBAAW,SAAS,aAAc;EAC7C,WAAWC,kBAAW,SAAS,UAAc;EAC7C,SAAWC,gBAAW,SAAS,WAAc;EAC7C,QAAWC,eAAW,SAAS,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teachers.js","names":[],"sources":["../../../src/IdunSoft/from/teachers.ts"],"sourcesContent":["import type { Types as IdunSoftTypes } from '../types';\nimport type { OutTypes } from './schedules';\n\nexport default (teachers: IdunSoftTypes.teacher[]): OutTypes.teacher[] => {\n return teachers\n .reduce<OutTypes.teacher[]>((acc, teacher, index) => {\n const ids = teacher['ID'];\n if (!ids)\n throw new Error('A teacher does not have a unique key');\n\n if (acc.some(x => x.ids == ids))\n throw new Error(`A teacher ID \"${ids}\" exists multiple times at indices ${ index } and ${ acc.findIndex(x => x.ids == ids) }`);\n\n return acc.concat({\n ids: ids,\n displayName: teacher['Namn']\n });\n }, []);\n};"],"mappings":";AAGA,wBAAgB,aAA0D;AACxE,QAAO,SACJ,QAA4B,KAAK,SAAS,UAAU;EACnD,MAAM,MAAM,QAAQ;AACpB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM
|
|
1
|
+
{"version":3,"file":"teachers.js","names":[],"sources":["../../../src/IdunSoft/from/teachers.ts"],"sourcesContent":["import type { Types as IdunSoftTypes } from '../types';\nimport type { OutTypes } from './schedules';\n\nexport default (teachers: IdunSoftTypes.teacher[]): OutTypes.teacher[] => {\n return teachers\n .reduce<OutTypes.teacher[]>((acc, teacher, index) => {\n const ids = teacher['ID'];\n if (!ids)\n throw new Error('A teacher does not have a unique key');\n\n if (acc.some(x => x.ids == ids))\n throw new Error(`A teacher ID \"${ids}\" exists multiple times at indices ${ index } and ${ acc.findIndex(x => x.ids == ids) }`);\n\n return acc.concat({\n ids: ids,\n displayName: teacher['Namn']\n });\n }, []);\n};"],"mappings":";AAGA,wBAAgB,aAA0D;AACxE,QAAO,SACJ,QAA4B,KAAK,SAAS,UAAU;EACnD,MAAM,MAAM,QAAQ;AACpB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM;AAElB,MAAI,IAAI,MAAK,MAAK,EAAE,OAAO,KACzB,OAAM,IAAI,MAAM,iBAAiB,IAAI,qCAAsC,MAAO,OAAQ,IAAI,WAAU,MAAK,EAAE,OAAO;AAExH,SAAO,IAAI,OAAO;GACH;GACb,aAAa,QAAQ;;IAEtB"}
|
|
@@ -33,7 +33,7 @@ var schedules_default = (courseEvents) => {
|
|
|
33
33
|
if (!course || typeof course == "string" || isMongooseObjectId(course)) throw new Error("Event course not found or invalid");
|
|
34
34
|
const teachers = (event.teachers ?? course.teachers)?.map((x) => x.to);
|
|
35
35
|
const groups = (event.groups ?? course.groups)?.map((x) => x.to);
|
|
36
|
-
|
|
36
|
+
const doc = {
|
|
37
37
|
Ämne: course.ids,
|
|
38
38
|
Veckodag: day,
|
|
39
39
|
Starttid: moment.utc(event.start).format("HH.mm:ss"),
|
|
@@ -43,11 +43,14 @@ var schedules_default = (courseEvents) => {
|
|
|
43
43
|
Klassrum: (event.inLocations ?? []).map((x) => x && typeof x == "object" && "ids" in x ? x.ids : null).filter((x) => x != null).join(","),
|
|
44
44
|
Halvklass: "Nej"
|
|
45
45
|
};
|
|
46
|
+
return doc;
|
|
46
47
|
}).filter((x) => x != null);
|
|
47
|
-
|
|
48
|
+
const opts = {
|
|
48
49
|
fields,
|
|
49
50
|
delimiter
|
|
50
|
-
}
|
|
51
|
+
};
|
|
52
|
+
const parser = new Parser(opts);
|
|
53
|
+
return parser.parse(events);
|
|
51
54
|
};
|
|
52
55
|
|
|
53
56
|
//#endregion
|