rez_core 2.1.46 → 2.1.48

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.
Files changed (24) hide show
  1. package/dist/module/filter/controller/filter.controller.d.ts +1 -1
  2. package/dist/module/filter/entity/saved-filter-detail.entity.d.ts +2 -1
  3. package/dist/module/filter/entity/saved-filter-detail.entity.js +4 -0
  4. package/dist/module/filter/entity/saved-filter-detail.entity.js.map +1 -1
  5. package/dist/module/filter/repository/saved-filter.repository.d.ts +1 -1
  6. package/dist/module/filter/repository/saved-filter.repository.js +7 -1
  7. package/dist/module/filter/repository/saved-filter.repository.js.map +1 -1
  8. package/dist/module/filter/service/filter.service.js +15 -3
  9. package/dist/module/filter/service/filter.service.js.map +1 -1
  10. package/dist/module/filter/service/saved-filter.service.d.ts +1 -1
  11. package/dist/module/filter/service/saved-filter.service.js +15 -5
  12. package/dist/module/filter/service/saved-filter.service.js.map +1 -1
  13. package/dist/module/module/controller/module-access.controller.js +6 -1
  14. package/dist/module/module/controller/module-access.controller.js.map +1 -1
  15. package/dist/module/module/service/module-access.service.js +1 -1
  16. package/dist/module/module/service/module-access.service.js.map +1 -1
  17. package/dist/tsconfig.build.tsbuildinfo +1 -1
  18. package/package.json +1 -1
  19. package/src/module/filter/entity/saved-filter-detail.entity.ts +6 -3
  20. package/src/module/filter/repository/saved-filter.repository.ts +9 -2
  21. package/src/module/filter/service/filter.service.ts +24 -5
  22. package/src/module/filter/service/saved-filter.service.ts +19 -5
  23. package/src/module/module/controller/module-access.controller.ts +21 -15
  24. package/src/module/module/service/module-access.service.ts +18 -24
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rez_core",
3
- "version": "2.1.46",
3
+ "version": "2.1.48",
4
4
  "description": "",
5
5
  "author": "",
6
6
  "private": false,
@@ -1,6 +1,6 @@
1
- import { ENTITYTYPE_SAVEDFILTERDETAIL } from "src/constant/global.constant";
2
- import { BaseEntity } from "src/module/meta/entity/base-entity.entity";
3
- import { Column, Entity } from "typeorm";
1
+ import { ENTITYTYPE_SAVEDFILTERDETAIL } from 'src/constant/global.constant';
2
+ import { BaseEntity } from 'src/module/meta/entity/base-entity.entity';
3
+ import { Column, Entity } from 'typeorm';
4
4
 
5
5
  @Entity({ name: 'cr_saved_filter_detail' })
6
6
  export class SavedFilterDetail extends BaseEntity {
@@ -20,4 +20,7 @@ export class SavedFilterDetail extends BaseEntity {
20
20
 
21
21
  @Column()
22
22
  filter_value: string;
23
+
24
+ @Column({ nullable: true })
25
+ data_type: string;
23
26
  }
@@ -91,7 +91,7 @@ export class SavedFilterRepositoryService {
91
91
  {
92
92
  filter_attribute: string;
93
93
  filter_operator: string;
94
- filter_value: string;
94
+ filter_value: string | string[];
95
95
  }[]
96
96
  > {
97
97
  const saveFilterMasterData = await this.savedFilterMasterRepo.findOne({
@@ -107,7 +107,14 @@ export class SavedFilterRepositoryService {
107
107
  return filterDetails.map((detail) => ({
108
108
  filter_attribute: detail.filter_attribute,
109
109
  filter_operator: detail.filter_operator,
110
- filter_value: detail.filter_value,
110
+ filter_value:
111
+ detail.data_type === 'multiselect'
112
+ ? detail.filter_value?.trim() === ''
113
+ ? []
114
+ : detail.filter_value.split(',')
115
+ : detail.filter_value?.trim() === ''
116
+ ? []
117
+ : detail.filter_value,
111
118
  }));
112
119
  }
113
120
  }
@@ -121,7 +121,7 @@ export class FilterService {
121
121
  {} as Record<string, any>,
122
122
  );
123
123
 
124
- // Get and parse filters
124
+ // Get and parse saved filters
125
125
  const savedFilters = await this.getSavedFilters(savedFilterCode);
126
126
  const baseFilters = [
127
127
  ...(quickFilter || []).filter((f) => f.filter_value !== ''),
@@ -129,8 +129,10 @@ export class FilterService {
129
129
  ...(attributeFilter || []).filter((f) => f.filter_value !== ''),
130
130
  ];
131
131
 
132
+ // Build where clauses
132
133
  const baseWhere = this.buildWhereClauses(baseFilters, attributeMetaMap);
133
134
 
135
+ // check level_id and level_type
134
136
  if (level_type && level_id) {
135
137
  baseWhere.push({
136
138
  query: 'e.level_type = :level_type AND e.level_id = :level_id',
@@ -148,10 +150,11 @@ export class FilterService {
148
150
  });
149
151
  }
150
152
 
153
+ // layout preference query
151
154
  const layoutPreference = await this.dataSource.query(
152
155
  `SELECT layout_json
153
- FROM cr_layout_preference
154
- WHERE user_id = ? AND mapped_entity_type = ?`,
156
+ FROM cr_layout_preference
157
+ WHERE user_id = ? AND mapped_entity_type = ?`,
155
158
  [user_id, entity_type],
156
159
  );
157
160
 
@@ -197,7 +200,7 @@ export class FilterService {
197
200
  (tab) => tab.tab_value.toLowerCase() !== 'all',
198
201
  );
199
202
 
200
- // 🔽 SORTING LOGIC
203
+ // SORTING LOGIC
201
204
  if (layout.sorting === 'asc') {
202
205
  filteredTabs.sort((a, b) =>
203
206
  a.tab_value.toLowerCase().localeCompare(b.tab_value.toLowerCase()),
@@ -210,6 +213,22 @@ export class FilterService {
210
213
  filteredTabs.sort((a, b) => a.tab_value_count - b.tab_value_count);
211
214
  } else if (layout.sorting === 'count_dsc') {
212
215
  filteredTabs.sort((a, b) => b.tab_value_count - a.tab_value_count);
216
+ } else if (layout.sorting === 'custom') {
217
+ const orderMap = new Map<string, number>(
218
+ showList.map((val, index) => [val.toLowerCase(), index]),
219
+ );
220
+
221
+ filteredTabs.sort((a, b) => {
222
+ const aIndex = orderMap.has(a.tab_value.toLowerCase())
223
+ ? orderMap.get(a.tab_value.toLowerCase())!
224
+ : Infinity;
225
+
226
+ const bIndex = orderMap.has(b.tab_value.toLowerCase())
227
+ ? orderMap.get(b.tab_value.toLowerCase())!
228
+ : Infinity;
229
+
230
+ return aIndex - bIndex;
231
+ });
213
232
  }
214
233
 
215
234
  // Re-insert 'all' at the beginning
@@ -460,7 +479,7 @@ export class FilterService {
460
479
  case 'date':
461
480
  return this.buildDateCondition(attr, op, val, key);
462
481
  case 'select':
463
- return this.buildSelectCondition(attr, op, val, key);
482
+ return this.buildMultiSelectCondition(attr, op, val, key);
464
483
  case 'multiselect':
465
484
  return this.buildMultiSelectCondition(attr, op, val, key);
466
485
  case 'year':
@@ -6,6 +6,7 @@ import { SavedFilterMaster } from '../entity/saved-filter-master.entity';
6
6
  import { SavedFilterDetail } from '../entity/saved-filter-detail.entity';
7
7
  import { ENTITYTYPE_SAVEDFILTERMASTER } from 'src/constant/global.constant';
8
8
  import { SavedFilterRepositoryService } from '../repository/saved-filter.repository';
9
+ import { isArray } from 'class-validator';
9
10
 
10
11
  @Injectable()
11
12
  export class SavedFilterService extends EntityServiceImpl {
@@ -32,6 +33,7 @@ export class SavedFilterService extends EntityServiceImpl {
32
33
  }
33
34
 
34
35
  entityData.user_id = loggedInUser?.id ?? null;
36
+
35
37
  // Save the master record without code
36
38
  const savedMaster = await super.createEntity(master, loggedInUser);
37
39
 
@@ -45,10 +47,22 @@ export class SavedFilterService extends EntityServiceImpl {
45
47
  // Save filter details using generated code
46
48
  const details = (entityData as any).filterDetails ?? [];
47
49
  if (details.length) {
48
- const prepared = details.map((detail: any) => ({
49
- ...detail,
50
- mapped_filter_code: savedMaster.code,
51
- }));
50
+ const prepared = details.map((detail: any) => {
51
+ // If detail.filter_value is an array, join it with comma
52
+ if (Array.isArray(detail.filter_value)) {
53
+ return {
54
+ ...detail,
55
+ mapped_filter_code: savedMaster.code,
56
+ filter_value: detail.filter_value.join(','),
57
+ data_type: 'multiselect',
58
+ };
59
+ }
60
+ // Otherwise, just add mapped_filter_code
61
+ return {
62
+ ...detail,
63
+ mapped_filter_code: savedMaster.code,
64
+ };
65
+ });
52
66
 
53
67
  await this.savedFilterRepo.saveDetails(prepared);
54
68
  }
@@ -103,6 +117,6 @@ export class SavedFilterService extends EntityServiceImpl {
103
117
  }
104
118
 
105
119
  async getFilterById(id: number) {
106
- return this.savedFilterRepo.getFilterById(id);
120
+ return await this.savedFilterRepo.getFilterById(id);
107
121
  }
108
122
  }
@@ -25,14 +25,19 @@ export class ModuleAccessController {
25
25
 
26
26
  @Get('roles')
27
27
  async getRoles(@Query('appcode') appcode: string, @Request() req) {
28
- let level_type= req.user.userData.level_type
29
- let level_id= req.user.userData.level_id
28
+ let level_type = req.user.userData.level_type;
29
+ let level_id = req.user.userData.level_id;
30
30
  let organization_id = req.user.userData.organization_id;
31
- return this.moduleAccessService.getRoles({ appcode,level_type, level_id ,organization_id});
31
+ return this.moduleAccessService.getRoles({
32
+ appcode,
33
+ level_type,
34
+ level_id,
35
+ organization_id,
36
+ });
32
37
  }
33
38
 
34
39
  @Get('modules')
35
- async getModules( @Query('appcode') appcode: string,@Request() req) {
40
+ async getModules(@Query('appcode') appcode: string, @Request() req) {
36
41
  return this.moduleAccessService.getModules({
37
42
  appcode,
38
43
  });
@@ -46,9 +51,14 @@ export class ModuleAccessController {
46
51
  ) {
47
52
  const roleIdArray = roleIds.split(',').map(Number);
48
53
  const appcode = queryAppcode || req.user.userData.appcode;
49
- const level_type = req.user.userData.level_type;
50
- const level_id = req.user.userData.level_id;
51
- return this.moduleAccessService.getAccessListing(roleIdArray, appcode, level_type, level_id);
54
+ const level_type = req.user.userData.level_type;
55
+ const level_id = req.user.userData.level_id;
56
+ return this.moduleAccessService.getAccessListing(
57
+ roleIdArray,
58
+ appcode,
59
+ level_type,
60
+ level_id,
61
+ );
52
62
  }
53
63
 
54
64
  @Get('menu-listing')
@@ -69,9 +79,7 @@ export class ModuleAccessController {
69
79
 
70
80
  @Post('update')
71
81
  async updateModuleAccess(@Body() moduleAccessData: any[], @Request() req) {
72
- return this.moduleAccessService.updateModuleAccess(
73
- moduleAccessData
74
- );
82
+ return this.moduleAccessService.updateModuleAccess(moduleAccessData);
75
83
  }
76
84
 
77
85
  // src/module/module-access/controller/module-access.controller.ts
@@ -98,16 +106,16 @@ export class ModuleAccessController {
98
106
  @Get('user-permissions')
99
107
  async getUserPermissions(@Request() req) {
100
108
  const userData = req.user.userData;
101
-
109
+
102
110
  const userId = userData?.id;
103
111
  const appcode = userData?.appcode;
104
112
  const level_type = userData?.level_type;
105
113
  const level_id = userData?.level_id;
106
-
114
+
107
115
  if (!userId || !appcode || !level_type || !level_id) {
108
116
  throw new BadRequestException('Invalid token data');
109
117
  }
110
-
118
+
111
119
  return this.moduleAccessService.getUserPermissions({
112
120
  userId,
113
121
  appcode,
@@ -115,6 +123,4 @@ export class ModuleAccessController {
115
123
  level_id,
116
124
  });
117
125
  }
118
-
119
-
120
126
  }
@@ -15,7 +15,6 @@ export class ModuleAccessService {
15
15
  private readonly menuRepository: MenuRepository,
16
16
  private readonly dataSource: DataSource,
17
17
  ) {}
18
-
19
18
 
20
19
  async getModules({ appcode }: { appcode: string }) {
21
20
  return this.moduleAccessRepository.getModules({
@@ -64,7 +63,7 @@ export class ModuleAccessService {
64
63
  value: role.id,
65
64
  }));
66
65
  }
67
-
66
+
68
67
  async getAccessListing(
69
68
  roleIds: number[],
70
69
  appcode: string,
@@ -75,7 +74,7 @@ export class ModuleAccessService {
75
74
  roleIds,
76
75
  appcode,
77
76
  levelType,
78
- level_id
77
+ level_id,
79
78
  );
80
79
  }
81
80
 
@@ -109,9 +108,8 @@ export class ModuleAccessService {
109
108
  return { success: false, msg: 'No data provided' };
110
109
  }
111
110
 
112
- const result = await this.moduleAccessRepository.updateModuleAccess(
113
- moduleAccessData,
114
- );
111
+ const result =
112
+ await this.moduleAccessRepository.updateModuleAccess(moduleAccessData);
115
113
 
116
114
  if (result) {
117
115
  return { success: true, msg: 'Module access updated successfully' };
@@ -144,40 +142,36 @@ export class ModuleAccessService {
144
142
  level_type,
145
143
  level_id,
146
144
  );
147
-
145
+
148
146
  if (!roleCodes || roleCodes.length === 0) {
149
147
  return [];
150
148
  }
151
-
149
+
152
150
  const roleIds = roleCodes.map(Number);
153
-
151
+
154
152
  // Step 2: Get full permissions
155
- const allPermissions = await this.moduleAccessRepository.getModuleAccessByRoles(
156
- roleIds,
157
- appcode,
158
- );
159
-
153
+ const allPermissions =
154
+ await this.moduleAccessRepository.getModuleAccessByRoles(
155
+ roleIds,
156
+ appcode,
157
+ );
158
+
160
159
  // Step 3: If level_type is SCH, check school status using raw query
161
160
  if (level_type === 'SCH') {
162
161
  const result = await this.dataSource.query(
163
162
  `SELECT * FROM cr_school WHERE id = ${level_id}`,
164
163
  [level_id],
165
164
  );
166
-
165
+
167
166
  const school = result?.[0];
168
-
169
- if (!school || school.status === "INACTIVE") {
167
+
168
+ if (!school || school.status === 'INACTIVE') {
170
169
  // Return only VIEW permissions
171
- return allPermissions.filter(
172
- (perm) => perm.action === 'VIEW'
173
- );
170
+ return allPermissions.filter((perm) => perm.action === 'VIEW');
174
171
  }
175
172
  }
176
-
173
+
177
174
  // Step 4: Return all permissions normally
178
175
  return allPermissions;
179
176
  }
180
-
181
-
182
-
183
177
  }