Skip to content

Commit 875c72c

Browse files
authored
Merge pull request #373 from snehaljha-sf/assessment_fixes
Assessment fixes
2 parents 64282b6 + f65dcb2 commit 875c72c

27 files changed

+579
-276
lines changed

messages/assess.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,15 @@
123123
"errorEvaluatingExpression": "Error evaluating expression: %s, %s",
124124
"foundFlexiPages": "Found %s FlexiPages to assess",
125125
"assessingFlexiPages": "Assessing FlexiPages",
126-
"completedProcessingAllFlexiPages": "Completed processing all flexipage files. Total processed: %s",
127-
"completedProcessingFlexiPage": "Completed processing %s - Errors: %s",
128-
"processingFlexiPage": "Processing flexipage file: %s",
129-
"startingFlexiPageProcessing": "Starting to process flexipage: %s",
126+
"completedProcessingAllFlexiPages": "Completed processing all FlexiPages. Total processed: %s",
127+
"completedProcessingFlexiPage": "Completed processing %s. Errors: %s",
128+
"processingFlexiPage": "Processing FlexiPage: %s",
129+
"startingFlexiPageProcessing": "Starting to process FlexiPage: %s",
130130
"readFlexiPageContent": "Read file content, size: %s characters",
131-
"updatedModifiedContent": "updated content in file: %s",
132-
"generatedDiffForFile": "Generated diff for file: %s",
133-
"errorProcessingFlexiPage": "Error processing flexipage file: %s, %s",
134-
"flexipagesWithChanges": "Found %s flexipage files with changes",
131+
"updatedModifiedContent": "updated content in %s file",
132+
"generatedDiffForFile": "Generated difference for the file: %s",
133+
"errorProcessingFlexiPage": "Error processing FlexiPage: %s, %s",
134+
"flexipagesWithChanges": "Found %s FlexiPages with changes",
135135
"migratingFlexiPages": "Migrating FlexiPages",
136136
"experienceSiteMetadataConsent": "The consent for exp site is %s",
137137
"experienceSiteConsentNotProvidedWarning": "Consent for experience sites is not provided. Experience sites will not be processed",

messages/migrate.json

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,15 @@
117117
"migrationConsentNotGiven": "Couldn't confirm whether assessment errors are resolved",
118118
"foundFlexiPages": "Found %s FlexiPages to migrate",
119119
"migratingFlexiPages": "Migrating FlexiPages",
120-
"completedProcessingAllFlexiPages": "Completed processing all flexipage files. Total processed: %s",
121-
"completedProcessingFlexiPage": "Completed processing %s - Errors: %s",
122-
"processingFlexiPage": "Processing flexipage file: %s",
123-
"startingFlexiPageProcessing": "Starting to process flexipage: %s",
120+
"completedProcessingAllFlexiPages": "Completed processing all flexipages. Total processed: %s",
121+
"completedProcessingFlexiPage": "Completed processing %s. Errors: %s",
122+
"processingFlexiPage": "Processing FlexiPage: %s",
123+
"startingFlexiPageProcessing": "Starting to process FlexiPage: %s",
124124
"readFlexiPageContent": "Read file content, size: %s characters",
125-
"updatedModifiedContent": "updated content in file: %s",
126-
"generatedDiffForFile": "Generated diff for file: %s",
127-
"errorProcessingFlexiPage": "Error processing flexipage file: %s, %s",
128-
"flexipagesWithChanges": "Found %s flexipage files with changes",
125+
"updatedModifiedContent": "updated content in %s file",
126+
"generatedDiffForFile": "Generated difference for the file: %s",
127+
"errorProcessingFlexiPage": "Error processing FlexiPage: %s, %s",
128+
"flexipagesWithChanges": "Found %s FlexiPages with changes",
129129
"omniGlobalAutoNumberPrefEnabled": "Successfully enabled OmniGlobalAutoNumberPref org preference",
130130
"errorEnablingOmniGlobalAutoNumberPref": "We couldn’t enable the Global Auto Number setting. Turn on the Global Auto Number setting manually, and try again. See <a href='https://help.salesforce.com/s/articleView?id=xcloud.os_standard_global_auto_number.htm&type=5' target='_blank'>Set Up Omni Global Auto Number</a>.",
131131
"performingPreMigrationChecks": "Performing pre-migration checks for Global Auto Number...",
@@ -188,16 +188,16 @@
188188
"errorCheckingGlobalAutoNumber": "We couldn’t check whether the Global Auto Number setting is enabled: %s. Try again later.",
189189
"errorMigrationMessage": "Error migrating object: %s",
190190
"nameMappingUndefined": "Name Mapping is undefined",
191-
"autoDeployConsentMessage": "Do you want to auto deploy the related objects? [y/n]",
192-
"errorDeployingComponents": "Error deploying related objects post migration",
191+
"autoDeployConsentMessage": "Do you want to deploy the related objects automatically? [y/n]",
192+
"errorDeployingComponents": "We couldn’t deploy related objects after migration.",
193193
"installingDependency": "Installing node dependency %s",
194194
"dependencyInstalled": "Node dependency %s installed",
195195
"deployingFromManifest": "Deploying from metadata packages",
196-
"manifestDeployFailed": "Metadata packages deployment failed, check logs or status for more details",
196+
"manifestDeployFailed": "We couldn’t deploy metadata packages. Check the logs or the status for more details.",
197197
"installingRequiredDependencies": "Installing required node dependencies",
198-
"creatingNPMConfigFile": "Creating npm config file",
198+
"creatingNPMConfigFile": "Creating npm configuration file",
199199
"npmConfigFileCreated": "Npm config file created",
200-
"authKeyEnvVarNotSet": "OMA_AUTH_KEY environment variable is not set, LWCs will not be deployed",
200+
"authKeyEnvVarNotSet": "The OMA_AUTH_KEY environment variable isn’t set. LWCs won't be deployed.",
201201
"experienceSiteException": "Exception occurred while processing experience sites",
202202
"reservedKeysFoundInPropertySet": "Reserved keys found in any of output response transformation fields: %s.",
203203
"incompleteMigrationDetected": "We couldn't complete the migration process",
@@ -210,7 +210,7 @@
210210
"skipFlexcardAngularOmniScriptDependencyWarning": "Skipping FlexCard %s due to Angular Omniscript dependencies",
211211
"flexCardMigrationProcessingMessage": "Processing %s FlexCards for migration (%s skipped due to Angular dependencies)",
212212
"noMetadataToDeploy": "No metadata to deploy",
213-
"manifestDeployementStarted": "Manifest deployment started with id: %s",
213+
"manifestDeployementStarted": "Manifest deployment started with ID: %s",
214214
"migrationConsentMessage": "Make sure that all records listed in the Assessment Status column in the Assessment Report are marked as Green before proceeding with the migration. Do you want to proceed? Yes or No?",
215215
"truncationFailed": "Truncation failed for %s: %s",
216216
"invalidTypeMigrateErrorMessage": "We couldn't migrate your Omnistudio components in the %s namespace. Select the correct namespace and try again",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,4 +160,4 @@
160160
"pre-push": "sf-husky-pre-push"
161161
}
162162
}
163-
}
163+
}

src/commands/omnistudio/migration/migrate.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -646,10 +646,10 @@ export default class Migrate extends OmniStudioBaseCommand {
646646
const mergedResults: MigratedRecordInfo[] = [];
647647

648648
for (const record of Array.from(migrationResults.records.values())) {
649-
const obj = {
649+
const obj: MigratedRecordInfo = {
650650
id: record['Id'],
651651
name: migrationTool.getRecordName(record),
652-
status: messages.getMessage('labelStatusSkipped'),
652+
status: 'Skipped',
653653
errors: record['errors'],
654654
migratedId: undefined,
655655
warnings: [],
@@ -663,11 +663,11 @@ export default class Migrate extends OmniStudioBaseCommand {
663663
errors = errors.concat(recordResults.errors || []);
664664

665665
if (recordResults?.skipped) {
666-
obj.status = messages.getMessage('labelStatusSkipped');
666+
obj.status = 'Skipped';
667667
} else if (!recordResults || recordResults.hasErrors) {
668-
obj.status = messages.getMessage('labelStatusFailed');
668+
obj.status = 'Failed';
669669
} else {
670-
obj.status = messages.getMessage('labelStatusComplete');
670+
obj.status = 'Complete';
671671
}
672672
obj.errors = errors;
673673
obj.migratedId = recordResults.id;

src/javascripts/reportGeneratorUtility.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,11 @@ function filterAndSearchTable(tableId) {
102102
const visibleRows = Array.from(table.rows).filter(
103103
(row) => row.style.display !== 'none' && row.id !== 'no-rows-message'
104104
);
105-
reportTable.querySelector('#row-count').textContent = `Showing ${visibleRows.length} record${
106-
visibleRows.length !== 1 ? 's' : ''
105+
106+
// filter only distinct classes from visibleRows
107+
const distinctClasses = [...new Set(visibleRows.map((row) => row.classList[0]))];
108+
reportTable.querySelector('#row-count').textContent = `Showing ${distinctClasses.length} record${
109+
distinctClasses.length !== 1 ? 's' : ''
107110
}`;
108111
}
109112

@@ -153,6 +156,21 @@ document.addEventListener('DOMContentLoaded', () => {
153156
document.querySelectorAll('.rpt-table-container').forEach((tableContainer) => {
154157
filterAndSearchTable(tableContainer.id);
155158
});
159+
160+
document.querySelectorAll('tr').forEach((row) => {
161+
row.addEventListener('mouseover', (event) => {
162+
const className = event.currentTarget.classList[0];
163+
document.querySelectorAll(`.${className}`).forEach((r) => {
164+
r.classList.add('highlight');
165+
});
166+
});
167+
row.addEventListener('mouseout', (event) => {
168+
const className = event.currentTarget.classList[0];
169+
document.querySelectorAll(`.${className}`).forEach((r) => {
170+
r.classList.remove('highlight');
171+
});
172+
});
173+
});
156174
});
157175

158176
function openReport(ele) {

src/migration/dataraptor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ export class DataRaptorMigrationTool extends BaseMigrationTool implements Migrat
288288
Logger.info(this.messages.getMessage('processingDataRaptor', [drName]));
289289
const warnings: string[] = [];
290290
const existingDRNameVal = new StringVal(drName, 'name');
291-
let assessmentStatus = 'Ready for migration';
291+
let assessmentStatus: 'Ready for migration' | 'Warnings' | 'Needs Manual Intervention' = 'Ready for migration';
292292

293293
if (!existingDRNameVal.isNameCleaned()) {
294294
warnings.push(

src/migration/flexcard.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,13 +211,13 @@ export class CardMigrationTool extends BaseMigrationTool implements MigrationToo
211211
infos: [],
212212
warnings: [],
213213
errors: [],
214-
migrationStatus: '',
214+
migrationStatus: 'Ready for migration',
215215
};
216216

217217
// Check for name changes due to API naming requirements
218218
const originalName: string = flexCardName;
219219
const cleanedName: string = this.cleanName(originalName);
220-
let assessmentStatus = 'Ready for migration';
220+
let assessmentStatus: 'Ready for migration' | 'Warnings' | 'Needs Manual Intervention' = 'Ready for migration';
221221
flexCardAssessmentInfo.name = this.allVersions ? `${cleanedName}_${version}` : cleanedName;
222222
if (cleanedName !== originalName) {
223223
flexCardAssessmentInfo.warnings.push(

src/migration/omniscript.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ export class OmniScriptMigrationTool extends BaseMigrationTool implements Migrat
470470
const existingSubTypeVal = new StringVal(existingSubType, 'sub type');
471471
const omniScriptName = omniscript[this.namespacePrefix + 'Name'];
472472
const existingOmniScriptNameVal = new StringVal(omniScriptName, 'name');
473-
let assessmentStatus = 'Ready for migration';
473+
let assessmentStatus: 'Ready for migration' | 'Warnings' | 'Needs Manual Intervention' = 'Ready for migration';
474474

475475
const warnings: string[] = [];
476476

@@ -627,7 +627,9 @@ export class OmniScriptMigrationTool extends BaseMigrationTool implements Migrat
627627
value.migrationSuccess = true;
628628
}
629629

630-
let finalKey = `${nameMapping.oldType}${nameMapping.oldSubtype}${nameMapping.oldLanguage}`;
630+
let finalKey = `${nameMapping.oldType}${nameMapping.oldSubtype}${this.cleanLanguageName(
631+
nameMapping.oldLanguage
632+
)}`;
631633

632634
finalKey = finalKey.toLowerCase();
633635
if (storage.osStorage.has(finalKey)) {
@@ -647,6 +649,11 @@ export class OmniScriptMigrationTool extends BaseMigrationTool implements Migrat
647649
StorageUtil.printAssessmentStorage();
648650
}
649651

652+
private cleanLanguageName(language: string): string {
653+
// replace -, ( and ) and space with ''
654+
return language.replace(/[-() ]/g, '');
655+
}
656+
650657
async migrate(): Promise<MigrationResult[]> {
651658
// Get All Records from OmniScript__c (IP & OS Parent Records)
652659
const omniscripts = await this.getAllOmniScripts();
@@ -1039,7 +1046,7 @@ export class OmniScriptMigrationTool extends BaseMigrationTool implements Migrat
10391046

10401047
let finalKey = `${oldrecord[this.namespacePrefix + 'Type__c']}${
10411048
oldrecord[this.namespacePrefix + 'SubType__c']
1042-
}${oldrecord[this.namespacePrefix + 'Language__c']}`;
1049+
}${this.cleanLanguageName(oldrecord[this.namespacePrefix + 'Language__c'])}`;
10431050

10441051
finalKey = finalKey.toLowerCase();
10451052
if (storage.osStorage.has(finalKey)) {

src/migration/related/ExperienceSiteMigration.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ export class ExperienceSiteMigration extends BaseRelatedObjectMigration {
120120
path: file.location,
121121
diff: JSON.stringify([]),
122122
hasOmnistudioContent: false,
123-
status: 'Can be Automated',
123+
status: 'Ready for migration',
124124
};
125125

126126
const lookupComponentName = `${this.namespace}:vlocityLWCOmniWrapper`;
@@ -179,7 +179,7 @@ export class ExperienceSiteMigration extends BaseRelatedObjectMigration {
179179
path: file.location,
180180
diff: JSON.stringify([]),
181181
hasOmnistudioContent: false,
182-
status: 'Errors',
182+
status: 'Failed',
183183
};
184184

185185
experienceSiteAssessmentInfos.push(experienceSiteAssessmentInfo);
@@ -256,7 +256,7 @@ export class ExperienceSiteMigration extends BaseRelatedObjectMigration {
256256
experienceSiteAssessmentInfo.warnings.push(
257257
'Target exists as empty string. Please check experience site configuration'
258258
);
259-
experienceSiteAssessmentInfo.status = 'Errors';
259+
experienceSiteAssessmentInfo.status = 'Needs Manual Intervention';
260260
return;
261261
}
262262

@@ -287,7 +287,7 @@ export class ExperienceSiteMigration extends BaseRelatedObjectMigration {
287287
if (this.shouldAddWarning(targetDataFromStorageFC)) {
288288
const warningMsg: string = this.getWarningMessage(flexcardName, targetDataFromStorageFC);
289289
experienceSiteAssessmentInfo.warnings.push(warningMsg);
290-
experienceSiteAssessmentInfo.status = 'Errors';
290+
experienceSiteAssessmentInfo.status = 'Needs Manual Intervention';
291291
} else {
292292
component.componentName = TARGET_COMPONENT_NAME_FC;
293293

@@ -316,7 +316,7 @@ export class ExperienceSiteMigration extends BaseRelatedObjectMigration {
316316
if (this.shouldAddWarning(targetDataFromStorage)) {
317317
const warningMsg: string = this.getWarningMessage(targetName, targetDataFromStorage);
318318
experienceSiteAssessmentInfo.warnings.push(warningMsg);
319-
experienceSiteAssessmentInfo.status = 'Errors';
319+
experienceSiteAssessmentInfo.status = 'Needs Manual Intervention';
320320
} else {
321321
component.componentName = TARGET_COMPONENT_NAME_OS;
322322

src/migration/related/FlexipageMigration.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export class FlexipageMigration extends BaseRelatedObjectMigration {
8686
}
8787

8888
/**
89-
* Processes FlexiPage files in either assessment or migration mode.
89+
* Processes FlexiPages in either assessment or migration mode.
9090
*
9191
* This method:
9292
* - Retrieves FlexiPage metadata from the Salesforce org
@@ -111,6 +111,9 @@ export class FlexipageMigration extends BaseRelatedObjectMigration {
111111
const filePath = path.join(flexiPageDir, file);
112112
try {
113113
const flexPageAssessmentInfo: FlexiPageAssessmentInfo = this.processFlexiPage(file, filePath, mode);
114+
if (!flexPageAssessmentInfo) {
115+
continue;
116+
}
114117
flexPageAssessmentInfos.push(flexPageAssessmentInfo);
115118
Logger.logVerbose(
116119
this.messages.getMessage('completedProcessingFlexiPage', [
@@ -119,37 +122,39 @@ export class FlexipageMigration extends BaseRelatedObjectMigration {
119122
])
120123
);
121124
} catch (error) {
125+
let status: 'Failed' | 'Needs Manual Intervention' = 'Failed';
122126
if (error instanceof KeyNotFoundInStorageError) {
123127
Logger.error(`${error.componentType} ${error.key} can't be migrated`);
128+
status = 'Needs Manual Intervention';
124129
} else if (error instanceof TargetPropertyNotFoundError) {
125130
Logger.error(error.message);
131+
status = 'Needs Manual Intervention';
126132
} else if (error instanceof DuplicateKeyError) {
127133
Logger.error(`${error.componentType} ${error.key} is duplicate`);
134+
status = 'Needs Manual Intervention';
128135
} else {
129136
Logger.error(this.messages.getMessage('errorProcessingFlexiPage', [file, error]));
130137
Logger.error(error);
138+
status = 'Failed';
131139
}
132140
flexPageAssessmentInfos.push({
133141
name: file,
134142
errors: [error instanceof Error ? error.message : JSON.stringify(error)],
135143
path: filePath,
136144
diff: '',
137-
status: mode === 'assess' ? 'Errors' : 'Failed',
145+
status,
138146
});
139147
}
140148
progressBar.increment();
141149
}
142150
progressBar.stop();
143151
Logger.logVerbose(this.messages.getMessage('completedProcessingAllFlexiPages', [flexPageAssessmentInfos.length]));
144-
const filteredResults = flexPageAssessmentInfos.filter(
145-
(flexPageAssessmentInfo) => flexPageAssessmentInfo.status !== 'No Changes'
146-
);
147-
Logger.log(this.messages.getMessage('flexipagesWithChanges', [filteredResults.length]));
148-
return filteredResults;
152+
Logger.log(this.messages.getMessage('flexipagesWithChanges', [flexPageAssessmentInfos.length]));
153+
return flexPageAssessmentInfos;
149154
}
150155

151156
/**
152-
* Processes a single FlexiPage file for assessment or migration.
157+
* Processes a single FlexiPage for assessment or migration.
153158
*
154159
* This method:
155160
* - Reads the FlexiPage XML file content
@@ -159,8 +164,8 @@ export class FlexipageMigration extends BaseRelatedObjectMigration {
159164
* - Writes transformed content back to file in migration mode
160165
* - Handles errors and provides detailed error information
161166
*
162-
* @param fileName - The name of the FlexiPage file
163-
* @param filePath - The full path to the FlexiPage file
167+
* @param fileName - The name of the FlexiPage
168+
* @param filePath - The full path to the FlexiPage
164169
* @param mode - The processing mode: 'assess' or 'migrate'
165170
* @returns FlexiPage assessment information with status and error details
166171
*/
@@ -172,13 +177,8 @@ export class FlexipageMigration extends BaseRelatedObjectMigration {
172177
const json = this.xmlUtil.parse(fileContent) as Flexipage;
173178
const transformedFlexiPage = transformFlexipageBundle(json, this.namespace, mode);
174179
if (transformedFlexiPage === false) {
175-
return {
176-
name: fileName,
177-
errors: [],
178-
path: filePath,
179-
diff: '',
180-
status: 'No Changes',
181-
};
180+
Logger.logVerbose(`No transformation needed on ${fileName}`);
181+
return null;
182182
}
183183
const modifiedContent = this.xmlUtil.build(transformedFlexiPage, 'FlexiPage');
184184

@@ -195,7 +195,7 @@ export class FlexipageMigration extends BaseRelatedObjectMigration {
195195
name: fileName,
196196
diff: JSON.stringify(diff),
197197
errors: [],
198-
status: mode === 'assess' ? 'Can be Automated' : 'Complete',
198+
status: mode === 'assess' ? 'Ready for migration' : 'Complete',
199199
};
200200
}
201201
}

0 commit comments

Comments
 (0)