Skip to content

Commit 8adcecf

Browse files
authored
refactor: Lint warnings are made to zero (#344)
1 parent 18e89be commit 8adcecf

File tree

13 files changed

+529
-527
lines changed

13 files changed

+529
-527
lines changed

eslint.config.mjs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export default defineConfig([
8989
'prettier/prettier': 'off',
9090

9191
// Disable rules from shared configs we're not ready for yet.
92-
'sonarjs/cognitive-complexity': ['warn', 20],
92+
'sonarjs/cognitive-complexity': ['error', 20],
9393
'sonarjs/no-duplicate-string': 'off',
9494

9595
//
@@ -152,8 +152,7 @@ export default defineConfig([
152152
'import/no-relative-packages': 'off',
153153
'react/jsx-fragments': 'off',
154154
'react/react-in-jsx-scope': 'off',
155-
'react-hooks/exhaustive-deps': 'off',
156-
'sonarjs/cognitive-complexity': ['warn', 45]
155+
'react-hooks/exhaustive-deps': 'off'
157156
}
158157
},
159158
{

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
"build:dev": "run-p -l lint build-angularsdk",
1818
"build:dev:ci": "npm run clean && npm install && npm run build:dev",
1919
"lint": "run-p -cl lint:*",
20-
"lint:es": "eslint --color --cache --cache-location node_modules/.cache/eslint/ \"projects/angular-test-app/src/**\" \"packages/angular-sdk-components/src/**\"",
20+
"lint:es": "eslint --color --cache --cache-location node_modules/.cache/eslint/ \"projects/angular-test-app/src/**\" \"packages/angular-sdk-components/src/**\" --max-warnings=0",
2121
"lint:format": "prettier --log-level warn -c .",
2222
"fix": "run-s -cl fix:*",
23-
"fix:es": "eslint --color --fix --cache --cache-location node_modules/.cache/eslint/ \"projects/angular-test-app/src/**\" \"packages/angular-sdk-components/src/**\"",
23+
"fix:es": "eslint --color --fix --cache --cache-location node_modules/.cache/eslint/ \"projects/angular-test-app/src/**\" \"packages/angular-sdk-components/src/**\" --max-warnings=0",
2424
"fix:format": "prettier --log-level warn -w .",
2525
"start-dev": "ng serve --port 3500",
2626
"start-dev-https": "ng serve --port 3500 --ssl --ssl-key ./keys/sdk-a.key --ssl-cert ./keys/sdk-a.crt",

packages/angular-sdk-components/src/lib/_components/field/auto-complete/auto-complete.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ interface AutoCompleteProps extends PConnFieldProps {
4242
MatAutocompleteModule,
4343
MatOptionModule,
4444
forwardRef(() => ComponentMapperComponent)
45-
]
45+
],
46+
providers: [DatapageService]
4647
})
4748
export class AutoCompleteComponent extends FieldBase implements OnInit {
4849
protected dataPageService = inject(DatapageService);

packages/angular-sdk-components/src/lib/_components/field/multiselect/utils.ts

Lines changed: 55 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,31 @@ function prepareSearchResults(listObjData, displayFieldMeta) {
8585
return searchResults;
8686
}
8787

88+
function handleGroupedDataSearch(dataApiObj, searchText, clickedGroup, initialCaseClass, itemsTree) {
89+
const localDataApiObj = cloneDeep(dataApiObj);
90+
localDataApiObj.fetchedNQData = false;
91+
localDataApiObj.cache = {};
92+
93+
if (!searchText && !clickedGroup) {
94+
return { shouldReturn: true, value: itemsTree };
95+
}
96+
97+
localDataApiObj.parameters[Object.keys(localDataApiObj.parameters)[1]] = searchText;
98+
localDataApiObj.parameters[Object.keys(localDataApiObj.parameters)[0]] = initialCaseClass;
99+
100+
if (clickedGroup) {
101+
if (!searchText) {
102+
const containsData = itemsTree.find(item => item.id === clickedGroup);
103+
if (containsData?.items?.length) {
104+
return { shouldReturn: true, value: itemsTree };
105+
}
106+
}
107+
localDataApiObj.parameters[Object.keys(localDataApiObj.parameters)[0]] = JSON.stringify([clickedGroup]);
108+
}
109+
110+
return { shouldReturn: false, value: localDataApiObj };
111+
}
112+
88113
async function doSearch(
89114
searchText,
90115
clickedGroup,
@@ -96,61 +121,44 @@ async function doSearch(
96121
showSecondaryInSearchOnly,
97122
selected
98123
) {
99-
let searchTextForUngroupedData = '';
100-
if (dataApiObj) {
101-
// creating dataApiObject in grouped data cases
102-
if (isGroupData) {
103-
dataApiObj = cloneDeep(dataApiObj);
104-
dataApiObj.fetchedNQData = false;
105-
dataApiObj.cache = {};
106-
107-
// if we have no search text and no group selected, return the original tree
108-
if (searchText === '' && clickedGroup === '') {
109-
return itemsTree;
110-
}
124+
if (!dataApiObj) {
125+
return itemsTree;
126+
}
111127

112-
// setting the inital search text & search classes in ApiObject
113-
dataApiObj.parameters[Object.keys(dataApiObj.parameters)[1]] = searchText;
114-
dataApiObj.parameters[Object.keys(dataApiObj.parameters)[0]] = initialCaseClass;
115-
116-
// if we have a selected group
117-
if (clickedGroup) {
118-
// check if the data for this group is already present and no search text
119-
if (searchText === '') {
120-
const containsData = itemsTree.find(item => item.id === clickedGroup);
121-
// do not make API call when items of respective group are already fetched
122-
if (containsData?.items?.length) return itemsTree;
123-
}
128+
let searchTextForApi = '';
129+
let localDataApiObj = dataApiObj;
124130

125-
dataApiObj.parameters[Object.keys(dataApiObj.parameters)[0]] = JSON.stringify([clickedGroup]);
126-
}
127-
} else {
128-
searchTextForUngroupedData = searchText;
131+
if (isGroupData) {
132+
const groupResult = handleGroupedDataSearch(dataApiObj, searchText, clickedGroup, initialCaseClass, itemsTree);
133+
if (groupResult.shouldReturn) {
134+
return groupResult.value;
129135
}
136+
localDataApiObj = groupResult.value;
137+
} else {
138+
searchTextForApi = searchText;
139+
}
130140

131-
// search API call
132-
const response = await dataApiObj.fetchData(searchTextForUngroupedData).catch(() => {
133-
return itemsTree;
134-
});
141+
const response = await localDataApiObj.fetchData(searchTextForApi).catch(() => ({ data: undefined }));
135142

136-
let listObjData = response.data;
137-
let newItemsTree = [];
138-
if (isGroupData) {
139-
if (searchText) {
140-
listObjData = prepareSearchResults(listObjData, displayFieldMeta);
141-
} else {
142-
newItemsTree = putItemsDataInItemsTree(listObjData, displayFieldMeta, itemsTree, showSecondaryInSearchOnly, selected);
143-
return newItemsTree;
144-
}
145-
}
146-
const showSecondaryData = showSecondaryInSearchOnly ? !!searchText : true;
147-
if (listObjData !== undefined && listObjData.length > 0) {
148-
newItemsTree = listObjData.map(entry => createSingleTreeObejct(entry, displayFieldMeta, showSecondaryData, selected));
143+
let listObjData = response.data;
144+
if (!listObjData) {
145+
return itemsTree;
146+
}
147+
148+
if (isGroupData) {
149+
if (searchText) {
150+
listObjData = prepareSearchResults(listObjData, displayFieldMeta);
151+
} else {
152+
return putItemsDataInItemsTree(listObjData, displayFieldMeta, itemsTree, showSecondaryInSearchOnly, selected);
149153
}
150-
return newItemsTree;
151154
}
152155

153-
return itemsTree;
156+
if (listObjData.length === 0) {
157+
return [];
158+
}
159+
160+
const showSecondaryData = showSecondaryInSearchOnly ? !!searchText : true;
161+
return listObjData.map(entry => createSingleTreeObejct(entry, displayFieldMeta, showSecondaryData, selected));
154162
}
155163

156164
function setValuesToPropertyList(searchText, assocProp, items, columns, actions, updatePropertyInRedux = true) {

packages/angular-sdk-components/src/lib/_components/field/object-reference/object-reference.component.ts

Lines changed: 87 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -64,138 +64,56 @@ export class ObjectReferenceComponent implements OnInit, OnDestroy {
6464

6565
updateSelf() {
6666
this.configProps = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as ObjectReferenceProps;
67-
const displayMode = this.configProps.displayMode;
68-
const editableInReview = this.configProps.allowAndPersistChangesInReviewMode ?? false;
69-
const targetObjectType = this.configProps.targetObjectType;
70-
const mode = this.configProps.mode;
71-
const parameters = this.configProps.parameters;
72-
const hideLabel = this.configProps.hideLabel;
73-
const inline = this.configProps.inline;
74-
const showPromotedFilters = this.configProps.showPromotedFilters;
67+
const {
68+
displayMode,
69+
allowAndPersistChangesInReviewMode: editableInReview = false,
70+
targetObjectType,
71+
mode,
72+
parameters,
73+
hideLabel,
74+
inline,
75+
showPromotedFilters
76+
} = this.configProps;
77+
7578
const referenceType: string = targetObjectType === 'case' ? 'Case' : 'Data';
7679
this.rawViewMetadata = this.pConn$.getRawMetadata();
7780
const refFieldMetadata = this.pConn$.getFieldMetadata(this.rawViewMetadata?.config?.value?.split('.', 2)[1] ?? '');
78-
79-
// Destructured properties
8081
const propsToUse = { ...this.pConn$.getInheritedProps(), ...this.configProps };
8182

82-
// Computed variables
8383
this.isDisplayModeEnabled = displayMode === 'DISPLAY_ONLY';
84-
this.canBeChangedInReviewMode = editableInReview && ['Autocomplete', 'Dropdown'].includes((this.rawViewMetadata?.config as any)?.componentType);
85-
// componentType is not defined in ComponentMetadataConfig type so using any
86-
this.type = (this.rawViewMetadata?.config as any)?.componentType;
84+
this.type = this.getComponentType();
85+
this.canBeChangedInReviewMode = editableInReview && ['Autocomplete', 'Dropdown'].includes(this.type);
8786

8887
if (this.type === 'SemanticLink' && !this.canBeChangedInReviewMode) {
8988
const config: any = {
9089
...this.rawViewMetadata?.config,
91-
primaryField: (this.rawViewMetadata?.config as any).displayField
90+
primaryField: (this.rawViewMetadata?.config as any).displayField,
91+
caseClass: (this.rawViewMetadata?.config as any).targetObjectClass,
92+
text: (this.rawViewMetadata?.config as any).displayField,
93+
caseID: (this.rawViewMetadata?.config as any).value,
94+
contextPage: `@P .${(this.rawViewMetadata?.config as any).displayField ? getDataRelationshipContextFromKey((this.rawViewMetadata?.config as any).displayField) : null}`,
95+
resourceParams: { workID: (this.rawViewMetadata?.config as any).value },
96+
resourcePayload: { caseClassName: (this.rawViewMetadata?.config as any).targetObjectClass }
9297
};
93-
config.caseClass = (this.rawViewMetadata?.config as any).targetObjectClass;
94-
config.text = config.primaryField;
95-
config.caseID = config.value;
96-
config.contextPage = `@P .${
97-
(this.rawViewMetadata?.config as any)?.displayField
98-
? getDataRelationshipContextFromKey((this.rawViewMetadata?.config as any).displayField)
99-
: null
100-
}`;
101-
config.resourceParams = {
102-
workID: config.value
103-
};
104-
config.resourcePayload = {
105-
caseClassName: config.caseClass
106-
};
107-
108-
const component = this.pConn$.createComponent(
109-
{
110-
type: 'SemanticLink',
111-
config: {
112-
...config,
113-
displayMode,
114-
referenceType,
115-
hideLabel,
116-
dataRelationshipContext: (this.rawViewMetadata?.config as any)?.displayField
117-
? getDataRelationshipContextFromKey((this.rawViewMetadata?.config as any).displayField)
118-
: null
119-
}
120-
},
121-
'',
122-
0,
123-
{}
124-
);
125-
this.newPconn = component?.getPConnect();
98+
this.createSemanticLinkPConnect(config, displayMode ?? '', referenceType, hideLabel);
99+
return;
126100
}
127101

128102
if (this.type !== 'SemanticLink' && !this.isDisplayModeEnabled) {
129-
// 1) Set datasource
130103
const config: any = { ...this.rawViewMetadata?.config };
131104
generateColumns(config, this.pConn$, referenceType);
132105
config.deferDatasource = true;
133106
config.listType = 'datapage';
134107
if (['Dropdown', 'AutoComplete'].includes(this.type) && !config.placeholder) {
135108
config.placeholder = '@L Select...';
136109
}
137-
138-
// 2) Pass through configs
139110
config.showPromotedFilters = showPromotedFilters;
140-
141111
if (!this.canBeChangedInReviewMode) {
142112
config.displayMode = displayMode;
143113
}
114+
config.parameters = parameters;
144115

145-
// 3) Define field meta
146-
147-
const fieldMetaData = {
148-
datasourceMetadata: {
149-
datasource: {
150-
parameters: {},
151-
propertyForDisplayText: false,
152-
propertyForValue: false,
153-
name: ''
154-
}
155-
}
156-
};
157-
if (config?.parameters) {
158-
fieldMetaData.datasourceMetadata.datasource.parameters = parameters;
159-
}
160-
fieldMetaData.datasourceMetadata.datasource.propertyForDisplayText = config?.datasource?.fields?.text?.startsWith('@P')
161-
? config?.datasource?.fields?.text?.substring(3)
162-
: config?.datasource?.fields?.text;
163-
fieldMetaData.datasourceMetadata.datasource.propertyForValue = config?.datasource?.fields?.value?.startsWith('@P')
164-
? config?.datasource?.fields?.value?.substring(3)
165-
: config?.datasource?.fields?.value;
166-
fieldMetaData.datasourceMetadata.datasource.name = config?.referenceList ?? '';
167-
168-
const component = this.pConn$.createComponent(
169-
{
170-
type: this.type,
171-
config: {
172-
...config,
173-
descriptors: mode === 'single' ? refFieldMetadata?.descriptors : null,
174-
datasourceMetadata: fieldMetaData?.datasourceMetadata,
175-
required: propsToUse.required,
176-
visibility: propsToUse.visibility,
177-
disabled: propsToUse.disabled,
178-
label: propsToUse.label,
179-
parameters: config.parameters,
180-
readOnly: false,
181-
localeReference: config.localeReference,
182-
...(mode === 'single' ? { referenceType } : ''),
183-
contextClass: config.targetObjectClass,
184-
primaryField: config?.displayField,
185-
dataRelationshipContext: config?.displayField ? getDataRelationshipContextFromKey(config.displayField) : null,
186-
hideLabel,
187-
inline
188-
}
189-
},
190-
'',
191-
0,
192-
{}
193-
);
194-
this.newComponentName = component?.getPConnect().getComponentName();
195-
this.newPconn = component?.getPConnect();
196-
if (this.rawViewMetadata?.config) {
197-
this.rawViewMetadata.config = config ? { ...config } : this.rawViewMetadata.config;
198-
}
116+
this.createOtherComponentPConnect(config, propsToUse, mode, refFieldMetadata, referenceType, hideLabel, inline);
199117
}
200118
}
201119

@@ -253,4 +171,67 @@ export class ObjectReferenceComponent implements OnInit, OnDestroy {
253171
});
254172
}
255173
}
174+
175+
private getComponentType(): string {
176+
// componentType is not defined in ComponentMetadataConfig type so using any
177+
return (this.rawViewMetadata?.config as any)?.componentType;
178+
}
179+
180+
private createSemanticLinkPConnect(config: any, displayMode: string, referenceType: string, hideLabel: boolean) {
181+
const semanticLinkConfig = {
182+
...config,
183+
displayMode,
184+
referenceType,
185+
hideLabel,
186+
dataRelationshipContext: config.displayField ? getDataRelationshipContextFromKey(config.displayField) : null
187+
};
188+
189+
const component = this.pConn$.createComponent({ type: 'SemanticLink', config: semanticLinkConfig }, '', 0, {});
190+
this.newPconn = component?.getPConnect();
191+
}
192+
193+
private createOtherComponentPConnect(
194+
config: any,
195+
propsToUse: any,
196+
mode: string,
197+
refFieldMetadata: any,
198+
referenceType: string,
199+
hideLabel: boolean,
200+
inline: boolean
201+
) {
202+
const fieldMetaData = {
203+
datasourceMetadata: {
204+
datasource: {
205+
parameters: config.parameters ?? {},
206+
propertyForDisplayText: config.datasource?.fields?.text?.substring(3) ?? config.datasource?.fields?.text,
207+
propertyForValue: config.datasource?.fields?.value?.substring(3) ?? config.datasource?.fields?.value,
208+
name: config.referenceList ?? ''
209+
}
210+
}
211+
};
212+
213+
const componentConfig = {
214+
...config,
215+
descriptors: mode === 'single' ? refFieldMetadata?.descriptors : null,
216+
datasourceMetadata: fieldMetaData.datasourceMetadata,
217+
required: propsToUse.required,
218+
visibility: propsToUse.visibility,
219+
disabled: propsToUse.disabled,
220+
label: propsToUse.label,
221+
readOnly: false,
222+
...(mode === 'single' && { referenceType }),
223+
contextClass: config.targetObjectClass,
224+
primaryField: config.displayField,
225+
dataRelationshipContext: config.displayField ? getDataRelationshipContextFromKey(config.displayField) : null,
226+
hideLabel,
227+
inline
228+
};
229+
230+
const component = this.pConn$.createComponent({ type: this.type, config: componentConfig }, '', 0, {});
231+
this.newComponentName = component?.getPConnect().getComponentName();
232+
this.newPconn = component?.getPConnect();
233+
if (this.rawViewMetadata?.config) {
234+
this.rawViewMetadata.config = { ...config };
235+
}
236+
}
256237
}

0 commit comments

Comments
 (0)