@royalschedule/maps 4.0.30 → 4.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/dist/Additio/from/courses.js.map +1 -1
  2. package/dist/Additio/from/events.js.map +1 -1
  3. package/dist/Additio/from/groups.js.map +1 -1
  4. package/dist/Additio/from/index.js.map +1 -1
  5. package/dist/Additio/from/locations.js.map +1 -1
  6. package/dist/Additio/from/persons.js.map +1 -1
  7. package/dist/Additio/from/schedules.d.ts +0 -1
  8. package/dist/Additio/from/schedules.js +4 -2
  9. package/dist/Additio/from/schedules.js.map +1 -1
  10. package/dist/Additio/from/teachers.js.map +1 -1
  11. package/dist/Additio/to/index.d.ts +2 -4
  12. package/dist/Additio/to/schedules.js +4 -2
  13. package/dist/Additio/to/schedules.js.map +1 -1
  14. package/dist/Admentum/from/courses.js.map +1 -1
  15. package/dist/Admentum/from/events.js.map +1 -1
  16. package/dist/Admentum/from/groups.js.map +1 -1
  17. package/dist/Admentum/from/index.js.map +1 -1
  18. package/dist/Admentum/from/locations.js.map +1 -1
  19. package/dist/Admentum/from/persons.js.map +1 -1
  20. package/dist/Admentum/from/schedules.d.ts +0 -1
  21. package/dist/Admentum/from/schedules.js +6 -3
  22. package/dist/Admentum/from/schedules.js.map +1 -1
  23. package/dist/Admentum/from/teachers.js.map +1 -1
  24. package/dist/Admentum/to/index.d.ts +0 -1
  25. package/dist/Admentum/to/schedules.js +7 -4
  26. package/dist/Admentum/to/schedules.js.map +1 -1
  27. package/dist/Excel/index.d.ts +4 -4
  28. package/dist/Excel/v1/from/index.js +1 -1
  29. package/dist/Excel/v1/from/index.js.map +1 -1
  30. package/dist/Excel/v1/index.d.ts +1 -1
  31. package/dist/Excel/v2/from/index.js +54 -45
  32. package/dist/Excel/v2/from/index.js.map +1 -1
  33. package/dist/Excel/v2/index.d.ts +4 -4
  34. package/dist/IdunSoft/from/courses.js.map +1 -1
  35. package/dist/IdunSoft/from/events.js +2 -1
  36. package/dist/IdunSoft/from/events.js.map +1 -1
  37. package/dist/IdunSoft/from/groups.js.map +1 -1
  38. package/dist/IdunSoft/from/index.js.map +1 -1
  39. package/dist/IdunSoft/from/locations.js.map +1 -1
  40. package/dist/IdunSoft/from/schedules.d.ts +0 -1
  41. package/dist/IdunSoft/from/schedules.js.map +1 -1
  42. package/dist/IdunSoft/from/teachers.js.map +1 -1
  43. package/dist/IdunSoft/to/index.d.ts +0 -1
  44. package/dist/IdunSoft/to/schedules.js +6 -3
  45. package/dist/IdunSoft/to/schedules.js.map +1 -1
  46. package/dist/InfoMentor/to/index.d.ts +0 -1
  47. package/dist/InfoMentor/to/schedules.js +2 -1
  48. package/dist/InfoMentor/to/schedules.js.map +1 -1
  49. package/dist/PlanDigital/from/index.js.map +1 -1
  50. package/dist/PlanDigital/from/schedules.js +11 -9
  51. package/dist/PlanDigital/from/schedules.js.map +1 -1
  52. package/dist/PlanDigital/index.d.ts +0 -1
  53. package/dist/Quiculum/file/to/index.d.ts +0 -1
  54. package/dist/Quiculum/file/to/schedules.js +9 -5
  55. package/dist/Quiculum/file/to/schedules.js.map +1 -1
  56. package/dist/RS/from/division.d.ts +0 -1
  57. package/dist/RS/from/division.js +2 -1
  58. package/dist/RS/from/division.js.map +1 -1
  59. package/dist/RS/from/index.js.map +1 -1
  60. package/dist/RS/from/schedules.d.ts +0 -1
  61. package/dist/RS/from/schedules.js.map +1 -1
  62. package/dist/RS/make-connected.d.ts +1 -3
  63. package/dist/RS/make-connected.js +42 -33
  64. package/dist/RS/make-connected.js.map +1 -1
  65. package/dist/RS/to/index.js.map +1 -1
  66. package/dist/RS/to/initial-configuration.js +6 -4
  67. package/dist/RS/to/initial-configuration.js.map +1 -1
  68. package/dist/RS/to/input/collections.js.map +1 -1
  69. package/dist/RS/to/input/default.js +2 -1
  70. package/dist/RS/to/input/default.js.map +1 -1
  71. package/dist/RS/to/input/dependencies.js +2 -1
  72. package/dist/RS/to/input/dependencies.js.map +1 -1
  73. package/dist/RS/to/input/dynamic-locked-times.js +2 -1
  74. package/dist/RS/to/input/dynamic-locked-times.js.map +1 -1
  75. package/dist/RS/to/input/events.js.map +1 -1
  76. package/dist/RS/to/input/groups.js.map +1 -1
  77. package/dist/RS/to/input/individuals.js +2 -1
  78. package/dist/RS/to/input/individuals.js.map +1 -1
  79. package/dist/RS/to/input/input.js +2 -1
  80. package/dist/RS/to/input/input.js.map +1 -1
  81. package/dist/RS/to/input/intervals.js +4 -2
  82. package/dist/RS/to/input/intervals.js.map +1 -1
  83. package/dist/RS/to/input/periods.js +4 -2
  84. package/dist/RS/to/input/periods.js.map +1 -1
  85. package/dist/RS/to/input/settings.js.map +1 -1
  86. package/dist/RS/to/input/teachers.js.map +1 -1
  87. package/dist/RS/to/input/util/attach-locked-times.js.map +1 -1
  88. package/dist/RS/to/input/util/parse-days.js.map +1 -1
  89. package/dist/RS/to/input/util/parse-group-references.js.map +1 -1
  90. package/dist/RS/to/input/util/parse-intervals.js +4 -2
  91. package/dist/RS/to/input/util/parse-intervals.js.map +1 -1
  92. package/dist/RS/to/input/util/parse-location-references.js +2 -1
  93. package/dist/RS/to/input/util/parse-location-references.js.map +1 -1
  94. package/dist/RS/to/input/util/parse-max-working-hours.js.map +1 -1
  95. package/dist/RS/to/input/util/parse-minimum-break-length.js.map +1 -1
  96. package/dist/RS/to/input/util/util.js +2 -1
  97. package/dist/RS/to/input/util/util.js.map +1 -1
  98. package/dist/RS/to/schedules.js.map +1 -1
  99. package/dist/RS/types/to.d.ts +0 -1
  100. package/dist/SS12000/from/activities.js +2 -1
  101. package/dist/SS12000/from/activities.js.map +1 -1
  102. package/dist/SS12000/from/calendar-events.js.map +1 -1
  103. package/dist/SS12000/from/duties.js.map +1 -1
  104. package/dist/SS12000/from/groups.js.map +1 -1
  105. package/dist/SS12000/from/index.js.map +1 -1
  106. package/dist/SS12000/from/persons.js.map +1 -1
  107. package/dist/SS12000/from/resources.js.map +1 -1
  108. package/dist/SS12000/from/rooms.js.map +1 -1
  109. package/dist/SS12000/from/syllabuses.js.map +1 -1
  110. package/dist/SS12000/index.d.ts +374 -194
  111. package/dist/SS12000/to/activities.js.map +1 -1
  112. package/dist/SS12000/to/calendar-events.js.map +1 -1
  113. package/dist/SS12000/to/common.js.map +1 -1
  114. package/dist/SS12000/to/duties.js.map +1 -1
  115. package/dist/SS12000/to/groups.js.map +1 -1
  116. package/dist/SS12000/to/index.d.ts +0 -1
  117. package/dist/SS12000/to/persons.js.map +1 -1
  118. package/dist/SS12000/to/resources.js.map +1 -1
  119. package/dist/SS12000/to/rooms.js.map +1 -1
  120. package/dist/SS12000/to/syllabuses.js.map +1 -1
  121. package/dist/SchoolSoft/api/from/index.js.map +1 -1
  122. package/dist/SchoolSoft/api/from/schedules.js +12 -8
  123. package/dist/SchoolSoft/api/from/schedules.js.map +1 -1
  124. package/dist/SchoolSoft/api/index.d.ts +7 -6
  125. package/dist/SchoolSoft/file/from/index.js.map +1 -1
  126. package/dist/SchoolSoft/file/from/schedules.js +87 -83
  127. package/dist/SchoolSoft/file/from/schedules.js.map +1 -1
  128. package/dist/SchoolSoft/file/index.d.ts +0 -1
  129. package/dist/SchoolSoft/file/to/index.d.ts +2 -3
  130. package/dist/SchoolSoft/file/to/schedules.js +2 -1
  131. package/dist/SchoolSoft/file/to/schedules.js.map +1 -1
  132. package/dist/SchoolSoft/index.d.ts +0 -1
  133. package/dist/Schoolity/txt/to/index.d.ts +0 -1
  134. package/dist/Schoolity/txt/to/schedules.js +12 -5
  135. package/dist/Schoolity/txt/to/schedules.js.map +1 -1
  136. package/dist/Skola24/mdb/from/course-and-events.js +5 -3
  137. package/dist/Skola24/mdb/from/course-and-events.js.map +1 -1
  138. package/dist/Skola24/mdb/from/groups.js.map +1 -1
  139. package/dist/Skola24/mdb/from/index.js.map +1 -1
  140. package/dist/Skola24/mdb/from/locations.js.map +1 -1
  141. package/dist/Skola24/mdb/from/schedule.d.ts +0 -1
  142. package/dist/Skola24/mdb/from/schedule.js.map +1 -1
  143. package/dist/Skola24/mdb/from/teachers.js.map +1 -1
  144. package/dist/Skola24/txt/from/calendar-exceptions.js +2 -1
  145. package/dist/Skola24/txt/from/calendar-exceptions.js.map +1 -1
  146. package/dist/Skola24/txt/from/division.js.map +1 -1
  147. package/dist/Skola24/txt/from/index.js.map +1 -1
  148. package/dist/Skola24/txt/from/period.js +34 -31
  149. package/dist/Skola24/txt/from/period.js.map +1 -1
  150. package/dist/Skola24/txt/from/schedules.d.ts +0 -1
  151. package/dist/Skola24/txt/from/schedules.js +10 -6
  152. package/dist/Skola24/txt/from/schedules.js.map +1 -1
  153. package/dist/Skola24/txt/from/util.js.map +1 -1
  154. package/dist/Skola24/txt/index.d.ts +0 -1
  155. package/dist/Skola24/txt/to/index.d.ts +0 -1
  156. package/dist/Skola24/txt/to/schedules.js +12 -5
  157. package/dist/Skola24/txt/to/schedules.js.map +1 -1
  158. package/dist/common/constants.js.map +1 -1
  159. package/dist/common/functions.js.map +1 -1
  160. package/dist/common/get-date.js.map +1 -1
  161. package/dist/common/make-chainable/index.js.map +1 -1
  162. package/dist/common/types.d.ts +3 -1
  163. package/dist/core/from/configurations.js.map +1 -1
  164. package/dist/core/from/courses.js.map +1 -1
  165. package/dist/core/from/events.js.map +1 -1
  166. package/dist/core/from/exceptions.js.map +1 -1
  167. package/dist/core/from/groups.js.map +1 -1
  168. package/dist/core/from/index.js.map +1 -1
  169. package/dist/core/from/locations.js.map +1 -1
  170. package/dist/core/from/locked-times.js.map +1 -1
  171. package/dist/core/from/overlap-groups.js.map +1 -1
  172. package/dist/core/from/periods.js.map +1 -1
  173. package/dist/core/from/persons.js.map +1 -1
  174. package/dist/core/from/root-intervals.js.map +1 -1
  175. package/dist/core/from/schedules.js.map +1 -1
  176. package/dist/core/from/settings.js.map +1 -1
  177. package/dist/core/from/syllabuses.js.map +1 -1
  178. package/dist/core/from/teachers.js.map +1 -1
  179. package/dist/core/index.d.ts +0 -1
  180. package/dist/core/interfaces/other/companies.js.map +1 -1
  181. package/dist/core/interfaces/other/operations.d.ts +0 -1
  182. package/dist/core/interfaces/vertices/companies.d.ts +0 -1
  183. package/dist/core/interfaces/vertices/configurations.d.ts +1 -2
  184. package/dist/core/interfaces/vertices/courses.d.ts +0 -1
  185. package/dist/core/interfaces/vertices/division-settings.d.ts +0 -1
  186. package/dist/core/interfaces/vertices/divisions.d.ts +0 -1
  187. package/dist/core/interfaces/vertices/events.d.ts +2 -1
  188. package/dist/core/interfaces/vertices/exceptions.d.ts +0 -1
  189. package/dist/core/interfaces/vertices/generations.d.ts +0 -2
  190. package/dist/core/interfaces/vertices/groups.d.ts +0 -1
  191. package/dist/core/interfaces/vertices/index.d.ts +14 -1
  192. package/dist/core/interfaces/vertices/locations.d.ts +0 -1
  193. package/dist/core/interfaces/vertices/locked-times.d.ts +0 -2
  194. package/dist/core/interfaces/vertices/overlap-groups.d.ts +0 -1
  195. package/dist/core/interfaces/vertices/periods.d.ts +0 -2
  196. package/dist/core/interfaces/vertices/persons.d.ts +0 -1
  197. package/dist/core/interfaces/vertices/properties/belongs-to.d.ts +0 -1
  198. package/dist/core/interfaces/vertices/properties/coalesced.d.ts +0 -1
  199. package/dist/core/interfaces/vertices/root-intervals.d.ts +0 -2
  200. package/dist/core/interfaces/vertices/syllabuses.d.ts +0 -1
  201. package/dist/core/interfaces/vertices/teachers.d.ts +0 -1
  202. package/dist/core/interfaces/vertices/threads.d.ts +31 -0
  203. package/dist/core/interfaces/vertices/users.d.ts +4 -2
  204. package/dist/core/interfaces/vertices/util/custom-vertex-export/index.d.ts +9 -8
  205. package/dist/core/interfaces/vertices/util/custom-vertex-export/util.d.ts +4 -4
  206. package/dist/core/interfaces/vertices/util/deep-vertex-export/index.d.ts +9 -8
  207. package/dist/core/interfaces/vertices/util/edges.d.ts +26 -8
  208. package/dist/core/interfaces/vertices/util/util.d.ts +24 -20
  209. package/dist/core/interfaces/vertices/util/vertex-query/index.d.ts +16 -11
  210. package/dist/core/interfaces/vertices/util/vertex.d.ts +2 -2
  211. package/dist/core/interfaces/vertices/vertex-query.d.ts +29 -26
  212. package/dist/core/interfaces/vertices/vertex-query.js +8 -0
  213. package/dist/core/interfaces/vertices/vertex-query.js.map +1 -1
  214. package/dist/core/to/configurations.js +2 -1
  215. package/dist/core/to/configurations.js.map +1 -1
  216. package/dist/core/to/courses.js +2 -1
  217. package/dist/core/to/courses.js.map +1 -1
  218. package/dist/core/to/division.js.map +1 -1
  219. package/dist/core/to/events.js +4 -2
  220. package/dist/core/to/events.js.map +1 -1
  221. package/dist/core/to/exceptions.js +2 -1
  222. package/dist/core/to/exceptions.js.map +1 -1
  223. package/dist/core/to/groups.js +2 -1
  224. package/dist/core/to/groups.js.map +1 -1
  225. package/dist/core/to/locations.js +2 -1
  226. package/dist/core/to/locations.js.map +1 -1
  227. package/dist/core/to/locked-times.js +2 -1
  228. package/dist/core/to/locked-times.js.map +1 -1
  229. package/dist/core/to/overlap-groups.js +2 -1
  230. package/dist/core/to/overlap-groups.js.map +1 -1
  231. package/dist/core/to/periods.js +2 -1
  232. package/dist/core/to/periods.js.map +1 -1
  233. package/dist/core/to/persons.js +2 -1
  234. package/dist/core/to/persons.js.map +1 -1
  235. package/dist/core/to/root-intervals.js +2 -1
  236. package/dist/core/to/root-intervals.js.map +1 -1
  237. package/dist/core/to/schedules.d.ts +0 -1
  238. package/dist/core/to/schedules.js.map +1 -1
  239. package/dist/core/to/settings.js +2 -1
  240. package/dist/core/to/settings.js.map +1 -1
  241. package/dist/core/to/syllabuses.js +2 -1
  242. package/dist/core/to/syllabuses.js.map +1 -1
  243. package/dist/core/to/teachers.js +2 -1
  244. package/dist/core/to/teachers.js.map +1 -1
  245. package/dist/core/to/util.d.ts +0 -2
  246. package/dist/core/to/util.js +2 -1
  247. package/dist/core/to/util.js.map +1 -1
  248. package/dist/core/types/index.d.ts +5 -1
  249. package/dist/core/util.js +2 -1
  250. package/dist/core/util.js.map +1 -1
  251. package/dist/identify/constants/index.js.map +1 -1
  252. package/dist/identify/index.js +2 -1
  253. package/dist/identify/index.js.map +1 -1
  254. package/dist/sdui/from/classes.js.map +1 -1
  255. package/dist/sdui/from/courses.js.map +1 -1
  256. package/dist/sdui/from/holidays.js.map +1 -1
  257. package/dist/sdui/from/index.js.map +1 -1
  258. package/dist/sdui/from/lessons.js.map +1 -1
  259. package/dist/sdui/from/rooms.js.map +1 -1
  260. package/dist/sdui/from/schedules.d.ts +0 -2
  261. package/dist/sdui/from/schedules.js.map +1 -1
  262. package/dist/sdui/from/school-years.js.map +1 -1
  263. package/dist/sdui/from/substitution-plans.js.map +1 -1
  264. package/dist/sdui/from/teachers.js.map +1 -1
  265. package/dist/sdui/to/classes.js.map +1 -1
  266. package/dist/sdui/to/courses.js.map +1 -1
  267. package/dist/sdui/to/holidays.js.map +1 -1
  268. package/dist/sdui/to/hours.js.map +1 -1
  269. package/dist/sdui/to/index.d.ts +0 -2
  270. package/dist/sdui/to/lessons.js.map +1 -1
  271. package/dist/sdui/to/rooms.js.map +1 -1
  272. package/dist/sdui/to/schedules.js.map +1 -1
  273. package/dist/sdui/to/school-years.js.map +1 -1
  274. package/dist/sdui/to/substitution-plans.js +6 -3
  275. package/dist/sdui/to/substitution-plans.js.map +1 -1
  276. package/dist/sdui/to/teachers.js.map +1 -1
  277. package/dist/vKlass/from/index.js.map +1 -1
  278. package/dist/vKlass/from/schedule.d.ts +0 -1
  279. package/dist/vKlass/from/schedule.js.map +1 -1
  280. package/dist/vKlass/to/schedules.js +17 -6
  281. package/dist/vKlass/to/schedules.js.map +1 -1
  282. package/package.json +1 -1
  283. package/dist/core/interfaces/index.d.ts +0 -23
  284. package/dist/core/interfaces/other/index.d.ts +0 -6
  285. package/dist/core/interfaces/vertices/util/index.d.ts +0 -6
@@ -1 +1 @@
1
- {"version":3,"file":"courses.js","names":["courses: OutTypes.course[]"],"sources":["../../../src/Additio/from/courses.ts"],"sourcesContent":["import type { ScheduleGroup } from '../types/schedule-groups';\nimport type { School } from '../types/schools';\nimport type { OutTypes } from './schedules';\n\n\nexport default function (\n scheduledGroups: ScheduleGroup[] | undefined,\n school: School,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.course[] {\n\n const courses: OutTypes.course[] = [];\n\n scheduledGroups?.forEach(scheduledGroup => {\n\n ////\n //// check number of subjects/courses\n ////\n const subjects = school.school_type == 'GR' ? scheduledGroup.subjects : scheduledGroup.courses;\n if (subjects.length != 1) {\n const warn = `The schedule group \"${scheduledGroup.name}\" with id \"${scheduledGroup.id}\" contained ${subjects.length} number of ${school.school_type == 'GR' ? 'subjects' : 'courses'} and was therefore omitted: a schedule group shall contain only a single ${school.school_type == 'GR' ? 'subject' : 'course'}.`;\n importWarnings.push(warn);\n return;\n }\n\n\n ////\n //// check number of teachers\n ////\n if (scheduledGroup.teachers?.length == 0) {\n const warn = `The schedule group \"${scheduledGroup.name}\" with id \"${scheduledGroup.id}\" did not contain any teachers.`;\n importWarnings.push(warn);\n }\n\n\n courses.push({\n ids: scheduledGroup.id.toString(),\n displayName: scheduledGroup.name,\n subject: subjects.map(x => x.name).join(', '),\n groups: scheduledGroup.users_primary_groups.map(x => ({ to: x.toString() })),\n teachers: scheduledGroup.teachers?.map(x => ({ to: x.id.toString() }))\n } satisfies OutTypes.course);\n\n });\n\n return courses;\n}\n"],"mappings":";AAKA,yBACE,iBACA,QACA,cACA,gBACmB;CAEnB,MAAMA,UAA6B,EAAE;AAErC,kBAAiB,SAAQ,mBAAkB;EAKzC,MAAM,WAAW,OAAO,eAAe,OAAO,eAAe,WAAW,eAAe;AACvF,MAAI,SAAS,UAAU,GAAG;GACxB,MAAM,OAAO,uBAAuB,eAAe,KAAK,aAAa,eAAe,GAAG,cAAc,SAAS,OAAO,aAAa,OAAO,eAAe,OAAO,aAAa,UAAU,2EAA2E,OAAO,eAAe,OAAO,YAAY,SAAS;AACnT,kBAAe,KAAK,KAAK;AACzB;;AAOF,MAAI,eAAe,UAAU,UAAU,GAAG;GACxC,MAAM,OAAO,uBAAuB,eAAe,KAAK,aAAa,eAAe,GAAG;AACvF,kBAAe,KAAK,KAAK;;AAI3B,UAAQ,KAAK;GACX,KAAa,eAAe,GAAG,UAAU;GACzC,aAAa,eAAe;GAC5B,SAAa,SAAS,KAAI,MAAK,EAAE,KAAK,CAAC,KAAK,KAAK;GACjD,QAAa,eAAe,qBAAqB,KAAI,OAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;GACjF,UAAa,eAAe,UAAU,KAAI,OAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,EAAE;GAC1E,CAA2B;GAE5B;AAEF,QAAO"}
1
+ {"version":3,"file":"courses.js","names":["courses: OutTypes.course[]"],"sources":["../../../src/Additio/from/courses.ts"],"sourcesContent":["import type { ScheduleGroup } from '../types/schedule-groups';\nimport type { School } from '../types/schools';\nimport type { OutTypes } from './schedules';\n\n\nexport default function (\n scheduledGroups: ScheduleGroup[] | undefined,\n school: School,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.course[] {\n\n const courses: OutTypes.course[] = [];\n\n scheduledGroups?.forEach(scheduledGroup => {\n\n ////\n //// check number of subjects/courses\n ////\n const subjects = school.school_type == 'GR' ? scheduledGroup.subjects : scheduledGroup.courses;\n if (subjects.length != 1) {\n const warn = `The schedule group \"${scheduledGroup.name}\" with id \"${scheduledGroup.id}\" contained ${subjects.length} number of ${school.school_type == 'GR' ? 'subjects' : 'courses'} and was therefore omitted: a schedule group shall contain only a single ${school.school_type == 'GR' ? 'subject' : 'course'}.`;\n importWarnings.push(warn);\n return;\n }\n\n\n ////\n //// check number of teachers\n ////\n if (scheduledGroup.teachers?.length == 0) {\n const warn = `The schedule group \"${scheduledGroup.name}\" with id \"${scheduledGroup.id}\" did not contain any teachers.`;\n importWarnings.push(warn);\n }\n\n\n courses.push({\n ids: scheduledGroup.id.toString(),\n displayName: scheduledGroup.name,\n subject: subjects.map(x => x.name).join(', '),\n groups: scheduledGroup.users_primary_groups.map(x => ({ to: x.toString() })),\n teachers: scheduledGroup.teachers?.map(x => ({ to: x.id.toString() }))\n } satisfies OutTypes.course);\n\n });\n\n return courses;\n}\n"],"mappings":";AAKA,yBACE,iBACA,QACA,cACA,gBACmB;CAEnB,MAAMA,UAA6B;AAEnC,kBAAiB,SAAQ,mBAAkB;EAKzC,MAAM,WAAW,OAAO,eAAe,OAAO,eAAe,WAAW,eAAe;AACvF,MAAI,SAAS,UAAU,GAAG;GACxB,MAAM,OAAO,uBAAuB,eAAe,KAAK,aAAa,eAAe,GAAG,cAAc,SAAS,OAAO,aAAa,OAAO,eAAe,OAAO,aAAa,UAAU,2EAA2E,OAAO,eAAe,OAAO,YAAY,SAAS;AACnT,kBAAe,KAAK;AACpB;;AAOF,MAAI,eAAe,UAAU,UAAU,GAAG;GACxC,MAAM,OAAO,uBAAuB,eAAe,KAAK,aAAa,eAAe,GAAG;AACvF,kBAAe,KAAK;;AAItB,UAAQ,KAAK;GACX,KAAa,eAAe,GAAG;GAC/B,aAAa,eAAe;GAC5B,SAAa,SAAS,KAAI,MAAK,EAAE,MAAM,KAAK;GAC5C,QAAa,eAAe,qBAAqB,KAAI,OAAM,EAAE,IAAI,EAAE;GACnE,UAAa,eAAe,UAAU,KAAI,OAAM,EAAE,IAAI,EAAE,GAAG;;;AAK/D,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","names":["events: OutTypes.event[]","eventTeachers: string[] | undefined"],"sources":["../../../src/Additio/from/events.ts"],"sourcesContent":["\nimport moment from 'moment';\nimport type { Lesson } from '../types/lessons';\nimport type { OutTypes } from './schedules';\n\nconst firstDay = moment.utc('1970-01-05');\n\nfunction fromTimeString (\n day: number,\n timeString: string\n): moment.Moment {\n const [hours, minutes, seconds] = timeString.split(':').map((time: string) => parseInt(time));\n return firstDay.clone().add(day, 'day')\n .set('hour', hours)\n .set('minute', minutes);\n}\n\nexport default function (\n lessons: Lesson[] | undefined,\n courses: OutTypes.course[] | undefined,\n teachers: OutTypes.teacher[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.event[] {\n\n // create schedule_group (group) to course map for quick lookup\n const group2course = new Map<string, OutTypes.course>();\n courses?.forEach(c => group2course.set(c.ids!, c));\n\n // create teacher set for quick lookup\n const teacherSet = new Set<string>();\n teachers?.forEach(t => teacherSet.add(t.ids!));\n\n const events: OutTypes.event[] = [];\n lessons?.forEach(l => {\n\n // check number of groups (schedule_groups = course) to ensure that only one exists\n if (l.info.groups?.length != 1) {\n const warn = `The lesson with id \"${l.id} contained ${l.info.groups?.length} number of groups (schedule_groups = courses) and was therefore omitted: a lesson shall contain only a single group.`;\n importWarnings.push(warn);\n return;\n }\n const course_id = l.info.groups[0].id.toString();\n\n // ensure the course exists\n const course = group2course.get(course_id);\n if (!course) {\n const warn = `The lesson with id \"${l.id}\" referenced the unknown/faulty schedule_group (course) \"${course_id}\" and was therefore ignored.`;\n importWarnings.push(warn);\n return;\n }\n\n const start = fromTimeString(l.weekday, l.info.start);\n const end = fromTimeString(l.weekday, l.info.end);\n const preferredDuration = l.info.duration;\n const duration = l.info.duration;\n\n // store only teachers if they mismatch teachers of parent course\n let eventTeachers: string[] | undefined;\n if (!course.teachers || !course.teachers?.every(x => l.info.teachers?.some(y => y.id.toString() == x.to))) {\n eventTeachers = l.info.teachers?.map(x => x.id.toString());\n\n // ensure that the teachers exist\n for (const teacher of eventTeachers ?? []) {\n if (!teacherSet.has(teacher)) {\n const warn = `The lesson with id \"${l.id}\" referenced the unknown teacher \"${teacher}\" and was therefore ignored.`;\n importWarnings.push(warn);\n return;\n }\n }\n }\n\n // location\n const location = l.info.room?.id.toString();\n\n events.push({\n ids: l.id.toString(),\n start,\n end,\n preferredDuration,\n duration,\n course: course_id,\n ...location && { inLocations: [ location ], locations: [{ locations: [ location ] }] },\n ...(eventTeachers && { teachers: eventTeachers.map((to) => ({ to })) })\n } satisfies OutTypes.event);\n });\n\n return events;\n}\n"],"mappings":";;;AAKA,MAAM,WAAW,OAAO,IAAI,aAAa;AAEzC,SAAS,eACP,KACA,YACe;CACf,MAAM,CAAC,OAAO,SAAS,WAAW,WAAW,MAAM,IAAI,CAAC,KAAK,SAAiB,SAAS,KAAK,CAAC;AAC7F,QAAO,SAAS,OAAO,CAAC,IAAI,KAAK,MAAM,CACpC,IAAI,QAAQ,MAAM,CAClB,IAAI,UAAU,QAAQ;;AAG3B,wBACE,SACA,SACA,UACA,cACA,gBACkB;CAGlB,MAAM,+BAAe,IAAI,KAA8B;AACvD,UAAS,SAAQ,MAAK,aAAa,IAAI,EAAE,KAAM,EAAE,CAAC;CAGlD,MAAM,6BAAa,IAAI,KAAa;AACpC,WAAU,SAAQ,MAAK,WAAW,IAAI,EAAE,IAAK,CAAC;CAE9C,MAAMA,SAA2B,EAAE;AACnC,UAAS,SAAQ,MAAK;AAGpB,MAAI,EAAE,KAAK,QAAQ,UAAU,GAAG;GAC9B,MAAM,OAAO,uBAAuB,EAAE,GAAG,aAAa,EAAE,KAAK,QAAQ,OAAO;AAC5E,kBAAe,KAAK,KAAK;AACzB;;EAEF,MAAM,YAAY,EAAE,KAAK,OAAO,GAAG,GAAG,UAAU;EAGhD,MAAM,SAAS,aAAa,IAAI,UAAU;AAC1C,MAAI,CAAC,QAAQ;GACX,MAAM,OAAO,uBAAuB,EAAE,GAAG,2DAA2D,UAAU;AAC9G,kBAAe,KAAK,KAAK;AACzB;;EAGF,MAAM,QAAoB,eAAe,EAAE,SAAS,EAAE,KAAK,MAAM;EACjE,MAAM,MAAoB,eAAe,EAAE,SAAS,EAAE,KAAK,IAAI;EAC/D,MAAM,oBAAoB,EAAE,KAAK;EACjC,MAAM,WAAoB,EAAE,KAAK;EAGjC,IAAIC;AACJ,MAAI,CAAC,OAAO,YAAY,CAAC,OAAO,UAAU,OAAM,MAAK,EAAE,KAAK,UAAU,MAAK,MAAK,EAAE,GAAG,UAAU,IAAI,EAAE,GAAG,CAAC,EAAE;AACzG,mBAAgB,EAAE,KAAK,UAAU,KAAI,MAAK,EAAE,GAAG,UAAU,CAAC;AAG1D,QAAK,MAAM,WAAW,iBAAiB,EAAE,CACvC,KAAI,CAAC,WAAW,IAAI,QAAQ,EAAE;IAC5B,MAAM,OAAO,uBAAuB,EAAE,GAAG,oCAAoC,QAAQ;AACrF,mBAAe,KAAK,KAAK;AACzB;;;EAMN,MAAM,WAAW,EAAE,KAAK,MAAM,GAAG,UAAU;AAE3C,SAAO,KAAK;GACV,KAAQ,EAAE,GAAG,UAAU;GACvB;GACA;GACA;GACA;GACA,QAAQ;GACR,GAAG,YAAY;IAAE,aAAa,CAAE,SAAU;IAAE,WAAW,CAAC,EAAE,WAAW,CAAE,SAAU,EAAE,CAAC;IAAE;GACtF,GAAI,iBAAiB,EAAE,UAAU,cAAc,KAAK,QAAQ,EAAE,IAAI,EAAE,EAAE;GACvE,CAA0B;GAC3B;AAEF,QAAO"}
1
+ {"version":3,"file":"events.js","names":["events: OutTypes.event[]","eventTeachers: string[] | undefined"],"sources":["../../../src/Additio/from/events.ts"],"sourcesContent":["\nimport moment from 'moment';\nimport type { Lesson } from '../types/lessons';\nimport type { OutTypes } from './schedules';\n\nconst firstDay = moment.utc('1970-01-05');\n\nfunction fromTimeString (\n day: number,\n timeString: string\n): moment.Moment {\n const [hours, minutes, seconds] = timeString.split(':').map((time: string) => parseInt(time));\n return firstDay.clone().add(day, 'day')\n .set('hour', hours)\n .set('minute', minutes);\n}\n\nexport default function (\n lessons: Lesson[] | undefined,\n courses: OutTypes.course[] | undefined,\n teachers: OutTypes.teacher[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.event[] {\n\n // create schedule_group (group) to course map for quick lookup\n const group2course = new Map<string, OutTypes.course>();\n courses?.forEach(c => group2course.set(c.ids!, c));\n\n // create teacher set for quick lookup\n const teacherSet = new Set<string>();\n teachers?.forEach(t => teacherSet.add(t.ids!));\n\n const events: OutTypes.event[] = [];\n lessons?.forEach(l => {\n\n // check number of groups (schedule_groups = course) to ensure that only one exists\n if (l.info.groups?.length != 1) {\n const warn = `The lesson with id \"${l.id} contained ${l.info.groups?.length} number of groups (schedule_groups = courses) and was therefore omitted: a lesson shall contain only a single group.`;\n importWarnings.push(warn);\n return;\n }\n const course_id = l.info.groups[0].id.toString();\n\n // ensure the course exists\n const course = group2course.get(course_id);\n if (!course) {\n const warn = `The lesson with id \"${l.id}\" referenced the unknown/faulty schedule_group (course) \"${course_id}\" and was therefore ignored.`;\n importWarnings.push(warn);\n return;\n }\n\n const start = fromTimeString(l.weekday, l.info.start);\n const end = fromTimeString(l.weekday, l.info.end);\n const preferredDuration = l.info.duration;\n const duration = l.info.duration;\n\n // store only teachers if they mismatch teachers of parent course\n let eventTeachers: string[] | undefined;\n if (!course.teachers || !course.teachers?.every(x => l.info.teachers?.some(y => y.id.toString() == x.to))) {\n eventTeachers = l.info.teachers?.map(x => x.id.toString());\n\n // ensure that the teachers exist\n for (const teacher of eventTeachers ?? []) {\n if (!teacherSet.has(teacher)) {\n const warn = `The lesson with id \"${l.id}\" referenced the unknown teacher \"${teacher}\" and was therefore ignored.`;\n importWarnings.push(warn);\n return;\n }\n }\n }\n\n // location\n const location = l.info.room?.id.toString();\n\n events.push({\n ids: l.id.toString(),\n start,\n end,\n preferredDuration,\n duration,\n course: course_id,\n ...location && { inLocations: [ location ], locations: [{ locations: [ location ] }] },\n ...(eventTeachers && { teachers: eventTeachers.map((to) => ({ to })) })\n } satisfies OutTypes.event);\n });\n\n return events;\n}\n"],"mappings":";;;AAKA,MAAM,WAAW,OAAO,IAAI;AAE5B,SAAS,eACP,KACA,YACe;CACf,MAAM,CAAC,OAAO,SAAS,WAAW,WAAW,MAAM,KAAK,KAAK,SAAiB,SAAS;AACvF,QAAO,SAAS,QAAQ,IAAI,KAAK,OAC9B,IAAI,QAAQ,OACZ,IAAI,UAAU;;AAGnB,wBACE,SACA,SACA,UACA,cACA,gBACkB;CAGlB,MAAM,+BAAe,IAAI;AACzB,UAAS,SAAQ,MAAK,aAAa,IAAI,EAAE,KAAM;CAG/C,MAAM,6BAAa,IAAI;AACvB,WAAU,SAAQ,MAAK,WAAW,IAAI,EAAE;CAExC,MAAMA,SAA2B;AACjC,UAAS,SAAQ,MAAK;AAGpB,MAAI,EAAE,KAAK,QAAQ,UAAU,GAAG;GAC9B,MAAM,OAAO,uBAAuB,EAAE,GAAG,aAAa,EAAE,KAAK,QAAQ,OAAO;AAC5E,kBAAe,KAAK;AACpB;;EAEF,MAAM,YAAY,EAAE,KAAK,OAAO,GAAG,GAAG;EAGtC,MAAM,SAAS,aAAa,IAAI;AAChC,MAAI,CAAC,QAAQ;GACX,MAAM,OAAO,uBAAuB,EAAE,GAAG,2DAA2D,UAAU;AAC9G,kBAAe,KAAK;AACpB;;EAGF,MAAM,QAAoB,eAAe,EAAE,SAAS,EAAE,KAAK;EAC3D,MAAM,MAAoB,eAAe,EAAE,SAAS,EAAE,KAAK;EAC3D,MAAM,oBAAoB,EAAE,KAAK;EACjC,MAAM,WAAoB,EAAE,KAAK;EAGjC,IAAIC;AACJ,MAAI,CAAC,OAAO,YAAY,CAAC,OAAO,UAAU,OAAM,MAAK,EAAE,KAAK,UAAU,MAAK,MAAK,EAAE,GAAG,cAAc,EAAE,MAAM;AACzG,mBAAgB,EAAE,KAAK,UAAU,KAAI,MAAK,EAAE,GAAG;AAG/C,QAAK,MAAM,WAAW,iBAAiB,GACrC,KAAI,CAAC,WAAW,IAAI,UAAU;IAC5B,MAAM,OAAO,uBAAuB,EAAE,GAAG,oCAAoC,QAAQ;AACrF,mBAAe,KAAK;AACpB;;;EAMN,MAAM,WAAW,EAAE,KAAK,MAAM,GAAG;AAEjC,SAAO,KAAK;GACV,KAAQ,EAAE,GAAG;GACb;GACA;GACA;GACA;GACA,QAAQ;GACR,GAAG,YAAY;IAAE,aAAa,CAAE;IAAY,WAAW,CAAC,EAAE,WAAW,CAAE;;GACvE,GAAI,iBAAiB,EAAE,UAAU,cAAc,KAAK,QAAQ,EAAE;;;AAIlE,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"groups.js","names":[],"sources":["../../../src/Additio/from/groups.ts"],"sourcesContent":["import type { PrimaryGroup } from '../types/primary-groups';\nimport type { OutTypes } from './schedules';\n\nexport default function (\n primaryGroups: PrimaryGroup[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.group[] {\n return primaryGroups?.map(x => { return {\n ids: x.id.toString(),\n displayName: x.name,\n species: 'class',\n };}) ?? [];\n}\n"],"mappings":";AAGA,wBACE,eACA,cACA,gBACkB;AAClB,QAAO,eAAe,KAAI,MAAK;AAAE,SAAO;GACtC,KAAa,EAAE,GAAG,UAAU;GAC5B,aAAa,EAAE;GACf,SAAa;GACd;GAAG,IAAI,EAAE"}
1
+ {"version":3,"file":"groups.js","names":[],"sources":["../../../src/Additio/from/groups.ts"],"sourcesContent":["import type { PrimaryGroup } from '../types/primary-groups';\nimport type { OutTypes } from './schedules';\n\nexport default function (\n primaryGroups: PrimaryGroup[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.group[] {\n return primaryGroups?.map(x => { return {\n ids: x.id.toString(),\n displayName: x.name,\n species: 'class',\n };}) ?? [];\n}\n"],"mappings":";AAGA,wBACE,eACA,cACA,gBACkB;AAClB,QAAO,eAAe,KAAI,MAAK;AAAE,SAAO;GACtC,KAAa,EAAE,GAAG;GAClB,aAAa,EAAE;GACf,SAAa;;OACP"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_schedules"],"sources":["../../../src/Additio/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../common/types';\nimport _schedules from './schedules';\n\nexport default {\n schedules: _schedules\n} satisfies FromInterface;\n"],"mappings":";;;AAGA,mBAAe,EACb,WAAWA,mBACZ"}
1
+ {"version":3,"file":"index.js","names":["_schedules"],"sources":["../../../src/Additio/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../common/types';\nimport _schedules from './schedules';\n\nexport default {\n schedules: _schedules\n} satisfies FromInterface;\n"],"mappings":";;;AAGA,mBAAe,EACb,WAAWA"}
@@ -1 +1 @@
1
- {"version":3,"file":"locations.js","names":[],"sources":["../../../src/Additio/from/locations.ts"],"sourcesContent":["import type { Room } from '../types/rooms';\nimport type { OutTypes } from './schedules';\n\n\nexport default function (\n rooms: Room[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.location[] {\n return rooms?.map(room => { return {\n ids: room.id.toString(),\n displayName: room.name\n };}) ?? [];\n}\n"],"mappings":";AAIA,2BACE,OACA,cACA,gBACqB;AACrB,QAAO,OAAO,KAAI,SAAQ;AAAE,SAAO;GACjC,KAAa,KAAK,GAAG,UAAU;GAC/B,aAAa,KAAK;GACnB;GAAG,IAAI,EAAE"}
1
+ {"version":3,"file":"locations.js","names":[],"sources":["../../../src/Additio/from/locations.ts"],"sourcesContent":["import type { Room } from '../types/rooms';\nimport type { OutTypes } from './schedules';\n\n\nexport default function (\n rooms: Room[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.location[] {\n return rooms?.map(room => { return {\n ids: room.id.toString(),\n displayName: room.name\n };}) ?? [];\n}\n"],"mappings":";AAIA,2BACE,OACA,cACA,gBACqB;AACrB,QAAO,OAAO,KAAI,SAAQ;AAAE,SAAO;GACjC,KAAa,KAAK,GAAG;GACrB,aAAa,KAAK;;OACZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"persons.js","names":["personSet: Map<number, OutTypes.person>"],"sources":["../../../src/Additio/from/persons.ts"],"sourcesContent":["import type { User } from '../types/users';\nimport type { OutTypes } from './schedules';\n\nexport default function (\n users: User[] | undefined,\n groups: OutTypes.group[],\n importErrors: string[],\n importWarnings: string[]\n) {\n // add all persons to a set to remove duplicates\n const personSet: Map<number, OutTypes.person> = new Map();\n\n /*\n The reference to the group is different that the one in the primary_groups array.\n To solve this we create a map of all groups and use the id of the group as key. If\n the id is not found in the map, try to find a group with the same name.\n */\n const groupSet = new Map(groups.map(x => [x.displayName!, x.ids!]));\n\n users?.filter(x => x.role === 1).forEach(user => {\n const person = {\n ids: user.id.toString(),\n firstName: user.first_name,\n lastName: user.last_name,\n group: user.current_primary_group?.id?.toString(),\n ...user.email && {\n emails: [\n {\n value: user.email,\n type: 'organization'\n }\n ]\n }\n } satisfies OutTypes.person;\n\n if (user.current_primary_group) {\n const { id, name } = user.current_primary_group;\n if (groupSet.get(name.toString()) != person.group) {\n importWarnings.push(`The group of the user ${person.firstName} ${person.lastName} is not the same as the group in the primary_groups array.`);\n person.group = groupSet.get(name.toString()) ?? person.group;\n }\n }\n\n\n personSet.set(user.id, person);\n });\n\n return Array.from(personSet.values());\n}\n"],"mappings":";AAGA,yBACE,OACA,QACA,cACA,gBACA;CAEA,MAAMA,4BAA0C,IAAI,KAAK;CAOzD,MAAM,WAAW,IAAI,IAAI,OAAO,KAAI,MAAK,CAAC,EAAE,aAAc,EAAE,IAAK,CAAC,CAAC;AAEnE,QAAO,QAAO,MAAK,EAAE,SAAS,EAAE,CAAC,SAAQ,SAAQ;EAC/C,MAAM,SAAS;GACb,KAAW,KAAK,GAAG,UAAU;GAC7B,WAAW,KAAK;GAChB,UAAW,KAAK;GAChB,OAAW,KAAK,uBAAuB,IAAI,UAAU;GACrD,GAAG,KAAK,SAAS,EACf,QAAQ,CACN;IACE,OAAO,KAAK;IACZ,MAAO;IACR,CACF,EACF;GACF;AAED,MAAI,KAAK,uBAAuB;GAC9B,MAAM,EAAE,IAAI,SAAS,KAAK;AAC1B,OAAI,SAAS,IAAI,KAAK,UAAU,CAAC,IAAI,OAAO,OAAO;AACjD,mBAAe,KAAK,yBAAyB,OAAO,UAAU,GAAG,OAAO,SAAS,4DAA4D;AAC7I,WAAO,QAAQ,SAAS,IAAI,KAAK,UAAU,CAAC,IAAI,OAAO;;;AAK3D,YAAU,IAAI,KAAK,IAAI,OAAO;GAC9B;AAEF,QAAO,MAAM,KAAK,UAAU,QAAQ,CAAC"}
1
+ {"version":3,"file":"persons.js","names":["personSet: Map<number, OutTypes.person>"],"sources":["../../../src/Additio/from/persons.ts"],"sourcesContent":["import type { User } from '../types/users';\nimport type { OutTypes } from './schedules';\n\nexport default function (\n users: User[] | undefined,\n groups: OutTypes.group[],\n importErrors: string[],\n importWarnings: string[]\n) {\n // add all persons to a set to remove duplicates\n const personSet: Map<number, OutTypes.person> = new Map();\n\n /*\n The reference to the group is different that the one in the primary_groups array.\n To solve this we create a map of all groups and use the id of the group as key. If\n the id is not found in the map, try to find a group with the same name.\n */\n const groupSet = new Map(groups.map(x => [x.displayName!, x.ids!]));\n\n users?.filter(x => x.role === 1).forEach(user => {\n const person = {\n ids: user.id.toString(),\n firstName: user.first_name,\n lastName: user.last_name,\n group: user.current_primary_group?.id?.toString(),\n ...user.email && {\n emails: [\n {\n value: user.email,\n type: 'organization'\n }\n ]\n }\n } satisfies OutTypes.person;\n\n if (user.current_primary_group) {\n const { id, name } = user.current_primary_group;\n if (groupSet.get(name.toString()) != person.group) {\n importWarnings.push(`The group of the user ${person.firstName} ${person.lastName} is not the same as the group in the primary_groups array.`);\n person.group = groupSet.get(name.toString()) ?? person.group;\n }\n }\n\n\n personSet.set(user.id, person);\n });\n\n return Array.from(personSet.values());\n}\n"],"mappings":";AAGA,yBACE,OACA,QACA,cACA,gBACA;CAEA,MAAMA,4BAA0C,IAAI;CAOpD,MAAM,WAAW,IAAI,IAAI,OAAO,KAAI,MAAK,CAAC,EAAE,aAAc,EAAE;AAE5D,QAAO,QAAO,MAAK,EAAE,SAAS,GAAG,SAAQ,SAAQ;EAC/C,MAAM,SAAS;GACb,KAAW,KAAK,GAAG;GACnB,WAAW,KAAK;GAChB,UAAW,KAAK;GAChB,OAAW,KAAK,uBAAuB,IAAI;GAC3C,GAAG,KAAK,SAAS,EACf,QAAQ,CACN;IACE,OAAO,KAAK;IACZ,MAAO;;;AAMf,MAAI,KAAK,uBAAuB;GAC9B,MAAM,EAAE,IAAI,SAAS,KAAK;AAC1B,OAAI,SAAS,IAAI,KAAK,eAAe,OAAO,OAAO;AACjD,mBAAe,KAAK,yBAAyB,OAAO,UAAU,GAAG,OAAO,SAAS;AACjF,WAAO,QAAQ,SAAS,IAAI,KAAK,eAAe,OAAO;;;AAK3D,YAAU,IAAI,KAAK,IAAI;;AAGzB,QAAO,MAAM,KAAK,UAAU"}
@@ -1,6 +1,5 @@
1
1
  import { InternalIdKey } from "../../core/types/common/index.js";
2
2
  import { Types } from "../../core/types/index.js";
3
- import "../../core/index.js";
4
3
  import { Schedule } from "../types/schedules.js";
5
4
 
6
5
  //#region src/Additio/from/schedules.d.ts
@@ -15,13 +15,15 @@ function schedules_default(schedule) {
15
15
  const teachers = teachers_default(schedule.schedule_groups, schedule.lessons, errors, warnings);
16
16
  const groups = groups_default(schedule.primary_groups, errors, warnings);
17
17
  const courses = courses_default(schedule.schedule_groups, school, errors, warnings);
18
+ const events = events_default(schedule.lessons, courses, teachers, errors, warnings);
19
+ const persons = persons_default(schedule.users, groups, errors, warnings);
18
20
  return {
19
21
  locations,
20
22
  teachers,
21
23
  groups,
22
24
  courses,
23
- events: events_default(schedule.lessons, courses, teachers, errors, warnings),
24
- persons: persons_default(schedule.users, groups, errors, warnings),
25
+ events,
26
+ persons,
25
27
  meta: {
26
28
  ...errors.length ? { errors } : {},
27
29
  ...warnings.length ? { warnings } : {}
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":["errors: string[]","warnings: string[]","locations: OutTypes.location[]","_locations","teachers: OutTypes.teacher []","_teachers","groups: OutTypes.group []","_groups","courses: OutTypes.course []","_courses","_events","_persons"],"sources":["../../../src/Additio/from/schedules.ts"],"sourcesContent":["import type { Schedule } from '../types/schedules';\nimport _teachers from './teachers';\nimport _locations from './locations';\nimport _groups from './groups';\nimport _courses from './courses';\nimport _events from './events';\nimport _persons from './persons';\nimport type { CoreTypes } from '../../core';\nimport type { InternalIdKey } from '../../core/types/common';\n\n\nexport namespace OutTypes {\n export type location = Omit<CoreTypes.Serialized.Location, InternalIdKey>;\n export type teacher = Omit<CoreTypes.Serialized.Teacher, InternalIdKey>;\n export type group = Omit<CoreTypes.Serialized.Group, InternalIdKey>;\n export type course = Omit<CoreTypes.Serialized.Course, InternalIdKey>;\n export type event = Omit<CoreTypes.Serialized.Event, InternalIdKey>;\n export type person = Omit<CoreTypes.Serialized.Person, InternalIdKey>;\n};\n\nexport default function (\n schedule: Omit<Schedule, 'start_date' | 'end_date' | 'schedule' | 'school_year'>\n) {\n\n ////\n //// check the number of contained schools\n ////\n if (schedule.schools.length != 1) {\n return { meta: { errors: [`Received ${schedule.schools.length} number of schools: only a single school is allowed.`] } };\n }\n const school = schedule.schools[0];\n\n // gather all import related warnings/errors\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const locations: OutTypes.location[] = _locations(schedule.rooms, errors, warnings);\n const teachers: OutTypes.teacher [] = _teachers (schedule.schedule_groups, schedule.lessons, errors, warnings);\n const groups: OutTypes.group [] = _groups (schedule.primary_groups, errors, warnings);\n const courses: OutTypes.course [] = _courses (schedule.schedule_groups, school, errors, warnings);\n const events: OutTypes.event [] = _events (schedule.lessons, courses, teachers, errors, warnings);\n const persons: OutTypes.person [] = _persons (schedule.users, groups, errors, warnings);\n\n return { locations, teachers, groups, courses, events, persons,\n meta: {\n ...( errors.length ? { errors } : { } ),\n ...( warnings.length ? { warnings } : { } )\n }\n };\n}\n"],"mappings":";;;;;;;;AAoBA,2BACE,UACA;AAKA,KAAI,SAAS,QAAQ,UAAU,EAC7B,QAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,SAAS,QAAQ,OAAO,sDAAsD,EAAE,EAAE;CAE1H,MAAM,SAAS,SAAS,QAAQ;CAGhC,MAAMA,SAAqB,EAAE;CAC7B,MAAMC,WAAqB,EAAE;CAE7B,MAAMC,YAAiCC,kBAAW,SAAS,OAAmC,QAAQ,SAAS;CAC/G,MAAMC,WAAiCC,iBAAW,SAAS,iBAAiB,SAAS,SAAS,QAAQ,SAAS;CAC/G,MAAMC,SAAiCC,eAAW,SAAS,gBAAmC,QAAQ,SAAS;CAC/G,MAAMC,UAAiCC,gBAAW,SAAS,iBAAiB,QAAkB,QAAQ,SAAS;AAI/G,QAAO;EAAE;EAAW;EAAU;EAAQ;EAAS,QAHRC,eAAW,SAAS,SAAS,SAAS,UAAiB,QAAQ,SAAS;EAGxD,SAFhBC,gBAAW,SAAS,OAAO,QAA4B,QAAQ,SAAS;EAG7G,MAAM;GACJ,GAAK,OAAO,SAAW,EAAE,QAAQ,GAAK,EAAG;GACzC,GAAK,SAAS,SAAS,EAAE,UAAU,GAAG,EAAG;GAC1C;EACF"}
1
+ {"version":3,"file":"schedules.js","names":["errors: string[]","warnings: string[]","locations: OutTypes.location[]","_locations","teachers: OutTypes.teacher []","_teachers","groups: OutTypes.group []","_groups","courses: OutTypes.course []","_courses","events: OutTypes.event []","_events","persons: OutTypes.person []","_persons"],"sources":["../../../src/Additio/from/schedules.ts"],"sourcesContent":["import type { Schedule } from '../types/schedules';\nimport _teachers from './teachers';\nimport _locations from './locations';\nimport _groups from './groups';\nimport _courses from './courses';\nimport _events from './events';\nimport _persons from './persons';\nimport type { CoreTypes } from '../../core';\nimport type { InternalIdKey } from '../../core/types/common';\n\n\nexport namespace OutTypes {\n export type location = Omit<CoreTypes.Serialized.Location, InternalIdKey>;\n export type teacher = Omit<CoreTypes.Serialized.Teacher, InternalIdKey>;\n export type group = Omit<CoreTypes.Serialized.Group, InternalIdKey>;\n export type course = Omit<CoreTypes.Serialized.Course, InternalIdKey>;\n export type event = Omit<CoreTypes.Serialized.Event, InternalIdKey>;\n export type person = Omit<CoreTypes.Serialized.Person, InternalIdKey>;\n};\n\nexport default function (\n schedule: Omit<Schedule, 'start_date' | 'end_date' | 'schedule' | 'school_year'>\n) {\n\n ////\n //// check the number of contained schools\n ////\n if (schedule.schools.length != 1) {\n return { meta: { errors: [`Received ${schedule.schools.length} number of schools: only a single school is allowed.`] } };\n }\n const school = schedule.schools[0];\n\n // gather all import related warnings/errors\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const locations: OutTypes.location[] = _locations(schedule.rooms, errors, warnings);\n const teachers: OutTypes.teacher [] = _teachers (schedule.schedule_groups, schedule.lessons, errors, warnings);\n const groups: OutTypes.group [] = _groups (schedule.primary_groups, errors, warnings);\n const courses: OutTypes.course [] = _courses (schedule.schedule_groups, school, errors, warnings);\n const events: OutTypes.event [] = _events (schedule.lessons, courses, teachers, errors, warnings);\n const persons: OutTypes.person [] = _persons (schedule.users, groups, errors, warnings);\n\n return { locations, teachers, groups, courses, events, persons,\n meta: {\n ...( errors.length ? { errors } : { } ),\n ...( warnings.length ? { warnings } : { } )\n }\n };\n}\n"],"mappings":";;;;;;;;AAoBA,2BACE,UACA;AAKA,KAAI,SAAS,QAAQ,UAAU,EAC7B,QAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,SAAS,QAAQ,OAAO;CAEhE,MAAM,SAAS,SAAS,QAAQ;CAGhC,MAAMA,SAAqB;CAC3B,MAAMC,WAAqB;CAE3B,MAAMC,YAAiCC,kBAAW,SAAS,OAAmC,QAAQ;CACtG,MAAMC,WAAiCC,iBAAW,SAAS,iBAAiB,SAAS,SAAS,QAAQ;CACtG,MAAMC,SAAiCC,eAAW,SAAS,gBAAmC,QAAQ;CACtG,MAAMC,UAAiCC,gBAAW,SAAS,iBAAiB,QAAkB,QAAQ;CACtG,MAAMC,SAAiCC,eAAW,SAAS,SAAS,SAAS,UAAiB,QAAQ;CACtG,MAAMC,UAAiCC,gBAAW,SAAS,OAAO,QAA4B,QAAQ;AAEtG,QAAO;EAAE;EAAW;EAAU;EAAQ;EAAS;EAAQ;EACrD,MAAM;GACJ,GAAK,OAAO,SAAW,EAAE,WAAa;GACtC,GAAK,SAAS,SAAS,EAAE,aAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"teachers.js","names":["teacherSet: Map<number, OutTypes.teacher>"],"sources":["../../../src/Additio/from/teachers.ts"],"sourcesContent":["import type { ScheduleGroup } from '../types/schedule-groups';\nimport type { Lesson } from '../types/lessons';\nimport type { OutTypes } from './schedules';\n\nexport default function (\n scheduleGroups: ScheduleGroup[] | undefined,\n lessons: Lesson[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.teacher[] {\n // add all teachers to a set to remove duplicates\n const teacherSet: Map<number, OutTypes.teacher> = new Map();\n\n scheduleGroups?.forEach(scheduleGroup => {\n scheduleGroup.teachers?.forEach(teacher => {\n teacherSet.set(teacher.id, {\n ids: teacher.id.toString(),\n displayName: teacher.first_name + ' ' + teacher.last_name\n });\n });\n });\n\n lessons?.forEach(lesson => {\n lesson.teachers?.forEach(teacher => {\n teacherSet.set(teacher.id, {\n ids: teacher.id.toString(),\n displayName: teacher.first_name + ' ' + teacher.last_name\n });\n });\n });\n\n return Array.from(teacherSet.values());\n}\n"],"mappings":";AAIA,0BACE,gBACA,SACA,cACA,gBACoB;CAEpB,MAAMA,6BAA4C,IAAI,KAAK;AAE3D,iBAAgB,SAAQ,kBAAiB;AACvC,gBAAc,UAAU,SAAQ,YAAW;AACzC,cAAW,IAAI,QAAQ,IAAI;IACzB,KAAa,QAAQ,GAAG,UAAU;IAClC,aAAa,QAAQ,aAAa,MAAM,QAAQ;IACjD,CAAC;IACF;GACF;AAEF,UAAS,SAAQ,WAAU;AACzB,SAAO,UAAU,SAAQ,YAAW;AAClC,cAAW,IAAI,QAAQ,IAAI;IACzB,KAAa,QAAQ,GAAG,UAAU;IAClC,aAAa,QAAQ,aAAa,MAAM,QAAQ;IACjD,CAAC;IACF;GACF;AAEF,QAAO,MAAM,KAAK,WAAW,QAAQ,CAAC"}
1
+ {"version":3,"file":"teachers.js","names":["teacherSet: Map<number, OutTypes.teacher>"],"sources":["../../../src/Additio/from/teachers.ts"],"sourcesContent":["import type { ScheduleGroup } from '../types/schedule-groups';\nimport type { Lesson } from '../types/lessons';\nimport type { OutTypes } from './schedules';\n\nexport default function (\n scheduleGroups: ScheduleGroup[] | undefined,\n lessons: Lesson[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.teacher[] {\n // add all teachers to a set to remove duplicates\n const teacherSet: Map<number, OutTypes.teacher> = new Map();\n\n scheduleGroups?.forEach(scheduleGroup => {\n scheduleGroup.teachers?.forEach(teacher => {\n teacherSet.set(teacher.id, {\n ids: teacher.id.toString(),\n displayName: teacher.first_name + ' ' + teacher.last_name\n });\n });\n });\n\n lessons?.forEach(lesson => {\n lesson.teachers?.forEach(teacher => {\n teacherSet.set(teacher.id, {\n ids: teacher.id.toString(),\n displayName: teacher.first_name + ' ' + teacher.last_name\n });\n });\n });\n\n return Array.from(teacherSet.values());\n}\n"],"mappings":";AAIA,0BACE,gBACA,SACA,cACA,gBACoB;CAEpB,MAAMA,6BAA4C,IAAI;AAEtD,iBAAgB,SAAQ,kBAAiB;AACvC,gBAAc,UAAU,SAAQ,YAAW;AACzC,cAAW,IAAI,QAAQ,IAAI;IACzB,KAAa,QAAQ,GAAG;IACxB,aAAa,QAAQ,aAAa,MAAM,QAAQ;;;;AAKtD,UAAS,SAAQ,WAAU;AACzB,SAAO,UAAU,SAAQ,YAAW;AAClC,cAAW,IAAI,QAAQ,IAAI;IACzB,KAAa,QAAQ,GAAG;IACxB,aAAa,QAAQ,aAAa,MAAM,QAAQ;;;;AAKtD,QAAO,MAAM,KAAK,WAAW"}
@@ -1,8 +1,6 @@
1
1
  import { Types } from "../../core/types/index.js";
2
2
  import { Types as Types$1 } from "../types/index.js";
3
- import "../index.js";
4
- import "../../index.js";
5
- import * as xlsx1 from "xlsx";
3
+ import * as xlsx0 from "xlsx";
6
4
 
7
5
  //#region src/Additio/to/index.d.ts
8
6
  declare class export_default {
@@ -16,7 +14,7 @@ declare class export_default {
16
14
  courses: Types.Mixed.Course[];
17
15
  events: Types.Mixed.Event[];
18
16
  lockedTimes: Types.Mixed.LockedTime[];
19
- }, _options?: Types$1.options) => xlsx1.WorkBook;
17
+ }, _options?: Types$1.options) => xlsx0.WorkBook;
20
18
  }
21
19
  //#endregion
22
20
  export { export_default };
@@ -61,7 +61,7 @@ var schedules_default = (schedule, _options = {}) => {
61
61
  const locations = (event.inLocations ?? []).map((x) => x ? locationsMap.get(getVertexId(x, options)) : null).filter((x) => !!x);
62
62
  const teachers = (event.teachers ?? course.teachers ?? []).map((x) => teachersMap.get(getVertexId(x.to, options))).filter((x) => !!x);
63
63
  const groups = (event.groups ?? course.groups ?? []).map((x) => groupsMap.get(getVertexId(x.to, options))).filter((x) => !!x);
64
- return {
64
+ const out = {
65
65
  id: getVertexId(event, options),
66
66
  externalid: event.ids?.toString(),
67
67
  groupid: course.ids,
@@ -78,6 +78,7 @@ var schedules_default = (schedule, _options = {}) => {
78
78
  classid: groups.map((x) => x.ids).join(", "),
79
79
  class: groups.map((x) => x.displayName).join(", ")
80
80
  };
81
+ return out;
81
82
  }).filter((x) => x != null);
82
83
  const complementaryTimes = (options.includeComplementaryTimes ?? true ? schedule.lockedTimes : []).filter((x) => x.type == "COMPLEMENTARY_TIME").map((lockedTime) => {
83
84
  if (lockedTime.parked) return;
@@ -87,7 +88,7 @@ var schedules_default = (schedule, _options = {}) => {
87
88
  const teachers = (lockedTime.coalesced ?? []).filter((x) => x.toModel == "teachers").map((x) => teachersMap.get(getVertexId(x.to, options))).filter((x) => !!x);
88
89
  const subject = lockedTime.tags?.find((x) => x.type == "COMPLEMENTARY_TIME")?.value;
89
90
  const inweek = inWeeksMap.get(void 0);
90
- return {
91
+ const out = {
91
92
  id: getVertexId(lockedTime, options),
92
93
  dayid: (start.day() + 6) % 7,
93
94
  startTime: start.format("HHmm"),
@@ -97,6 +98,7 @@ var schedules_default = (schedule, _options = {}) => {
97
98
  teacherid: teachers.map((x) => x.ids).join(", "),
98
99
  teacher: teachers.map((x) => x.displayName).join(", ")
99
100
  };
101
+ return out;
100
102
  }).filter((x) => !!x);
101
103
  const wb = XLSX.utils.book_new();
102
104
  const sheet = XLSX.utils.json_to_sheet([...events, ...complementaryTimes], { header });
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":["header: (keyof Required<OutEvent>)[]","weeks"],"sources":["../../../src/Additio/to/schedules.ts"],"sourcesContent":["import XLSX from 'xlsx';\nimport moment from 'moment';\nimport { getDayIndex, getVertexId } from '../../core/util';\nimport type { BaseOptions } from '../../common/types';\nimport type { Types as CoreTypes } from '../../core/types';\nimport type { Types } from '../types';\n\ntype OutEvent = {\n id?: string;\n externalid?: string;\n groupid?: string;\n group?: string;\n dayid?: number;\n startTime?: string;\n length?: number;\n subject?: string;\n roomid?: string;\n room?: string;\n teacherid?: string;\n teacher?: string;\n classid?: string;\n class?: string;\n inweek?: string;\n};\n\n/**\n * Specifies the header and the order of the columns in the exported Excel file.\n */\nconst header: (keyof Required<OutEvent>)[] = [\n 'id',\n 'externalid',\n 'groupid',\n 'group',\n 'dayid',\n 'startTime',\n 'length',\n 'subject',\n 'inweek',\n 'roomid',\n 'room',\n 'teacherid',\n 'teacher',\n 'classid',\n 'class'\n];\n\ntype Schedule = {\n division: CoreTypes.Mixed.Division;\n settings: CoreTypes.Mixed.Settings;\n periods: CoreTypes.Mixed.Period[];\n locations: CoreTypes.Mixed.Location[];\n groups: CoreTypes.Mixed.Group[];\n teachers: CoreTypes.Mixed.Teacher[];\n courses: CoreTypes.Mixed.Course[];\n events: CoreTypes.Mixed.Event[];\n lockedTimes: CoreTypes.Mixed.LockedTime[];\n};\n\n\nexport default (\n schedule: Schedule,\n _options: Types.options = { }\n): XLSX.WorkBook => {\n const options = _options as BaseOptions & Types.options;\n\n // a map of period.id -> period\n const periodsMap = new Map(schedule.periods.map(x => [getVertexId(x, options) as string | undefined, x as Pick<typeof x, 'ranges'>] as const));\n periodsMap.set(undefined, { ranges: [{ start: schedule.division.start, end: schedule.division.end }] });\n\n // a map of period.id -> inWeeks\n const inWeeksMap = new Map<string | undefined, string>();\n periodsMap.forEach((period, id) => {\n const weeks = period.ranges\n .map(x => {\n // fetch all weeks between start and end\n const start = moment.utc(x.start);\n const end = moment.utc(x.end);\n const weeks = new Array<number>();\n while (start.isBefore(end)) {\n weeks.push(start.week());\n start.add(1, 'week');\n }\n return weeks;\n })\n .flat()\n .join(', ');\n\n inWeeksMap.set(id, weeks);\n });\n\n // a map of location.id -> location\n const locationsMap = new Map(schedule.locations.map(x => [getVertexId(x, options), x] as const));\n\n // a map of group.id -> group\n const groupsMap = new Map(schedule.groups.map(x => [getVertexId(x, options), x] as const));\n\n // a map of teacher.id -> teacher\n const teachersMap = new Map(schedule.teachers.map(x => [getVertexId(x, options), x] as const));\n\n // a map of course.id -> course\n const coursesMap = new Map(schedule.courses.map(x => [getVertexId(x, options), x] as const));\n\n\n const events = (options.includeEvents ?? true ? schedule.events : [])\n .map(event => {\n // ignore parked events\n if (event.parked) return;\n if (!event.start || !event.end) return;\n\n // must have a course\n const course = event.course ? coursesMap.get(getVertexId(event.course, options)) : undefined;\n if (!course) return;\n\n const start = moment.utc(event.start);\n const end = moment.utc(event.end);\n\n const period = event.period ?? course.period ?? schedule.settings.period;\n const periodId = period ? getVertexId(period, options) : undefined;\n const inWeeks = inWeeksMap.get(periodId);\n\n const locations = (event.inLocations ?? []).map(x => x ? locationsMap.get(getVertexId(x, options)) : null).filter(x => !!x);\n const teachers = (event.teachers ?? course.teachers ?? []).map(x => teachersMap .get(getVertexId(x.to, options)) ).filter(x => !!x);\n const groups = (event.groups ?? course.groups ?? []).map(x => groupsMap .get(getVertexId(x.to, options)) ).filter(x => !!x);\n\n const out: OutEvent = {\n id: getVertexId(event, options),\n externalid: event.ids?.toString(),\n groupid: course.ids,\n group: course.displayName,\n dayid: getDayIndex(start),\n startTime: start.format('HHmm'),\n length: end.diff(start, 'minutes'),\n subject: course.subject,\n inweek: inWeeks,\n roomid: locations.map(x => x.ids ).join(', '),\n room: locations.map(x => x.displayName).join(', '),\n teacherid: teachers .map(x => x.ids ).join(', '),\n teacher: teachers .map(x => x.displayName).join(', '),\n classid: groups .map(x => x.ids ).join(', '),\n class: groups .map(x => x.displayName).join(', ')\n };\n return out;\n })\n .filter(x => x != null);\n\n const complementaryTimes = (options.includeComplementaryTimes ?? true ? schedule.lockedTimes : [])\n .filter(x => x.type == 'COMPLEMENTARY_TIME')\n .map(lockedTime => {\n // ignore parked events\n if (lockedTime.parked) return;\n if (!lockedTime.start || !lockedTime.end) return;\n\n const start = moment.utc(lockedTime.start);\n const end = moment.utc(lockedTime.end);\n\n const teachers = (lockedTime.coalesced ?? [])\n .filter(x => x.toModel == 'teachers')\n .map(x => teachersMap.get(getVertexId(x.to, options)))\n .filter(x => !!x);\n\n const subject = lockedTime.tags?.find(x => x.type == 'COMPLEMENTARY_TIME')?.value;\n\n // the full schedule range\n const inweek = inWeeksMap.get(undefined);\n\n const out: OutEvent = {\n id: getVertexId(lockedTime, options),\n dayid: (start.day() + 6) % 7,\n startTime: start.format('HHmm'),\n length: end.diff(start, 'minutes'),\n subject: subject,\n inweek: inweek,\n teacherid: teachers .map(x => x.ids ).join(', '),\n teacher: teachers .map(x => x.displayName).join(', '),\n };\n return out;\n })\n .filter(x => !!x);\n\n const wb = XLSX.utils.book_new();\n\n const sheet = XLSX.utils.json_to_sheet([...events, ...complementaryTimes], { header });\n XLSX.utils.book_append_sheet(wb, sheet, 'royal schedule export');\n\n return wb;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"schedules.js","names":["header: (keyof Required<OutEvent>)[]","weeks","out: OutEvent"],"sources":["../../../src/Additio/to/schedules.ts"],"sourcesContent":["import XLSX from 'xlsx';\nimport moment from 'moment';\nimport { getDayIndex, getVertexId } from '../../core/util';\nimport type { BaseOptions } from '../../common/types';\nimport type { Types as CoreTypes } from '../../core/types';\nimport type { Types } from '../types';\n\ntype OutEvent = {\n id?: string;\n externalid?: string;\n groupid?: string;\n group?: string;\n dayid?: number;\n startTime?: string;\n length?: number;\n subject?: string;\n roomid?: string;\n room?: string;\n teacherid?: string;\n teacher?: string;\n classid?: string;\n class?: string;\n inweek?: string;\n};\n\n/**\n * Specifies the header and the order of the columns in the exported Excel file.\n */\nconst header: (keyof Required<OutEvent>)[] = [\n 'id',\n 'externalid',\n 'groupid',\n 'group',\n 'dayid',\n 'startTime',\n 'length',\n 'subject',\n 'inweek',\n 'roomid',\n 'room',\n 'teacherid',\n 'teacher',\n 'classid',\n 'class'\n];\n\ntype Schedule = {\n division: CoreTypes.Mixed.Division;\n settings: CoreTypes.Mixed.Settings;\n periods: CoreTypes.Mixed.Period[];\n locations: CoreTypes.Mixed.Location[];\n groups: CoreTypes.Mixed.Group[];\n teachers: CoreTypes.Mixed.Teacher[];\n courses: CoreTypes.Mixed.Course[];\n events: CoreTypes.Mixed.Event[];\n lockedTimes: CoreTypes.Mixed.LockedTime[];\n};\n\n\nexport default (\n schedule: Schedule,\n _options: Types.options = { }\n): XLSX.WorkBook => {\n const options = _options as BaseOptions & Types.options;\n\n // a map of period.id -> period\n const periodsMap = new Map(schedule.periods.map(x => [getVertexId(x, options) as string | undefined, x as Pick<typeof x, 'ranges'>] as const));\n periodsMap.set(undefined, { ranges: [{ start: schedule.division.start, end: schedule.division.end }] });\n\n // a map of period.id -> inWeeks\n const inWeeksMap = new Map<string | undefined, string>();\n periodsMap.forEach((period, id) => {\n const weeks = period.ranges\n .map(x => {\n // fetch all weeks between start and end\n const start = moment.utc(x.start);\n const end = moment.utc(x.end);\n const weeks = new Array<number>();\n while (start.isBefore(end)) {\n weeks.push(start.week());\n start.add(1, 'week');\n }\n return weeks;\n })\n .flat()\n .join(', ');\n\n inWeeksMap.set(id, weeks);\n });\n\n // a map of location.id -> location\n const locationsMap = new Map(schedule.locations.map(x => [getVertexId(x, options), x] as const));\n\n // a map of group.id -> group\n const groupsMap = new Map(schedule.groups.map(x => [getVertexId(x, options), x] as const));\n\n // a map of teacher.id -> teacher\n const teachersMap = new Map(schedule.teachers.map(x => [getVertexId(x, options), x] as const));\n\n // a map of course.id -> course\n const coursesMap = new Map(schedule.courses.map(x => [getVertexId(x, options), x] as const));\n\n\n const events = (options.includeEvents ?? true ? schedule.events : [])\n .map(event => {\n // ignore parked events\n if (event.parked) return;\n if (!event.start || !event.end) return;\n\n // must have a course\n const course = event.course ? coursesMap.get(getVertexId(event.course, options)) : undefined;\n if (!course) return;\n\n const start = moment.utc(event.start);\n const end = moment.utc(event.end);\n\n const period = event.period ?? course.period ?? schedule.settings.period;\n const periodId = period ? getVertexId(period, options) : undefined;\n const inWeeks = inWeeksMap.get(periodId);\n\n const locations = (event.inLocations ?? []).map(x => x ? locationsMap.get(getVertexId(x, options)) : null).filter(x => !!x);\n const teachers = (event.teachers ?? course.teachers ?? []).map(x => teachersMap .get(getVertexId(x.to, options)) ).filter(x => !!x);\n const groups = (event.groups ?? course.groups ?? []).map(x => groupsMap .get(getVertexId(x.to, options)) ).filter(x => !!x);\n\n const out: OutEvent = {\n id: getVertexId(event, options),\n externalid: event.ids?.toString(),\n groupid: course.ids,\n group: course.displayName,\n dayid: getDayIndex(start),\n startTime: start.format('HHmm'),\n length: end.diff(start, 'minutes'),\n subject: course.subject,\n inweek: inWeeks,\n roomid: locations.map(x => x.ids ).join(', '),\n room: locations.map(x => x.displayName).join(', '),\n teacherid: teachers .map(x => x.ids ).join(', '),\n teacher: teachers .map(x => x.displayName).join(', '),\n classid: groups .map(x => x.ids ).join(', '),\n class: groups .map(x => x.displayName).join(', ')\n };\n return out;\n })\n .filter(x => x != null);\n\n const complementaryTimes = (options.includeComplementaryTimes ?? true ? schedule.lockedTimes : [])\n .filter(x => x.type == 'COMPLEMENTARY_TIME')\n .map(lockedTime => {\n // ignore parked events\n if (lockedTime.parked) return;\n if (!lockedTime.start || !lockedTime.end) return;\n\n const start = moment.utc(lockedTime.start);\n const end = moment.utc(lockedTime.end);\n\n const teachers = (lockedTime.coalesced ?? [])\n .filter(x => x.toModel == 'teachers')\n .map(x => teachersMap.get(getVertexId(x.to, options)))\n .filter(x => !!x);\n\n const subject = lockedTime.tags?.find(x => x.type == 'COMPLEMENTARY_TIME')?.value;\n\n // the full schedule range\n const inweek = inWeeksMap.get(undefined);\n\n const out: OutEvent = {\n id: getVertexId(lockedTime, options),\n dayid: (start.day() + 6) % 7,\n startTime: start.format('HHmm'),\n length: end.diff(start, 'minutes'),\n subject: subject,\n inweek: inweek,\n teacherid: teachers .map(x => x.ids ).join(', '),\n teacher: teachers .map(x => x.displayName).join(', '),\n };\n return out;\n })\n .filter(x => !!x);\n\n const wb = XLSX.utils.book_new();\n\n const sheet = XLSX.utils.json_to_sheet([...events, ...complementaryTimes], { header });\n XLSX.utils.book_append_sheet(wb, sheet, 'royal schedule export');\n\n return wb;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"courses.js","names":["courses: OutTypes.course[]","uuid"],"sources":["../../../src/Admentum/from/courses.ts"],"sourcesContent":["import { v4 as uuid } from 'uuid';\nimport type { ScheduleGroup } from '../types/schedule-groups';\nimport type { School } from '../types/schools';\nimport type { OutTypes } from './schedules';\n\n\nexport default function (\n scheduledGroups: ScheduleGroup[] | undefined,\n school: School,\n courseMap: Map<number, OutTypes.course[]>,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.course[] {\n\n const courses: OutTypes.course[] = [];\n\n scheduledGroups?.forEach(scheduledGroup => {\n\n ////\n //// check number of subjects/courses\n ////\n const subjects = school.school_type == 'GR' ? scheduledGroup.subjects : scheduledGroup.courses;\n // Nikos takes full responsibility for this line of code and the decision to allow multiple subjects per schedule group, which is a scenario that we have observed in the wild but that we do not fully understand the implications of.\n for (const subject of subjects) {\n ////\n //// check number of teachers\n ////\n if (scheduledGroup.teachers?.length == 0) {\n const warn = `The schedule group \"${scheduledGroup.name}\" with id \"${scheduledGroup.id}\" did not contain any teachers.`;\n importWarnings.push(warn);\n }\n\n const id = scheduledGroup.id;\n // generate a uuid since admentum id is degenerate now when we have multiple subjects per schedule group\n const ids = uuid();\n if (!courseMap.has(id)) {\n courseMap.set(id, []);\n }\n\n const course ={\n ids,\n displayName: scheduledGroup.name,\n subject: subject.name,\n groups: scheduledGroup.users_primary_groups.map(x => ({ to: x.toString() })),\n teachers: scheduledGroup.teachers?.map(x => ({ to: x.id.toString() }))\n } satisfies OutTypes.course;\n\n courseMap.get(id)?.push(course);\n\n courses.push(course);\n }\n });\n\n return courses;\n}\n"],"mappings":";;;AAMA,yBACE,iBACA,QACA,WACA,cACA,gBACmB;CAEnB,MAAMA,UAA6B,EAAE;AAErC,kBAAiB,SAAQ,mBAAkB;EAKzC,MAAM,WAAW,OAAO,eAAe,OAAO,eAAe,WAAW,eAAe;AAEvF,OAAK,MAAM,WAAW,UAAU;AAI9B,OAAI,eAAe,UAAU,UAAU,GAAG;IACxC,MAAM,OAAO,uBAAuB,eAAe,KAAK,aAAa,eAAe,GAAG;AACvF,mBAAe,KAAK,KAAK;;GAG3B,MAAM,KAAK,eAAe;GAE1B,MAAM,MAAMC,IAAM;AAClB,OAAI,CAAC,UAAU,IAAI,GAAG,CACpB,WAAU,IAAI,IAAI,EAAE,CAAC;GAGvB,MAAM,SAAQ;IACZ;IACA,aAAa,eAAe;IAC5B,SAAa,QAAQ;IACrB,QAAa,eAAe,qBAAqB,KAAI,OAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;IACjF,UAAa,eAAe,UAAU,KAAI,OAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,EAAE;IAC1E;AAED,aAAU,IAAI,GAAG,EAAE,KAAK,OAAO;AAE/B,WAAQ,KAAK,OAAO;;GAEtB;AAEF,QAAO"}
1
+ {"version":3,"file":"courses.js","names":["courses: OutTypes.course[]","uuid"],"sources":["../../../src/Admentum/from/courses.ts"],"sourcesContent":["import { v4 as uuid } from 'uuid';\nimport type { ScheduleGroup } from '../types/schedule-groups';\nimport type { School } from '../types/schools';\nimport type { OutTypes } from './schedules';\n\n\nexport default function (\n scheduledGroups: ScheduleGroup[] | undefined,\n school: School,\n courseMap: Map<number, OutTypes.course[]>,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.course[] {\n\n const courses: OutTypes.course[] = [];\n\n scheduledGroups?.forEach(scheduledGroup => {\n\n ////\n //// check number of subjects/courses\n ////\n const subjects = school.school_type == 'GR' ? scheduledGroup.subjects : scheduledGroup.courses;\n // Nikos takes full responsibility for this line of code and the decision to allow multiple subjects per schedule group, which is a scenario that we have observed in the wild but that we do not fully understand the implications of.\n for (const subject of subjects) {\n ////\n //// check number of teachers\n ////\n if (scheduledGroup.teachers?.length == 0) {\n const warn = `The schedule group \"${scheduledGroup.name}\" with id \"${scheduledGroup.id}\" did not contain any teachers.`;\n importWarnings.push(warn);\n }\n\n const id = scheduledGroup.id;\n // generate a uuid since admentum id is degenerate now when we have multiple subjects per schedule group\n const ids = uuid();\n if (!courseMap.has(id)) {\n courseMap.set(id, []);\n }\n\n const course ={\n ids,\n displayName: scheduledGroup.name,\n subject: subject.name,\n groups: scheduledGroup.users_primary_groups.map(x => ({ to: x.toString() })),\n teachers: scheduledGroup.teachers?.map(x => ({ to: x.id.toString() }))\n } satisfies OutTypes.course;\n\n courseMap.get(id)?.push(course);\n\n courses.push(course);\n }\n });\n\n return courses;\n}\n"],"mappings":";;;AAMA,yBACE,iBACA,QACA,WACA,cACA,gBACmB;CAEnB,MAAMA,UAA6B;AAEnC,kBAAiB,SAAQ,mBAAkB;EAKzC,MAAM,WAAW,OAAO,eAAe,OAAO,eAAe,WAAW,eAAe;AAEvF,OAAK,MAAM,WAAW,UAAU;AAI9B,OAAI,eAAe,UAAU,UAAU,GAAG;IACxC,MAAM,OAAO,uBAAuB,eAAe,KAAK,aAAa,eAAe,GAAG;AACvF,mBAAe,KAAK;;GAGtB,MAAM,KAAK,eAAe;GAE1B,MAAM,MAAMC;AACZ,OAAI,CAAC,UAAU,IAAI,IACjB,WAAU,IAAI,IAAI;GAGpB,MAAM,SAAQ;IACZ;IACA,aAAa,eAAe;IAC5B,SAAa,QAAQ;IACrB,QAAa,eAAe,qBAAqB,KAAI,OAAM,EAAE,IAAI,EAAE;IACnE,UAAa,eAAe,UAAU,KAAI,OAAM,EAAE,IAAI,EAAE,GAAG;;AAG7D,aAAU,IAAI,KAAK,KAAK;AAExB,WAAQ,KAAK;;;AAIjB,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","names":["events: OutTypes.event[]","eventTeachers: string[] | undefined"],"sources":["../../../src/Admentum/from/events.ts"],"sourcesContent":["\nimport moment from 'moment';\nimport type { Lesson } from '../types/lessons';\nimport type { OutTypes } from './schedules';\n\nconst firstDay = moment.utc('1970-01-05');\n\nfunction fromTimeString (\n day: number,\n timeString: string\n): moment.Moment {\n const [hours, minutes] = timeString.split(':').map((time: string) => parseInt(time));\n return firstDay.clone().add(day, 'day')\n .set('hour', hours)\n .set('minute', minutes);\n}\n\nexport default function (\n lessons: Lesson[] | undefined,\n courseMap: Map<number, OutTypes.course[]>,\n teachers: OutTypes.teacher[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.event[] {\n\n // create teacher set for quick lookup\n const teacherSet = new Set<string>();\n teachers?.forEach(t => teacherSet.add(t.ids!));\n\n const events: OutTypes.event[] = [];\n lessons?.forEach(l => {\n\n // Nikos takes full responsibility for this line of code\n groupScope: for (const group of l.info.groups ?? []) {\n if (!courseMap.has(group.id)) {\n const warn = `The lesson with id \"${l.id}\" referenced the unknown/faulty schedule_group (course) \"${group.id}\" and was therefore ignored.`;\n importWarnings.push(warn);\n continue groupScope;\n }\n const courses = courseMap.get(group.id);\n\n if (!courses?.length) {\n const warn = `The lesson with id \"${l.id}\" referenced the unknown/faulty schedule_group (course) \"${group.id}\" and was therefore ignored.`;\n importWarnings.push(warn);\n continue groupScope;\n }\n\n const start = fromTimeString(l.weekday, l.info.start);\n const end = fromTimeString(l.weekday, l.info.end);\n const preferredDuration = l.info.duration;\n const duration = l.info.duration;\n\n for (const course of courses) {\n // store only teachers if they mismatch teachers of parent course\n let eventTeachers: string[] | undefined;\n if (!course.teachers || !course.teachers?.every(x => l.info.teachers?.some(y => y.id.toString() == x.to))) {\n eventTeachers = l.info.teachers?.map(x => x.id.toString());\n\n // ensure that the teachers exist\n for (const teacher of eventTeachers ?? []) {\n if (!teacherSet.has(teacher)) {\n const warn = `The lesson with id \"${l.id}\" referenced the unknown teacher \"${teacher}\" and was therefore ignored.`;\n importWarnings.push(warn);\n continue groupScope;\n }\n }\n }\n\n // location\n const location = l.info.room?.id.toString();\n\n events.push({\n ids: l.id.toString(),\n start,\n end,\n preferredDuration,\n duration,\n course: course.ids,\n ...location && { inLocations: [ location ], locations: [{ locations: [ location ] }] },\n ...(eventTeachers && { teachers: eventTeachers.map((to) => ({ to })) })\n } satisfies OutTypes.event);\n }\n }\n });\n\n return events;\n}\n"],"mappings":";;;AAKA,MAAM,WAAW,OAAO,IAAI,aAAa;AAEzC,SAAS,eACP,KACA,YACe;CACf,MAAM,CAAC,OAAO,WAAW,WAAW,MAAM,IAAI,CAAC,KAAK,SAAiB,SAAS,KAAK,CAAC;AACpF,QAAO,SAAS,OAAO,CAAC,IAAI,KAAK,MAAM,CACpC,IAAI,QAAQ,MAAM,CAClB,IAAI,UAAU,QAAQ;;AAG3B,wBACE,SACA,WACA,UACA,cACA,gBACkB;CAGlB,MAAM,6BAAa,IAAI,KAAa;AACpC,WAAU,SAAQ,MAAK,WAAW,IAAI,EAAE,IAAK,CAAC;CAE9C,MAAMA,SAA2B,EAAE;AACnC,UAAS,SAAQ,MAAK;AAGpB,aAAY,MAAK,MAAM,SAAS,EAAE,KAAK,UAAU,EAAE,EAAE;AACnD,OAAI,CAAC,UAAU,IAAI,MAAM,GAAG,EAAE;IAC5B,MAAM,OAAO,uBAAuB,EAAE,GAAG,2DAA2D,MAAM,GAAG;AAC7G,mBAAe,KAAK,KAAK;AACzB,aAAS;;GAEX,MAAM,UAAU,UAAU,IAAI,MAAM,GAAG;AAEvC,OAAI,CAAC,SAAS,QAAQ;IACpB,MAAM,OAAO,uBAAuB,EAAE,GAAG,2DAA2D,MAAM,GAAG;AAC7G,mBAAe,KAAK,KAAK;AACzB,aAAS;;GAGX,MAAM,QAAoB,eAAe,EAAE,SAAS,EAAE,KAAK,MAAM;GACjE,MAAM,MAAoB,eAAe,EAAE,SAAS,EAAE,KAAK,IAAI;GAC/D,MAAM,oBAAoB,EAAE,KAAK;GACjC,MAAM,WAAoB,EAAE,KAAK;AAEjC,QAAK,MAAM,UAAU,SAAS;IAE5B,IAAIC;AACJ,QAAI,CAAC,OAAO,YAAY,CAAC,OAAO,UAAU,OAAM,MAAK,EAAE,KAAK,UAAU,MAAK,MAAK,EAAE,GAAG,UAAU,IAAI,EAAE,GAAG,CAAC,EAAE;AACzG,qBAAgB,EAAE,KAAK,UAAU,KAAI,MAAK,EAAE,GAAG,UAAU,CAAC;AAG1D,UAAK,MAAM,WAAW,iBAAiB,EAAE,CACvC,KAAI,CAAC,WAAW,IAAI,QAAQ,EAAE;MAC5B,MAAM,OAAO,uBAAuB,EAAE,GAAG,oCAAoC,QAAQ;AACrF,qBAAe,KAAK,KAAK;AACzB,eAAS;;;IAMf,MAAM,WAAW,EAAE,KAAK,MAAM,GAAG,UAAU;AAE3C,WAAO,KAAK;KACV,KAAQ,EAAE,GAAG,UAAU;KACvB;KACA;KACA;KACA;KACA,QAAQ,OAAO;KACf,GAAG,YAAY;MAAE,aAAa,CAAE,SAAU;MAAE,WAAW,CAAC,EAAE,WAAW,CAAE,SAAU,EAAE,CAAC;MAAE;KACtF,GAAI,iBAAiB,EAAE,UAAU,cAAc,KAAK,QAAQ,EAAE,IAAI,EAAE,EAAE;KACvE,CAA0B;;;GAG/B;AAEF,QAAO"}
1
+ {"version":3,"file":"events.js","names":["events: OutTypes.event[]","eventTeachers: string[] | undefined"],"sources":["../../../src/Admentum/from/events.ts"],"sourcesContent":["\nimport moment from 'moment';\nimport type { Lesson } from '../types/lessons';\nimport type { OutTypes } from './schedules';\n\nconst firstDay = moment.utc('1970-01-05');\n\nfunction fromTimeString (\n day: number,\n timeString: string\n): moment.Moment {\n const [hours, minutes] = timeString.split(':').map((time: string) => parseInt(time));\n return firstDay.clone().add(day, 'day')\n .set('hour', hours)\n .set('minute', minutes);\n}\n\nexport default function (\n lessons: Lesson[] | undefined,\n courseMap: Map<number, OutTypes.course[]>,\n teachers: OutTypes.teacher[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.event[] {\n\n // create teacher set for quick lookup\n const teacherSet = new Set<string>();\n teachers?.forEach(t => teacherSet.add(t.ids!));\n\n const events: OutTypes.event[] = [];\n lessons?.forEach(l => {\n\n // Nikos takes full responsibility for this line of code\n groupScope: for (const group of l.info.groups ?? []) {\n if (!courseMap.has(group.id)) {\n const warn = `The lesson with id \"${l.id}\" referenced the unknown/faulty schedule_group (course) \"${group.id}\" and was therefore ignored.`;\n importWarnings.push(warn);\n continue groupScope;\n }\n const courses = courseMap.get(group.id);\n\n if (!courses?.length) {\n const warn = `The lesson with id \"${l.id}\" referenced the unknown/faulty schedule_group (course) \"${group.id}\" and was therefore ignored.`;\n importWarnings.push(warn);\n continue groupScope;\n }\n\n const start = fromTimeString(l.weekday, l.info.start);\n const end = fromTimeString(l.weekday, l.info.end);\n const preferredDuration = l.info.duration;\n const duration = l.info.duration;\n\n for (const course of courses) {\n // store only teachers if they mismatch teachers of parent course\n let eventTeachers: string[] | undefined;\n if (!course.teachers || !course.teachers?.every(x => l.info.teachers?.some(y => y.id.toString() == x.to))) {\n eventTeachers = l.info.teachers?.map(x => x.id.toString());\n\n // ensure that the teachers exist\n for (const teacher of eventTeachers ?? []) {\n if (!teacherSet.has(teacher)) {\n const warn = `The lesson with id \"${l.id}\" referenced the unknown teacher \"${teacher}\" and was therefore ignored.`;\n importWarnings.push(warn);\n continue groupScope;\n }\n }\n }\n\n // location\n const location = l.info.room?.id.toString();\n\n events.push({\n ids: l.id.toString(),\n start,\n end,\n preferredDuration,\n duration,\n course: course.ids,\n ...location && { inLocations: [ location ], locations: [{ locations: [ location ] }] },\n ...(eventTeachers && { teachers: eventTeachers.map((to) => ({ to })) })\n } satisfies OutTypes.event);\n }\n }\n });\n\n return events;\n}\n"],"mappings":";;;AAKA,MAAM,WAAW,OAAO,IAAI;AAE5B,SAAS,eACP,KACA,YACe;CACf,MAAM,CAAC,OAAO,WAAW,WAAW,MAAM,KAAK,KAAK,SAAiB,SAAS;AAC9E,QAAO,SAAS,QAAQ,IAAI,KAAK,OAC9B,IAAI,QAAQ,OACZ,IAAI,UAAU;;AAGnB,wBACE,SACA,WACA,UACA,cACA,gBACkB;CAGlB,MAAM,6BAAa,IAAI;AACvB,WAAU,SAAQ,MAAK,WAAW,IAAI,EAAE;CAExC,MAAMA,SAA2B;AACjC,UAAS,SAAQ,MAAK;AAGpB,aAAY,MAAK,MAAM,SAAS,EAAE,KAAK,UAAU,IAAI;AACnD,OAAI,CAAC,UAAU,IAAI,MAAM,KAAK;IAC5B,MAAM,OAAO,uBAAuB,EAAE,GAAG,2DAA2D,MAAM,GAAG;AAC7G,mBAAe,KAAK;AACpB,aAAS;;GAEX,MAAM,UAAU,UAAU,IAAI,MAAM;AAEpC,OAAI,CAAC,SAAS,QAAQ;IACpB,MAAM,OAAO,uBAAuB,EAAE,GAAG,2DAA2D,MAAM,GAAG;AAC7G,mBAAe,KAAK;AACpB,aAAS;;GAGX,MAAM,QAAoB,eAAe,EAAE,SAAS,EAAE,KAAK;GAC3D,MAAM,MAAoB,eAAe,EAAE,SAAS,EAAE,KAAK;GAC3D,MAAM,oBAAoB,EAAE,KAAK;GACjC,MAAM,WAAoB,EAAE,KAAK;AAEjC,QAAK,MAAM,UAAU,SAAS;IAE5B,IAAIC;AACJ,QAAI,CAAC,OAAO,YAAY,CAAC,OAAO,UAAU,OAAM,MAAK,EAAE,KAAK,UAAU,MAAK,MAAK,EAAE,GAAG,cAAc,EAAE,MAAM;AACzG,qBAAgB,EAAE,KAAK,UAAU,KAAI,MAAK,EAAE,GAAG;AAG/C,UAAK,MAAM,WAAW,iBAAiB,GACrC,KAAI,CAAC,WAAW,IAAI,UAAU;MAC5B,MAAM,OAAO,uBAAuB,EAAE,GAAG,oCAAoC,QAAQ;AACrF,qBAAe,KAAK;AACpB,eAAS;;;IAMf,MAAM,WAAW,EAAE,KAAK,MAAM,GAAG;AAEjC,WAAO,KAAK;KACV,KAAQ,EAAE,GAAG;KACb;KACA;KACA;KACA;KACA,QAAQ,OAAO;KACf,GAAG,YAAY;MAAE,aAAa,CAAE;MAAY,WAAW,CAAC,EAAE,WAAW,CAAE;;KACvE,GAAI,iBAAiB,EAAE,UAAU,cAAc,KAAK,QAAQ,EAAE;;;;;AAMtE,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"groups.js","names":[],"sources":["../../../src/Admentum/from/groups.ts"],"sourcesContent":["import type { PrimaryGroup } from '../types/primary-groups';\nimport type { OutTypes } from './schedules';\n\nexport default function (\n primaryGroups: PrimaryGroup[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.group[] {\n return primaryGroups?.map(x => { return {\n ids: x.id.toString(),\n displayName: x.name,\n species: 'class',\n };}) ?? [];\n}\n"],"mappings":";AAGA,wBACE,eACA,cACA,gBACkB;AAClB,QAAO,eAAe,KAAI,MAAK;AAAE,SAAO;GACtC,KAAa,EAAE,GAAG,UAAU;GAC5B,aAAa,EAAE;GACf,SAAa;GACd;GAAG,IAAI,EAAE"}
1
+ {"version":3,"file":"groups.js","names":[],"sources":["../../../src/Admentum/from/groups.ts"],"sourcesContent":["import type { PrimaryGroup } from '../types/primary-groups';\nimport type { OutTypes } from './schedules';\n\nexport default function (\n primaryGroups: PrimaryGroup[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.group[] {\n return primaryGroups?.map(x => { return {\n ids: x.id.toString(),\n displayName: x.name,\n species: 'class',\n };}) ?? [];\n}\n"],"mappings":";AAGA,wBACE,eACA,cACA,gBACkB;AAClB,QAAO,eAAe,KAAI,MAAK;AAAE,SAAO;GACtC,KAAa,EAAE,GAAG;GAClB,aAAa,EAAE;GACf,SAAa;;OACP"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_schedules"],"sources":["../../../src/Admentum/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../common/types';\nimport _schedules from './schedules';\n\nexport default {\n schedules: _schedules\n} satisfies FromInterface;\n"],"mappings":";;;AAGA,mBAAe,EACb,WAAWA,mBACZ"}
1
+ {"version":3,"file":"index.js","names":["_schedules"],"sources":["../../../src/Admentum/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../common/types';\nimport _schedules from './schedules';\n\nexport default {\n schedules: _schedules\n} satisfies FromInterface;\n"],"mappings":";;;AAGA,mBAAe,EACb,WAAWA"}
@@ -1 +1 @@
1
- {"version":3,"file":"locations.js","names":[],"sources":["../../../src/Admentum/from/locations.ts"],"sourcesContent":["import type { Room } from '../types/rooms';\nimport type { OutTypes } from './schedules';\n\n\nexport default function (\n rooms: Room[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.location[] {\n return rooms?.map(room => { return {\n ids: room.id.toString(),\n displayName: room.name\n };}) ?? [];\n}\n"],"mappings":";AAIA,2BACE,OACA,cACA,gBACqB;AACrB,QAAO,OAAO,KAAI,SAAQ;AAAE,SAAO;GACjC,KAAa,KAAK,GAAG,UAAU;GAC/B,aAAa,KAAK;GACnB;GAAG,IAAI,EAAE"}
1
+ {"version":3,"file":"locations.js","names":[],"sources":["../../../src/Admentum/from/locations.ts"],"sourcesContent":["import type { Room } from '../types/rooms';\nimport type { OutTypes } from './schedules';\n\n\nexport default function (\n rooms: Room[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.location[] {\n return rooms?.map(room => { return {\n ids: room.id.toString(),\n displayName: room.name\n };}) ?? [];\n}\n"],"mappings":";AAIA,2BACE,OACA,cACA,gBACqB;AACrB,QAAO,OAAO,KAAI,SAAQ;AAAE,SAAO;GACjC,KAAa,KAAK,GAAG;GACrB,aAAa,KAAK;;OACZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"persons.js","names":["personSet: Map<number, OutTypes.person>"],"sources":["../../../src/Admentum/from/persons.ts"],"sourcesContent":["import type { User } from '../types/users';\nimport type { OutTypes } from './schedules';\n\nexport default function (\n users: User[] | undefined,\n groups: OutTypes.group[],\n importErrors: string[],\n importWarnings: string[]\n) {\n // add all persons to a set to remove duplicates\n const personSet: Map<number, OutTypes.person> = new Map();\n\n /*\n The reference to the group is different that the one in the primary_groups array.\n To solve this we create a map of all groups and use the id of the group as key. If\n the id is not found in the map, try to find a group with the same name.\n */\n const groupSet = new Map(groups.map(x => [x.displayName!, x.ids!]));\n\n users?.filter(x => x.role === 1).forEach(user => {\n const person = {\n ids: user.id.toString(),\n firstName: user.first_name,\n lastName: user.last_name,\n group: user.current_primary_group?.id?.toString(),\n ...user.email && {\n emails: [\n {\n value: user.email,\n type: 'organization'\n }\n ]\n }\n } satisfies OutTypes.person;\n\n if (user.current_primary_group) {\n const { id, name } = user.current_primary_group;\n if (groupSet.get(name.toString()) != person.group) {\n importWarnings.push(`The group of the user ${person.firstName} ${person.lastName} is not the same as the group in the primary_groups array.`);\n person.group = groupSet.get(name.toString()) ?? person.group;\n }\n }\n\n\n personSet.set(user.id, person);\n });\n\n return Array.from(personSet.values());\n}\n"],"mappings":";AAGA,yBACE,OACA,QACA,cACA,gBACA;CAEA,MAAMA,4BAA0C,IAAI,KAAK;CAOzD,MAAM,WAAW,IAAI,IAAI,OAAO,KAAI,MAAK,CAAC,EAAE,aAAc,EAAE,IAAK,CAAC,CAAC;AAEnE,QAAO,QAAO,MAAK,EAAE,SAAS,EAAE,CAAC,SAAQ,SAAQ;EAC/C,MAAM,SAAS;GACb,KAAW,KAAK,GAAG,UAAU;GAC7B,WAAW,KAAK;GAChB,UAAW,KAAK;GAChB,OAAW,KAAK,uBAAuB,IAAI,UAAU;GACrD,GAAG,KAAK,SAAS,EACf,QAAQ,CACN;IACE,OAAO,KAAK;IACZ,MAAO;IACR,CACF,EACF;GACF;AAED,MAAI,KAAK,uBAAuB;GAC9B,MAAM,EAAE,IAAI,SAAS,KAAK;AAC1B,OAAI,SAAS,IAAI,KAAK,UAAU,CAAC,IAAI,OAAO,OAAO;AACjD,mBAAe,KAAK,yBAAyB,OAAO,UAAU,GAAG,OAAO,SAAS,4DAA4D;AAC7I,WAAO,QAAQ,SAAS,IAAI,KAAK,UAAU,CAAC,IAAI,OAAO;;;AAK3D,YAAU,IAAI,KAAK,IAAI,OAAO;GAC9B;AAEF,QAAO,MAAM,KAAK,UAAU,QAAQ,CAAC"}
1
+ {"version":3,"file":"persons.js","names":["personSet: Map<number, OutTypes.person>"],"sources":["../../../src/Admentum/from/persons.ts"],"sourcesContent":["import type { User } from '../types/users';\nimport type { OutTypes } from './schedules';\n\nexport default function (\n users: User[] | undefined,\n groups: OutTypes.group[],\n importErrors: string[],\n importWarnings: string[]\n) {\n // add all persons to a set to remove duplicates\n const personSet: Map<number, OutTypes.person> = new Map();\n\n /*\n The reference to the group is different that the one in the primary_groups array.\n To solve this we create a map of all groups and use the id of the group as key. If\n the id is not found in the map, try to find a group with the same name.\n */\n const groupSet = new Map(groups.map(x => [x.displayName!, x.ids!]));\n\n users?.filter(x => x.role === 1).forEach(user => {\n const person = {\n ids: user.id.toString(),\n firstName: user.first_name,\n lastName: user.last_name,\n group: user.current_primary_group?.id?.toString(),\n ...user.email && {\n emails: [\n {\n value: user.email,\n type: 'organization'\n }\n ]\n }\n } satisfies OutTypes.person;\n\n if (user.current_primary_group) {\n const { id, name } = user.current_primary_group;\n if (groupSet.get(name.toString()) != person.group) {\n importWarnings.push(`The group of the user ${person.firstName} ${person.lastName} is not the same as the group in the primary_groups array.`);\n person.group = groupSet.get(name.toString()) ?? person.group;\n }\n }\n\n\n personSet.set(user.id, person);\n });\n\n return Array.from(personSet.values());\n}\n"],"mappings":";AAGA,yBACE,OACA,QACA,cACA,gBACA;CAEA,MAAMA,4BAA0C,IAAI;CAOpD,MAAM,WAAW,IAAI,IAAI,OAAO,KAAI,MAAK,CAAC,EAAE,aAAc,EAAE;AAE5D,QAAO,QAAO,MAAK,EAAE,SAAS,GAAG,SAAQ,SAAQ;EAC/C,MAAM,SAAS;GACb,KAAW,KAAK,GAAG;GACnB,WAAW,KAAK;GAChB,UAAW,KAAK;GAChB,OAAW,KAAK,uBAAuB,IAAI;GAC3C,GAAG,KAAK,SAAS,EACf,QAAQ,CACN;IACE,OAAO,KAAK;IACZ,MAAO;;;AAMf,MAAI,KAAK,uBAAuB;GAC9B,MAAM,EAAE,IAAI,SAAS,KAAK;AAC1B,OAAI,SAAS,IAAI,KAAK,eAAe,OAAO,OAAO;AACjD,mBAAe,KAAK,yBAAyB,OAAO,UAAU,GAAG,OAAO,SAAS;AACjF,WAAO,QAAQ,SAAS,IAAI,KAAK,eAAe,OAAO;;;AAK3D,YAAU,IAAI,KAAK,IAAI;;AAGzB,QAAO,MAAM,KAAK,UAAU"}
@@ -1,6 +1,5 @@
1
1
  import { InternalIdKey } from "../../core/types/common/index.js";
2
2
  import { Types } from "../../core/types/index.js";
3
- import "../../core/index.js";
4
3
  import { Schedule } from "../types/schedules.js";
5
4
 
6
5
  //#region src/Admentum/from/schedules.d.ts
@@ -15,13 +15,16 @@ function schedules_default(schedule) {
15
15
  const locations = locations_default(schedule.rooms, errors, warnings);
16
16
  const teachers = teachers_default(schedule.schedule_groups, schedule.lessons, errors, warnings);
17
17
  const groups = groups_default(schedule.primary_groups, errors, warnings);
18
+ const courses = courses_default(schedule.schedule_groups, school, courseMap, errors, warnings);
19
+ const events = events_default(schedule.lessons, courseMap, teachers, errors, warnings);
20
+ const persons = persons_default(schedule.users, groups, errors, warnings);
18
21
  return {
19
22
  locations,
20
23
  teachers,
21
24
  groups,
22
- courses: courses_default(schedule.schedule_groups, school, courseMap, errors, warnings),
23
- events: events_default(schedule.lessons, courseMap, teachers, errors, warnings),
24
- persons: persons_default(schedule.users, groups, errors, warnings),
25
+ courses,
26
+ events,
27
+ persons,
25
28
  meta: {
26
29
  ...errors.length ? { errors } : {},
27
30
  ...warnings.length ? { warnings } : {}
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":["errors: string[]","warnings: string[]","locations: OutTypes.location[]","_locations","teachers: OutTypes.teacher []","_teachers","groups: OutTypes.group []","_groups","_courses","_events","_persons"],"sources":["../../../src/Admentum/from/schedules.ts"],"sourcesContent":["import type { Schedule } from '../types/schedules';\nimport _teachers from './teachers';\nimport _locations from './locations';\nimport _groups from './groups';\nimport _courses from './courses';\nimport _events from './events';\nimport _persons from './persons';\nimport type { CoreTypes } from '../../core';\nimport type { InternalIdKey } from '../../core/types/common';\n\n\nexport namespace OutTypes {\n export type location = Omit<CoreTypes.Serialized.Location, InternalIdKey>;\n export type teacher = Omit<CoreTypes.Serialized.Teacher, InternalIdKey>;\n export type group = Omit<CoreTypes.Serialized.Group, InternalIdKey>;\n export type course = Omit<CoreTypes.Serialized.Course, InternalIdKey>;\n export type event = Omit<CoreTypes.Serialized.Event, InternalIdKey>;\n export type person = Omit<CoreTypes.Serialized.Person, InternalIdKey>;\n};\n\nexport default function (\n schedule: Omit<Schedule, 'start_date' | 'end_date' | 'schedule' | 'school_year'>\n) {\n\n ////\n //// check the number of contained schools\n ////\n if (schedule.schools.length != 1) {\n return { meta: { errors: [`Received ${schedule.schools.length} number of schools: only a single school is allowed.`] } };\n }\n const school = schedule.schools[0];\n\n const courseMap = new Map<number, OutTypes.course[]>();\n // gather all import related warnings/errors\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const locations: OutTypes.location[] = _locations(schedule.rooms, errors, warnings);\n const teachers: OutTypes.teacher [] = _teachers (schedule.schedule_groups, schedule.lessons, errors, warnings);\n const groups: OutTypes.group [] = _groups (schedule.primary_groups, errors, warnings);\n const courses: OutTypes.course [] = _courses (schedule.schedule_groups, school, courseMap, errors, warnings);\n const events: OutTypes.event [] = _events (schedule.lessons, courseMap, teachers, errors, warnings);\n const persons: OutTypes.person [] = _persons (schedule.users, groups, errors, warnings);\n\n return { locations, teachers, groups, courses, events, persons,\n meta: {\n ...( errors.length ? { errors } : { } ),\n ...( warnings.length ? { warnings } : { } )\n }\n };\n}\n"],"mappings":";;;;;;;;AAoBA,2BACE,UACA;AAKA,KAAI,SAAS,QAAQ,UAAU,EAC7B,QAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,SAAS,QAAQ,OAAO,sDAAsD,EAAE,EAAE;CAE1H,MAAM,SAAS,SAAS,QAAQ;CAEhC,MAAM,4BAAY,IAAI,KAAgC;CAEtD,MAAMA,SAAqB,EAAE;CAC7B,MAAMC,WAAqB,EAAE;CAE7B,MAAMC,YAAiCC,kBAAW,SAAS,OAAoC,QAAQ,SAAS;CAChH,MAAMC,WAAiCC,iBAAW,SAAS,iBAAiB,SAAS,SAAU,QAAQ,SAAS;CAChH,MAAMC,SAAiCC,eAAW,SAAS,gBAAoC,QAAQ,SAAS;AAKhH,QAAO;EAAE;EAAW;EAAU;EAAQ,SAJCC,gBAAW,SAAS,iBAAiB,QAAQ,WAAW,QAAQ,SAAS;EAIjE,QAHRC,eAAW,SAAS,SAAS,WAAW,UAAgB,QAAQ,SAAS;EAGzD,SAFhBC,gBAAW,SAAS,OAAO,QAA6B,QAAQ,SAAS;EAG9G,MAAM;GACJ,GAAK,OAAO,SAAW,EAAE,QAAQ,GAAK,EAAG;GACzC,GAAK,SAAS,SAAS,EAAE,UAAU,GAAG,EAAG;GAC1C;EACF"}
1
+ {"version":3,"file":"schedules.js","names":["errors: string[]","warnings: string[]","locations: OutTypes.location[]","_locations","teachers: OutTypes.teacher []","_teachers","groups: OutTypes.group []","_groups","courses: OutTypes.course []","_courses","events: OutTypes.event []","_events","persons: OutTypes.person []","_persons"],"sources":["../../../src/Admentum/from/schedules.ts"],"sourcesContent":["import type { Schedule } from '../types/schedules';\nimport _teachers from './teachers';\nimport _locations from './locations';\nimport _groups from './groups';\nimport _courses from './courses';\nimport _events from './events';\nimport _persons from './persons';\nimport type { CoreTypes } from '../../core';\nimport type { InternalIdKey } from '../../core/types/common';\n\n\nexport namespace OutTypes {\n export type location = Omit<CoreTypes.Serialized.Location, InternalIdKey>;\n export type teacher = Omit<CoreTypes.Serialized.Teacher, InternalIdKey>;\n export type group = Omit<CoreTypes.Serialized.Group, InternalIdKey>;\n export type course = Omit<CoreTypes.Serialized.Course, InternalIdKey>;\n export type event = Omit<CoreTypes.Serialized.Event, InternalIdKey>;\n export type person = Omit<CoreTypes.Serialized.Person, InternalIdKey>;\n};\n\nexport default function (\n schedule: Omit<Schedule, 'start_date' | 'end_date' | 'schedule' | 'school_year'>\n) {\n\n ////\n //// check the number of contained schools\n ////\n if (schedule.schools.length != 1) {\n return { meta: { errors: [`Received ${schedule.schools.length} number of schools: only a single school is allowed.`] } };\n }\n const school = schedule.schools[0];\n\n const courseMap = new Map<number, OutTypes.course[]>();\n // gather all import related warnings/errors\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const locations: OutTypes.location[] = _locations(schedule.rooms, errors, warnings);\n const teachers: OutTypes.teacher [] = _teachers (schedule.schedule_groups, schedule.lessons, errors, warnings);\n const groups: OutTypes.group [] = _groups (schedule.primary_groups, errors, warnings);\n const courses: OutTypes.course [] = _courses (schedule.schedule_groups, school, courseMap, errors, warnings);\n const events: OutTypes.event [] = _events (schedule.lessons, courseMap, teachers, errors, warnings);\n const persons: OutTypes.person [] = _persons (schedule.users, groups, errors, warnings);\n\n return { locations, teachers, groups, courses, events, persons,\n meta: {\n ...( errors.length ? { errors } : { } ),\n ...( warnings.length ? { warnings } : { } )\n }\n };\n}\n"],"mappings":";;;;;;;;AAoBA,2BACE,UACA;AAKA,KAAI,SAAS,QAAQ,UAAU,EAC7B,QAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,SAAS,QAAQ,OAAO;CAEhE,MAAM,SAAS,SAAS,QAAQ;CAEhC,MAAM,4BAAY,IAAI;CAEtB,MAAMA,SAAqB;CAC3B,MAAMC,WAAqB;CAE3B,MAAMC,YAAiCC,kBAAW,SAAS,OAAoC,QAAQ;CACvG,MAAMC,WAAiCC,iBAAW,SAAS,iBAAiB,SAAS,SAAU,QAAQ;CACvG,MAAMC,SAAiCC,eAAW,SAAS,gBAAoC,QAAQ;CACvG,MAAMC,UAAiCC,gBAAW,SAAS,iBAAiB,QAAQ,WAAW,QAAQ;CACvG,MAAMC,SAAiCC,eAAW,SAAS,SAAS,WAAW,UAAgB,QAAQ;CACvG,MAAMC,UAAiCC,gBAAW,SAAS,OAAO,QAA6B,QAAQ;AAEvG,QAAO;EAAE;EAAW;EAAU;EAAQ;EAAS;EAAQ;EACrD,MAAM;GACJ,GAAK,OAAO,SAAW,EAAE,WAAa;GACtC,GAAK,SAAS,SAAS,EAAE,aAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"teachers.js","names":["teacherSet: Map<number, OutTypes.teacher>"],"sources":["../../../src/Admentum/from/teachers.ts"],"sourcesContent":["import type { ScheduleGroup } from '../types/schedule-groups';\nimport type { Lesson } from '../types/lessons';\nimport type { OutTypes } from './schedules';\n\nexport default function (\n scheduleGroups: ScheduleGroup[] | undefined,\n lessons: Lesson[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.teacher[] {\n // add all teachers to a set to remove duplicates\n const teacherSet: Map<number, OutTypes.teacher> = new Map();\n\n scheduleGroups?.forEach(scheduleGroup => {\n scheduleGroup.teachers?.forEach(teacher => {\n teacherSet.set(teacher.id, {\n ids: teacher.id.toString(),\n displayName: teacher.first_name + ' ' + teacher.last_name\n });\n });\n });\n\n lessons?.forEach(lesson => {\n lesson.teachers?.forEach(teacher => {\n teacherSet.set(teacher.id, {\n ids: teacher.id.toString(),\n displayName: teacher.first_name + ' ' + teacher.last_name\n });\n });\n });\n\n return Array.from(teacherSet.values());\n}\n"],"mappings":";AAIA,0BACE,gBACA,SACA,cACA,gBACoB;CAEpB,MAAMA,6BAA4C,IAAI,KAAK;AAE3D,iBAAgB,SAAQ,kBAAiB;AACvC,gBAAc,UAAU,SAAQ,YAAW;AACzC,cAAW,IAAI,QAAQ,IAAI;IACzB,KAAa,QAAQ,GAAG,UAAU;IAClC,aAAa,QAAQ,aAAa,MAAM,QAAQ;IACjD,CAAC;IACF;GACF;AAEF,UAAS,SAAQ,WAAU;AACzB,SAAO,UAAU,SAAQ,YAAW;AAClC,cAAW,IAAI,QAAQ,IAAI;IACzB,KAAa,QAAQ,GAAG,UAAU;IAClC,aAAa,QAAQ,aAAa,MAAM,QAAQ;IACjD,CAAC;IACF;GACF;AAEF,QAAO,MAAM,KAAK,WAAW,QAAQ,CAAC"}
1
+ {"version":3,"file":"teachers.js","names":["teacherSet: Map<number, OutTypes.teacher>"],"sources":["../../../src/Admentum/from/teachers.ts"],"sourcesContent":["import type { ScheduleGroup } from '../types/schedule-groups';\nimport type { Lesson } from '../types/lessons';\nimport type { OutTypes } from './schedules';\n\nexport default function (\n scheduleGroups: ScheduleGroup[] | undefined,\n lessons: Lesson[] | undefined,\n importErrors: string[],\n importWarnings: string[],\n): OutTypes.teacher[] {\n // add all teachers to a set to remove duplicates\n const teacherSet: Map<number, OutTypes.teacher> = new Map();\n\n scheduleGroups?.forEach(scheduleGroup => {\n scheduleGroup.teachers?.forEach(teacher => {\n teacherSet.set(teacher.id, {\n ids: teacher.id.toString(),\n displayName: teacher.first_name + ' ' + teacher.last_name\n });\n });\n });\n\n lessons?.forEach(lesson => {\n lesson.teachers?.forEach(teacher => {\n teacherSet.set(teacher.id, {\n ids: teacher.id.toString(),\n displayName: teacher.first_name + ' ' + teacher.last_name\n });\n });\n });\n\n return Array.from(teacherSet.values());\n}\n"],"mappings":";AAIA,0BACE,gBACA,SACA,cACA,gBACoB;CAEpB,MAAMA,6BAA4C,IAAI;AAEtD,iBAAgB,SAAQ,kBAAiB;AACvC,gBAAc,UAAU,SAAQ,YAAW;AACzC,cAAW,IAAI,QAAQ,IAAI;IACzB,KAAa,QAAQ,GAAG;IACxB,aAAa,QAAQ,aAAa,MAAM,QAAQ;;;;AAKtD,UAAS,SAAQ,WAAU;AACzB,SAAO,UAAU,SAAQ,YAAW;AAClC,cAAW,IAAI,QAAQ,IAAI;IACzB,KAAa,QAAQ,GAAG;IACxB,aAAa,QAAQ,aAAa,MAAM,QAAQ;;;;AAKtD,QAAO,MAAM,KAAK,WAAW"}
@@ -1,6 +1,5 @@
1
1
  import { BaseOptions } from "../../common/types.js";
2
2
  import { Types } from "../../core/types/index.js";
3
- import "../../index.js";
4
3
 
5
4
  //#region src/Admentum/to/index.d.ts
6
5
  declare class export_default {
@@ -26,7 +26,7 @@ var schedules_default = (schedule, options) => {
26
26
  const groupsMap = new Map(schedule.groups.map((x) => [getVertexId(x, options), x]));
27
27
  const teachersMap = new Map(schedule.teachers.map((x) => [getVertexId(x, options), x]));
28
28
  const coursesMap = new Map(schedule.courses.map((x) => [getVertexId(x, options), x]));
29
- return toCsv(schedule.events.map((event) => {
29
+ const events = schedule.events.map((event) => {
30
30
  if (event.parked) return;
31
31
  if (!event.start || !event.end) return;
32
32
  const course = event.course ? coursesMap.get(getVertexId(event.course, options)) : void 0;
@@ -39,7 +39,7 @@ var schedules_default = (schedule, options) => {
39
39
  const locations = (event.inLocations ?? []).map((x) => x ? locationsMap.get(getVertexId(x, options)) : null).filter((x) => !!x);
40
40
  const teachers = (event.teachers ?? course.teachers ?? []).map((x) => teachersMap.get(getVertexId(x.to, options))).filter((x) => !!x);
41
41
  const groups = (event.groups ?? course.groups ?? []).map((x) => groupsMap.get(getVertexId(x.to, options))).filter((x) => !!x);
42
- return {
42
+ const out = {
43
43
  id: getVertexId(event, options),
44
44
  externalid: event.ids?.toString(),
45
45
  groupid: course.ids,
@@ -56,7 +56,9 @@ var schedules_default = (schedule, options) => {
56
56
  classid: groups.map((x) => x.ids).join(", "),
57
57
  class: groups.map((x) => x.displayName).join(", ")
58
58
  };
59
- }).filter((x) => x != null));
59
+ return out;
60
+ }).filter((x) => x != null);
61
+ return toCsv(events);
60
62
  };
61
63
  function toCsv(events) {
62
64
  const headers = [
@@ -83,7 +85,8 @@ function toCsv(events) {
83
85
  if (stringValue.includes(";") || stringValue.includes("\"") || stringValue.includes("\n") || stringValue.includes("\r")) return `"${stringValue.replace(/"/g, "\"\"")}"`;
84
86
  return stringValue;
85
87
  }).join(";"));
86
- return [headers.join(";"), ...csvRows].join("\r\n");
88
+ const csv = [headers.join(";"), ...csvRows].join("\r\n");
89
+ return csv;
87
90
  }
88
91
 
89
92
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":["weeks"],"sources":["../../../src/Admentum/to/schedules.ts"],"sourcesContent":["import moment from 'moment';\nimport type { CoreTypes } from '../../core';\nimport { getDayIndex, getVertexId } from '../../core/util';\nimport type { BaseOptions } from '../../common/types';\n\n\ntype OutEvent = {\n id?: string;\n externalid?: string;\n groupid?: string;\n group?: string;\n dayid?: number;\n startTime?: string;\n length?: number;\n subject?: string;\n roomid?: string;\n room?: string;\n teacherid?: string;\n teacher?: string;\n classid?: string;\n class?: string;\n inweek?: string;\n};\n\ntype Schedule = {\n division: CoreTypes.Mixed.Division;\n settings: CoreTypes.Mixed.Settings;\n periods: CoreTypes.Mixed.Period[];\n locations: CoreTypes.Mixed.Location[];\n groups: CoreTypes.Mixed.Group[];\n teachers: CoreTypes.Mixed.Teacher[];\n courses: CoreTypes.Mixed.Course[];\n events: CoreTypes.Mixed.Event[];\n};\n\nexport default (\n schedule: Schedule,\n options: BaseOptions\n): string => {\n\n // a map of period.id -> period\n const periodsMap = new Map(schedule.periods.map(x => [getVertexId(x, options) as string | undefined, x as Pick<typeof x, 'ranges'>] as const));\n periodsMap.set(undefined, { ranges: [{ start: schedule.division.start, end: schedule.division.end }] });\n\n // a map of period.id -> inWeeks\n const inWeeksMap = new Map<string | undefined, string>();\n periodsMap.forEach((period, id) => {\n const weeks = period.ranges\n .map(x => {\n // fetch all weeks between start and end\n const start = moment.utc(x.start);\n const end = moment.utc(x.end);\n const weeks = new Array<number>();\n while (start.isBefore(end)) {\n weeks.push(start.week());\n start.add(1, 'week');\n }\n return weeks;\n })\n .flat()\n .join(', ');\n\n inWeeksMap.set(id, weeks);\n });\n\n // a map of location.id -> location\n const locationsMap = new Map(schedule.locations.map(x => [getVertexId(x, options), x] as const));\n\n // a map of group.id -> group\n const groupsMap = new Map(schedule.groups.map(x => [getVertexId(x, options), x] as const));\n\n // a map of teacher.id -> teacher\n const teachersMap = new Map(schedule.teachers.map(x => [getVertexId(x, options), x] as const));\n\n // a map of course.id -> course\n const coursesMap = new Map(schedule.courses.map(x => [getVertexId(x, options), x] as const));\n\n\n const events = schedule.events\n .map(event => {\n // ignore parked events\n if (event.parked) return;\n if (!event.start || !event.end) return;\n\n // must have a course\n const course = event.course ? coursesMap.get(getVertexId(event.course, options)) : undefined;\n if (!course) return;\n\n const start = moment.utc(event.start);\n const end = moment.utc(event.end);\n\n const period = event.period ?? course.period ?? schedule.settings.period;\n const periodId = period ? getVertexId(period, options) : undefined;\n const inWeeks = inWeeksMap.get(periodId);\n\n const locations = (event.inLocations ?? []).map(x => x ? locationsMap.get(getVertexId(x, options)) : null).filter((x): x is NonNullable<typeof x> => !!x);\n const teachers = (event.teachers ?? course.teachers ?? []).map(x => teachersMap .get(getVertexId(x.to, options)) ).filter((x): x is NonNullable<typeof x> => !!x);\n const groups = (event.groups ?? course.groups ?? []).map(x => groupsMap .get(getVertexId(x.to, options)) ).filter((x): x is NonNullable<typeof x> => !!x);\n\n const out: OutEvent = {\n id: getVertexId(event, options),\n externalid: event.ids?.toString(),\n groupid: course.ids,\n group: course.displayName,\n dayid: getDayIndex(start),\n startTime: start.format('HHmm'),\n length: end.diff(start, 'minutes'),\n subject: course.subject,\n inweek: inWeeks,\n roomid: locations.map(x => x.ids ).join(', '),\n room: locations.map(x => x.displayName).join(', '),\n teacherid: teachers .map(x => x.ids ).join(', '),\n teacher: teachers .map(x => x.displayName).join(', '),\n classid: groups .map(x => x.ids ).join(', '),\n class: groups .map(x => x.displayName).join(', ')\n };\n return out;\n })\n .filter(x => x != null);\n\n\n return toCsv(events);\n};\n\nfunction toCsv (events: OutEvent[]): string {\n // CSV header\n const headers = [\n 'id', 'externalid', 'groupid', 'group', 'dayid',\n 'startTime', 'length', 'subject', 'roomid', 'room',\n 'teacherid', 'teacher', 'classid', 'class', 'inweek'\n ];\n\n // Convert events to CSV rows\n const csvRows = events.map(event =>\n headers.map(header => {\n const value = event[header as keyof OutEvent];\n // Handle null/undefined values\n if (value == null) return '';\n\n const stringValue = value.toString();\n // Escape values that contain semicolons, quotes, or newlines\n if (stringValue.includes(';') || stringValue.includes('\"') || stringValue.includes('\\n') || stringValue.includes('\\r')) {\n return `\"${stringValue.replace(/\"/g, '\"\"')}\"`;\n }\n return stringValue;\n }).join(';')\n );\n\n // Combine header and rows with proper line endings\n const csv = [headers.join(';'), ...csvRows].join('\\r\\n');\n\n return csv;\n}"],"mappings":"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"}
1
+ {"version":3,"file":"schedules.js","names":["weeks","out: OutEvent"],"sources":["../../../src/Admentum/to/schedules.ts"],"sourcesContent":["import moment from 'moment';\nimport type { CoreTypes } from '../../core';\nimport { getDayIndex, getVertexId } from '../../core/util';\nimport type { BaseOptions } from '../../common/types';\n\n\ntype OutEvent = {\n id?: string;\n externalid?: string;\n groupid?: string;\n group?: string;\n dayid?: number;\n startTime?: string;\n length?: number;\n subject?: string;\n roomid?: string;\n room?: string;\n teacherid?: string;\n teacher?: string;\n classid?: string;\n class?: string;\n inweek?: string;\n};\n\ntype Schedule = {\n division: CoreTypes.Mixed.Division;\n settings: CoreTypes.Mixed.Settings;\n periods: CoreTypes.Mixed.Period[];\n locations: CoreTypes.Mixed.Location[];\n groups: CoreTypes.Mixed.Group[];\n teachers: CoreTypes.Mixed.Teacher[];\n courses: CoreTypes.Mixed.Course[];\n events: CoreTypes.Mixed.Event[];\n};\n\nexport default (\n schedule: Schedule,\n options: BaseOptions\n): string => {\n\n // a map of period.id -> period\n const periodsMap = new Map(schedule.periods.map(x => [getVertexId(x, options) as string | undefined, x as Pick<typeof x, 'ranges'>] as const));\n periodsMap.set(undefined, { ranges: [{ start: schedule.division.start, end: schedule.division.end }] });\n\n // a map of period.id -> inWeeks\n const inWeeksMap = new Map<string | undefined, string>();\n periodsMap.forEach((period, id) => {\n const weeks = period.ranges\n .map(x => {\n // fetch all weeks between start and end\n const start = moment.utc(x.start);\n const end = moment.utc(x.end);\n const weeks = new Array<number>();\n while (start.isBefore(end)) {\n weeks.push(start.week());\n start.add(1, 'week');\n }\n return weeks;\n })\n .flat()\n .join(', ');\n\n inWeeksMap.set(id, weeks);\n });\n\n // a map of location.id -> location\n const locationsMap = new Map(schedule.locations.map(x => [getVertexId(x, options), x] as const));\n\n // a map of group.id -> group\n const groupsMap = new Map(schedule.groups.map(x => [getVertexId(x, options), x] as const));\n\n // a map of teacher.id -> teacher\n const teachersMap = new Map(schedule.teachers.map(x => [getVertexId(x, options), x] as const));\n\n // a map of course.id -> course\n const coursesMap = new Map(schedule.courses.map(x => [getVertexId(x, options), x] as const));\n\n\n const events = schedule.events\n .map(event => {\n // ignore parked events\n if (event.parked) return;\n if (!event.start || !event.end) return;\n\n // must have a course\n const course = event.course ? coursesMap.get(getVertexId(event.course, options)) : undefined;\n if (!course) return;\n\n const start = moment.utc(event.start);\n const end = moment.utc(event.end);\n\n const period = event.period ?? course.period ?? schedule.settings.period;\n const periodId = period ? getVertexId(period, options) : undefined;\n const inWeeks = inWeeksMap.get(periodId);\n\n const locations = (event.inLocations ?? []).map(x => x ? locationsMap.get(getVertexId(x, options)) : null).filter((x): x is NonNullable<typeof x> => !!x);\n const teachers = (event.teachers ?? course.teachers ?? []).map(x => teachersMap .get(getVertexId(x.to, options)) ).filter((x): x is NonNullable<typeof x> => !!x);\n const groups = (event.groups ?? course.groups ?? []).map(x => groupsMap .get(getVertexId(x.to, options)) ).filter((x): x is NonNullable<typeof x> => !!x);\n\n const out: OutEvent = {\n id: getVertexId(event, options),\n externalid: event.ids?.toString(),\n groupid: course.ids,\n group: course.displayName,\n dayid: getDayIndex(start),\n startTime: start.format('HHmm'),\n length: end.diff(start, 'minutes'),\n subject: course.subject,\n inweek: inWeeks,\n roomid: locations.map(x => x.ids ).join(', '),\n room: locations.map(x => x.displayName).join(', '),\n teacherid: teachers .map(x => x.ids ).join(', '),\n teacher: teachers .map(x => x.displayName).join(', '),\n classid: groups .map(x => x.ids ).join(', '),\n class: groups .map(x => x.displayName).join(', ')\n };\n return out;\n })\n .filter(x => x != null);\n\n\n return toCsv(events);\n};\n\nfunction toCsv (events: OutEvent[]): string {\n // CSV header\n const headers = [\n 'id', 'externalid', 'groupid', 'group', 'dayid',\n 'startTime', 'length', 'subject', 'roomid', 'room',\n 'teacherid', 'teacher', 'classid', 'class', 'inweek'\n ];\n\n // Convert events to CSV rows\n const csvRows = events.map(event =>\n headers.map(header => {\n const value = event[header as keyof OutEvent];\n // Handle null/undefined values\n if (value == null) return '';\n\n const stringValue = value.toString();\n // Escape values that contain semicolons, quotes, or newlines\n if (stringValue.includes(';') || stringValue.includes('\"') || stringValue.includes('\\n') || stringValue.includes('\\r')) {\n return `\"${stringValue.replace(/\"/g, '\"\"')}\"`;\n }\n return stringValue;\n }).join(';')\n );\n\n // Combine header and rows with proper line endings\n const csv = [headers.join(';'), ...csvRows].join('\\r\\n');\n\n return csv;\n}"],"mappings":";;;;AAmCA,yBACE,UACA,YACW;CAGX,MAAM,aAAa,IAAI,IAAI,SAAS,QAAQ,KAAI,MAAK,CAAC,YAAY,GAAG,UAAgC;AACrG,YAAW,IAAI,QAAW,EAAE,QAAQ,CAAC;EAAE,OAAO,SAAS,SAAS;EAAO,KAAK,SAAS,SAAS;;CAG9F,MAAM,6BAAa,IAAI;AACvB,YAAW,SAAS,QAAQ,OAAO;EACjC,MAAM,QAAQ,OAAO,OAClB,KAAI,MAAK;GAER,MAAM,QAAQ,OAAO,IAAI,EAAE;GAC3B,MAAM,MAAQ,OAAO,IAAI,EAAE;GAC3B,MAAMA,UAAQ,IAAI;AAClB,UAAO,MAAM,SAAS,MAAM;AAC1B,YAAM,KAAK,MAAM;AACjB,UAAM,IAAI,GAAG;;AAEf,UAAOA;KAER,OACA,KAAK;AAER,aAAW,IAAI,IAAI;;CAIrB,MAAM,eAAe,IAAI,IAAI,SAAS,UAAU,KAAI,MAAK,CAAC,YAAY,GAAG,UAAU;CAGnF,MAAM,YAAY,IAAI,IAAI,SAAS,OAAO,KAAI,MAAK,CAAC,YAAY,GAAG,UAAU;CAG7E,MAAM,cAAc,IAAI,IAAI,SAAS,SAAS,KAAI,MAAK,CAAC,YAAY,GAAG,UAAU;CAGjF,MAAM,aAAa,IAAI,IAAI,SAAS,QAAQ,KAAI,MAAK,CAAC,YAAY,GAAG,UAAU;CAG/E,MAAM,SAAS,SAAS,OACrB,KAAI,UAAS;AAEZ,MAAI,MAAM,OAAQ;AAClB,MAAI,CAAC,MAAM,SAAS,CAAC,MAAM,IAAK;EAGhC,MAAM,SAAS,MAAM,SAAS,WAAW,IAAI,YAAY,MAAM,QAAQ,YAAY;AACnF,MAAI,CAAC,OAAQ;EAEb,MAAM,QAAQ,OAAO,IAAI,MAAM;EAC/B,MAAM,MAAQ,OAAO,IAAI,MAAM;EAE/B,MAAM,SAAS,MAAM,UAAU,OAAO,UAAU,SAAS,SAAS;EAClE,MAAM,WAAW,SAAS,YAAY,QAAQ,WAAW;EACzD,MAAM,UAAU,WAAW,IAAI;EAE/B,MAAM,aAAa,MAAM,eAA+B,IAAI,KAAI,MAAM,IAAI,aAAa,IAAI,YAAY,GAAM,YAAY,MAAM,QAAQ,MAAkC,CAAC,CAAC;EAC3K,MAAM,YAAa,MAAM,YAAY,OAAO,YAAY,IAAI,KAAI,MAAU,YAAa,IAAI,YAAY,EAAE,IAAI,WAAkB,QAAQ,MAAkC,CAAC,CAAC;EAC3K,MAAM,UAAa,MAAM,UAAY,OAAO,UAAY,IAAI,KAAI,MAAU,UAAa,IAAI,YAAY,EAAE,IAAI,WAAkB,QAAQ,MAAkC,CAAC,CAAC;EAE3K,MAAMC,MAAgB;GACpB,IAAY,YAAY,OAAO;GAC/B,YAAY,MAAM,KAAK;GACvB,SAAY,OAAO;GACnB,OAAY,OAAO;GACnB,OAAY,YAAY;GACxB,WAAY,MAAM,OAAO;GACzB,QAAY,IAAI,KAAK,OAAO;GAC5B,SAAY,OAAO;GACnB,QAAY;GACZ,QAAY,UAAU,KAAI,MAAK,EAAE,KAAa,KAAK;GACnD,MAAY,UAAU,KAAI,MAAK,EAAE,aAAa,KAAK;GACnD,WAAY,SAAU,KAAI,MAAK,EAAE,KAAa,KAAK;GACnD,SAAY,SAAU,KAAI,MAAK,EAAE,aAAa,KAAK;GACnD,SAAY,OAAU,KAAI,MAAK,EAAE,KAAa,KAAK;GACnD,OAAY,OAAU,KAAI,MAAK,EAAE,aAAa,KAAK;;AAErD,SAAO;IAER,QAAO,MAAK,KAAK;AAGpB,QAAO,MAAM;;AAGf,SAAS,MAAO,QAA4B;CAE1C,MAAM,UAAU;EACd;EAAM;EAAc;EAAW;EAAS;EACxC;EAAa;EAAU;EAAW;EAAU;EAC5C;EAAa;EAAW;EAAW;EAAS;;CAI9C,MAAM,UAAU,OAAO,KAAI,UACzB,QAAQ,KAAI,WAAU;EACpB,MAAM,QAAQ,MAAM;AAEpB,MAAI,SAAS,KAAM,QAAO;EAE1B,MAAM,cAAc,MAAM;AAE1B,MAAI,YAAY,SAAS,QAAQ,YAAY,SAAS,SAAQ,YAAY,SAAS,SAAS,YAAY,SAAS,MAC/G,QAAO,IAAI,YAAY,QAAQ,MAAM,QAAM;AAE7C,SAAO;IACN,KAAK;CAIV,MAAM,MAAM,CAAC,QAAQ,KAAK,MAAM,GAAG,SAAS,KAAK;AAEjD,QAAO"}
@@ -9,8 +9,7 @@ import { Types } from "./v1/types/index.js";
9
9
  import { Map } from "./v1/index.js";
10
10
  import { Types as Types$1 } from "./v2/types/index.js";
11
11
  import { Map as Map$1 } from "./v2/index.js";
12
- import "../index.js";
13
- import * as moment191 from "moment";
12
+ import * as moment0 from "moment";
14
13
 
15
14
  //#region src/Excel/index.d.ts
16
15
  declare class ExcelMap {
@@ -201,8 +200,8 @@ declare class ExcelMap {
201
200
  createdAt?: string | undefined;
202
201
  updatedAt?: string | undefined;
203
202
  lastModifiedBy?: string | undefined;
204
- start?: (moment191.Moment | string) | undefined;
205
- end?: (moment191.Moment | string) | undefined;
203
+ start?: (moment0.Moment | string) | undefined;
204
+ end?: (moment0.Moment | string) | undefined;
206
205
  potentialCenter?: string | undefined;
207
206
  type?: string | undefined;
208
207
  tags?: Tag[] | undefined;
@@ -245,6 +244,7 @@ declare class ExcelMap {
245
244
  rank?: number | undefined;
246
245
  locations: [string];
247
246
  }[] | undefined;
247
+ threads?: string[] | undefined;
248
248
  }, "_id"> & {
249
249
  __raw?: Types$1.Course;
250
250
  })[];
@@ -192,7 +192,7 @@ function _schedules(source) {
192
192
  return toMultipleOf5(x$1);
193
193
  } catch {
194
194
  warnings.push(`The lesson duration "${x$1}" for the course "${displayName}" is not an integer.`);
195
- return;
195
+ return void 0;
196
196
  }
197
197
  }).filter((x$1) => {
198
198
  if (!x$1) {