@royalschedule/maps 4.0.33 → 4.1.1-beta.0

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 (325) 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 +1 -1
  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 +4 -4
  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 +7 -4
  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 +3 -2
  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 +2 -4
  63. package/dist/RS/make-connected.js +46 -54
  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 +7 -5
  67. package/dist/RS/to/initial-configuration.js.map +1 -1
  68. package/dist/RS/to/input/default.js +16 -21
  69. package/dist/RS/to/input/default.js.map +1 -1
  70. package/dist/RS/to/input/dependencies.js +12 -10
  71. package/dist/RS/to/input/dependencies.js.map +1 -1
  72. package/dist/RS/to/input/events.js +53 -41
  73. package/dist/RS/to/input/events.js.map +1 -1
  74. package/dist/RS/to/input/groups.js +7 -15
  75. package/dist/RS/to/input/groups.js.map +1 -1
  76. package/dist/RS/to/input/individuals.js +4 -6
  77. package/dist/RS/to/input/individuals.js.map +1 -1
  78. package/dist/RS/to/input/input.js +21 -13
  79. package/dist/RS/to/input/input.js.map +1 -1
  80. package/dist/RS/to/input/intervals.js +10 -8
  81. package/dist/RS/to/input/intervals.js.map +1 -1
  82. package/dist/RS/to/input/linked-events-sets.js +96 -0
  83. package/dist/RS/to/input/linked-events-sets.js.map +1 -0
  84. package/dist/RS/to/input/locked-times.js +91 -0
  85. package/dist/RS/to/input/locked-times.js.map +1 -0
  86. package/dist/RS/to/input/periods.js +5 -36
  87. package/dist/RS/to/input/periods.js.map +1 -1
  88. package/dist/RS/to/input/settings.js +1 -8
  89. package/dist/RS/to/input/settings.js.map +1 -1
  90. package/dist/RS/to/input/teachers.js +8 -16
  91. package/dist/RS/to/input/teachers.js.map +1 -1
  92. package/dist/RS/to/input/util/parse-days.js +2 -2
  93. package/dist/RS/to/input/util/parse-days.js.map +1 -1
  94. package/dist/RS/to/input/util/parse-group-references.js +2 -10
  95. package/dist/RS/to/input/util/parse-group-references.js.map +1 -1
  96. package/dist/RS/to/input/util/parse-location-references.js +1 -7
  97. package/dist/RS/to/input/util/parse-location-references.js.map +1 -1
  98. package/dist/RS/to/input/util/parse-max-working-hours.js +4 -7
  99. package/dist/RS/to/input/util/parse-max-working-hours.js.map +1 -1
  100. package/dist/RS/to/input/util/parse-minimum-break-length.js +2 -2
  101. package/dist/RS/to/input/util/parse-minimum-break-length.js.map +1 -1
  102. package/dist/RS/to/input/util/util.js +5 -11
  103. package/dist/RS/to/input/util/util.js.map +1 -1
  104. package/dist/RS/to/schedules.js.map +1 -1
  105. package/dist/RS/types/algorithm-parameters.d.ts +1 -2
  106. package/dist/RS/types/index.d.ts +2 -31
  107. package/dist/RS/types/schedule-data.d.ts +12 -15
  108. package/dist/RS/types/to.d.ts +10 -18
  109. package/dist/RS/types/to.js +1 -1
  110. package/dist/RS/types/to.js.map +1 -1
  111. package/dist/SS12000/from/activities.js +2 -1
  112. package/dist/SS12000/from/activities.js.map +1 -1
  113. package/dist/SS12000/from/calendar-events.js.map +1 -1
  114. package/dist/SS12000/from/duties.js.map +1 -1
  115. package/dist/SS12000/from/groups.js.map +1 -1
  116. package/dist/SS12000/from/index.js.map +1 -1
  117. package/dist/SS12000/from/persons.js.map +1 -1
  118. package/dist/SS12000/from/resources.js.map +1 -1
  119. package/dist/SS12000/from/rooms.js.map +1 -1
  120. package/dist/SS12000/from/syllabuses.js.map +1 -1
  121. package/dist/SS12000/index.d.ts +9 -12782
  122. package/dist/SS12000/to/activities.js.map +1 -1
  123. package/dist/SS12000/to/calendar-events.js.map +1 -1
  124. package/dist/SS12000/to/common.js.map +1 -1
  125. package/dist/SS12000/to/duties.js.map +1 -1
  126. package/dist/SS12000/to/groups.js.map +1 -1
  127. package/dist/SS12000/to/index.d.ts +0 -1
  128. package/dist/SS12000/to/persons.js.map +1 -1
  129. package/dist/SS12000/to/resources.js.map +1 -1
  130. package/dist/SS12000/to/rooms.js.map +1 -1
  131. package/dist/SS12000/to/syllabuses.js.map +1 -1
  132. package/dist/SchoolSoft/api/from/index.js.map +1 -1
  133. package/dist/SchoolSoft/api/from/schedules.js +12 -8
  134. package/dist/SchoolSoft/api/from/schedules.js.map +1 -1
  135. package/dist/SchoolSoft/api/index.d.ts +7 -6
  136. package/dist/SchoolSoft/file/from/index.js.map +1 -1
  137. package/dist/SchoolSoft/file/from/schedules.js +87 -83
  138. package/dist/SchoolSoft/file/from/schedules.js.map +1 -1
  139. package/dist/SchoolSoft/file/index.d.ts +0 -1
  140. package/dist/SchoolSoft/file/to/index.d.ts +2 -3
  141. package/dist/SchoolSoft/file/to/schedules.js +2 -1
  142. package/dist/SchoolSoft/file/to/schedules.js.map +1 -1
  143. package/dist/SchoolSoft/index.d.ts +0 -1
  144. package/dist/Schoolity/txt/to/index.d.ts +0 -1
  145. package/dist/Schoolity/txt/to/schedules.js +14 -7
  146. package/dist/Schoolity/txt/to/schedules.js.map +1 -1
  147. package/dist/Skola24/mdb/from/course-and-events.js +5 -3
  148. package/dist/Skola24/mdb/from/course-and-events.js.map +1 -1
  149. package/dist/Skola24/mdb/from/groups.js.map +1 -1
  150. package/dist/Skola24/mdb/from/index.js.map +1 -1
  151. package/dist/Skola24/mdb/from/locations.js.map +1 -1
  152. package/dist/Skola24/mdb/from/schedule.d.ts +0 -1
  153. package/dist/Skola24/mdb/from/schedule.js.map +1 -1
  154. package/dist/Skola24/mdb/from/teachers.js.map +1 -1
  155. package/dist/Skola24/txt/from/calendar-exceptions.js +2 -1
  156. package/dist/Skola24/txt/from/calendar-exceptions.js.map +1 -1
  157. package/dist/Skola24/txt/from/division.js.map +1 -1
  158. package/dist/Skola24/txt/from/index.js.map +1 -1
  159. package/dist/Skola24/txt/from/period.js +34 -31
  160. package/dist/Skola24/txt/from/period.js.map +1 -1
  161. package/dist/Skola24/txt/from/schedules.d.ts +0 -1
  162. package/dist/Skola24/txt/from/schedules.js +10 -6
  163. package/dist/Skola24/txt/from/schedules.js.map +1 -1
  164. package/dist/Skola24/txt/from/util.js.map +1 -1
  165. package/dist/Skola24/txt/index.d.ts +0 -1
  166. package/dist/Skola24/txt/to/index.d.ts +0 -1
  167. package/dist/Skola24/txt/to/schedules.js +15 -8
  168. package/dist/Skola24/txt/to/schedules.js.map +1 -1
  169. package/dist/common/constants.js.map +1 -1
  170. package/dist/common/functions.js +2 -2
  171. package/dist/common/functions.js.map +1 -1
  172. package/dist/common/get-date.js.map +1 -1
  173. package/dist/common/make-chainable/index.js.map +1 -1
  174. package/dist/common/types.d.ts +28 -2
  175. package/dist/core/from/configurations.js.map +1 -1
  176. package/dist/core/from/courses.js.map +1 -1
  177. package/dist/core/from/events.js.map +1 -1
  178. package/dist/core/from/exceptions.js.map +1 -1
  179. package/dist/core/from/groups.js.map +1 -1
  180. package/dist/core/from/index.js.map +1 -1
  181. package/dist/core/from/locations.js.map +1 -1
  182. package/dist/core/from/locked-times.js.map +1 -1
  183. package/dist/core/from/overlap-groups.js.map +1 -1
  184. package/dist/core/from/periods.js.map +1 -1
  185. package/dist/core/from/persons.js.map +1 -1
  186. package/dist/core/from/root-intervals.js.map +1 -1
  187. package/dist/core/from/schedules.js.map +1 -1
  188. package/dist/core/from/settings.js.map +1 -1
  189. package/dist/core/from/syllabuses.js.map +1 -1
  190. package/dist/core/from/teachers.js.map +1 -1
  191. package/dist/core/index.d.ts +0 -1
  192. package/dist/core/interfaces/other/companies.d.ts +0 -1
  193. package/dist/core/interfaces/other/companies.js.map +1 -1
  194. package/dist/core/interfaces/other/operations.d.ts +0 -1
  195. package/dist/core/interfaces/vertices/companies.d.ts +0 -1
  196. package/dist/core/interfaces/vertices/configurations.d.ts +0 -1
  197. package/dist/core/interfaces/vertices/courses.d.ts +0 -1
  198. package/dist/core/interfaces/vertices/division-settings.d.ts +2 -3
  199. package/dist/core/interfaces/vertices/divisions.d.ts +0 -1
  200. package/dist/core/interfaces/vertices/events.d.ts +3 -1
  201. package/dist/core/interfaces/vertices/exceptions.d.ts +0 -1
  202. package/dist/core/interfaces/vertices/generations.d.ts +1 -3
  203. package/dist/core/interfaces/vertices/groups.d.ts +0 -1
  204. package/dist/core/interfaces/vertices/index.d.ts +15 -8
  205. package/dist/core/interfaces/vertices/linked-events-sets.d.ts +18 -0
  206. package/dist/core/interfaces/vertices/locations.d.ts +0 -1
  207. package/dist/core/interfaces/vertices/locked-times.d.ts +0 -2
  208. package/dist/core/interfaces/vertices/overlap-groups.d.ts +0 -1
  209. package/dist/core/interfaces/vertices/periods.d.ts +0 -3
  210. package/dist/core/interfaces/vertices/persons.d.ts +0 -1
  211. package/dist/core/interfaces/vertices/properties/belongs-to.d.ts +0 -1
  212. package/dist/core/interfaces/vertices/properties/coalesced.d.ts +0 -1
  213. package/dist/core/interfaces/vertices/root-intervals.d.ts +0 -2
  214. package/dist/core/interfaces/vertices/syllabuses.d.ts +0 -1
  215. package/dist/core/interfaces/vertices/teachers.d.ts +0 -1
  216. package/dist/core/interfaces/vertices/threads.d.ts +0 -1
  217. package/dist/core/interfaces/vertices/users.d.ts +0 -1
  218. package/dist/core/interfaces/vertices/util/custom-vertex-export/index.d.ts +6 -6
  219. package/dist/core/interfaces/vertices/util/custom-vertex-export/util.d.ts +4 -4
  220. package/dist/core/interfaces/vertices/util/deep-vertex-export/index.d.ts +10 -10
  221. package/dist/core/interfaces/vertices/util/edges.d.ts +7 -7
  222. package/dist/core/interfaces/vertices/util/util.d.ts +24 -20
  223. package/dist/core/interfaces/vertices/util/vertex-query/index.d.ts +11 -11
  224. package/dist/core/interfaces/vertices/util/vertex.d.ts +5 -4
  225. package/dist/core/interfaces/vertices/vertex-query.d.ts +29 -27
  226. package/dist/core/interfaces/vertices/vertex-query.js +4 -0
  227. package/dist/core/interfaces/vertices/vertex-query.js.map +1 -1
  228. package/dist/core/to/configurations.js +2 -1
  229. package/dist/core/to/configurations.js.map +1 -1
  230. package/dist/core/to/courses.js +2 -1
  231. package/dist/core/to/courses.js.map +1 -1
  232. package/dist/core/to/division.js.map +1 -1
  233. package/dist/core/to/events.js +3 -1
  234. package/dist/core/to/events.js.map +1 -1
  235. package/dist/core/to/exceptions.js +2 -1
  236. package/dist/core/to/exceptions.js.map +1 -1
  237. package/dist/core/to/groups.js +2 -1
  238. package/dist/core/to/groups.js.map +1 -1
  239. package/dist/core/to/linked-events-sets.js +18 -0
  240. package/dist/core/to/linked-events-sets.js.map +1 -0
  241. package/dist/core/to/locations.js +2 -1
  242. package/dist/core/to/locations.js.map +1 -1
  243. package/dist/core/to/locked-times.js +2 -1
  244. package/dist/core/to/locked-times.js.map +1 -1
  245. package/dist/core/to/overlap-groups.js +2 -1
  246. package/dist/core/to/overlap-groups.js.map +1 -1
  247. package/dist/core/to/periods.js +2 -1
  248. package/dist/core/to/periods.js.map +1 -1
  249. package/dist/core/to/persons.js +2 -1
  250. package/dist/core/to/persons.js.map +1 -1
  251. package/dist/core/to/root-intervals.js +2 -1
  252. package/dist/core/to/root-intervals.js.map +1 -1
  253. package/dist/core/to/schedules.d.ts +2 -1
  254. package/dist/core/to/schedules.js +3 -1
  255. package/dist/core/to/schedules.js.map +1 -1
  256. package/dist/core/to/settings.js +2 -1
  257. package/dist/core/to/settings.js.map +1 -1
  258. package/dist/core/to/syllabuses.js +2 -1
  259. package/dist/core/to/syllabuses.js.map +1 -1
  260. package/dist/core/to/teachers.js +2 -1
  261. package/dist/core/to/teachers.js.map +1 -1
  262. package/dist/core/to/util.d.ts +0 -2
  263. package/dist/core/to/util.js +2 -1
  264. package/dist/core/to/util.js.map +1 -1
  265. package/dist/core/types/index.d.ts +5 -1
  266. package/dist/core/util.js +5 -3
  267. package/dist/core/util.js.map +1 -1
  268. package/dist/identify/constants/index.d.ts +1 -1
  269. package/dist/identify/constants/index.js.map +1 -1
  270. package/dist/identify/index.js +2 -1
  271. package/dist/identify/index.js.map +1 -1
  272. package/dist/sdui/from/classes.js.map +1 -1
  273. package/dist/sdui/from/courses.js.map +1 -1
  274. package/dist/sdui/from/holidays.js.map +1 -1
  275. package/dist/sdui/from/index.js.map +1 -1
  276. package/dist/sdui/from/lessons.js.map +1 -1
  277. package/dist/sdui/from/rooms.js.map +1 -1
  278. package/dist/sdui/from/schedules.d.ts +0 -2
  279. package/dist/sdui/from/schedules.js.map +1 -1
  280. package/dist/sdui/from/school-years.js.map +1 -1
  281. package/dist/sdui/from/substitution-plans.js.map +1 -1
  282. package/dist/sdui/from/teachers.js.map +1 -1
  283. package/dist/sdui/to/classes.js.map +1 -1
  284. package/dist/sdui/to/courses.js.map +1 -1
  285. package/dist/sdui/to/holidays.js +1 -1
  286. package/dist/sdui/to/holidays.js.map +1 -1
  287. package/dist/sdui/to/hours.js.map +1 -1
  288. package/dist/sdui/to/index.d.ts +0 -2
  289. package/dist/sdui/to/lessons.js +1 -1
  290. package/dist/sdui/to/lessons.js.map +1 -1
  291. package/dist/sdui/to/rooms.js.map +1 -1
  292. package/dist/sdui/to/schedules.js.map +1 -1
  293. package/dist/sdui/to/school-years.js +1 -1
  294. package/dist/sdui/to/school-years.js.map +1 -1
  295. package/dist/sdui/to/substitution-plans.js +7 -4
  296. package/dist/sdui/to/substitution-plans.js.map +1 -1
  297. package/dist/sdui/to/teachers.js.map +1 -1
  298. package/dist/vKlass/from/index.js.map +1 -1
  299. package/dist/vKlass/from/schedule.d.ts +0 -1
  300. package/dist/vKlass/from/schedule.js.map +1 -1
  301. package/dist/vKlass/to/schedules.js +17 -6
  302. package/dist/vKlass/to/schedules.js.map +1 -1
  303. package/package.json +29 -24
  304. package/dist/RS/to/input/collections.js +0 -58
  305. package/dist/RS/to/input/collections.js.map +0 -1
  306. package/dist/RS/to/input/dynamic-locked-times.js +0 -69
  307. package/dist/RS/to/input/dynamic-locked-times.js.map +0 -1
  308. package/dist/RS/to/input/util/attach-locked-times.js +0 -27
  309. package/dist/RS/to/input/util/attach-locked-times.js.map +0 -1
  310. package/dist/RS/to/input/util/parse-intervals.js +0 -56
  311. package/dist/RS/to/input/util/parse-intervals.js.map +0 -1
  312. package/dist/RS/types/collections.d.ts +0 -33
  313. package/dist/RS/types/default.d.ts +0 -31
  314. package/dist/RS/types/dependencies.d.ts +0 -16
  315. package/dist/RS/types/events.d.ts +0 -34
  316. package/dist/RS/types/groups.d.ts +0 -27
  317. package/dist/RS/types/individuals.d.ts +0 -16
  318. package/dist/RS/types/locked-times.d.ts +0 -12
  319. package/dist/RS/types/period.d.ts +0 -27
  320. package/dist/RS/types/root-intervals.d.ts +0 -10
  321. package/dist/RS/types/settings.d.ts +0 -15
  322. package/dist/RS/types/shared.d.ts +0 -27
  323. package/dist/core/interfaces/index.d.ts +0 -23
  324. package/dist/core/interfaces/other/index.d.ts +0 -6
  325. package/dist/core/interfaces/vertices/util/index.d.ts +0 -6
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":[],"sources":["../../../src/IdunSoft/to/schedules.ts"],"sourcesContent":["import type { ParserOptions } from '@json2csv/plainjs';\nimport { Parser } from '@json2csv/plainjs';\nimport moment from 'moment';\nimport type { Types as IdunSoftTypes } from '../types';\nimport type { CoreTypes } from '../../core';\nimport { getDayIndex } from '../../core/util';\nimport { isMongooseObjectId } from '../../common/functions';\n\nconst days = ['måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag'];\nconst fields = ['Veckodag', 'Starttid', 'Sluttid', 'Klass', 'Ämne', 'Kommentar', 'Lärare', 'Klassrum', 'Halvklass'];\nconst delimiter = '\\t';\nconst quote = '';\n\nexport default (courseEvents: CoreTypes.Mixed.Event[]): string => {\n const events = courseEvents\n .map(event => {\n if (event.parked) return;\n if (!event.start || !event.end) return;\n\n const day = days.at(getDayIndex(event.start));\n if (!day) throw new Error('Invalid event day');\n\n const course = event.course;\n if (!course || typeof course == 'string' || isMongooseObjectId(course))\n throw new Error('Event course not found or invalid');\n\n const teachers = (event.teachers ?? course.teachers)?.map(x => x.to);\n const groups = (event.groups ?? course.groups )?.map(x => x.to);\n\n const doc: IdunSoftTypes.toEvent = {\n Ämne: course.ids,\n Veckodag: day,\n Starttid: moment.utc(event.start).format('HH.mm:ss'),\n Sluttid: moment.utc(event.end ).format('HH.mm:ss'),\n Lärare: (teachers ?? []).map(x => typeof x == 'object' && 'ids' in x ? x.ids : null).filter(x => x != null).join(','),\n Klass: (groups ?? []).map(x => typeof x == 'object' && 'ids' in x ? x.ids : null).filter(x => x != null).join(','),\n Klassrum: (event.inLocations ?? []).map(x => x && typeof x == 'object' && 'ids' in x ? x.ids : null).filter(x => x != null).join(','),\n Halvklass: 'Nej'\n };\n return doc;\n })\n .filter(x => x != null);\n\n const opts: ParserOptions<IdunSoftTypes.toEvent> = { fields, delimiter/* , quote */ };\n const parser = new Parser(opts);\n return parser.parse(events);\n};\n"],"mappings":";;;;;;AAQA,MAAM,OAAY;CAAC;CAAU;CAAU;CAAU;CAAW;CAAS;AACrE,MAAM,SAAY;CAAC;CAAY;CAAY;CAAW;CAAS;CAAQ;CAAa;CAAU;CAAY;CAAY;AACtH,MAAM,YAAY;AAGlB,yBAAgB,iBAAkD;CAChE,MAAM,SAAS,aACZ,KAAI,UAAS;AACZ,MAAI,MAAM,OAAQ;AAClB,MAAI,CAAC,MAAM,SAAS,CAAC,MAAM,IAAK;EAEhC,MAAM,MAAM,KAAK,GAAG,YAAY,MAAM,MAAM,CAAC;AAC7C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,oBAAoB;EAE9C,MAAM,SAAS,MAAM;AACrB,MAAI,CAAC,UAAU,OAAO,UAAU,YAAY,mBAAmB,OAAO,CACpE,OAAM,IAAI,MAAM,oCAAoC;EAEtD,MAAM,YAAY,MAAM,YAAY,OAAO,WAAW,KAAI,MAAK,EAAE,GAAG;EACpE,MAAM,UAAY,MAAM,UAAY,OAAO,SAAW,KAAI,MAAK,EAAE,GAAG;AAYpE,SAVmC;GACjC,MAAW,OAAO;GAClB,UAAW;GACX,UAAW,OAAO,IAAI,MAAM,MAAM,CAAC,OAAO,WAAW;GACrD,SAAW,OAAO,IAAI,MAAM,IAAM,CAAC,OAAO,WAAW;GACrD,SAAY,YAAqB,EAAE,EAAE,KAAI,MAAU,OAAO,KAAK,YAAY,SAAS,IAAI,EAAE,MAAM,KAAK,CAAC,QAAO,MAAK,KAAK,KAAK,CAAC,KAAK,IAAI;GACtI,QAAY,UAAqB,EAAE,EAAE,KAAI,MAAU,OAAO,KAAK,YAAY,SAAS,IAAI,EAAE,MAAM,KAAK,CAAC,QAAO,MAAK,KAAK,KAAK,CAAC,KAAK,IAAI;GACtI,WAAY,MAAM,eAAe,EAAE,EAAE,KAAI,MAAK,KAAK,OAAO,KAAK,YAAY,SAAS,IAAI,EAAE,MAAM,KAAK,CAAC,QAAO,MAAK,KAAK,KAAK,CAAC,KAAK,IAAI;GACtI,WAAW;GACZ;GAED,CACD,QAAO,MAAK,KAAK,KAAK;AAIzB,QADe,IAAI,OADgC;EAAE;EAAQ;EAAwB,CACtD,CACjB,MAAM,OAAO"}
1
+ {"version":3,"file":"schedules.js","names":["doc: IdunSoftTypes.toEvent","opts: ParserOptions<IdunSoftTypes.toEvent>"],"sources":["../../../src/IdunSoft/to/schedules.ts"],"sourcesContent":["import type { ParserOptions } from '@json2csv/plainjs';\nimport { Parser } from '@json2csv/plainjs';\nimport moment from 'moment';\nimport type { Types as IdunSoftTypes } from '../types';\nimport type { CoreTypes } from '../../core';\nimport { getDayIndex } from '../../core/util';\nimport { isMongooseObjectId } from '../../common/functions';\n\nconst days = ['måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag'];\nconst fields = ['Veckodag', 'Starttid', 'Sluttid', 'Klass', 'Ämne', 'Kommentar', 'Lärare', 'Klassrum', 'Halvklass'];\nconst delimiter = '\\t';\nconst quote = '';\n\nexport default (courseEvents: CoreTypes.Mixed.Event[]): string => {\n const events = courseEvents\n .map(event => {\n if (event.parked) return;\n if (!event.start || !event.end) return;\n\n const day = days.at(getDayIndex(event.start));\n if (!day) throw new Error('Invalid event day');\n\n const course = event.course;\n if (!course || typeof course == 'string' || isMongooseObjectId(course))\n throw new Error('Event course not found or invalid');\n\n const teachers = (event.teachers ?? course.teachers)?.map(x => x.to);\n const groups = (event.groups ?? course.groups )?.map(x => x.to);\n\n const doc: IdunSoftTypes.toEvent = {\n Ämne: course.ids,\n Veckodag: day,\n Starttid: moment.utc(event.start).format('HH.mm:ss'),\n Sluttid: moment.utc(event.end ).format('HH.mm:ss'),\n Lärare: (teachers ?? []).map(x => typeof x == 'object' && 'ids' in x ? x.ids : null).filter(x => x != null).join(','),\n Klass: (groups ?? []).map(x => typeof x == 'object' && 'ids' in x ? x.ids : null).filter(x => x != null).join(','),\n Klassrum: (event.inLocations ?? []).map(x => x && typeof x == 'object' && 'ids' in x ? x.ids : null).filter(x => x != null).join(','),\n Halvklass: 'Nej'\n };\n return doc;\n })\n .filter(x => x != null);\n\n const opts: ParserOptions<IdunSoftTypes.toEvent> = { fields, delimiter/* , quote */ };\n const parser = new Parser(opts);\n return parser.parse(events);\n};\n"],"mappings":";;;;;;AAQA,MAAM,OAAY;CAAC;CAAU;CAAU;CAAU;CAAW;;AAC5D,MAAM,SAAY;CAAC;CAAY;CAAY;CAAW;CAAS;CAAQ;CAAa;CAAU;CAAY;;AAC1G,MAAM,YAAY;AAGlB,yBAAgB,iBAAkD;CAChE,MAAM,SAAS,aACZ,KAAI,UAAS;AACZ,MAAI,MAAM,OAAQ;AAClB,MAAI,CAAC,MAAM,SAAS,CAAC,MAAM,IAAK;EAEhC,MAAM,MAAM,KAAK,GAAG,YAAY,MAAM;AACtC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM;EAE1B,MAAM,SAAS,MAAM;AACrB,MAAI,CAAC,UAAU,OAAO,UAAU,YAAY,mBAAmB,QAC7D,OAAM,IAAI,MAAM;EAElB,MAAM,YAAY,MAAM,YAAY,OAAO,WAAW,KAAI,MAAK,EAAE;EACjE,MAAM,UAAY,MAAM,UAAY,OAAO,SAAW,KAAI,MAAK,EAAE;EAEjE,MAAMA,MAA6B;GACjC,MAAW,OAAO;GAClB,UAAW;GACX,UAAW,OAAO,IAAI,MAAM,OAAO,OAAO;GAC1C,SAAW,OAAO,IAAI,MAAM,KAAO,OAAO;GAC1C,SAAY,YAAqB,IAAI,KAAI,MAAU,OAAO,KAAK,YAAY,SAAS,IAAI,EAAE,MAAM,MAAM,QAAO,MAAK,KAAK,MAAM,KAAK;GAClI,QAAY,UAAqB,IAAI,KAAI,MAAU,OAAO,KAAK,YAAY,SAAS,IAAI,EAAE,MAAM,MAAM,QAAO,MAAK,KAAK,MAAM,KAAK;GAClI,WAAY,MAAM,eAAe,IAAI,KAAI,MAAK,KAAK,OAAO,KAAK,YAAY,SAAS,IAAI,EAAE,MAAM,MAAM,QAAO,MAAK,KAAK,MAAM,KAAK;GAClI,WAAW;;AAEb,SAAO;IAER,QAAO,MAAK,KAAK;CAEpB,MAAMC,OAA6C;EAAE;EAAQ;;CAC7D,MAAM,SAAS,IAAI,OAAO;AAC1B,QAAO,OAAO,MAAM"}
@@ -1,5 +1,4 @@
1
1
  import { Types } from "../../core/types/index.js";
2
- import "../../index.js";
3
2
 
4
3
  //#region src/InfoMentor/to/index.d.ts
5
4
  declare class export_default {
@@ -1,5 +1,5 @@
1
- import { getDayIndex } from "../../core/util.js";
2
1
  import { isMongooseObjectId } from "../../common/functions.js";
2
+ import { getDayIndex } from "../../core/util.js";
3
3
  import moment from "moment";
4
4
  import Papa from "papaparse";
5
5
  import iconv from "iconv-lite";
@@ -34,7 +34,7 @@ var schedules_default = (courseEvents) => {
34
34
  const Personal = (event.teachers ?? course.teachers ?? []).map(({ to: x }) => typeof x == "object" && "displayName" in x ? x.displayName : null).filter((x) => x != null).join(",");
35
35
  const Klasser = (event.groups ?? course.groups ?? []).map(({ to: x }) => typeof x == "object" && "displayName" in x ? x.displayName : null).filter((x) => x != null).join(",");
36
36
  const Salar = (event.inLocations ?? []).map((x) => x && typeof x == "object" && "displayName" in x ? x.displayName : null).filter((x) => x != null).join(",");
37
- return {
37
+ const doc = {
38
38
  Ämne: course.displayName,
39
39
  Dag: day,
40
40
  Starttid: moment.utc(event.start).format("HH.mm"),
@@ -43,6 +43,7 @@ var schedules_default = (courseEvents) => {
43
43
  Klasser,
44
44
  Salar
45
45
  };
46
+ return doc;
46
47
  });
47
48
  const opts = {
48
49
  columns,
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":[],"sources":["../../../src/InfoMentor/to/schedules.ts"],"sourcesContent":["import moment from 'moment';\nimport iconv from 'iconv-lite';\nimport Papa from 'papaparse';\nimport type { Types as InfoMentorTypes } from '../types';\nimport type { CoreTypes } from '../../core';\nimport { getDayIndex } from '../../core/util';\nimport { isMongooseObjectId } from '../../common/functions';\n\nconst days = ['MÅN', 'TIS', 'ONS', 'TOR', 'FRE'];\nconst columns = ['Ämne', 'Dag', 'Starttid', 'Längd', 'Personal', 'Klasser', 'Salar'];\nconst delimiter = '\\t';\nconst encoding = 'windows-1252';\n\nexport default (courseEvents: CoreTypes.Mixed.Event[]): Buffer => {\n const events = courseEvents\n .map(event => {\n if (event.parked || !event.start || !event.end) return;\n\n const course = event.course;\n if (!course) return;\n\n const day = days.at(getDayIndex(event.start));\n if (!day) throw new Error('Invalid event day');\n\n if (typeof course == 'string' || isMongooseObjectId(course))\n throw new Error('(InfoMentor::To::Schedules) Event course is not an deserialized object');\n\n const Personal = (event.teachers ?? course.teachers ?? []).map(({ to: x }) => typeof x == 'object' && 'displayName' in x ? x.displayName : null).filter(x => x != null).join(',');\n const Klasser = (event.groups ?? course.groups ?? []).map(({ to: x }) => typeof x == 'object' && 'displayName' in x ? x.displayName : null).filter(x => x != null).join(',');\n const Salar = (event.inLocations ?? []).map(x => x && typeof x == 'object' && 'displayName' in x ? x.displayName : null).filter(x => x != null).join(',');\n\n const doc: InfoMentorTypes.event ={\n Ämne: course.displayName,\n Dag: day,\n Starttid: moment.utc(event.start).format('HH.mm'),\n Längd: moment.utc(event.end).diff(moment.utc(event.start), 'minutes'),\n Personal,\n Klasser,\n Salar,\n };\n return doc;\n });\n\n const opts = { columns, delimiter };\n const csv = Papa.unparse(events, opts);\n return iconv.encode(csv, encoding);\n};\n"],"mappings":";;;;;;;AAQA,MAAM,OAAY;CAAC;CAAO;CAAO;CAAO;CAAO;CAAM;AACrD,MAAM,UAAY;CAAC;CAAQ;CAAO;CAAY;CAAS;CAAY;CAAW;CAAQ;AACtF,MAAM,YAAY;AAClB,MAAM,WAAY;AAElB,yBAAgB,iBAAkD;CAChE,MAAM,SAAS,aACZ,KAAI,UAAS;AACZ,MAAI,MAAM,UAAU,CAAC,MAAM,SAAS,CAAC,MAAM,IAAK;EAEhD,MAAM,SAAS,MAAM;AACrB,MAAI,CAAC,OAAQ;EAEb,MAAM,MAAM,KAAK,GAAG,YAAY,MAAM,MAAM,CAAC;AAC7C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,oBAAoB;AAE9C,MAAI,OAAO,UAAU,YAAY,mBAAmB,OAAO,CACzD,OAAM,IAAI,MAAM,yEAAyE;EAE3F,MAAM,YAAY,MAAM,YAAY,OAAO,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,QAAa,OAAO,KAAK,YAAY,iBAAiB,IAAI,EAAE,cAAc,KAAK,CAAC,QAAO,MAAK,KAAK,KAAK,CAAC,KAAK,IAAI;EACtL,MAAM,WAAY,MAAM,UAAY,OAAO,UAAY,EAAE,EAAE,KAAK,EAAE,IAAI,QAAa,OAAO,KAAK,YAAY,iBAAiB,IAAI,EAAE,cAAc,KAAK,CAAC,QAAO,MAAK,KAAK,KAAK,CAAC,KAAK,IAAI;EACtL,MAAM,SAAY,MAAM,eAA+B,EAAE,EAAE,KAAI,MAAe,KAAK,OAAO,KAAK,YAAY,iBAAiB,IAAI,EAAE,cAAc,KAAK,CAAC,QAAO,MAAK,KAAK,KAAK,CAAC,KAAK,IAAI;AAWtL,SATkC;GAChC,MAAU,OAAO;GACjB,KAAU;GACV,UAAU,OAAO,IAAI,MAAM,MAAM,CAAC,OAAO,QAAQ;GACjD,OAAU,OAAO,IAAI,MAAM,IAAI,CAAC,KAAK,OAAO,IAAI,MAAM,MAAM,EAAE,UAAU;GACxE;GACA;GACA;GACD;GAED;CAEJ,MAAM,OAAO;EAAE;EAAS;EAAW;CACnC,MAAM,MAAM,KAAK,QAAQ,QAAQ,KAAK;AACtC,QAAO,MAAM,OAAO,KAAK,SAAS"}
1
+ {"version":3,"file":"schedules.js","names":["doc: InfoMentorTypes.event"],"sources":["../../../src/InfoMentor/to/schedules.ts"],"sourcesContent":["import moment from 'moment';\nimport iconv from 'iconv-lite';\nimport Papa from 'papaparse';\nimport type { Types as InfoMentorTypes } from '../types';\nimport type { CoreTypes } from '../../core';\nimport { getDayIndex } from '../../core/util';\nimport { isMongooseObjectId } from '../../common/functions';\n\nconst days = ['MÅN', 'TIS', 'ONS', 'TOR', 'FRE'];\nconst columns = ['Ämne', 'Dag', 'Starttid', 'Längd', 'Personal', 'Klasser', 'Salar'];\nconst delimiter = '\\t';\nconst encoding = 'windows-1252';\n\nexport default (courseEvents: CoreTypes.Mixed.Event[]): Buffer => {\n const events = courseEvents\n .map(event => {\n if (event.parked || !event.start || !event.end) return;\n\n const course = event.course;\n if (!course) return;\n\n const day = days.at(getDayIndex(event.start));\n if (!day) throw new Error('Invalid event day');\n\n if (typeof course == 'string' || isMongooseObjectId(course))\n throw new Error('(InfoMentor::To::Schedules) Event course is not an deserialized object');\n\n const Personal = (event.teachers ?? course.teachers ?? []).map(({ to: x }) => typeof x == 'object' && 'displayName' in x ? x.displayName : null).filter(x => x != null).join(',');\n const Klasser = (event.groups ?? course.groups ?? []).map(({ to: x }) => typeof x == 'object' && 'displayName' in x ? x.displayName : null).filter(x => x != null).join(',');\n const Salar = (event.inLocations ?? []).map(x => x && typeof x == 'object' && 'displayName' in x ? x.displayName : null).filter(x => x != null).join(',');\n\n const doc: InfoMentorTypes.event ={\n Ämne: course.displayName,\n Dag: day,\n Starttid: moment.utc(event.start).format('HH.mm'),\n Längd: moment.utc(event.end).diff(moment.utc(event.start), 'minutes'),\n Personal,\n Klasser,\n Salar,\n };\n return doc;\n });\n\n const opts = { columns, delimiter };\n const csv = Papa.unparse(events, opts);\n return iconv.encode(csv, encoding);\n};\n"],"mappings":";;;;;;;AAQA,MAAM,OAAY;CAAC;CAAO;CAAO;CAAO;CAAO;;AAC/C,MAAM,UAAY;CAAC;CAAQ;CAAO;CAAY;CAAS;CAAY;CAAW;;AAC9E,MAAM,YAAY;AAClB,MAAM,WAAY;AAElB,yBAAgB,iBAAkD;CAChE,MAAM,SAAS,aACZ,KAAI,UAAS;AACZ,MAAI,MAAM,UAAU,CAAC,MAAM,SAAS,CAAC,MAAM,IAAK;EAEhD,MAAM,SAAS,MAAM;AACrB,MAAI,CAAC,OAAQ;EAEb,MAAM,MAAM,KAAK,GAAG,YAAY,MAAM;AACtC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM;AAE1B,MAAI,OAAO,UAAU,YAAY,mBAAmB,QAClD,OAAM,IAAI,MAAM;EAElB,MAAM,YAAY,MAAM,YAAY,OAAO,YAAY,IAAI,KAAK,EAAE,IAAI,QAAa,OAAO,KAAK,YAAY,iBAAiB,IAAI,EAAE,cAAc,MAAM,QAAO,MAAK,KAAK,MAAM,KAAK;EAClL,MAAM,WAAY,MAAM,UAAY,OAAO,UAAY,IAAI,KAAK,EAAE,IAAI,QAAa,OAAO,KAAK,YAAY,iBAAiB,IAAI,EAAE,cAAc,MAAM,QAAO,MAAK,KAAK,MAAM,KAAK;EAClL,MAAM,SAAY,MAAM,eAA+B,IAAI,KAAI,MAAe,KAAK,OAAO,KAAK,YAAY,iBAAiB,IAAI,EAAE,cAAc,MAAM,QAAO,MAAK,KAAK,MAAM,KAAK;EAElL,MAAMA,MAA4B;GAChC,MAAU,OAAO;GACjB,KAAU;GACV,UAAU,OAAO,IAAI,MAAM,OAAO,OAAO;GACzC,OAAU,OAAO,IAAI,MAAM,KAAK,KAAK,OAAO,IAAI,MAAM,QAAQ;GAC9D;GACA;GACA;;AAEF,SAAO;;CAGX,MAAM,OAAO;EAAE;EAAS;;CACxB,MAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,QAAO,MAAM,OAAO,KAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_schedules"],"sources":["../../../src/PlanDigital/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../common/types';\nimport _schedules from './schedules';\n\nexport default {\n schedules: _schedules\n} satisfies FromInterface;"],"mappings":";;;AAGA,mBAAe,EACb,WAAWA,mBACZ"}
1
+ {"version":3,"file":"index.js","names":["_schedules"],"sources":["../../../src/PlanDigital/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../common/types';\nimport _schedules from './schedules';\n\nexport default {\n schedules: _schedules\n} satisfies FromInterface;"],"mappings":";;;AAGA,mBAAe,EACb,WAAWA"}
@@ -17,7 +17,8 @@ var schedules_default = (input, options) => {
17
17
  errors.push(`The selected period ${x} does not exist.`);
18
18
  return { meta: { errors } };
19
19
  }
20
- if (size(countBy(input["Perioder"].map((x) => x.Tidsenhet))) > 1) {
20
+ const numUnits = size(countBy(input["Perioder"].map((x) => x.Tidsenhet)));
21
+ if (numUnits > 1) {
21
22
  errors.push("Different time periods used for different periods.");
22
23
  return { meta: { errors } };
23
24
  }
@@ -30,18 +31,18 @@ var schedules_default = (input, options) => {
30
31
  if (sum(periodTimes) == 0) return;
31
32
  const displayName = c[options.displayName ?? "Gruppnamn"];
32
33
  const subject = c["Kurskod"];
33
- const groups = c["Klass"]?.split(",").map((x) => x.trim());
34
+ const groups$1 = c["Klass"]?.split(",").map((x) => x.trim());
34
35
  const teachers$1 = c["Sign"]?.split(",").map((x) => x.trim());
35
36
  const periodTime = size(countBy(periodTimes)) == 1 ? periodTimes[0] : void 0;
36
37
  const minutesPerWeek = timeUnit == "Minuter/Vecka" ? periodTime : void 0;
37
38
  const expectedTotalHours = timeUnit == "Timmar/Period" ? periodTime : void 0;
38
39
  teachers$1.forEach((x) => teacherSet.add(x));
39
- groups.forEach((x) => groupSet.add(x));
40
+ groups$1.forEach((x) => groupSet.add(x));
40
41
  courses.push({
41
42
  displayName,
42
43
  subject,
43
44
  teachers: teachers$1.map((to) => ({ to })),
44
- groups: groups.map((to) => ({ to })),
45
+ groups: groups$1.map((to) => ({ to })),
45
46
  ...minutesPerWeek != void 0 && { minutesPerWeek },
46
47
  ...expectedTotalHours != void 0 && { expectedTotalHours }
47
48
  });
@@ -50,12 +51,13 @@ var schedules_default = (input, options) => {
50
51
  ids,
51
52
  displayName: ids
52
53
  }));
54
+ const groups = [...groupSet].map((ids) => ({
55
+ ids,
56
+ displayName: ids,
57
+ species: "class"
58
+ }));
53
59
  return {
54
- groups: [...groupSet].map((ids) => ({
55
- ids,
56
- displayName: ids,
57
- species: "class"
58
- })),
60
+ groups,
59
61
  teachers,
60
62
  courses,
61
63
  meta: {
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":["warnings: string[]","errors: string[]","teachers"],"sources":["../../../src/PlanDigital/from/schedules.ts"],"sourcesContent":["import { size, countBy, sum } from 'lodash-es';\nimport type { CoreTypes } from '../../core';\nimport type { Types as PlanDigitalTypes } from '../types';\nimport type { InternalIdKey } from '../../core/types/common';\n\nnamespace OutTypes {\n export type group = Omit<CoreTypes.Serialized.Group, InternalIdKey>;\n export type teacher = Omit<CoreTypes.Serialized.Teacher, InternalIdKey>;\n export type course = Omit<CoreTypes.Serialized.Course, InternalIdKey>;\n}\n\ntype Out = {\n groups?: OutTypes.group[];\n teachers?: OutTypes.teacher[];\n courses?: OutTypes.course[];\n meta?: {\n errors?: string[];\n warnings?: string[];\n };\n};\n\nexport default (\n input: PlanDigitalTypes.schedule,\n options: PlanDigitalTypes.options\n): Out => {\n // gather all import related warnings/errors\n const warnings: string[] = [];\n const errors: string[] = [];\n\n // there must be at least a single period\n if (!input['Perioder'].length) {\n errors.push('The schedule data does not contain any periods.');\n return { meta: { errors } };\n }\n\n // ensure that at least one period is selected\n const selectedPeriods = options.selectedPeriods;\n if (!selectedPeriods?.length) {\n errors.push('No periods were selected.');\n return { meta: { errors } };\n }\n\n // ensure that the selected periods exist\n for (const x of options.selectedPeriods ?? []) {\n if (!input['Perioder'].some(p => p.Namn == x)) {\n errors.push(`The selected period ${x} does not exist.`);\n return { meta: { errors } };\n }\n }\n\n // ensure that all periods use the same time unit\n const numUnits = size(countBy(input['Perioder'].map(x => x.Tidsenhet)));\n if (numUnits > 1) {\n errors.push('Different time periods used for different periods.');\n return { meta: { errors } };\n }\n const timeUnit = input['Perioder'][0].Tidsenhet;\n\n\n ////\n //// fetch courses, groups, and teachers\n ////\n const courses = new Array<OutTypes.course>();\n const teacherSet = new Set<string>();\n const groupSet = new Set<string>();\n input['Tabell Tjänstefördelning'].forEach(c => {\n // check if the course should be taken into account\n // (the course must then have some scheduled time during the selected periods)\n const periodTimes = selectedPeriods.map(x => c[`Tid ${x}`] ?? 0);\n if (sum(periodTimes) == 0) return;\n\n const displayName = c[options.displayName ?? 'Gruppnamn'];\n const subject = c['Kurskod'];\n const groups = c['Klass']?.split(',').map(x => x.trim());\n const teachers = c['Sign'] ?.split(',').map(x => x.trim());\n\n // fetch the expected schedule time in whatever units\n const periodTime = size(countBy(periodTimes)) == 1 ? periodTimes[0] : undefined;\n const minutesPerWeek = timeUnit == 'Minuter/Vecka' ? periodTime : undefined;\n const expectedTotalHours = timeUnit == 'Timmar/Period' ? periodTime : undefined;\n\n // add groups and teachers\n teachers.forEach(x => teacherSet.add(x));\n groups.forEach(x => groupSet.add(x));\n\n // add course\n courses.push({\n displayName,\n subject,\n teachers: teachers.map(to => ({ to })),\n groups: groups .map(to => ({ to })),\n\n ...(minutesPerWeek != undefined && { minutesPerWeek }),\n ...(expectedTotalHours != undefined && { expectedTotalHours })\n });\n\n });\n\n\n const teachers = [...teacherSet].map(ids => ({ ids, displayName: ids }));\n const groups = [...groupSet ].map(ids => ({ ids, displayName: ids, species: 'class' as const }));\n return { groups, teachers, courses,\n meta: {\n ...( errors.length && { errors: errors } ),\n ...( warnings.length && { warnings: warnings } )\n }\n };\n};"],"mappings":";;;AAqBA,yBACE,OACA,YACQ;CAER,MAAMA,WAAqB,EAAE;CAC7B,MAAMC,SAAqB,EAAE;AAG7B,KAAI,CAAC,MAAM,YAAY,QAAQ;AAC7B,SAAO,KAAK,kDAAkD;AAC9D,SAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;;CAI7B,MAAM,kBAAkB,QAAQ;AAChC,KAAI,CAAC,iBAAiB,QAAQ;AAC5B,SAAO,KAAK,4BAA4B;AACxC,SAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;;AAI7B,MAAK,MAAM,KAAK,QAAQ,mBAAmB,EAAE,CAC3C,KAAI,CAAC,MAAM,YAAY,MAAK,MAAK,EAAE,QAAQ,EAAE,EAAE;AAC7C,SAAO,KAAK,uBAAuB,EAAE,kBAAkB;AACvD,SAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;;AAM/B,KADiB,KAAK,QAAQ,MAAM,YAAY,KAAI,MAAK,EAAE,UAAU,CAAC,CAAC,GACxD,GAAG;AAChB,SAAO,KAAK,qDAAqD;AACjE,SAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;;CAE7B,MAAM,WAAW,MAAM,YAAY,GAAG;CAMtC,MAAM,UAAa,IAAI,OAAwB;CAC/C,MAAM,6BAAa,IAAI,KAAa;CACpC,MAAM,2BAAa,IAAI,KAAa;AACpC,OAAM,4BAA4B,SAAQ,MAAK;EAG7C,MAAM,cAAc,gBAAgB,KAAI,MAAK,EAAE,OAAO,QAAQ,EAAE;AAChE,MAAI,IAAI,YAAY,IAAI,EAAG;EAE3B,MAAM,cAAc,EAAE,QAAQ,eAAe;EAC7C,MAAM,UAAc,EAAE;EACtB,MAAM,SAAc,EAAE,UAAU,MAAM,IAAI,CAAC,KAAI,MAAK,EAAE,MAAM,CAAC;EAC7D,MAAMC,aAAc,EAAE,SAAU,MAAM,IAAI,CAAC,KAAI,MAAK,EAAE,MAAM,CAAC;EAG7D,MAAM,aAAqB,KAAK,QAAQ,YAAY,CAAC,IAAI,IAAI,YAAY,KAAK;EAC9E,MAAM,iBAAqB,YAAY,kBAA0B,aAAiB;EAClF,MAAM,qBAAqB,YAAY,kBAA0B,aAAiB;AAGlF,aAAS,SAAQ,MAAK,WAAW,IAAI,EAAE,CAAC;AACxC,SAAO,SAAQ,MAAO,SAAS,IAAI,EAAE,CAAC;AAGtC,UAAQ,KAAK;GACX;GACA;GACA,UAAUA,WAAS,KAAI,QAAO,EAAE,IAAI,EAAE;GACtC,QAAU,OAAS,KAAI,QAAO,EAAE,IAAI,EAAE;GAEtC,GAAI,kBAAsB,UAAa,EAAE,gBAAoB;GAC7D,GAAI,sBAAsB,UAAa,EAAE,oBAAoB;GAC9D,CAAC;GAEF;CAGF,MAAM,WAAW,CAAC,GAAG,WAAW,CAAC,KAAI,SAAQ;EAAE;EAAK,aAAa;EAAK,EAAE;AAExE,QAAO;EAAE,QADQ,CAAC,GAAG,SAAW,CAAC,KAAI,SAAQ;GAAE;GAAK,aAAa;GAAK,SAAS;GAAkB,EAAE;EAClF;EAAU;EACzB,MAAM;GACJ,GAAK,OAAO,UAAY,EAAY,QAAU;GAC9C,GAAK,SAAS,UAAU,EAAY,UAAU;GAC/C;EACF"}
1
+ {"version":3,"file":"schedules.js","names":["warnings: string[]","errors: string[]","groups","teachers"],"sources":["../../../src/PlanDigital/from/schedules.ts"],"sourcesContent":["import { size, countBy, sum } from 'lodash-es';\nimport type { CoreTypes } from '../../core';\nimport type { Types as PlanDigitalTypes } from '../types';\nimport type { InternalIdKey } from '../../core/types/common';\n\nnamespace OutTypes {\n export type group = Omit<CoreTypes.Serialized.Group, InternalIdKey>;\n export type teacher = Omit<CoreTypes.Serialized.Teacher, InternalIdKey>;\n export type course = Omit<CoreTypes.Serialized.Course, InternalIdKey>;\n}\n\ntype Out = {\n groups?: OutTypes.group[];\n teachers?: OutTypes.teacher[];\n courses?: OutTypes.course[];\n meta?: {\n errors?: string[];\n warnings?: string[];\n };\n};\n\nexport default (\n input: PlanDigitalTypes.schedule,\n options: PlanDigitalTypes.options\n): Out => {\n // gather all import related warnings/errors\n const warnings: string[] = [];\n const errors: string[] = [];\n\n // there must be at least a single period\n if (!input['Perioder'].length) {\n errors.push('The schedule data does not contain any periods.');\n return { meta: { errors } };\n }\n\n // ensure that at least one period is selected\n const selectedPeriods = options.selectedPeriods;\n if (!selectedPeriods?.length) {\n errors.push('No periods were selected.');\n return { meta: { errors } };\n }\n\n // ensure that the selected periods exist\n for (const x of options.selectedPeriods ?? []) {\n if (!input['Perioder'].some(p => p.Namn == x)) {\n errors.push(`The selected period ${x} does not exist.`);\n return { meta: { errors } };\n }\n }\n\n // ensure that all periods use the same time unit\n const numUnits = size(countBy(input['Perioder'].map(x => x.Tidsenhet)));\n if (numUnits > 1) {\n errors.push('Different time periods used for different periods.');\n return { meta: { errors } };\n }\n const timeUnit = input['Perioder'][0].Tidsenhet;\n\n\n ////\n //// fetch courses, groups, and teachers\n ////\n const courses = new Array<OutTypes.course>();\n const teacherSet = new Set<string>();\n const groupSet = new Set<string>();\n input['Tabell Tjänstefördelning'].forEach(c => {\n // check if the course should be taken into account\n // (the course must then have some scheduled time during the selected periods)\n const periodTimes = selectedPeriods.map(x => c[`Tid ${x}`] ?? 0);\n if (sum(periodTimes) == 0) return;\n\n const displayName = c[options.displayName ?? 'Gruppnamn'];\n const subject = c['Kurskod'];\n const groups = c['Klass']?.split(',').map(x => x.trim());\n const teachers = c['Sign'] ?.split(',').map(x => x.trim());\n\n // fetch the expected schedule time in whatever units\n const periodTime = size(countBy(periodTimes)) == 1 ? periodTimes[0] : undefined;\n const minutesPerWeek = timeUnit == 'Minuter/Vecka' ? periodTime : undefined;\n const expectedTotalHours = timeUnit == 'Timmar/Period' ? periodTime : undefined;\n\n // add groups and teachers\n teachers.forEach(x => teacherSet.add(x));\n groups.forEach(x => groupSet.add(x));\n\n // add course\n courses.push({\n displayName,\n subject,\n teachers: teachers.map(to => ({ to })),\n groups: groups .map(to => ({ to })),\n\n ...(minutesPerWeek != undefined && { minutesPerWeek }),\n ...(expectedTotalHours != undefined && { expectedTotalHours })\n });\n\n });\n\n\n const teachers = [...teacherSet].map(ids => ({ ids, displayName: ids }));\n const groups = [...groupSet ].map(ids => ({ ids, displayName: ids, species: 'class' as const }));\n return { groups, teachers, courses,\n meta: {\n ...( errors.length && { errors: errors } ),\n ...( warnings.length && { warnings: warnings } )\n }\n };\n};"],"mappings":";;;AAqBA,yBACE,OACA,YACQ;CAER,MAAMA,WAAqB;CAC3B,MAAMC,SAAqB;AAG3B,KAAI,CAAC,MAAM,YAAY,QAAQ;AAC7B,SAAO,KAAK;AACZ,SAAO,EAAE,MAAM,EAAE;;CAInB,MAAM,kBAAkB,QAAQ;AAChC,KAAI,CAAC,iBAAiB,QAAQ;AAC5B,SAAO,KAAK;AACZ,SAAO,EAAE,MAAM,EAAE;;AAInB,MAAK,MAAM,KAAK,QAAQ,mBAAmB,GACzC,KAAI,CAAC,MAAM,YAAY,MAAK,MAAK,EAAE,QAAQ,IAAI;AAC7C,SAAO,KAAK,uBAAuB,EAAE;AACrC,SAAO,EAAE,MAAM,EAAE;;CAKrB,MAAM,WAAW,KAAK,QAAQ,MAAM,YAAY,KAAI,MAAK,EAAE;AAC3D,KAAI,WAAW,GAAG;AAChB,SAAO,KAAK;AACZ,SAAO,EAAE,MAAM,EAAE;;CAEnB,MAAM,WAAW,MAAM,YAAY,GAAG;CAMtC,MAAM,UAAa,IAAI;CACvB,MAAM,6BAAa,IAAI;CACvB,MAAM,2BAAa,IAAI;AACvB,OAAM,4BAA4B,SAAQ,MAAK;EAG7C,MAAM,cAAc,gBAAgB,KAAI,MAAK,EAAE,OAAO,QAAQ;AAC9D,MAAI,IAAI,gBAAgB,EAAG;EAE3B,MAAM,cAAc,EAAE,QAAQ,eAAe;EAC7C,MAAM,UAAc,EAAE;EACtB,MAAMC,WAAc,EAAE,UAAU,MAAM,KAAK,KAAI,MAAK,EAAE;EACtD,MAAMC,aAAc,EAAE,SAAU,MAAM,KAAK,KAAI,MAAK,EAAE;EAGtD,MAAM,aAAqB,KAAK,QAAQ,iBAAiB,IAAI,YAAY,KAAK;EAC9E,MAAM,iBAAqB,YAAY,kBAA0B,aAAiB;EAClF,MAAM,qBAAqB,YAAY,kBAA0B,aAAiB;AAGlF,aAAS,SAAQ,MAAK,WAAW,IAAI;AACrC,WAAO,SAAQ,MAAO,SAAS,IAAI;AAGnC,UAAQ,KAAK;GACX;GACA;GACA,UAAUA,WAAS,KAAI,QAAO,EAAE;GAChC,QAAUD,SAAS,KAAI,QAAO,EAAE;GAEhC,GAAI,kBAAsB,UAAa,EAAE;GACzC,GAAI,sBAAsB,UAAa,EAAE;;;CAM7C,MAAM,WAAW,CAAC,GAAG,YAAY,KAAI,SAAQ;EAAE;EAAK,aAAa;;CACjE,MAAM,SAAW,CAAC,GAAG,UAAY,KAAI,SAAQ;EAAE;EAAK,aAAa;EAAK,SAAS;;AAC/E,QAAO;EAAE;EAAQ;EAAU;EACzB,MAAM;GACJ,GAAK,OAAO,UAAY,EAAY;GACpC,GAAK,SAAS,UAAU,EAAY"}
@@ -5,7 +5,6 @@ import { MaximumScheduleSpan } from "../core/interfaces/vertices/properties/maxi
5
5
  import { PlannedScheduledDuration } from "../core/interfaces/vertices/properties/planned-scheduled-duration.js";
6
6
  import { MinBreakLength } from "../core/interfaces/vertices/properties/min-break-length.js";
7
7
  import { Types } from "./types/index.js";
8
- import "../index.js";
9
8
 
10
9
  //#region src/PlanDigital/index.d.ts
11
10
  declare class PlanDigitalMap {
@@ -1,5 +1,4 @@
1
1
  import { Types } from "../../../core/types/index.js";
2
- import "../../../index.js";
3
2
  import * as xlsx0 from "xlsx";
4
3
 
5
4
  //#region src/Quiculum/file/to/index.d.ts
@@ -5,7 +5,8 @@ import XLSX from "xlsx";
5
5
  //#region src/Quiculum/file/to/schedules.ts
6
6
  var schedules_default = (schedule) => {
7
7
  const options = { idKey: "id" };
8
- if (!getVertexId(schedule.division, options)) throw new Error("division id is undefined");
8
+ const did = getVertexId(schedule.division, options);
9
+ if (!did) throw new Error("division id is undefined");
9
10
  const periodsMap = new Map(schedule.periods?.map((p) => [getVertexId(p, options), p]));
10
11
  const defaultPeriod = { ranges: [{
11
12
  start: schedule.division.start,
@@ -35,9 +36,11 @@ var schedules_default = (schedule) => {
35
36
  if (!course) return null;
36
37
  const courseName = course.displayName ?? "";
37
38
  const inLocation = e.inLocations?.at(0);
38
- const locationName = (inLocation ? locationsMap.get(getVertexId(inLocation, options)) : void 0)?.displayName;
39
+ const location = inLocation ? locationsMap.get(getVertexId(inLocation, options)) : void 0;
40
+ const locationName = location?.displayName;
39
41
  const _period = e.period ?? course.period ?? schedule.settings.period;
40
- const weeksInPeriod = periodsMap.get(_period ? getVertexId(_period, options) : void 0)?.ranges.map((x) => {
42
+ const period = periodsMap.get(_period ? getVertexId(_period, options) : void 0);
43
+ const weeksInPeriod = period?.ranges.map((x) => {
41
44
  const start$1 = moment.utc(x.start);
42
45
  const end$1 = moment.utc(x.end);
43
46
  const weeks = new Array();
@@ -47,7 +50,7 @@ var schedules_default = (schedule) => {
47
50
  }
48
51
  return weeks;
49
52
  }).flat();
50
- const excludedWeeks = (defaultPeriod?.ranges.map((x) => {
53
+ const allWeeks = defaultPeriod?.ranges.map((x) => {
51
54
  const start$1 = moment.utc(x.start);
52
55
  const end$1 = moment.utc(x.end);
53
56
  const weeks = new Array();
@@ -56,7 +59,8 @@ var schedules_default = (schedule) => {
56
59
  start$1.add(1, "week");
57
60
  }
58
61
  return weeks;
59
- }).flat()).filter((x) => !weeksInPeriod?.includes(x)).join(", ");
62
+ }).flat();
63
+ const excludedWeeks = allWeeks.filter((x) => !weeksInPeriod?.includes(x)).join(", ");
60
64
  const holidaysInPeriod = holidaysInDays.filter((x) => {
61
65
  return weeksInPeriod?.includes(x.week());
62
66
  }).map((x) => x.format("YYYY-MM-DD")).join(", ");
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":["options: BaseOptions","defaultPeriod: Pick<CoreTypes.Deep.Period, 'ranges'>","holidaysInDays: moment.Moment[]","start","end"],"sources":["../../../../src/Quiculum/file/to/schedules.ts"],"sourcesContent":["import moment from 'moment';\nimport XLSX from 'xlsx';\nimport type { Types as CoreTypes } from '../../../core/types';\nimport type { BaseOptions } from '../../../common/types';\nimport { getVertexId } from '../../../core/util';\n\ntype Schedule = {\n division: CoreTypes.Deep.Division;\n settings: CoreTypes.Deep.Settings;\n groups: CoreTypes.Deep.Group[];\n teachers: CoreTypes.Deep.Teacher[];\n locations: CoreTypes.Deep.Location[];\n courses: CoreTypes.Deep.Course[];\n events: CoreTypes.Deep.Event[];\n periods: CoreTypes.Deep.Period[];\n persons: CoreTypes.Deep.Person[];\n};\n\n\n\nexport default (\n schedule: Schedule,\n): XLSX.WorkBook => {\n const options: BaseOptions = { idKey: 'id' };\n // must have a division id\n const did = getVertexId(schedule.division, options);\n if (!did) throw new Error('division id is undefined');\n\n // a map of period id -> period\n const periodsMap = new Map(schedule.periods?.map((p) => [getVertexId(p, options) as string | undefined, p as Pick<CoreTypes.Deep.Period, 'ranges'>]));\n const defaultPeriod: Pick<CoreTypes.Deep.Period, 'ranges'> = {\n ranges: [{ start: schedule.division.start, end: schedule.division.end }]\n };\n periodsMap.set(undefined, defaultPeriod);\n\n // a map of course id -> course\n const coursesMap = new Map(schedule.courses?.map((c) => [getVertexId(c, options), c]));\n\n // a map of location id -> location\n const locationsMap = new Map(schedule.locations?.map((l) => [getVertexId(l, options), l]));\n\n // get start and end dates from division in YYYY-MM-DD format\n const startDate = moment.utc(schedule.division.start).format('YYYY-MM-DD');\n const endDate = moment.utc(schedule.division.end).format('YYYY-MM-DD');\n // get schoolyear from division start date in format YY/YY (only considers the start year, for example 2023-01-01 becomes 23/24)\n const schoolYear = moment.utc(schedule.division.start).format('YY') + '/' +\n moment.utc(schedule.division.start).add(1, 'year').format('YY');\n\n const holidays = schedule.settings?.calendarExceptions\n ?.filter((x) => x.start && x.end);\n\n\n const holidaysInDays: moment.Moment[] = [];\n\n if (holidays) {\n for (const holiday of holidays) {\n const start = moment.utc(holiday.start);\n const end = moment.utc(holiday.end);\n while (start.isBefore(end)) {\n // Only push weekdays (Monday to Friday)\n if (start.isoWeekday() < 6) {\n holidaysInDays.push(start.clone());\n }\n start.add(1, 'day');\n }\n }\n }\n\n ////\n //// Activities (events)\n ////\n const activities = schedule.events\n ?.map((e) => {\n // must have start and end\n if (!e.start || !e.end) return null;\n const start = moment.utc(e.start);\n const end = moment.utc(e.end);\n\n // must have course\n const course = e.course ? coursesMap.get(getVertexId(e.course, options)) : undefined;\n if (!course) return null;\n const courseName = course.displayName ?? '';\n\n // Location\n const inLocation = e.inLocations?.at(0);\n const location = inLocation ? locationsMap.get(getVertexId(inLocation, options)) : undefined;\n const locationName = location?.displayName;\n\n const _period = e.period ?? course.period ?? schedule.settings.period;\n const period = periodsMap.get(_period ? getVertexId(_period, options) : undefined);\n\n const weeksInPeriod = 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\n const allWeeks = defaultPeriod?.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\n const excludedWeeks = allWeeks\n .filter((x) => !weeksInPeriod?.includes(x))\n .join(', ');\n\n // Get the holidays in the period (don't include holidays that are not in the period)\n const holidaysInPeriod = holidaysInDays\n .filter((x) => {\n return weeksInPeriod?.includes(x.week());\n })\n .map((x) => x.format('YYYY-MM-DD'))\n .join(', ');\n\n return {\n DayOfWeek: (start.day() + 6) % 7,\n Duration: end.diff(start, 'minutes'),\n EndDate: endDate,\n Name: courseName,\n StartDate: startDate,\n StartTime: start.format('HH:mm'),\n ExcludeDates: holidaysInPeriod,\n ExcludeWeeks: excludedWeeks,\n ExternalActivityID: e.ids,\n ExternalLocationID: '',\n ExternalTeachingGroupID: '',\n Location: locationName,\n SchoolYear: schoolYear,\n Teachers: ''\n };\n })\n .filter((x): x is NonNullable<typeof x> => !!x);\n\n ////\n //// store in workbook\n ////\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(activities), 'Activities');\n\n return wb;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"schedules.js","names":["options: BaseOptions","defaultPeriod: Pick<CoreTypes.Deep.Period, 'ranges'>","holidaysInDays: moment.Moment[]","start","end"],"sources":["../../../../src/Quiculum/file/to/schedules.ts"],"sourcesContent":["import moment from 'moment';\nimport XLSX from 'xlsx';\nimport type { Types as CoreTypes } from '../../../core/types';\nimport type { BaseOptions } from '../../../common/types';\nimport { getVertexId } from '../../../core/util';\n\ntype Schedule = {\n division: CoreTypes.Deep.Division;\n settings: CoreTypes.Deep.Settings;\n groups: CoreTypes.Deep.Group[];\n teachers: CoreTypes.Deep.Teacher[];\n locations: CoreTypes.Deep.Location[];\n courses: CoreTypes.Deep.Course[];\n events: CoreTypes.Deep.Event[];\n periods: CoreTypes.Deep.Period[];\n persons: CoreTypes.Deep.Person[];\n};\n\n\n\nexport default (\n schedule: Schedule,\n): XLSX.WorkBook => {\n const options: BaseOptions = { idKey: 'id' };\n // must have a division id\n const did = getVertexId(schedule.division, options);\n if (!did) throw new Error('division id is undefined');\n\n // a map of period id -> period\n const periodsMap = new Map(schedule.periods?.map((p) => [getVertexId(p, options) as string | undefined, p as Pick<CoreTypes.Deep.Period, 'ranges'>]));\n const defaultPeriod: Pick<CoreTypes.Deep.Period, 'ranges'> = {\n ranges: [{ start: schedule.division.start, end: schedule.division.end }]\n };\n periodsMap.set(undefined, defaultPeriod);\n\n // a map of course id -> course\n const coursesMap = new Map(schedule.courses?.map((c) => [getVertexId(c, options), c]));\n\n // a map of location id -> location\n const locationsMap = new Map(schedule.locations?.map((l) => [getVertexId(l, options), l]));\n\n // get start and end dates from division in YYYY-MM-DD format\n const startDate = moment.utc(schedule.division.start).format('YYYY-MM-DD');\n const endDate = moment.utc(schedule.division.end).format('YYYY-MM-DD');\n // get schoolyear from division start date in format YY/YY (only considers the start year, for example 2023-01-01 becomes 23/24)\n const schoolYear = moment.utc(schedule.division.start).format('YY') + '/' +\n moment.utc(schedule.division.start).add(1, 'year').format('YY');\n\n const holidays = schedule.settings?.calendarExceptions\n ?.filter((x) => x.start && x.end);\n\n\n const holidaysInDays: moment.Moment[] = [];\n\n if (holidays) {\n for (const holiday of holidays) {\n const start = moment.utc(holiday.start);\n const end = moment.utc(holiday.end);\n while (start.isBefore(end)) {\n // Only push weekdays (Monday to Friday)\n if (start.isoWeekday() < 6) {\n holidaysInDays.push(start.clone());\n }\n start.add(1, 'day');\n }\n }\n }\n\n ////\n //// Activities (events)\n ////\n const activities = schedule.events\n ?.map((e) => {\n // must have start and end\n if (!e.start || !e.end) return null;\n const start = moment.utc(e.start);\n const end = moment.utc(e.end);\n\n // must have course\n const course = e.course ? coursesMap.get(getVertexId(e.course, options)) : undefined;\n if (!course) return null;\n const courseName = course.displayName ?? '';\n\n // Location\n const inLocation = e.inLocations?.at(0);\n const location = inLocation ? locationsMap.get(getVertexId(inLocation, options)) : undefined;\n const locationName = location?.displayName;\n\n const _period = e.period ?? course.period ?? schedule.settings.period;\n const period = periodsMap.get(_period ? getVertexId(_period, options) : undefined);\n\n const weeksInPeriod = 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\n const allWeeks = defaultPeriod?.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\n const excludedWeeks = allWeeks\n .filter((x) => !weeksInPeriod?.includes(x))\n .join(', ');\n\n // Get the holidays in the period (don't include holidays that are not in the period)\n const holidaysInPeriod = holidaysInDays\n .filter((x) => {\n return weeksInPeriod?.includes(x.week());\n })\n .map((x) => x.format('YYYY-MM-DD'))\n .join(', ');\n\n return {\n DayOfWeek: (start.day() + 6) % 7,\n Duration: end.diff(start, 'minutes'),\n EndDate: endDate,\n Name: courseName,\n StartDate: startDate,\n StartTime: start.format('HH:mm'),\n ExcludeDates: holidaysInPeriod,\n ExcludeWeeks: excludedWeeks,\n ExternalActivityID: e.ids,\n ExternalLocationID: '',\n ExternalTeachingGroupID: '',\n Location: locationName,\n SchoolYear: schoolYear,\n Teachers: ''\n };\n })\n .filter((x): x is NonNullable<typeof x> => !!x);\n\n ////\n //// store in workbook\n ////\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(activities), 'Activities');\n\n return wb;\n};\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { Types } from "../../core/types/index.js";
2
- import "../../core/index.js";
3
2
 
4
3
  //#region src/RS/from/division.d.ts
5
4
  declare function division(input: unknown): undefined | Pick<Types.Deep.Division, 'displayName' | 'start' | 'end'>;
@@ -5,11 +5,12 @@ function division(input) {
5
5
  if (!("displayName" in d && typeof d.displayName == "string")) return;
6
6
  if (!("start" in d && typeof d.start == "string")) return;
7
7
  if (!("end" in d && typeof d.end == "string")) return;
8
- return {
8
+ const division$1 = {
9
9
  displayName: d.displayName,
10
10
  start: d.start,
11
11
  end: d.end
12
12
  };
13
+ return division$1;
13
14
  }
14
15
 
15
16
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"division.js","names":[],"sources":["../../../src/RS/from/division.ts"],"sourcesContent":["import type { CoreTypes } from '../../core';\n\nexport function division (input: unknown): undefined | Pick<CoreTypes.Deep.Division, 'displayName' | 'start' | 'end'> {\n\n if ( !input || typeof input != 'object'\n || !('meta' in input ) || !input.meta || typeof input.meta != 'object'\n || !('division' in input.meta) || !input.meta.division || typeof input.meta.division != 'object'\n ) return;\n\n const d = input.meta.division;\n\n if (!('displayName' in d && typeof d.displayName == 'string')) return;\n if (!('start' in d && typeof d.start == 'string')) return;\n if (!('end' in d && typeof d.end == 'string')) return;\n\n const division: Pick<CoreTypes.Deep.Division, 'displayName' | 'start' | 'end'> = {\n displayName: d.displayName,\n start: d.start,\n end: d.end,\n };\n return division;\n};"],"mappings":";AAEA,SAAgB,SAAU,OAA4F;AAEpH,KAAoC,CAAC,SAAuB,OAAO,SAAuB,YACrF,EAAE,UAAc,UAAe,CAAC,MAAM,QAAiB,OAAO,MAAM,QAAiB,YACrF,EAAE,cAAc,MAAM,SAAS,CAAC,MAAM,KAAK,YAAY,OAAO,MAAM,KAAK,YAAY,SACxF;CAEF,MAAM,IAAI,MAAM,KAAK;AAErB,KAAI,EAAE,iBAAiB,KAAK,OAAO,EAAE,eAAe,UAAW;AAC/D,KAAI,EAAE,WAAiB,KAAK,OAAO,EAAE,SAAe,UAAW;AAC/D,KAAI,EAAE,SAAiB,KAAK,OAAO,EAAE,OAAe,UAAW;AAO/D,QALiF;EAC/E,aAAa,EAAE;EACf,OAAa,EAAE;EACf,KAAa,EAAE;EAChB"}
1
+ {"version":3,"file":"division.js","names":["division: Pick<CoreTypes.Deep.Division, 'displayName' | 'start' | 'end'>","division"],"sources":["../../../src/RS/from/division.ts"],"sourcesContent":["import type { CoreTypes } from '../../core';\n\nexport function division (input: unknown): undefined | Pick<CoreTypes.Deep.Division, 'displayName' | 'start' | 'end'> {\n\n if ( !input || typeof input != 'object'\n || !('meta' in input ) || !input.meta || typeof input.meta != 'object'\n || !('division' in input.meta) || !input.meta.division || typeof input.meta.division != 'object'\n ) return;\n\n const d = input.meta.division;\n\n if (!('displayName' in d && typeof d.displayName == 'string')) return;\n if (!('start' in d && typeof d.start == 'string')) return;\n if (!('end' in d && typeof d.end == 'string')) return;\n\n const division: Pick<CoreTypes.Deep.Division, 'displayName' | 'start' | 'end'> = {\n displayName: d.displayName,\n start: d.start,\n end: d.end,\n };\n return division;\n};"],"mappings":";AAEA,SAAgB,SAAU,OAA4F;AAEpH,KAAoC,CAAC,SAAuB,OAAO,SAAuB,YACrF,EAAE,UAAc,UAAe,CAAC,MAAM,QAAiB,OAAO,MAAM,QAAiB,YACrF,EAAE,cAAc,MAAM,SAAS,CAAC,MAAM,KAAK,YAAY,OAAO,MAAM,KAAK,YAAY,SACxF;CAEF,MAAM,IAAI,MAAM,KAAK;AAErB,KAAI,EAAE,iBAAiB,KAAK,OAAO,EAAE,eAAe,UAAW;AAC/D,KAAI,EAAE,WAAiB,KAAK,OAAO,EAAE,SAAe,UAAW;AAC/D,KAAI,EAAE,SAAiB,KAAK,OAAO,EAAE,OAAe,UAAW;CAE/D,MAAMA,aAA2E;EAC/E,aAAa,EAAE;EACf,OAAa,EAAE;EACf,KAAa,EAAE;;AAEjB,QAAOC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/RS/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../common/types';\nimport { division } from './division';\nimport { schedules } from './schedules';\n\nexport default {\n division: division,\n schedules: schedules,\n} satisfies FromInterface;"],"mappings":";;;;AAIA,mBAAe;CACF;CACA;CACZ"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/RS/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../common/types';\nimport { division } from './division';\nimport { schedules } from './schedules';\n\nexport default {\n division: division,\n schedules: schedules,\n} satisfies FromInterface;"],"mappings":";;;;AAIA,mBAAe;CACF;CACA"}
@@ -1,5 +1,4 @@
1
1
  import { Types as Types$1 } from "../../core/types/index.js";
2
- import "../../core/index.js";
3
2
  import { Types } from "../types/index.js";
4
3
 
5
4
  //#region src/RS/from/schedules.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":["warnings: string[]"],"sources":["../../../src/RS/from/schedules.ts"],"sourcesContent":["import moment from 'moment';\nimport type { Types } from '../types';\nimport { COLLECTION_ID } from '../to/input/util/util';\nimport { getVertexId } from '../../core/util';\nimport type { CoreTypes } from '../../core';\n\nexport function schedules (\n input: Partial<Types.toOutput>,\n options: Pick<Types.toOptions, 'idKey'> = {}\n): Partial<CoreTypes.SerializedWithOptionalId.Schedule> {\n // set default idKey if not provided\n if (!options.idKey) options.idKey = 'id';\n\n const warnings: string[] = [];\n\n const schedule = input.coreData;\n const eventConfigurations = input.output?.at(0)?.events;\n\n if (!schedule ) throw new Error('Missing `coreData` in input.');\n if (!eventConfigurations) throw new Error('Missing `output.events` in input.');\n\n // check on later to ensure that all events are updated\n const eventsToUpdate = new Set(schedule.events?.map(x => getVertexId(x, options)));\n\n eventConfigurations.forEach(({ id: collectionAndId, ...placement }) => {\n // locate the corresponding event/locked time\n const collection = collectionAndId.split('.')[0] == COLLECTION_ID.events ? 'events' : 'lockedTimes';\n const id = collectionAndId.split('.')[1];\n const event = schedule[collection]?.find(x => getVertexId(x, options) == id);\n\n if (!event) {\n warnings.push(`Could not find ${id} (${collectionAndId}) in ${collection} collection.`);\n return;\n }\n\n event.parked = false;\n event.start = moment.utc('1970-01-05T00:00').add(placement.day, 'days').add(placement.start, 'minutes').toISOString();\n event.end = moment.utc('1970-01-05T00:00').add(placement.day, 'days').add(placement.end, 'minutes').toISOString();\n event.duration = placement.end - placement.start;\n\n if (collection == 'events') {\n (event as CoreTypes.Serialized.Event).inLocations = placement.dependencies?.filter(Boolean) ?? [];\n\n // remove from events to be updates\n eventsToUpdate.delete(id);\n }\n });\n\n // check if there are events that were not updated\n if (eventsToUpdate.size) {\n warnings.push(`The following events were not updated: ${[...eventsToUpdate].join(', ')}`);\n }\n\n\n return Object.assign(schedule, {\n meta: {\n ...warnings.length && { warnings: warnings }\n }\n });\n};"],"mappings":";;;;;AAMA,SAAgB,UACd,OACA,UAA0C,EAAE,EACU;AAEtD,KAAI,CAAC,QAAQ,MAAO,SAAQ,QAAQ;CAEpC,MAAMA,WAAqB,EAAE;CAE7B,MAAM,WAAsB,MAAM;CAClC,MAAM,sBAAsB,MAAM,QAAQ,GAAG,EAAE,EAAE;AAEjD,KAAI,CAAC,SAAqB,OAAM,IAAI,MAAM,+BAA+B;AACzE,KAAI,CAAC,oBAAqB,OAAM,IAAI,MAAM,oCAAoC;CAG9E,MAAM,iBAAiB,IAAI,IAAI,SAAS,QAAQ,KAAI,MAAK,YAAY,GAAG,QAAQ,CAAC,CAAC;AAElF,qBAAoB,SAAS,EAAE,IAAI,gBAAiB,GAAG,gBAAgB;EAErE,MAAM,aAAa,gBAAgB,MAAM,IAAI,CAAC,MAAM,cAAc,SAAS,WAAW;EACtF,MAAM,KAAa,gBAAgB,MAAM,IAAI,CAAC;EAC9C,MAAM,QAAQ,SAAS,aAAa,MAAK,MAAK,YAAY,GAAG,QAAQ,IAAI,GAAG;AAE5E,MAAI,CAAC,OAAO;AACV,YAAS,KAAK,kBAAkB,GAAG,IAAI,gBAAgB,OAAO,WAAW,cAAc;AACvF;;AAGF,QAAM,SAAW;AACjB,QAAM,QAAW,OAAO,IAAI,mBAAmB,CAAC,IAAI,UAAU,KAAK,OAAO,CAAC,IAAI,UAAU,OAAO,UAAU,CAAC,aAAa;AACxH,QAAM,MAAW,OAAO,IAAI,mBAAmB,CAAC,IAAI,UAAU,KAAK,OAAO,CAAC,IAAI,UAAU,KAAO,UAAU,CAAC,aAAa;AACxH,QAAM,WAAW,UAAU,MAAM,UAAU;AAE3C,MAAI,cAAc,UAAU;AAC1B,GAAC,MAAqC,cAAc,UAAU,cAAc,OAAO,QAAQ,IAAI,EAAE;AAGjG,kBAAe,OAAO,GAAG;;GAE3B;AAGF,KAAI,eAAe,KACjB,UAAS,KAAK,0CAA0C,CAAC,GAAG,eAAe,CAAC,KAAK,KAAK,GAAG;AAI3F,QAAO,OAAO,OAAO,UAAU,EAC7B,MAAM,EACJ,GAAG,SAAS,UAAU,EAAY,UAAU,EAC7C,EACF,CAAC"}
1
+ {"version":3,"file":"schedules.js","names":["warnings: string[]"],"sources":["../../../src/RS/from/schedules.ts"],"sourcesContent":["import moment from 'moment';\nimport type { Types } from '../types';\nimport { COLLECTION_ID } from '../to/input/util/util';\nimport { getVertexId } from '../../core/util';\nimport type { CoreTypes } from '../../core';\n\nexport function schedules (\n input: Partial<Types.toOutput>,\n options: Pick<Types.toOptions, 'idKey'> = {}\n): Partial<CoreTypes.SerializedWithOptionalId.Schedule> {\n // set default idKey if not provided\n if (!options.idKey) options.idKey = 'id';\n\n const warnings: string[] = [];\n\n const schedule = input.coreData;\n const eventConfigurations = input.output?.at(0)?.events;\n\n if (!schedule ) throw new Error('Missing `coreData` in input.');\n if (!eventConfigurations) throw new Error('Missing `output.events` in input.');\n\n // check on later to ensure that all events are updated\n const eventsToUpdate = new Set(schedule.events?.map(x => getVertexId(x, options)));\n\n eventConfigurations.forEach(({ id: collectionAndId, ...placement }) => {\n // locate the corresponding event/locked time\n const collection = collectionAndId.split('.')[0] == COLLECTION_ID.events ? 'events' : 'lockedTimes';\n const id = collectionAndId.split('.')[1];\n const event = schedule[collection]?.find(x => getVertexId(x, options) == id);\n\n if (!event) {\n warnings.push(`Could not find ${id} (${collectionAndId}) in ${collection} collection.`);\n return;\n }\n\n event.parked = false;\n event.start = moment.utc('1970-01-05T00:00').add(placement.day, 'days').add(placement.start, 'minutes').toISOString();\n event.end = moment.utc('1970-01-05T00:00').add(placement.day, 'days').add(placement.end, 'minutes').toISOString();\n event.duration = placement.end - placement.start;\n\n if (collection == 'events') {\n (event as CoreTypes.Serialized.Event).inLocations = placement.dependencies?.filter(Boolean) ?? [];\n\n // remove from events to be updates\n eventsToUpdate.delete(id);\n }\n });\n\n // check if there are events that were not updated\n if (eventsToUpdate.size) {\n warnings.push(`The following events were not updated: ${[...eventsToUpdate].join(', ')}`);\n }\n\n\n return Object.assign(schedule, {\n meta: {\n ...warnings.length && { warnings: warnings }\n }\n });\n};"],"mappings":";;;;;AAMA,SAAgB,UACd,OACA,UAA0C,IACY;AAEtD,KAAI,CAAC,QAAQ,MAAO,SAAQ,QAAQ;CAEpC,MAAMA,WAAqB;CAE3B,MAAM,WAAsB,MAAM;CAClC,MAAM,sBAAsB,MAAM,QAAQ,GAAG,IAAI;AAEjD,KAAI,CAAC,SAAqB,OAAM,IAAI,MAAM;AAC1C,KAAI,CAAC,oBAAqB,OAAM,IAAI,MAAM;CAG1C,MAAM,iBAAiB,IAAI,IAAI,SAAS,QAAQ,KAAI,MAAK,YAAY,GAAG;AAExE,qBAAoB,SAAS,EAAE,IAAI,gBAAiB,GAAG,gBAAgB;EAErE,MAAM,aAAa,gBAAgB,MAAM,KAAK,MAAM,cAAc,SAAS,WAAW;EACtF,MAAM,KAAa,gBAAgB,MAAM,KAAK;EAC9C,MAAM,QAAQ,SAAS,aAAa,MAAK,MAAK,YAAY,GAAG,YAAY;AAEzE,MAAI,CAAC,OAAO;AACV,YAAS,KAAK,kBAAkB,GAAG,IAAI,gBAAgB,OAAO,WAAW;AACzE;;AAGF,QAAM,SAAW;AACjB,QAAM,QAAW,OAAO,IAAI,oBAAoB,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,OAAO,WAAW;AAC3G,QAAM,MAAW,OAAO,IAAI,oBAAoB,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAO,WAAW;AAC3G,QAAM,WAAW,UAAU,MAAM,UAAU;AAE3C,MAAI,cAAc,UAAU;AAC1B,GAAC,MAAqC,cAAc,UAAU,cAAc,OAAO,YAAY;AAG/F,kBAAe,OAAO;;;AAK1B,KAAI,eAAe,KACjB,UAAS,KAAK,0CAA0C,CAAC,GAAG,gBAAgB,KAAK;AAInF,QAAO,OAAO,OAAO,UAAU,EAC7B,MAAM,EACJ,GAAG,SAAS,UAAU,EAAY"}
@@ -1,9 +1,7 @@
1
- import "../core/types/common/index.js";
2
1
  import { Mixed } from "../core/interfaces/vertices/index.js";
3
- import "../core/index.js";
4
- import "./types/index.js";
5
2
 
6
3
  //#region src/RS/make-connected.d.ts
4
+
7
5
  type _Schedule = {
8
6
  division: Mixed.Division;
9
7
  divisions: Mixed.Division;
@@ -15,7 +13,7 @@ type _Schedule = {
15
13
  persons: Mixed.Person[];
16
14
  rootIntervals: Mixed.RootInterval[];
17
15
  lockedTimes: Mixed.LockedTime[];
18
- overlapGroups: Mixed.OverlapGroup[];
16
+ linkedEventsSets: Mixed.LinkedEventsSet[];
19
17
  courses: Mixed.Course[];
20
18
  events: Mixed.Event[];
21
19
  };
@@ -22,11 +22,11 @@ function makeConnected(schedule, options = {}) {
22
22
  const locationsMap = indexCollection(schedule.locations ?? [], idKey);
23
23
  const coursesMap = indexCollection(schedule.courses ?? [], idKey);
24
24
  const eventsMap = indexCollection(schedule.events ?? [], idKey);
25
- const overlapGroupsMap = indexCollection(schedule.overlapGroups ?? [], idKey);
26
25
  const periodsMap = indexCollection(schedule.periods ?? [], idKey);
27
26
  const personsMap = indexCollection(schedule.persons ?? [], idKey);
28
27
  const lockedTimesMap = indexCollection(schedule.lockedTimes ?? [], idKey);
29
28
  const rootIntervalsMap = indexCollection(schedule.rootIntervals ?? [], idKey);
29
+ const linkedEventsSetsMap = indexCollection(schedule.linkedEventsSets ?? [], idKey);
30
30
  const division = pick(_division, [
31
31
  "displayName",
32
32
  "start",
@@ -84,10 +84,12 @@ function makeConnected(schedule, options = {}) {
84
84
  return Object.assign(x, edges);
85
85
  });
86
86
  const periods = (schedule.periods ?? []).map((x) => {
87
- return Object.assign(x, {});
87
+ const edges = {};
88
+ return Object.assign(x, edges);
88
89
  });
89
90
  const rootIntervals = (schedule.rootIntervals ?? []).map((x) => {
90
- return Object.assign(x, {});
91
+ const edges = {};
92
+ return Object.assign(x, edges);
91
93
  });
92
94
  const makeCoalesced = (map$1, id, toModel, extra) => {
93
95
  const to = map$1.get(id);
@@ -113,33 +115,16 @@ function makeConnected(schedule, options = {}) {
113
115
  }).filter(nonNullable) : x.coalesced };
114
116
  return Object.assign(x, edges);
115
117
  });
116
- const overlapGroups = (schedule.overlapGroups ?? []).map((x) => {
117
- const edges = {
118
- coalesced: x.coalesced ? x.coalesced.map((x$1) => {
119
- switch (x$1.toModel) {
120
- case "courses": return makeCoalesced(coursesMap, getVertexId(x$1.to, idKey), x$1.toModel);
121
- default: throw new Error(`Unknown coalesced model "${x$1.toModel}" in overlap group ${JSON.stringify(x$1)}`);
122
- }
123
- }).filter(nonNullable) : x.coalesced,
124
- species: x.species ? x.species.map((x$1) => {
125
- switch (x$1.toModel) {
126
- case "events": return makeCoalesced(eventsMap, getVertexId(x$1.to, idKey), x$1.toModel, x$1);
127
- case "courseevents": return makeCoalesced(eventsMap, getVertexId(x$1.to, idKey), "events", x$1);
128
- default: throw new Error(`Unknown species model "${x$1.toModel}" in overlap group ${JSON.stringify(x$1)}`);
129
- }
130
- }).filter(nonNullable) : x.species
131
- };
132
- return Object.assign(x, edges);
133
- });
134
118
  const getParticipants = (x) => {
135
119
  if (!x) return void 0;
136
120
  return x.map((x$1) => {
137
121
  const to = personsMap.get(getVertexId(x$1.to, idKey));
138
122
  if (!to) return;
139
- return {
123
+ const participant = {
140
124
  ...x$1,
141
125
  to
142
126
  };
127
+ return participant;
143
128
  }).filter(nonNullable);
144
129
  };
145
130
  const getTeachers = (x) => {
@@ -147,10 +132,11 @@ function makeConnected(schedule, options = {}) {
147
132
  return x.map((x$1) => {
148
133
  const to = teachersMap.get(getVertexId(x$1.to, idKey));
149
134
  if (!to) return;
150
- return {
135
+ const participant = {
151
136
  ...x$1,
152
137
  to
153
138
  };
139
+ return participant;
154
140
  }).filter(nonNullable);
155
141
  };
156
142
  const getLocations = (x) => {
@@ -158,10 +144,11 @@ function makeConnected(schedule, options = {}) {
158
144
  return x.map((x$1) => {
159
145
  const locations$1 = x$1.locations.map((x$2) => locationsMap.get(getVertexId(x$2, idKey))).filter(nonNullable);
160
146
  if (locations$1.length != 1) throw new Error(`(RS::MakeConnected) Expected exactly one location in available locations, got ${locations$1.length} and before filtering: ${x$1.locations.map((x$2) => getVertexId(x$2, idKey)).join(", ")}`);
161
- return {
147
+ const availableLocation = {
162
148
  ...x$1,
163
149
  locations: locations$1
164
150
  };
151
+ return availableLocation;
165
152
  }).filter(nonNullable);
166
153
  };
167
154
  const getGroups = (x) => {
@@ -170,13 +157,44 @@ function makeConnected(schedule, options = {}) {
170
157
  const to = groupsMap.get(getVertexId(x$1.to, idKey));
171
158
  if (!to) return;
172
159
  const exclude = x$1.exclude ? x$1.exclude.map((x$2) => personsMap.get(getVertexId(x$2, idKey))).filter(nonNullable) : void 0;
173
- return {
160
+ const group = {
174
161
  ...x$1,
175
162
  to,
176
163
  exclude
177
164
  };
165
+ return group;
178
166
  }).filter(nonNullable);
179
167
  };
168
+ const courses = (schedule.courses ?? []).map((x) => {
169
+ const edges = {
170
+ groups: getGroups(x.groups),
171
+ teachers: getTeachers(x.teachers),
172
+ locations: getLocations(x.locations),
173
+ participants: getParticipants(x.participants),
174
+ lockedTimes: getLockedTimes(x.lockedTimes),
175
+ events: x.events ? x.events.map((x$1) => eventsMap.get(getVertexId(x$1, idKey))).filter(nonNullable) : x.events,
176
+ period: x.period != null ? periodsMap.get(getVertexId(x.period, idKey)) : x.period
177
+ };
178
+ return Object.assign(x, edges);
179
+ });
180
+ const events = (schedule.events ?? []).map((x) => {
181
+ const edges = {
182
+ groups: getGroups(x.groups),
183
+ teachers: getTeachers(x.teachers),
184
+ locations: getLocations(x.locations),
185
+ participants: getParticipants(x.participants),
186
+ lockedTimes: getLockedTimes(x.lockedTimes),
187
+ inLocations: x.inLocations ? x.inLocations.map((x$1) => x$1 === null ? null : locationsMap.get(getVertexId(x$1, idKey))).filter((x$1) => x$1 !== void 0) : x.inLocations,
188
+ course: x.course != null ? coursesMap.get(getVertexId(x.course, idKey)) : x.course,
189
+ period: x.period != null ? periodsMap.get(getVertexId(x.period, idKey)) : x.period,
190
+ linkedEventsSet: x.linkedEventsSet != null ? linkedEventsSetsMap.get(getVertexId(x.linkedEventsSet, idKey)) : x.linkedEventsSet
191
+ };
192
+ return Object.assign(x, edges);
193
+ });
194
+ const linkedEventsSets = (schedule.linkedEventsSets ?? []).map((x) => {
195
+ const edges = { events: x.events ? x.events.map((x$1) => eventsMap.get(getVertexId(x$1, idKey))).filter(nonNullable) : x.events };
196
+ return Object.assign(x, edges);
197
+ });
180
198
  return {
181
199
  division,
182
200
  settings,
@@ -187,35 +205,9 @@ function makeConnected(schedule, options = {}) {
187
205
  periods,
188
206
  rootIntervals,
189
207
  lockedTimes,
190
- overlapGroups,
191
- courses: (schedule.courses ?? []).map((x) => {
192
- const edges = {
193
- groups: getGroups(x.groups),
194
- teachers: getTeachers(x.teachers),
195
- locations: getLocations(x.locations),
196
- participants: getParticipants(x.participants),
197
- lockedTimes: getLockedTimes(x.lockedTimes),
198
- events: x.events ? x.events.map((x$1) => eventsMap.get(getVertexId(x$1, idKey))).filter(nonNullable) : x.events,
199
- period: x.period != null ? periodsMap.get(getVertexId(x.period, idKey)) : x.period,
200
- overlapGroup: x.overlapGroup != null ? overlapGroupsMap.get(getVertexId(x.overlapGroup, idKey)) : x.overlapGroup
201
- };
202
- return Object.assign(x, edges);
203
- }),
204
- events: (schedule.events ?? []).map((x) => {
205
- const edges = {
206
- groups: getGroups(x.groups),
207
- teachers: getTeachers(x.teachers),
208
- locations: getLocations(x.locations),
209
- participants: getParticipants(x.participants),
210
- lockedTimes: getLockedTimes(x.lockedTimes),
211
- inLocations: x.inLocations ? x.inLocations.map((x$1) => x$1 === null ? null : locationsMap.get(getVertexId(x$1, idKey))).filter((x$1) => x$1 !== void 0) : x.inLocations,
212
- course: x.course != null ? coursesMap.get(getVertexId(x.course, idKey)) : x.course,
213
- period: x.period != null ? periodsMap.get(getVertexId(x.period, idKey)) : x.period,
214
- overlapSpecies: x.overlapSpecies != null ? overlapGroupsMap.get(getVertexId(x.overlapSpecies, idKey)) : x.overlapSpecies,
215
- threads: void 0
216
- };
217
- return Object.assign(x, edges);
218
- })
208
+ courses,
209
+ events,
210
+ linkedEventsSets
219
211
  };
220
212
  }
221
213