mirror of
https://github.com/Kingsrook/qqq-frontend-material-dashboard.git
synced 2025-07-17 21:00:45 +00:00
CE-1955 Add value-mapping details to diff
This commit is contained in:
@ -30,7 +30,7 @@ import QDynamicFormField from "qqq/components/forms/DynamicFormField";
|
|||||||
import SavedBulkLoadProfiles from "qqq/components/misc/SavedBulkLoadProfiles";
|
import SavedBulkLoadProfiles from "qqq/components/misc/SavedBulkLoadProfiles";
|
||||||
import {BulkLoadMapping, BulkLoadProfile, BulkLoadTableStructure, FileDescription, Wrapper} from "qqq/models/processes/BulkLoadModels";
|
import {BulkLoadMapping, BulkLoadProfile, BulkLoadTableStructure, FileDescription, Wrapper} from "qqq/models/processes/BulkLoadModels";
|
||||||
import {SubFormPreSubmitCallbackResultType} from "qqq/pages/processes/ProcessRun";
|
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
|
interface BulkLoadValueMappingFormProps
|
||||||
{
|
{
|
||||||
@ -67,6 +67,9 @@ const BulkLoadValueMappingForm = forwardRef(({processValues, setActiveStepLabel,
|
|||||||
const [fileDescription] = useState(new FileDescription(processValues.headerValues, processValues.headerLetters, processValues.bodyValuesPreview));
|
const [fileDescription] = useState(new FileDescription(processValues.headerValues, processValues.headerLetters, processValues.bodyValuesPreview));
|
||||||
fileDescription.setHasHeaderRow(currentMapping.hasHeaderRow);
|
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)
|
function mappedValueChanged(fileValue: string, newValue: any)
|
||||||
{
|
{
|
||||||
valueErrors[fileValue] = null;
|
valueErrors[fileValue] = null;
|
||||||
currentMapping.valueMappings[fieldFullName][fileValue] = newValue;
|
if(newValue == null)
|
||||||
|
{
|
||||||
|
delete currentMapping.valueMappings[fieldFullName][fileValue];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentMapping.valueMappings[fieldFullName][fileValue] = newValue;
|
||||||
|
}
|
||||||
|
forceUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ type FieldMapping = { [name: string]: BulkLoadField }
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
export class SavedBulkLoadProfileUtils
|
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;
|
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()}`)
|
diffs.push(valueMappingDiff);
|
||||||
}
|
|
||||||
|
|
||||||
if (baseMapping.valueMappings[fieldName] && activeMapping.valueMappings[fieldName])
|
|
||||||
{
|
|
||||||
// todo - finish this - better version than just the JSON diff!
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(e)
|
catch(e)
|
||||||
|
Reference in New Issue
Block a user