@cosla/sensemaking-web-ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -0
- package/angular.json +116 -0
- package/health_check.js +68 -0
- package/karma.conf.js +43 -0
- package/package.json +93 -0
- package/public/favicon.ico +0 -0
- package/server.ts +60 -0
- package/single-html-build.js +100 -0
- package/site-build.ts +54 -0
- package/src/app/app.component.html +1 -0
- package/src/app/app.component.scss +0 -0
- package/src/app/app.component.spec.ts +32 -0
- package/src/app/app.component.ts +21 -0
- package/src/app/app.config.server.ts +9 -0
- package/src/app/app.config.ts +19 -0
- package/src/app/app.routes.ts +8 -0
- package/src/app/components/dialog/dialog.component.html +15 -0
- package/src/app/components/dialog/dialog.component.scss +42 -0
- package/src/app/components/dialog/dialog.component.spec.ts +27 -0
- package/src/app/components/dialog/dialog.component.ts +40 -0
- package/src/app/components/sensemaking-chart-wrapper/sensemaking-chart-wrapper.component.ts +66 -0
- package/src/app/components/statement-card/statement-card.component.html +51 -0
- package/src/app/components/statement-card/statement-card.component.scss +134 -0
- package/src/app/components/statement-card/statement-card.component.spec.ts +23 -0
- package/src/app/components/statement-card/statement-card.component.ts +50 -0
- package/src/app/directives/custom-tooltip/custom-tooltip.directive.spec.ts +39 -0
- package/src/app/directives/custom-tooltip/custom-tooltip.directive.ts +89 -0
- package/src/app/models/report.model.ts +48 -0
- package/src/app/pages/report/report.component.html +363 -0
- package/src/app/pages/report/report.component.scss +600 -0
- package/src/app/pages/report/report.component.spec.ts +29 -0
- package/src/app/pages/report/report.component.ts +276 -0
- package/src/environments/environment.ts +5 -0
- package/src/index.html +17 -0
- package/src/main.server.ts +7 -0
- package/src/main.ts +5 -0
- package/src/style-vars.scss +40 -0
- package/src/styles.scss +23 -0
- package/tsconfig.app.json +19 -0
- package/tsconfig.json +32 -0
- package/tsconfig.spec.json +15 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
<mat-sidenav-container (backdropClick)="closeStatementDrawer()">
|
|
2
|
+
<mat-sidenav-content>
|
|
3
|
+
<main class="report-page">
|
|
4
|
+
<section class="report-header">
|
|
5
|
+
<div class="report-header-details">
|
|
6
|
+
<h1>{{ reportTitle }}</h1>
|
|
7
|
+
</div>
|
|
8
|
+
<button
|
|
9
|
+
mat-stroked-button
|
|
10
|
+
class="icon-button-subtle"
|
|
11
|
+
(click)="openShareReportDialog({ title: 'Share report', text: 'Copy link to share report' })"
|
|
12
|
+
><mat-icon>share</mat-icon> Share Report</button>
|
|
13
|
+
</section>
|
|
14
|
+
<div class="report-main">
|
|
15
|
+
<div class="nav">
|
|
16
|
+
<button
|
|
17
|
+
mat-flat-button
|
|
18
|
+
class="icon-button-fancy"
|
|
19
|
+
(click)="scrollToElement('report-overview')"
|
|
20
|
+
><mat-icon>cards_star</mat-icon>Report Overview</button>
|
|
21
|
+
<div class="nav-label">Report Topics</div>
|
|
22
|
+
<div class="accordion-nav">
|
|
23
|
+
<mat-accordion displayMode="flat">
|
|
24
|
+
<mat-expansion-panel *ngFor="let topic of topicData">
|
|
25
|
+
<mat-expansion-panel-header>
|
|
26
|
+
<div class="nav-item">
|
|
27
|
+
<div class="pill">{{ topic.commentCount }}</div>
|
|
28
|
+
<div class="nav-title" (click)="scrollToElement(topic.name)">{{ topic.name }}</div>
|
|
29
|
+
</div>
|
|
30
|
+
</mat-expansion-panel-header>
|
|
31
|
+
<div *ngFor="let subtopic of topic.subtopicStats" class="nav-subitem">
|
|
32
|
+
<div class="pill">{{ subtopic.commentCount }}</div>
|
|
33
|
+
<div class="nav-subtitle" (click)="openSubtopicPanel(subtopic.id)">{{ subtopic.name }}</div>
|
|
34
|
+
</div>
|
|
35
|
+
</mat-expansion-panel>
|
|
36
|
+
</mat-accordion>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
<div class="report-content">
|
|
40
|
+
<section class="card" id="report-overview">
|
|
41
|
+
<div class="card-header">
|
|
42
|
+
<h2>About this report</h2>
|
|
43
|
+
</div>
|
|
44
|
+
<div class="card-section report-summary paragraphs">
|
|
45
|
+
<p>This report summarizes the results of public input, encompassing {{ totalStatements | number }} statements and {{ totalVotes | number }} votes. From the statements submitted, {{ topicNumber | number }} high level topics were identified, as well as {{ subtopicNumber | number }} subtopics. All voters were anonymous.</p>
|
|
46
|
+
<p>The report below summarizes points of <span class="tooltip-trigger" matTooltip="70% or more of participants voted the same way (e.g. 70% agree, or 70% disagree)">high alignment</span>, <span class="tooltip-trigger" matTooltip="Votes were about split between participants (e.g. 40% agree, 60% disagree, or vice versa)">low alignment</span>, and <span class="tooltip-trigger" matTooltip="More than 30% of participants voted “Unsure/pass”">uncertainty</span> among participants.</p>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="card-section breakdown">
|
|
49
|
+
<div class="breakdown-widget">
|
|
50
|
+
<div class="breakdown-icon"><mat-icon>rate_review</mat-icon></div>
|
|
51
|
+
<div class="breakdown-data">
|
|
52
|
+
<div class="breakdown-number">{{ totalStatements | number }}</div>
|
|
53
|
+
<div class="breakdown-subject">Total statements</div>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
<div class="breakdown-widget">
|
|
57
|
+
<div class="breakdown-icon"><mat-icon class="icon-vote">how_to_vote</mat-icon></div>
|
|
58
|
+
<div class="breakdown-data">
|
|
59
|
+
<div class="breakdown-number">{{ totalVotes | number }}</div>
|
|
60
|
+
<div class="breakdown-subject">Total votes</div>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="breakdown-widget">
|
|
64
|
+
<div class="breakdown-icon"><mat-icon>list_alt</mat-icon></div>
|
|
65
|
+
<div class="breakdown-data">
|
|
66
|
+
<div class="breakdown-number">{{ topicNumber | number }}</div>
|
|
67
|
+
<div class="breakdown-subject">Topics captured</div>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</section>
|
|
72
|
+
<section class="card" id="Conversation-Overview">
|
|
73
|
+
<div class="card-header">
|
|
74
|
+
<h2>Conversation overview</h2>
|
|
75
|
+
@let overviewShareTitle = "Share 'Conversation overview'";
|
|
76
|
+
@let overviewShareText = "Copy link to share the report overview";
|
|
77
|
+
<button
|
|
78
|
+
mat-stroked-button
|
|
79
|
+
class="icon-button-subtle"
|
|
80
|
+
(click)="openShareReportDialog({ elementId: 'Conversation-Overview', title: overviewShareTitle, text: overviewShareText })"
|
|
81
|
+
><mat-icon>share</mat-icon> Share</button>
|
|
82
|
+
</div>
|
|
83
|
+
<div class="card-section">
|
|
84
|
+
<div class="overview-summary">
|
|
85
|
+
<p>Below is a high level overview of the topics discussed in the conversation, as well as the percentage of statements categorized under each topic. Note that the percentages may add up to greater than 100% when statements fall under more than one topic.</p>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="overview-visualization">
|
|
88
|
+
<app-sensemaking-chart-wrapper
|
|
89
|
+
chartType="topics-overview"
|
|
90
|
+
[data]="commentData"
|
|
91
|
+
[summaryData]="summaryData"
|
|
92
|
+
></app-sensemaking-chart-wrapper>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</section>
|
|
96
|
+
<section class="card" id="Participant-Alignment">
|
|
97
|
+
<div class="card-header">
|
|
98
|
+
<h2>Participant alignment</h2>
|
|
99
|
+
@let alignmentShareTitle = "Share 'Participant alignment'";
|
|
100
|
+
@let alignmentShareText = "Copy link to share the report alignment";
|
|
101
|
+
<button
|
|
102
|
+
mat-stroked-button
|
|
103
|
+
class="icon-button-subtle"
|
|
104
|
+
(click)="openShareReportDialog({ elementId: 'Participant-Alignment', title: alignmentShareTitle, text: alignmentShareText })"
|
|
105
|
+
><mat-icon>share</mat-icon> Share</button>
|
|
106
|
+
</div>
|
|
107
|
+
<div class="card-section">
|
|
108
|
+
<div class="toggle-group-wrapper">
|
|
109
|
+
<mat-button-toggle-group class="toggle-group" [(ngModel)]="selectedAlignmentType">
|
|
110
|
+
<mat-button-toggle value="high-alignment">High alignment</mat-button-toggle>
|
|
111
|
+
<mat-button-toggle value="low-alignment">Low alignment</mat-button-toggle>
|
|
112
|
+
<mat-button-toggle value="high-uncertainty">Uncertainty</mat-button-toggle>
|
|
113
|
+
</mat-button-toggle-group>
|
|
114
|
+
</div>
|
|
115
|
+
<div class="overview-description">
|
|
116
|
+
<p>Across <strong>all topics and subtopics</strong>, participants found the {{ alignmentString }} on the following statements.</p>
|
|
117
|
+
</div>
|
|
118
|
+
<div class="statement-card-group">
|
|
119
|
+
<app-statement-card
|
|
120
|
+
*ngFor="let card of alignmentCards"
|
|
121
|
+
[type]="selectedAlignmentType"
|
|
122
|
+
[data]="card"
|
|
123
|
+
[truncate]="true"
|
|
124
|
+
></app-statement-card>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
</section>
|
|
128
|
+
<div class="heading-badge-wrapper">
|
|
129
|
+
<div class="heading-badge">{{ topicNumber | number }} topics identified</div>
|
|
130
|
+
</div>
|
|
131
|
+
<section class="card" *ngFor="let topic of topicData" id="{{ topic.name }}">
|
|
132
|
+
<div class="card-header">
|
|
133
|
+
<h2>{{ topic.name }}</h2>
|
|
134
|
+
@let topicShareTitle = "Share " + "'" + topic.name + "'";
|
|
135
|
+
@let topicShareText = "Copy link to share this topic";
|
|
136
|
+
<button
|
|
137
|
+
mat-stroked-button
|
|
138
|
+
class="icon-button-subtle"
|
|
139
|
+
(click)="openShareReportDialog({ elementId: topic.name, title: topicShareTitle, text: topicShareText })"
|
|
140
|
+
><mat-icon>share</mat-icon> Share</button>
|
|
141
|
+
</div>
|
|
142
|
+
<div class="topic-breakdown-wrapper">
|
|
143
|
+
<div class="topic-breakdown">
|
|
144
|
+
<div class="topic-breakdown-item">
|
|
145
|
+
<div class="pill">{{ topic.subtopicStats.length | number }}</div>
|
|
146
|
+
<div class="topic-breakdown-item-text">Subtopics</div>
|
|
147
|
+
</div>
|
|
148
|
+
<div class="topic-breakdown-item">
|
|
149
|
+
<div class="pill">{{ topic.commentCount | number }}</div>
|
|
150
|
+
<div class="topic-breakdown-item-text">Total statements</div>
|
|
151
|
+
</div>
|
|
152
|
+
<div class="topic-breakdown-item">
|
|
153
|
+
<div class="pill">{{ topic.voteCount | number }}</div>
|
|
154
|
+
<div class="topic-breakdown-item-text">Total votes</div>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
<div class="card-section">
|
|
159
|
+
<div class="toggle-group-wrapper">
|
|
160
|
+
<mat-button-toggle-group
|
|
161
|
+
class="toggle-group"
|
|
162
|
+
[value]="topicAlignmentViews[topic.name]"
|
|
163
|
+
(change)="updateTopicView(topic.name, $event.value)">
|
|
164
|
+
<mat-button-toggle value="solid">Groupings</mat-button-toggle>
|
|
165
|
+
<mat-button-toggle value="waffle">Statements</mat-button-toggle>
|
|
166
|
+
</mat-button-toggle-group>
|
|
167
|
+
</div>
|
|
168
|
+
<div class="topic-visualization">
|
|
169
|
+
<app-sensemaking-chart-wrapper
|
|
170
|
+
[chartId]="'chart-' + topic.name"
|
|
171
|
+
chartType="topic-alignment"
|
|
172
|
+
[view]="topicAlignmentViews[topic.name]"
|
|
173
|
+
[topicFilter]="topic.name"
|
|
174
|
+
[colors]="['#3A708A', '#589AB7', '#8bc3da', '#757575']"
|
|
175
|
+
[data]="commentData"
|
|
176
|
+
[summaryData]="summaryData"
|
|
177
|
+
></app-sensemaking-chart-wrapper>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
<div class="card-section accordion-general">
|
|
181
|
+
<mat-accordion displayMode="flat">
|
|
182
|
+
<mat-expansion-panel
|
|
183
|
+
*ngFor="let subtopic of topic.subtopicStats"
|
|
184
|
+
id="{{ subtopic.id }}"
|
|
185
|
+
#subtopicPanel
|
|
186
|
+
(afterExpand)="afterSubtopicPanelOpen(subtopic.id)"
|
|
187
|
+
>
|
|
188
|
+
<mat-expansion-panel-header>
|
|
189
|
+
<h3>{{ subtopic.name }}</h3>
|
|
190
|
+
</mat-expansion-panel-header>
|
|
191
|
+
<div class="subtopic-sections-group">
|
|
192
|
+
<section class="subtopic-section">
|
|
193
|
+
<div class="subtopic-breakdown">
|
|
194
|
+
<div class="subtopic-breakdown-item">
|
|
195
|
+
<div class="pill">{{ subtopic.commentCount | number }}</div>
|
|
196
|
+
<div class="subtopic-breakdown-item-text">Total statements</div>
|
|
197
|
+
</div>
|
|
198
|
+
<div class="subtopic-breakdown-item">
|
|
199
|
+
<div class="pill">{{ subtopic.voteCount | number }}</div>
|
|
200
|
+
<div class="subtopic-breakdown-item-text">Total votes</div>
|
|
201
|
+
</div>
|
|
202
|
+
<div class="breakdown-divider"></div>
|
|
203
|
+
<div class="subtopic-breakdown-description">This subtopic had <strong>{{ subtopic.relativeAlignment }}</strong> and <strong>{{ subtopic.relativeEngagement }}</strong> compared to the other subtopics.</div>
|
|
204
|
+
</div>
|
|
205
|
+
<h4>Prominent themes emerged from all statements submitted:</h4>
|
|
206
|
+
<div class="subtopic-themes-group">
|
|
207
|
+
<markdown>{{ getSubtopicThemesText(topic.name, subtopic.name) }}</markdown>
|
|
208
|
+
</div>
|
|
209
|
+
</section>
|
|
210
|
+
<section class="subtopic-section">
|
|
211
|
+
<h4>Participants found the highest alignment on the following statements:</h4>
|
|
212
|
+
<div class="subtopic-section-summary">
|
|
213
|
+
<p>70% or more of participants agreed or disagreed with these statements.</p>
|
|
214
|
+
</div>
|
|
215
|
+
@let topStatementsHighAlignment = getTopSubtopicStatements(topic.name, subtopic.name, "high-alignment");
|
|
216
|
+
@if (topStatementsHighAlignment.length) {
|
|
217
|
+
<div class="statement-card-group">
|
|
218
|
+
<app-statement-card
|
|
219
|
+
*ngFor="let card of topStatementsHighAlignment"
|
|
220
|
+
[data]="card"
|
|
221
|
+
type="high-alignment"
|
|
222
|
+
[truncate]="true"
|
|
223
|
+
></app-statement-card>
|
|
224
|
+
</div>
|
|
225
|
+
} @else {
|
|
226
|
+
<div class="subtopic-section-description">
|
|
227
|
+
<mat-icon>info</mat-icon>
|
|
228
|
+
<p>There were no statements in this subtopic that fit within the threshold of “high alignment.”</p>
|
|
229
|
+
</div>
|
|
230
|
+
}
|
|
231
|
+
</section>
|
|
232
|
+
<section class="subtopic-section">
|
|
233
|
+
<h4>Participants found the lowest alignment on the following statements:</h4>
|
|
234
|
+
<div class="subtopic-section-summary">
|
|
235
|
+
<p>Opinions were split. 40–60% of voters either agreed or disagreed with these statements.</p>
|
|
236
|
+
</div>
|
|
237
|
+
@let topStatementsLowAlignment = getTopSubtopicStatements(topic.name, subtopic.name, "low-alignment");
|
|
238
|
+
@if (topStatementsLowAlignment.length) {
|
|
239
|
+
<div class="statement-card-group">
|
|
240
|
+
<app-statement-card
|
|
241
|
+
*ngFor="let card of topStatementsLowAlignment"
|
|
242
|
+
[data]="card"
|
|
243
|
+
type="low-alignment"
|
|
244
|
+
[truncate]="true"
|
|
245
|
+
></app-statement-card>
|
|
246
|
+
</div>
|
|
247
|
+
} @else {
|
|
248
|
+
<div class="subtopic-section-description">
|
|
249
|
+
<mat-icon>info</mat-icon>
|
|
250
|
+
<p>There were no statements in this subtopic that fit within the threshold of “low alignment.”</p>
|
|
251
|
+
</div>
|
|
252
|
+
}
|
|
253
|
+
</section>
|
|
254
|
+
<section class="subtopic-section">
|
|
255
|
+
<h4>There were high levels of uncertainty on the following statements:</h4>
|
|
256
|
+
<div class="subtopic-section-summary">
|
|
257
|
+
<p>Statements in this category were among the 25% most passed on in the conversation as a whole or were passed on by at least 20% of participants.</p>
|
|
258
|
+
</div>
|
|
259
|
+
@let topStatementsHighUncertainty = getTopSubtopicStatements(topic.name, subtopic.name, "high-uncertainty");
|
|
260
|
+
@if (topStatementsHighUncertainty.length) {
|
|
261
|
+
<div class="statement-card-group">
|
|
262
|
+
<app-statement-card
|
|
263
|
+
*ngFor="let card of topStatementsHighUncertainty"
|
|
264
|
+
[data]="card"
|
|
265
|
+
type="high-uncertainty"
|
|
266
|
+
[truncate]="true"
|
|
267
|
+
></app-statement-card>
|
|
268
|
+
</div>
|
|
269
|
+
} @else {
|
|
270
|
+
<div class="subtopic-section-description">
|
|
271
|
+
<mat-icon>info</mat-icon>
|
|
272
|
+
<p>There were no statements in this subtopic that fit within the threshold of “uncertainty.”</p>
|
|
273
|
+
</div>
|
|
274
|
+
}
|
|
275
|
+
</section>
|
|
276
|
+
<section class="subtopic-section centered">
|
|
277
|
+
<button mat-stroked-button class="icon-button-main" (click)="openStatementDrawer(subtopic)">
|
|
278
|
+
<mat-icon>visibility</mat-icon> View all statements in {{ subtopic.name }}
|
|
279
|
+
</button>
|
|
280
|
+
</section>
|
|
281
|
+
</div>
|
|
282
|
+
</mat-expansion-panel>
|
|
283
|
+
</mat-accordion>
|
|
284
|
+
</div>
|
|
285
|
+
</section>
|
|
286
|
+
</div>
|
|
287
|
+
</div>
|
|
288
|
+
</main>
|
|
289
|
+
</mat-sidenav-content>
|
|
290
|
+
<mat-sidenav class="drawer" [opened]="isStatementDrawerOpen" position="end">
|
|
291
|
+
<div class="drawer-header">
|
|
292
|
+
<h4>{{ drawerSubtopicName }} ({{ drawerSubtopicStatementNumber }})</h4>
|
|
293
|
+
<button
|
|
294
|
+
mat-icon-button
|
|
295
|
+
class="drawer-close-button"
|
|
296
|
+
aria-label="Close drawer"
|
|
297
|
+
(click)="closeStatementDrawer()"
|
|
298
|
+
><mat-icon>close</mat-icon></button>
|
|
299
|
+
</div>
|
|
300
|
+
<div class="drawer-content">
|
|
301
|
+
<div class="drawer-statement-group">
|
|
302
|
+
<h5>High alignment statements ({{ drawerSubtopicStatementsHighAlignment.length }})</h5>
|
|
303
|
+
<p>70% or more of participants agreed or disagreed with these statements.</p>
|
|
304
|
+
@if (drawerSubtopicStatementsHighAlignment.length) {
|
|
305
|
+
<div class="drawer-statement-list">
|
|
306
|
+
<app-statement-card
|
|
307
|
+
*ngFor="let card of drawerSubtopicStatementsHighAlignment"
|
|
308
|
+
type="high-alignment"
|
|
309
|
+
[data]="card"
|
|
310
|
+
></app-statement-card>
|
|
311
|
+
</div>
|
|
312
|
+
} @else {
|
|
313
|
+
<div>--</div>
|
|
314
|
+
}
|
|
315
|
+
</div>
|
|
316
|
+
<div class="drawer-statement-group">
|
|
317
|
+
<h5>Low alignment statements ({{ drawerSubtopicStatementsLowAlignment.length }})</h5>
|
|
318
|
+
<p>Opinions were split. 40–60% of voters either agreed or disagreed with these statements.</p>
|
|
319
|
+
@if (drawerSubtopicStatementsLowAlignment.length) {
|
|
320
|
+
<div class="drawer-statement-list">
|
|
321
|
+
<app-statement-card
|
|
322
|
+
*ngFor="let card of drawerSubtopicStatementsLowAlignment"
|
|
323
|
+
type="low-alignment"
|
|
324
|
+
[data]="card"
|
|
325
|
+
></app-statement-card>
|
|
326
|
+
</div>
|
|
327
|
+
} @else {
|
|
328
|
+
<div>--</div>
|
|
329
|
+
}
|
|
330
|
+
</div>
|
|
331
|
+
<div class="drawer-statement-group">
|
|
332
|
+
<h5>High uncertainty statements ({{ drawerSubtopicStatementsHighUncertainty.length }})</h5>
|
|
333
|
+
<p>Statements in this category were among the 25% most passed on in the conversation as a whole or were passed on by at least 20% of participants.</p>
|
|
334
|
+
@if (drawerSubtopicStatementsHighUncertainty.length) {
|
|
335
|
+
<div class="drawer-statement-list">
|
|
336
|
+
<app-statement-card
|
|
337
|
+
*ngFor="let card of drawerSubtopicStatementsHighUncertainty"
|
|
338
|
+
type="high-uncertainty"
|
|
339
|
+
[data]="card"
|
|
340
|
+
></app-statement-card>
|
|
341
|
+
</div>
|
|
342
|
+
} @else {
|
|
343
|
+
<div>--</div>
|
|
344
|
+
}
|
|
345
|
+
</div>
|
|
346
|
+
<div class="drawer-statement-group">
|
|
347
|
+
<h5>Uncategorized statements ({{ drawerSubtopicStatementsUncategorized.length }})</h5>
|
|
348
|
+
<p>These statements do not meet criteria for high alignment, low alignment, or high uncertainty.</p>
|
|
349
|
+
@if (drawerSubtopicStatementsUncategorized.length) {
|
|
350
|
+
<div class="drawer-statement-list">
|
|
351
|
+
<app-statement-card
|
|
352
|
+
*ngFor="let card of drawerSubtopicStatementsUncategorized"
|
|
353
|
+
type="uncategorized"
|
|
354
|
+
[data]="card"
|
|
355
|
+
></app-statement-card>
|
|
356
|
+
</div>
|
|
357
|
+
} @else {
|
|
358
|
+
<div>--</div>
|
|
359
|
+
}
|
|
360
|
+
</div>
|
|
361
|
+
</div>
|
|
362
|
+
</mat-sidenav>
|
|
363
|
+
</mat-sidenav-container>
|