CE-1955 Add value-mapping details to diff

This commit is contained in:
2024-12-03 09:15:31 -06:00
parent 6db003026b
commit 4b64c46c57
2 changed files with 98 additions and 10 deletions

View File

@ -30,7 +30,7 @@ import QDynamicFormField from "qqq/components/forms/DynamicFormField";
import SavedBulkLoadProfiles from "qqq/components/misc/SavedBulkLoadProfiles";
import {BulkLoadMapping, BulkLoadProfile, BulkLoadTableStructure, FileDescription, Wrapper} from "qqq/models/processes/BulkLoadModels";
import {SubFormPreSubmitCallbackResultType} from "qqq/pages/processes/ProcessRun";
import React, {forwardRef, useEffect, useImperativeHandle, useState} from "react";
import React, {forwardRef, useEffect, useImperativeHandle, useReducer, useState} from "react";
interface BulkLoadValueMappingFormProps
{
@ -67,6 +67,9 @@ const BulkLoadValueMappingForm = forwardRef(({processValues, setActiveStepLabel,
const [fileDescription] = useState(new FileDescription(processValues.headerValues, processValues.headerLetters, processValues.bodyValuesPreview));
fileDescription.setHasHeaderRow(currentMapping.hasHeaderRow);
const [, forceUpdate] = useReducer((x) => x + 1, 0);
/*******************************************************************************
**
*******************************************************************************/
@ -152,7 +155,15 @@ const BulkLoadValueMappingForm = forwardRef(({processValues, setActiveStepLabel,
function mappedValueChanged(fileValue: string, newValue: any)
{
valueErrors[fileValue] = null;
currentMapping.valueMappings[fieldFullName][fileValue] = newValue;
if(newValue == null)
{
delete currentMapping.valueMappings[fieldFullName][fileValue];
}
else
{
currentMapping.valueMappings[fieldFullName][fileValue] = newValue;
}
forceUpdate();
}

View File

@ -28,7 +28,6 @@ type FieldMapping = { [name: string]: BulkLoadField }
***************************************************************************/
export class SavedBulkLoadProfileUtils
{
/***************************************************************************
**
***************************************************************************/
@ -172,6 +171,88 @@ export class SavedBulkLoadProfileUtils
}
/***************************************************************************
**
***************************************************************************/
private static joinUpToN(values: string[], n: number)
{
if(values.length <= n)
{
return (values.join(", "));
}
const others = values.length - n;
return (values.slice(0, n-1).join(", ") + ` and ${others} other${others == 1 ? "" : "s"}`);
}
/***************************************************************************
**
***************************************************************************/
private static diffFieldValueMappings(bulkLoadField: BulkLoadField, baseMapping: { [p: string]: any }, activeMapping: { [p: string]: any }): string
{
const addedMappings: string[] = [];
const removedMappings: string[] = [];
const changedMappings: string[] = [];
/////////////////////////////
// look for added mappings //
/////////////////////////////
for (let value of Object.keys(activeMapping))
{
if(!baseMapping[value])
{
addedMappings.push(value);
}
}
///////////////////////////////
// look for removed mappings //
///////////////////////////////
for (let value of Object.keys(baseMapping))
{
if(!activeMapping[value])
{
removedMappings.push(value);
}
}
///////////////////////////////
// look for changed mappings //
///////////////////////////////
for (let value of Object.keys(activeMapping))
{
if(baseMapping[value] && activeMapping[value] != baseMapping[value])
{
changedMappings.push(value);
}
}
if(addedMappings.length || removedMappings.length || changedMappings.length)
{
let rs = `Updated value mapping for ${bulkLoadField.getQualifiedLabel()}: `
const parts: string[] = [];
if(addedMappings.length)
{
parts.push(`Added value${addedMappings.length == 1 ? "" : "s"} for: ${this.joinUpToN(addedMappings, 5)}`);
}
if(removedMappings.length)
{
parts.push(`Removed value${removedMappings.length == 1 ? "" : "s"} for: ${this.joinUpToN(removedMappings, 5)}`);
}
if(changedMappings.length)
{
parts.push(`Changed value${changedMappings.length == 1 ? "" : "s"} for: ${this.joinUpToN(changedMappings, 5)}`);
}
return rs + parts.join("; ");
}
return null;
}
/***************************************************************************
**
***************************************************************************/
@ -213,14 +294,10 @@ export class SavedBulkLoadProfileUtils
{
const fieldName = bulkLoadField.field.name;
if (JSON.stringify(baseMapping.valueMappings[fieldName] ?? []) != JSON.stringify(activeMapping.valueMappings[fieldName] ?? []))
const valueMappingDiff = this.diffFieldValueMappings(bulkLoadField, baseMapping.valueMappings[fieldName] ?? {}, activeMapping.valueMappings[fieldName] ?? {});
if(valueMappingDiff)
{
diffs.push(`Changed value mapping for ${bulkLoadField.getQualifiedLabel()}`)
}
if (baseMapping.valueMappings[fieldName] && activeMapping.valueMappings[fieldName])
{
// todo - finish this - better version than just the JSON diff!
diffs.push(valueMappingDiff);
}
}
catch(e)