Skip to content

Commit dedb0a8

Browse files
Merge pull request #318 from snehaljha-sf/report_fixes
fix: dynamic filter and other
2 parents c8073ed + 787cf13 commit dedb0a8

File tree

8 files changed

+150
-53
lines changed

8 files changed

+150
-53
lines changed

src/migration/flexcard.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ export class CardMigrationTool extends BaseMigrationTool implements MigrationToo
266266
}
267267

268268
let childCards = this.readChildCardsFromDefinition(flexCard);
269-
flexCardAssessmentInfo.dependenciesFC.push(childCards);
269+
flexCardAssessmentInfo.dependenciesFC.push(...childCards);
270270
} catch (err) {
271271
// Log the error but continue processing
272272
Logger.error(`Error parsing definition for card ${flexCard.Name}: ${err.message}`);

src/styles/reportGenerator.css

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,3 +527,35 @@ td {
527527
opacity: 1;
528528
visibility: visible;
529529
}
530+
531+
ul {
532+
list-style: inside !important;
533+
}
534+
535+
.invalid-icon {
536+
position: relative;
537+
padding-left: 24px; /* space for icon */
538+
}
539+
540+
.invalid-icon::before {
541+
content: '';
542+
position: absolute;
543+
left: 6px;
544+
top: 50%;
545+
width: 14px;
546+
height: 14px;
547+
border: 2px solid red;
548+
border-radius: 50%;
549+
transform: translateY(-50%);
550+
}
551+
552+
.invalid-icon::after {
553+
content: '';
554+
position: absolute;
555+
left: 9px;
556+
top: 50%;
557+
width: 10px;
558+
height: 2px;
559+
background-color: red;
560+
transform: translateY(-50%) rotate(45deg);
561+
}

src/templates/assessmentReport.template

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
<c:if exp={$callToAction.length > 0}>
1616
<!-- Call To Action Button -->
1717
<button class="cta-button" onclick="toggleCtaPanel()">Call To Action</button>
18-
18+
1919
<!-- Overlay -->
2020
<div class="overlay" id="overlay" onclick="closeCtaPanel()"></div>
21-
21+
2222
<!-- Call To Action Panel -->
2323
<div class="cta-panel" id="ctaPanel">
2424
<div class="cta-panel-header">
@@ -152,23 +152,27 @@
152152
<c:for items=(row.data) var="cell">
153153
<c:if exp={!$cell.isHref}>
154154
<c:if exp={$cell.searchable}>
155-
<td data-name="(cell.value)" rowspan="(cell.rowspan)" colspan="(cell.colspan)"
156-
key="(cell.key)" value="(cell.value)">
155+
<td class="(cell.customClass)" data-name="(cell.value)" rowspan="(cell.rowspan)"
156+
colspan="(cell.colspan)" key="(cell.key)" value="(cell.value)">
157157
<c:if exp={Array.isArray($cell.title)}>
158-
<c:for items=(cell.title) var="value">
159-
<div>{{value}}</div>
160-
</c:for>
158+
<ul>
159+
<c:for items=(cell.title) var="value">
160+
<li>{{value}}</li>
161+
</c:for>
162+
</ul>
161163
</c:if>
162164
<c:if exp={!Array.isArray($cell.title)}> {{cell.title}} </c:if>
163165
</td>
164166
</c:if>
165167
<c:if exp={!$cell.searchable}>
166-
<td rowspan="(cell.rowspan)" colspan="(cell.colspan)" key="(cell.key)"
167-
value="(cell.value)">
168+
<td rowspan="(cell.rowspan)" colspan="(cell.colspan)" class="(cell.customClass)"
169+
key="(cell.key)" value="(cell.value)">
168170
<c:if exp={Array.isArray($cell.title)}>
169-
<c:for items=(cell.title) var="value">
170-
<div>{{value}}</div>
171-
</c:for>
171+
<ul>
172+
<c:for items=(cell.title) var="value">
173+
<li>{{value}}</li>
174+
</c:for>
175+
</ul>
172176
</c:if>
173177
<c:if exp={!Array.isArray($cell.title)}> {{cell.title}} </c:if>
174178
</td>
@@ -177,24 +181,28 @@
177181
<c:if exp={$cell.isHref}>
178182
<c:if exp={$cell.searchable}>
179183
<td data-name="(cell.value)" rowspan="(cell.rowspan)" colspan="(cell.colspan)"
180-
key="(cell.key)" value="(cell.value)">
184+
class="(cell.customClass)" key="(cell.key)" value="(cell.value)">
181185
<c:if exp={Array.isArray($cell.title)}>
182-
<c:for items=(cell.title) var="value">
183-
<div><a href="(cell.uri)">{{value}}</a></div>
184-
</c:for>
186+
<ul>
187+
<c:for items=(cell.title) var="value">
188+
<li><a href="(cell.uri)">{{value}}</a></li>
189+
</c:for>
190+
</ul>
185191
</c:if>
186192
<c:if exp={!Array.isArray($cell.title)}>
187193
<a href="(cell.uri)">{{cell.title}}</a>
188194
</c:if>
189195
</td>
190196
</c:if>
191197
<c:if exp={!$cell.searchable}>
192-
<td rowspan="(cell.rowspan)" colspan="(cell.colspan)" key="(cell.key)"
193-
value="(cell.value)">
198+
<td rowspan="(cell.rowspan)" colspan="(cell.colspan)" class="(cell.customClass)"
199+
key="(cell.key)" value="(cell.value)">
194200
<c:if exp={Array.isArray($cell.title)}>
195-
<c:for items=(cell.title) var="value">
196-
<div><a href="(cell.uri)">{{value}}</a></div>
197-
</c:for>
201+
<ul>
202+
<c:for items=(cell.title) var="value">
203+
<li><a href="(cell.uri)">{{value}}</a></li>
204+
</c:for>
205+
</ul>
198206
</c:if>
199207
<c:if exp={!Array.isArray($cell.title)}>
200208
<a href="(cell.uri)">{{cell.title}}</a>

src/templates/migrationReport.template

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
</div>
3939

4040
<div class="org-details-section">
41-
<div class="label-key">Assessment Date and Time</div>
41+
<div class="label-key">Migration Date and Time</div>
4242
<div class="label-value">{{assessmentDate}}</div>
4343
</div>
4444
</div>
@@ -116,49 +116,57 @@
116116
<c:for items=(row.data) var="cell">
117117
<c:if exp={!$cell.isHref}>
118118
<c:if exp={$cell.searchable}>
119-
<td data-name="(cell.value)" rowspan="(cell.rowspan)" colspan="(cell.colspan)"
120-
key="(cell.key)" value="(cell.value)">
119+
<td class="(cell.customClass)" data-name="(cell.value)" rowspan="(cell.rowspan)"
120+
colspan="(cell.colspan)" key="(cell.key)" value="(cell.value)">
121121
<c:if exp={Array.isArray($cell.title)}>
122-
<c:for items=(cell.title) var="value">
123-
<div>{{value}}</div>
124-
</c:for>
122+
<ul>
123+
<c:for items=(cell.title) var="value">
124+
<li>{{value}}</li>
125+
</c:for>
126+
</ul>
125127
</c:if>
126128
<c:if exp={!Array.isArray($cell.title)}> {{cell.title}} </c:if>
127129
</td>
128130
</c:if>
129131
<c:if exp={!$cell.searchable}>
130-
<td rowspan="(cell.rowspan)" colspan="(cell.colspan)" key="(cell.key)"
132+
<td rowspan="(cell.rowspan)" colspan="(cell.colspan)" class="(cell.customClass)" key="(cell.key)"
131133
value="(cell.value)">
132134
<c:if exp={Array.isArray($cell.title)}>
133-
<c:for items=(cell.title) var="value">
134-
<div>{{value}}</div>
135-
</c:for>
135+
<ul>
136+
<c:for items=(cell.title) var="value">
137+
<li>{{value}}</li>
138+
</c:for>
139+
</ul>
136140
</c:if>
137141
<c:if exp={!Array.isArray($cell.title)}> {{cell.title}} </c:if>
138142
</td>
139143
</c:if>
140144
</c:if>
141145
<c:if exp={$cell.isHref}>
142146
<c:if exp={$cell.searchable}>
143-
<td data-name="(cell.value)" rowspan="(cell.rowspan)" colspan="(cell.colspan)"
144-
key="(cell.key)" value="(cell.value)">
147+
<td class="(cell.customClass)" data-name="(cell.value)" rowspan="(cell.rowspan)"
148+
colspan="(cell.colspan)" key="(cell.key)" value="(cell.value)">
145149
<c:if exp={Array.isArray($cell.title)}>
146-
<c:for items=(cell.title) var="value">
147-
<div><a href="(cell.uri)">{{value}}</a></div>
148-
</c:for>
150+
<ul>
151+
<c:for items=(cell.title) var="value">
152+
<li><a href="(cell.uri)">{{value}}</a></li>
153+
</c:for>
154+
</ul>
149155
</c:if>
150156
<c:if exp={!Array.isArray($cell.title)}>
151157
<a href="(cell.uri)">{{cell.title}}</a>
152158
</c:if>
153159
</td>
154160
</c:if>
155161
<c:if exp={!$cell.searchable}>
156-
<td rowspan="(cell.rowspan)" colspan="(cell.colspan)" key="(cell.key)"
162+
<td rowspan="(cell.rowspan)" colspan="(cell.colspan)" class="(cell.customClass)" key="(cell.key)"
157163
value="(cell.value)">
158164
<c:if exp={Array.isArray($cell.title)}>
159-
<c:for items=(cell.title) var="value">
160-
<div><a href="(cell.uri)">{{value}}</a></div>
161-
</c:for>
165+
<ul>
166+
<c:for items=(cell.title) var="value">
167+
<li><a href="(cell.uri)">{{value}}</a></li>
168+
</c:for>
169+
</ul>
162170
</c:if>
163171
<c:if exp={!Array.isArray($cell.title)}>
164172
<a href="(cell.uri)">{{cell.title}}</a>

src/utils/reportGenerator/reportInterfaces.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export interface ReportDataParam {
4141
colspan: number;
4242
isHref: boolean;
4343
uri?: string;
44+
customClass?: string;
4445
}
4546

4647
export interface ReportRowParam {

src/utils/reportGenerator/reportUtil.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,14 @@ export function createRowDataParam(
99
colspan: number,
1010
isHref: boolean,
1111
uri?: string,
12-
title?: string | string[]
12+
title?: string | string[],
13+
customClass?: string
1314
): ReportDataParam {
15+
16+
if(title && Array.isArray(title)) {
17+
title = title.filter(t => t?.trim?.());
18+
}
19+
1420
return {
1521
key,
1622
value,
@@ -20,6 +26,7 @@ export function createRowDataParam(
2026
colspan,
2127
isHref,
2228
uri,
29+
customClass: customClass || '',
2330
};
2431
}
2532

src/utils/resultsbuilder/DRAssessmentReporter.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class DRAssessmentReporter {
2626
org: getOrgDetailsForReport(omnistudioOrgDetails),
2727
assessmentDate: new Date().toString(),
2828
total: dataRaptorAssessmentInfos?.length || 0,
29-
filterGroups: this.getFilterGroupsForReport(),
29+
filterGroups: this.getFilterGroupsForReport(dataRaptorAssessmentInfos),
3030
headerGroups: this.getHeaderGroupsForReport(),
3131
rows: this.getRowsForReport(dataRaptorAssessmentInfos, instanceUrl),
3232
rollbackFlags: (omnistudioOrgDetails.rollbackFlags || []).includes('RollbackDRChanges')
@@ -57,8 +57,16 @@ export class DRAssessmentReporter {
5757
];
5858
}
5959

60-
private static getFilterGroupsForReport(): FilterGroupParam[] {
61-
return [createFilterGroupParam('Filter By Type', 'type', ['Extract', 'Transform', 'Load', 'Turbo Extract'])];
60+
private static getFilterGroupsForReport(dataRaptorAssessmentInfos: DataRaptorAssessmentInfo[]): FilterGroupParam[] {
61+
if (!dataRaptorAssessmentInfos || dataRaptorAssessmentInfos.length === 0) {
62+
return [];
63+
}
64+
65+
const distinctTypes = [...new Set(dataRaptorAssessmentInfos.map((info) => info.type))];
66+
if (distinctTypes.length > 0 && distinctTypes.filter((type) => type).length > 0) {
67+
return [createFilterGroupParam('Filter By Type', 'type', distinctTypes)];
68+
}
69+
return [];
6270
}
6371

6472
private static getHeaderGroupsForReport(): ReportHeaderGroupParam[] {

src/utils/resultsbuilder/OSAssessmentReporter.ts

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class OSAssessmentReporter {
2626
org: getOrgDetailsForReport(omnistudioOrgDetails),
2727
assessmentDate: new Date().toString(),
2828
total: OSAssessmentInfos?.length || 0,
29-
filterGroups: this.getFilterGroupsForReport(),
29+
filterGroups: this.getFilterGroupsForReport(OSAssessmentInfos),
3030
headerGroups: this.getHeaderGroupsForReport(),
3131
rows: this.getRowsForReport(OSAssessmentInfos, instanceUrl),
3232
rollbackFlags: (omnistudioOrgDetails.rollbackFlags || []).includes('RollbackOSChanges')
@@ -67,11 +67,31 @@ export class OSAssessmentReporter {
6767
return OSAssessmentInfos.map((info) => ({
6868
rowId: `${this.rowIdPrefix}${this.rowId++}`,
6969
data: [
70-
createRowDataParam('name', info.oldName, true, 1, 1, false),
70+
createRowDataParam(
71+
'name',
72+
info.oldName,
73+
true,
74+
1,
75+
1,
76+
false,
77+
undefined,
78+
undefined,
79+
info.migrationStatus !== 'Can be Automated' ? 'invalid-icon' : ''
80+
),
7181
createRowDataParam('recordId', info.id, false, 1, 1, true, `${instanceUrl}/${info.id}`),
7282
createRowDataParam('newName', info.name || '', false, 1, 1, false),
7383
createRowDataParam('type', info.type, false, 1, 1, false),
74-
createRowDataParam('status', info.migrationStatus, false, 1, 1, false),
84+
createRowDataParam(
85+
'status',
86+
info.migrationStatus,
87+
false,
88+
1,
89+
1,
90+
false,
91+
undefined,
92+
undefined,
93+
info.migrationStatus === 'Can be Automated' ? 'text-success' : 'text-error'
94+
),
7595
createRowDataParam(
7696
'summary',
7797
info.warnings ? info.warnings.join(', ') : '',
@@ -216,10 +236,23 @@ export class OSAssessmentReporter {
216236
];
217237
}
218238

219-
private static getFilterGroupsForReport(): FilterGroupParam[] {
220-
return [
221-
createFilterGroupParam('Filter By Type', 'type', ['LWC', 'Angular']),
222-
createFilterGroupParam('Filter By Assessment Status', 'status', ['Can be Automated', 'Need Manual Intervention']),
223-
];
239+
private static getFilterGroupsForReport(OSAssessmentInfos: OSAssessmentInfo[]): FilterGroupParam[] {
240+
if (!OSAssessmentInfos || OSAssessmentInfos.length === 0) {
241+
return [];
242+
}
243+
244+
// Get distinct types from OSAssessmentInfos
245+
const distinctTypes = [...new Set(OSAssessmentInfos.map((info) => info.type))];
246+
const typeFilterGroupParam: FilterGroupParam[] =
247+
distinctTypes.length > 0 && distinctTypes.filter((type) => type).length > 0
248+
? [createFilterGroupParam('Filter By Type', 'type', distinctTypes)]
249+
: [];
250+
const distinctStatuses = [...new Set(OSAssessmentInfos.map((info) => info.migrationStatus))];
251+
const statusFilterGroupParam: FilterGroupParam[] =
252+
distinctStatuses.length > 0 && distinctStatuses.filter((status) => status).length > 0
253+
? [createFilterGroupParam('Filter By Assessment Status', 'status', distinctStatuses)]
254+
: [];
255+
256+
return [...typeFilterGroupParam, ...statusFilterGroupParam];
224257
}
225258
}

0 commit comments

Comments
 (0)