Skip to content

Commit b383508

Browse files
fixed formatting issue in case of aggregation (#23)
* fixed formatting issue in case of aggregation
1 parent cca6922 commit b383508

File tree

4 files changed

+67
-15
lines changed

4 files changed

+67
-15
lines changed

FetchToSubgrid/components/ComandBar.tsx

+2-4
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,9 @@ export const CommandBar = ({
3131
displayName.current = await dataverseService.getEntityDisplayName(entityName);
3232
};
3333
fetchDisplayName();
34-
}, []);
34+
}, [entityName]);
3535

36-
const handleNewButtonClick = () => {
37-
dataverseService.openRecordForm(entityName, '');
38-
};
36+
const handleNewButtonClick = () => dataverseService.openNewRecord(entityName);
3937

4038
const handleDeleteButtonClick = async () => {
4139
const deleteDialogStatus = await dataverseService.openRecordDeleteDialog(entityName);

FetchToSubgrid/services/dataverseService.ts

+52
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable prefer-destructuring */
12
import { IInputs } from '../generated/ManifestTypes';
23
import { WholeNumberType } from '../@types/enums';
34
import { IAppWrapperProps } from '../components/AppWrapper';
@@ -23,12 +24,20 @@ export interface IDataverseService {
2324
openPrimaryEntityForm(entity: Entity, entityName: string): void;
2425
openErrorDialog(error: Error): Promise<void>;
2526
openRecordDeleteDialog(entityName: string): Promise<DialogResponse>;
27+
getRelationships(parentEntityName: string): any;
28+
openNewRecord(entityName: string): void;
2629
deleteSelectedRecords(
2730
selectedRecordIds: string[],
2831
entityName: string,
2932
): Promise<void>;
3033
}
3134

35+
type RelationshipEntity = {
36+
ReferencingEntity: string;
37+
ReferencingAttribute: string;
38+
MetadataId: string;
39+
};
40+
3241
export class DataverseService implements IDataverseService {
3342
private _context: ComponentFramework.Context<IInputs>;
3443

@@ -73,6 +82,49 @@ export class DataverseService implements IDataverseService {
7382
return results;
7483
}
7584

85+
public async openNewRecord(entityName: string): Promise<void> {
86+
// @ts-ignore
87+
const contextPage = this._context.page;
88+
// @ts-ignore
89+
const lookupName: string = this._context.mode.contextInfo.entityRecordName;
90+
const parentEntityName: string = contextPage.entityTypeName;
91+
const entityId: string = contextPage.entityId;
92+
93+
const relationshipEntities: RelationshipEntity[] = await this.getRelationships(
94+
parentEntityName);
95+
96+
const relationship: RelationshipEntity | undefined = relationshipEntities.find(
97+
relationshipEntity => relationshipEntity.ReferencingEntity === entityName);
98+
99+
if (relationship) {
100+
const lookup: { id: string, name: string, entityType: string } =
101+
{ id: entityId, name: lookupName, entityType: parentEntityName };
102+
const formParameters: { [key: string]: string } =
103+
{ [relationship.ReferencingAttribute]: JSON.stringify(lookup) };
104+
105+
this._context.navigation.openForm({ entityName }, formParameters)
106+
.then((success: unknown) => console.log(success))
107+
.catch((error: unknown) => console.log(error));
108+
}
109+
else {
110+
this._context.navigation.openForm({ entityName });
111+
}
112+
}
113+
114+
public async getRelationships(parentEntityName: string): Promise<RelationshipEntity[]> {
115+
// @ts-ignore
116+
const contextPage = this._context.page;
117+
const entityDefinitions = `/api/data/v9.2/EntityDefinitions(LogicalName='${parentEntityName}')`;
118+
const relationships = `OneToManyRelationships($select=ReferencingEntity,ReferencingAttribute)`;
119+
const logicalName = '&$select=LogicalName';
120+
121+
const response: Response = await fetch(
122+
`${contextPage.getClientUrl()}${entityDefinitions}?$expand=${relationships}${logicalName}`);
123+
124+
const result = await response.json();
125+
return result.OneToManyRelationships;
126+
}
127+
76128
public getWholeNumberFieldName(
77129
format: string,
78130
entity: Entity,

FetchToSubgrid/utilities/d365Utils.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { IDataverseService } from '../services/dataverseService';
44
import {
55
checkIfAttributeRequiresFormattedValue,
66
checkIfAttributeIsEntityReference,
7-
genereateItemsForEntity,
8-
genereateItemsForLinkEntity,
7+
generateItemsForEntity,
8+
generateItemsForLinkEntity,
99
} from './utils';
1010
import {
1111
addPagingToFetchXml,
@@ -203,7 +203,7 @@ export const getEntityData = (props: IItemProps, dataverseService: IDataverseSer
203203
return [entity[fieldName], false];
204204
};
205205

206-
export const genereateItems = (props: IItemProps, dataverseService: IDataverseService): Entity => {
206+
export const generateItems = (props: IItemProps, dataverseService: IDataverseService): Entity => {
207207
const {
208208
item,
209209
isLinkEntity,
@@ -224,7 +224,9 @@ export const genereateItems = (props: IItemProps, dataverseService: IDataverseSe
224224
: getFetchXmlAttributesData(pagingFetchData, false);
225225

226226
return item[entityAggregateAttrNames[index]] = {
227-
displayName: entity[entityAggregateAttrNames[index]],
227+
displayName: !hasAggregate
228+
? entity[entityAggregateAttrNames[index]]
229+
: entity[`${entityAggregateAttrNames[index]}@OData.Community.Display.V1.FormattedValue`],
228230
isLinkable: false,
229231
entity,
230232
fieldName,
@@ -307,8 +309,8 @@ export const getItems = async (
307309
recordsData.records.entities.forEach(entity => {
308310
const item: Entity = isAggregate(fetchXml) ? {} : { id: entity[`${recordsData.entityName}id`] };
309311

310-
genereateItemsForEntity(recordsData, item, entity, dataverseService);
311-
genereateItemsForLinkEntity(recordsData, item, entity, dataverseService);
312+
generateItemsForEntity(recordsData, item, entity, dataverseService);
313+
generateItemsForLinkEntity(recordsData, item, entity, dataverseService);
312314

313315
items.push(item);
314316
});

FetchToSubgrid/utilities/utils.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as React from 'react';
22
import { IColumn } from '@fluentui/react';
3-
import { genereateItems, getColumns, getItems, IItemProps } from './d365Utils';
3+
import { generateItems, getColumns, getItems, IItemProps } from './d365Utils';
44
import { AttributeType } from '../@types/enums';
55
import { getFetchXmlParserError, getOrderInFetchXml } from './fetchXmlUtils';
66
import { LinkableItem } from '../components/LinkableItems';
@@ -223,7 +223,7 @@ export const getAttributeAliasName = (
223223
return attribute.attributeAlias;
224224
};
225225

226-
export const genereateItemsForEntity = (
226+
export const generateItemsForEntity = (
227227
recordsData: IRecordsData, item: Entity, entity: Entity, dataverseService: IDataverseService) => {
228228

229229
recordsData.attributesFieldNames.forEach((fieldName: any, index: number) => {
@@ -248,11 +248,11 @@ export const genereateItemsForEntity = (
248248
hasAliasValue,
249249
};
250250

251-
genereateItems(attributes, dataverseService);
251+
generateItems(attributes, dataverseService);
252252
});
253253
};
254254

255-
export const genereateItemsForLinkEntity = (
255+
export const generateItemsForLinkEntity = (
256256
recordsData: IRecordsData, item: Entity, entity: Entity, dataverseService: IDataverseService) => {
257257
recordsData.linkEntityNames.forEach((linkEntityName: string, i: number) => {
258258
recordsData.linkEntityAttributes[i].forEach((attr: any, index: number) => {
@@ -274,7 +274,7 @@ export const genereateItemsForLinkEntity = (
274274
hasAliasValue,
275275
};
276276

277-
genereateItems(attributes, dataverseService);
277+
generateItems(attributes, dataverseService);
278278
});
279279
});
280280
};

0 commit comments

Comments
 (0)