@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,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 {};