@ieeesa-npm/dashboard 0.0.0-stage → 0.0.1

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 (63) hide show
  1. package/README.md +75 -3
  2. package/esm2022/ieeesa-npm-dashboard.mjs +5 -0
  3. package/esm2022/lib/assets/constants.json +141 -0
  4. package/esm2022/lib/assets/dashboard-mock.mjs +217 -0
  5. package/esm2022/lib/assets/dashboard-route-paths.mock.mjs +12 -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 +277 -0
  9. package/esm2022/lib/components/meeting-attendance-row/meeting-attendance-row.component.mjs +181 -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 +163 -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 +206 -0
  14. package/esm2022/lib/dashboard.component.mjs +377 -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/group-row.model.mjs +2 -0
  24. package/esm2022/lib/models/meeting-row.model.mjs +2 -0
  25. package/esm2022/lib/models/page-change.model.mjs +2 -0
  26. package/esm2022/lib/models/upcoming-event.model.mjs +2 -0
  27. package/esm2022/lib/services/attendance-reducers.mjs +54 -0
  28. package/esm2022/lib/services/dashboard.service.mjs +208 -0
  29. package/esm2022/lib/services/user-permissions.service.mjs +50 -0
  30. package/esm2022/lib/utils/attendance-action.util.mjs +53 -0
  31. package/esm2022/public-api.mjs +34 -0
  32. package/fesm2022/ieeesa-npm-dashboard.mjs +2234 -0
  33. package/fesm2022/ieeesa-npm-dashboard.mjs.map +1 -0
  34. package/index.d.ts +5 -0
  35. package/lib/assets/dashboard-mock.d.ts +31 -0
  36. package/lib/assets/dashboard-route-paths.mock.d.ts +2 -0
  37. package/lib/assets/dashboard-user-permissions.mock.d.ts +2 -0
  38. package/lib/assets/date-formats.d.ts +27 -0
  39. package/lib/components/event-group-card/event-group-card.component.d.ts +300 -0
  40. package/lib/components/meeting-attendance-row/meeting-attendance-row.component.d.ts +239 -0
  41. package/lib/components/member-level-badge/member-level-badge.component.d.ts +161 -0
  42. package/lib/components/upcoming-meetings-events/upcoming-meetings-events.component.d.ts +238 -0
  43. package/lib/components/welcome-header/dashboard-welcome-header.component.d.ts +98 -0
  44. package/lib/components/your-groups/your-groups.component.d.ts +110 -0
  45. package/lib/dashboard.component.d.ts +376 -0
  46. package/lib/dashboard.module.d.ts +7 -0
  47. package/lib/dashboard.routes.d.ts +2 -0
  48. package/lib/models/attendance-action-permissions.model.d.ts +4 -0
  49. package/lib/models/attendance-state.model.d.ts +4 -0
  50. package/lib/models/dashboard-list-response.model.d.ts +5 -0
  51. package/lib/models/dashboard-route-config.model.d.ts +7 -0
  52. package/lib/models/dashboard-section-state.model.d.ts +6 -0
  53. package/lib/models/dashboard-user-info.model.d.ts +5 -0
  54. package/lib/models/group-row.model.d.ts +8 -0
  55. package/lib/models/meeting-row.model.d.ts +12 -0
  56. package/lib/models/page-change.model.d.ts +4 -0
  57. package/lib/models/upcoming-event.model.d.ts +13 -0
  58. package/lib/services/attendance-reducers.d.ts +43 -0
  59. package/lib/services/dashboard.service.d.ts +119 -0
  60. package/lib/services/user-permissions.service.d.ts +31 -0
  61. package/lib/utils/attendance-action.util.d.ts +38 -0
  62. package/package.json +30 -3
  63. package/public-api.d.ts +24 -0
@@ -0,0 +1,300 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { PageEvent } from '@angular/material/paginator';
3
+ import { AttendanceActionPermissions } from '../../models/attendance-action-permissions.model';
4
+ import { AttendanceState } from '../../models/attendance-state.model';
5
+ import { MeetingRow } from '../../models/meeting-row.model';
6
+ import { PageChange } from '../../models/page-change.model';
7
+ import { UpcomingEvent } from '../../models/upcoming-event.model';
8
+ import * as i0 from "@angular/core";
9
+ /**
10
+ * Event_Group_Card renders a single upcoming event as a card: the status badge,
11
+ * title, day indicator, meeting-count summary sub-line, start/end date, and
12
+ * timezone (all luxon-formatted). It exposes a "View Event" action, a
13
+ * show/hide toggle for the meeting list labeled with the open-for-attendance
14
+ * count, the per-event meeting rows (one {@link MeetingAttendanceRowComponent}
15
+ * per meeting on the current page), and a per-card paginator.
16
+ *
17
+ * The component is purely presentational — it emits navigation, attendance, and
18
+ * pagination intents via `@Output()` and never performs navigation or HTTP
19
+ * itself. Meeting-row outputs (`openMeeting`/`logAttendance`/`leaveMeeting`) are
20
+ * bubbled upward unchanged so the container can delegate to the service.
21
+ * @export
22
+ * @class EventGroupCardComponent
23
+ */
24
+ export declare class EventGroupCardComponent {
25
+ /** User-facing strings sourced from `constants.json`. */
26
+ constants: {
27
+ welcomeHeader: {
28
+ greeting: string;
29
+ fallbackGreeting: string;
30
+ helperText: string;
31
+ jumpToLabel: string;
32
+ shortcuts: {
33
+ meetings: {
34
+ label: string;
35
+ iconUrl: string;
36
+ ariaLabel: string;
37
+ };
38
+ groups: {
39
+ label: string;
40
+ iconUrl: string;
41
+ ariaLabel: string;
42
+ };
43
+ };
44
+ };
45
+ upcomingSection: {
46
+ title: string;
47
+ viewAllLabel: string;
48
+ expandLabel: string;
49
+ collapseLabel: string;
50
+ ariaLabel: {
51
+ viewAll: string;
52
+ toggle: string;
53
+ };
54
+ emptyMessage: string;
55
+ errorMessage: string;
56
+ };
57
+ eventGroupCard: {
58
+ viewEventLabel: string;
59
+ meetingListToggle: {
60
+ showLabelPrefix: string;
61
+ showLabelSuffix: string;
62
+ hideLabel: string;
63
+ };
64
+ ariaLabel: {
65
+ viewEvent: string;
66
+ meetingListToggle: string;
67
+ };
68
+ paginator: {
69
+ rangeTemplate: string;
70
+ totalTemplate: string;
71
+ };
72
+ };
73
+ meetingRow: {
74
+ emptyFieldPlaceholder: string;
75
+ currentlyAttendingIndicator: string;
76
+ logAttendanceLabel: string;
77
+ leaveMeetingLabel: string;
78
+ ariaLabel: {
79
+ meetingNameLink: string;
80
+ logAttendance: string;
81
+ leaveMeeting: string;
82
+ };
83
+ };
84
+ groupsSection: {
85
+ title: string;
86
+ viewAllLabel: string;
87
+ expandLabel: string;
88
+ collapseLabel: string;
89
+ countSuffix: string;
90
+ emptyValue: string;
91
+ ariaLabel: {
92
+ viewAll: string;
93
+ toggle: string;
94
+ groupLink: string;
95
+ };
96
+ columns: {
97
+ group: string;
98
+ type: string;
99
+ officerRole: string;
100
+ affiliation: string;
101
+ memberLevel: string;
102
+ };
103
+ paginator: {
104
+ rangeTemplate: string;
105
+ totalTemplate: string;
106
+ };
107
+ /** Set of meeting ids with an attendance action awaiting resolution. */
108
+ memberLevelBadge: {
109
+ votingMember: string;
110
+ default: string;
111
+ };
112
+ /** Whether the host has determined the viewport is at/below the mobile breakpoint. */
113
+ emptyMessage: string;
114
+ errorMessage: string; /** Emits the event id when the "View Event" button is activated (Req 6.4). */
115
+ };
116
+ memberLevel: {
117
+ colorMap: {
118
+ "Voting Member": string;
119
+ Observer: string;
120
+ /** Bubbles the meeting id when a row's meeting-name link is activated (Req 6.7, 7.4). */
121
+ "Associate Member": string;
122
+ Member: string;
123
+ default: string;
124
+ };
125
+ };
126
+ /** Bubbles the meeting id when a row requests logging attendance (Req 6.7, 7.7). */
127
+ attendance: {
128
+ errorMessage: string;
129
+ };
130
+ footer: {
131
+ links: {
132
+ label: string;
133
+ target: string;
134
+ }[];
135
+ copyright: string;
136
+ };
137
+ defaultRouteConfig: {
138
+ eventDetail: string;
139
+ meetingDetail: string;
140
+ groupDetail: string;
141
+ viewAllEvents: string;
142
+ viewAllGroups: string;
143
+ };
144
+ };
145
+ /** The upcoming event rendered by this card. */
146
+ event: UpcomingEvent;
147
+ /** Host permissions gating the per-row log-attendance / leave-meeting buttons. */
148
+ permissions: AttendanceActionPermissions;
149
+ /** Map of meeting id to current attendance state, passed down to each row. */
150
+ attendanceStates: Record<string, AttendanceState>;
151
+ /** Set of meeting ids with an attendance action awaiting resolution. */
152
+ inFlightMeetingIds: ReadonlySet<string>;
153
+ /** Whether the host has determined the viewport is at/below the mobile breakpoint. */
154
+ isMobileView: boolean;
155
+ /** Emits the event id when the "View Event" button is activated (Req 6.4). */
156
+ viewEvent: EventEmitter<string>;
157
+ /** Bubbles the meeting id when a row's meeting-name link is activated (Req 6.7, 7.4). */
158
+ openMeeting: EventEmitter<string>;
159
+ /** Bubbles the meeting id when a row requests logging attendance (Req 6.7, 7.7). */
160
+ logAttendance: EventEmitter<string>;
161
+ /** Bubbles the meeting id when a row requests leaving the meeting (Req 6.7, 7.8). */
162
+ leaveMeeting: EventEmitter<string>;
163
+ /** Emits the requested page when the per-card paginator changes (Req 6.9, 3.3). */
164
+ pageChange: EventEmitter<PageChange>;
165
+ /** The default page size for the per-card meeting paginator. */
166
+ readonly defaultPageSize = 5;
167
+ /** The current zero-based page index of the meeting list. */
168
+ pageIndex: number;
169
+ /** The current page size of the meeting list. */
170
+ pageSize: number;
171
+ /** Whether the meeting list is currently shown (toggled open). */
172
+ isMeetingListOpen: boolean;
173
+ /**
174
+ * The full list of meetings for the event, defaulting to an empty list when
175
+ * the event has none.
176
+ * @return {MeetingRow[]} The event's meetings.
177
+ * @memberof EventGroupCardComponent
178
+ */
179
+ get meetings(): MeetingRow[];
180
+ /** The total number of meetings for the event (paginator length). */
181
+ get totalMeetings(): number;
182
+ /**
183
+ * The slice of meetings for the current page, used by the row `*ngFor`.
184
+ * @return {MeetingRow[]} The meetings on the current page.
185
+ * @memberof EventGroupCardComponent
186
+ */
187
+ get pagedMeetings(): MeetingRow[];
188
+ /**
189
+ * The one-based index of the first meeting shown on the current page, or 0
190
+ * when there are no meetings.
191
+ * @return {number} The start index for the range template.
192
+ * @memberof EventGroupCardComponent
193
+ */
194
+ get rangeStart(): number;
195
+ /**
196
+ * The one-based index of the last meeting shown on the current page, clamped
197
+ * to the total meeting count.
198
+ * @return {number} The end index for the range template.
199
+ * @memberof EventGroupCardComponent
200
+ */
201
+ get rangeEnd(): number;
202
+ /**
203
+ * The paginator range label (e.g. "Showing 1-5 of 12") built from the
204
+ * `constants.json` range template with the current start/end/total values.
205
+ * @return {string} The formatted range label.
206
+ * @memberof EventGroupCardComponent
207
+ */
208
+ get rangeLabel(): string;
209
+ /**
210
+ * The meeting-count summary sub-line (e.g. "12 meetings") built from the
211
+ * `constants.json` total template with the event's meeting count.
212
+ * @return {string} The formatted meeting-count summary.
213
+ * @memberof EventGroupCardComponent
214
+ */
215
+ get meetingCountSummary(): string;
216
+ /**
217
+ * The meeting-list show/hide toggle label. When the list is hidden the label
218
+ * reads "Show Meetings ({count} open for attendance)" built from the
219
+ * `constants.json` templates and the event's open-for-attendance count; when
220
+ * the list is shown the label reads the configured hide label (Req 6.5).
221
+ * @return {string} The toggle button label.
222
+ * @memberof EventGroupCardComponent
223
+ */
224
+ get meetingListToggleLabel(): string;
225
+ /** The luxon-formatted start date of the event (Req 6.2). */
226
+ get formattedStartDate(): string;
227
+ /** The luxon-formatted end date of the event (Req 6.2). */
228
+ get formattedEndDate(): string;
229
+ /**
230
+ * `trackBy` for the meeting-row `*ngFor`, keyed by the stable meeting id so
231
+ * Angular reuses row components across pagination/state changes (Req 6.7, 14.4).
232
+ * @param {number} _index - The iteration index (unused).
233
+ * @param {MeetingRow} meeting - The meeting for this row.
234
+ * @return {string} The stable track key (meeting id).
235
+ * @memberof EventGroupCardComponent
236
+ */
237
+ trackByMeetingId(_index: number, meeting: MeetingRow): string;
238
+ /**
239
+ * Resolves the attendance state for a meeting from the `attendanceStates` map,
240
+ * defaulting to `NOT_ATTENDING` when the map has no entry for it.
241
+ * @param {MeetingRow} meeting - The meeting to resolve state for.
242
+ * @return {AttendanceState} The attendance state passed to the row.
243
+ * @memberof EventGroupCardComponent
244
+ */
245
+ resolveAttendanceState(meeting: MeetingRow): AttendanceState;
246
+ /**
247
+ * Resolves whether a meeting has an attendance action in flight from the
248
+ * `inFlightMeetingIds` set.
249
+ * @param {MeetingRow} meeting - The meeting to check.
250
+ * @return {boolean} True when the meeting's action is awaiting resolution.
251
+ * @memberof EventGroupCardComponent
252
+ */
253
+ resolveIsInFlight(meeting: MeetingRow): boolean;
254
+ /**
255
+ * Toggles the meeting-list visibility (Req 6.6).
256
+ * @memberof EventGroupCardComponent
257
+ */
258
+ onToggleMeetingList(): void;
259
+ /**
260
+ * Handles the "View Event" button, emitting the event id to the host (Req 6.4).
261
+ * @memberof EventGroupCardComponent
262
+ */
263
+ onViewEvent(): void;
264
+ /**
265
+ * Bubbles a row's meeting-name link activation upward (Req 6.7, 7.4).
266
+ * @param {string} meetingId - The id emitted by the row.
267
+ * @memberof EventGroupCardComponent
268
+ */
269
+ onOpenMeeting(meetingId: string): void;
270
+ /**
271
+ * Bubbles a row's log-attendance request upward (Req 6.7, 7.7).
272
+ * @param {string} meetingId - The id emitted by the row.
273
+ * @memberof EventGroupCardComponent
274
+ */
275
+ onLogAttendance(meetingId: string): void;
276
+ /**
277
+ * Bubbles a row's leave-meeting request upward (Req 6.7, 7.8).
278
+ * @param {string} meetingId - The id emitted by the row.
279
+ * @memberof EventGroupCardComponent
280
+ */
281
+ onLeaveMeeting(meetingId: string): void;
282
+ /**
283
+ * Handles the per-card paginator change, updating the local page state and
284
+ * emitting the requested page as a {@link PageChange} (Req 6.9, 3.3).
285
+ * @param {PageEvent} event - The Material paginator page event.
286
+ * @memberof EventGroupCardComponent
287
+ */
288
+ onPageChange(event: PageEvent): void;
289
+ /**
290
+ * Parses an ISO string with luxon and formats it with the supplied token,
291
+ * returning the raw value unchanged when it is missing or unparseable.
292
+ * @param {string | undefined} isoValue - The ISO date/time string.
293
+ * @param {string} format - The luxon format token.
294
+ * @return {string} The formatted value or the raw/empty fallback.
295
+ * @memberof EventGroupCardComponent
296
+ */
297
+ private formatIso;
298
+ static ɵfac: i0.ɵɵFactoryDeclaration<EventGroupCardComponent, never>;
299
+ static ɵcmp: i0.ɵɵComponentDeclaration<EventGroupCardComponent, "ieeesa-event-group-card", never, { "event": { "alias": "event"; "required": false; }; "permissions": { "alias": "permissions"; "required": false; }; "attendanceStates": { "alias": "attendanceStates"; "required": false; }; "inFlightMeetingIds": { "alias": "inFlightMeetingIds"; "required": false; }; "isMobileView": { "alias": "isMobileView"; "required": false; }; }, { "viewEvent": "viewEvent"; "openMeeting": "openMeeting"; "logAttendance": "logAttendance"; "leaveMeeting": "leaveMeeting"; "pageChange": "pageChange"; }, never, never, true, never>;
300
+ }
@@ -0,0 +1,239 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { AttendanceActionPermissions } from '../../models/attendance-action-permissions.model';
3
+ import { AttendanceState } from '../../models/attendance-state.model';
4
+ import { MeetingRow } from '../../models/meeting-row.model';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Meeting_Attendance_Row renders a single meeting within an event-group card:
8
+ * the meeting-name link, group/committee, room/location, date, and
9
+ * time+timezone (all luxon-formatted), together with the attendance action
10
+ * button that drives the per-meeting attendance state machine.
11
+ *
12
+ * The component is purely presentational — it emits navigation and attendance
13
+ * intents via `@Output()` and never performs navigation or HTTP itself. The
14
+ * action button delegates to the pure `resolveAttendanceAction` handler so the
15
+ * emit/guard logic is shared with the property-tested core (Property 1), and the
16
+ * displayed state only advances when the host updates `attendanceState`.
17
+ * @export
18
+ * @class MeetingAttendanceRowComponent
19
+ */
20
+ export declare class MeetingAttendanceRowComponent {
21
+ constants: {
22
+ welcomeHeader: {
23
+ greeting: string;
24
+ fallbackGreeting: string;
25
+ helperText: string;
26
+ jumpToLabel: string;
27
+ shortcuts: {
28
+ meetings: {
29
+ label: string;
30
+ iconUrl: string;
31
+ ariaLabel: string;
32
+ };
33
+ groups: {
34
+ label: string;
35
+ iconUrl: string;
36
+ ariaLabel: string;
37
+ };
38
+ };
39
+ };
40
+ upcomingSection: {
41
+ title: string;
42
+ viewAllLabel: string;
43
+ expandLabel: string;
44
+ collapseLabel: string;
45
+ ariaLabel: {
46
+ viewAll: string;
47
+ toggle: string;
48
+ };
49
+ emptyMessage: string;
50
+ errorMessage: string;
51
+ };
52
+ eventGroupCard: {
53
+ viewEventLabel: string;
54
+ meetingListToggle: {
55
+ showLabelPrefix: string;
56
+ showLabelSuffix: string;
57
+ hideLabel: string;
58
+ };
59
+ ariaLabel: {
60
+ viewEvent: string;
61
+ meetingListToggle: string;
62
+ };
63
+ paginator: {
64
+ rangeTemplate: string;
65
+ totalTemplate: string;
66
+ };
67
+ };
68
+ meetingRow: {
69
+ emptyFieldPlaceholder: string;
70
+ currentlyAttendingIndicator: string;
71
+ logAttendanceLabel: string;
72
+ leaveMeetingLabel: string;
73
+ ariaLabel: {
74
+ meetingNameLink: string;
75
+ logAttendance: string;
76
+ leaveMeeting: string;
77
+ };
78
+ };
79
+ groupsSection: {
80
+ title: string;
81
+ viewAllLabel: string; /** Whether an attendance action for this meeting is awaiting resolution. */
82
+ expandLabel: string;
83
+ collapseLabel: string;
84
+ countSuffix: string;
85
+ emptyValue: string;
86
+ ariaLabel: {
87
+ viewAll: string;
88
+ toggle: string;
89
+ groupLink: string;
90
+ };
91
+ columns: {
92
+ group: string;
93
+ type: string;
94
+ officerRole: string;
95
+ affiliation: string;
96
+ memberLevel: string;
97
+ };
98
+ paginator: {
99
+ rangeTemplate: string;
100
+ totalTemplate: string; /** Emits the meeting id to request leaving the meeting (Req 7.8). */
101
+ };
102
+ memberLevelBadge: {
103
+ votingMember: string;
104
+ default: string;
105
+ };
106
+ emptyMessage: string;
107
+ errorMessage: string;
108
+ };
109
+ memberLevel: {
110
+ colorMap: {
111
+ "Voting Member": string;
112
+ Observer: string;
113
+ "Associate Member": string;
114
+ Member: string;
115
+ default: string;
116
+ };
117
+ };
118
+ attendance: {
119
+ errorMessage: string;
120
+ };
121
+ footer: {
122
+ links: {
123
+ label: string;
124
+ target: string;
125
+ }[];
126
+ copyright: string;
127
+ };
128
+ defaultRouteConfig: {
129
+ eventDetail: string;
130
+ meetingDetail: string;
131
+ groupDetail: string;
132
+ viewAllEvents: string; /**
133
+ * Resolves a group-or-committee / room-or-location field value, substituting
134
+ * the empty-field placeholder from `constants.json` when the value is empty or
135
+ * undefined (Req 7.2).
136
+ * @param {string | undefined} value - The raw field value from the meeting.
137
+ * @return {string} The value to display, or the empty-field placeholder.
138
+ * @memberof MeetingAttendanceRowComponent
139
+ */
140
+ viewAllGroups: string;
141
+ };
142
+ };
143
+ /** The meeting rendered by this row. */
144
+ meeting: MeetingRow;
145
+ /** The current attendance state controlling label/indicator and action. */
146
+ attendanceState: AttendanceState;
147
+ /** Whether an attendance action for this meeting is awaiting resolution. */
148
+ isInFlight: boolean;
149
+ /** Host permissions gating the log-attendance / leave-meeting buttons. */
150
+ permissions: AttendanceActionPermissions;
151
+ /** Emits the meeting id when the meeting-name link is activated (Req 7.4). */
152
+ openMeeting: EventEmitter<string>;
153
+ /** Emits the meeting id to request logging attendance (Req 7.7). */
154
+ logAttendance: EventEmitter<string>;
155
+ /** Emits the meeting id to request leaving the meeting (Req 7.8). */
156
+ leaveMeeting: EventEmitter<string>;
157
+ /** Expose the enum to the template for state comparisons. */
158
+ readonly AttendanceState: typeof AttendanceState;
159
+ /**
160
+ * Whether this row is actionable — a non-empty `meetingId` is required for the
161
+ * meeting-name link and action button to emit anything (Req 7.10).
162
+ * @return {boolean} True when the row has a usable meeting id.
163
+ * @memberof MeetingAttendanceRowComponent
164
+ */
165
+ get isActionable(): boolean;
166
+ /**
167
+ * Whether the row is in the currently-attending state, which shows the
168
+ * currently-attending indicator and the leave-meeting action (Req 7.5).
169
+ * @return {boolean} True when the attendance state is `CURRENTLY_ATTENDING`.
170
+ * @memberof MeetingAttendanceRowComponent
171
+ */
172
+ get isCurrentlyAttending(): boolean;
173
+ /**
174
+ * Whether the log-attendance button should be shown: only when the row is in
175
+ * the log state (not currently attending) and the host grants
176
+ * `canLogAttendance` (Req 7.6, 12.1).
177
+ * @return {boolean} True when the log-attendance button is visible.
178
+ * @memberof MeetingAttendanceRowComponent
179
+ */
180
+ get showLogAttendanceButton(): boolean;
181
+ /**
182
+ * Whether the leave-meeting button should be shown: only when the row is in
183
+ * the currently-attending state and the host grants `canLeaveMeeting`
184
+ * (Req 7.5, 12.2).
185
+ * @return {boolean} True when the leave-meeting button is visible.
186
+ * @memberof MeetingAttendanceRowComponent
187
+ */
188
+ get showLeaveMeetingButton(): boolean;
189
+ /**
190
+ * Resolves a group-or-committee / room-or-location field value, substituting
191
+ * the empty-field placeholder from `constants.json` when the value is empty or
192
+ * undefined (Req 7.2).
193
+ * @param {string | undefined} value - The raw field value from the meeting.
194
+ * @return {string} The value to display, or the empty-field placeholder.
195
+ * @memberof MeetingAttendanceRowComponent
196
+ */
197
+ resolveFieldValue(value: string | undefined): string;
198
+ /**
199
+ * Formats the meeting date for display using the shared luxon display format
200
+ * (Req 7.3). Falls back to the raw value when it cannot be parsed.
201
+ * @return {string} The formatted meeting date.
202
+ * @memberof MeetingAttendanceRowComponent
203
+ */
204
+ get formattedDate(): string;
205
+ /**
206
+ * Formats the meeting time + timezone for display using luxon (Req 7.3).
207
+ * The timezone abbreviation from the meeting model is appended to the parsed
208
+ * time. Falls back to the raw value when it cannot be parsed.
209
+ * @return {string} The formatted meeting time with timezone.
210
+ * @memberof MeetingAttendanceRowComponent
211
+ */
212
+ get formattedTime(): string;
213
+ /**
214
+ * Handles activation of the attendance action button. Delegates to the pure
215
+ * `resolveAttendanceAction` handler and emits exactly one event based on the
216
+ * resolved action: `logAttendance` for `LOG_ATTENDANCE`, `leaveMeeting` for
217
+ * `LEAVE_MEETING`, and nothing for `NONE` (empty id or in-flight)
218
+ * (Req 7.7, 7.8, 7.9, 7.10, 13.6).
219
+ * @memberof MeetingAttendanceRowComponent
220
+ */
221
+ onAttendanceAction(): void;
222
+ /**
223
+ * Handles activation of the meeting-name link. Emits the meeting id only when
224
+ * the row is actionable (non-empty meeting id) (Req 7.4, 7.10).
225
+ * @memberof MeetingAttendanceRowComponent
226
+ */
227
+ onOpenMeeting(): void;
228
+ /**
229
+ * Parses an ISO string with luxon and formats it with the supplied token,
230
+ * returning the raw value unchanged when it is missing or unparseable.
231
+ * @param {string | undefined} isoValue - The ISO date/time string.
232
+ * @param {string} format - The luxon format token.
233
+ * @return {string} The formatted value or the raw/empty fallback.
234
+ * @memberof MeetingAttendanceRowComponent
235
+ */
236
+ private formatIso;
237
+ static ɵfac: i0.ɵɵFactoryDeclaration<MeetingAttendanceRowComponent, never>;
238
+ static ɵcmp: i0.ɵɵComponentDeclaration<MeetingAttendanceRowComponent, "ieeesa-meeting-attendance-row", never, { "meeting": { "alias": "meeting"; "required": false; }; "attendanceState": { "alias": "attendanceState"; "required": false; }; "isInFlight": { "alias": "isInFlight"; "required": false; }; "permissions": { "alias": "permissions"; "required": false; }; }, { "openMeeting": "openMeeting"; "logAttendance": "logAttendance"; "leaveMeeting": "leaveMeeting"; }, never, never, true, never>;
239
+ }