@ieeesa-npm/dashboard 0.0.0-stage → 0.0.2

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 (73) hide show
  1. package/README.md +75 -3
  2. package/esm2022/ieeesa-npm-dashboard.mjs +5 -0
  3. package/esm2022/lib/assets/constants.json +158 -0
  4. package/esm2022/lib/assets/dashboard-mock.mjs +221 -0
  5. package/esm2022/lib/assets/dashboard-route-paths.mock.mjs +14 -0
  6. package/esm2022/lib/assets/dashboard-user-permissions.mock.mjs +23 -0
  7. package/esm2022/lib/assets/date-formats.mjs +28 -0
  8. package/esm2022/lib/components/event-group-card/event-group-card.component.mjs +414 -0
  9. package/esm2022/lib/components/meeting-attendance-row/meeting-attendance-row.component.mjs +182 -0
  10. package/esm2022/lib/components/member-level-badge/member-level-badge.component.mjs +79 -0
  11. package/esm2022/lib/components/upcoming-meetings-events/upcoming-meetings-events.component.mjs +261 -0
  12. package/esm2022/lib/components/welcome-header/dashboard-welcome-header.component.mjs +151 -0
  13. package/esm2022/lib/components/your-groups/your-groups.component.mjs +243 -0
  14. package/esm2022/lib/dashboard.component.mjs +417 -0
  15. package/esm2022/lib/dashboard.module.mjs +16 -0
  16. package/esm2022/lib/dashboard.routes.mjs +7 -0
  17. package/esm2022/lib/models/attendance-action-permissions.model.mjs +2 -0
  18. package/esm2022/lib/models/attendance-state.model.mjs +7 -0
  19. package/esm2022/lib/models/dashboard-list-response.model.mjs +2 -0
  20. package/esm2022/lib/models/dashboard-route-config.model.mjs +2 -0
  21. package/esm2022/lib/models/dashboard-section-state.model.mjs +9 -0
  22. package/esm2022/lib/models/dashboard-user-info.model.mjs +2 -0
  23. package/esm2022/lib/models/event-meeting-list-item.model.mjs +2 -0
  24. package/esm2022/lib/models/event-meeting-list-payload.model.mjs +8 -0
  25. package/esm2022/lib/models/group-row.model.mjs +2 -0
  26. package/esm2022/lib/models/meeting-row.model.mjs +2 -0
  27. package/esm2022/lib/models/my-groups-view.model.mjs +2 -0
  28. package/esm2022/lib/models/page-change.model.mjs +2 -0
  29. package/esm2022/lib/models/upcoming-event.model.mjs +13 -0
  30. package/esm2022/lib/services/attendance-reducers.mjs +54 -0
  31. package/esm2022/lib/services/dashboard.service.mjs +402 -0
  32. package/esm2022/lib/services/user-permissions.service.mjs +50 -0
  33. package/esm2022/lib/utils/attendance-action.util.mjs +53 -0
  34. package/esm2022/lib/utils/date-format.util.mjs +110 -0
  35. package/esm2022/lib/utils/event-meeting-mapper.util.mjs +96 -0
  36. package/esm2022/public-api.mjs +36 -0
  37. package/fesm2022/ieeesa-npm-dashboard.mjs +2981 -0
  38. package/fesm2022/ieeesa-npm-dashboard.mjs.map +1 -0
  39. package/index.d.ts +5 -0
  40. package/lib/assets/dashboard-mock.d.ts +31 -0
  41. package/lib/assets/dashboard-route-paths.mock.d.ts +2 -0
  42. package/lib/assets/dashboard-user-permissions.mock.d.ts +2 -0
  43. package/lib/assets/date-formats.d.ts +27 -0
  44. package/lib/components/event-group-card/event-group-card.component.d.ts +268 -0
  45. package/lib/components/meeting-attendance-row/meeting-attendance-row.component.d.ts +115 -0
  46. package/lib/components/member-level-badge/member-level-badge.component.d.ts +177 -0
  47. package/lib/components/upcoming-meetings-events/upcoming-meetings-events.component.d.ts +175 -0
  48. package/lib/components/welcome-header/dashboard-welcome-header.component.d.ts +98 -0
  49. package/lib/components/your-groups/your-groups.component.d.ts +159 -0
  50. package/lib/dashboard.component.d.ts +414 -0
  51. package/lib/dashboard.module.d.ts +7 -0
  52. package/lib/dashboard.routes.d.ts +2 -0
  53. package/lib/models/attendance-action-permissions.model.d.ts +4 -0
  54. package/lib/models/attendance-state.model.d.ts +4 -0
  55. package/lib/models/dashboard-list-response.model.d.ts +5 -0
  56. package/lib/models/dashboard-route-config.model.d.ts +7 -0
  57. package/lib/models/dashboard-section-state.model.d.ts +6 -0
  58. package/lib/models/dashboard-user-info.model.d.ts +5 -0
  59. package/lib/models/event-meeting-list-item.model.d.ts +107 -0
  60. package/lib/models/event-meeting-list-payload.model.d.ts +40 -0
  61. package/lib/models/group-row.model.d.ts +33 -0
  62. package/lib/models/meeting-row.model.d.ts +28 -0
  63. package/lib/models/my-groups-view.model.d.ts +56 -0
  64. package/lib/models/page-change.model.d.ts +4 -0
  65. package/lib/models/upcoming-event.model.d.ts +51 -0
  66. package/lib/services/attendance-reducers.d.ts +43 -0
  67. package/lib/services/dashboard.service.d.ts +202 -0
  68. package/lib/services/user-permissions.service.d.ts +31 -0
  69. package/lib/utils/attendance-action.util.d.ts +38 -0
  70. package/lib/utils/date-format.util.d.ts +60 -0
  71. package/lib/utils/event-meeting-mapper.util.d.ts +50 -0
  72. package/package.json +30 -3
  73. package/public-api.d.ts +26 -0
@@ -0,0 +1,50 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Permission identifiers (by name) that gate the dashboard attendance actions.
5
+ * Mirrors the permission-type pattern used by the `events-and-meetings` and
6
+ * `groups` user-permissions services.
7
+ */
8
+ /* eslint-disable no-unused-vars */
9
+ export var DashboardPermissionType;
10
+ (function (DashboardPermissionType) {
11
+ DashboardPermissionType["LOG_ATTENDANCE"] = "Log Attendance";
12
+ DashboardPermissionType["LEAVE_MEETING"] = "Leave Meeting";
13
+ })(DashboardPermissionType || (DashboardPermissionType = {}));
14
+ /* eslint-enable no-unused-vars */
15
+ export class UserPermissionsService {
16
+ /**
17
+ * Returns access provision for the passed action/feature based on whether the signed in user has appropriate permission.
18
+ * @param {DashboardPermissionType} permission
19
+ * @param {UserPermission[]} userPermissions
20
+ * @return {boolean}
21
+ * @memberof UserPermissionsService
22
+ */
23
+ validateAccessPermission(permission, userPermissions) {
24
+ const isPermitted = userPermissions?.length > 0
25
+ ? userPermissions?.some(({ permissionName }) => permissionName === permission)
26
+ : false;
27
+ return isPermitted;
28
+ }
29
+ /**
30
+ * Maps the host-supplied user permissions to the attendance-action permissions consumed by the dashboard rows.
31
+ * @param {UserPermission[]} userPermissions
32
+ * @return {AttendanceActionPermissions}
33
+ * @memberof UserPermissionsService
34
+ */
35
+ mapToAttendanceActionPermissions(userPermissions) {
36
+ return {
37
+ canLogAttendance: this.validateAccessPermission(DashboardPermissionType.LOG_ATTENDANCE, userPermissions),
38
+ canLeaveMeeting: this.validateAccessPermission(DashboardPermissionType.LEAVE_MEETING, userPermissions),
39
+ };
40
+ }
41
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserPermissionsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
42
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserPermissionsService, providedIn: 'root' }); }
43
+ }
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserPermissionsService, decorators: [{
45
+ type: Injectable,
46
+ args: [{
47
+ providedIn: 'root',
48
+ }]
49
+ }] });
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1wZXJtaXNzaW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGFzaGJvYXJkL3NyYy9saWIvc2VydmljZXMvdXNlci1wZXJtaXNzaW9ucy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSTNDOzs7O0dBSUc7QUFDSCxtQ0FBbUM7QUFDbkMsTUFBTSxDQUFOLElBQVksdUJBR1g7QUFIRCxXQUFZLHVCQUF1QjtJQUNqQyw0REFBaUMsQ0FBQTtJQUNqQywwREFBK0IsQ0FBQTtBQUNqQyxDQUFDLEVBSFcsdUJBQXVCLEtBQXZCLHVCQUF1QixRQUdsQztBQUNELGtDQUFrQztBQUtsQyxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDOzs7Ozs7T0FNRztJQUNILHdCQUF3QixDQUN0QixVQUFtQyxFQUNuQyxlQUFpQztRQUVqQyxNQUFNLFdBQVcsR0FDZixlQUFlLEVBQUUsTUFBTSxHQUFHLENBQUM7WUFDekIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQ25CLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLENBQUMsY0FBYyxLQUFLLFVBQVUsQ0FDdEQ7WUFDSCxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ1osT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZ0NBQWdDLENBQzlCLGVBQWlDO1FBRWpDLE9BQU87WUFDTCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQzdDLHVCQUF1QixDQUFDLGNBQWMsRUFDdEMsZUFBZSxDQUNoQjtZQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQzVDLHVCQUF1QixDQUFDLGFBQWEsRUFDckMsZUFBZSxDQUNoQjtTQUNGLENBQUM7SUFDSixDQUFDOytHQXhDVSxzQkFBc0I7bUhBQXRCLHNCQUFzQixjQUZyQixNQUFNOzs0RkFFUCxzQkFBc0I7a0JBSGxDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVc2VyUGVybWlzc2lvbiB9IGZyb20gJ0BpZWVlc2EtbnBtL21vZGVscyc7XHJcbmltcG9ydCB7IEF0dGVuZGFuY2VBY3Rpb25QZXJtaXNzaW9ucyB9IGZyb20gJy4uL21vZGVscy9hdHRlbmRhbmNlLWFjdGlvbi1wZXJtaXNzaW9ucy5tb2RlbCc7XHJcblxyXG4vKipcclxuICogUGVybWlzc2lvbiBpZGVudGlmaWVycyAoYnkgbmFtZSkgdGhhdCBnYXRlIHRoZSBkYXNoYm9hcmQgYXR0ZW5kYW5jZSBhY3Rpb25zLlxyXG4gKiBNaXJyb3JzIHRoZSBwZXJtaXNzaW9uLXR5cGUgcGF0dGVybiB1c2VkIGJ5IHRoZSBgZXZlbnRzLWFuZC1tZWV0aW5nc2AgYW5kXHJcbiAqIGBncm91cHNgIHVzZXItcGVybWlzc2lvbnMgc2VydmljZXMuXHJcbiAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xyXG5leHBvcnQgZW51bSBEYXNoYm9hcmRQZXJtaXNzaW9uVHlwZSB7XHJcbiAgTE9HX0FUVEVOREFOQ0UgPSAnTG9nIEF0dGVuZGFuY2UnLFxyXG4gIExFQVZFX01FRVRJTkcgPSAnTGVhdmUgTWVldGluZycsXHJcbn1cclxuLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJQZXJtaXNzaW9uc1NlcnZpY2Uge1xyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYWNjZXNzIHByb3Zpc2lvbiBmb3IgdGhlIHBhc3NlZCBhY3Rpb24vZmVhdHVyZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBzaWduZWQgaW4gdXNlciBoYXMgYXBwcm9wcmlhdGUgcGVybWlzc2lvbi5cclxuICAgKiBAcGFyYW0ge0Rhc2hib2FyZFBlcm1pc3Npb25UeXBlfSBwZXJtaXNzaW9uXHJcbiAgICogQHBhcmFtIHtVc2VyUGVybWlzc2lvbltdfSB1c2VyUGVybWlzc2lvbnNcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgdmFsaWRhdGVBY2Nlc3NQZXJtaXNzaW9uKFxyXG4gICAgcGVybWlzc2lvbjogRGFzaGJvYXJkUGVybWlzc2lvblR5cGUsXHJcbiAgICB1c2VyUGVybWlzc2lvbnM6IFVzZXJQZXJtaXNzaW9uW11cclxuICApOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlzUGVybWl0dGVkID1cclxuICAgICAgdXNlclBlcm1pc3Npb25zPy5sZW5ndGggPiAwXHJcbiAgICAgICAgPyB1c2VyUGVybWlzc2lvbnM/LnNvbWUoXHJcbiAgICAgICAgICAgICh7IHBlcm1pc3Npb25OYW1lIH0pID0+IHBlcm1pc3Npb25OYW1lID09PSBwZXJtaXNzaW9uXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgOiBmYWxzZTtcclxuICAgIHJldHVybiBpc1Blcm1pdHRlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hcHMgdGhlIGhvc3Qtc3VwcGxpZWQgdXNlciBwZXJtaXNzaW9ucyB0byB0aGUgYXR0ZW5kYW5jZS1hY3Rpb24gcGVybWlzc2lvbnMgY29uc3VtZWQgYnkgdGhlIGRhc2hib2FyZCByb3dzLlxyXG4gICAqIEBwYXJhbSB7VXNlclBlcm1pc3Npb25bXX0gdXNlclBlcm1pc3Npb25zXHJcbiAgICogQHJldHVybiB7QXR0ZW5kYW5jZUFjdGlvblBlcm1pc3Npb25zfVxyXG4gICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgbWFwVG9BdHRlbmRhbmNlQWN0aW9uUGVybWlzc2lvbnMoXHJcbiAgICB1c2VyUGVybWlzc2lvbnM6IFVzZXJQZXJtaXNzaW9uW11cclxuICApOiBBdHRlbmRhbmNlQWN0aW9uUGVybWlzc2lvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY2FuTG9nQXR0ZW5kYW5jZTogdGhpcy52YWxpZGF0ZUFjY2Vzc1Blcm1pc3Npb24oXHJcbiAgICAgICAgRGFzaGJvYXJkUGVybWlzc2lvblR5cGUuTE9HX0FUVEVOREFOQ0UsXHJcbiAgICAgICAgdXNlclBlcm1pc3Npb25zXHJcbiAgICAgICksXHJcbiAgICAgIGNhbkxlYXZlTWVldGluZzogdGhpcy52YWxpZGF0ZUFjY2Vzc1Blcm1pc3Npb24oXHJcbiAgICAgICAgRGFzaGJvYXJkUGVybWlzc2lvblR5cGUuTEVBVkVfTUVFVElORyxcclxuICAgICAgICB1c2VyUGVybWlzc2lvbnNcclxuICAgICAgKSxcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Pure helpers for the per-meeting attendance action state machine. No Angular /
3
+ * service dependencies so they are trivially testable (property-tested as
4
+ * Property 1) and reusable by `MeetingAttendanceRowComponent`.
5
+ *
6
+ * The handler is the single source of truth for what a meeting row's action
7
+ * button should emit when activated. The displayed `AttendanceState` only
8
+ * advances on a successful resolution (handled by the service reducers), so this
9
+ * function is a pure mapping from the current inputs to the action to emit.
10
+ */
11
+ import { AttendanceState } from '../models/attendance-state.model';
12
+ /* eslint-disable no-unused-vars */
13
+ /**
14
+ * The action a meeting row's action button should emit when activated.
15
+ * `NONE` means the activation is non-actionable (empty id or in-flight) and the
16
+ * row must emit no `logAttendance` / `leaveMeeting` / navigation event.
17
+ */
18
+ export var AttendanceAction;
19
+ (function (AttendanceAction) {
20
+ AttendanceAction["LOG_ATTENDANCE"] = "LOG_ATTENDANCE";
21
+ AttendanceAction["LEAVE_MEETING"] = "LEAVE_MEETING";
22
+ AttendanceAction["NONE"] = "NONE";
23
+ })(AttendanceAction || (AttendanceAction = {}));
24
+ /* eslint-enable no-unused-vars */
25
+ /**
26
+ * Resolves the attendance action to emit for a meeting row, following the
27
+ * attendance action state machine (see design: Attendance Action State Machine).
28
+ *
29
+ * Behavior:
30
+ * - Returns `NONE` when `meetingId` is empty or undefined (non-actionable row).
31
+ * - Returns `NONE` while the row is in-flight (re-entrancy guard — no further
32
+ * event is emitted until the current action resolves).
33
+ * - Returns `LEAVE_MEETING` when the state is `CURRENTLY_ATTENDING`.
34
+ * - Returns `LOG_ATTENDANCE` when the state is `NOT_ATTENDING` or undefined.
35
+ *
36
+ * @param {AttendanceState | undefined} attendanceState The row's current attendance state.
37
+ * @param {boolean} isInFlight Whether an attendance action for this row is awaiting resolution.
38
+ * @param {string | undefined} meetingId The row's meeting identifier.
39
+ * @return {AttendanceAction} The action to emit, or `NONE` when non-actionable.
40
+ */
41
+ export function resolveAttendanceAction(attendanceState, isInFlight, meetingId) {
42
+ if (!meetingId) {
43
+ return AttendanceAction.NONE;
44
+ }
45
+ if (isInFlight) {
46
+ return AttendanceAction.NONE;
47
+ }
48
+ if (attendanceState === AttendanceState.CURRENTLY_ATTENDING) {
49
+ return AttendanceAction.LEAVE_MEETING;
50
+ }
51
+ return AttendanceAction.LOG_ATTENDANCE;
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW5kYW5jZS1hY3Rpb24udXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rhc2hib2FyZC9zcmMvbGliL3V0aWxzL2F0dGVuZGFuY2UtYWN0aW9uLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBQ0gsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRW5FLG1DQUFtQztBQUNuQzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFOLElBQVksZ0JBSVg7QUFKRCxXQUFZLGdCQUFnQjtJQUMxQixxREFBaUMsQ0FBQTtJQUNqQyxtREFBK0IsQ0FBQTtJQUMvQixpQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQUpXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFJM0I7QUFDRCxrQ0FBa0M7QUFFbEM7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxlQUE0QyxFQUM1QyxVQUFtQixFQUNuQixTQUE2QjtJQUU3QixJQUFJLENBQUMsU0FBUyxFQUFFO1FBQ2QsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7S0FDOUI7SUFFRCxJQUFJLFVBQVUsRUFBRTtRQUNkLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0tBQzlCO0lBRUQsSUFBSSxlQUFlLEtBQUssZUFBZSxDQUFDLG1CQUFtQixFQUFFO1FBQzNELE9BQU8sZ0JBQWdCLENBQUMsYUFBYSxDQUFDO0tBQ3ZDO0lBRUQsT0FBTyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUM7QUFDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBQdXJlIGhlbHBlcnMgZm9yIHRoZSBwZXItbWVldGluZyBhdHRlbmRhbmNlIGFjdGlvbiBzdGF0ZSBtYWNoaW5lLiBObyBBbmd1bGFyIC9cclxuICogc2VydmljZSBkZXBlbmRlbmNpZXMgc28gdGhleSBhcmUgdHJpdmlhbGx5IHRlc3RhYmxlIChwcm9wZXJ0eS10ZXN0ZWQgYXNcclxuICogUHJvcGVydHkgMSkgYW5kIHJldXNhYmxlIGJ5IGBNZWV0aW5nQXR0ZW5kYW5jZVJvd0NvbXBvbmVudGAuXHJcbiAqXHJcbiAqIFRoZSBoYW5kbGVyIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB3aGF0IGEgbWVldGluZyByb3cncyBhY3Rpb25cclxuICogYnV0dG9uIHNob3VsZCBlbWl0IHdoZW4gYWN0aXZhdGVkLiBUaGUgZGlzcGxheWVkIGBBdHRlbmRhbmNlU3RhdGVgIG9ubHlcclxuICogYWR2YW5jZXMgb24gYSBzdWNjZXNzZnVsIHJlc29sdXRpb24gKGhhbmRsZWQgYnkgdGhlIHNlcnZpY2UgcmVkdWNlcnMpLCBzbyB0aGlzXHJcbiAqIGZ1bmN0aW9uIGlzIGEgcHVyZSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgaW5wdXRzIHRvIHRoZSBhY3Rpb24gdG8gZW1pdC5cclxuICovXHJcbmltcG9ydCB7IEF0dGVuZGFuY2VTdGF0ZSB9IGZyb20gJy4uL21vZGVscy9hdHRlbmRhbmNlLXN0YXRlLm1vZGVsJztcclxuXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXHJcbi8qKlxyXG4gKiBUaGUgYWN0aW9uIGEgbWVldGluZyByb3cncyBhY3Rpb24gYnV0dG9uIHNob3VsZCBlbWl0IHdoZW4gYWN0aXZhdGVkLlxyXG4gKiBgTk9ORWAgbWVhbnMgdGhlIGFjdGl2YXRpb24gaXMgbm9uLWFjdGlvbmFibGUgKGVtcHR5IGlkIG9yIGluLWZsaWdodCkgYW5kIHRoZVxyXG4gKiByb3cgbXVzdCBlbWl0IG5vIGBsb2dBdHRlbmRhbmNlYCAvIGBsZWF2ZU1lZXRpbmdgIC8gbmF2aWdhdGlvbiBldmVudC5cclxuICovXHJcbmV4cG9ydCBlbnVtIEF0dGVuZGFuY2VBY3Rpb24ge1xyXG4gIExPR19BVFRFTkRBTkNFID0gJ0xPR19BVFRFTkRBTkNFJyxcclxuICBMRUFWRV9NRUVUSU5HID0gJ0xFQVZFX01FRVRJTkcnLFxyXG4gIE5PTkUgPSAnTk9ORScsXHJcbn1cclxuLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xyXG5cclxuLyoqXHJcbiAqIFJlc29sdmVzIHRoZSBhdHRlbmRhbmNlIGFjdGlvbiB0byBlbWl0IGZvciBhIG1lZXRpbmcgcm93LCBmb2xsb3dpbmcgdGhlXHJcbiAqIGF0dGVuZGFuY2UgYWN0aW9uIHN0YXRlIG1hY2hpbmUgKHNlZSBkZXNpZ246IEF0dGVuZGFuY2UgQWN0aW9uIFN0YXRlIE1hY2hpbmUpLlxyXG4gKlxyXG4gKiBCZWhhdmlvcjpcclxuICogLSBSZXR1cm5zIGBOT05FYCB3aGVuIGBtZWV0aW5nSWRgIGlzIGVtcHR5IG9yIHVuZGVmaW5lZCAobm9uLWFjdGlvbmFibGUgcm93KS5cclxuICogLSBSZXR1cm5zIGBOT05FYCB3aGlsZSB0aGUgcm93IGlzIGluLWZsaWdodCAocmUtZW50cmFuY3kgZ3VhcmQg4oCUIG5vIGZ1cnRoZXJcclxuICogICBldmVudCBpcyBlbWl0dGVkIHVudGlsIHRoZSBjdXJyZW50IGFjdGlvbiByZXNvbHZlcykuXHJcbiAqIC0gUmV0dXJucyBgTEVBVkVfTUVFVElOR2Agd2hlbiB0aGUgc3RhdGUgaXMgYENVUlJFTlRMWV9BVFRFTkRJTkdgLlxyXG4gKiAtIFJldHVybnMgYExPR19BVFRFTkRBTkNFYCB3aGVuIHRoZSBzdGF0ZSBpcyBgTk9UX0FUVEVORElOR2Agb3IgdW5kZWZpbmVkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0F0dGVuZGFuY2VTdGF0ZSB8IHVuZGVmaW5lZH0gYXR0ZW5kYW5jZVN0YXRlIFRoZSByb3cncyBjdXJyZW50IGF0dGVuZGFuY2Ugc3RhdGUuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNJbkZsaWdodCBXaGV0aGVyIGFuIGF0dGVuZGFuY2UgYWN0aW9uIGZvciB0aGlzIHJvdyBpcyBhd2FpdGluZyByZXNvbHV0aW9uLlxyXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gbWVldGluZ0lkIFRoZSByb3cncyBtZWV0aW5nIGlkZW50aWZpZXIuXHJcbiAqIEByZXR1cm4ge0F0dGVuZGFuY2VBY3Rpb259IFRoZSBhY3Rpb24gdG8gZW1pdCwgb3IgYE5PTkVgIHdoZW4gbm9uLWFjdGlvbmFibGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF0dGVuZGFuY2VBY3Rpb24oXHJcbiAgYXR0ZW5kYW5jZVN0YXRlOiBBdHRlbmRhbmNlU3RhdGUgfCB1bmRlZmluZWQsXHJcbiAgaXNJbkZsaWdodDogYm9vbGVhbixcclxuICBtZWV0aW5nSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxyXG4pOiBBdHRlbmRhbmNlQWN0aW9uIHtcclxuICBpZiAoIW1lZXRpbmdJZCkge1xyXG4gICAgcmV0dXJuIEF0dGVuZGFuY2VBY3Rpb24uTk9ORTtcclxuICB9XHJcblxyXG4gIGlmIChpc0luRmxpZ2h0KSB7XHJcbiAgICByZXR1cm4gQXR0ZW5kYW5jZUFjdGlvbi5OT05FO1xyXG4gIH1cclxuXHJcbiAgaWYgKGF0dGVuZGFuY2VTdGF0ZSA9PT0gQXR0ZW5kYW5jZVN0YXRlLkNVUlJFTlRMWV9BVFRFTkRJTkcpIHtcclxuICAgIHJldHVybiBBdHRlbmRhbmNlQWN0aW9uLkxFQVZFX01FRVRJTkc7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gQXR0ZW5kYW5jZUFjdGlvbi5MT0dfQVRURU5EQU5DRTtcclxufVxyXG4iXX0=
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Pure luxon date/time formatting helpers for the dashboard library.
3
+ *
4
+ * The real "events & meetings" backend returns date-times as ISO-8601 strings
5
+ * (e.g. "2026-01-01T00:00:00") together with a display timezone string
6
+ * (e.g. "(UTC-04:00) America/New_York"). These helpers parse the ISO value and
7
+ * render it in the item's own zone (never moment). A numeric epoch-milliseconds
8
+ * value is also accepted for backward compatibility with fixtures/tests. All
9
+ * helpers fall back gracefully to an empty string when the value is missing or
10
+ * unparseable.
11
+ */
12
+ import { DateTime } from 'luxon';
13
+ /**
14
+ * Extracts a luxon-usable IANA zone from a backend timezone string such as
15
+ * "(UTC-04:00) America/New_York" or "America/New_York". Returns `undefined`
16
+ * when no usable zone can be derived so luxon falls back to the local zone.
17
+ * @param {string | undefined} timezone - The backend timezone string.
18
+ * @return {string | undefined} The IANA zone id, or undefined.
19
+ */
20
+ export function extractIanaZone(timezone) {
21
+ if (!timezone) {
22
+ return undefined;
23
+ }
24
+ // Strip a leading "(UTC±HH:MM) " offset prefix when present.
25
+ const closingParen = timezone.indexOf(') ');
26
+ const zone = closingParen > -1
27
+ ? timezone.slice(closingParen + 2).trim()
28
+ : timezone.trim();
29
+ return zone.length > 0 ? zone : undefined;
30
+ }
31
+ /**
32
+ * Parses a backend date-time value — either an ISO-8601 string
33
+ * (e.g. "2026-01-01T00:00:00") or an epoch-milliseconds number — into a luxon
34
+ * {@link DateTime} in the supplied timezone. The ISO value is treated as a wall
35
+ * time in the item's zone so the rendered time matches the backend's intent.
36
+ * Returns an invalid DateTime when the value is missing/unparseable.
37
+ * @param {string | number | undefined | null} value - The ISO string or epoch ms.
38
+ * @param {string | undefined} timezone - The backend timezone string.
39
+ * @return {DateTime} The parsed luxon DateTime (may be invalid).
40
+ */
41
+ export function parseBackendDateTime(value, timezone) {
42
+ const zone = extractIanaZone(timezone);
43
+ if (value === undefined || value === null || value === '') {
44
+ return DateTime.invalid('empty');
45
+ }
46
+ if (typeof value === 'number') {
47
+ return zone
48
+ ? DateTime.fromMillis(value, { zone })
49
+ : DateTime.fromMillis(value);
50
+ }
51
+ // ISO string: parse as a wall time in the item's zone when known.
52
+ const isoOptions = zone ? { zone } : {};
53
+ const parsed = DateTime.fromISO(value, isoOptions);
54
+ return parsed.isValid ? parsed : DateTime.fromISO(value);
55
+ }
56
+ /**
57
+ * Formats a backend date-time value (ISO string or epoch ms) with luxon using
58
+ * the supplied format token, honouring the supplied timezone. Returns an empty
59
+ * string when the value is missing or invalid.
60
+ * @param {string | number | undefined | null} value - The ISO string or epoch ms.
61
+ * @param {string} format - The luxon `toFormat` token.
62
+ * @param {string | undefined} timezone - The backend timezone string.
63
+ * @return {string} The formatted value, or an empty string.
64
+ */
65
+ export function formatBackendDateTime(value, format, timezone) {
66
+ const parsed = parseBackendDateTime(value, timezone);
67
+ return parsed.isValid ? parsed.toFormat(format) : '';
68
+ }
69
+ /**
70
+ * Backward-compatible alias kept for existing callers. Accepts ISO strings or
71
+ * epoch ms and formats them in the item's zone.
72
+ * @param {string | number | undefined | null} value - The ISO string or epoch ms.
73
+ * @param {string} format - The luxon `toFormat` token.
74
+ * @param {string | undefined} timezone - The backend timezone string.
75
+ * @return {string} The formatted value, or an empty string.
76
+ */
77
+ export function formatEpoch(value, format, timezone) {
78
+ return formatBackendDateTime(value, format, timezone);
79
+ }
80
+ /**
81
+ * Computes a human "Day X of Y" indicator for a multi-day event from its start
82
+ * and end date-times, relative to "now". Returns an empty string when the dates
83
+ * are missing/invalid or the event spans a single day.
84
+ * @param {string | number | undefined | null} start - Event start (ISO or epoch ms).
85
+ * @param {string | number | undefined | null} end - Event end (ISO or epoch ms).
86
+ * @param {string | undefined} timezone - The backend timezone string.
87
+ * @return {string} The "Day X of Y" label, or an empty string.
88
+ */
89
+ export function computeDayIndicator(start, end, timezone) {
90
+ const zone = extractIanaZone(timezone);
91
+ const startDt = parseBackendDateTime(start, timezone);
92
+ const endDt = parseBackendDateTime(end, timezone);
93
+ if (!startDt.isValid || !endDt.isValid) {
94
+ return '';
95
+ }
96
+ const startDay = startDt.startOf('day');
97
+ const endDay = endDt.startOf('day');
98
+ const totalDays = Math.floor(endDay.diff(startDay, 'days').days) + 1;
99
+ // Only meaningful for short, multi-day events (a conference-week style span).
100
+ // Very long spans (e.g. a year-long series) are not shown as "Day X of Y".
101
+ const MAX_DAY_INDICATOR_SPAN = 31;
102
+ if (totalDays <= 1 || totalDays > MAX_DAY_INDICATOR_SPAN) {
103
+ return '';
104
+ }
105
+ const now = (zone ? DateTime.now().setZone(zone) : DateTime.now()).startOf('day');
106
+ const clampedNow = now < startDay ? startDay : now > endDay ? endDay : now;
107
+ const currentDay = Math.floor(clampedNow.diff(startDay, 'days').days) + 1;
108
+ return `Day ${currentDay} of ${totalDays}`;
109
+ }
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1mb3JtYXQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rhc2hib2FyZC9zcmMvbGliL3V0aWxzL2RhdGUtZm9ybWF0LnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFakM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsUUFBNEI7SUFFNUIsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNiLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBQ0QsNkRBQTZEO0lBQzdELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQ1IsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNmLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7UUFDekMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxLQUF5QyxFQUN6QyxRQUFpQjtJQUVqQixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRTtRQUN6RCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDbEM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFB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QUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUUsT0FBTyxPQUFPLFVBQVUsT0FBTyxTQUFTLEVBQUUsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFB1cmUgbHV4b24gZGF0ZS90aW1lIGZvcm1hdHRpbmcgaGVscGVycyBmb3IgdGhlIGRhc2hib2FyZCBsaWJyYXJ5LlxyXG4gKlxyXG4gKiBUaGUgcmVhbCBcImV2ZW50cyAmIG1lZXRpbmdzXCIgYmFja2VuZCByZXR1cm5zIGRhdGUtdGltZXMgYXMgSVNPLTg2MDEgc3RyaW5nc1xyXG4gKiAoZS5nLiBcIjIwMjYtMDEtMDFUMDA6MDA6MDBcIikgdG9nZXRoZXIgd2l0aCBhIGRpc3BsYXkgdGltZXpvbmUgc3RyaW5nXHJcbiAqIChlLmcuIFwiKFVUQy0wNDowMCkgQW1lcmljYS9OZXdfWW9ya1wiKS4gVGhlc2UgaGVscGVycyBwYXJzZSB0aGUgSVNPIHZhbHVlIGFuZFxyXG4gKiByZW5kZXIgaXQgaW4gdGhlIGl0ZW0ncyBvd24gem9uZSAobmV2ZXIgbW9tZW50KS4gQSBudW1lcmljIGVwb2NoLW1pbGxpc2Vjb25kc1xyXG4gKiB2YWx1ZSBpcyBhbHNvIGFjY2VwdGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZml4dHVyZXMvdGVzdHMuIEFsbFxyXG4gKiBoZWxwZXJzIGZhbGwgYmFjayBncmFjZWZ1bGx5IHRvIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSB2YWx1ZSBpcyBtaXNzaW5nIG9yXHJcbiAqIHVucGFyc2VhYmxlLlxyXG4gKi9cclxuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbic7XHJcblxyXG4vKipcclxuICogRXh0cmFjdHMgYSBsdXhvbi11c2FibGUgSUFOQSB6b25lIGZyb20gYSBiYWNrZW5kIHRpbWV6b25lIHN0cmluZyBzdWNoIGFzXHJcbiAqIFwiKFVUQy0wNDowMCkgQW1lcmljYS9OZXdfWW9ya1wiIG9yIFwiQW1lcmljYS9OZXdfWW9ya1wiLiBSZXR1cm5zIGB1bmRlZmluZWRgXHJcbiAqIHdoZW4gbm8gdXNhYmxlIHpvbmUgY2FuIGJlIGRlcml2ZWQgc28gbHV4b24gZmFsbHMgYmFjayB0byB0aGUgbG9jYWwgem9uZS5cclxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHRpbWV6b25lIC0gVGhlIGJhY2tlbmQgdGltZXpvbmUgc3RyaW5nLlxyXG4gKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSBJQU5BIHpvbmUgaWQsIG9yIHVuZGVmaW5lZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SWFuYVpvbmUoXHJcbiAgdGltZXpvbmU6IHN0cmluZyB8IHVuZGVmaW5lZFxyXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gIGlmICghdGltZXpvbmUpIHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIC8vIFN0cmlwIGEgbGVhZGluZyBcIihVVEPCsUhIOk1NKSBcIiBvZmZzZXQgcHJlZml4IHdoZW4gcHJlc2VudC5cclxuICBjb25zdCBjbG9zaW5nUGFyZW4gPSB0aW1lem9uZS5pbmRleE9mKCcpICcpO1xyXG4gIGNvbnN0IHpvbmUgPVxyXG4gICAgY2xvc2luZ1BhcmVuID4gLTFcclxuICAgICAgPyB0aW1lem9uZS5zbGljZShjbG9zaW5nUGFyZW4gKyAyKS50cmltKClcclxuICAgICAgOiB0aW1lem9uZS50cmltKCk7XHJcbiAgcmV0dXJuIHpvbmUubGVuZ3RoID4gMCA/IHpvbmUgOiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYXJzZXMgYSBiYWNrZW5kIGRhdGUtdGltZSB2YWx1ZSDigJQgZWl0aGVyIGFuIElTTy04NjAxIHN0cmluZ1xyXG4gKiAoZS5nLiBcIjIwMjYtMDEtMDFUMDA6MDA6MDBcIikgb3IgYW4gZXBvY2gtbWlsbGlzZWNvbmRzIG51bWJlciDigJQgaW50byBhIGx1eG9uXHJcbiAqIHtAbGluayBEYXRlVGltZX0gaW4gdGhlIHN1cHBsaWVkIHRpbWV6b25lLiBUaGUgSVNPIHZhbHVlIGlzIHRyZWF0ZWQgYXMgYSB3YWxsXHJcbiAqIHRpbWUgaW4gdGhlIGl0ZW0ncyB6b25lIHNvIHRoZSByZW5kZXJlZCB0aW1lIG1hdGNoZXMgdGhlIGJhY2tlbmQncyBpbnRlbnQuXHJcbiAqIFJldHVybnMgYW4gaW52YWxpZCBEYXRlVGltZSB3aGVuIHRoZSB2YWx1ZSBpcyBtaXNzaW5nL3VucGFyc2VhYmxlLlxyXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGx9IHZhbHVlIC0gVGhlIElTTyBzdHJpbmcgb3IgZXBvY2ggbXMuXHJcbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB0aW1lem9uZSAtIFRoZSBiYWNrZW5kIHRpbWV6b25lIHN0cmluZy5cclxuICogQHJldHVybiB7RGF0ZVRpbWV9IFRoZSBwYXJzZWQgbHV4b24gRGF0ZVRpbWUgKG1heSBiZSBpbnZhbGlkKS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJhY2tlbmREYXRlVGltZShcclxuICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbCxcclxuICB0aW1lem9uZT86IHN0cmluZ1xyXG4pOiBEYXRlVGltZSB7XHJcbiAgY29uc3Qgem9uZSA9IGV4dHJhY3RJYW5hWm9uZSh0aW1lem9uZSk7XHJcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnKSB7XHJcbiAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCgnZW1wdHknKTtcclxuICB9XHJcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgIHJldHVybiB6b25lXHJcbiAgICAgID8gRGF0ZVRpbWUuZnJvbU1pbGxpcyh2YWx1ZSwgeyB6b25lIH0pXHJcbiAgICAgIDogRGF0ZVRpbWUuZnJvbU1pbGxpcyh2YWx1ZSk7XHJcbiAgfVxyXG4gIC8vIElTTyBzdHJpbmc6IHBhcnNlIGFzIGEgd2FsbCB0aW1lIGluIHRoZSBpdGVtJ3Mgem9uZSB3aGVuIGtub3duLlxyXG4gIGNvbnN0IGlzb09wdGlvbnMgPSB6b25lID8geyB6b25lIH0gOiB7fTtcclxuICBjb25zdCBwYXJzZWQgPSBEYXRlVGltZS5mcm9tSVNPKHZhbHVlLCBpc29PcHRpb25zKTtcclxuICByZXR1cm4gcGFyc2VkLmlzVmFsaWQgPyBwYXJzZWQgOiBEYXRlVGltZS5mcm9tSVNPKHZhbHVlKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZvcm1hdHMgYSBiYWNrZW5kIGRhdGUtdGltZSB2YWx1ZSAoSVNPIHN0cmluZyBvciBlcG9jaCBtcykgd2l0aCBsdXhvbiB1c2luZ1xyXG4gKiB0aGUgc3VwcGxpZWQgZm9ybWF0IHRva2VuLCBob25vdXJpbmcgdGhlIHN1cHBsaWVkIHRpbWV6b25lLiBSZXR1cm5zIGFuIGVtcHR5XHJcbiAqIHN0cmluZyB3aGVuIHRoZSB2YWx1ZSBpcyBtaXNzaW5nIG9yIGludmFsaWQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbH0gdmFsdWUgLSBUaGUgSVNPIHN0cmluZyBvciBlcG9jaCBtcy5cclxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFRoZSBsdXhvbiBgdG9Gb3JtYXRgIHRva2VuLlxyXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdGltZXpvbmUgLSBUaGUgYmFja2VuZCB0aW1lem9uZSBzdHJpbmcuXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB2YWx1ZSwgb3IgYW4gZW1wdHkgc3RyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJhY2tlbmREYXRlVGltZShcclxuICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbCxcclxuICBmb3JtYXQ6IHN0cmluZyxcclxuICB0aW1lem9uZT86IHN0cmluZ1xyXG4pOiBzdHJpbmcge1xyXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlQmFja2VuZERhdGVUaW1lKHZhbHVlLCB0aW1lem9uZSk7XHJcbiAgcmV0dXJuIHBhcnNlZC5pc1ZhbGlkID8gcGFyc2VkLnRvRm9ybWF0KGZvcm1hdCkgOiAnJztcclxufVxyXG5cclxuLyoqXHJcbiAqIEJhY2t3YXJkLWNvbXBhdGlibGUgYWxpYXMga2VwdCBmb3IgZXhpc3RpbmcgY2FsbGVycy4gQWNjZXB0cyBJU08gc3RyaW5ncyBvclxyXG4gKiBlcG9jaCBtcyBhbmQgZm9ybWF0cyB0aGVtIGluIHRoZSBpdGVtJ3Mgem9uZS5cclxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsfSB2YWx1ZSAtIFRoZSBJU08gc3RyaW5nIG9yIGVwb2NoIG1zLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gVGhlIGx1eG9uIGB0b0Zvcm1hdGAgdG9rZW4uXHJcbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB0aW1lem9uZSAtIFRoZSBiYWNrZW5kIHRpbWV6b25lIHN0cmluZy5cclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIHZhbHVlLCBvciBhbiBlbXB0eSBzdHJpbmcuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RXBvY2goXHJcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwsXHJcbiAgZm9ybWF0OiBzdHJpbmcsXHJcbiAgdGltZXpvbmU/OiBzdHJpbmdcclxuKTogc3RyaW5nIHtcclxuICByZXR1cm4gZm9ybWF0QmFja2VuZERhdGVUaW1lKHZhbHVlLCBmb3JtYXQsIHRpbWV6b25lKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIGEgaHVtYW4gXCJEYXkgWCBvZiBZXCIgaW5kaWNhdG9yIGZvciBhIG11bHRpLWRheSBldmVudCBmcm9tIGl0cyBzdGFydFxyXG4gKiBhbmQgZW5kIGRhdGUtdGltZXMsIHJlbGF0aXZlIHRvIFwibm93XCIuIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGRhdGVzXHJcbiAqIGFyZSBtaXNzaW5nL2ludmFsaWQgb3IgdGhlIGV2ZW50IHNwYW5zIGEgc2luZ2xlIGRheS5cclxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsfSBzdGFydCAtIEV2ZW50IHN0YXJ0IChJU08gb3IgZXBvY2ggbXMpLlxyXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGx9IGVuZCAtIEV2ZW50IGVuZCAoSVNPIG9yIGVwb2NoIG1zKS5cclxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHRpbWV6b25lIC0gVGhlIGJhY2tlbmQgdGltZXpvbmUgc3RyaW5nLlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBcIkRheSBYIG9mIFlcIiBsYWJlbCwgb3IgYW4gZW1wdHkgc3RyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVEYXlJbmRpY2F0b3IoXHJcbiAgc3RhcnQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwsXHJcbiAgZW5kOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsLFxyXG4gIHRpbWV6b25lPzogc3RyaW5nXHJcbik6IHN0cmluZyB7XHJcbiAgY29uc3Qgem9uZSA9IGV4dHJhY3RJYW5hWm9uZSh0aW1lem9uZSk7XHJcbiAgY29uc3Qgc3RhcnREdCA9IHBhcnNlQmFja2VuZERhdGVUaW1lKHN0YXJ0LCB0aW1lem9uZSk7XHJcbiAgY29uc3QgZW5kRHQgPSBwYXJzZUJhY2tlbmREYXRlVGltZShlbmQsIHRpbWV6b25lKTtcclxuICBpZiAoIXN0YXJ0RHQuaXNWYWxpZCB8fCAhZW5kRHQuaXNWYWxpZCkge1xyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuICBjb25zdCBzdGFydERheSA9IHN0YXJ0RHQuc3RhcnRPZignZGF5Jyk7XHJcbiAgY29uc3QgZW5kRGF5ID0gZW5kRHQuc3RhcnRPZignZGF5Jyk7XHJcbiAgY29uc3QgdG90YWxEYXlzID0gTWF0aC5mbG9vcihlbmREYXkuZGlmZihzdGFydERheSwgJ2RheXMnKS5kYXlzKSArIDE7XHJcbiAgLy8gT25seSBtZWFuaW5nZnVsIGZvciBzaG9ydCwgbXVsdGktZGF5IGV2ZW50cyAoYSBjb25mZXJlbmNlLXdlZWsgc3R5bGUgc3BhbikuXHJcbiAgLy8gVmVyeSBsb25nIHNwYW5zIChlLmcuIGEgeWVhci1sb25nIHNlcmllcykgYXJlIG5vdCBzaG93biBhcyBcIkRheSBYIG9mIFlcIi5cclxuICBjb25zdCBNQVhfREFZX0lORElDQVRPUl9TUEFOID0gMzE7XHJcbiAgaWYgKHRvdGFsRGF5cyA8PSAxIHx8IHRvdGFsRGF5cyA+IE1BWF9EQVlfSU5ESUNBVE9SX1NQQU4pIHtcclxuICAgIHJldHVybiAnJztcclxuICB9XHJcbiAgY29uc3Qgbm93ID0gKHpvbmUgPyBEYXRlVGltZS5ub3coKS5zZXRab25lKHpvbmUpIDogRGF0ZVRpbWUubm93KCkpLnN0YXJ0T2YoXHJcbiAgICAnZGF5J1xyXG4gICk7XHJcbiAgY29uc3QgY2xhbXBlZE5vdyA9IG5vdyA8IHN0YXJ0RGF5ID8gc3RhcnREYXkgOiBub3cgPiBlbmREYXkgPyBlbmREYXkgOiBub3c7XHJcbiAgY29uc3QgY3VycmVudERheSA9IE1hdGguZmxvb3IoY2xhbXBlZE5vdy5kaWZmKHN0YXJ0RGF5LCAnZGF5cycpLmRheXMpICsgMTtcclxuICByZXR1cm4gYERheSAke2N1cnJlbnREYXl9IG9mICR7dG90YWxEYXlzfWA7XHJcbn1cclxuIl19
@@ -0,0 +1,96 @@
1
+ import { UpcomingItemKind, } from '../models/upcoming-event.model';
2
+ import { computeDayIndicator } from './date-format.util';
3
+ /**
4
+ * Determines whether a raw list item is an EVENT (owns child meetings) or a
5
+ * STANDALONE_MEETING. An item is an EVENT when the backend flags it with
6
+ * `isMeetingEvent === true` or `hasChildren === true`.
7
+ * @param {EventMeetingListItem} item - The raw list item.
8
+ * @return {UpcomingItemKind} The resolved render kind.
9
+ */
10
+ export function resolveItemKind(item) {
11
+ const isEvent = item?.isMeetingEvent === true || item?.hasChildren === true;
12
+ return isEvent ? UpcomingItemKind.EVENT : UpcomingItemKind.STANDALONE_MEETING;
13
+ }
14
+ /**
15
+ * Maps a raw backend list item to the {@link UpcomingEvent} view model. EVENT
16
+ * rows start with an empty `meetings` array (child meetings are lazily loaded on
17
+ * expand); STANDALONE_MEETING rows carry their own group/location fields.
18
+ * @param {EventMeetingListItem} item - The raw list item.
19
+ * @return {UpcomingEvent} The mapped view model.
20
+ */
21
+ export function mapListItemToUpcomingEvent(item) {
22
+ const kind = resolveItemKind(item);
23
+ const timezone = item?.timeZone ?? '';
24
+ const dayIndicator = item?.dayIndicator ??
25
+ (kind === UpcomingItemKind.EVENT
26
+ ? computeDayIndicator(item?.startDateTime, item?.endDateTime, timezone)
27
+ : '');
28
+ return {
29
+ eventId: item?.id ?? item?.eventId ?? item?.meetingId ?? '',
30
+ kind,
31
+ // The list endpoint uses `name`; fall back to `meetingTitle` for meeting rows.
32
+ title: item?.name ?? item?.meetingTitle ?? '',
33
+ // The list screen copies status into contentUnderLink; accept either.
34
+ status: item?.status ?? item?.contentUnderLink ?? '',
35
+ dayIndicator,
36
+ meetingCount: kind === UpcomingItemKind.STANDALONE_MEETING
37
+ ? 1
38
+ : item?.meetingCount ?? 0,
39
+ openForAttendanceCount: item?.openForAttendanceCount ?? 0,
40
+ startDateTime: item?.startDateTime,
41
+ endDateTime: item?.endDateTime,
42
+ timezone,
43
+ groupOrCommittee: item?.groupName ?? item?.groupAcronym ?? '',
44
+ roomOrLocation: item?.meetingLocation ?? item?.room ?? '',
45
+ isMemberOfGroup: item?.isMemberOfGroup ?? false,
46
+ meetings: [],
47
+ };
48
+ }
49
+ /**
50
+ * Maps a raw backend list of events & meetings into the dashboard view models,
51
+ * enforcing that STANDALONE_MEETING rows always sort LAST while preserving the
52
+ * backend's within-group ordering for each partition (stable sort).
53
+ * @param {EventMeetingListItem[]} items - The raw list items.
54
+ * @return {UpcomingEvent[]} The mapped, standalone-last ordered view models.
55
+ */
56
+ export function mapEventMeetingList(items) {
57
+ const mapped = (items ?? []).map((item) => mapListItemToUpcomingEvent(item));
58
+ const events = mapped.filter((entry) => entry.kind === UpcomingItemKind.EVENT);
59
+ const standalone = mapped.filter((entry) => entry.kind === UpcomingItemKind.STANDALONE_MEETING);
60
+ return [...events, ...standalone];
61
+ }
62
+ /**
63
+ * Maps a raw backend child-meeting detail item to the {@link MeetingRow} view
64
+ * model used by the event block's expanded meeting list.
65
+ * @param {EventMeetingDetailItem} item - The raw child-meeting item.
66
+ * @return {MeetingRow} The mapped meeting row.
67
+ */
68
+ export function mapDetailItemToMeetingRow(item) {
69
+ const status = item?.status ?? '';
70
+ // A meeting is "open for attendance" while it is In Progress. The
71
+ // meetingsDetails endpoint has no dedicated flag, so derive it from status
72
+ // (honouring an explicit backend flag when one is provided).
73
+ const isOpenForAttendance = item?.isOpenForAttendance ?? status.trim().toLowerCase() === 'in progress';
74
+ return {
75
+ meetingId: item?.meetingId ?? '',
76
+ meetingName: item?.meetingTitle ?? '',
77
+ groupOrCommittee: item?.groupName ?? '',
78
+ roomOrLocation: item?.meetingLocation ?? '',
79
+ startDateTime: item?.meetingStDate,
80
+ endDateTime: item?.meetingEdDate,
81
+ timezone: item?.timeZone ?? '',
82
+ status,
83
+ isMemberOfGroup: item?.isMemberOfGroup ?? false,
84
+ isOpenForAttendance,
85
+ };
86
+ }
87
+ /**
88
+ * Maps a raw backend list of child-meeting detail items to {@link MeetingRow}
89
+ * view models.
90
+ * @param {EventMeetingDetailItem[]} items - The raw child-meeting items.
91
+ * @return {MeetingRow[]} The mapped meeting rows.
92
+ */
93
+ export function mapEventMeetingDetails(items) {
94
+ return (items ?? []).map((item) => mapDetailItemToMeetingRow(item));
95
+ }
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbWVldGluZy1tYXBwZXIudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rhc2hib2FyZC9zcmMvbGliL3V0aWxzL2V2ZW50LW1lZXRpbmctbWFwcGVyLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY0EsT0FBTyxFQUVMLGdCQUFnQixHQUNqQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXpEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLElBQTBCO0lBRTFCLE1BQU0sT0FBTyxHQUFHLElBQUksRUFBRSxjQUFjLEtBQUssSUFBSSxJQUFJLElBQUksRUFBRSxXQUFXLEtBQUssSUFBSSxDQUFDO0lBQzVFLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDO0FBQ2hGLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLElBQTBCO0lBRTFCLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUN0QyxNQUFNLFlBQVksR0FDaEIsSUFBSSxFQUFFLFlBQVk7UUFDbEIsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLENBQUMsS0FBSztZQUM5QixDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQztZQUN2RSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDVixPQUFPO1FBQ0wsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE9BQU8sSUFBSSxJQUFJLEVB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QUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBQdXJlIG1hcHBlcnMgY29udmVydGluZyB0aGUgcmF3IFwiZXZlbnRzICYgbWVldGluZ3NcIiBiYWNrZW5kIGxpc3QvZGV0YWlsIGl0ZW1zXHJcbiAqIGludG8gdGhlIGRhc2hib2FyZCB2aWV3IG1vZGVscy4gTm8gQW5ndWxhciAvIHNlcnZpY2UgZGVwZW5kZW5jaWVzIHNvIHRoZXkgYXJlXHJcbiAqIHRyaXZpYWxseSB1bml0LXRlc3RhYmxlIGFuZCBzaGFyZWQgYnkge0BsaW5rIERhc2hib2FyZFNlcnZpY2V9LlxyXG4gKlxyXG4gKiBCYWNrZW5kIGRhdGVzIGFyZSBlcG9jaCBtaWxsaXNlY29uZHM7IGNhbGxlcnMgZm9ybWF0IHRoZW0gd2l0aCBsdXhvblxyXG4gKiBgRGF0ZVRpbWUuZnJvbU1pbGxpc2AgYXQgcmVuZGVyIHRpbWUuIFRoZSBsaXN0IG1hcHBlciBlbmZvcmNlcyB0aGUgZGFzaGJvYXJkXHJcbiAqIHJ1bGUgdGhhdCBTVEFOREFMT05FX01FRVRJTkcgcm93cyBhbHdheXMgc29ydCBMQVNUIHdpdGhpbiB0aGUgc2VjdGlvbi5cclxuICovXHJcbmltcG9ydCB7XHJcbiAgRXZlbnRNZWV0aW5nRGV0YWlsSXRlbSxcclxuICBFdmVudE1lZXRpbmdMaXN0SXRlbSxcclxufSBmcm9tICcuLi9tb2RlbHMvZXZlbnQtbWVldGluZy1saXN0LWl0ZW0ubW9kZWwnO1xyXG5pbXBvcnQgeyBNZWV0aW5nUm93IH0gZnJvbSAnLi4vbW9kZWxzL21lZXRpbmctcm93Lm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBVcGNvbWluZ0V2ZW50LFxyXG4gIFVwY29taW5nSXRlbUtpbmQsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL3VwY29taW5nLWV2ZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgY29tcHV0ZURheUluZGljYXRvciB9IGZyb20gJy4vZGF0ZS1mb3JtYXQudXRpbCc7XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcmF3IGxpc3QgaXRlbSBpcyBhbiBFVkVOVCAob3ducyBjaGlsZCBtZWV0aW5ncykgb3IgYVxyXG4gKiBTVEFOREFMT05FX01FRVRJTkcuIEFuIGl0ZW0gaXMgYW4gRVZFTlQgd2hlbiB0aGUgYmFja2VuZCBmbGFncyBpdCB3aXRoXHJcbiAqIGBpc01lZXRpbmdFdmVudCA9PT0gdHJ1ZWAgb3IgYGhhc0NoaWxkcmVuID09PSB0cnVlYC5cclxuICogQHBhcmFtIHtFdmVudE1lZXRpbmdMaXN0SXRlbX0gaXRlbSAtIFRoZSByYXcgbGlzdCBpdGVtLlxyXG4gKiBAcmV0dXJuIHtVcGNvbWluZ0l0ZW1LaW5kfSBUaGUgcmVzb2x2ZWQgcmVuZGVyIGtpbmQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUl0ZW1LaW5kKFxyXG4gIGl0ZW06IEV2ZW50TWVldGluZ0xpc3RJdGVtXHJcbik6IFVwY29taW5nSXRlbUtpbmQge1xyXG4gIGNvbnN0IGlzRXZlbnQgPSBpdGVtPy5pc01lZXRpbmdFdmVudCA9PT0gdHJ1ZSB8fCBpdGVtPy5oYXNDaGlsZHJlbiA9PT0gdHJ1ZTtcclxuICByZXR1cm4gaXNFdmVudCA/IFVwY29taW5nSXRlbUtpbmQuRVZFTlQgOiBVcGNvbWluZ0l0ZW1LaW5kLlNUQU5EQUxPTkVfTUVFVElORztcclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcHMgYSByYXcgYmFja2VuZCBsaXN0IGl0ZW0gdG8gdGhlIHtAbGluayBVcGNvbWluZ0V2ZW50fSB2aWV3IG1vZGVsLiBFVkVOVFxyXG4gKiByb3dzIHN0YXJ0IHdpdGggYW4gZW1wdHkgYG1lZXRpbmdzYCBhcnJheSAoY2hpbGQgbWVldGluZ3MgYXJlIGxhemlseSBsb2FkZWQgb25cclxuICogZXhwYW5kKTsgU1RBTkRBTE9ORV9NRUVUSU5HIHJvd3MgY2FycnkgdGhlaXIgb3duIGdyb3VwL2xvY2F0aW9uIGZpZWxkcy5cclxuICogQHBhcmFtIHtFdmVudE1lZXRpbmdMaXN0SXRlbX0gaXRlbSAtIFRoZSByYXcgbGlzdCBpdGVtLlxyXG4gKiBAcmV0dXJuIHtVcGNvbWluZ0V2ZW50fSBUaGUgbWFwcGVkIHZpZXcgbW9kZWwuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWFwTGlzdEl0ZW1Ub1VwY29taW5nRXZlbnQoXHJcbiAgaXRlbTogRXZlbnRNZWV0aW5nTGlzdEl0ZW1cclxuKTogVXBjb21pbmdFdmVudCB7XHJcbiAgY29uc3Qga2luZCA9IHJlc29sdmVJdGVtS2luZChpdGVtKTtcclxuICBjb25zdCB0aW1lem9uZSA9IGl0ZW0/LnRpbWVab25lID8/ICcnO1xyXG4gIGNvbnN0IGRheUluZGljYXRvciA9XHJcbiAgICBpdGVtPy5kYXlJbmRpY2F0b3IgPz9cclxuICAgIChraW5kID09PSBVcGNvbWluZ0l0ZW1LaW5kLkVWRU5UXHJcbiAgICAgID8gY29tcHV0ZURheUluZGljYXRvcihpdGVtPy5zdGFydERhdGVUaW1lLCBpdGVtPy5lbmREYXRlVGltZSwgdGltZXpvbmUpXHJcbiAgICAgIDogJycpO1xyXG4gIHJldHVybiB7XHJcbiAgICBldmVudElkOiBpdGVtPy5pZCA/PyBpdGVtPy5ldmVudElkID8/IGl0ZW0/Lm1lZXRpbmdJZCA/PyAnJyxcclxuICAgIGtpbmQsXHJcbiAgICAvLyBUaGUgbGlzdCBlbmRwb2ludCB1c2VzIGBuYW1lYDsgZmFsbCBiYWNrIHRvIGBtZWV0aW5nVGl0bGVgIGZvciBtZWV0aW5nIHJvd3MuXHJcbiAgICB0aXRsZTogaXRlbT8ubmFtZSA/PyBpdGVtPy5tZWV0aW5nVGl0bGUgPz8gJycsXHJcbiAgICAvLyBUaGUgbGlzdCBzY3JlZW4gY29waWVzIHN0YXR1cyBpbnRvIGNvbnRlbnRVbmRlckxpbms7IGFjY2VwdCBlaXRoZXIuXHJcbiAgICBzdGF0dXM6IGl0ZW0/LnN0YXR1cyA/PyBpdGVtPy5jb250ZW50VW5kZXJMaW5rID8/ICcnLFxyXG4gICAgZGF5SW5kaWNhdG9yLFxyXG4gICAgbWVldGluZ0NvdW50OlxyXG4gICAgICBraW5kID09PSBVcGNvbWluZ0l0ZW1LaW5kLlNUQU5EQUxPTkVfTUVFVElOR1xyXG4gICAgICAgID8gMVxyXG4gICAgICAgIDogaXRlbT8ubWVldGluZ0NvdW50ID8/IDAsXHJcbiAgICBvcGVuRm9yQXR0ZW5kYW5jZUNvdW50OiBpdGVtPy5vcGVuRm9yQXR0ZW5kYW5jZUNvdW50ID8/IDAsXHJcbiAgICBzdGFydERhdGVUaW1lOiBpdGVtPy5zdGFydERhdGVUaW1lLFxyXG4gICAgZW5kRGF0ZVRpbWU6IGl0ZW0/LmVuZERhdGVUaW1lLFxyXG4gICAgdGltZXpvbmUsXHJcbiAgICBncm91cE9yQ29tbWl0dGVlOiBpdGVtPy5ncm91cE5hbWUgPz8gaXRlbT8uZ3JvdXBBY3JvbnltID8/ICcnLFxyXG4gICAgcm9vbU9yTG9jYXRpb246IGl0ZW0/Lm1lZXRpbmdMb2NhdGlvbiA/PyBpdGVtPy5yb29tID8/ICcnLFxyXG4gICAgaXNNZW1iZXJPZkdyb3VwOiBpdGVtPy5pc01lbWJlck9mR3JvdXAgPz8gZmFsc2UsXHJcbiAgICBtZWV0aW5nczogW10sXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcHMgYSByYXcgYmFja2VuZCBsaXN0IG9mIGV2ZW50cyAmIG1lZXRpbmdzIGludG8gdGhlIGRhc2hib2FyZCB2aWV3IG1vZGVscyxcclxuICogZW5mb3JjaW5nIHRoYXQgU1RBTkRBTE9ORV9NRUVUSU5HIHJvd3MgYWx3YXlzIHNvcnQgTEFTVCB3aGlsZSBwcmVzZXJ2aW5nIHRoZVxyXG4gKiBiYWNrZW5kJ3Mgd2l0aGluLWdyb3VwIG9yZGVyaW5nIGZvciBlYWNoIHBhcnRpdGlvbiAoc3RhYmxlIHNvcnQpLlxyXG4gKiBAcGFyYW0ge0V2ZW50TWVldGluZ0xpc3RJdGVtW119IGl0ZW1zIC0gVGhlIHJhdyBsaXN0IGl0ZW1zLlxyXG4gKiBAcmV0dXJuIHtVcGNvbWluZ0V2ZW50W119IFRoZSBtYXBwZWQsIHN0YW5kYWxvbmUtbGFzdCBvcmRlcmVkIHZpZXcgbW9kZWxzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1hcEV2ZW50TWVldGluZ0xpc3QoXHJcbiAgaXRlbXM6IEV2ZW50TWVldGluZ0xpc3RJdGVtW11cclxuKTogVXBjb21pbmdFdmVudFtdIHtcclxuICBjb25zdCBtYXBwZWQgPSAoaXRlbXMgPz8gW10pLm1hcCgoaXRlbSkgPT4gbWFwTGlzdEl0ZW1Ub1VwY29taW5nRXZlbnQoaXRlbSkpO1xyXG4gIGNvbnN0IGV2ZW50cyA9IG1hcHBlZC5maWx0ZXIoXHJcbiAgICAoZW50cnkpID0+IGVudHJ5LmtpbmQgPT09IFVwY29taW5nSXRlbUtpbmQuRVZFTlRcclxuICApO1xyXG4gIGNvbnN0IHN0YW5kYWxvbmUgPSBtYXBwZWQuZmlsdGVyKFxyXG4gICAgKGVudHJ5KSA9PiBlbnRyeS5raW5kID09PSBVcGNvbWluZ0l0ZW1LaW5kLlNUQU5EQUxPTkVfTUVFVElOR1xyXG4gICk7XHJcbiAgcmV0dXJuIFsuLi5ldmVudHMsIC4uLnN0YW5kYWxvbmVdO1xyXG59XHJcblxyXG4vKipcclxuICogTWFwcyBhIHJhdyBiYWNrZW5kIGNoaWxkLW1lZXRpbmcgZGV0YWlsIGl0ZW0gdG8gdGhlIHtAbGluayBNZWV0aW5nUm93fSB2aWV3XHJcbiAqIG1vZGVsIHVzZWQgYnkgdGhlIGV2ZW50IGJsb2NrJ3MgZXhwYW5kZWQgbWVldGluZyBsaXN0LlxyXG4gKiBAcGFyYW0ge0V2ZW50TWVldGluZ0RldGFpbEl0ZW19IGl0ZW0gLSBUaGUgcmF3IGNoaWxkLW1lZXRpbmcgaXRlbS5cclxuICogQHJldHVybiB7TWVldGluZ1Jvd30gVGhlIG1hcHBlZCBtZWV0aW5nIHJvdy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXBEZXRhaWxJdGVtVG9NZWV0aW5nUm93KFxyXG4gIGl0ZW06IEV2ZW50TWVldGluZ0RldGFpbEl0ZW1cclxuKTogTWVldGluZ1JvdyB7XHJcbiAgY29uc3Qgc3RhdHVzID0gaXRlbT8uc3RhdHVzID8/ICcnO1xyXG4gIC8vIEEgbWVldGluZyBpcyBcIm9wZW4gZm9yIGF0dGVuZGFuY2VcIiB3aGlsZSBpdCBpcyBJbiBQcm9ncmVzcy4gVGhlXHJcbiAgLy8gbWVldGluZ3NEZXRhaWxzIGVuZHBvaW50IGhhcyBubyBkZWRpY2F0ZWQgZmxhZywgc28gZGVyaXZlIGl0IGZyb20gc3RhdHVzXHJcbiAgLy8gKGhvbm91cmluZyBhbiBleHBsaWNpdCBiYWNrZW5kIGZsYWcgd2hlbiBvbmUgaXMgcHJvdmlkZWQpLlxyXG4gIGNvbnN0IGlzT3BlbkZvckF0dGVuZGFuY2UgPVxyXG4gICAgaXRlbT8uaXNPcGVuRm9yQXR0ZW5kYW5jZSA/PyBzdGF0dXMudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICdpbiBwcm9ncmVzcyc7XHJcbiAgcmV0dXJuIHtcclxuICAgIG1lZXRpbmdJZDogaXRlbT8ubWVldGluZ0lkID8/ICcnLFxyXG4gICAgbWVldGluZ05hbWU6IGl0ZW0/Lm1lZXRpbmdUaXRsZSA/PyAnJyxcclxuICAgIGdyb3VwT3JDb21taXR0ZWU6IGl0ZW0/Lmdyb3VwTmFtZSA/PyAnJyxcclxuICAgIHJvb21PckxvY2F0aW9uOiBpdGVtPy5tZWV0aW5nTG9jYXRpb24gPz8gJycsXHJcbiAgICBzdGFydERhdGVUaW1lOiBpdGVtPy5tZWV0aW5nU3REYXRlLFxyXG4gICAgZW5kRGF0ZVRpbWU6IGl0ZW0/Lm1lZXRpbmdFZERhdGUsXHJcbiAgICB0aW1lem9uZTogaXRlbT8udGltZVpvbmUgPz8gJycsXHJcbiAgICBzdGF0dXMsXHJcbiAgICBpc01lbWJlck9mR3JvdXA6IGl0ZW0/LmlzTWVtYmVyT2ZHcm91cCA/PyBmYWxzZSxcclxuICAgIGlzT3BlbkZvckF0dGVuZGFuY2UsXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcHMgYSByYXcgYmFja2VuZCBsaXN0IG9mIGNoaWxkLW1lZXRpbmcgZGV0YWlsIGl0ZW1zIHRvIHtAbGluayBNZWV0aW5nUm93fVxyXG4gKiB2aWV3IG1vZGVscy5cclxuICogQHBhcmFtIHtFdmVudE1lZXRpbmdEZXRhaWxJdGVtW119IGl0ZW1zIC0gVGhlIHJhdyBjaGlsZC1tZWV0aW5nIGl0ZW1zLlxyXG4gKiBAcmV0dXJuIHtNZWV0aW5nUm93W119IFRoZSBtYXBwZWQgbWVldGluZyByb3dzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1hcEV2ZW50TWVldGluZ0RldGFpbHMoXHJcbiAgaXRlbXM6IEV2ZW50TWVldGluZ0RldGFpbEl0ZW1bXVxyXG4pOiBNZWV0aW5nUm93W10ge1xyXG4gIHJldHVybiAoaXRlbXMgPz8gW10pLm1hcCgoaXRlbSkgPT4gbWFwRGV0YWlsSXRlbVRvTWVldGluZ1JvdyhpdGVtKSk7XHJcbn1cclxuIl19
@@ -0,0 +1,36 @@
1
+ /*
2
+ * Public API Surface of dashboard
3
+ */
4
+ // Container component + navigation intent type (DashboardComponent, DashboardNavigationIntent)
5
+ export * from './lib/dashboard.component';
6
+ // Child components
7
+ export * from './lib/components/welcome-header/dashboard-welcome-header.component';
8
+ export * from './lib/components/upcoming-meetings-events/upcoming-meetings-events.component';
9
+ export * from './lib/components/event-group-card/event-group-card.component';
10
+ export * from './lib/components/meeting-attendance-row/meeting-attendance-row.component';
11
+ export * from './lib/components/your-groups/your-groups.component';
12
+ export * from './lib/components/member-level-badge/member-level-badge.component';
13
+ // Module + routes
14
+ export * from './lib/dashboard.module';
15
+ export * from './lib/dashboard.routes';
16
+ // Models
17
+ export * from './lib/models/dashboard-route-config.model';
18
+ export * from './lib/models/attendance-state.model';
19
+ export * from './lib/models/dashboard-section-state.model';
20
+ export * from './lib/models/page-change.model';
21
+ export * from './lib/models/dashboard-user-info.model';
22
+ export * from './lib/models/meeting-row.model';
23
+ export * from './lib/models/upcoming-event.model';
24
+ export * from './lib/models/event-meeting-list-item.model';
25
+ export * from './lib/models/event-meeting-list-payload.model';
26
+ export * from './lib/models/group-row.model';
27
+ export * from './lib/models/attendance-action-permissions.model';
28
+ export * from './lib/models/dashboard-list-response.model';
29
+ // Services
30
+ export * from './lib/services/dashboard.service';
31
+ export * from './lib/services/user-permissions.service';
32
+ // Asset mocks consumed by the demo app
33
+ export * from './lib/assets/dashboard-route-paths.mock';
34
+ export * from './lib/assets/dashboard-user-permissions.mock';
35
+ export * from './lib/assets/dashboard-mock';
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2Rhc2hib2FyZC9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILCtGQUErRjtBQUMvRixjQUFjLDJCQUEyQixDQUFDO0FBRTFDLG1CQUFtQjtBQUNuQixjQUFjLG9FQUFvRSxDQUFDO0FBQ25GLGNBQWMsOEVBQThFLENBQUM7QUFDN0YsY0FBYyw4REFBOEQsQ0FBQztBQUM3RSxjQUFjLDBFQUEwRSxDQUFDO0FBQ3pGLGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyxrRUFBa0UsQ0FBQztBQUVqRixrQkFBa0I7QUFDbEIsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHdCQUF3QixDQUFDO0FBRXZDLFNBQVM7QUFDVCxjQUFjLDJDQUEyQyxDQUFDO0FBQzFELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLG1DQUFtQyxDQUFDO0FBQ2xELGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsa0RBQWtELENBQUM7QUFDakUsY0FBYyw0Q0FBNEMsQ0FBQztBQUUzRCxXQUFXO0FBQ1gsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLHlDQUF5QyxDQUFDO0FBRXhELHVDQUF1QztBQUN2QyxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsOENBQThDLENBQUM7QUFDN0QsY0FBYyw2QkFBNkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBkYXNoYm9hcmRcclxuICovXHJcblxyXG4vLyBDb250YWluZXIgY29tcG9uZW50ICsgbmF2aWdhdGlvbiBpbnRlbnQgdHlwZSAoRGFzaGJvYXJkQ29tcG9uZW50LCBEYXNoYm9hcmROYXZpZ2F0aW9uSW50ZW50KVxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9kYXNoYm9hcmQuY29tcG9uZW50JztcclxuXHJcbi8vIENoaWxkIGNvbXBvbmVudHNcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy93ZWxjb21lLWhlYWRlci9kYXNoYm9hcmQtd2VsY29tZS1oZWFkZXIuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy91cGNvbWluZy1tZWV0aW5ncy1ldmVudHMvdXBjb21pbmctbWVldGluZ3MtZXZlbnRzLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvZXZlbnQtZ3JvdXAtY2FyZC9ldmVudC1ncm91cC1jYXJkLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvbWVldGluZy1hdHRlbmRhbmNlLXJvdy9tZWV0aW5nLWF0dGVuZGFuY2Utcm93LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMveW91ci1ncm91cHMveW91ci1ncm91cHMuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9tZW1iZXItbGV2ZWwtYmFkZ2UvbWVtYmVyLWxldmVsLWJhZGdlLmNvbXBvbmVudCc7XHJcblxyXG4vLyBNb2R1bGUgKyByb3V0ZXNcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZGFzaGJvYXJkLm1vZHVsZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Rhc2hib2FyZC5yb3V0ZXMnO1xyXG5cclxuLy8gTW9kZWxzXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9kYXNoYm9hcmQtcm91dGUtY29uZmlnLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2F0dGVuZGFuY2Utc3RhdGUubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvZGFzaGJvYXJkLXNlY3Rpb24tc3RhdGUubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvcGFnZS1jaGFuZ2UubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvZGFzaGJvYXJkLXVzZXItaW5mby5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9tZWV0aW5nLXJvdy5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy91cGNvbWluZy1ldmVudC5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9ldmVudC1tZWV0aW5nLWxpc3QtaXRlbS5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9ldmVudC1tZWV0aW5nLWxpc3QtcGF5bG9hZC5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9ncm91cC1yb3cubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvYXR0ZW5kYW5jZS1hY3Rpb24tcGVybWlzc2lvbnMubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvZGFzaGJvYXJkLWxpc3QtcmVzcG9uc2UubW9kZWwnO1xyXG5cclxuLy8gU2VydmljZXNcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvZGFzaGJvYXJkLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy91c2VyLXBlcm1pc3Npb25zLnNlcnZpY2UnO1xyXG5cclxuLy8gQXNzZXQgbW9ja3MgY29uc3VtZWQgYnkgdGhlIGRlbW8gYXBwXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Fzc2V0cy9kYXNoYm9hcmQtcm91dGUtcGF0aHMubW9jayc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Fzc2V0cy9kYXNoYm9hcmQtdXNlci1wZXJtaXNzaW9ucy5tb2NrJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvYXNzZXRzL2Rhc2hib2FyZC1tb2NrJztcclxuIl19