private async _importPicklists()

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;
        }
    }