@seniorsistemas/exclusion-process-component 0.0.1-40efacd8-8a6c-4d38-8102-8c977c14410a → 0.6.0-44030ff3-2eeb-49f7-8927-0920cc01a805

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 (213) hide show
  1. package/.editorconfig +19 -0
  2. package/.gitlab-ci.yml +74 -0
  3. package/.prettierrc +8 -0
  4. package/.senior-ci-extensions.sh +21 -0
  5. package/.vscode/settings.json +6 -0
  6. package/CHANGELOG.md +22 -0
  7. package/README.md +16 -0
  8. package/angular.json +144 -0
  9. package/archive.tar.gz +0 -0
  10. package/e2e/app.e2e-spec.ts +14 -0
  11. package/e2e/app.po.ts +11 -0
  12. package/e2e/tsconfig.e2e.json +14 -0
  13. package/karma.conf.js +53 -0
  14. package/lib/.browserslistrc +5 -0
  15. package/lib/package.json +19 -0
  16. package/{enums/enum-exclusion-process-status.d.ts → lib/src/enums/enum-exclusion-process-status.ts} +1 -1
  17. package/lib/src/exclusion-details/exclusion-details.component.html +84 -0
  18. package/lib/src/exclusion-details/exclusion-details.component.scss +47 -0
  19. package/lib/src/exclusion-details/exclusion-details.component.spec.ts +171 -0
  20. package/lib/src/exclusion-details/exclusion-details.component.ts +235 -0
  21. package/lib/src/exclusion-details/exclusion-details.module.ts +23 -0
  22. package/{exclusion-details/protocols/exclusion-details.d.ts → lib/src/exclusion-details/protocols/exclusion-details.ts} +1 -0
  23. package/{exclusion-details/protocols/show-details-information.d.ts → lib/src/exclusion-details/protocols/show-details-information.ts} +1 -1
  24. package/lib/src/exclusions-list/exclusions-list.component.html +157 -0
  25. package/lib/src/exclusions-list/exclusions-list.component.spec.ts +526 -0
  26. package/lib/src/exclusions-list/exclusions-list.component.ts +335 -0
  27. package/lib/src/exclusions-list/exclusions-list.module.ts +52 -0
  28. package/lib/src/exclusions-list/exclusions-list.routing.ts +89 -0
  29. package/{exclusions-list/index.d.ts → lib/src/exclusions-list/index.ts} +0 -1
  30. package/lib/src/logical-delete.module.ts +22 -0
  31. package/{models/exclusion-process-step-group.d.ts → lib/src/models/exclusion-process-step-group.ts} +1 -0
  32. package/{models/exclusion-process-step.d.ts → lib/src/models/exclusion-process-step.ts} +1 -0
  33. package/{models/exclusion-process.d.ts → lib/src/models/exclusion-process.ts} +1 -0
  34. package/{models/list-params.d.ts → lib/src/models/list-params.ts} +1 -0
  35. package/{models/project-config.d.ts → lib/src/models/project-config.ts} +3 -1
  36. package/{public-api.d.ts → lib/src/public-api.ts} +0 -1
  37. package/lib/src/services/filter.service.spec.ts +290 -0
  38. package/lib/src/services/filter.service.ts +109 -0
  39. package/lib/src/services/logical-delete-config.service.spec.ts +59 -0
  40. package/lib/src/services/logical-delete-config.service.ts +25 -0
  41. package/lib/src/services/logical-delete.service.spec.ts +322 -0
  42. package/lib/src/services/logical-delete.service.ts +122 -0
  43. package/lib/test.ts +14 -0
  44. package/lib/tsconfig.lib.json +19 -0
  45. package/lib/tsconfig.lib.prod.json +6 -0
  46. package/lib/tsconfig.spec.json +12 -0
  47. package/lib/tslint.json +19 -0
  48. package/package.json +59 -18
  49. package/protractor.conf.js +28 -0
  50. package/senior-ci/.devcontainer/Dockerfile +27 -0
  51. package/senior-ci/.devcontainer/devcontainer.json +71 -0
  52. package/senior-ci/.editorconfig +14 -0
  53. package/senior-ci/.gitattributes +5 -0
  54. package/senior-ci/.gitlab-ci.yml +53 -0
  55. package/senior-ci/.pylintrc +562 -0
  56. package/senior-ci/.vscode/launch.json +102 -0
  57. package/senior-ci/CHANGELOG.md +1564 -0
  58. package/senior-ci/CONTRIBUTING.md +31 -0
  59. package/senior-ci/README.md +26 -0
  60. package/senior-ci/ci/ci.sh +74 -0
  61. package/senior-ci/ci/sonar_scanner.py +48 -0
  62. package/senior-ci/common/__init__.py +250 -0
  63. package/senior-ci/common/default-files/pom.xml +10 -0
  64. package/senior-ci/common/docker-helpers.sh +57 -0
  65. package/senior-ci/common/extensions.py +88 -0
  66. package/senior-ci/common/flutter-helpers.sh +3 -0
  67. package/senior-ci/common/getopt_helper.py +168 -0
  68. package/senior-ci/common/graphql_client.py +40 -0
  69. package/senior-ci/common/helm_helpers.py +40 -0
  70. package/senior-ci/common/notification-helpers.sh +15 -0
  71. package/senior-ci/common/npm-helper.sh +4 -0
  72. package/senior-ci/common/parallel-helper.sh +8 -0
  73. package/senior-ci/common/release-helpers.sh +196 -0
  74. package/senior-ci/common/s3cache-helpers.sh +47 -0
  75. package/senior-ci/common/senior-ci-extensions-helpers.sh +15 -0
  76. package/senior-ci/common/sonar_helper.py +203 -0
  77. package/senior-ci/common/validations/buildable_project.py +61 -0
  78. package/senior-ci/common/validations/check_deprecated_primitives.py +49 -0
  79. package/senior-ci/common/validations/check_project_path.py +40 -0
  80. package/senior-ci/common/validations/check_sonar_config_files.py +41 -0
  81. package/senior-ci/common/validations/check_tags.py +41 -0
  82. package/senior-ci/common/validations/validate_changelog.py +151 -0
  83. package/senior-ci/common/validations/validate_issues.py +320 -0
  84. package/senior-ci/docker/build.sh +18 -0
  85. package/senior-ci/docker/config-host.sh +29 -0
  86. package/senior-ci/docker/deploy-service.sh +79 -0
  87. package/senior-ci/docker/push.sh +22 -0
  88. package/senior-ci/frontend/npm/bibliotecas/ci.sh +149 -0
  89. package/senior-ci/frontend/npm/ci.sh +370 -0
  90. package/senior-ci/frontend/npm/release-translations.sh +164 -0
  91. package/senior-ci/helm/deploy.py +56 -0
  92. package/senior-ci/helm/publish.py +41 -0
  93. package/senior-ci/hook/release_notification.sh +88 -0
  94. package/senior-ci/hook/text_notification.sh +10 -0
  95. package/senior-ci/java/bibliotecas/ci.sh +215 -0
  96. package/senior-ci/java/sdl/ci.sh +372 -0
  97. package/senior-ci/java/sdl/scripts/hotfix.sh +78 -0
  98. package/senior-ci/mobile/flutter/apps/__main__.py +5 -0
  99. package/senior-ci/mobile/flutter/apps/ci.py +193 -0
  100. package/senior-ci/mobile/flutter/libs/__main__.py +5 -0
  101. package/senior-ci/mobile/flutter/libs/ci.py +178 -0
  102. package/senior-ci/mobile/flutter/scripts/release.sh +54 -0
  103. package/senior-ci/release-candidate/backend/get_version.sh +64 -0
  104. package/senior-ci/release-candidate/close_branch.sh +113 -0
  105. package/senior-ci/release-candidate/common/create_hotfix.sh +28 -0
  106. package/senior-ci/release-candidate/common/create_release.sh +30 -0
  107. package/senior-ci/release-candidate/create_branch.sh +64 -0
  108. package/senior-ci/release-candidate/frontend/get_version.sh +43 -0
  109. package/senior-ci/requirements-dev.txt +5 -0
  110. package/senior-ci/requirements.txt +5 -0
  111. package/senior-ci/scripts/apply_yamls.py +229 -0
  112. package/senior-ci/scripts/create_sre_issue/__main__.py +7 -0
  113. package/senior-ci/scripts/create_sre_issue/create_sre_issue.py +267 -0
  114. package/senior-ci/scripts/create_sre_issue/helpers.py +166 -0
  115. package/senior-ci/scripts/create_sre_issue/jira_manager.py +37 -0
  116. package/senior-ci/scripts/validate_changelog.sh +3 -0
  117. package/senior-ci/sonar-project.properties +1 -0
  118. package/server.js +5 -0
  119. package/sonar-project.properties +10 -0
  120. package/src/app/app.component.html +43 -0
  121. package/src/app/app.component.scss +36 -0
  122. package/src/app/app.component.ts +56 -0
  123. package/src/app/app.module.ts +64 -0
  124. package/src/app/shared/shared.module.ts +28 -0
  125. package/src/environments/environment.default.ts +3 -0
  126. package/src/environments/environment.prod.ts +6 -0
  127. package/src/environments/environment.ts +7 -0
  128. package/src/favicon.ico +0 -0
  129. package/src/index.html +17 -0
  130. package/src/locale/en-US.json +3 -0
  131. package/src/locale/es-ES.json +3 -0
  132. package/src/locale/pt-BR.json +3 -0
  133. package/src/main.ts +13 -0
  134. package/src/polyfills.ts +58 -0
  135. package/src/styles.scss +11 -0
  136. package/src/tsconfig.app.json +21 -0
  137. package/src/typings.d.ts +15 -0
  138. package/tsconfig.json +39 -0
  139. package/tslint.json +80 -0
  140. package/bundles/seniorsistemas-exclusion-process-component.umd.js +0 -1205
  141. package/bundles/seniorsistemas-exclusion-process-component.umd.js.map +0 -1
  142. package/bundles/seniorsistemas-exclusion-process-component.umd.min.js +0 -16
  143. package/bundles/seniorsistemas-exclusion-process-component.umd.min.js.map +0 -1
  144. package/esm2015/enums/enum-exclusion-process-status.js +0 -8
  145. package/esm2015/exclusion-details/exclusion-details.component.js +0 -216
  146. package/esm2015/exclusion-details/exclusion-details.module.js +0 -28
  147. package/esm2015/exclusion-details/index.js +0 -3
  148. package/esm2015/exclusion-details/protocols/exclusion-details.js +0 -1
  149. package/esm2015/exclusion-details/protocols/index.js +0 -2
  150. package/esm2015/exclusion-details/protocols/show-details-information.js +0 -3
  151. package/esm2015/exclusions-list/exclusions-list.component.js +0 -299
  152. package/esm2015/exclusions-list/exclusions-list.module.js +0 -47
  153. package/esm2015/exclusions-list/exclusions-list.routing.js +0 -115
  154. package/esm2015/exclusions-list/index.js +0 -4
  155. package/esm2015/logical-delete.module.js +0 -27
  156. package/esm2015/models/exclusion-process-step-group.js +0 -1
  157. package/esm2015/models/exclusion-process-step.js +0 -1
  158. package/esm2015/models/exclusion-process.js +0 -1
  159. package/esm2015/models/index.js +0 -1
  160. package/esm2015/models/list-params.js +0 -1
  161. package/esm2015/models/list-result.js +0 -1
  162. package/esm2015/models/project-config.js +0 -3
  163. package/esm2015/public-api.js +0 -4
  164. package/esm2015/seniorsistemas-exclusion-process-component.js +0 -11
  165. package/esm2015/services/filter.service.js +0 -104
  166. package/esm2015/services/index.js +0 -2
  167. package/esm2015/services/logical-delete-config.service.js +0 -29
  168. package/esm2015/services/logical-delete.service.js +0 -109
  169. package/esm5/enums/enum-exclusion-process-status.js +0 -8
  170. package/esm5/exclusion-details/exclusion-details.component.js +0 -235
  171. package/esm5/exclusion-details/exclusion-details.module.js +0 -31
  172. package/esm5/exclusion-details/index.js +0 -3
  173. package/esm5/exclusion-details/protocols/exclusion-details.js +0 -1
  174. package/esm5/exclusion-details/protocols/index.js +0 -2
  175. package/esm5/exclusion-details/protocols/show-details-information.js +0 -7
  176. package/esm5/exclusions-list/exclusions-list.component.js +0 -313
  177. package/esm5/exclusions-list/exclusions-list.module.js +0 -50
  178. package/esm5/exclusions-list/exclusions-list.routing.js +0 -127
  179. package/esm5/exclusions-list/index.js +0 -4
  180. package/esm5/logical-delete.module.js +0 -31
  181. package/esm5/models/exclusion-process-step-group.js +0 -1
  182. package/esm5/models/exclusion-process-step.js +0 -1
  183. package/esm5/models/exclusion-process.js +0 -1
  184. package/esm5/models/index.js +0 -1
  185. package/esm5/models/list-params.js +0 -1
  186. package/esm5/models/list-result.js +0 -1
  187. package/esm5/models/project-config.js +0 -3
  188. package/esm5/public-api.js +0 -4
  189. package/esm5/seniorsistemas-exclusion-process-component.js +0 -11
  190. package/esm5/services/filter.service.js +0 -109
  191. package/esm5/services/index.js +0 -2
  192. package/esm5/services/logical-delete-config.service.js +0 -30
  193. package/esm5/services/logical-delete.service.js +0 -112
  194. package/exclusion-details/exclusion-details.component.d.ts +0 -49
  195. package/exclusion-details/exclusion-details.module.d.ts +0 -2
  196. package/exclusions-list/exclusions-list.component.d.ts +0 -59
  197. package/exclusions-list/exclusions-list.module.d.ts +0 -2
  198. package/exclusions-list/exclusions-list.routing.d.ts +0 -29
  199. package/fesm2015/seniorsistemas-exclusion-process-component.js +0 -917
  200. package/fesm2015/seniorsistemas-exclusion-process-component.js.map +0 -1
  201. package/fesm5/seniorsistemas-exclusion-process-component.js +0 -981
  202. package/fesm5/seniorsistemas-exclusion-process-component.js.map +0 -1
  203. package/logical-delete.module.d.ts +0 -5
  204. package/seniorsistemas-exclusion-process-component.d.ts +0 -10
  205. package/seniorsistemas-exclusion-process-component.metadata.json +0 -1
  206. package/services/filter.service.d.ts +0 -19
  207. package/services/logical-delete-config.service.d.ts +0 -8
  208. package/services/logical-delete.service.d.ts +0 -20
  209. /package/{exclusion-details/index.d.ts → lib/src/exclusion-details/index.ts} +0 -0
  210. /package/{exclusion-details/protocols/index.d.ts → lib/src/exclusion-details/protocols/index.ts} +0 -0
  211. /package/{models/index.d.ts → lib/src/models/index.ts} +0 -0
  212. /package/{models/list-result.d.ts → lib/src/models/list-result.ts} +0 -0
  213. /package/{services/index.d.ts → lib/src/services/index.ts} +0 -0
@@ -0,0 +1,290 @@
1
+ import { TestBed } from "@angular/core/testing";
2
+ import { TranslateModule, TranslateService } from "@ngx-translate/core";
3
+ import { FieldType, FormField } from "@seniorsistemas/angular-components";
4
+ import { ProjectConfigs, ProjectConfigsInjectionToken } from "../models/project-config";
5
+ import { FilterService } from "./filter.service";
6
+ import { LogicalDeleteConfigService } from "./logical-delete-config.service";
7
+
8
+ describe("FilterService", () => {
9
+ let service: FilterService;
10
+ let translateService: TranslateService;
11
+ let logicalDeleteConfigService: LogicalDeleteConfigService;
12
+
13
+ const defaultProjectConfigs: ProjectConfigs = {
14
+ domain: "domain",
15
+ service: "service"
16
+ };
17
+
18
+ beforeEach(() => {
19
+ TestBed.configureTestingModule({
20
+ imports: [TranslateModule.forRoot()],
21
+ providers: [
22
+ TranslateService,
23
+ LogicalDeleteConfigService,
24
+ {
25
+ provide: ProjectConfigsInjectionToken,
26
+ useValue: defaultProjectConfigs
27
+ }
28
+ ]
29
+ });
30
+ translateService = TestBed.inject(TranslateService);
31
+ logicalDeleteConfigService = TestBed.inject(LogicalDeleteConfigService);
32
+ service = new FilterService(logicalDeleteConfigService, translateService);
33
+ });
34
+
35
+ it("should be created", () => {
36
+ expect(service).toBeTruthy();
37
+ });
38
+
39
+ describe("getEnumQuery", () => {
40
+ it("should return filter for single selection enum with default param", () => {
41
+ const result = service.getEnumQuery("fieldName", "TEST");
42
+ expect(result).toBe("fieldName eq 'TEST'");
43
+ });
44
+
45
+ it("should return filter for single selection enum", () => {
46
+ const result = service.getEnumQuery("fieldName", "TEST", false);
47
+ expect(result).toBe("fieldName eq 'TEST'");
48
+ });
49
+
50
+ it("should return filter for multitle selection enum", () => {
51
+ const result = service.getEnumQuery("fieldName", ["VALUE1", "VALUE2"], true);
52
+ expect(result).toBe("(fieldName eq 'VALUE1' or fieldName eq 'VALUE2')");
53
+ });
54
+ });
55
+
56
+ describe("createFilterString", () => {
57
+ it("should return the filter for a number value", () => {
58
+ const formField = new FormField({ type: FieldType.Number, name: "fieldName" });
59
+ const result = service.createFilterString(formField, 15.2);
60
+ expect(result).toBe("fieldName eq 15.2");
61
+ });
62
+
63
+ it("should return the filter for a date value", () => {
64
+ const filterValue = new Date(2022, 5, 10);
65
+ const formField = new FormField({ type: FieldType.Date, name: "fieldName" });
66
+ const result = service.createFilterString(formField, filterValue);
67
+ expect(result).toBe("fieldName eq '2022-06-10'");
68
+ });
69
+
70
+ it("should return the filter for a time value", () => {
71
+ const filterValue = new Date(2022, 5, 10, 23, 41, 55);
72
+ const formField = new FormField({ type: FieldType.Time, name: "fieldName" });
73
+ const result = service.createFilterString(formField, filterValue);
74
+ expect(result).toBe("fieldName eq '23:41:55'");
75
+ });
76
+
77
+ it("should return the filter for a dateTime value", () => {
78
+ const filterValue = new Date(2022, 5, 10, 23, 41, 55);
79
+ const formField = new FormField({ type: FieldType.DateTime, name: "fieldName" });
80
+ const result = service.createFilterString(formField, filterValue);
81
+ expect(result).toBe("fieldName eq '2022-06-10T23:41:55-03:00'");
82
+ });
83
+
84
+ it("should return the filter for a single value enum", () => {
85
+ const filterValue = 'PF';
86
+ const formField = new FormField({ type: FieldType.Enum, name: "fieldName" });
87
+ const result = service.createFilterString(formField, filterValue);
88
+ expect(result).toBe("fieldName eq 'PF'");
89
+ });
90
+
91
+ it("should return the filter for a multiple value enum", () => {
92
+ const filterValue = ['PF', 'PJ'];
93
+ const formField = new FormField({ type: FieldType.Enum, name: "fieldName", multiple: true });
94
+ const result = service.createFilterString(formField, filterValue);
95
+ expect(result).toBe("(fieldName eq 'PF' or fieldName eq 'PJ')");
96
+ });
97
+
98
+ it("should return the filter for a string value", () => {
99
+ const formField = new FormField({ type: FieldType.String, name: "fieldName" });
100
+ const result = service.createFilterString(formField, "some text");
101
+ expect(result).toBe("containing(upper(fieldName), upper('some text'))");
102
+ });
103
+
104
+ it("should return the filter for a lookup value", () => {
105
+ const filterValue = {
106
+ id: 'filter id',
107
+ name: 'name'
108
+ };
109
+ const formField = { type: FieldType.Lookup, name: "fieldName" };
110
+ const result = service.createFilterString(formField as any, filterValue);
111
+ expect(result).toBe("fieldName eq 'filter id'");
112
+ });
113
+
114
+ it("should return the filter the other field types", () => {
115
+ let result = service.createFilterString({ type: FieldType.Binary, name: "fieldName" } as any, "some value");
116
+ expect(result).toBe("fieldName eq 'some value'");
117
+
118
+ result = service.createFilterString({ type: FieldType.Autocomplete, name: "fieldName" } as any, "some value");
119
+ expect(result).toBe("fieldName eq 'some value'");
120
+
121
+ result = service.createFilterString({ type: FieldType.Blob, name: "fieldName" } as any, "some value");
122
+ expect(result).toBe("fieldName eq 'some value'");
123
+
124
+ result = service.createFilterString({ type: FieldType.Boolean, name: "fieldName" } as any, true);
125
+ expect(result).toBe("fieldName eq 'true'");
126
+
127
+ result = service.createFilterString({ type: FieldType.Custom, name: "fieldName" } as any, "some value");
128
+ expect(result).toBe("fieldName eq 'some value'");
129
+ });
130
+ });
131
+
132
+ describe("createFilterTokens", () => {
133
+ it("should return the token for a date value", () => {
134
+ const filterValue = new Date(2022, 5, 10);
135
+ const formField = new FormField({ type: FieldType.Date, name: "fieldName", label: "Field" });
136
+ const result = service.createFilterTokens(formField, filterValue);
137
+ expect(result).toEqual({id: "fieldName", label: "Field: 06/10/2022"});
138
+ });
139
+
140
+ it("should return the token for a time value", () => {
141
+ const filterValue = new Date(2022, 5, 10, 23, 41, 55);
142
+ const formField = new FormField({ type: FieldType.Time, name: "fieldName", label: "Field" });
143
+ const result = service.createFilterTokens(formField, filterValue);
144
+ expect(result).toEqual({id: "fieldName", label: "Field: 11:41:55 PM"});
145
+ });
146
+
147
+ it("should return the token for a dateTime value", () => {
148
+ const filterValue = new Date(2022, 5, 10, 23, 41, 55);
149
+ const formField = new FormField({ type: FieldType.DateTime, name: "fieldName", label: "Field" });
150
+ const result = service.createFilterTokens(formField, filterValue);
151
+ expect(result).toEqual({id: "fieldName", label: "Field: 06/10/2022 11:41:55 PM"});
152
+ });
153
+
154
+ it("should return the token for a lookup field", () => {
155
+ const filterValue = {
156
+ id: 'id',
157
+ name: 'name'
158
+ };
159
+ const formField = {
160
+ type: FieldType.Lookup,
161
+ name: "fieldName",
162
+ label: "Field",
163
+ searchFields: [
164
+ new FormField({type: FieldType.String, name: 'id'}),
165
+ new FormField({type: FieldType.String, name: 'name'})
166
+ ]
167
+ };
168
+ const result = service.createFilterTokens(formField, filterValue);
169
+ expect(result).toEqual({id: "fieldName", label: "Field: id - name"});
170
+ });
171
+
172
+ it("should return the token for a enum field", () => {
173
+ const filterValue = 'VA';
174
+ const formField = {
175
+ type: FieldType.Enum,
176
+ name: "fieldName",
177
+ label: "Field",
178
+ options: [{
179
+ value: 'VA',
180
+ label: 'VA - Label'
181
+ },
182
+ {
183
+ value: 'VI',
184
+ label: 'VI - Label'
185
+ }]
186
+ };
187
+ const result = service.createFilterTokens(formField, filterValue);
188
+ expect(result).toEqual({id: "fieldName", label: "Field: VA - Label"});
189
+ });
190
+
191
+ it("should return the token for a boolean field", () => {
192
+ spyOn(translateService, "instant").and.callFake((value: any) => `translated_${value}`);
193
+ const formField = {
194
+ type: FieldType.Boolean,
195
+ name: "fieldName",
196
+ label: "Field"
197
+ };
198
+
199
+ let result = service.createFilterTokens(formField, true);
200
+ expect(result.label).toBe("Field: translated_domain.service.list_grid_boolean_true");
201
+
202
+ result = service.createFilterTokens(formField, false);
203
+ expect(result.label).toBe("Field: translated_domain.service.list_grid_boolean_false");
204
+ });
205
+ });
206
+
207
+ describe("getSuggestionValue", () => {
208
+ it("should return the suggestion value", () => {
209
+ const obj = {
210
+ id: 'id',
211
+ description: 'description',
212
+ innerField: {
213
+ id: 'inner id',
214
+ name: 'inner name'
215
+ }
216
+ };
217
+ const result = service.getSuggestionValue(["id", "name"], "innerField", obj, ' * ');
218
+ expect(result).toBe("inner id * inner name");
219
+ });
220
+ });
221
+
222
+ describe("getProp", () => {
223
+ it("should return the property value", () => {
224
+ const obj = {
225
+ prop: "Prop1",
226
+ otherProps: "OtherProps"
227
+ };
228
+
229
+ const result = service.getProp(obj, "prop");
230
+ expect(result).toBe("Prop1");
231
+ });
232
+
233
+ it("should return the property value if the path has inner props", () => {
234
+ const obj = {
235
+ prop: {
236
+ innerProp: "InnerProp"
237
+ },
238
+ otherProps: "OtherProps"
239
+ };
240
+
241
+ const result = service.getProp(obj, "prop.innerProp");
242
+ expect(result).toBe("InnerProp");
243
+ });
244
+
245
+ it("should return an empty string if the value is undefined", () => {
246
+ const obj = {
247
+ prop: {},
248
+ otherProps: "OtherProps"
249
+ };
250
+
251
+ const result = service.getProp(obj, "prop.innerProp");
252
+ expect(result).toBe("");
253
+ });
254
+ });
255
+
256
+ describe("getLabelValueRequest", () => {
257
+ it("should return the content with the label prop", () => {
258
+ const content = [{
259
+ id: 'id',
260
+ description: 'description'
261
+ }];
262
+ const result = service.getLabelValueRequest(content, ['id', 'description']);
263
+ expect(result[0]).toEqual({
264
+ id: 'id',
265
+ description: 'description',
266
+ label: 'id - description'
267
+ });
268
+ });
269
+
270
+ it("should create the label with inner props", () => {
271
+ const content = [{
272
+ id: 'id',
273
+ description: 'description',
274
+ assoc: {
275
+ description: 'assoc description'
276
+ }
277
+ }];
278
+
279
+ const result = service.getLabelValueRequest(content, ['assoc.description']);
280
+ expect(result[0]).toEqual({
281
+ id: 'id',
282
+ description: 'description',
283
+ assoc: {
284
+ description: 'assoc description'
285
+ },
286
+ label: 'assoc description'
287
+ });
288
+ });
289
+ });
290
+ });
@@ -0,0 +1,109 @@
1
+ import * as moment from "moment";
2
+ import { Injectable } from "@angular/core";
3
+ import { FieldType, FormField, Option } from "@seniorsistemas/angular-components";
4
+ import { TranslateService } from "@ngx-translate/core";
5
+ import { LogicalDeleteConfigService } from "./logical-delete-config.service";
6
+
7
+ @Injectable()
8
+ export class FilterService {
9
+ private readonly numberTypes = [FieldType.Integer, FieldType.Double];
10
+
11
+ constructor(
12
+ private readonly logicalDeleteConfigService: LogicalDeleteConfigService,
13
+ private readonly translate: TranslateService
14
+ ) {}
15
+
16
+ getEnumQuery(name: string, value: any, multiple: boolean = false) {
17
+ if (multiple) {
18
+ const filter = value.map((selected: any) => `${name} eq '${selected}'`).join(" or ");
19
+ return `(${filter})`;
20
+ }
21
+ return `${name} eq '${value}'`;
22
+ }
23
+
24
+ createFilterString(formField: FormField, value: any) {
25
+ const { name, type, multiple } = formField;
26
+ if (typeof value == "number") {
27
+ return `${name} eq ${value}`;
28
+ }
29
+
30
+ switch (type) {
31
+ case FieldType.Date:
32
+ return `${name} eq '${moment(value).format("YYYY-MM-DD")}'`;
33
+ case FieldType.Time:
34
+ return `${name} eq '${moment(value).format("HH:mm:ss")}'`;
35
+ case FieldType.DateTime:
36
+ return `${name} eq '${moment(value).format()}'`;
37
+ case FieldType.LocalDateTime:
38
+ return `${name} eq '${moment(value).format("YYYY-MM-DD[T]HH:mm:ss.SSS")}'`;
39
+ case FieldType.Enum:
40
+ return this.getEnumQuery(name, value, multiple);
41
+ case FieldType.String:
42
+ return `containing(upper(${name}), upper('${value.replace(/'/g, "'")}'))`;
43
+ case FieldType.Lookup:
44
+ return `${name} eq '${value.id}'`;
45
+ default:
46
+ return `${name} eq '${value}'`;
47
+ }
48
+ }
49
+
50
+ createFilterTokens(formField: FormField, value: any) {
51
+ const { name, type, label, searchFields, options } = formField as any;
52
+ let labelValue = value;
53
+
54
+ switch (type) {
55
+ case FieldType.Date:
56
+ labelValue = moment(value).format("L");
57
+ break;
58
+ case FieldType.Time:
59
+ labelValue = moment(value).format("LTS");
60
+ break;
61
+ case FieldType.LocalDateTime:
62
+ case FieldType.DateTime:
63
+ labelValue = moment(value).format("L LTS");
64
+ break;
65
+ case FieldType.Lookup:
66
+ labelValue = searchFields.map((field: FormField) => this.getProp(value, field.name)).join(" - ");
67
+ break;
68
+ case FieldType.Enum:
69
+ if (Array.isArray(value)) {
70
+ labelValue = value.map((element: string) => {
71
+ return options.filter((en: any) => en.value === element)[0].label;
72
+ });
73
+ } else {
74
+ labelValue = options.filter((option: Option) => option.value === labelValue)[0].label;
75
+ }
76
+ break;
77
+ case FieldType.Boolean:
78
+ labelValue = value
79
+ ? this.translate.instant(`${this.logicalDeleteConfigService.getTranslationPrefix()}.list_grid_boolean_true`)
80
+ : this.translate.instant(`${this.logicalDeleteConfigService.getTranslationPrefix()}.list_grid_boolean_false`);
81
+ break;
82
+ }
83
+
84
+ return { id: name, label: `${label}: ${labelValue}` };
85
+ }
86
+
87
+ getSuggestionValue(displayFields: string[], ownerEntity: string, value: any, separator: string) {
88
+ return displayFields.map(field => this.getProp(value, `${ownerEntity}.${field}`))
89
+ .reduce((acc: any, val: any) => `${acc}${separator}${val}`) + "";
90
+ }
91
+
92
+ getProp(obj: any, path: any) {
93
+ return path.split(".").reduce((result: any, prop: any) => (result[prop] === undefined ? "" : result[prop]), obj);
94
+ }
95
+
96
+ getLabelValueRequest(contents: any[], displayFields: any[]) {
97
+ return contents.map((item: any) => ({
98
+ ...item,
99
+ label: displayFields.map(field => this.getProp(item, field)).join(" - ")
100
+ }));
101
+ }
102
+
103
+ isValidFilter(type: FieldType, value: any) {
104
+ const isTypeNumber = this.numberTypes.includes(type);
105
+ const numberPattern = /^\d+\b$/;
106
+ const isNumber = value.match(numberPattern);
107
+ return !(isTypeNumber && !isNumber);
108
+ }
109
+ }
@@ -0,0 +1,59 @@
1
+ import { TestBed } from "@angular/core/testing";
2
+ import { ProjectConfigs, ProjectConfigsInjectionToken } from "../models/project-config";
3
+ import { LogicalDeleteConfigService } from "./logical-delete-config.service";
4
+
5
+ describe("LogicalDeleteConfigService", () => {
6
+ let service: LogicalDeleteConfigService;
7
+ let projectConfigs: ProjectConfigs;
8
+
9
+ const defaultProjectConfigs: ProjectConfigs = {
10
+ domain: "domain",
11
+ service: "service"
12
+ };
13
+
14
+ beforeEach(() => {
15
+ TestBed.configureTestingModule({
16
+ providers: [{
17
+ provide: ProjectConfigsInjectionToken,
18
+ useValue: defaultProjectConfigs
19
+ }]
20
+ });
21
+ projectConfigs = TestBed.inject(ProjectConfigsInjectionToken);
22
+ service = new LogicalDeleteConfigService(projectConfigs);
23
+ });
24
+
25
+ it("should be created", () => {
26
+ expect(service).toBeTruthy();
27
+ });
28
+
29
+ describe("getDomain", () => {
30
+ it("should return the configured domain on getDomain", () => {
31
+ const response = service.getDomain();
32
+ expect(response).toBe("domain");
33
+ });
34
+ });
35
+
36
+ describe("getService", () => {
37
+ it("should return the configured service on getService", () => {
38
+ const response = service.getService();
39
+ expect(response).toBe("service");
40
+ });
41
+ });
42
+
43
+ describe("getTranslationPrefix", () => {
44
+ it("should return configured translationPrefix if configured", () => {
45
+ service = new LogicalDeleteConfigService({
46
+ ...defaultProjectConfigs,
47
+ translationPrefix: "custom translationPrefix"
48
+ });
49
+
50
+ const response = service.getTranslationPrefix();
51
+ expect(response).toBe("custom translationPrefix");
52
+ });
53
+
54
+ it("should return domain and service if translationPrefix is not configured", () => {
55
+ const response = service.getTranslationPrefix();
56
+ expect(response).toBe("domain.service");
57
+ });
58
+ });
59
+ });
@@ -0,0 +1,25 @@
1
+ import { Inject, Injectable } from "@angular/core";
2
+ import { ProjectConfigs, ProjectConfigsInjectionToken } from "../models/project-config";
3
+
4
+ @Injectable()
5
+ export class LogicalDeleteConfigService {
6
+ constructor(
7
+ @Inject(ProjectConfigsInjectionToken)
8
+ private readonly projectConfigs: ProjectConfigs) {
9
+ }
10
+
11
+ public getDomain() {
12
+ return this.projectConfigs.domain;
13
+ }
14
+
15
+ public getService() {
16
+ return this.projectConfigs.service;
17
+ }
18
+
19
+ public getTranslationPrefix() {
20
+ if (this.projectConfigs.translationPrefix) {
21
+ return this.projectConfigs.translationPrefix;
22
+ }
23
+ return `${this.projectConfigs.domain}.${this.projectConfigs.service}`;
24
+ }
25
+ }