@royalschedule/maps 4.0.32 → 4.0.33
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 +1 -0
- package/dist/Additio/from/schedules.js +2 -4
- 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 -0
- package/dist/Additio/to/schedules.js +2 -4
- 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 +1 -0
- package/dist/Admentum/from/schedules.js +3 -6
- 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 +1 -0
- package/dist/Admentum/to/schedules.js +4 -7
- package/dist/Admentum/to/schedules.js.map +1 -1
- package/dist/Excel/index.d.ts +4 -3
- 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 -0
- package/dist/Excel/v2/from/index.js +45 -54
- package/dist/Excel/v2/from/index.js.map +1 -1
- package/dist/Excel/v2/index.d.ts +1 -0
- package/dist/IdunSoft/from/courses.js.map +1 -1
- package/dist/IdunSoft/from/events.js +1 -2
- 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 +1 -0
- 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 +1 -0
- package/dist/IdunSoft/to/schedules.js +3 -6
- package/dist/IdunSoft/to/schedules.js.map +1 -1
- package/dist/InfoMentor/to/index.d.ts +1 -0
- package/dist/InfoMentor/to/schedules.js +1 -2
- package/dist/InfoMentor/to/schedules.js.map +1 -1
- package/dist/PlanDigital/from/index.js.map +1 -1
- package/dist/PlanDigital/from/schedules.js +9 -11
- package/dist/PlanDigital/from/schedules.js.map +1 -1
- package/dist/PlanDigital/index.d.ts +1 -0
- package/dist/Quiculum/file/to/index.d.ts +1 -0
- package/dist/Quiculum/file/to/schedules.js +5 -9
- package/dist/Quiculum/file/to/schedules.js.map +1 -1
- package/dist/RS/from/division.d.ts +1 -0
- package/dist/RS/from/division.js +1 -2
- 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 +1 -0
- package/dist/RS/from/schedules.js.map +1 -1
- package/dist/RS/make-connected.d.ts +3 -1
- package/dist/RS/make-connected.js +34 -42
- 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 +4 -6
- 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 +1 -2
- package/dist/RS/to/input/default.js.map +1 -1
- package/dist/RS/to/input/dependencies.js +1 -2
- package/dist/RS/to/input/dependencies.js.map +1 -1
- package/dist/RS/to/input/dynamic-locked-times.js +1 -2
- 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 +1 -2
- package/dist/RS/to/input/individuals.js.map +1 -1
- package/dist/RS/to/input/input.js +1 -2
- package/dist/RS/to/input/input.js.map +1 -1
- package/dist/RS/to/input/intervals.js +2 -4
- package/dist/RS/to/input/intervals.js.map +1 -1
- package/dist/RS/to/input/periods.js +2 -4
- 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 +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 +2 -4
- package/dist/RS/to/input/util/parse-intervals.js.map +1 -1
- package/dist/RS/to/input/util/parse-location-references.js +1 -2
- 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 +1 -2
- 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 +1 -0
- package/dist/SS12000/from/activities.js +1 -2
- 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 +236 -201
- 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 +1 -0
- 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 +8 -12
- package/dist/SchoolSoft/api/from/schedules.js.map +1 -1
- package/dist/SchoolSoft/api/index.d.ts +1 -0
- package/dist/SchoolSoft/file/from/index.js.map +1 -1
- package/dist/SchoolSoft/file/from/schedules.js +83 -87
- package/dist/SchoolSoft/file/from/schedules.js.map +1 -1
- package/dist/SchoolSoft/file/index.d.ts +1 -0
- package/dist/SchoolSoft/file/to/index.d.ts +1 -0
- package/dist/SchoolSoft/file/to/schedules.js +1 -2
- package/dist/SchoolSoft/file/to/schedules.js.map +1 -1
- package/dist/SchoolSoft/index.d.ts +1 -0
- package/dist/Schoolity/txt/to/index.d.ts +1 -0
- package/dist/Schoolity/txt/to/schedules.js +5 -12
- package/dist/Schoolity/txt/to/schedules.js.map +1 -1
- package/dist/Skola24/mdb/from/course-and-events.js +3 -5
- 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 +1 -0
- 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 +1 -2
- 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 +31 -34
- package/dist/Skola24/txt/from/period.js.map +1 -1
- package/dist/Skola24/txt/from/schedules.d.ts +1 -0
- package/dist/Skola24/txt/from/schedules.js +6 -10
- 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 +1 -0
- package/dist/Skola24/txt/to/index.d.ts +1 -0
- package/dist/Skola24/txt/to/schedules.js +5 -12
- 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 +1 -3
- 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 +1 -0
- package/dist/core/interfaces/index.d.ts +23 -0
- package/dist/core/interfaces/other/companies.d.ts +1 -0
- package/dist/core/interfaces/other/companies.js.map +1 -1
- package/dist/core/interfaces/other/index.d.ts +6 -0
- package/dist/core/interfaces/other/operations.d.ts +1 -0
- package/dist/core/interfaces/vertices/companies.d.ts +1 -0
- package/dist/core/interfaces/vertices/configurations.d.ts +1 -0
- package/dist/core/interfaces/vertices/courses.d.ts +1 -0
- package/dist/core/interfaces/vertices/division-settings.d.ts +2 -0
- package/dist/core/interfaces/vertices/divisions.d.ts +1 -0
- package/dist/core/interfaces/vertices/events.d.ts +1 -0
- package/dist/core/interfaces/vertices/exceptions.d.ts +1 -0
- package/dist/core/interfaces/vertices/generations.d.ts +2 -0
- package/dist/core/interfaces/vertices/groups.d.ts +1 -0
- package/dist/core/interfaces/vertices/index.d.ts +1 -0
- package/dist/core/interfaces/vertices/locations.d.ts +1 -0
- package/dist/core/interfaces/vertices/locked-times.d.ts +2 -0
- package/dist/core/interfaces/vertices/overlap-groups.d.ts +1 -0
- package/dist/core/interfaces/vertices/periods.d.ts +3 -0
- package/dist/core/interfaces/vertices/persons.d.ts +1 -0
- package/dist/core/interfaces/vertices/properties/belongs-to.d.ts +1 -0
- package/dist/core/interfaces/vertices/properties/coalesced.d.ts +1 -0
- package/dist/core/interfaces/vertices/root-intervals.d.ts +2 -0
- package/dist/core/interfaces/vertices/syllabuses.d.ts +1 -0
- package/dist/core/interfaces/vertices/teachers.d.ts +1 -0
- package/dist/core/interfaces/vertices/threads.d.ts +6 -4
- package/dist/core/interfaces/vertices/users.d.ts +1 -0
- package/dist/core/interfaces/vertices/util/custom-vertex-export/index.d.ts +6 -6
- 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 -9
- package/dist/core/interfaces/vertices/util/edges.d.ts +7 -7
- package/dist/core/interfaces/vertices/util/index.d.ts +6 -0
- package/dist/core/interfaces/vertices/util/util.d.ts +20 -24
- package/dist/core/interfaces/vertices/util/vertex-query/index.d.ts +11 -11
- package/dist/core/interfaces/vertices/util/vertex.d.ts +1 -1
- package/dist/core/interfaces/vertices/vertex-query.d.ts +27 -26
- package/dist/core/interfaces/vertices/vertex-query.js.map +1 -1
- package/dist/core/to/configurations.js +1 -2
- package/dist/core/to/configurations.js.map +1 -1
- package/dist/core/to/courses.js +1 -2
- package/dist/core/to/courses.js.map +1 -1
- package/dist/core/to/division.js.map +1 -1
- package/dist/core/to/events.js +1 -2
- package/dist/core/to/events.js.map +1 -1
- package/dist/core/to/exceptions.js +1 -2
- package/dist/core/to/exceptions.js.map +1 -1
- package/dist/core/to/groups.js +1 -2
- package/dist/core/to/groups.js.map +1 -1
- package/dist/core/to/locations.js +1 -2
- package/dist/core/to/locations.js.map +1 -1
- package/dist/core/to/locked-times.js +1 -2
- package/dist/core/to/locked-times.js.map +1 -1
- package/dist/core/to/overlap-groups.js +1 -2
- package/dist/core/to/overlap-groups.js.map +1 -1
- package/dist/core/to/periods.js +1 -2
- package/dist/core/to/periods.js.map +1 -1
- package/dist/core/to/persons.js +1 -2
- package/dist/core/to/persons.js.map +1 -1
- package/dist/core/to/root-intervals.js +1 -2
- package/dist/core/to/root-intervals.js.map +1 -1
- package/dist/core/to/schedules.d.ts +1 -0
- package/dist/core/to/schedules.js.map +1 -1
- package/dist/core/to/settings.js +1 -2
- package/dist/core/to/settings.js.map +1 -1
- package/dist/core/to/syllabuses.js +1 -2
- package/dist/core/to/syllabuses.js.map +1 -1
- package/dist/core/to/teachers.js +1 -2
- package/dist/core/to/teachers.js.map +1 -1
- package/dist/core/to/util.d.ts +2 -0
- package/dist/core/to/util.js +1 -2
- package/dist/core/to/util.js.map +1 -1
- package/dist/core/types/index.d.ts +1 -0
- package/dist/core/util.js +1 -2
- package/dist/core/util.js.map +1 -1
- package/dist/identify/constants/index.js.map +1 -1
- package/dist/identify/index.js +1 -2
- 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 +2 -0
- 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 +2 -0
- 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 +3 -6
- 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 +1 -0
- package/dist/vKlass/from/schedule.js.map +1 -1
- package/dist/vKlass/to/schedules.js +6 -17
- package/dist/vKlass/to/schedules.js.map +1 -1
- package/package.json +1 -1
|
@@ -17,23 +17,21 @@ function initialConfiguration(events, lockedTimes, options) {
|
|
|
17
17
|
const fromEvents = events.map((x) => {
|
|
18
18
|
if (x.parked) return;
|
|
19
19
|
if (!x.start || !x.end) return;
|
|
20
|
-
|
|
20
|
+
return omitBy({
|
|
21
21
|
id: idOf.event(x, options),
|
|
22
22
|
...getPosition(x.start, x.end),
|
|
23
23
|
collection: x.course ? getVertexId(x.course, options) : void 0,
|
|
24
24
|
dependencies: x.inLocations?.map((x$1) => x$1 ? getVertexId(x$1, options) : null).filter((x$1) => x$1 != null)
|
|
25
|
-
};
|
|
26
|
-
return omitBy(doc, (x$1) => x$1 == null);
|
|
25
|
+
}, (x$1) => x$1 == null);
|
|
27
26
|
}).filter((x) => x != null);
|
|
28
27
|
const fromLockedTimes = lockedTimes.map((x) => {
|
|
29
28
|
if (x.type != "LUNCH") return;
|
|
30
29
|
if (!x.start || !x.end) return;
|
|
31
|
-
|
|
30
|
+
return omitBy({
|
|
32
31
|
id: idOf.lockedTime(x, options),
|
|
33
32
|
...getPosition(x.start, x.end),
|
|
34
33
|
dependencies: makeChainable(x.coalesced ?? []).chain((x$1) => x$1.filter((x$2) => x$2.toModel == "locations").map((x$2) => getVertexId(x$2.to, options)), (x$1) => uniq(x$1)).value
|
|
35
|
-
};
|
|
36
|
-
return omitBy(doc, (x$1) => x$1 == null);
|
|
34
|
+
}, (x$1) => x$1 == null);
|
|
37
35
|
}).filter((x) => x != null);
|
|
38
36
|
return [{ events: fromEvents.concat(fromLockedTimes) }];
|
|
39
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initial-configuration.js","names":["
|
|
1
|
+
{"version":3,"file":"initial-configuration.js","names":["x"],"sources":["../../../src/RS/to/initial-configuration.ts"],"sourcesContent":["import moment from 'moment';\nimport { omitBy, uniq } from 'lodash-es';\nimport type { ConnectedTypes } from '../make-connected';\nimport { idOf } from './input/util/util';\nimport { getDayIndex, getVertexId } from '../../core/util';\nimport type { DateType } from '../../common/types';\nimport type { Types } from '../types';\nimport { makeChainable } from '../../common/make-chainable';\n\nfunction getPosition (\n start: DateType,\n end: DateType\n): Pick<Types.eventConfiguration, 'day' | 'start' | 'end'> {\n const mmtMidnight = moment.utc(start).clone().startOf('day');\n return {\n day: getDayIndex(start),\n start: moment.utc(start).diff(mmtMidnight, 'minutes'),\n end: moment.utc(end ).diff(mmtMidnight, 'minutes'),\n };\n}\n\nexport function initialConfiguration (\n events: ConnectedTypes.event[],\n lockedTimes: ConnectedTypes.lockedTime[],\n options: Types.parsedToOptions\n): Types.configuration[] {\n const fromEvents = events\n .map(x => {\n if (x.parked) return;\n if (!x.start || !x.end) return;\n\n const doc: Types.eventConfiguration = {\n id: idOf.event(x, options),\n ...getPosition(x.start, x.end),\n\n collection: x.course ? getVertexId(x.course, options) : undefined,\n dependencies: x.inLocations?.map(x => x ? getVertexId(x, options) : null).filter(x => x != null),\n };\n return omitBy(doc, x => x == null) as Types.eventConfiguration;\n })\n .filter(x => x != null);\n\n const fromLockedTimes = lockedTimes\n .map(x => {\n if (x.type != 'LUNCH') return;\n if (!x.start || !x.end) return;\n\n const doc: Types.eventConfiguration = {\n id: idOf.lockedTime(x, options),\n ...getPosition(x.start, x.end),\n\n dependencies: makeChainable(x.coalesced ?? [])\n .chain(\n x => x\n .filter(x => x.toModel == 'locations')\n .map(x => getVertexId(x.to, options)),\n x => uniq(x)\n )\n .value\n };\n return omitBy(doc, x => x == null) as Types.eventConfiguration;\n })\n .filter(x => x != null);\n\n return [{\n events: fromEvents.concat(fromLockedTimes)\n }];\n};"],"mappings":";;;;;;;AASA,SAAS,YACP,OACA,KACyD;CACzD,MAAM,cAAc,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,MAAM;AAC5D,QAAO;EACL,KAAO,YAAY,MAAM;EACzB,OAAO,OAAO,IAAI,MAAM,CAAC,KAAK,aAAa,UAAU;EACrD,KAAO,OAAO,IAAI,IAAM,CAAC,KAAK,aAAa,UAAU;EACtD;;AAGH,SAAgB,qBACd,QACA,aACA,SACuB;CACvB,MAAM,aAAa,OAChB,KAAI,MAAK;AACR,MAAI,EAAE,OAAQ;AACd,MAAI,CAAC,EAAE,SAAS,CAAC,EAAE,IAAK;AASxB,SAAO,OAP+B;GACpC,IAAI,KAAK,MAAM,GAAG,QAAQ;GAC1B,GAAG,YAAY,EAAE,OAAO,EAAE,IAAI;GAE9B,YAAc,EAAE,SAAS,YAAY,EAAE,QAAQ,QAAQ,GAAG;GAC1D,cAAc,EAAE,aAAa,KAAI,QAAKA,MAAI,YAAYA,KAAG,QAAQ,GAAG,KAAK,CAAC,QAAO,QAAKA,OAAK,KAAK;GACjG,GACkB,QAAKA,OAAK,KAAK;GAClC,CACD,QAAO,MAAK,KAAK,KAAK;CAEzB,MAAM,kBAAkB,YACrB,KAAI,MAAK;AACR,MAAI,EAAE,QAAQ,QAAS;AACvB,MAAI,CAAC,EAAE,SAAS,CAAC,EAAE,IAAK;AAexB,SAAO,OAb+B;GACpC,IAAI,KAAK,WAAW,GAAG,QAAQ;GAC/B,GAAG,YAAY,EAAE,OAAO,EAAE,IAAI;GAE9B,cAAc,cAAc,EAAE,aAAa,EAAE,CAAC,CAC3C,OACC,QAAKA,IACF,QAAO,QAAKA,IAAE,WAAW,YAAY,CACrC,KAAI,QAAK,YAAYA,IAAE,IAAI,QAAQ,CAAC,GACvC,QAAK,KAAKA,IAAE,CACb,CACA;GACJ,GACkB,QAAKA,OAAK,KAAK;GAClC,CACD,QAAO,MAAK,KAAK,KAAK;AAEzB,QAAO,CAAC,EACN,QAAQ,WAAW,OAAO,gBAAgB,EAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.js","names":["doc: Types.collection & { overlapGroupId?: string }","x"],"sources":["../../../../src/RS/to/input/collections.ts"],"sourcesContent":["import { groupBy, omit, omitBy, values } from 'lodash-es';\nimport { attachLockedTimes } from './util/attach-locked-times';\nimport { parseEvents } from './events';\nimport { parseMinimumBreakLength } from './util/parse-minimum-break-length';\nimport { parseGroupReferences } from './util/parse-group-references';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { getVertexId } from '../../../core/util';\nimport { getPeriodIndex, idOf } from './util/util';\nimport { parseLocationReferences } from './util/parse-location-references';\nimport { parseDays } from './util/parse-days';\nimport { parseIntervals } from './util/parse-intervals';\nimport type { Types } from '../../types';\nimport { makeChainable } from '../../../common/make-chainable';\nimport { getDefaultInterval } from './intervals';\n\nexport function fromCollections (\n courses: ConnectedTypes.course[],\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions,\n periodsMap: Map<string | undefined, number>,\n): (Types.collection[] | Types.collection)[] {\n const defaultInterval = getDefaultInterval(settings);\n\n const collections = courses\n .map(course => {\n const id = getVertexId(course, options);\n const intervals = course.intervals ?? defaultInterval;\n\n const doc: Types.collection & { overlapGroupId?: string } = {\n id,\n\n weight: course.weight,\n density: course.density,\n maxEventLengthVariance: course.eventDurationVariance,\n potentialCenter: course.centerOfAttraction ? parseFloat(course.centerOfAttraction.replace(':', '.')) : undefined,\n distributionKey: id,\n\n events: parseEvents (course.events, settings, options, periodsMap),\n dependencies: parseLocationReferences (course.locations, options),\n groups: parseGroupReferences ({ type: 'course', item: course }, options),\n intervals: options.oldFormat\n ? parseIntervals(intervals, undefined, settings)\n : idOf.intervalPairReference(intervals, undefined, options),\n days: parseDays (course.days, settings),\n minBreakLength: parseMinimumBreakLength (course.minBreakLength),\n lockedTimes: attachLockedTimes (course.lockedTimes, options),\n period: getPeriodIndex (course.period, periodsMap, options),\n _period: course.period ? getVertexId(course.period, options) : undefined,\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n color: course.color,\n ids: course.ids,\n name: course.displayName,\n }, x => x == null);\n }\n\n // temporarily attach overlap group\n doc.overlapGroupId = course.overlapGroup\n ? getVertexId(course.overlapGroup, options)\n : undefined;\n\n return omitBy(doc, x => x == null) as Types.collection & { overlapGroupId?: string };\n });\n\n const overlapping = makeChainable(collections)\n .chain(\n x => x.filter(x => x.overlapGroupId != null),\n x => groupBy(x, x => x.overlapGroupId),\n x => values(x)\n .map(xs => xs.map(x => omit(x, 'overlapGroupId') as Types.collection))\n )\n .value;\n\n const plain = collections\n .filter(x => x.overlapGroupId == null)\n .map(x => {\n delete x.overlapGroupId; // remove overlapGroupId from individual collections\n return x as Types.collection;\n });\n\n return overlapping.concat(plain);\n};"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,gBACd,SACA,UACA,SACA,YAC2C;CAC3C,MAAM,kBAAkB,mBAAmB;
|
|
1
|
+
{"version":3,"file":"collections.js","names":["doc: Types.collection & { overlapGroupId?: string }","x"],"sources":["../../../../src/RS/to/input/collections.ts"],"sourcesContent":["import { groupBy, omit, omitBy, values } from 'lodash-es';\nimport { attachLockedTimes } from './util/attach-locked-times';\nimport { parseEvents } from './events';\nimport { parseMinimumBreakLength } from './util/parse-minimum-break-length';\nimport { parseGroupReferences } from './util/parse-group-references';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { getVertexId } from '../../../core/util';\nimport { getPeriodIndex, idOf } from './util/util';\nimport { parseLocationReferences } from './util/parse-location-references';\nimport { parseDays } from './util/parse-days';\nimport { parseIntervals } from './util/parse-intervals';\nimport type { Types } from '../../types';\nimport { makeChainable } from '../../../common/make-chainable';\nimport { getDefaultInterval } from './intervals';\n\nexport function fromCollections (\n courses: ConnectedTypes.course[],\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions,\n periodsMap: Map<string | undefined, number>,\n): (Types.collection[] | Types.collection)[] {\n const defaultInterval = getDefaultInterval(settings);\n\n const collections = courses\n .map(course => {\n const id = getVertexId(course, options);\n const intervals = course.intervals ?? defaultInterval;\n\n const doc: Types.collection & { overlapGroupId?: string } = {\n id,\n\n weight: course.weight,\n density: course.density,\n maxEventLengthVariance: course.eventDurationVariance,\n potentialCenter: course.centerOfAttraction ? parseFloat(course.centerOfAttraction.replace(':', '.')) : undefined,\n distributionKey: id,\n\n events: parseEvents (course.events, settings, options, periodsMap),\n dependencies: parseLocationReferences (course.locations, options),\n groups: parseGroupReferences ({ type: 'course', item: course }, options),\n intervals: options.oldFormat\n ? parseIntervals(intervals, undefined, settings)\n : idOf.intervalPairReference(intervals, undefined, options),\n days: parseDays (course.days, settings),\n minBreakLength: parseMinimumBreakLength (course.minBreakLength),\n lockedTimes: attachLockedTimes (course.lockedTimes, options),\n period: getPeriodIndex (course.period, periodsMap, options),\n _period: course.period ? getVertexId(course.period, options) : undefined,\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n color: course.color,\n ids: course.ids,\n name: course.displayName,\n }, x => x == null);\n }\n\n // temporarily attach overlap group\n doc.overlapGroupId = course.overlapGroup\n ? getVertexId(course.overlapGroup, options)\n : undefined;\n\n return omitBy(doc, x => x == null) as Types.collection & { overlapGroupId?: string };\n });\n\n const overlapping = makeChainable(collections)\n .chain(\n x => x.filter(x => x.overlapGroupId != null),\n x => groupBy(x, x => x.overlapGroupId),\n x => values(x)\n .map(xs => xs.map(x => omit(x, 'overlapGroupId') as Types.collection))\n )\n .value;\n\n const plain = collections\n .filter(x => x.overlapGroupId == null)\n .map(x => {\n delete x.overlapGroupId; // remove overlapGroupId from individual collections\n return x as Types.collection;\n });\n\n return overlapping.concat(plain);\n};"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,gBACd,SACA,UACA,SACA,YAC2C;CAC3C,MAAM,kBAAkB,mBAAmB,SAAS;CAEpD,MAAM,cAAc,QACjB,KAAI,WAAU;EACb,MAAM,KAAY,YAAY,QAAQ,QAAQ;EAC9C,MAAM,YAAY,OAAO,aAAa;EAEtC,MAAMA,MAAsD;GAC1D;GAEA,QAAwB,OAAO;GAC/B,SAAwB,OAAO;GAC/B,wBAAwB,OAAO;GAC/B,iBAAwB,OAAO,qBAAqB,WAAW,OAAO,mBAAmB,QAAQ,KAAK,IAAI,CAAC,GAAG;GAC9G,iBAAwB;GAExB,QAAc,YAA2B,OAAO,QAAQ,UAAU,SAAS,WAAW;GACtF,cAAc,wBAA2B,OAAO,WAAW,QAAQ;GACnE,QAAc,qBAA2B;IAAE,MAAM;IAAU,MAAM;IAAQ,EAAE,QAAQ;GACnF,WAAc,QAAQ,YAClB,eAAe,WAAW,QAAW,SAAS,GAC9C,KAAK,sBAAsB,WAAW,QAAW,QAAQ;GAC7D,MAAgB,UAA2B,OAAO,MAAM,SAAS;GACjE,gBAAgB,wBAA2B,OAAO,eAAe;GACjE,aAAgB,kBAA2B,OAAO,aAAa,QAAQ;GACvE,QAAgB,eAA2B,OAAO,QAAQ,YAAY,QAAQ;GAC9E,SAAgB,OAAO,SAAS,YAAY,OAAO,QAAQ,QAAQ,GAAG;GACvE;AAED,MAAI,QAAQ,kBACV,KAAI,OAAO,OAAO;GAChB,OAAO,OAAO;GACd,KAAO,OAAO;GACd,MAAO,OAAO;GACf,GAAE,MAAK,KAAK,KAAK;AAIpB,MAAI,iBAAiB,OAAO,eACxB,YAAY,OAAO,cAAc,QAAQ,GACzC;AAEJ,SAAO,OAAO,MAAK,MAAK,KAAK,KAAK;GAClC;CAEJ,MAAM,cAAc,cAAc,YAAY,CAC3C,OACC,MAAK,EAAE,QAAO,QAAKC,IAAE,kBAAkB,KAAK,GAC5C,MAAK,QAAQ,IAAG,QAAKA,IAAE,eAAe,GACtC,MAAK,OAAO,EAAE,CACX,KAAI,OAAM,GAAG,KAAI,QAAK,KAAKA,KAAG,iBAAiB,CAAqB,CAAC,CACzE,CACA;CAEH,MAAM,QAAQ,YACX,QAAO,MAAK,EAAE,kBAAkB,KAAK,CACrC,KAAI,MAAK;AACR,SAAO,EAAE;AACT,SAAO;GACP;AAEJ,QAAO,YAAY,OAAO,MAAM"}
|
|
@@ -8,7 +8,7 @@ import { DEFAULT_PERIOD_ID } from "./periods.js";
|
|
|
8
8
|
function parseDefault(settings, periodsMap, options) {
|
|
9
9
|
const maxNumWorkingHours = options.useMaximumScheduleSpan ? min2hrs(settings.defaultMaximumScheduleSpan?.daily) ?? false : settings.defaultMaxNumWorkingHours ?? false;
|
|
10
10
|
const maxNumDailyWorkingHours = options.useMaximumScheduleSpan ? min2hrs(settings.defaultMaximumScheduleSpan?.daily) ?? false : settings.defaultMaxNumDailyWorkingHours ?? false;
|
|
11
|
-
|
|
11
|
+
return {
|
|
12
12
|
intervals: options.oldFormat ? parseIntervals(getDefaultInterval(settings), void 0, settings) : computesDefaultIntervalId(settings, options),
|
|
13
13
|
groupMinBreakLength: settings.defaultGroupMinimumBreakLength ?? 0,
|
|
14
14
|
dependencyMinBreakLength: settings.defaultDependencyMinimumBreakLength ?? 0,
|
|
@@ -27,7 +27,6 @@ function parseDefault(settings, periodsMap, options) {
|
|
|
27
27
|
period: getPeriodIndex(settings.period ?? DEFAULT_PERIOD_ID, periodsMap, options),
|
|
28
28
|
_period: settings.period ? getVertexId(settings.period, options) : void 0
|
|
29
29
|
};
|
|
30
|
-
return res;
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default.js","names":[
|
|
1
|
+
{"version":3,"file":"default.js","names":[],"sources":["../../../../src/RS/to/input/default.ts"],"sourcesContent":["import type { Types } from '../../types';\nimport { computesDefaultIntervalId, getDefaultInterval } from './intervals';\nimport { parseIntervals } from './util/parse-intervals';\nimport { getPeriodIndex, min2hrs, toTimeFloat } from './util/util';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { DEFAULT_PERIOD_ID } from './periods';\nimport { getVertexId } from '../../../core/util';\n\nexport function parseDefault (\n settings: ConnectedTypes.divisionSettings,\n periodsMap: Map<string | undefined, number>,\n options: Types.parsedToOptions\n): Types.defaultValues {\n const maxNumWorkingHours = options.useMaximumScheduleSpan\n ? min2hrs(settings.defaultMaximumScheduleSpan?.daily) ?? false\n : settings.defaultMaxNumWorkingHours ?? false;\n\n const maxNumDailyWorkingHours = options.useMaximumScheduleSpan\n ? min2hrs(settings.defaultMaximumScheduleSpan?.daily) ?? false\n : settings.defaultMaxNumDailyWorkingHours ?? false;\n\n const res: Types.defaultValues = {\n intervals: options.oldFormat\n ? parseIntervals(getDefaultInterval(settings), undefined, settings)!\n : computesDefaultIntervalId(settings, options),\n\n groupMinBreakLength: settings.defaultGroupMinimumBreakLength ?? 0,\n dependencyMinBreakLength: settings.defaultDependencyMinimumBreakLength ?? 0,\n eventMinBreakLength: settings.defaultEventMinimumBreakLength ?? 0,\n\n potentialCenter: toTimeFloat(settings.potentialCenter ?? '12:00'),\n eventDensity: settings.defaultEventDensity ?? 0,\n\n maxEventLengthVariance: settings.defaultEventDurationVariance ?? 0,\n\n maxNumWorkingHours: maxNumWorkingHours,\n maxNumDailyWorkingHours: maxNumDailyWorkingHours,\n\n dependencyRank: settings.defaultDependencyRank ?? 0,\n groupRank: settings.defaultGroupRank ?? 0,\n dayRank: settings.defaultDayRank ?? 0,\n\n groupWeight: settings.defaultGroupWeight ?? 0,\n collectionWeight: settings.defaultCourseWeight ?? 0,\n eventWeight: settings.defaultEventWeight ?? 0,\n\n period: getPeriodIndex(settings.period ?? DEFAULT_PERIOD_ID, periodsMap, options),\n _period: settings.period ? getVertexId(settings.period, options) : undefined,\n };\n\n return res;\n};"],"mappings":";;;;;;;AAQA,SAAgB,aACd,UACA,YACA,SACqB;CACrB,MAAM,qBAAqB,QAAQ,yBAC/B,QAAQ,SAAS,4BAA4B,MAAM,IAAI,QACvD,SAAS,6BAA8C;CAE3D,MAAM,0BAA0B,QAAQ,yBACpC,QAAQ,SAAS,4BAA4B,MAAM,IAAI,QACvD,SAAS,kCAA8C;AA+B3D,QA7BiC;EAC/B,WAAW,QAAQ,YACf,eAAe,mBAAmB,SAAS,EAAE,QAAW,SAAS,GACjE,0BAA0B,UAAU,QAAQ;EAEhD,qBAA0B,SAAS,kCAAuC;EAC1E,0BAA0B,SAAS,uCAAuC;EAC1E,qBAA0B,SAAS,kCAAuC;EAE1E,iBAAiB,YAAY,SAAS,mBAAmB,QAAQ;EACjE,cAAiB,SAAS,uBAAuB;EAEjD,wBAAwB,SAAS,gCAAgC;EAExC;EACA;EAEzB,gBAAgB,SAAS,yBAAyB;EAClD,WAAgB,SAAS,oBAAyB;EAClD,SAAgB,SAAS,kBAAyB;EAElD,aAAkB,SAAS,sBAAuB;EAClD,kBAAkB,SAAS,uBAAuB;EAClD,aAAkB,SAAS,sBAAuB;EAElD,QAAS,eAAe,SAAS,UAAU,mBAAmB,YAAY,QAAQ;EAClF,SAAS,SAAS,SAAS,YAAY,SAAS,QAAQ,QAAQ,GAAG;EACpE"}
|
|
@@ -11,9 +11,8 @@ function fromLocations(locations, settings, options) {
|
|
|
11
11
|
if (includedLocations && !includedLocations.has(id)) return false;
|
|
12
12
|
return true;
|
|
13
13
|
}).map((location) => {
|
|
14
|
-
const id = getVertexId(location, options);
|
|
15
14
|
const doc = {
|
|
16
|
-
id,
|
|
15
|
+
id: getVertexId(location, options),
|
|
17
16
|
minBreakLength: location.minBreakLength,
|
|
18
17
|
days: parseDays(location.days, settings),
|
|
19
18
|
lockedTimes: attachLockedTimes(location.lockedTimes, options)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependencies.js","names":["doc: Types.dependency"],"sources":["../../../../src/RS/to/input/dependencies.ts"],"sourcesContent":["import { omitBy } from 'lodash-es';\nimport { attachLockedTimes } from './util/attach-locked-times';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { getVertexId } from '../../../core/util';\nimport { parseDays } from './util/parse-days';\nimport type { Types } from '../../types';\n\nexport function fromLocations (\n locations: ConnectedTypes.location[],\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions\n) {\n return locations\n .filter(x => {\n const id = getVertexId(x, options);\n\n // filter location references based on partial schedule options\n const includedLocations = options.partialScheduleOptions?.includedLocations;\n if (includedLocations && !includedLocations.has(id)) return false;\n return true;\n })\n .map(location => {\n const id = getVertexId(location, options);\n\n const doc: Types.dependency = {\n id,\n minBreakLength: location.minBreakLength,\n days: parseDays (location.days, settings),\n lockedTimes: attachLockedTimes(location.lockedTimes, options)\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n ids: location.ids,\n name: location.displayName\n }, x => x == null);\n }\n\n return omitBy(doc, x => x == null) as Types.dependency;\n });\n}"],"mappings":";;;;;;AAOA,SAAgB,cACd,WACA,UACA,SACA;AACA,QAAO,UACJ,QAAO,MAAK;EACX,MAAM,KAAK,YAAY,GAAG;
|
|
1
|
+
{"version":3,"file":"dependencies.js","names":["doc: Types.dependency"],"sources":["../../../../src/RS/to/input/dependencies.ts"],"sourcesContent":["import { omitBy } from 'lodash-es';\nimport { attachLockedTimes } from './util/attach-locked-times';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { getVertexId } from '../../../core/util';\nimport { parseDays } from './util/parse-days';\nimport type { Types } from '../../types';\n\nexport function fromLocations (\n locations: ConnectedTypes.location[],\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions\n) {\n return locations\n .filter(x => {\n const id = getVertexId(x, options);\n\n // filter location references based on partial schedule options\n const includedLocations = options.partialScheduleOptions?.includedLocations;\n if (includedLocations && !includedLocations.has(id)) return false;\n return true;\n })\n .map(location => {\n const id = getVertexId(location, options);\n\n const doc: Types.dependency = {\n id,\n minBreakLength: location.minBreakLength,\n days: parseDays (location.days, settings),\n lockedTimes: attachLockedTimes(location.lockedTimes, options)\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n ids: location.ids,\n name: location.displayName\n }, x => x == null);\n }\n\n return omitBy(doc, x => x == null) as Types.dependency;\n });\n}"],"mappings":";;;;;;AAOA,SAAgB,cACd,WACA,UACA,SACA;AACA,QAAO,UACJ,QAAO,MAAK;EACX,MAAM,KAAK,YAAY,GAAG,QAAQ;EAGlC,MAAM,oBAAoB,QAAQ,wBAAwB;AAC1D,MAAI,qBAAqB,CAAC,kBAAkB,IAAI,GAAG,CAAE,QAAO;AAC5D,SAAO;GACP,CACD,KAAI,aAAY;EAGf,MAAMA,MAAwB;GAC5B,IAHS,YAAY,UAAU,QAAQ;GAIvC,gBAAgB,SAAS;GACzB,MAAgB,UAA0B,SAAS,MAAM,SAAS;GAClE,aAAgB,kBAAkB,SAAS,aAAa,QAAQ;GACjE;AAED,MAAI,QAAQ,kBACV,KAAI,OAAO,OAAO;GAChB,KAAM,SAAS;GACf,MAAM,SAAS;GAChB,GAAE,MAAK,KAAK,KAAK;AAGpB,SAAO,OAAO,MAAK,MAAK,KAAK,KAAK;GAClC"}
|
|
@@ -15,8 +15,7 @@ function parse(lockedTime, settings, options, defaultInterval) {
|
|
|
15
15
|
const days = lockedTime.intervals ? makeChainable(lockedTime.intervals).chain((x) => x.map((x$1) => getDayIndex(x$1.start)), (x) => uniq(x)).value : void 0;
|
|
16
16
|
const day = days?.length == 1 ? days[0] : void 0;
|
|
17
17
|
if (day != null && lockedTime.coalesced) {
|
|
18
|
-
|
|
19
|
-
if (!allowedByEvery) return;
|
|
18
|
+
if (!lockedTime.coalesced.every((x) => !x.to.days?.length || x.to.days.some((x$1) => x$1.day == day))) return;
|
|
20
19
|
}
|
|
21
20
|
const distributionKey = lockedTime.type == "COMPLEMENTARY_TIME" ? "COMPLEMENTARY_TIME." + lockedTime.tags?.at(0)?.value : void 0;
|
|
22
21
|
const intervals = lockedTime.intervals ?? defaultInterval;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-locked-times.js","names":["x","doc: Types.event"],"sources":["../../../../src/RS/to/input/dynamic-locked-times.ts"],"sourcesContent":["import { groupBy, omitBy, uniq } from 'lodash-es';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { getDayIndex, getVertexId } from '../../../core/util';\nimport { idOf } from './util/util';\nimport { parseGroupReferences } from './util/parse-group-references';\nimport { parseIntervals } from './util/parse-intervals';\nimport type { Types } from '../../types';\nimport { makeChainable } from '../../../common/make-chainable';\nimport { toDayAndStart } from './events';\nimport { getDefaultInterval } from './intervals';\nimport type { Interval } from '../../../core/interfaces';\n\nfunction parse (\n lockedTime: ConnectedTypes.lockedTime,\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions,\n defaultInterval: Interval[]\n) {\n const duration = lockedTime.duration;\n if (!duration || duration < 5) throw new Error('(RS::To::DynamicLockedTimes) Length of a locked time is less than 5 min');\n\n const dependencyReferences = makeChainable(lockedTime.coalesced ?? [])\n .chain(\n x => x\n .filter(x => x.toModel == 'locations')\n .map(x => getVertexId(x.to, options)),\n x => uniq(x),\n x => x.map(x => [x])\n )\n .value;\n\n const days = lockedTime.intervals\n ? makeChainable(lockedTime.intervals)\n .chain(\n x => x.map(x => getDayIndex(x.start)),\n x => uniq(x),\n )\n .value\n : undefined;\n const day = days?.length == 1 ? days[0] : undefined;\n\n // ignore locked times that reside on days that are not part of any coalesced's days\n if (day != null && lockedTime.coalesced) {\n const allowedByEvery = lockedTime.coalesced.every(x => !x.to.days?.length || x.to.days.some(x => x.day == day));\n if (!allowedByEvery) return;\n }\n\n // each type (tag) of complementary hours should distribute evenly\n const distributionKey = lockedTime.type == 'COMPLEMENTARY_TIME'\n ? 'COMPLEMENTARY_TIME.' + lockedTime.tags?.at(0)?.value\n : undefined;\n\n const intervals = lockedTime.intervals ?? defaultInterval;\n\n const doc: Types.event = {\n id: idOf.lockedTime(lockedTime, options),\n length: duration,\n minBreakLength: false,\n maxLengthVariance: lockedTime.durationVariance,\n groups: parseGroupReferences({ type: 'lockedTime', item: lockedTime }, options),\n dependencies: dependencyReferences,\n intervals: options.oldFormat\n ? parseIntervals(intervals, undefined, settings)\n : idOf.intervalPairReference(intervals, undefined, options),\n distributionKey,\n ...days && { days },\n ...day && { day },\n };\n\n\n ////\n //// filter based on partialScheduleOptions\n ////\n if (options.partialScheduleOptions) {\n const { includedEvents, omittedEventsHandling } = options.partialScheduleOptions;\n if (includedEvents && !includedEvents.has(doc.id)) {\n\n if (omittedEventsHandling == 'ignore') return;\n\n if (omittedEventsHandling == 'freeze') {\n // must not be parked and have a start and duration to be frozen, otherwise it's ignored\n if (lockedTime.parked || !lockedTime.start || !lockedTime.duration) return;\n\n // fix day, start and end\n Object.assign(doc, toDayAndStart(lockedTime.start));\n doc.length = lockedTime.duration;\n doc.maxLengthVariance = 0;\n\n // override intervals and days to not cause conflicts\n const numDays = settings.numDays ?? 5;\n doc.days = Array.from({ length: numDays }, (_, i) => i);\n doc.intervals = Array.from({ length: numDays }, () => [{ beg: 0, end: 23.55 }]);\n\n // fix locations\n // > locations are always fixed for locked times\n }\n }\n }\n\n return omitBy(doc, x => x == null) as Types.event;\n}\n\nexport function fromDynamicLockedTimes (\n lockedTimes: ConnectedTypes.lockedTime[],\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions,\n): (Types.collection | Types.event)[] {\n const defaultInterval = getDefaultInterval(settings);\n\n const complementaryHours = makeChainable(lockedTimes)\n .chain(\n x => x\n .filter(x => x.type == 'COMPLEMENTARY_TIME')\n .map(x => parse(x, settings, options, defaultInterval))\n .filter(x => !!x),\n x => groupBy(x, x => [x.distributionKey].flat().toSorted().join('|')),\n x => Object.entries(x)\n .map(([id, events]) => ({ id: `COMPLEMENTARY_TIME.${id}`, events }) as Types.collection),\n )\n .value;\n\n const lunches = lockedTimes\n .filter(x => x.type == 'LUNCH')\n .map(lockedTime => parse(lockedTime, settings, options, defaultInterval))\n .filter(x => !!x);\n\n return [...complementaryHours, ...lunches];\n};"],"mappings":";;;;;;;;;;AAYA,SAAS,MACP,YACA,UACA,SACA,iBACA;CACA,MAAM,WAAW,WAAW;AAC5B,KAAI,CAAC,YAAY,WAAW,EAAG,OAAM,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"dynamic-locked-times.js","names":["x","doc: Types.event"],"sources":["../../../../src/RS/to/input/dynamic-locked-times.ts"],"sourcesContent":["import { groupBy, omitBy, uniq } from 'lodash-es';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { getDayIndex, getVertexId } from '../../../core/util';\nimport { idOf } from './util/util';\nimport { parseGroupReferences } from './util/parse-group-references';\nimport { parseIntervals } from './util/parse-intervals';\nimport type { Types } from '../../types';\nimport { makeChainable } from '../../../common/make-chainable';\nimport { toDayAndStart } from './events';\nimport { getDefaultInterval } from './intervals';\nimport type { Interval } from '../../../core/interfaces';\n\nfunction parse (\n lockedTime: ConnectedTypes.lockedTime,\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions,\n defaultInterval: Interval[]\n) {\n const duration = lockedTime.duration;\n if (!duration || duration < 5) throw new Error('(RS::To::DynamicLockedTimes) Length of a locked time is less than 5 min');\n\n const dependencyReferences = makeChainable(lockedTime.coalesced ?? [])\n .chain(\n x => x\n .filter(x => x.toModel == 'locations')\n .map(x => getVertexId(x.to, options)),\n x => uniq(x),\n x => x.map(x => [x])\n )\n .value;\n\n const days = lockedTime.intervals\n ? makeChainable(lockedTime.intervals)\n .chain(\n x => x.map(x => getDayIndex(x.start)),\n x => uniq(x),\n )\n .value\n : undefined;\n const day = days?.length == 1 ? days[0] : undefined;\n\n // ignore locked times that reside on days that are not part of any coalesced's days\n if (day != null && lockedTime.coalesced) {\n const allowedByEvery = lockedTime.coalesced.every(x => !x.to.days?.length || x.to.days.some(x => x.day == day));\n if (!allowedByEvery) return;\n }\n\n // each type (tag) of complementary hours should distribute evenly\n const distributionKey = lockedTime.type == 'COMPLEMENTARY_TIME'\n ? 'COMPLEMENTARY_TIME.' + lockedTime.tags?.at(0)?.value\n : undefined;\n\n const intervals = lockedTime.intervals ?? defaultInterval;\n\n const doc: Types.event = {\n id: idOf.lockedTime(lockedTime, options),\n length: duration,\n minBreakLength: false,\n maxLengthVariance: lockedTime.durationVariance,\n groups: parseGroupReferences({ type: 'lockedTime', item: lockedTime }, options),\n dependencies: dependencyReferences,\n intervals: options.oldFormat\n ? parseIntervals(intervals, undefined, settings)\n : idOf.intervalPairReference(intervals, undefined, options),\n distributionKey,\n ...days && { days },\n ...day && { day },\n };\n\n\n ////\n //// filter based on partialScheduleOptions\n ////\n if (options.partialScheduleOptions) {\n const { includedEvents, omittedEventsHandling } = options.partialScheduleOptions;\n if (includedEvents && !includedEvents.has(doc.id)) {\n\n if (omittedEventsHandling == 'ignore') return;\n\n if (omittedEventsHandling == 'freeze') {\n // must not be parked and have a start and duration to be frozen, otherwise it's ignored\n if (lockedTime.parked || !lockedTime.start || !lockedTime.duration) return;\n\n // fix day, start and end\n Object.assign(doc, toDayAndStart(lockedTime.start));\n doc.length = lockedTime.duration;\n doc.maxLengthVariance = 0;\n\n // override intervals and days to not cause conflicts\n const numDays = settings.numDays ?? 5;\n doc.days = Array.from({ length: numDays }, (_, i) => i);\n doc.intervals = Array.from({ length: numDays }, () => [{ beg: 0, end: 23.55 }]);\n\n // fix locations\n // > locations are always fixed for locked times\n }\n }\n }\n\n return omitBy(doc, x => x == null) as Types.event;\n}\n\nexport function fromDynamicLockedTimes (\n lockedTimes: ConnectedTypes.lockedTime[],\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions,\n): (Types.collection | Types.event)[] {\n const defaultInterval = getDefaultInterval(settings);\n\n const complementaryHours = makeChainable(lockedTimes)\n .chain(\n x => x\n .filter(x => x.type == 'COMPLEMENTARY_TIME')\n .map(x => parse(x, settings, options, defaultInterval))\n .filter(x => !!x),\n x => groupBy(x, x => [x.distributionKey].flat().toSorted().join('|')),\n x => Object.entries(x)\n .map(([id, events]) => ({ id: `COMPLEMENTARY_TIME.${id}`, events }) as Types.collection),\n )\n .value;\n\n const lunches = lockedTimes\n .filter(x => x.type == 'LUNCH')\n .map(lockedTime => parse(lockedTime, settings, options, defaultInterval))\n .filter(x => !!x);\n\n return [...complementaryHours, ...lunches];\n};"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","names":["doc: Types.event","id"],"sources":["../../../../src/RS/to/input/events.ts"],"sourcesContent":["import moment from 'moment';\nimport { omitBy } from 'lodash-es';\nimport { parseMinimumBreakLength } from './util/parse-minimum-break-length';\nimport { attachLockedTimes } from './util/attach-locked-times';\nimport type { Types } from '../../types';\nimport { parseGroupReferences } from './util/parse-group-references';\nimport { parseLocationReferences, parseSelectedLocations } from './util/parse-location-references';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { getDayIndex, getVertexId } from '../../../core/util';\nimport { getPeriodIndex, idOf } from './util/util';\nimport { parseDays } from './util/parse-days';\nimport type { DateType } from '../../../common/types';\nimport { parseIntervals } from './util/parse-intervals';\nimport { getDefaultInterval } from './intervals';\n\nexport function toDayAndStart (start: DateType) {\n return {\n start: parseFloat(moment.utc(start).format('HH.mm')),\n day: getDayIndex(start)\n };\n}\n\nexport function parseEvents (\n events: ConnectedTypes.event[] | undefined,\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions,\n periodsMap: Map<string | undefined, number>\n): Types.event[] {\n const defaultInterval = getDefaultInterval(settings);\n\n return (events ?? [])\n .map((event): Types.event | undefined => {\n const id = getVertexId(event, options);\n const intervals = event.intervals ?? event.course?.intervals ?? defaultInterval;\n\n const duration = event.preferredDuration;\n if (!duration) throw new Error(`(RS::To::Events) Event \"${id}\" has no duration`);\n\n const forcedOverlapId = event.overlapSpecies?.species?.find(({ to }) => to == event)?.id;\n\n // allow duration variance only if the event isn't linked\n const maxLengthVariance = forcedOverlapId == null\n ? event.durationVariance\n : 0;\n\n const doc: Types.event = {\n id: idOf.event(event, options),\n length: duration,\n maxLengthVariance: maxLengthVariance,\n weight: event.weight,\n density: event.density,\n potentialCenter: event.centerOfAttraction ? parseFloat(event.centerOfAttraction.replace(':', '.')) : undefined,\n forcedOverlapId: forcedOverlapId,\n period: getPeriodIndex (event.period, periodsMap, options),\n _period: event.period ? getVertexId(event.period, options) : undefined,\n days: parseDays (event.days, settings),\n dependencies: parseLocationReferences (event.locations, options),\n groups: parseGroupReferences ({ type: 'event', item: event }, options),\n intervals: options.oldFormat\n ? parseIntervals(intervals, undefined, settings)\n : idOf.intervalPairReference(intervals, undefined, options),\n lockedTimes: attachLockedTimes (event.lockedTimes, options),\n minBreakLength: parseMinimumBreakLength (event.minBreakLength),\n };\n\n // if the event has a fixed day and start\n if (event.fixedStart && event.start) {\n Object.assign(doc, toDayAndStart(event.start));\n }\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n name: event.displayName,\n ids: event.ids,\n parked: event.parked,\n visible: event.visible,\n start: event.start ? moment.utc(event.start) : undefined,\n end: event.end ? moment.utc(event.start) : undefined,\n course: event.course ? getVertexId(event.course, options) : undefined,\n inLocations: event.inLocations ? parseSelectedLocations(event, options) : undefined\n }, x => x == null);\n }\n\n ////\n //// filter events based on partialScheduleOptions\n ////\n if (options.partialScheduleOptions) {\n const { includedEvents, omittedEventsHandling } = options.partialScheduleOptions;\n if (includedEvents && !includedEvents.has(doc.id)) { // collection.id => take into account dynamic locked times too!\n\n if (omittedEventsHandling == 'ignore') return;\n\n if (omittedEventsHandling == 'freeze') {\n // must not be parked and have a start and duration to be frozen, otherwise it's ignored\n if (event.parked || !event.start || !event.duration) return;\n\n // fix day, start and end\n Object.assign(doc, toDayAndStart(event.start));\n doc.length = event.duration;\n doc.maxLengthVariance = 0;\n\n // override intervals and days to not cause conflicts\n const numDays = settings.numDays ?? 5;\n doc.days = Array.from({ length: numDays }, (_, i) => i);\n doc.intervals = Array.from({ length: numDays }, () => [{ beg: 0, end: 23.55 }]);\n\n // fix locations\n doc.dependencies = (event.inLocations ?? [])\n .filter((x): x is NonNullable<typeof x> => !!x)\n .map(x => {\n const id = getVertexId(x, options);\n\n // filter location references based on partial schedule options\n const includedLocations = options.partialScheduleOptions?.includedLocations;\n if (includedLocations && !includedLocations.has(id)) return;\n\n return [{ dependency: id }] as Types.availableDependency[];\n })\n .filter(x => x != null);\n }\n\n }\n }\n\n return omitBy(doc, x => x == null) as Types.event;\n })\n .filter((x): x is NonNullable<typeof x> => !!x);\n}"],"mappings":";;;;;;;;;;;;;AAeA,SAAgB,cAAe,OAAiB;AAC9C,QAAO;EACL,OAAO,WAAW,OAAO,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"events.js","names":["doc: Types.event","id"],"sources":["../../../../src/RS/to/input/events.ts"],"sourcesContent":["import moment from 'moment';\nimport { omitBy } from 'lodash-es';\nimport { parseMinimumBreakLength } from './util/parse-minimum-break-length';\nimport { attachLockedTimes } from './util/attach-locked-times';\nimport type { Types } from '../../types';\nimport { parseGroupReferences } from './util/parse-group-references';\nimport { parseLocationReferences, parseSelectedLocations } from './util/parse-location-references';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { getDayIndex, getVertexId } from '../../../core/util';\nimport { getPeriodIndex, idOf } from './util/util';\nimport { parseDays } from './util/parse-days';\nimport type { DateType } from '../../../common/types';\nimport { parseIntervals } from './util/parse-intervals';\nimport { getDefaultInterval } from './intervals';\n\nexport function toDayAndStart (start: DateType) {\n return {\n start: parseFloat(moment.utc(start).format('HH.mm')),\n day: getDayIndex(start)\n };\n}\n\nexport function parseEvents (\n events: ConnectedTypes.event[] | undefined,\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions,\n periodsMap: Map<string | undefined, number>\n): Types.event[] {\n const defaultInterval = getDefaultInterval(settings);\n\n return (events ?? [])\n .map((event): Types.event | undefined => {\n const id = getVertexId(event, options);\n const intervals = event.intervals ?? event.course?.intervals ?? defaultInterval;\n\n const duration = event.preferredDuration;\n if (!duration) throw new Error(`(RS::To::Events) Event \"${id}\" has no duration`);\n\n const forcedOverlapId = event.overlapSpecies?.species?.find(({ to }) => to == event)?.id;\n\n // allow duration variance only if the event isn't linked\n const maxLengthVariance = forcedOverlapId == null\n ? event.durationVariance\n : 0;\n\n const doc: Types.event = {\n id: idOf.event(event, options),\n length: duration,\n maxLengthVariance: maxLengthVariance,\n weight: event.weight,\n density: event.density,\n potentialCenter: event.centerOfAttraction ? parseFloat(event.centerOfAttraction.replace(':', '.')) : undefined,\n forcedOverlapId: forcedOverlapId,\n period: getPeriodIndex (event.period, periodsMap, options),\n _period: event.period ? getVertexId(event.period, options) : undefined,\n days: parseDays (event.days, settings),\n dependencies: parseLocationReferences (event.locations, options),\n groups: parseGroupReferences ({ type: 'event', item: event }, options),\n intervals: options.oldFormat\n ? parseIntervals(intervals, undefined, settings)\n : idOf.intervalPairReference(intervals, undefined, options),\n lockedTimes: attachLockedTimes (event.lockedTimes, options),\n minBreakLength: parseMinimumBreakLength (event.minBreakLength),\n };\n\n // if the event has a fixed day and start\n if (event.fixedStart && event.start) {\n Object.assign(doc, toDayAndStart(event.start));\n }\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n name: event.displayName,\n ids: event.ids,\n parked: event.parked,\n visible: event.visible,\n start: event.start ? moment.utc(event.start) : undefined,\n end: event.end ? moment.utc(event.start) : undefined,\n course: event.course ? getVertexId(event.course, options) : undefined,\n inLocations: event.inLocations ? parseSelectedLocations(event, options) : undefined\n }, x => x == null);\n }\n\n ////\n //// filter events based on partialScheduleOptions\n ////\n if (options.partialScheduleOptions) {\n const { includedEvents, omittedEventsHandling } = options.partialScheduleOptions;\n if (includedEvents && !includedEvents.has(doc.id)) { // collection.id => take into account dynamic locked times too!\n\n if (omittedEventsHandling == 'ignore') return;\n\n if (omittedEventsHandling == 'freeze') {\n // must not be parked and have a start and duration to be frozen, otherwise it's ignored\n if (event.parked || !event.start || !event.duration) return;\n\n // fix day, start and end\n Object.assign(doc, toDayAndStart(event.start));\n doc.length = event.duration;\n doc.maxLengthVariance = 0;\n\n // override intervals and days to not cause conflicts\n const numDays = settings.numDays ?? 5;\n doc.days = Array.from({ length: numDays }, (_, i) => i);\n doc.intervals = Array.from({ length: numDays }, () => [{ beg: 0, end: 23.55 }]);\n\n // fix locations\n doc.dependencies = (event.inLocations ?? [])\n .filter((x): x is NonNullable<typeof x> => !!x)\n .map(x => {\n const id = getVertexId(x, options);\n\n // filter location references based on partial schedule options\n const includedLocations = options.partialScheduleOptions?.includedLocations;\n if (includedLocations && !includedLocations.has(id)) return;\n\n return [{ dependency: id }] as Types.availableDependency[];\n })\n .filter(x => x != null);\n }\n\n }\n }\n\n return omitBy(doc, x => x == null) as Types.event;\n })\n .filter((x): x is NonNullable<typeof x> => !!x);\n}"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groups.js","names":["doc: Types.group"],"sources":["../../../../src/RS/to/input/groups.ts"],"sourcesContent":["import { omitBy } from 'lodash-es';\nimport type { Types } from '../../types';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { parseDays } from './util/parse-days';\nimport { attachLockedTimes } from './util/attach-locked-times';\nimport { parseMinimumBreakLength } from './util/parse-minimum-break-length';\nimport { parseMaxWorkingHours } from './util/parse-max-working-hours';\nimport { idOf } from './util/util';\nimport { parseIntervals } from './util/parse-intervals';\nimport { getDefaultInterval } from './intervals';\n\nexport function fromGroups (\n groups: ConnectedTypes.group[],\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions\n): Types.group[] {\n const defaultInterval = getDefaultInterval(settings);\n\n return groups\n .filter(group => group.species == 'class')\n .map(group => {\n const intervals = group.intervals ?? defaultInterval;\n const rootInterval = group.rootInterval ?? settings.defaultRootInterval;\n\n const doc: Types.group = {\n id: idOf.group(group, options),\n group_type: 'classes',\n weight: group.weight,\n minimizeGaps: true,\n minimizeDependencyAlternation: false,\n forbidOverlappingEvents: options.oldFormat ? group.forbidOverlappingEvents : undefined, // Deprecated in v3\n disableDayLengthPunishment: options.oldFormat ? group.disableDayLengthPunishment : undefined, // Deprecated in v3\n intervals: options.oldFormat\n ? parseIntervals(intervals, rootInterval, settings)\n : idOf.intervalPairReference(intervals, rootInterval, options),\n days: parseDays (group.days, settings),\n lockedTimes: attachLockedTimes (group.lockedTimes, options),\n minBreakLength: parseMinimumBreakLength (group.minBreakLength),\n\n ...parseMaxWorkingHours(group, options),\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n ids: group.ids,\n name: group.displayName,\n }, x => x == null);\n }\n\n return omitBy(doc, x => x == null) as Types.group;\n });\n};\n"],"mappings":";;;;;;;;;;AAWA,SAAgB,WACd,QACA,UACA,SACe;CACf,MAAM,kBAAkB,mBAAmB;
|
|
1
|
+
{"version":3,"file":"groups.js","names":["doc: Types.group"],"sources":["../../../../src/RS/to/input/groups.ts"],"sourcesContent":["import { omitBy } from 'lodash-es';\nimport type { Types } from '../../types';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { parseDays } from './util/parse-days';\nimport { attachLockedTimes } from './util/attach-locked-times';\nimport { parseMinimumBreakLength } from './util/parse-minimum-break-length';\nimport { parseMaxWorkingHours } from './util/parse-max-working-hours';\nimport { idOf } from './util/util';\nimport { parseIntervals } from './util/parse-intervals';\nimport { getDefaultInterval } from './intervals';\n\nexport function fromGroups (\n groups: ConnectedTypes.group[],\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions\n): Types.group[] {\n const defaultInterval = getDefaultInterval(settings);\n\n return groups\n .filter(group => group.species == 'class')\n .map(group => {\n const intervals = group.intervals ?? defaultInterval;\n const rootInterval = group.rootInterval ?? settings.defaultRootInterval;\n\n const doc: Types.group = {\n id: idOf.group(group, options),\n group_type: 'classes',\n weight: group.weight,\n minimizeGaps: true,\n minimizeDependencyAlternation: false,\n forbidOverlappingEvents: options.oldFormat ? group.forbidOverlappingEvents : undefined, // Deprecated in v3\n disableDayLengthPunishment: options.oldFormat ? group.disableDayLengthPunishment : undefined, // Deprecated in v3\n intervals: options.oldFormat\n ? parseIntervals(intervals, rootInterval, settings)\n : idOf.intervalPairReference(intervals, rootInterval, options),\n days: parseDays (group.days, settings),\n lockedTimes: attachLockedTimes (group.lockedTimes, options),\n minBreakLength: parseMinimumBreakLength (group.minBreakLength),\n\n ...parseMaxWorkingHours(group, options),\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n ids: group.ids,\n name: group.displayName,\n }, x => x == null);\n }\n\n return omitBy(doc, x => x == null) as Types.group;\n });\n};\n"],"mappings":";;;;;;;;;;AAWA,SAAgB,WACd,QACA,UACA,SACe;CACf,MAAM,kBAAkB,mBAAmB,SAAS;AAEpD,QAAO,OACJ,QAAO,UAAS,MAAM,WAAW,QAAQ,CACzC,KAAI,UAAS;EACZ,MAAM,YAAe,MAAM,aAAgB;EAC3C,MAAM,eAAe,MAAM,gBAAgB,SAAS;EAEpD,MAAMA,MAAmB;GACvB,IAA+B,KAAK,MAAM,OAAO,QAAQ;GACzD,YAA+B;GAC/B,QAA+B,MAAM;GACrC,cAA+B;GAC/B,+BAA+B;GAC/B,yBAA+B,QAAQ,YAAY,MAAM,0BAA0B;GACnF,4BAA+B,QAAQ,YAAY,MAAM,6BAA6B;GACtF,WAA+B,QAAQ,YACnC,eAAe,WAAW,cAAc,SAAS,GACjD,KAAK,sBAAsB,WAAW,cAAc,QAAQ;GAChE,MAAgB,UAA2B,MAAM,MAAM,SAAS;GAChE,aAAgB,kBAA2B,MAAM,aAAa,QAAQ;GACtE,gBAAgB,wBAA2B,MAAM,eAAe;GAEhE,GAAG,qBAAqB,OAAO,QAAQ;GACxC;AAED,MAAI,QAAQ,kBACV,KAAI,OAAO,OAAO;GAChB,KAAM,MAAM;GACZ,MAAM,MAAM;GACb,GAAE,MAAK,KAAK,KAAK;AAGpB,SAAO,OAAO,MAAK,MAAK,KAAK,KAAK;GAClC"}
|
|
@@ -20,10 +20,9 @@ function fromPersonsToIndividuals(persons, options) {
|
|
|
20
20
|
function fromGroupToIndividualsSet(id, reference, options) {
|
|
21
21
|
const members = new Set(reference.to.members?.map((x) => getVertexId(x, options)));
|
|
22
22
|
const excluded = new Set(reference.exclude?.map((x) => getVertexId(x, options)));
|
|
23
|
-
const remaining = members.difference(excluded);
|
|
24
23
|
const doc = {
|
|
25
24
|
id,
|
|
26
|
-
individuals: [...
|
|
25
|
+
individuals: [...members.difference(excluded)].map((x) => idOf.person(x, options))
|
|
27
26
|
};
|
|
28
27
|
if (options.includeEntityMeta) doc.meta = omitBy({ name: reference.to.displayName + (reference.exclude?.length ? ` (excl. ${reference.exclude.map((x) => x.displayName).join(", ")})` : "") }, (x) => x == null);
|
|
29
28
|
return doc;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"individuals.js","names":["doc: Types.individual","doc: Types.individualsSet","x"],"sources":["../../../../src/RS/to/input/individuals.ts"],"sourcesContent":["import { omitBy, uniqBy } from 'lodash-es';\nimport type { Types } from '../../types';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { getVertexId } from '../../../core/util';\nimport { idOf } from './util/util';\nimport { makeChainable } from '../../../common/make-chainable';\nimport type { GroupWithExclude } from '../../../core/interfaces/vertices/util/edges';\n\n\nfunction fromPersonsToIndividuals (\n persons: ConnectedTypes.person[],\n options: Types.parsedToOptions\n): Types.individual[] {\n return persons.map(person => {\n const doc: Types.individual = {\n id: idOf.person(person, options),\n group: person.group ? `groups.${ getVertexId(person.group, options) }` : undefined,\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n ids: person.ids,\n name: person.displayName,\n }, x => x == null);\n }\n\n return omitBy(doc, x => x == null) as Types.individual;\n });\n}\n\nfunction fromGroupToIndividualsSet (\n id: string,\n reference: GroupWithExclude.Util.Value<ConnectedTypes.group, ConnectedTypes.person>,\n options: Types.parsedToOptions\n): Types.individualsSet {\n const members = new Set(reference.to.members?.map(x => getVertexId(x, options)));\n const excluded = new Set(reference.exclude?.map(x => getVertexId(x, options)));\n const remaining = members.difference(excluded);\n\n const doc: Types.individualsSet = {\n id: id,\n individuals: [...remaining].map(x => idOf.person(x, options)),\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n name: reference.to.displayName + (reference.exclude?.length ? ` (excl. ${ reference.exclude.map(x => x.displayName).join(', ') })` : ''),\n }, x => x == null);\n }\n\n return doc;\n}\n\n// function fromParticipantsToIndividualsSet (\n// id: string,\n// reference: PersonReference<ConnectedTypes.person>[],\n// options: OutOptions\n// ): _IndividualsSet {\n// const idKey = getIdKey(options);\n\n// const doc: _IndividualsSet = {\n// id: id,\n// individuals: reference.map(x => getVertexId(x.to, idKey))\n// };\n\n// if (options.meta) {\n// doc.meta = omitBy({\n// name: reference.map(x => x.to.displayName).join(', '),\n// }, x => x == null);\n// }\n\n// return doc;\n// }\n\nexport function extractUniqueIndividuals (\n persons: ConnectedTypes.person[],\n courses: ConnectedTypes.course[],\n events: ConnectedTypes.event[],\n lockedTimes: ConnectedTypes.lockedTime[],\n options: Types.parsedToOptions\n): (Types.individual | Types.individualsSet)[] {\n const individuals = fromPersonsToIndividuals(persons, options);\n\n const uniqueIndividualsSetsFromGroupReferences = makeChainable([...courses, ...events, ...lockedTimes])\n .chain(\n x => x\n .map((item): GroupWithExclude.Util.Value<ConnectedTypes.group, ConnectedTypes.person>[] | undefined => {\n if ('groups' in item) return item.groups; // we may ignore the parent groups as they are all plain group references\n if ('coalesced' in item) return item.coalesced\n ?.filter(x => x.toModel == 'groups');\n return;\n })\n .flatMap(references => (references ?? [])\n .filter(x => x.to.species != 'class' || x.exclude?.length) // if plain group reference we will use the group directly\n .map(x => ({ id: idOf.groupReference(x, options), value: x }))\n ),\n x => uniqBy(x, x => x.id)\n .map(x => fromGroupToIndividualsSet(x.id, x.value, options))\n )\n .value;\n\n ////\n //// NOT NEEDED AS WE USE THE INDIVIDUALS DIRECTLY\n ////\n // const uniqueIndividualsSetsFromParticipants = chain([...courses, ...events])\n // .map(item => {\n // if ('participants' in item) return item.participants;\n // return;\n // })\n // .filter(x => x != null)\n // .filter(x => x.length > 1) // if a single participant we will use the individual directly\n // .map(x => ({ id: idOf.participantsReference(x, options), value: x }))\n // .uniqBy(x => x.id)\n // .map(x => fromParticipantsToIndividualsSet(x.id, x.value, options))\n // .value();\n\n return individuals\n .concat(uniqueIndividualsSetsFromGroupReferences);\n // .concat(uniqueIndividualsSetsFromParticipants);\n};\n"],"mappings":";;;;;;AASA,SAAS,yBACP,SACA,SACoB;AACpB,QAAO,QAAQ,KAAI,WAAU;EAC3B,MAAMA,MAAwB;GAC5B,IAAO,KAAK,OAAO,QAAQ;
|
|
1
|
+
{"version":3,"file":"individuals.js","names":["doc: Types.individual","doc: Types.individualsSet","x"],"sources":["../../../../src/RS/to/input/individuals.ts"],"sourcesContent":["import { omitBy, uniqBy } from 'lodash-es';\nimport type { Types } from '../../types';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { getVertexId } from '../../../core/util';\nimport { idOf } from './util/util';\nimport { makeChainable } from '../../../common/make-chainable';\nimport type { GroupWithExclude } from '../../../core/interfaces/vertices/util/edges';\n\n\nfunction fromPersonsToIndividuals (\n persons: ConnectedTypes.person[],\n options: Types.parsedToOptions\n): Types.individual[] {\n return persons.map(person => {\n const doc: Types.individual = {\n id: idOf.person(person, options),\n group: person.group ? `groups.${ getVertexId(person.group, options) }` : undefined,\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n ids: person.ids,\n name: person.displayName,\n }, x => x == null);\n }\n\n return omitBy(doc, x => x == null) as Types.individual;\n });\n}\n\nfunction fromGroupToIndividualsSet (\n id: string,\n reference: GroupWithExclude.Util.Value<ConnectedTypes.group, ConnectedTypes.person>,\n options: Types.parsedToOptions\n): Types.individualsSet {\n const members = new Set(reference.to.members?.map(x => getVertexId(x, options)));\n const excluded = new Set(reference.exclude?.map(x => getVertexId(x, options)));\n const remaining = members.difference(excluded);\n\n const doc: Types.individualsSet = {\n id: id,\n individuals: [...remaining].map(x => idOf.person(x, options)),\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n name: reference.to.displayName + (reference.exclude?.length ? ` (excl. ${ reference.exclude.map(x => x.displayName).join(', ') })` : ''),\n }, x => x == null);\n }\n\n return doc;\n}\n\n// function fromParticipantsToIndividualsSet (\n// id: string,\n// reference: PersonReference<ConnectedTypes.person>[],\n// options: OutOptions\n// ): _IndividualsSet {\n// const idKey = getIdKey(options);\n\n// const doc: _IndividualsSet = {\n// id: id,\n// individuals: reference.map(x => getVertexId(x.to, idKey))\n// };\n\n// if (options.meta) {\n// doc.meta = omitBy({\n// name: reference.map(x => x.to.displayName).join(', '),\n// }, x => x == null);\n// }\n\n// return doc;\n// }\n\nexport function extractUniqueIndividuals (\n persons: ConnectedTypes.person[],\n courses: ConnectedTypes.course[],\n events: ConnectedTypes.event[],\n lockedTimes: ConnectedTypes.lockedTime[],\n options: Types.parsedToOptions\n): (Types.individual | Types.individualsSet)[] {\n const individuals = fromPersonsToIndividuals(persons, options);\n\n const uniqueIndividualsSetsFromGroupReferences = makeChainable([...courses, ...events, ...lockedTimes])\n .chain(\n x => x\n .map((item): GroupWithExclude.Util.Value<ConnectedTypes.group, ConnectedTypes.person>[] | undefined => {\n if ('groups' in item) return item.groups; // we may ignore the parent groups as they are all plain group references\n if ('coalesced' in item) return item.coalesced\n ?.filter(x => x.toModel == 'groups');\n return;\n })\n .flatMap(references => (references ?? [])\n .filter(x => x.to.species != 'class' || x.exclude?.length) // if plain group reference we will use the group directly\n .map(x => ({ id: idOf.groupReference(x, options), value: x }))\n ),\n x => uniqBy(x, x => x.id)\n .map(x => fromGroupToIndividualsSet(x.id, x.value, options))\n )\n .value;\n\n ////\n //// NOT NEEDED AS WE USE THE INDIVIDUALS DIRECTLY\n ////\n // const uniqueIndividualsSetsFromParticipants = chain([...courses, ...events])\n // .map(item => {\n // if ('participants' in item) return item.participants;\n // return;\n // })\n // .filter(x => x != null)\n // .filter(x => x.length > 1) // if a single participant we will use the individual directly\n // .map(x => ({ id: idOf.participantsReference(x, options), value: x }))\n // .uniqBy(x => x.id)\n // .map(x => fromParticipantsToIndividualsSet(x.id, x.value, options))\n // .value();\n\n return individuals\n .concat(uniqueIndividualsSetsFromGroupReferences);\n // .concat(uniqueIndividualsSetsFromParticipants);\n};\n"],"mappings":";;;;;;AASA,SAAS,yBACP,SACA,SACoB;AACpB,QAAO,QAAQ,KAAI,WAAU;EAC3B,MAAMA,MAAwB;GAC5B,IAAO,KAAK,OAAO,QAAQ,QAAQ;GACnC,OAAO,OAAO,QAAQ,UAAW,YAAY,OAAO,OAAO,QAAQ,KAAM;GAC1E;AAED,MAAI,QAAQ,kBACV,KAAI,OAAO,OAAO;GAChB,KAAM,OAAO;GACb,MAAM,OAAO;GACd,GAAE,MAAK,KAAK,KAAK;AAGpB,SAAO,OAAO,MAAK,MAAK,KAAK,KAAK;GAClC;;AAGJ,SAAS,0BACP,IACA,WACA,SACsB;CACtB,MAAM,UAAY,IAAI,IAAI,UAAU,GAAG,SAAS,KAAI,MAAK,YAAY,GAAG,QAAQ,CAAC,CAAC;CAClF,MAAM,WAAY,IAAI,IAAI,UAAU,SAAS,KAAI,MAAK,YAAY,GAAG,QAAQ,CAAC,CAAC;CAG/E,MAAMC,MAA4B;EACnB;EACb,aAAa,CAAC,GAJE,QAAQ,WAAW,SAAS,CAIjB,CAAC,KAAI,MAAK,KAAK,OAAO,GAAG,QAAQ,CAAC;EAC9D;AAED,KAAI,QAAQ,kBACV,KAAI,OAAO,OAAO,EAChB,MAAM,UAAU,GAAG,eAAe,UAAU,SAAS,SAAS,WAAY,UAAU,QAAQ,KAAI,MAAK,EAAE,YAAY,CAAC,KAAK,KAAK,CAAE,KAAK,KACtI,GAAE,MAAK,KAAK,KAAK;AAGpB,QAAO;;AAwBT,SAAgB,yBACd,SACA,SACA,QACA,aACA,SAC6C;CAC7C,MAAM,cAAc,yBAAyB,SAAS,QAAQ;CAE9D,MAAM,2CAA2C,cAAc;EAAC,GAAG;EAAS,GAAG;EAAQ,GAAG;EAAY,CAAC,CACpG,OACC,MAAK,EACF,KAAK,SAAiG;AACrG,MAAI,YAAe,KAAM,QAAO,KAAK;AACrC,MAAI,eAAe,KAAM,QAAO,KAAK,WACjC,QAAO,QAAKC,IAAE,WAAW,SAAS;GAEtC,CACD,SAAQ,gBAAe,cAAc,EAAE,EACrC,QAAO,QAAKA,IAAE,GAAG,WAAW,WAAWA,IAAE,SAAS,OAAO,CACzD,KAAI,SAAM;EAAE,IAAI,KAAK,eAAeA,KAAG,QAAQ;EAAE,OAAOA;EAAG,EAAE,CAC/D,GACH,MAAK,OAAO,IAAG,QAAKA,IAAE,GAAG,CACtB,KAAI,QAAK,0BAA0BA,IAAE,IAAIA,IAAE,OAAO,QAAQ,CAAC,CAC/D,CACA;AAiBH,QAAO,YACJ,OAAO,yCAAyC"}
|
|
@@ -35,7 +35,7 @@ function parseInput(data, options = {}) {
|
|
|
35
35
|
});
|
|
36
36
|
const { map: periodsMap, matrix: periodsMatrix } = parsePeriods(_periods, _division, options);
|
|
37
37
|
const periods = periodsMatrix?.length ? periodsMatrix : void 0;
|
|
38
|
-
|
|
38
|
+
return {
|
|
39
39
|
settings: parseSettings(_settings),
|
|
40
40
|
default: parseDefault(_settings, periodsMap, options),
|
|
41
41
|
periods,
|
|
@@ -46,7 +46,6 @@ function parseInput(data, options = {}) {
|
|
|
46
46
|
individuals: options.oldFormat ? void 0 : extractUniqueIndividuals(_persons, _courses, _events, _lockedTimes, options),
|
|
47
47
|
events: [...fromCollections(_courses, _settings, options, periodsMap), ...fromDynamicLockedTimes(_lockedTimes, _settings, options)]
|
|
48
48
|
};
|
|
49
|
-
return out;
|
|
50
49
|
}
|
|
51
50
|
|
|
52
51
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","names":[
|
|
1
|
+
{"version":3,"file":"input.js","names":[],"sources":["../../../../src/RS/to/input/input.ts"],"sourcesContent":["import type { Types } from '../../types';\nimport { fromLocations } from './dependencies';\nimport { fromTeachers } from './teachers';\nimport { fromCollections } from './collections';\nimport { parseSettings } from './settings';\nimport { parseDefault } from './default';\nimport { fromDynamicLockedTimes } from './dynamic-locked-times';\nimport { parsePeriods, _parsePeriods } from './periods';\nimport type { ConnectedScheduleData } from '../../make-connected';\nimport { fromGroups } from './groups';\nimport { extractUniqueIntervals } from './intervals';\nimport { extractUniqueIndividuals } from './individuals';\n\nexport function parseInput (\n data: ConnectedScheduleData,\n options: Types.parsedToOptions = {}\n): Types.scheduleData {\n\n const _settings = data.settings;\n const _division = data.division;\n const _groups = data.groups ?? [];\n const _teachers = data.teachers ?? [];\n const _locations = data.locations ?? [];\n const _events = data.events ?? [];\n const _lockedTimes = data.lockedTimes ?? [];\n const _courses = data.courses ?? [];\n const _persons = data.persons ?? [];\n const _periods = data.periods ?? [];\n\n\n ////\n //// replace empty/null intervals with undefined\n ////\n [_groups, _teachers, /* _locations, */ _courses, _events, _lockedTimes].forEach(entities => {\n entities.forEach(entity => {\n if (entity.intervals && entity.intervals.length == 0) entity.intervals = undefined;\n else if (entity.intervals === null ) entity.intervals = undefined;\n });\n });\n\n\n const { map: periodsMap, matrix: periodsMatrix } = parsePeriods(_periods, _division, options);\n const periods = periodsMatrix?.length ? periodsMatrix : undefined; // cannot be an empty string\n\n const out: Types.scheduleData = {\n settings: parseSettings(_settings),\n default: parseDefault (_settings, periodsMap, options),\n\n periods: periods,\n _periods: _parsePeriods(_periods, _division, options),\n\n intervals: options.oldFormat ? undefined : extractUniqueIntervals(_settings, _groups, _teachers, _courses, _events, _lockedTimes, options),\n\n dependencies: fromLocations(_locations, _settings, options),\n\n groups: fromGroups(_groups, _settings, options)\n .concat(fromTeachers(_teachers, _settings, options)),\n\n individuals: options.oldFormat ? undefined : extractUniqueIndividuals(_persons, _courses, _events, _lockedTimes, options),\n\n events: [\n ...fromCollections(_courses, _settings, options, periodsMap),\n ...fromDynamicLockedTimes(_lockedTimes, _settings, options)\n ]\n };\n return out;\n};"],"mappings":";;;;;;;;;;;;AAaA,SAAgB,WACd,MACA,UAAiC,EAAE,EACf;CAEpB,MAAM,YAAe,KAAK;CAC1B,MAAM,YAAe,KAAK;CAC1B,MAAM,UAAe,KAAK,UAAe,EAAE;CAC3C,MAAM,YAAe,KAAK,YAAe,EAAE;CAC3C,MAAM,aAAe,KAAK,aAAe,EAAE;CAC3C,MAAM,UAAe,KAAK,UAAe,EAAE;CAC3C,MAAM,eAAe,KAAK,eAAe,EAAE;CAC3C,MAAM,WAAe,KAAK,WAAe,EAAE;CAC3C,MAAM,WAAe,KAAK,WAAe,EAAE;CAC3C,MAAM,WAAe,KAAK,WAAe,EAAE;AAM3C;EAAC;EAAS;EAA6B;EAAU;EAAS;EAAa,CAAC,SAAQ,aAAY;AAC1F,WAAS,SAAQ,WAAU;AACzB,OAAS,OAAO,aAAa,OAAO,UAAU,UAAU,EAAG,QAAO,YAAY;YACrE,OAAO,cAAc,KAA6B,QAAO,YAAY;IAC9E;GACF;CAGF,MAAM,EAAE,KAAK,YAAY,QAAQ,kBAAkB,aAAa,UAAU,WAAW,QAAQ;CAC7F,MAAM,UAAU,eAAe,SAAS,gBAAgB;AAuBxD,QArBgC;EAC9B,UAAU,cAAc,UAAU;EAClC,SAAU,aAAc,WAAW,YAAY,QAAQ;EAE7C;EACV,UAAU,cAAc,UAAU,WAAW,QAAQ;EAErD,WAAW,QAAQ,YAAY,SAAY,uBAAuB,WAAW,SAAS,WAAW,UAAU,SAAS,cAAc,QAAQ;EAE1I,cAAc,cAAc,YAAY,WAAW,QAAQ;EAE3D,QAAQ,WAAW,SAAS,WAAW,QAAQ,CAC5C,OAAO,aAAa,WAAW,WAAW,QAAQ,CAAC;EAEtD,aAAa,QAAQ,YAAY,SAAY,yBAAyB,UAAU,UAAU,SAAS,cAAc,QAAQ;EAEzH,QAAQ,CACN,GAAG,gBAAgB,UAAU,WAAW,SAAS,WAAW,EAC5D,GAAG,uBAAuB,cAAc,WAAW,QAAQ,CAC5D;EACF"}
|
|
@@ -43,11 +43,9 @@ function standardizeIntervals(intervals, settings) {
|
|
|
43
43
|
function toFloatIntervals(intervals) {
|
|
44
44
|
return intervals?.map((i, day) => {
|
|
45
45
|
if (!i.start || !i.end) throw new Error(`(RS::To::convertIntervals) Interval missing start or end for day ${day}: ${JSON.stringify(i)}`);
|
|
46
|
-
const start = parseFloat(parseIntervalDate(i.start).format("HH.mm"));
|
|
47
|
-
const end = parseFloat(parseIntervalDate(i.end).format("HH.mm"));
|
|
48
46
|
return {
|
|
49
|
-
beg: start,
|
|
50
|
-
end
|
|
47
|
+
beg: parseFloat(parseIntervalDate(i.start).format("HH.mm")),
|
|
48
|
+
end: parseFloat(parseIntervalDate(i.end).format("HH.mm"))
|
|
51
49
|
};
|
|
52
50
|
});
|
|
53
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intervals.js","names":["x"],"sources":["../../../../src/RS/to/input/intervals.ts"],"sourcesContent":["import moment from 'moment';\nimport { groupBy, uniqBy } from 'lodash-es';\nimport type { Types } from '../../types';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { idOf } from './util/util';\nimport { getDayIndex } from '../../../core/util';\nimport type { DateType } from '../../../common/types';\nimport { makeChainable } from '../../../common/make-chainable';\nimport type { Interval } from '../../../core/interfaces';\n\n/**\n * Parses a date input into a moment object.\n *\n * Accepts an ISO date string, a string in 'HH:mm' format, or a DateType.\n * - If the input is in 'HH:mm' format, it is parsed as a UTC time on the epoch date.\n * - Otherwise, the input is parsed as a full UTC date.\n *\n * @param date - The date input to parse.\n * @returns A moment object representing the parsed date and time.\n */\nexport function parseIntervalDate (date: string | DateType): moment.Moment {\n if (typeof date == 'string') {\n // in case of HH:mm format, parse as UTC time on epoch date\n if (/^\\d{1,2}:\\d{2}$/.test(date)) {\n return moment.utc(date, 'HH:mm');\n }\n\n // otherwise parse as full date\n return moment.utc(date);\n }\n\n return moment.utc(date);\n}\n\n/**\n * Removes the shorthand notation (a single day to represent all days)\n */\nfunction standardizeIntervals (\n intervals: Interval[] | undefined,\n settings: ConnectedTypes.divisionSettings\n): Interval[] | undefined {\n if (intervals?.length == 1) {\n const i = intervals[0];\n const start = parseIntervalDate(i.start);\n const end = parseIntervalDate(i.end );\n return Array.from({ length: settings.numDays }, () => ({ start: start.clone(), end: end.clone() }));\n }\n\n return intervals;\n}\n\n/**\n * Converts the intervals to float type intervals\n */\nfunction toFloatIntervals (\n intervals: Interval[] | undefined\n): { beg: number, end: number }[] | undefined {\n return intervals?.map((i, day: number) => {\n if (!i.start || !i.end) throw new Error(`(RS::To::convertIntervals) Interval missing start or end for day ${day}: ${JSON.stringify(i)}`);\n const start = parseFloat(parseIntervalDate(i.start).format('HH.mm'));\n const end = parseFloat(parseIntervalDate(i.end ).format('HH.mm'));\n return { beg: start, end: end };\n });\n}\n\n/**\n * Converts\n */\nfunction combineAndMapIntervals (\n _intervals: Interval[] | undefined,\n rootInterval: ConnectedTypes.rootInterval | undefined,\n settings: ConnectedTypes.divisionSettings\n): Types.interval[][] | undefined {\n const intervals = toFloatIntervals(standardizeIntervals(_intervals, settings));\n\n if (rootInterval) {\n if (!intervals) throw new Error('(RS::To::parseIntervals) no accompanying intervals for rootInterval');\n return makeChainable(rootInterval.intervals)\n .chain(\n x => groupBy(x, i => getDayIndex(i.start)),\n x => Object.entries(x)\n .map(([day, is]) => {\n const limits = intervals.at(parseInt(day));\n if (!limits) throw new Error(`(RS::To::Intervals) Day ${day} not found in dayStartAndEnds`);\n\n // remove all block intervals that lay outside the day start and end\n return is\n .map(i => ({\n beg: parseFloat(parseIntervalDate(i.start).format('HH.mm')),\n end: parseFloat(parseIntervalDate(i.end ).format('HH.mm')),\n binary: true\n } satisfies Types.interval))\n .filter(i => i.beg >= limits.beg && i.end <= limits.end);\n })\n // ensure that all days are represented, even if empty\n .reduce<Types.interval[][]>((acc, curr, index) => {\n acc[index] = curr;\n return acc;\n }, Array.from({ length: settings.numDays }, () => []))\n )\n .value;\n }\n if (intervals) {\n return intervals.map(i => [i]);\n }\n return;\n};\n\n/**\n * extracts the default interval given the division settings\n */\nexport function getDefaultInterval (settings: ConnectedTypes.divisionSettings): Interval[] {\n const { dayStart, dayEnd } = settings;\n if (!dayStart) throw new Error('(RS::To::getDefaultInterval) \"settings.dayStart\" is falsy');\n if (!dayEnd ) throw new Error('(RS::To::getDefaultInterval) \"settings.dayEnd\" is falsy');\n return [{ start: dayStart, end: dayEnd }];\n}\n\n/**\n * Computes the default interval id given the division settings\n */\nexport function computesDefaultIntervalId (\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions\n): string {\n return idOf.intervalPairReference(getDefaultInterval(settings), undefined, options);\n}\n\n/**\n * Extracts all unique intervals and interval-root interval pairs used by the provided entities\n */\nexport function extractUniqueIntervals (\n settings: ConnectedTypes.divisionSettings,\n groups: ConnectedTypes.group[],\n teachers: ConnectedTypes.teacher[],\n courses: ConnectedTypes.course[],\n events: ConnectedTypes.event[],\n lockedTimes: ConnectedTypes.lockedTime[],\n options: Types.parsedToOptions\n): Types.rootInterval[] {\n const defaultInterval = getDefaultInterval(settings);\n\n type InheritedWithId = { id: string, data: [Interval<DateType>[] | undefined, ConnectedTypes.rootInterval | undefined] };\n\n const withRootIntervals = [...groups, ...teachers]\n .map((item): InheritedWithId => {\n const intervals = item.intervals ?? defaultInterval;\n const rootInterval = item.rootInterval ?? settings.defaultRootInterval;\n\n return {\n id: idOf.intervalPairReference(intervals, rootInterval, options),\n data: [intervals, rootInterval]\n };\n });\n\n const withoutRootIntervals = [{ intervals: defaultInterval }, ...courses, ...events, ...lockedTimes]\n .map((item): InheritedWithId => {\n const interval = item.intervals ?? ('course' in item ? item.course?.intervals : undefined) ?? defaultInterval;\n\n return {\n id: idOf.intervalPairReference(interval, undefined, options),\n data: [interval, undefined]\n };\n });\n\n return makeChainable(withRootIntervals)\n .chain(\n x => x.concat(withoutRootIntervals),\n x => uniqBy(x, x => x.id),\n x => x\n .map(({ id, data: [_intervals, rootInterval] }) => {\n // compute the corresponding root interval for each interval pair\n const value = combineAndMapIntervals(_intervals, rootInterval, settings);\n if (!value) return;\n return { id, value } as Required<Types.rootInterval>;\n })\n .filter(x => x != null)\n )\n .value;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAoBA,SAAgB,kBAAmB,MAAwC;AACzE,KAAI,OAAO,QAAQ,UAAU;AAE3B,MAAI,kBAAkB,KAAK,
|
|
1
|
+
{"version":3,"file":"intervals.js","names":["x"],"sources":["../../../../src/RS/to/input/intervals.ts"],"sourcesContent":["import moment from 'moment';\nimport { groupBy, uniqBy } from 'lodash-es';\nimport type { Types } from '../../types';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { idOf } from './util/util';\nimport { getDayIndex } from '../../../core/util';\nimport type { DateType } from '../../../common/types';\nimport { makeChainable } from '../../../common/make-chainable';\nimport type { Interval } from '../../../core/interfaces';\n\n/**\n * Parses a date input into a moment object.\n *\n * Accepts an ISO date string, a string in 'HH:mm' format, or a DateType.\n * - If the input is in 'HH:mm' format, it is parsed as a UTC time on the epoch date.\n * - Otherwise, the input is parsed as a full UTC date.\n *\n * @param date - The date input to parse.\n * @returns A moment object representing the parsed date and time.\n */\nexport function parseIntervalDate (date: string | DateType): moment.Moment {\n if (typeof date == 'string') {\n // in case of HH:mm format, parse as UTC time on epoch date\n if (/^\\d{1,2}:\\d{2}$/.test(date)) {\n return moment.utc(date, 'HH:mm');\n }\n\n // otherwise parse as full date\n return moment.utc(date);\n }\n\n return moment.utc(date);\n}\n\n/**\n * Removes the shorthand notation (a single day to represent all days)\n */\nfunction standardizeIntervals (\n intervals: Interval[] | undefined,\n settings: ConnectedTypes.divisionSettings\n): Interval[] | undefined {\n if (intervals?.length == 1) {\n const i = intervals[0];\n const start = parseIntervalDate(i.start);\n const end = parseIntervalDate(i.end );\n return Array.from({ length: settings.numDays }, () => ({ start: start.clone(), end: end.clone() }));\n }\n\n return intervals;\n}\n\n/**\n * Converts the intervals to float type intervals\n */\nfunction toFloatIntervals (\n intervals: Interval[] | undefined\n): { beg: number, end: number }[] | undefined {\n return intervals?.map((i, day: number) => {\n if (!i.start || !i.end) throw new Error(`(RS::To::convertIntervals) Interval missing start or end for day ${day}: ${JSON.stringify(i)}`);\n const start = parseFloat(parseIntervalDate(i.start).format('HH.mm'));\n const end = parseFloat(parseIntervalDate(i.end ).format('HH.mm'));\n return { beg: start, end: end };\n });\n}\n\n/**\n * Converts\n */\nfunction combineAndMapIntervals (\n _intervals: Interval[] | undefined,\n rootInterval: ConnectedTypes.rootInterval | undefined,\n settings: ConnectedTypes.divisionSettings\n): Types.interval[][] | undefined {\n const intervals = toFloatIntervals(standardizeIntervals(_intervals, settings));\n\n if (rootInterval) {\n if (!intervals) throw new Error('(RS::To::parseIntervals) no accompanying intervals for rootInterval');\n return makeChainable(rootInterval.intervals)\n .chain(\n x => groupBy(x, i => getDayIndex(i.start)),\n x => Object.entries(x)\n .map(([day, is]) => {\n const limits = intervals.at(parseInt(day));\n if (!limits) throw new Error(`(RS::To::Intervals) Day ${day} not found in dayStartAndEnds`);\n\n // remove all block intervals that lay outside the day start and end\n return is\n .map(i => ({\n beg: parseFloat(parseIntervalDate(i.start).format('HH.mm')),\n end: parseFloat(parseIntervalDate(i.end ).format('HH.mm')),\n binary: true\n } satisfies Types.interval))\n .filter(i => i.beg >= limits.beg && i.end <= limits.end);\n })\n // ensure that all days are represented, even if empty\n .reduce<Types.interval[][]>((acc, curr, index) => {\n acc[index] = curr;\n return acc;\n }, Array.from({ length: settings.numDays }, () => []))\n )\n .value;\n }\n if (intervals) {\n return intervals.map(i => [i]);\n }\n return;\n};\n\n/**\n * extracts the default interval given the division settings\n */\nexport function getDefaultInterval (settings: ConnectedTypes.divisionSettings): Interval[] {\n const { dayStart, dayEnd } = settings;\n if (!dayStart) throw new Error('(RS::To::getDefaultInterval) \"settings.dayStart\" is falsy');\n if (!dayEnd ) throw new Error('(RS::To::getDefaultInterval) \"settings.dayEnd\" is falsy');\n return [{ start: dayStart, end: dayEnd }];\n}\n\n/**\n * Computes the default interval id given the division settings\n */\nexport function computesDefaultIntervalId (\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions\n): string {\n return idOf.intervalPairReference(getDefaultInterval(settings), undefined, options);\n}\n\n/**\n * Extracts all unique intervals and interval-root interval pairs used by the provided entities\n */\nexport function extractUniqueIntervals (\n settings: ConnectedTypes.divisionSettings,\n groups: ConnectedTypes.group[],\n teachers: ConnectedTypes.teacher[],\n courses: ConnectedTypes.course[],\n events: ConnectedTypes.event[],\n lockedTimes: ConnectedTypes.lockedTime[],\n options: Types.parsedToOptions\n): Types.rootInterval[] {\n const defaultInterval = getDefaultInterval(settings);\n\n type InheritedWithId = { id: string, data: [Interval<DateType>[] | undefined, ConnectedTypes.rootInterval | undefined] };\n\n const withRootIntervals = [...groups, ...teachers]\n .map((item): InheritedWithId => {\n const intervals = item.intervals ?? defaultInterval;\n const rootInterval = item.rootInterval ?? settings.defaultRootInterval;\n\n return {\n id: idOf.intervalPairReference(intervals, rootInterval, options),\n data: [intervals, rootInterval]\n };\n });\n\n const withoutRootIntervals = [{ intervals: defaultInterval }, ...courses, ...events, ...lockedTimes]\n .map((item): InheritedWithId => {\n const interval = item.intervals ?? ('course' in item ? item.course?.intervals : undefined) ?? defaultInterval;\n\n return {\n id: idOf.intervalPairReference(interval, undefined, options),\n data: [interval, undefined]\n };\n });\n\n return makeChainable(withRootIntervals)\n .chain(\n x => x.concat(withoutRootIntervals),\n x => uniqBy(x, x => x.id),\n x => x\n .map(({ id, data: [_intervals, rootInterval] }) => {\n // compute the corresponding root interval for each interval pair\n const value = combineAndMapIntervals(_intervals, rootInterval, settings);\n if (!value) return;\n return { id, value } as Required<Types.rootInterval>;\n })\n .filter(x => x != null)\n )\n .value;\n};\n"],"mappings":"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"}
|
|
@@ -36,9 +36,8 @@ function parsePeriods(periods, division, options) {
|
|
|
36
36
|
}))).value;
|
|
37
37
|
const matrix = grouped.map((x) => grouped.map((y) => range.overlaps(x.ranges, y.ranges) ? "1" : "0").join("")).join("");
|
|
38
38
|
if (matrix == "" || matrix == "0") throw new Error("(RS::To::parsePeriods) invalid matrix value: " + matrix);
|
|
39
|
-
const indexMap = new Map(grouped.flatMap((xs) => xs.ids.map((id) => [id, xs.index])));
|
|
40
39
|
return {
|
|
41
|
-
map:
|
|
40
|
+
map: new Map(grouped.flatMap((xs) => xs.ids.map((id) => [id, xs.index]))),
|
|
42
41
|
matrix
|
|
43
42
|
};
|
|
44
43
|
}
|
|
@@ -60,11 +59,10 @@ function _parsePeriods(periods, division, options) {
|
|
|
60
59
|
}
|
|
61
60
|
});
|
|
62
61
|
const weeks = Array.from(activeWeeksMap.entries()).sort((a, b) => moment.utc(a[0]).diff(moment.utc(b[0]))).map((x) => x[1] ? "1" : "0").join("");
|
|
63
|
-
const overlaps = weeks.length <= 64 ? weeks : "";
|
|
64
62
|
return {
|
|
65
63
|
id,
|
|
66
64
|
weeks,
|
|
67
|
-
overlaps
|
|
65
|
+
overlaps: weeks.length <= 64 ? weeks : ""
|
|
68
66
|
};
|
|
69
67
|
});
|
|
70
68
|
if (weeksMap.size > 64 && out && out.length <= 64) for (let i = 0; i < out.length; i++) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"periods.js","names":["x"],"sources":["../../../../src/RS/to/input/periods.ts"],"sourcesContent":["import { groupBy } from 'lodash-es';\nimport moment from 'moment';\nimport { getIdKey, getVertexId } from '../../../core/util';\nimport type { ConnectedTypes } from '../../make-connected';\nimport type { Types } from '../../types';\nimport { range } from '../../../common/functions';\nimport { makeChainable } from '../../../common/make-chainable';\nimport type { Interval } from '../../../core/interfaces';\n\ntype Range = Partial<Interval<string | moment.Moment | Date>>;\ntype DateRange = Interval<moment.Moment>;\n\nfunction createRange ({ start, end }: Range): DateRange {\n return {\n start: moment.utc(start).clone().startOf('isoWeek'),\n end: moment.utc(end ).clone().endOf ('isoWeek')\n };\n}\n\ntype Out = {\n map: Map<string | undefined, number>,\n matrix?: string\n};\n\n/**\n * Used by the default values as the id if no period is specified.\n */\nexport const DEFAULT_PERIOD_ID = 'DEFAULT_PERIOD';\n\nexport function parsePeriods (\n periods: ConnectedTypes.period[] | undefined,\n division: ConnectedTypes.division,\n options: Types.parsedToOptions\n): Out {\n const idKey = getIdKey(options);\n\n // if empty periods are given, return empty map only\n if (!periods?.length) {\n return { map: new Map<string | undefined, number>() };\n }\n\n // convert the ranges to moment ranges\n const parsedPeriods = periods.map(x => ({ id: getVertexId(x, idKey) as string | undefined, ranges: x.ranges.map(r => createRange(r)) }));\n\n // add default period that includes all weeks\n parsedPeriods.push({ id: DEFAULT_PERIOD_ID, ranges: [createRange(division)] });\n\n // Compute a pairwise binary overlapping string for each periods and group those that have identical such string.\n // The latter so that the number of periods may be reduced by omitting periods that overlap identically\n const grouped = makeChainable(parsedPeriods)\n .chain(\n x => x\n .map(x => ({\n ...x,\n overlap: parsedPeriods.map(y => range.overlaps(x.ranges, y.ranges) ? '1' : '0').join('')\n })),\n x => groupBy(x, x => x.overlap),\n x => Object.values(x)\n .map((x, i) => ({ ids: x.map(x => x.id), index: i, ranges: x[0].ranges }))\n )\n .value;\n\n // Merge the pairwise binary overlapping string and store it as a matrix string.\n const matrix = grouped\n .map(x => grouped\n .map(y => range.overlaps(x.ranges, y.ranges) ? '1' : '0')\n .join('')\n )\n .join('');\n\n if (matrix == '' || matrix == '0') {\n throw new Error('(RS::To::parsePeriods) invalid matrix value: ' + matrix);\n }\n\n // Also store in a map what period id corresponds to which row in the matrix.\n const indexMap = new Map(\n grouped.flatMap(xs => xs.ids.map(id => ([id, xs.index]) as const))\n );\n\n return { map: indexMap, matrix };\n}\n\n\nexport function _parsePeriods (\n periods: ConnectedTypes.period[] | undefined,\n division: ConnectedTypes.division,\n options: Types.parsedToOptions\n): Types.period[] | undefined {\n const divisionRange = createRange(division);\n\n // build a mapping of week starts to boolean active flags\n const weeksMap = new Map<string, boolean>();\n for (const x = divisionRange.start.clone(); x.isSameOrBefore(divisionRange.end); x.add(1, 'week')) {\n weeksMap.set(x.toISOString(), false);\n }\n\n const out = periods?.map((p): Types.period => {\n const id = getVertexId(p, options);\n\n // preserve only the ranges that lay within the division range\n const clippedRanges = p.ranges\n .map(r => createRange(r))\n .filter(r => range.overlaps(r, divisionRange))\n .map(r => ({\n start: moment.max(r.start, divisionRange.start).clone(),\n end: moment.min(r.end, divisionRange.end ).clone()\n }));\n\n // get the active weeks by checking which weeks in the division are covered by the clipped ranges\n const activeWeeksMap = new Map(weeksMap);\n clippedRanges.forEach(r => {\n for (const x = r.start.clone(); x.isSameOrBefore(r.end); x.add(1, 'week')) {\n const key = x.toISOString();\n activeWeeksMap.set(key, true);\n }\n });\n\n // build the active weeks string\n const weeks = Array.from(activeWeeksMap.entries())\n .sort((a, b) => moment.utc(a[0]).diff(moment.utc(b[0])))\n .map(x => x[1] ? '1' : '0')\n .join('');\n\n const overlaps = weeks.length <= 64 ? weeks : '';\n\n return { id, weeks, overlaps };\n });\n\n // If there are more than 64 weeks but less than or equal to 64 periods, we compute the overlap between periods directly.\n if (weeksMap.size > 64 && out && out.length <= 64) {\n for (let i = 0; i < out.length; i++) {\n let overlaps = '';\n for (let j = 0; j < out.length; j++) {\n // self-overlap\n if (i == j) {\n overlaps += '1';\n continue;\n }\n\n // overlap with other periods\n let overlap = false;\n for (let k = 0; k < out[i].weeks.length; k++) {\n if (out[i].weeks[k] === '1' && out[j].weeks[k] === '1') {\n overlap = true;\n break;\n }\n }\n overlaps += overlap ? '1' : '0';\n }\n out[i].overlaps = overlaps;\n }\n }\n\n return out;\n}"],"mappings":";;;;;;;AAYA,SAAS,YAAa,EAAE,OAAO,OAAyB;AACtD,QAAO;EACL,OAAO,OAAO,IAAI,OAAO,QAAQ,
|
|
1
|
+
{"version":3,"file":"periods.js","names":["x"],"sources":["../../../../src/RS/to/input/periods.ts"],"sourcesContent":["import { groupBy } from 'lodash-es';\nimport moment from 'moment';\nimport { getIdKey, getVertexId } from '../../../core/util';\nimport type { ConnectedTypes } from '../../make-connected';\nimport type { Types } from '../../types';\nimport { range } from '../../../common/functions';\nimport { makeChainable } from '../../../common/make-chainable';\nimport type { Interval } from '../../../core/interfaces';\n\ntype Range = Partial<Interval<string | moment.Moment | Date>>;\ntype DateRange = Interval<moment.Moment>;\n\nfunction createRange ({ start, end }: Range): DateRange {\n return {\n start: moment.utc(start).clone().startOf('isoWeek'),\n end: moment.utc(end ).clone().endOf ('isoWeek')\n };\n}\n\ntype Out = {\n map: Map<string | undefined, number>,\n matrix?: string\n};\n\n/**\n * Used by the default values as the id if no period is specified.\n */\nexport const DEFAULT_PERIOD_ID = 'DEFAULT_PERIOD';\n\nexport function parsePeriods (\n periods: ConnectedTypes.period[] | undefined,\n division: ConnectedTypes.division,\n options: Types.parsedToOptions\n): Out {\n const idKey = getIdKey(options);\n\n // if empty periods are given, return empty map only\n if (!periods?.length) {\n return { map: new Map<string | undefined, number>() };\n }\n\n // convert the ranges to moment ranges\n const parsedPeriods = periods.map(x => ({ id: getVertexId(x, idKey) as string | undefined, ranges: x.ranges.map(r => createRange(r)) }));\n\n // add default period that includes all weeks\n parsedPeriods.push({ id: DEFAULT_PERIOD_ID, ranges: [createRange(division)] });\n\n // Compute a pairwise binary overlapping string for each periods and group those that have identical such string.\n // The latter so that the number of periods may be reduced by omitting periods that overlap identically\n const grouped = makeChainable(parsedPeriods)\n .chain(\n x => x\n .map(x => ({\n ...x,\n overlap: parsedPeriods.map(y => range.overlaps(x.ranges, y.ranges) ? '1' : '0').join('')\n })),\n x => groupBy(x, x => x.overlap),\n x => Object.values(x)\n .map((x, i) => ({ ids: x.map(x => x.id), index: i, ranges: x[0].ranges }))\n )\n .value;\n\n // Merge the pairwise binary overlapping string and store it as a matrix string.\n const matrix = grouped\n .map(x => grouped\n .map(y => range.overlaps(x.ranges, y.ranges) ? '1' : '0')\n .join('')\n )\n .join('');\n\n if (matrix == '' || matrix == '0') {\n throw new Error('(RS::To::parsePeriods) invalid matrix value: ' + matrix);\n }\n\n // Also store in a map what period id corresponds to which row in the matrix.\n const indexMap = new Map(\n grouped.flatMap(xs => xs.ids.map(id => ([id, xs.index]) as const))\n );\n\n return { map: indexMap, matrix };\n}\n\n\nexport function _parsePeriods (\n periods: ConnectedTypes.period[] | undefined,\n division: ConnectedTypes.division,\n options: Types.parsedToOptions\n): Types.period[] | undefined {\n const divisionRange = createRange(division);\n\n // build a mapping of week starts to boolean active flags\n const weeksMap = new Map<string, boolean>();\n for (const x = divisionRange.start.clone(); x.isSameOrBefore(divisionRange.end); x.add(1, 'week')) {\n weeksMap.set(x.toISOString(), false);\n }\n\n const out = periods?.map((p): Types.period => {\n const id = getVertexId(p, options);\n\n // preserve only the ranges that lay within the division range\n const clippedRanges = p.ranges\n .map(r => createRange(r))\n .filter(r => range.overlaps(r, divisionRange))\n .map(r => ({\n start: moment.max(r.start, divisionRange.start).clone(),\n end: moment.min(r.end, divisionRange.end ).clone()\n }));\n\n // get the active weeks by checking which weeks in the division are covered by the clipped ranges\n const activeWeeksMap = new Map(weeksMap);\n clippedRanges.forEach(r => {\n for (const x = r.start.clone(); x.isSameOrBefore(r.end); x.add(1, 'week')) {\n const key = x.toISOString();\n activeWeeksMap.set(key, true);\n }\n });\n\n // build the active weeks string\n const weeks = Array.from(activeWeeksMap.entries())\n .sort((a, b) => moment.utc(a[0]).diff(moment.utc(b[0])))\n .map(x => x[1] ? '1' : '0')\n .join('');\n\n const overlaps = weeks.length <= 64 ? weeks : '';\n\n return { id, weeks, overlaps };\n });\n\n // If there are more than 64 weeks but less than or equal to 64 periods, we compute the overlap between periods directly.\n if (weeksMap.size > 64 && out && out.length <= 64) {\n for (let i = 0; i < out.length; i++) {\n let overlaps = '';\n for (let j = 0; j < out.length; j++) {\n // self-overlap\n if (i == j) {\n overlaps += '1';\n continue;\n }\n\n // overlap with other periods\n let overlap = false;\n for (let k = 0; k < out[i].weeks.length; k++) {\n if (out[i].weeks[k] === '1' && out[j].weeks[k] === '1') {\n overlap = true;\n break;\n }\n }\n overlaps += overlap ? '1' : '0';\n }\n out[i].overlaps = overlaps;\n }\n }\n\n return out;\n}"],"mappings":";;;;;;;AAYA,SAAS,YAAa,EAAE,OAAO,OAAyB;AACtD,QAAO;EACL,OAAO,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,UAAU;EACnD,KAAO,OAAO,IAAI,IAAM,CAAC,OAAO,CAAC,MAAQ,UAAU;EACpD;;;;;AAWH,MAAa,oBAAoB;AAEjC,SAAgB,aACd,SACA,UACA,SACK;CACL,MAAM,QAAQ,SAAS,QAAQ;AAG/B,KAAI,CAAC,SAAS,OACZ,QAAO,EAAE,qBAAK,IAAI,KAAiC,EAAE;CAIvD,MAAM,gBAAgB,QAAQ,KAAI,OAAM;EAAE,IAAI,YAAY,GAAG,MAAM;EAAwB,QAAQ,EAAE,OAAO,KAAI,MAAK,YAAY,EAAE,CAAC;EAAE,EAAE;AAGxI,eAAc,KAAK;EAAE,IAAI;EAAmB,QAAQ,CAAC,YAAY,SAAS,CAAC;EAAE,CAAC;CAI9E,MAAM,UAAU,cAAc,cAAc,CACzC,OACC,MAAK,EACF,KAAI,SAAM;EACT,GAAGA;EACH,SAAS,cAAc,KAAI,MAAK,MAAM,SAASA,IAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,GAAG;EACzF,EAAE,GACL,MAAK,QAAQ,IAAG,QAAKA,IAAE,QAAQ,GAC/B,MAAK,OAAO,OAAO,EAAE,CAClB,KAAK,KAAG,OAAO;EAAE,KAAKA,IAAE,KAAI,QAAKA,IAAE,GAAG;EAAE,OAAO;EAAI,QAAQA,IAAE,GAAG;EAAQ,EAAE,CAC9E,CACA;CAGH,MAAM,SAAS,QACZ,KAAI,MAAK,QACP,KAAI,MAAK,MAAM,SAAS,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,IAAI,CACxD,KAAK,GAAG,CACV,CACA,KAAK,GAAG;AAEX,KAAI,UAAU,MAAM,UAAU,IAC5B,OAAM,IAAI,MAAM,kDAAkD,OAAO;AAQ3E,QAAO;EAAE,KAJQ,IAAI,IACnB,QAAQ,SAAQ,OAAM,GAAG,IAAI,KAAI,OAAO,CAAC,IAAI,GAAG,MAAM,CAAW,CAAC,CACnE;EAEuB;EAAQ;;AAIlC,SAAgB,cACd,SACA,UACA,SAC4B;CAC5B,MAAM,gBAAgB,YAAY,SAAS;CAG3C,MAAM,2BAAW,IAAI,KAAsB;AAC3C,MAAK,MAAM,IAAI,cAAc,MAAM,OAAO,EAAE,EAAE,eAAe,cAAc,IAAI,EAAE,EAAE,IAAI,GAAG,OAAO,CAC/F,UAAS,IAAI,EAAE,aAAa,EAAE,MAAM;CAGtC,MAAM,MAAM,SAAS,KAAK,MAAoB;EAC5C,MAAM,KAAK,YAAY,GAAG,QAAQ;EAGlC,MAAM,gBAAgB,EAAE,OACrB,KAAI,MAAK,YAAY,EAAE,CAAC,CACxB,QAAO,MAAK,MAAM,SAAS,GAAG,cAAc,CAAC,CAC7C,KAAI,OAAM;GACT,OAAO,OAAO,IAAI,EAAE,OAAO,cAAc,MAAM,CAAC,OAAO;GACvD,KAAO,OAAO,IAAI,EAAE,KAAO,cAAc,IAAM,CAAC,OAAO;GACxD,EAAE;EAGL,MAAM,iBAAiB,IAAI,IAAI,SAAS;AACxC,gBAAc,SAAQ,MAAK;AACzB,QAAK,MAAM,IAAI,EAAE,MAAM,OAAO,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,IAAI,GAAG,OAAO,EAAE;IACzE,MAAM,MAAM,EAAE,aAAa;AAC3B,mBAAe,IAAI,KAAK,KAAK;;IAE/B;EAGF,MAAM,QAAQ,MAAM,KAAK,eAAe,SAAS,CAAC,CAC/C,MAAM,GAAG,MAAM,OAAO,IAAI,EAAE,GAAG,CAAC,KAAK,OAAO,IAAI,EAAE,GAAG,CAAC,CAAC,CACvD,KAAI,MAAK,EAAE,KAAK,MAAM,IAAI,CAC1B,KAAK,GAAG;AAIX,SAAO;GAAE;GAAI;GAAO,UAFH,MAAM,UAAU,KAAK,QAAQ;GAEhB;GAC9B;AAGF,KAAI,SAAS,OAAO,MAAM,OAAO,IAAI,UAAU,GAC7C,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;EACnC,IAAI,WAAW;AACf,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AAEnC,OAAI,KAAK,GAAG;AACV,gBAAY;AACZ;;GAIF,IAAI,UAAU;AACd,QAAK,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,MAAM,QAAQ,IACvC,KAAI,IAAI,GAAG,MAAM,OAAO,OAAO,IAAI,GAAG,MAAM,OAAO,KAAK;AACtD,cAAU;AACV;;AAGJ,eAAY,UAAU,MAAM;;AAE9B,MAAI,GAAG,WAAW;;AAItB,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","names":[],"sources":["../../../../src/RS/to/input/settings.ts"],"sourcesContent":["import type { Types } from '../../types';\nimport type { ConnectedTypes } from '../../make-connected';\n\nexport function parseSettings (settings: ConnectedTypes.divisionSettings): Types.settings {\n\n if (!settings.numDays) throw new Error('(RS::To::parseSettings) numDays is falsy');\n if (!settings.discretization) throw new Error('(RS::To::parseSettings) discretization is falsy');\n\n return {\n numDays: settings.numDays,\n discretization: settings.discretization,\n\n periodIdKey: 'id',\n intervalIdKey: 'id',\n dependencyIdKey: 'id',\n groupIdKey: 'id',\n individualIdKey: 'id',\n collectionIdKey: 'id',\n eventIdKey: 'id',\n };\n};"],"mappings":";AAGA,SAAgB,cAAe,UAA2D;AAExF,KAAI,CAAC,SAAS,QAAgB,OAAM,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"settings.js","names":[],"sources":["../../../../src/RS/to/input/settings.ts"],"sourcesContent":["import type { Types } from '../../types';\nimport type { ConnectedTypes } from '../../make-connected';\n\nexport function parseSettings (settings: ConnectedTypes.divisionSettings): Types.settings {\n\n if (!settings.numDays) throw new Error('(RS::To::parseSettings) numDays is falsy');\n if (!settings.discretization) throw new Error('(RS::To::parseSettings) discretization is falsy');\n\n return {\n numDays: settings.numDays,\n discretization: settings.discretization,\n\n periodIdKey: 'id',\n intervalIdKey: 'id',\n dependencyIdKey: 'id',\n groupIdKey: 'id',\n individualIdKey: 'id',\n collectionIdKey: 'id',\n eventIdKey: 'id',\n };\n};"],"mappings":";AAGA,SAAgB,cAAe,UAA2D;AAExF,KAAI,CAAC,SAAS,QAAgB,OAAM,IAAI,MAAM,2CAA2C;AACzF,KAAI,CAAC,SAAS,eAAgB,OAAM,IAAI,MAAM,kDAAkD;AAEhG,QAAO;EACL,SAAgB,SAAS;EACzB,gBAAgB,SAAS;EAEzB,aAAiB;EACjB,eAAiB;EACjB,iBAAiB;EACjB,YAAiB;EACjB,iBAAiB;EACjB,iBAAiB;EACjB,YAAiB;EAClB"}
|
|
@@ -16,7 +16,7 @@ function fromTeachers(teachers, settings, options) {
|
|
|
16
16
|
const doc = {
|
|
17
17
|
id: idOf.teacher(teacher, options),
|
|
18
18
|
group_type: "personal",
|
|
19
|
-
minimizeGaps:
|
|
19
|
+
minimizeGaps: settings.minimizeTeacherGaps,
|
|
20
20
|
minimizeDependencyAlternation: true,
|
|
21
21
|
forbidOverlappingEvents: options.oldFormat ? teacher.forbidOverlappingEvents : void 0,
|
|
22
22
|
disableDayLengthPunishment: options.oldFormat ? teacher.disableDayLengthPunishment : void 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teachers.js","names":["doc: Types.group"],"sources":["../../../../src/RS/to/input/teachers.ts"],"sourcesContent":["import { omitBy } from 'lodash-es';\nimport type { Types } from '../../types';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { parseMaxWorkingHours } from './util/parse-max-working-hours';\nimport { parseDays } from './util/parse-days';\nimport { attachLockedTimes } from './util/attach-locked-times';\nimport { parseMinimumBreakLength } from './util/parse-minimum-break-length';\nimport { idOf } from './util/util';\nimport { parseIntervals } from './util/parse-intervals';\nimport { getDefaultInterval } from './intervals';\n\nexport function fromTeachers (\n teachers: ConnectedTypes.teacher[],\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions\n): Types.group[] {\n const defaultInterval = getDefaultInterval(settings);\n\n return teachers\n .map(teacher => {\n const intervals = teacher.intervals ?? defaultInterval;\n const rootInterval = teacher.rootInterval ?? settings.defaultRootInterval;\n\n const doc: Types.group = {\n id: idOf.teacher(teacher, options),\n group_type: 'personal',\n minimizeGaps:
|
|
1
|
+
{"version":3,"file":"teachers.js","names":["doc: Types.group"],"sources":["../../../../src/RS/to/input/teachers.ts"],"sourcesContent":["import { omitBy } from 'lodash-es';\nimport type { Types } from '../../types';\nimport type { ConnectedTypes } from '../../make-connected';\nimport { parseMaxWorkingHours } from './util/parse-max-working-hours';\nimport { parseDays } from './util/parse-days';\nimport { attachLockedTimes } from './util/attach-locked-times';\nimport { parseMinimumBreakLength } from './util/parse-minimum-break-length';\nimport { idOf } from './util/util';\nimport { parseIntervals } from './util/parse-intervals';\nimport { getDefaultInterval } from './intervals';\n\nexport function fromTeachers (\n teachers: ConnectedTypes.teacher[],\n settings: ConnectedTypes.divisionSettings,\n options: Types.parsedToOptions\n): Types.group[] {\n const defaultInterval = getDefaultInterval(settings);\n\n return teachers\n .map(teacher => {\n const intervals = teacher.intervals ?? defaultInterval;\n const rootInterval = teacher.rootInterval ?? settings.defaultRootInterval;\n\n const doc: Types.group = {\n id: idOf.teacher(teacher, options),\n group_type: 'personal',\n minimizeGaps: settings.minimizeTeacherGaps,\n minimizeDependencyAlternation: true,\n forbidOverlappingEvents: options.oldFormat ? teacher.forbidOverlappingEvents : undefined, // Deprecated in v3\n disableDayLengthPunishment: options.oldFormat ? teacher.disableDayLengthPunishment : undefined, // Deprecated in v3\n weight: teacher.weight,\n intervals: options.oldFormat\n ? parseIntervals(intervals, rootInterval, settings)\n : idOf.intervalPairReference(intervals, rootInterval, options),\n days: parseDays (teacher.days, settings),\n lockedTimes: attachLockedTimes (teacher.lockedTimes, options),\n minBreakLength: parseMinimumBreakLength (teacher.minBreakLength),\n\n ...parseMaxWorkingHours(teacher, options),\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n ids: teacher.ids,\n name: teacher.displayName,\n }, x => x == null);\n }\n\n return omitBy(doc, x => x == null) as Types.group;\n });\n};\n"],"mappings":";;;;;;;;;;AAWA,SAAgB,aACd,UACA,UACA,SACe;CACf,MAAM,kBAAkB,mBAAmB,SAAS;AAEpD,QAAO,SACJ,KAAI,YAAW;EACd,MAAM,YAAe,QAAQ,aAAgB;EAC7C,MAAM,eAAe,QAAQ,gBAAgB,SAAS;EAEtD,MAAMA,MAAmB;GACvB,IAA+B,KAAK,QAAQ,SAAS,QAAQ;GAC7D,YAA+B;GAC/B,cAA+B,SAAS;GACxC,+BAA+B;GAC/B,yBAA+B,QAAQ,YAAY,QAAQ,0BAA0B;GACrF,4BAA+B,QAAQ,YAAY,QAAQ,6BAA6B;GACxF,QAA+B,QAAQ;GACvC,WAA+B,QAAQ,YACnC,eAAe,WAAW,cAAc,SAAS,GACjD,KAAK,sBAAsB,WAAW,cAAc,QAAQ;GAChE,MAAgB,UAA2B,QAAQ,MAAM,SAAS;GAClE,aAAgB,kBAA2B,QAAQ,aAAa,QAAQ;GACxE,gBAAgB,wBAA2B,QAAQ,eAAe;GAElE,GAAG,qBAAqB,SAAS,QAAQ;GAC1C;AAED,MAAI,QAAQ,kBACV,KAAI,OAAO,OAAO;GAChB,KAAM,QAAQ;GACd,MAAM,QAAQ;GACf,GAAE,MAAK,KAAK,KAAK;AAGpB,SAAO,OAAO,MAAK,MAAK,KAAK,KAAK;GAClC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attach-locked-times.js","names":["doc: Types.lockedTime"],"sources":["../../../../../src/RS/to/input/util/attach-locked-times.ts"],"sourcesContent":["import { omitBy } from 'lodash-es';\nimport type { Types } from '../../../types';\nimport type { ConnectedTypes } from '../../../make-connected';\nimport { getDayIndex, getVertexId, parseDateInterval } from '../../../../core/util';\n\nexport function attachLockedTimes (\n lockedTimes: ConnectedTypes.lockedTime[] | null | undefined,\n options: Types.parsedToOptions\n): Types.lockedTime[] | undefined {\n\n return lockedTimes?.map(lockedTime => {\n const { start: startDate, end: endDate } = parseDateInterval(lockedTime, 'locked time');\n\n const length = endDate.diff(startDate, 'minutes');\n if (length < 5) throw new Error('(RS::To::LockedTimes) Length of a locked time is less than 5 min');\n\n const start = parseFloat(startDate.format('HH.mm'));\n\n const doc: Types.lockedTime = {\n day: getDayIndex(startDate),\n start: start,\n length: length,\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n id: getVertexId(lockedTime, options),\n visible: lockedTime.visible,\n name: lockedTime.displayName,\n }, x => x == null);\n }\n\n return omitBy(doc, x => x == null) as Types.lockedTime;\n });\n};"],"mappings":";;;;AAKA,SAAgB,kBACd,aACA,SACgC;AAEhC,QAAO,aAAa,KAAI,eAAc;EACpC,MAAM,EAAE,OAAO,WAAW,KAAK,YAAY,kBAAkB,YAAY;
|
|
1
|
+
{"version":3,"file":"attach-locked-times.js","names":["doc: Types.lockedTime"],"sources":["../../../../../src/RS/to/input/util/attach-locked-times.ts"],"sourcesContent":["import { omitBy } from 'lodash-es';\nimport type { Types } from '../../../types';\nimport type { ConnectedTypes } from '../../../make-connected';\nimport { getDayIndex, getVertexId, parseDateInterval } from '../../../../core/util';\n\nexport function attachLockedTimes (\n lockedTimes: ConnectedTypes.lockedTime[] | null | undefined,\n options: Types.parsedToOptions\n): Types.lockedTime[] | undefined {\n\n return lockedTimes?.map(lockedTime => {\n const { start: startDate, end: endDate } = parseDateInterval(lockedTime, 'locked time');\n\n const length = endDate.diff(startDate, 'minutes');\n if (length < 5) throw new Error('(RS::To::LockedTimes) Length of a locked time is less than 5 min');\n\n const start = parseFloat(startDate.format('HH.mm'));\n\n const doc: Types.lockedTime = {\n day: getDayIndex(startDate),\n start: start,\n length: length,\n };\n\n if (options.includeEntityMeta) {\n doc.meta = omitBy({\n id: getVertexId(lockedTime, options),\n visible: lockedTime.visible,\n name: lockedTime.displayName,\n }, x => x == null);\n }\n\n return omitBy(doc, x => x == null) as Types.lockedTime;\n });\n};"],"mappings":";;;;AAKA,SAAgB,kBACd,aACA,SACgC;AAEhC,QAAO,aAAa,KAAI,eAAc;EACpC,MAAM,EAAE,OAAO,WAAW,KAAK,YAAY,kBAAkB,YAAY,cAAc;EAEvF,MAAM,SAAS,QAAQ,KAAK,WAAW,UAAU;AACjD,MAAI,SAAS,EAAG,OAAM,IAAI,MAAM,mEAAmE;EAEnG,MAAM,QAAQ,WAAW,UAAU,OAAO,QAAQ,CAAC;EAEnD,MAAMA,MAAwB;GAC5B,KAAQ,YAAY,UAAU;GACtB;GACA;GACT;AAED,MAAI,QAAQ,kBACV,KAAI,OAAO,OAAO;GAChB,IAAS,YAAY,YAAY,QAAQ;GACzC,SAAS,WAAW;GACpB,MAAS,WAAW;GACrB,GAAE,MAAK,KAAK,KAAK;AAGpB,SAAO,OAAO,MAAK,MAAK,KAAK,KAAK;GAClC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-days.js","names":[],"sources":["../../../../../src/RS/to/input/util/parse-days.ts"],"sourcesContent":["import type { ConnectedTypes } from '../../../make-connected';\n\nexport function parseDays (\n days: ConnectedTypes.event['days'] | ConnectedTypes.course['days'],\n settings: ConnectedTypes.divisionSettings\n) {\n if (!days) return;\n\n if (days.length) return days.map(x => x.day);\n\n // empty days means all days selected (since no days selected is prohibited)\n return [...Array.from({ length: settings.numDays })].map((_, i) => i);\n}"],"mappings":";AAEA,SAAgB,UACd,MACA,UACA;AACA,KAAI,CAAC,KAAM;AAEX,KAAI,KAAK,OAAQ,QAAO,KAAK,KAAI,MAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"parse-days.js","names":[],"sources":["../../../../../src/RS/to/input/util/parse-days.ts"],"sourcesContent":["import type { ConnectedTypes } from '../../../make-connected';\n\nexport function parseDays (\n days: ConnectedTypes.event['days'] | ConnectedTypes.course['days'],\n settings: ConnectedTypes.divisionSettings\n) {\n if (!days) return;\n\n if (days.length) return days.map(x => x.day);\n\n // empty days means all days selected (since no days selected is prohibited)\n return [...Array.from({ length: settings.numDays })].map((_, i) => i);\n}"],"mappings":";AAEA,SAAgB,UACd,MACA,UACA;AACA,KAAI,CAAC,KAAM;AAEX,KAAI,KAAK,OAAQ,QAAO,KAAK,KAAI,MAAK,EAAE,IAAI;AAG5C,QAAO,CAAC,GAAG,MAAM,KAAK,EAAE,QAAQ,SAAS,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,EAAE"}
|