@talxis/base-controls 1.2601.1 → 1.2601.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -10,15 +10,40 @@ const useFetchXml = (context) => {
|
|
|
10
10
|
return cachedFetchXml.current[viewId];
|
|
11
11
|
};
|
|
12
12
|
const applyLookupQuery = async (entity, fetchXml, query) => {
|
|
13
|
+
const parser = new DOMParser();
|
|
14
|
+
const parsedFetchXml = parser.parseFromString(fetchXml, "application/xml");
|
|
15
|
+
const conditions = parsedFetchXml.getElementsByTagName("condition");
|
|
16
|
+
const placeholderConditions = [];
|
|
17
|
+
for (const cond of conditions) {
|
|
18
|
+
if (cond.getAttribute('value') === "{0}") {
|
|
19
|
+
if (query) {
|
|
20
|
+
cond.setAttribute('value', `%${query}%`);
|
|
21
|
+
}
|
|
22
|
+
placeholderConditions.push(cond);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
13
25
|
if (!query) {
|
|
14
|
-
|
|
26
|
+
for (const cond of placeholderConditions) {
|
|
27
|
+
const parentFilter = cond.parentElement;
|
|
28
|
+
parentFilter?.removeChild(cond);
|
|
29
|
+
if (parentFilter?.children.length === 0) {
|
|
30
|
+
const grandParent = parentFilter.parentElement;
|
|
31
|
+
grandParent?.removeChild(parentFilter);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return new XMLSerializer().serializeToString(parsedFetchXml);
|
|
35
|
+
}
|
|
36
|
+
if (placeholderConditions.length > 0) {
|
|
37
|
+
return new XMLSerializer().serializeToString(parsedFetchXml);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const metadata = await entity.metadata;
|
|
41
|
+
const xmlObject = FetchXmlBuilder.fetch.fromXml(fetchXml);
|
|
42
|
+
xmlObject.entity.addFilter(new FetchXmlBuilder.filter(FetchXmlBuilder.FilterType.Or, [
|
|
43
|
+
new FetchXmlBuilder.condition(metadata.PrimaryNameAttribute, FetchXmlBuilder.Operator.Like, [new FetchXmlBuilder.value(`%${query}%`)])
|
|
44
|
+
]));
|
|
45
|
+
return xmlObject.toXml();
|
|
15
46
|
}
|
|
16
|
-
const metadata = await entity.metadata;
|
|
17
|
-
const xmlObject = FetchXmlBuilder.fetch.fromXml(fetchXml);
|
|
18
|
-
xmlObject.entity.addFilter(new FetchXmlBuilder.filter(FetchXmlBuilder.FilterType.Or, [
|
|
19
|
-
new FetchXmlBuilder.condition(metadata.PrimaryNameAttribute, FetchXmlBuilder.Operator.Like, [new FetchXmlBuilder.value(`%${query}%`)])
|
|
20
|
-
]));
|
|
21
|
-
return xmlObject.toXml();
|
|
22
47
|
};
|
|
23
48
|
return [get, applyLookupQuery];
|
|
24
49
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFetchXml.js","sources":["../../../../src/components/Lookup/hooks/useFetchXml.ts"],"sourcesContent":["import { useRef } from \"react\"\nimport { IEntity } from \"../interfaces\";\nimport { FetchXmlBuilder } from \"@talxis/client-libraries\";\n\nexport const useFetchXml = (context: ComponentFramework.Context<any>): [\n (viewId: string) => Promise<{fetchxml: string, layoutjson: string}>,\n (entity: IEntity, fetchXml: string, query: string) => Promise<string>\n] => {\n const cachedFetchXml = useRef<{\n [viewId: string]: Promise<any>\n }>({});\n\n const get = async (viewId: string): Promise<{fetchxml: string, layoutjson: string}> => {\n if (!cachedFetchXml.current[viewId]) {\n cachedFetchXml.current[viewId] = context.webAPI.retrieveRecord('savedquery', viewId, '?$select=fetchxml,layoutjson');\n }\n\n return cachedFetchXml.current[viewId];\n }\n const applyLookupQuery = async (entity: IEntity, fetchXml: string, query: string): Promise<string> => {\n if (!query) {\n return
|
|
1
|
+
{"version":3,"file":"useFetchXml.js","sources":["../../../../src/components/Lookup/hooks/useFetchXml.ts"],"sourcesContent":["import { useRef } from \"react\"\nimport { IEntity } from \"../interfaces\";\nimport { FetchXmlBuilder } from \"@talxis/client-libraries\";\n\nexport const useFetchXml = (context: ComponentFramework.Context<any>): [\n (viewId: string) => Promise<{ fetchxml: string, layoutjson: string }>,\n (entity: IEntity, fetchXml: string, query: string) => Promise<string>\n] => {\n const cachedFetchXml = useRef<{\n [viewId: string]: Promise<any>\n }>({});\n\n const get = async (viewId: string): Promise<{ fetchxml: string, layoutjson: string }> => {\n if (!cachedFetchXml.current[viewId]) {\n cachedFetchXml.current[viewId] = context.webAPI.retrieveRecord('savedquery', viewId, '?$select=fetchxml,layoutjson');\n }\n\n return cachedFetchXml.current[viewId];\n }\n const applyLookupQuery = async (entity: IEntity, fetchXml: string, query: string): Promise<string> => {\n const parser = new DOMParser();\n const parsedFetchXml = parser.parseFromString(fetchXml, \"application/xml\");\n const conditions = parsedFetchXml.getElementsByTagName(\"condition\");\n const placeholderConditions: Element[] = [];\n for (const cond of conditions) {\n if (cond.getAttribute('value') === \"{0}\") {\n if(query) {\n cond.setAttribute('value', `%${query}%`);\n }\n placeholderConditions.push(cond);\n }\n }\n if (!query) {\n for (const cond of placeholderConditions) {\n const parentFilter = cond.parentElement;\n parentFilter?.removeChild(cond);\n if(parentFilter?.children.length === 0) {\n const grandParent = parentFilter.parentElement;\n grandParent?.removeChild(parentFilter);\n }\n }\n return new XMLSerializer().serializeToString(parsedFetchXml);\n }\n if (placeholderConditions.length > 0) {\n return new XMLSerializer().serializeToString(parsedFetchXml);\n }\n else {\n const metadata = await entity.metadata;\n const xmlObject = FetchXmlBuilder.fetch.fromXml(fetchXml);\n xmlObject.entity.addFilter(new FetchXmlBuilder.filter(FetchXmlBuilder.FilterType.Or, [\n new FetchXmlBuilder.condition(metadata.PrimaryNameAttribute, FetchXmlBuilder.Operator.Like, [new FetchXmlBuilder.value(`%${query}%`)])\n ]))\n return xmlObject.toXml();\n }\n }\n return [get, applyLookupQuery]\n}"],"names":[],"mappings":";;;AAIa,MAAA,WAAW,GAAG,CAAC,OAAwC,KAGhE;AACA,IAAA,MAAM,cAAc,GAAG,MAAM,CAE1B,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,GAAG,GAAG,OAAO,MAAc,KAAuD;AACpF,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACjC,YAAA,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,8BAA8B,CAAC,CAAC;AACxH,SAAA;AAED,QAAA,OAAO,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC1C,KAAC,CAAA;IACD,MAAM,gBAAgB,GAAG,OAAO,MAAe,EAAE,QAAgB,EAAE,KAAa,KAAqB;AACjG,QAAA,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,cAAc,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACpE,MAAM,qBAAqB,GAAc,EAAE,CAAC;AAC5C,QAAA,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;YAC3B,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,KAAK,EAAE;AACtC,gBAAA,IAAG,KAAK,EAAE;oBACN,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAI,CAAA,EAAA,KAAK,CAAG,CAAA,CAAA,CAAC,CAAC;AAC5C,iBAAA;AACD,gBAAA,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpC,aAAA;AACJ,SAAA;QACD,IAAI,CAAC,KAAK,EAAE;AACR,YAAA,KAAK,MAAM,IAAI,IAAI,qBAAqB,EAAE;AACtC,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC;AACxC,gBAAA,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;AAChC,gBAAA,IAAG,YAAY,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACpC,oBAAA,MAAM,WAAW,GAAG,YAAY,CAAC,aAAa,CAAC;AAC/C,oBAAA,WAAW,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,iBAAA;AACJ,aAAA;YACD,OAAO,IAAI,aAAa,EAAE,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;AAChE,SAAA;AACD,QAAA,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE;YAClC,OAAO,IAAI,aAAa,EAAE,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;AAChE,SAAA;AACI,aAAA;AACD,YAAA,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACvC,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC1D,YAAA,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,EAAE;gBACjF,IAAI,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC;AACzI,aAAA,CAAC,CAAC,CAAA;AACH,YAAA,OAAO,SAAS,CAAC,KAAK,EAAE,CAAC;AAC5B,SAAA;AACL,KAAC,CAAA;AACD,IAAA,OAAO,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAA;AAClC;;;;"}
|
|
@@ -123,7 +123,7 @@ const useLookup = (props) => {
|
|
|
123
123
|
case "partylist":
|
|
124
124
|
case "owner":
|
|
125
125
|
case "customer":
|
|
126
|
-
primaryName = entity[`_${
|
|
126
|
+
primaryName = entity[`_${attribute}_value@OData.Community.Display.V1.FormattedValue`];
|
|
127
127
|
break;
|
|
128
128
|
case "optionset":
|
|
129
129
|
case "picklist":
|
|
@@ -135,13 +135,13 @@ const useLookup = (props) => {
|
|
|
135
135
|
case "decimal":
|
|
136
136
|
case "money":
|
|
137
137
|
//TODO: Introduce user formatting, this approach takes format from application user setting
|
|
138
|
-
primaryName = entity[`${
|
|
138
|
+
primaryName = entity[`${attribute}@OData.Community.Display.V1.FormattedValue`];
|
|
139
139
|
break;
|
|
140
140
|
case "datetime":
|
|
141
|
-
primaryName = props.context.formatting.formatTime(dayjs(entity[
|
|
141
|
+
primaryName = props.context.formatting.formatTime(dayjs(entity[attribute]).toDate(), 1);
|
|
142
142
|
break;
|
|
143
143
|
default:
|
|
144
|
-
primaryName = entity[
|
|
144
|
+
primaryName = entity[attribute];
|
|
145
145
|
}
|
|
146
146
|
return (primaryName ??
|
|
147
147
|
entity[entityMetadata.PrimaryNameAttribute] ??
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLookup.js","sources":["../../../../src/components/Lookup/hooks/useLookup.ts"],"sourcesContent":["import { useState } from \"react\";\nimport { ITranslation, useControl } from \"../../../hooks\";\nimport { IEntity, ILayout, ILookup, IMetadata } from \"../interfaces\";\nimport { lookupTranslations } from \"../translations\";\nimport { useFetchXml } from \"./useFetchXml\";\nimport { ITheme } from \"@talxis/react-components\";\nimport dayjs from \"dayjs\";\n\nexport const useLookup = (props: ILookup): [\n ComponentFramework.LookupValue[],\n IEntity[],\n ITranslation<Required<ILookup>['translations']>,\n {\n create: (entityName: string) => void,\n select: (record: ComponentFramework.LookupValue[] | undefined) => void,\n deselect: (record: ComponentFramework.LookupValue) => void,\n },\n (entityName: string | null) => void,\n (query: string) => Promise<(ComponentFramework.LookupValue & { entityData: { [key: string]: any }, layout: ILayout })[]>,\n ITheme\n] => {\n\n const targets = props.parameters.value.attributes.Targets;\n const boundValue = props.parameters.value.raw;\n const context = props.context;\n const { labels, theme, onNotifyOutputChanged } = useControl('Lookup', props, lookupTranslations);\n const [getFetchXml, applyLookupQuery] = useFetchXml(context);\n\n const [entities, setEntities] = useState<IEntity[]>(() => {\n return targets.map(target => {\n return {\n entityName: target,\n selected: targets.length === 1 ? true : false,\n metadata: window.Xrm.Utility.getEntityMetadata(target, []) as any,\n }\n })\n });\n\n const selectedEntity = entities.find(x => x.selected);\n\n const selectEntity = (entityName: string | null) => {\n setEntities([...entities as IEntity[]].map(entity => {\n return {\n entityName: entity.entityName,\n metadata: entity.metadata,\n selected: entity.entityName === entityName\n }\n }))\n }\n\n const selectRecords = (records: ComponentFramework.LookupValue[] | undefined) => {\n onNotifyOutputChanged({\n value: records\n })\n }\n const getSearchFetchXml = async (entityName: string, query: string, viewIdCallBack: (id: string) => void): Promise<string> => {\n const response = (await props.parameters.value.getAllViews(entityName)).find(x => x.isDefault);\n if (!response?.viewId) {\n throw new Error(`Entity ${entityName} does not have a default view id!`);\n }\n viewIdCallBack(response.viewId);\n let fetchXml = response?.fetchXml\n if (!fetchXml) {\n fetchXml = (await getFetchXml(response.viewId)).fetchxml;\n }\n return applyLookupQuery(entities.find(x => x.entityName === entityName)!, fetchXml, query);\n\n }\n const getSearchResults = async (query: string): Promise<(ComponentFramework.LookupValue & { entityData: { [key: string]: any }, layout: ILayout })[]> => {\n if (props.onSearch) {\n return props.onSearch(selectedEntity ? [selectedEntity?.entityName] : targets, query) as any;\n }\n const fetchXmlMap = new Map<string, Promise<string>>();\n const entityViewIdMap = new Map<string, string>();\n if (selectedEntity) {\n fetchXmlMap.set(selectedEntity.entityName, getSearchFetchXml(selectedEntity.entityName, query, (viewId) => entityViewIdMap.set(selectedEntity.entityName, viewId)))\n }\n else {\n for (const entity of targets) {\n fetchXmlMap.set(entity, getSearchFetchXml(entity, query, (viewId) => entityViewIdMap.set(entity, viewId)))\n }\n }\n await Promise.all(fetchXmlMap.values());\n const responsePromiseMap = new Map<string, Promise<ComponentFramework.WebApi.RetrieveMultipleResponse>>()\n const aliasEntityMap: { aliasAttribute: string, entityAttribute: string }[] = [];\n const domParser = new DOMParser();\n for (const [entityName, fetchXml] of fetchXmlMap) {\n const fetchXMLresult = await fetchXml;\n responsePromiseMap.set(entityName, context.webAPI.retrieveMultipleRecords(entityName, `?$top=25&fetchXml=${encodeURIComponent((fetchXMLresult))}`))\n //parsing of link entities from fetchXML\n const xml = domParser.parseFromString(fetchXMLresult, \"application/xml\");\n const linkEntities = xml.querySelectorAll(`link-entity`);\n for (const linkEntity of linkEntities) {\n const aliasAttribute = linkEntity.getAttribute('alias');\n const entityAttribute = linkEntity.getAttribute('name');\n if (entityAttribute) {\n aliasEntityMap.push({ aliasAttribute: aliasAttribute ?? entityAttribute, entityAttribute: entityAttribute })\n }\n else {\n throw Error(\"Link-entity without name property is not supported. Offedning query: \" + fetchXMLresult);\n }\n }\n }\n await Promise.all(responsePromiseMap.values());\n const result: (ComponentFramework.LookupValue & { entityData: { [key: string]: any }, layout: ILayout })[] = [];\n for (const [entityName, response] of responsePromiseMap) {\n const layout: ILayout = JSON.parse((await getFetchXml(entityViewIdMap.get(entityName)!)).layoutjson ?? \"{}\");\n //Mapping link-entities' logical names to layout's Cell \n if (layout.Rows.some(x => x.Cells.some(x => x.Name.includes(\".\")))) {\n const cellsToModify = layout.Rows.flatMap(row => row.Cells)\n .filter(cell => cell.Name.includes(\".\"));\n\n cellsToModify.forEach(cell => {\n const alias = cell.Name.split(\".\")[0]\n cell.RelatedEntityName = aliasEntityMap.find(x => x.aliasAttribute === alias)?.entityAttribute ?? \"\";\n });\n }\n for (const entity of (await response).entities) {\n const entityMetadata = await entities.find(x => x.entityName === entityName)!.metadata;\n result.push({\n entityType: entityName,\n id: entity[entityMetadata.PrimaryIdAttribute],\n name: await getPrimaryName(entity, entityName, layout.Rows?.[0]?.Cells?.[0]?.Name, layout),\n entityData: entity,\n layout: layout\n });\n }\n }\n return result;\n }\n\n const getPrimaryName = async (\n entity: ComponentFramework.WebApi.Entity,\n entityName: string,\n attribute: string,\n layout: ILayout\n ): Promise<string> => {\n let targetEntityName = entityName;\n let targetAttribute = attribute;\n //checking for attributes pointing to related entity attribute, given by convention of using dot as separator\n if (attribute.includes(\".\")) {\n targetEntityName = layout.Rows.find(x => x.Cells)?.Cells?.find(y => y.Name === attribute)?.RelatedEntityName || entityName;\n targetAttribute = attribute.split(\".\")[1]\n }\n const entityMetadata: ComponentFramework.PropertyHelper.EntityMetadata = await window.Xrm.Utility.getEntityMetadata(targetEntityName, [targetAttribute]);\n const attributetype: string = entityMetadata.Attributes.get(targetAttribute).AttributeTypeName;\n let primaryName: string;\n switch (attributetype.toLowerCase()) {\n case \"lookup\":\n case \"partylist\":\n case \"owner\":\n case \"customer\":\n primaryName = entity[`_${targetAttribute}_value@OData.Community.Display.V1.FormattedValue`];\n break;\n case \"optionset\":\n case \"picklist\":\n case \"state\":\n case \"status\":\n case \"boolean\":\n case \"integer\":\n case \"bigint\":\n case \"decimal\":\n case \"money\":\n //TODO: Introduce user formatting, this approach takes format from application user setting\n primaryName = entity[`${targetAttribute}@OData.Community.Display.V1.FormattedValue`];\n break;\n case \"datetime\":\n primaryName = props.context.formatting.formatTime(dayjs(entity[targetAttribute]).toDate(), 1);\n break\n default:\n primaryName = entity[targetAttribute];\n };\n return (\n primaryName ??\n entity[entityMetadata.PrimaryNameAttribute] ??\n labels.noName()\n );\n };\n\n const createRecord = async (entityName: string) => {\n const formParameters = props.onGetOnCreateFormParameters?.(entityName)\n const result = await context.navigation.openForm({\n entityName: entityName,\n useQuickCreateForm: true\n }, formParameters);\n if (!result.savedEntityReference) {\n return;\n }\n onNotifyOutputChanged({\n value: [\n ...boundValue,\n ...result.savedEntityReference\n ]\n });\n }\n\n const deselectRecord = (record: ComponentFramework.LookupValue) => {\n const map = new Map<string, ComponentFramework.LookupValue>(boundValue.map(value => [value.id, value]));\n map.delete(record.id);\n onNotifyOutputChanged({\n value: [...map.values()]\n })\n }\n\n return [\n boundValue, entities, labels, {\n create: createRecord,\n deselect: deselectRecord,\n select: selectRecords\n },\n selectEntity,\n getSearchResults,\n theme\n ];\n};"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useLookup.js","sources":["../../../../src/components/Lookup/hooks/useLookup.ts"],"sourcesContent":["import { useState } from \"react\";\nimport { ITranslation, useControl } from \"../../../hooks\";\nimport { IEntity, ILayout, ILookup, IMetadata } from \"../interfaces\";\nimport { lookupTranslations } from \"../translations\";\nimport { useFetchXml } from \"./useFetchXml\";\nimport { ITheme } from \"@talxis/react-components\";\nimport dayjs from \"dayjs\";\n\nexport const useLookup = (props: ILookup): [\n ComponentFramework.LookupValue[],\n IEntity[],\n ITranslation<Required<ILookup>['translations']>,\n {\n create: (entityName: string) => void,\n select: (record: ComponentFramework.LookupValue[] | undefined) => void,\n deselect: (record: ComponentFramework.LookupValue) => void,\n },\n (entityName: string | null) => void,\n (query: string) => Promise<(ComponentFramework.LookupValue & { entityData: { [key: string]: any }, layout: ILayout })[]>,\n ITheme\n] => {\n\n const targets = props.parameters.value.attributes.Targets;\n const boundValue = props.parameters.value.raw;\n const context = props.context;\n const { labels, theme, onNotifyOutputChanged } = useControl('Lookup', props, lookupTranslations);\n const [getFetchXml, applyLookupQuery] = useFetchXml(context);\n\n const [entities, setEntities] = useState<IEntity[]>(() => {\n return targets.map(target => {\n return {\n entityName: target,\n selected: targets.length === 1 ? true : false,\n metadata: window.Xrm.Utility.getEntityMetadata(target, []) as any,\n }\n })\n });\n\n const selectedEntity = entities.find(x => x.selected);\n\n const selectEntity = (entityName: string | null) => {\n setEntities([...entities as IEntity[]].map(entity => {\n return {\n entityName: entity.entityName,\n metadata: entity.metadata,\n selected: entity.entityName === entityName\n }\n }))\n }\n\n const selectRecords = (records: ComponentFramework.LookupValue[] | undefined) => {\n onNotifyOutputChanged({\n value: records\n })\n }\n const getSearchFetchXml = async (entityName: string, query: string, viewIdCallBack: (id: string) => void): Promise<string> => {\n const response = (await props.parameters.value.getAllViews(entityName)).find(x => x.isDefault);\n if (!response?.viewId) {\n throw new Error(`Entity ${entityName} does not have a default view id!`);\n }\n viewIdCallBack(response.viewId);\n let fetchXml = response?.fetchXml\n if (!fetchXml) {\n fetchXml = (await getFetchXml(response.viewId)).fetchxml;\n }\n return applyLookupQuery(entities.find(x => x.entityName === entityName)!, fetchXml, query);\n\n }\n const getSearchResults = async (query: string): Promise<(ComponentFramework.LookupValue & { entityData: { [key: string]: any }, layout: ILayout })[]> => {\n if (props.onSearch) {\n return props.onSearch(selectedEntity ? [selectedEntity?.entityName] : targets, query) as any;\n }\n const fetchXmlMap = new Map<string, Promise<string>>();\n const entityViewIdMap = new Map<string, string>();\n if (selectedEntity) {\n fetchXmlMap.set(selectedEntity.entityName, getSearchFetchXml(selectedEntity.entityName, query, (viewId) => entityViewIdMap.set(selectedEntity.entityName, viewId)))\n }\n else {\n for (const entity of targets) {\n fetchXmlMap.set(entity, getSearchFetchXml(entity, query, (viewId) => entityViewIdMap.set(entity, viewId)))\n }\n }\n await Promise.all(fetchXmlMap.values());\n const responsePromiseMap = new Map<string, Promise<ComponentFramework.WebApi.RetrieveMultipleResponse>>()\n const aliasEntityMap: { aliasAttribute: string, entityAttribute: string }[] = [];\n const domParser = new DOMParser();\n for (const [entityName, fetchXml] of fetchXmlMap) {\n const fetchXMLresult = await fetchXml;\n responsePromiseMap.set(entityName, context.webAPI.retrieveMultipleRecords(entityName, `?$top=25&fetchXml=${encodeURIComponent((fetchXMLresult))}`))\n //parsing of link entities from fetchXML\n const xml = domParser.parseFromString(fetchXMLresult, \"application/xml\");\n const linkEntities = xml.querySelectorAll(`link-entity`);\n for (const linkEntity of linkEntities) {\n const aliasAttribute = linkEntity.getAttribute('alias');\n const entityAttribute = linkEntity.getAttribute('name');\n if (entityAttribute) {\n aliasEntityMap.push({ aliasAttribute: aliasAttribute ?? entityAttribute, entityAttribute: entityAttribute })\n }\n else {\n throw Error(\"Link-entity without name property is not supported. Offedning query: \" + fetchXMLresult);\n }\n }\n }\n await Promise.all(responsePromiseMap.values());\n const result: (ComponentFramework.LookupValue & { entityData: { [key: string]: any }, layout: ILayout })[] = [];\n for (const [entityName, response] of responsePromiseMap) {\n const layout: ILayout = JSON.parse((await getFetchXml(entityViewIdMap.get(entityName)!)).layoutjson ?? \"{}\");\n //Mapping link-entities' logical names to layout's Cell \n if (layout.Rows.some(x => x.Cells.some(x => x.Name.includes(\".\")))) {\n const cellsToModify = layout.Rows.flatMap(row => row.Cells)\n .filter(cell => cell.Name.includes(\".\"));\n\n cellsToModify.forEach(cell => {\n const alias = cell.Name.split(\".\")[0]\n cell.RelatedEntityName = aliasEntityMap.find(x => x.aliasAttribute === alias)?.entityAttribute ?? \"\";\n });\n }\n for (const entity of (await response).entities) {\n const entityMetadata = await entities.find(x => x.entityName === entityName)!.metadata;\n result.push({\n entityType: entityName,\n id: entity[entityMetadata.PrimaryIdAttribute],\n name: await getPrimaryName(entity, entityName, layout.Rows?.[0]?.Cells?.[0]?.Name, layout),\n entityData: entity,\n layout: layout\n });\n }\n }\n return result;\n }\n\n const getPrimaryName = async (\n entity: ComponentFramework.WebApi.Entity,\n entityName: string,\n attribute: string,\n layout: ILayout\n ): Promise<string> => {\n let targetEntityName = entityName;\n let targetAttribute = attribute;\n //checking for attributes pointing to related entity attribute, given by convention of using dot as separator\n if (attribute.includes(\".\")) {\n targetEntityName = layout.Rows.find(x => x.Cells)?.Cells?.find(y => y.Name === attribute)?.RelatedEntityName || entityName;\n targetAttribute = attribute.split(\".\")[1]\n }\n const entityMetadata: ComponentFramework.PropertyHelper.EntityMetadata = await window.Xrm.Utility.getEntityMetadata(targetEntityName, [targetAttribute]);\n const attributetype: string = entityMetadata.Attributes.get(targetAttribute).AttributeTypeName;\n let primaryName: string;\n switch (attributetype.toLowerCase()) {\n case \"lookup\":\n case \"partylist\":\n case \"owner\":\n case \"customer\":\n primaryName = entity[`_${attribute}_value@OData.Community.Display.V1.FormattedValue`];\n break;\n case \"optionset\":\n case \"picklist\":\n case \"state\":\n case \"status\":\n case \"boolean\":\n case \"integer\":\n case \"bigint\":\n case \"decimal\":\n case \"money\":\n //TODO: Introduce user formatting, this approach takes format from application user setting\n primaryName = entity[`${attribute}@OData.Community.Display.V1.FormattedValue`];\n break;\n case \"datetime\":\n primaryName = props.context.formatting.formatTime(dayjs(entity[attribute]).toDate(), 1);\n break\n default:\n primaryName = entity[attribute];\n };\n return (\n primaryName ??\n entity[entityMetadata.PrimaryNameAttribute] ??\n labels.noName()\n );\n };\n\n const createRecord = async (entityName: string) => {\n const formParameters = props.onGetOnCreateFormParameters?.(entityName)\n const result = await context.navigation.openForm({\n entityName: entityName,\n useQuickCreateForm: true\n }, formParameters);\n if (!result.savedEntityReference) {\n return;\n }\n onNotifyOutputChanged({\n value: [\n ...boundValue,\n ...result.savedEntityReference\n ]\n });\n }\n\n const deselectRecord = (record: ComponentFramework.LookupValue) => {\n const map = new Map<string, ComponentFramework.LookupValue>(boundValue.map(value => [value.id, value]));\n map.delete(record.id);\n onNotifyOutputChanged({\n value: [...map.values()]\n })\n }\n\n return [\n boundValue, entities, labels, {\n create: createRecord,\n deselect: deselectRecord,\n select: selectRecords\n },\n selectEntity,\n getSearchResults,\n theme\n ];\n};"],"names":[],"mappings":"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"}
|