in src/Common/ProcessImporter.ts [554:617]
private async _importPicklists(payload: IProcessPayload): Promise<void> {
assert(payload.targetAccountInformation && payload.targetAccountInformation.fieldRefNameToPicklistId, "[Unexpected] - targetInformation not properly populated");
const targetFieldToPicklistId = payload.targetAccountInformation.fieldRefNameToPicklistId;
const processedFieldRefNames: IDictionaryStringTo<boolean> = {};
for (const picklistEntry of payload.witFieldPicklists) {
if (processedFieldRefNames[picklistEntry.fieldRefName] === true) {
continue; // Skip since we already processed the field, it might be referenced by different work item type
}
const targetPicklistId = targetFieldToPicklistId[picklistEntry.fieldRefName];
if (targetPicklistId && targetPicklistId !== PICKLIST_NO_ACTION) {
// Picklist exists but items not match, update items
let newpicklist: WITProcessDefinitionsInterfaces.PickListModel = <any>{};
Object.assign(newpicklist, picklistEntry.picklist);
newpicklist.id = targetPicklistId;
try {
const updatedPicklist = await Engine.Task(
() => this._witProcessDefinitionApi.updateList(newpicklist, targetPicklistId),
`Update picklist '${targetPicklistId}' for field '${picklistEntry.fieldRefName}'`);
// validate the updated list matches expectation
if (!updatedPicklist || !updatedPicklist.id) {
throw new ImportError(`Update picklist '${targetPicklistId}' for field '${picklistEntry.fieldRefName}' was not successful, result is emtpy, possibly the picklist does not exist on target collection`);
}
if (updatedPicklist.items.length !== picklistEntry.picklist.items.length) {
throw new ImportError(`Update picklist '${targetPicklistId}' for field '${picklistEntry.fieldRefName}' was not successful, items number does not match.`);
}
for (const item of updatedPicklist.items) {
if (!picklistEntry.picklist.items.some(i => i.value === item.value)) {
throw new ImportError(`Update picklist '${targetPicklistId}' for field '${picklistEntry.fieldRefName}' was not successful, item '${item.value}' does not match expected`);
}
}
}
catch (error) {
Utility.handleKnownError(error);
throw new ImportError(`Failed to update picklist '${targetPicklistId} for field '${picklistEntry.fieldRefName}', check logs for details.`);
}
}
else if (!targetPicklistId) {
// Target field does not exist we need create picklist to be used when create field.
picklistEntry.picklist.name = `picklist_${Guid.create()}`; // Avoid conflict on target
try {
const createdPicklist = await Engine.Task(
() => this._witProcessDefinitionApi.createList(picklistEntry.picklist),
`Create picklist for field ${picklistEntry.fieldRefName}`);
if (!createdPicklist || !createdPicklist.id) {
throw new ImportError(`Failed to create picklist for field ${picklistEntry.fieldRefName}, server returned empty result or id.`);
}
targetFieldToPicklistId[picklistEntry.fieldRefName] = createdPicklist.id;
}
catch (error) {
Utility.handleKnownError(error);
throw new ImportError(`Failed to create picklist for field ${picklistEntry.fieldRefName}, see logs for details.`);
}
}
processedFieldRefNames[picklistEntry.fieldRefName] = true;
}
}