@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.
- package/README.md +75 -3
- package/esm2022/ieeesa-npm-dashboard.mjs +5 -0
- package/esm2022/lib/assets/constants.json +158 -0
- package/esm2022/lib/assets/dashboard-mock.mjs +221 -0
- package/esm2022/lib/assets/dashboard-route-paths.mock.mjs +14 -0
- package/esm2022/lib/assets/dashboard-user-permissions.mock.mjs +23 -0
- package/esm2022/lib/assets/date-formats.mjs +28 -0
- package/esm2022/lib/components/event-group-card/event-group-card.component.mjs +414 -0
- package/esm2022/lib/components/meeting-attendance-row/meeting-attendance-row.component.mjs +182 -0
- package/esm2022/lib/components/member-level-badge/member-level-badge.component.mjs +79 -0
- package/esm2022/lib/components/upcoming-meetings-events/upcoming-meetings-events.component.mjs +261 -0
- package/esm2022/lib/components/welcome-header/dashboard-welcome-header.component.mjs +151 -0
- package/esm2022/lib/components/your-groups/your-groups.component.mjs +243 -0
- package/esm2022/lib/dashboard.component.mjs +417 -0
- package/esm2022/lib/dashboard.module.mjs +16 -0
- package/esm2022/lib/dashboard.routes.mjs +7 -0
- package/esm2022/lib/models/attendance-action-permissions.model.mjs +2 -0
- package/esm2022/lib/models/attendance-state.model.mjs +7 -0
- package/esm2022/lib/models/dashboard-list-response.model.mjs +2 -0
- package/esm2022/lib/models/dashboard-route-config.model.mjs +2 -0
- package/esm2022/lib/models/dashboard-section-state.model.mjs +9 -0
- package/esm2022/lib/models/dashboard-user-info.model.mjs +2 -0
- package/esm2022/lib/models/event-meeting-list-item.model.mjs +2 -0
- package/esm2022/lib/models/event-meeting-list-payload.model.mjs +8 -0
- package/esm2022/lib/models/group-row.model.mjs +2 -0
- package/esm2022/lib/models/meeting-row.model.mjs +2 -0
- package/esm2022/lib/models/my-groups-view.model.mjs +2 -0
- package/esm2022/lib/models/page-change.model.mjs +2 -0
- package/esm2022/lib/models/upcoming-event.model.mjs +13 -0
- package/esm2022/lib/services/attendance-reducers.mjs +54 -0
- package/esm2022/lib/services/dashboard.service.mjs +402 -0
- package/esm2022/lib/services/user-permissions.service.mjs +50 -0
- package/esm2022/lib/utils/attendance-action.util.mjs +53 -0
- package/esm2022/lib/utils/date-format.util.mjs +110 -0
- package/esm2022/lib/utils/event-meeting-mapper.util.mjs +96 -0
- package/esm2022/public-api.mjs +36 -0
- package/fesm2022/ieeesa-npm-dashboard.mjs +2981 -0
- package/fesm2022/ieeesa-npm-dashboard.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/assets/dashboard-mock.d.ts +31 -0
- package/lib/assets/dashboard-route-paths.mock.d.ts +2 -0
- package/lib/assets/dashboard-user-permissions.mock.d.ts +2 -0
- package/lib/assets/date-formats.d.ts +27 -0
- package/lib/components/event-group-card/event-group-card.component.d.ts +268 -0
- package/lib/components/meeting-attendance-row/meeting-attendance-row.component.d.ts +115 -0
- package/lib/components/member-level-badge/member-level-badge.component.d.ts +177 -0
- package/lib/components/upcoming-meetings-events/upcoming-meetings-events.component.d.ts +175 -0
- package/lib/components/welcome-header/dashboard-welcome-header.component.d.ts +98 -0
- package/lib/components/your-groups/your-groups.component.d.ts +159 -0
- package/lib/dashboard.component.d.ts +414 -0
- package/lib/dashboard.module.d.ts +7 -0
- package/lib/dashboard.routes.d.ts +2 -0
- package/lib/models/attendance-action-permissions.model.d.ts +4 -0
- package/lib/models/attendance-state.model.d.ts +4 -0
- package/lib/models/dashboard-list-response.model.d.ts +5 -0
- package/lib/models/dashboard-route-config.model.d.ts +7 -0
- package/lib/models/dashboard-section-state.model.d.ts +6 -0
- package/lib/models/dashboard-user-info.model.d.ts +5 -0
- package/lib/models/event-meeting-list-item.model.d.ts +107 -0
- package/lib/models/event-meeting-list-payload.model.d.ts +40 -0
- package/lib/models/group-row.model.d.ts +33 -0
- package/lib/models/meeting-row.model.d.ts +28 -0
- package/lib/models/my-groups-view.model.d.ts +56 -0
- package/lib/models/page-change.model.d.ts +4 -0
- package/lib/models/upcoming-event.model.d.ts +51 -0
- package/lib/services/attendance-reducers.d.ts +43 -0
- package/lib/services/dashboard.service.d.ts +202 -0
- package/lib/services/user-permissions.service.d.ts +31 -0
- package/lib/utils/attendance-action.util.d.ts +38 -0
- package/lib/utils/date-format.util.d.ts +60 -0
- package/lib/utils/event-meeting-mapper.util.d.ts +50 -0
- package/package.json +30 -3
- package/public-api.d.ts +26 -0
|
@@ -0,0 +1,175 @@
|
|
|
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 { DashboardSectionState } from '../../models/dashboard-section-state.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
|
+
* Upcoming_Meetings_Events renders the "Upcoming Meetings & Events" dashboard
|
|
11
|
+
* section: a section title and "View All" link, a collapse/expand toggle that
|
|
12
|
+
* starts expanded, and one {@link EventGroupCardComponent} per upcoming event.
|
|
13
|
+
*
|
|
14
|
+
* The section is driven by its `sectionState` input: it shows the Loader while
|
|
15
|
+
* `LOADING`, the event-group cards while `LOADED`, the empty-state message while
|
|
16
|
+
* `EMPTY`, and the error message while `ERROR` — the four regions are mutually
|
|
17
|
+
* exclusive (Req 13.1, 13.2, 13.3, 13.5). The component is purely
|
|
18
|
+
* presentational: "View All" emits `viewAll` (Req 5.1, 5.2), the collapse toggle
|
|
19
|
+
* flips `isExpanded` and the card-list visibility while exposing
|
|
20
|
+
* `[attr.aria-expanded]` (Req 5.3, 5.4, 14.3), and each card is rendered via
|
|
21
|
+
* `*ngFor` with {@link trackByEventId} to preserve input order (Req 5.5, 5.6,
|
|
22
|
+
* 14.4). Card outputs (`viewEvent`/`openMeeting`/`logAttendance`/`leaveMeeting`)
|
|
23
|
+
* are bubbled upward unchanged, and each card's `pageChange` is mapped to
|
|
24
|
+
* `meetingPageChange` tagged with the originating event id (Req 6.9).
|
|
25
|
+
* @export
|
|
26
|
+
* @class UpcomingMeetingsEventsComponent
|
|
27
|
+
*/
|
|
28
|
+
export declare class UpcomingMeetingsEventsComponent {
|
|
29
|
+
/** User-facing strings sourced from `constants.json`. */
|
|
30
|
+
constants: any;
|
|
31
|
+
/** Enum reference for template comparisons against `sectionState`. */
|
|
32
|
+
readonly sectionStates: typeof DashboardSectionState;
|
|
33
|
+
/** The upcoming events rendered as event-group cards (Req 5.5, 5.6). */
|
|
34
|
+
events: UpcomingEvent[];
|
|
35
|
+
/** The load/empty/error status driving the section's mutually exclusive regions. */
|
|
36
|
+
sectionState: DashboardSectionState;
|
|
37
|
+
/** Host permissions gating the per-row log-attendance / leave-meeting buttons. */
|
|
38
|
+
permissions: AttendanceActionPermissions;
|
|
39
|
+
/** Map of meeting id to current attendance state, passed down to each card. */
|
|
40
|
+
attendanceStates: Record<string, AttendanceState>;
|
|
41
|
+
/** Set of meeting ids with an attendance action awaiting resolution. */
|
|
42
|
+
inFlightMeetingIds: ReadonlySet<string>;
|
|
43
|
+
/** Whether the host has determined the viewport is at/below the mobile breakpoint. */
|
|
44
|
+
isMobileView: boolean;
|
|
45
|
+
/** Emits when the "View All" link is activated (Req 5.2). */
|
|
46
|
+
viewAll: EventEmitter<void>;
|
|
47
|
+
/** Bubbles the event id when a card's "View Event" button is activated (Req 6.4). */
|
|
48
|
+
viewEvent: EventEmitter<string>;
|
|
49
|
+
/** Bubbles the meeting id when a card's meeting-name link is activated (Req 7.4). */
|
|
50
|
+
openMeeting: EventEmitter<string>;
|
|
51
|
+
/** Bubbles the meeting id when a card requests logging attendance (Req 7.7). */
|
|
52
|
+
logAttendance: EventEmitter<string>;
|
|
53
|
+
/** Bubbles the meeting id when a card requests leaving the meeting (Req 7.8). */
|
|
54
|
+
leaveMeeting: EventEmitter<string>;
|
|
55
|
+
/** Emits the requested page tagged with its event id when a card paginates (Req 6.9). */
|
|
56
|
+
meetingPageChange: EventEmitter<{
|
|
57
|
+
eventId: string;
|
|
58
|
+
} & PageChange>;
|
|
59
|
+
/** Emits the event id + one-based page to lazily load an event's child meetings. */
|
|
60
|
+
loadEventMeetings: EventEmitter<{
|
|
61
|
+
eventId: string;
|
|
62
|
+
page: number;
|
|
63
|
+
}>;
|
|
64
|
+
/** Whether the section's card list is currently expanded; starts collapsed. */
|
|
65
|
+
isExpanded: boolean;
|
|
66
|
+
/** Section-level page size — 5 events/meetings per page per the design. */
|
|
67
|
+
readonly sectionPageSize = 5;
|
|
68
|
+
/** The current zero-based page index of the section list. */
|
|
69
|
+
sectionPageIndex: number;
|
|
70
|
+
/** The total number of events/meetings in the section (paginator length). */
|
|
71
|
+
get totalItems(): number;
|
|
72
|
+
/**
|
|
73
|
+
* The slice of events/meetings for the current section page (5 per page),
|
|
74
|
+
* used by the card `*ngFor`.
|
|
75
|
+
* @return {UpcomingEvent[]} The events on the current page.
|
|
76
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
77
|
+
*/
|
|
78
|
+
get pagedEvents(): UpcomingEvent[];
|
|
79
|
+
/** The one-based index of the first item shown on the current page. */
|
|
80
|
+
get sectionRangeStart(): number;
|
|
81
|
+
/** The one-based index of the last item shown on the current page. */
|
|
82
|
+
get sectionRangeEnd(): number;
|
|
83
|
+
/**
|
|
84
|
+
* The section paginator range label (e.g. "1-5 of 20 Meetings & Events")
|
|
85
|
+
* built from the `constants.json` template.
|
|
86
|
+
* @return {string} The formatted range label.
|
|
87
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
88
|
+
*/
|
|
89
|
+
get sectionRangeLabel(): string;
|
|
90
|
+
/**
|
|
91
|
+
* Handles the section paginator change, updating the current section page.
|
|
92
|
+
* @param {PageEvent} event - The Material paginator page event.
|
|
93
|
+
* @return {void}
|
|
94
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
95
|
+
*/
|
|
96
|
+
onSectionPageChange(event: PageEvent): void;
|
|
97
|
+
/**
|
|
98
|
+
* Allows the host/container to open or close the section (e.g. a "Jump to"
|
|
99
|
+
* shortcut opens it). Writing the input mirrors the value onto the internal
|
|
100
|
+
* expand state while leaving the user's own toggle free to change it after.
|
|
101
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
102
|
+
*/
|
|
103
|
+
set expanded(value: boolean);
|
|
104
|
+
get expanded(): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Emits the new expanded state whenever the user toggles the section, so a
|
|
107
|
+
* two-way `[(expanded)]` binding keeps the host's flag in sync (otherwise a
|
|
108
|
+
* host-opened section the user then collapses leaves the host flag stale,
|
|
109
|
+
* making a repeat "Jump to" a no-op).
|
|
110
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
111
|
+
*/
|
|
112
|
+
expandedChange: EventEmitter<boolean>;
|
|
113
|
+
/**
|
|
114
|
+
* `trackBy` for the event-group-card `*ngFor`, keyed by the stable event id so
|
|
115
|
+
* Angular renders exactly one card per event in input order (Req 5.5, 5.6, 14.4).
|
|
116
|
+
* @param {number} index - The iteration index (fallback key).
|
|
117
|
+
* @param {UpcomingEvent} event - The event for this card.
|
|
118
|
+
* @return {string} The stable track key (event id).
|
|
119
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
120
|
+
*/
|
|
121
|
+
trackByEventId(index: number, event: UpcomingEvent): string;
|
|
122
|
+
/**
|
|
123
|
+
* Toggles the section's expanded/collapsed state, inverting the card-list
|
|
124
|
+
* visibility and the exposed `aria-expanded` value (Req 5.4, 14.3).
|
|
125
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
126
|
+
*/
|
|
127
|
+
onToggleExpanded(): void;
|
|
128
|
+
/**
|
|
129
|
+
* Handles the "View All" link, emitting the `viewAll` intent to the host (Req 5.2).
|
|
130
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
131
|
+
*/
|
|
132
|
+
onViewAll(): void;
|
|
133
|
+
/**
|
|
134
|
+
* Bubbles a card's "View Event" activation upward (Req 6.4).
|
|
135
|
+
* @param {string} eventId - The event id emitted by the card.
|
|
136
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
137
|
+
*/
|
|
138
|
+
onViewEvent(eventId: string): void;
|
|
139
|
+
/**
|
|
140
|
+
* Bubbles a card's meeting-name link activation upward (Req 7.4).
|
|
141
|
+
* @param {string} meetingId - The meeting id emitted by the card.
|
|
142
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
143
|
+
*/
|
|
144
|
+
onOpenMeeting(meetingId: string): void;
|
|
145
|
+
/**
|
|
146
|
+
* Bubbles a card's log-attendance request upward (Req 7.7).
|
|
147
|
+
* @param {string} meetingId - The meeting id emitted by the card.
|
|
148
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
149
|
+
*/
|
|
150
|
+
onLogAttendance(meetingId: string): void;
|
|
151
|
+
/**
|
|
152
|
+
* Bubbles a card's leave-meeting request upward (Req 7.8).
|
|
153
|
+
* @param {string} meetingId - The meeting id emitted by the card.
|
|
154
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
155
|
+
*/
|
|
156
|
+
onLeaveMeeting(meetingId: string): void;
|
|
157
|
+
/**
|
|
158
|
+
* Maps a card's `pageChange` into a `meetingPageChange` tagged with the
|
|
159
|
+
* originating event id so the host can page the correct event (Req 6.9).
|
|
160
|
+
* @param {string} eventId - The id of the event whose card paginated.
|
|
161
|
+
* @param {PageChange} page - The requested page from the card paginator.
|
|
162
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
163
|
+
*/
|
|
164
|
+
onMeetingPageChange(eventId: string, page: PageChange): void;
|
|
165
|
+
/**
|
|
166
|
+
* Bubbles a card's lazy child-meeting load request upward, tagged with the
|
|
167
|
+
* originating event id so the container can fetch that event's meetings.
|
|
168
|
+
* @param {string} eventId - The event whose meetings to load.
|
|
169
|
+
* @param {number} page - The one-based page requested by the card.
|
|
170
|
+
* @memberof UpcomingMeetingsEventsComponent
|
|
171
|
+
*/
|
|
172
|
+
onLoadEventMeetings(eventId: string, page: number): void;
|
|
173
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<UpcomingMeetingsEventsComponent, never>;
|
|
174
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<UpcomingMeetingsEventsComponent, "ieeesa-upcoming-meetings-events", never, { "events": { "alias": "events"; "required": false; }; "sectionState": { "alias": "sectionState"; "required": false; }; "permissions": { "alias": "permissions"; "required": false; }; "attendanceStates": { "alias": "attendanceStates"; "required": false; }; "inFlightMeetingIds": { "alias": "inFlightMeetingIds"; "required": false; }; "isMobileView": { "alias": "isMobileView"; "required": false; }; "expanded": { "alias": "expanded"; "required": false; }; }, { "viewAll": "viewAll"; "viewEvent": "viewEvent"; "openMeeting": "openMeeting"; "logAttendance": "logAttendance"; "leaveMeeting": "leaveMeeting"; "meetingPageChange": "meetingPageChange"; "loadEventMeetings": "loadEventMeetings"; "expandedChange": "expandedChange"; }, never, never, true, never>;
|
|
175
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Identifies which dashboard section a "Jump to" shortcut targets, emitted via
|
|
5
|
+
* {@link DashboardWelcomeHeaderComponent.shortcutSelected} for the host/container
|
|
6
|
+
* to scroll to or navigate.
|
|
7
|
+
*/
|
|
8
|
+
export declare enum DashboardJumpTarget {
|
|
9
|
+
MEETINGS = "MEETINGS",
|
|
10
|
+
GROUPS = "GROUPS"
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A single "Jump to" shortcut rendered in the welcome header: a circular icon
|
|
14
|
+
* that expands on hover/focus into a pill showing the section label and its
|
|
15
|
+
* count badge.
|
|
16
|
+
*/
|
|
17
|
+
interface JumpShortcut {
|
|
18
|
+
target: DashboardJumpTarget;
|
|
19
|
+
label: string;
|
|
20
|
+
iconUrl: string;
|
|
21
|
+
ariaLabel: string;
|
|
22
|
+
count: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Welcome_Header renders the personalized greeting and the "Jump to" shortcut
|
|
26
|
+
* control at the top of the dashboard.
|
|
27
|
+
*
|
|
28
|
+
* The greeting is composed from the greeting label in `constants.json` and the
|
|
29
|
+
* supplied `userName`, falling back to the configured fallback greeting when the
|
|
30
|
+
* name is empty or undefined. The "Jump to" control shows one circular icon per
|
|
31
|
+
* dashboard section (Upcoming Meetings & Events, Your Groups); hovering or
|
|
32
|
+
* focusing an icon expands it into a pill with the section label and a count
|
|
33
|
+
* badge (the counts are supplied by the host via `meetingsCount` /
|
|
34
|
+
* `groupsCount`). Activating a shortcut emits {@link shortcutSelected} with the
|
|
35
|
+
* target section for the host to act on. Purely presentational — no API work.
|
|
36
|
+
* @export
|
|
37
|
+
* @class DashboardWelcomeHeaderComponent
|
|
38
|
+
*/
|
|
39
|
+
export declare class DashboardWelcomeHeaderComponent {
|
|
40
|
+
private readonly constants;
|
|
41
|
+
/** User-facing strings sourced from `constants.json`. */
|
|
42
|
+
readonly texts: any;
|
|
43
|
+
/** Enum reference for template comparisons. */
|
|
44
|
+
readonly jumpTarget: typeof DashboardJumpTarget;
|
|
45
|
+
private userNameValue;
|
|
46
|
+
/**
|
|
47
|
+
* The signed-in user's display name. Drives the personalized greeting; when
|
|
48
|
+
* empty or undefined the greeting falls back to the configured fallback text.
|
|
49
|
+
* @memberof DashboardWelcomeHeaderComponent
|
|
50
|
+
*/
|
|
51
|
+
set userName(value: string);
|
|
52
|
+
get userName(): string;
|
|
53
|
+
private meetingsCountValue;
|
|
54
|
+
/** Count shown in the Upcoming Meetings & Events shortcut badge. */
|
|
55
|
+
set meetingsCount(value: number);
|
|
56
|
+
get meetingsCount(): number;
|
|
57
|
+
private groupsCountValue;
|
|
58
|
+
/** Count shown in the Your Groups shortcut badge. */
|
|
59
|
+
set groupsCount(value: number);
|
|
60
|
+
get groupsCount(): number;
|
|
61
|
+
/** Emits the selected "Jump to" target for the host to act on. */
|
|
62
|
+
shortcutSelected: EventEmitter<DashboardJumpTarget>;
|
|
63
|
+
/** The jump shortcuts rendered in the control, rebuilt when counts change. */
|
|
64
|
+
shortcuts: JumpShortcut[];
|
|
65
|
+
/**
|
|
66
|
+
* The personalized greeting: the greeting label plus the user's name when
|
|
67
|
+
* present, otherwise the configured fallback greeting.
|
|
68
|
+
* @readonly
|
|
69
|
+
* @memberof DashboardWelcomeHeaderComponent
|
|
70
|
+
*/
|
|
71
|
+
get greeting(): string;
|
|
72
|
+
/**
|
|
73
|
+
* Emits the chosen shortcut's target for the host to scroll/navigate to.
|
|
74
|
+
* @param {DashboardJumpTarget} target - The selected section.
|
|
75
|
+
* @memberof DashboardWelcomeHeaderComponent
|
|
76
|
+
*/
|
|
77
|
+
onShortcutClick(target: DashboardJumpTarget): void;
|
|
78
|
+
/**
|
|
79
|
+
* TrackBy for the shortcut list.
|
|
80
|
+
* @param {number} _index
|
|
81
|
+
* @param {JumpShortcut} shortcut
|
|
82
|
+
* @return {string}
|
|
83
|
+
* @memberof DashboardWelcomeHeaderComponent
|
|
84
|
+
*/
|
|
85
|
+
trackByTarget(_index: number, shortcut: JumpShortcut): string;
|
|
86
|
+
/** Rebuilds the shortcut list so the template reflects the latest counts. */
|
|
87
|
+
private buildShortcuts;
|
|
88
|
+
/**
|
|
89
|
+
* Builds the shortcut view models from `constants.json` and the current
|
|
90
|
+
* counts.
|
|
91
|
+
* @return {JumpShortcut[]}
|
|
92
|
+
* @memberof DashboardWelcomeHeaderComponent
|
|
93
|
+
*/
|
|
94
|
+
private buildShortcutList;
|
|
95
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DashboardWelcomeHeaderComponent, never>;
|
|
96
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DashboardWelcomeHeaderComponent, "ieeesa-dashboard-welcome-header", never, { "userName": { "alias": "userName"; "required": false; }; "meetingsCount": { "alias": "meetingsCount"; "required": false; }; "groupsCount": { "alias": "groupsCount"; "required": false; }; }, { "shortcutSelected": "shortcutSelected"; }, never, never, true, never>;
|
|
97
|
+
}
|
|
98
|
+
export {};
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import { PageEvent } from '@angular/material/paginator';
|
|
3
|
+
import { DashboardSectionState } from '../../models/dashboard-section-state.model';
|
|
4
|
+
import { GroupHierarchyNode, GroupRow } from '../../models/group-row.model';
|
|
5
|
+
import { PageChange } from '../../models/page-change.model';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* A single rendered table row. Either a top-level group row (`kind: 'group'`,
|
|
9
|
+
* carrying the full {@link GroupRow}) or a hierarchy (ancestor) row revealed
|
|
10
|
+
* when a group is expanded (`kind: 'hierarchy'`, carrying the ancestor node and
|
|
11
|
+
* its depth for indentation).
|
|
12
|
+
*/
|
|
13
|
+
interface TableRow {
|
|
14
|
+
kind: 'group' | 'hierarchy';
|
|
15
|
+
group?: GroupRow;
|
|
16
|
+
node?: GroupHierarchyNode;
|
|
17
|
+
level: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Groups_Section (`ieeesa-your-groups`) renders the signed-in user's groups in
|
|
21
|
+
* a collapsible card as a custom hierarchy table styled like the My Profile
|
|
22
|
+
* Find Groups tree: each group row carries a blue +/- toggle (when it has an
|
|
23
|
+
* ancestor hierarchy) that expands to reveal the group's hierarchy path
|
|
24
|
+
* (root→leaf), indented. Columns: Group, Type, Officer Role, Affiliation,
|
|
25
|
+
* Member Level (the member level renders as a coloured pill — green for an
|
|
26
|
+
* assigned level, amber for "Unassigned"). The card paginates the top-level
|
|
27
|
+
* groups (5 per page).
|
|
28
|
+
*
|
|
29
|
+
* Purely presentational: data arrives via `@Input`, intents leave via
|
|
30
|
+
* `@Output`; no API or navigation here. States (loader / empty / error / table)
|
|
31
|
+
* are driven by `sectionState`.
|
|
32
|
+
* @export
|
|
33
|
+
* @class YourGroupsComponent
|
|
34
|
+
*/
|
|
35
|
+
export declare class YourGroupsComponent {
|
|
36
|
+
private readonly constants;
|
|
37
|
+
/** User-facing strings sourced from `constants.json`. */
|
|
38
|
+
readonly texts: any;
|
|
39
|
+
/** Enum reference for template comparisons against `sectionState`. */
|
|
40
|
+
readonly sectionStates: typeof DashboardSectionState;
|
|
41
|
+
/** Per-level indentation step (px) for the expanded hierarchy rows. */
|
|
42
|
+
readonly indentPerLevel = 28;
|
|
43
|
+
/** Selectable "Items per page" page sizes. */
|
|
44
|
+
readonly pageSizeOptions: number[];
|
|
45
|
+
private groupsValue;
|
|
46
|
+
/** The groups rendered in the table. */
|
|
47
|
+
set groups(value: GroupRow[]);
|
|
48
|
+
get groups(): GroupRow[];
|
|
49
|
+
/** The section's load/empty/error state driving the mutually-exclusive regions. */
|
|
50
|
+
sectionState: DashboardSectionState;
|
|
51
|
+
/** Total number of groups (for the "{n} Groups" count and paginator). */
|
|
52
|
+
totalGroups: number;
|
|
53
|
+
private pageIndexValue;
|
|
54
|
+
/** Current zero-based page index. */
|
|
55
|
+
set pageIndex(value: number);
|
|
56
|
+
get pageIndex(): number;
|
|
57
|
+
private pageSizeValue;
|
|
58
|
+
/** Current page size (defaults to 5 rows per page per the design). */
|
|
59
|
+
set pageSize(value: number);
|
|
60
|
+
get pageSize(): number;
|
|
61
|
+
/** Emits when the "View All" link is activated. */
|
|
62
|
+
viewAllGroups: EventEmitter<void>;
|
|
63
|
+
/** Emits the requested page when the paginator changes. */
|
|
64
|
+
pageChange: EventEmitter<PageChange>;
|
|
65
|
+
/**
|
|
66
|
+
* Emits the new expanded state whenever the user toggles the card, so a
|
|
67
|
+
* two-way `[(expanded)]` binding keeps the host's flag in sync. Without this,
|
|
68
|
+
* a host that opened the card (expanded=true) and then the user collapsing it
|
|
69
|
+
* would leave the host flag stale, so re-opening via the same input value
|
|
70
|
+
* would be a no-op.
|
|
71
|
+
* @memberof YourGroupsComponent
|
|
72
|
+
*/
|
|
73
|
+
expandedChange: EventEmitter<boolean>;
|
|
74
|
+
/** Whether the card is expanded (table visible). Starts collapsed. */
|
|
75
|
+
isExpanded: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Allows the host/container to open or close the card (e.g. a "Jump to"
|
|
78
|
+
* shortcut opens it).
|
|
79
|
+
* @memberof YourGroupsComponent
|
|
80
|
+
*/
|
|
81
|
+
set expanded(value: boolean);
|
|
82
|
+
get expanded(): boolean;
|
|
83
|
+
/** GroupIds of the top-level groups whose hierarchy is currently expanded. */
|
|
84
|
+
private readonly expandedGroupIds;
|
|
85
|
+
/** The flattened rows currently rendered (group rows + any expanded hierarchy rows). */
|
|
86
|
+
visibleRows: TableRow[];
|
|
87
|
+
/**
|
|
88
|
+
* The count shown in the header subtitle — the server total when provided,
|
|
89
|
+
* otherwise the number of groups.
|
|
90
|
+
* @readonly
|
|
91
|
+
* @memberof YourGroupsComponent
|
|
92
|
+
*/
|
|
93
|
+
get groupCount(): number;
|
|
94
|
+
/**
|
|
95
|
+
* Whether a group row can expand: it has an ancestor hierarchy (more than the
|
|
96
|
+
* group's own node). A single-node hierarchy (the group itself) is a leaf.
|
|
97
|
+
* @param {GroupRow} group
|
|
98
|
+
* @return {boolean}
|
|
99
|
+
* @memberof YourGroupsComponent
|
|
100
|
+
*/
|
|
101
|
+
hasHierarchy(group: GroupRow): boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Whether the given group row is currently expanded.
|
|
104
|
+
* @param {GroupRow} group
|
|
105
|
+
* @return {boolean}
|
|
106
|
+
* @memberof YourGroupsComponent
|
|
107
|
+
*/
|
|
108
|
+
isGroupExpanded(group: GroupRow): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Toggles a group's hierarchy expansion and rebuilds the visible rows.
|
|
111
|
+
* @param {GroupRow} group
|
|
112
|
+
* @memberof YourGroupsComponent
|
|
113
|
+
*/
|
|
114
|
+
onToggleHierarchy(group: GroupRow): void;
|
|
115
|
+
/**
|
|
116
|
+
* Toggles the card's expanded/collapsed state (whole table visibility) and
|
|
117
|
+
* emits the new state so the host's two-way binding stays in sync.
|
|
118
|
+
* @memberof YourGroupsComponent
|
|
119
|
+
*/
|
|
120
|
+
onToggleExpand(): void;
|
|
121
|
+
/**
|
|
122
|
+
* Emits the "View All" intent for the host.
|
|
123
|
+
* @memberof YourGroupsComponent
|
|
124
|
+
*/
|
|
125
|
+
onViewAll(): void;
|
|
126
|
+
/**
|
|
127
|
+
* Re-emits the Material paginator change (page index or "Items per page"
|
|
128
|
+
* size) as a {@link PageChange} for the host.
|
|
129
|
+
* @param {PageEvent} event - The Material paginator event.
|
|
130
|
+
* @memberof YourGroupsComponent
|
|
131
|
+
*/
|
|
132
|
+
onPaginatorChange(event: PageEvent): void;
|
|
133
|
+
/**
|
|
134
|
+
* Resolves the member-level pill CSS class, mirroring the My Groups profile
|
|
135
|
+
* tab: an assigned level renders green (success), "Unassigned" renders amber.
|
|
136
|
+
* @param {string} memberLevel
|
|
137
|
+
* @return {string}
|
|
138
|
+
* @memberof YourGroupsComponent
|
|
139
|
+
*/
|
|
140
|
+
resolveBadgeClass(memberLevel: string): string;
|
|
141
|
+
/**
|
|
142
|
+
* TrackBy for the rendered table rows.
|
|
143
|
+
* @param {number} index
|
|
144
|
+
* @param {TableRow} row
|
|
145
|
+
* @return {string}
|
|
146
|
+
* @memberof YourGroupsComponent
|
|
147
|
+
*/
|
|
148
|
+
trackByRow(index: number, row: TableRow): string;
|
|
149
|
+
/**
|
|
150
|
+
* Rebuilds the flat list of visible rows: the current page of top-level group
|
|
151
|
+
* rows, each optionally followed by its hierarchy (ancestor) rows when the
|
|
152
|
+
* group is expanded. The hierarchy path is shown root→leaf, indented by depth.
|
|
153
|
+
* @memberof YourGroupsComponent
|
|
154
|
+
*/
|
|
155
|
+
private rebuildRows;
|
|
156
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<YourGroupsComponent, never>;
|
|
157
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<YourGroupsComponent, "ieeesa-your-groups", never, { "groups": { "alias": "groups"; "required": false; }; "sectionState": { "alias": "sectionState"; "required": false; }; "totalGroups": { "alias": "totalGroups"; "required": false; }; "pageIndex": { "alias": "pageIndex"; "required": false; }; "pageSize": { "alias": "pageSize"; "required": false; }; "expanded": { "alias": "expanded"; "required": false; }; }, { "viewAllGroups": "viewAllGroups"; "pageChange": "pageChange"; "expandedChange": "expandedChange"; }, never, never, true, never>;
|
|
158
|
+
}
|
|
159
|
+
export {};
|