Skip to content

Commit bd3d01f

Browse files
Merge pull request #17 from BeverCRM/feature/refactoring
code refactorings
2 parents f70ee62 + 301462c commit bd3d01f

17 files changed

+522
-603
lines changed

FetchToSubgrid/@types/string.extensions.ts

Lines changed: 0 additions & 11 deletions
This file was deleted.

FetchToSubgrid/@types/types.d.ts

Lines changed: 15 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
import { IColumn, ISelection } from '@fluentui/react';
2-
import * as React from 'react';
3-
41
export type EntityMetadata = ComponentFramework.PropertyHelper.EntityMetadata;
52

6-
export type RetriveRecords = ComponentFramework.WebApi.RetrieveMultipleResponse;
3+
export type RetrieveRecords = ComponentFramework.WebApi.RetrieveMultipleResponse;
74

85
export type Entity = ComponentFramework.WebApi.Entity;
96

@@ -20,133 +17,27 @@ export interface OrderInFetchXml {
2017
isLinkEntity: boolean;
2118
}
2219

23-
export interface IDataverseService {
24-
getProps(): IAppWrapperProps;
25-
getEntityDisplayName(entityName: string): Promise<string>;
26-
getTimeZoneDefinitions(): Promise<Object>;
27-
getWholeNumberFieldName(
28-
format: string,
29-
entity: Entity,
30-
fieldName: string,
31-
timeZoneDefinitions: any): string;
32-
getRecordsCount(fetchXml: string): Promise<number>;
33-
getEntityMetadata(entityName: string, attributesFieldNames: string[]): Promise<EntityMetadata>;
34-
getCurrentPageRecords(fetchXml: string | null): Promise<RetriveRecords>;
35-
openRecord(entityName: string, entityId: string): void;
36-
openLookupForm(entity: Entity, fieldName: string): void;
37-
openLinkEntityRecord(entity: Entity, fieldName: string): void;
38-
openPrimaryEntityForm(entity: Entity, entityName: string): void;
39-
showNotificationPopup(error: Error | undefined): Promise<void>;
40-
openRecordDeleteDialog(
41-
selectedRecordIds: string[],
42-
entityName: string,
43-
setDialogAccepted: (value: any) => void): Promise<void>;
44-
getAllocatedWidth(): number;
45-
}
46-
4720
export interface EntityAttribute {
4821
linkEntityAlias?: string;
4922
name: string;
5023
attributeAlias: string;
5124
}
5225

53-
export interface IItemProps {
54-
timeZoneDefinitions: any;
55-
item: Entity;
56-
isLinkEntity: boolean;
57-
entityMetadata: EntityMetadata;
58-
attributeType: number;
59-
fieldName: string;
60-
entity: Entity;
26+
export interface IRecordsData {
6127
pagingFetchData: string;
62-
index: number;
63-
hasAliasValue: boolean;
64-
}
65-
66-
export interface IAppWrapperProps extends IService<IDataverseService> {
67-
fetchXmlOrJson: string | null;
68-
allocatedWidth: number;
69-
default: {
70-
fetchXml: string | null;
71-
pageSize: number;
72-
deleteButtonVisibility: boolean;
73-
newButtonVisibility: boolean;
74-
}
75-
}
76-
77-
export interface IFetchToSubgridProps {
78-
fetchXml: string | null;
79-
_service: IDataverseService;
80-
pageSize: number;
81-
deleteButtonVisibility: boolean;
82-
newButtonVisibility: boolean;
83-
allocatedWidth: number;
84-
error?: Error;
85-
setIsLoading: (isLoading: boolean) => void;
86-
setError: (error?: Error | undefined) => void;
87-
}
88-
89-
export interface IListProps extends IService<IDataverseService> {
90-
entityName: string;
91-
fetchXml: string | null;
92-
pageSize: number;
93-
forceReRender: number;
94-
currentPage: number;
95-
recordIds: React.MutableRefObject<string[]>;
96-
columns: IColumn[];
97-
items: Entity[];
98-
firstItemIndex: React.MutableRefObject<number>;
99-
lastItemIndex: React.MutableRefObject<number>;
100-
selectedItemsCount: React.MutableRefObject<number>;
101-
totalRecordsCount: number;
102-
nextButtonDisabled: React.MutableRefObject<boolean>;
103-
setItems: React.Dispatch<React.SetStateAction<ComponentFramework.WebApi.Entity[]>>;
104-
setColumns: React.Dispatch<React.SetStateAction<IColumn[]>>;
105-
setCurrentPage: React.Dispatch<React.SetStateAction<number>>;
106-
selection: ISelection;
107-
}
108-
109-
export interface ICommandBarProps extends IService<IDataverseService> {
110-
isButtonActive: boolean;
111-
entityName: string;
112-
selectedRecordIds: string[];
113-
displayName: string;
114-
newButtonVisibility: boolean;
115-
deleteButtonVisibility: boolean | string;
116-
setDialogAccepted: React.Dispatch<React.SetStateAction<boolean>>;
117-
}
118-
119-
export interface IFooterProps {
120-
firstItemIndex: number;
121-
lastItemIndex: number;
122-
selectedItemsCount: number;
123-
totalRecordsCount: number;
124-
currentPage: number;
125-
nextButtonDisable: boolean;
126-
movePreviousIsDisabled: boolean;
127-
setCurrentPage: (page: number) => void;
128-
}
129-
130-
export interface IInfoMessageProps {
131-
error?: Error;
132-
dataverseService: IDataverseService;
133-
}
134-
135-
export interface ILinkableItemProps extends IService<IDataverseService> {
136-
item: Entity
137-
}
138-
139-
export interface IJsonProps {
140-
newButtonVisibility: boolean;
141-
deleteButtonVisibility: boolean;
142-
pageSize: number;
143-
fetchXml: string;
28+
attributesFieldNames: string[];
29+
entityName:string;
30+
records: RetrieveRecords;
31+
entityMetadata: EntityMetadata;
32+
linkEntityNames: string[];
33+
linkEntityAttributes: EntityAttribute[][];
34+
linkentityMetadata: EntityMetadata;
35+
timeZoneDefinitions: Object;
36+
entityAliases: string[];
14437
}
14538

146-
export type JsonAllowedProps = Array<keyof IJsonProps>;
147-
148-
declare global {
149-
interface String {
150-
hashCode() : number;
151-
}
39+
export interface IItemsData {
40+
fetchXml: string | null,
41+
pageSize: number,
42+
currentPage: number,
15243
}

FetchToSubgrid/components/AppWrapper.tsx

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
11
import * as React from 'react';
2-
import { IAppWrapperProps, IFetchToSubgridProps } from '../@types/types';
2+
import { IService } from '../@types/types';
3+
import { IDataverseService } from '../services/dataverseService';
34
import { parseRawInput } from '../utilities/utils';
4-
import { FetchToSubgrid } from './FetchToSubgrid';
5-
import { InfoMessage } from './InfoMessage';
5+
import { FetchToSubgrid, IFetchToSubgridProps } from './FetchToSubgrid';
6+
import { ErrorMessage } from './ErrorMessage';
67
import { Loader } from './Loader';
78

9+
export interface IAppWrapperProps extends IService<IDataverseService> {
10+
fetchXmlOrJson: string | null;
11+
allocatedWidth: number;
12+
default: {
13+
fetchXml: string | null;
14+
pageSize: number;
15+
deleteButtonVisibility: boolean;
16+
newButtonVisibility: boolean;
17+
}
18+
}
19+
820
export const AppWrapper: React.FC<IAppWrapperProps> = props => {
921
const [isLoading, setIsLoading] = React.useState(false);
1022
const [error, setError] = React.useState<Error | undefined>(undefined);
1123

12-
const fetchToSubgridProps: IFetchToSubgridProps = parseRawInput(props, setIsLoading, setError);
24+
const fetchToSubgridProps: IFetchToSubgridProps = parseRawInput(props);
1325
if (fetchToSubgridProps.error) setError(error);
1426

1527
React.useEffect(() => {
@@ -18,7 +30,7 @@ export const AppWrapper: React.FC<IAppWrapperProps> = props => {
1830

1931
return (
2032
<div className='FetchToSubgridControl'>
21-
{ error && <InfoMessage error={error} dataverseService={props._service} /> }
33+
{ error && <ErrorMessage error={error} dataverseService={props._service} /> }
2234
{ !error && isLoading && <Loader />}
2335
{ !error &&
2436
<FetchToSubgrid
Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,70 @@
11
import { CommandBarButton, IIconProps } from '@fluentui/react';
22
import * as React from 'react';
3+
import { IService } from '../@types/types';
4+
import { IDataverseService } from '../services/dataverseService';
35
import { ContainerButtonStyles } from '../styles/comandBarStyles';
4-
import { ICommandBarProps } from '../@types/types';
56

67
const deleteIcon: IIconProps = { iconName: 'Delete' };
78
const addIcon: IIconProps = { iconName: 'Add' };
89

10+
interface ICommandBarProps extends IService<IDataverseService> {
11+
isButtonActive: boolean;
12+
entityName: string;
13+
selectedRecordIds: string[];
14+
newButtonVisibility: boolean;
15+
deleteButtonVisibility: boolean | string;
16+
setDialogAccepted: React.Dispatch<React.SetStateAction<boolean>>;
17+
}
18+
919
export const CommandBar = ({
1020
_service: dataverseService,
1121
isButtonActive,
1222
entityName,
1323
selectedRecordIds,
14-
displayName,
1524
newButtonVisibility,
1625
deleteButtonVisibility,
17-
setDialogAccepted }: ICommandBarProps) =>
18-
<div className='containerButtons'>
19-
{newButtonVisibility &&
26+
setDialogAccepted }: ICommandBarProps) => {
27+
const displayName = React.useRef('');
28+
29+
React.useEffect(() => {
30+
const fetchDisplayName = async () => {
31+
displayName.current = await dataverseService.getEntityDisplayName(entityName);
32+
};
33+
fetchDisplayName();
34+
}, []);
35+
36+
const handleNewButtonClick = () => {
37+
dataverseService.openRecordForm(entityName, '');
38+
};
39+
40+
const handleDeleteButtonClick = async () => {
41+
const deleteDialogStatus = await dataverseService.openRecordDeleteDialog(entityName);
42+
43+
if (deleteDialogStatus.confirmed) {
44+
setDialogAccepted(true);
45+
await dataverseService.deleteSelectedRecords(selectedRecordIds, entityName);
46+
setDialogAccepted(false);
47+
}
48+
};
49+
50+
return (
51+
<div className='containerButtons'>
52+
{newButtonVisibility &&
2053
<CommandBarButton
2154
styles={ContainerButtonStyles}
2255
maxLength={1}
2356
iconProps={addIcon}
24-
text={`New ${displayName}`}
25-
onClick={() => dataverseService.openRecord(entityName, '')}
57+
text={`New ${displayName.current}`}
58+
onClick={handleNewButtonClick}
2659
/>
27-
}
28-
{deleteButtonVisibility && isButtonActive &&
60+
}
61+
{deleteButtonVisibility && isButtonActive &&
2962
<CommandBarButton
3063
styles={ContainerButtonStyles}
3164
iconProps={deleteIcon}
3265
text="Delete"
33-
onClick={() => dataverseService.openRecordDeleteDialog(
34-
selectedRecordIds, entityName, setDialogAccepted)}
66+
onClick={handleDeleteButtonClick}
3567
/>
36-
}
37-
</div>;
68+
}
69+
</div>);
70+
};
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import * as React from 'react';
2+
import { IDataverseService } from '../services/dataverseService';
3+
4+
interface IErrorMessageProps {
5+
error: Error;
6+
dataverseService: IDataverseService;
7+
}
8+
9+
export const ErrorMessage: React.FC<IErrorMessageProps> = ({ error, dataverseService }) =>
10+
<div className='errorMessage'>
11+
<h1
12+
className='errorMessageText'
13+
onClick={() => dataverseService.openErrorDialog(error)}
14+
>
15+
An error has occurred!
16+
</h1>
17+
</div>;

0 commit comments

Comments
 (0)