@smartsoft001/crud-shell-angular 1.2.90 → 2.69.0

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 (214) hide show
  1. package/.storybook/addons.js +1 -0
  2. package/.storybook/config.js +5 -0
  3. package/.storybook/tsconfig.json +8 -0
  4. package/.storybook/webpack.config.js +7 -0
  5. package/jest.config.ts +38 -0
  6. package/ng-package.json +7 -0
  7. package/package.json +12 -23
  8. package/project.json +49 -0
  9. package/src/index.ts +13 -0
  10. package/src/lib/+state/crud.facade.ts +82 -0
  11. package/src/lib/+state/crud.feature.methods.ts +258 -0
  12. package/src/lib/+state/crud.feature.store.ts +77 -0
  13. package/src/lib/components/components.module.ts +58 -0
  14. package/src/lib/components/export/export.component.ts +69 -0
  15. package/src/lib/components/filter/base/base.component.ts +175 -0
  16. package/src/lib/components/filter/check/check.component.scss +25 -0
  17. package/src/lib/components/filter/check/check.component.ts +72 -0
  18. package/src/lib/components/filter/date/date.component.html +30 -0
  19. package/src/lib/components/filter/date/date.component.ts +70 -0
  20. package/src/lib/components/filter/date-time/date-time.component.html +62 -0
  21. package/src/lib/components/filter/date-time/date-time.component.ts +56 -0
  22. package/src/lib/components/filter/date-with-edit/date-with-edit.component.html +109 -0
  23. package/src/lib/components/filter/date-with-edit/date-with-edit.component.ts +70 -0
  24. package/src/lib/components/filter/filter.component.html +52 -0
  25. package/src/lib/components/filter/filter.component.ts +34 -0
  26. package/src/lib/components/filter/flag/flag.component.ts +55 -0
  27. package/src/lib/components/filter/index.ts +9 -0
  28. package/src/lib/components/filter/int/int.component.html +74 -0
  29. package/src/lib/components/filter/int/int.component.ts +57 -0
  30. package/src/lib/components/filter/radio/radio.component.ts +74 -0
  31. package/src/lib/components/filter/text/text.component.ts +46 -0
  32. package/src/lib/components/filters/filters.component.scss +150 -0
  33. package/src/lib/components/filters/filters.component.ts +157 -0
  34. package/src/lib/components/filters-config/filters-config.component.ts +69 -0
  35. package/src/lib/components/group/group.component.ts +93 -0
  36. package/src/lib/components/index.ts +7 -0
  37. package/src/lib/components/multiselect/multiselect.component.html +41 -0
  38. package/src/lib/components/multiselect/multiselect.component.scss +125 -0
  39. package/src/lib/components/multiselect/multiselect.component.ts +104 -0
  40. package/src/lib/crud-full.module.ts +51 -0
  41. package/src/lib/crud.config.ts +79 -0
  42. package/src/lib/crud.module.ts +72 -0
  43. package/src/lib/factories/list-pagination/list-pagination.factory.ts +77 -0
  44. package/src/lib/models/index.ts +1 -0
  45. package/src/lib/models/interfaces.ts +34 -0
  46. package/src/lib/pages/index.ts +6 -0
  47. package/src/lib/pages/item/base/base.component.ts +54 -0
  48. package/src/lib/pages/item/item.component.ts +513 -0
  49. package/src/lib/pages/item/standard/standard.component.scss +0 -0
  50. package/src/lib/pages/item/standard/standard.component.ts +50 -0
  51. package/src/lib/pages/list/base/base.component.ts +29 -0
  52. package/src/lib/pages/list/list.component.stories.ts +77 -0
  53. package/src/lib/pages/list/list.component.ts +438 -0
  54. package/src/lib/pages/list/standard/standard.component.ts +42 -0
  55. package/src/lib/pipes/form-options/form-options.pipe.ts +61 -0
  56. package/src/lib/pipes/index.ts +2 -0
  57. package/src/lib/pipes/pipes.module.ts +9 -0
  58. package/src/lib/providers/model-possibilities/model-possibilities.provider.ts +19 -0
  59. package/src/lib/services/crud/crud.service.spec.ts +303 -0
  60. package/src/lib/services/crud/crud.service.ts +178 -0
  61. package/src/lib/services/list-group/list-group.service.spec.ts +87 -0
  62. package/src/lib/services/list-group/list-group.service.ts +65 -0
  63. package/src/lib/services/page/page.service.spec.ts +143 -0
  64. package/src/lib/services/page/page.service.ts +44 -0
  65. package/src/lib/services/search/search.service.spec.ts +134 -0
  66. package/src/lib/services/search/search.service.ts +42 -0
  67. package/test-setup.ts +0 -0
  68. package/tsconfig.json +13 -0
  69. package/tsconfig.lib.json +31 -0
  70. package/tsconfig.lib.prod.json +11 -0
  71. package/tsconfig.spec.json +10 -0
  72. package/tslint.json +10 -0
  73. package/esm2022/index.mjs +0 -18
  74. package/esm2022/lib/+state/crud.actions.mjs +0 -224
  75. package/esm2022/lib/+state/crud.effects.mjs +0 -182
  76. package/esm2022/lib/+state/crud.facade.mjs +0 -91
  77. package/esm2022/lib/+state/crud.reducer.mjs +0 -214
  78. package/esm2022/lib/+state/crud.selectors.mjs +0 -11
  79. package/esm2022/lib/components/components.module.mjs +0 -110
  80. package/esm2022/lib/components/export/export.component.mjs +0 -47
  81. package/esm2022/lib/components/filter/base/base.component.mjs +0 -152
  82. package/esm2022/lib/components/filter/check/check.component.mjs +0 -36
  83. package/esm2022/lib/components/filter/date/date.component.mjs +0 -47
  84. package/esm2022/lib/components/filter/date-time/date-time.component.mjs +0 -43
  85. package/esm2022/lib/components/filter/date-with-edit/date-with-edit.component.mjs +0 -49
  86. package/esm2022/lib/components/filter/filter.component.mjs +0 -30
  87. package/esm2022/lib/components/filter/flag/flag.component.mjs +0 -16
  88. package/esm2022/lib/components/filter/index.mjs +0 -10
  89. package/esm2022/lib/components/filter/int/int.component.mjs +0 -38
  90. package/esm2022/lib/components/filter/radio/radio.component.mjs +0 -16
  91. package/esm2022/lib/components/filter/text/text.component.mjs +0 -16
  92. package/esm2022/lib/components/filters/filters.component.mjs +0 -111
  93. package/esm2022/lib/components/filters-config/filters-config.component.mjs +0 -37
  94. package/esm2022/lib/components/group/group.component.mjs +0 -54
  95. package/esm2022/lib/components/index.mjs +0 -8
  96. package/esm2022/lib/components/multiselect/multiselect.component.mjs +0 -71
  97. package/esm2022/lib/crud-full.module.mjs +0 -103
  98. package/esm2022/lib/crud.config.mjs +0 -17
  99. package/esm2022/lib/crud.module.mjs +0 -106
  100. package/esm2022/lib/factories/list-pagination/list-pagination.factory.mjs +0 -69
  101. package/esm2022/lib/models/index.mjs +0 -2
  102. package/esm2022/lib/models/interfaces.mjs +0 -2
  103. package/esm2022/lib/pages/index.mjs +0 -7
  104. package/esm2022/lib/pages/item/base/base.component.mjs +0 -44
  105. package/esm2022/lib/pages/item/item.component.mjs +0 -395
  106. package/esm2022/lib/pages/item/standard/standard.component.mjs +0 -15
  107. package/esm2022/lib/pages/list/base/base.component.mjs +0 -23
  108. package/esm2022/lib/pages/list/list.component.mjs +0 -355
  109. package/esm2022/lib/pages/list/standard/standard.component.mjs +0 -34
  110. package/esm2022/lib/pipes/form-options/form-options.pipe.mjs +0 -55
  111. package/esm2022/lib/pipes/index.mjs +0 -3
  112. package/esm2022/lib/pipes/pipes.module.mjs +0 -20
  113. package/esm2022/lib/providers/model-possibilities/model-possibilities.provider.mjs +0 -11
  114. package/esm2022/lib/services/crud/crud.service.mjs +0 -138
  115. package/esm2022/lib/services/list-group/list-group.service.mjs +0 -60
  116. package/esm2022/lib/services/page/page.service.mjs +0 -41
  117. package/esm2022/lib/services/search/search.service.mjs +0 -41
  118. package/esm2022/lib/services/socket/socket.service.mjs +0 -17
  119. package/esm2022/smartsoft001-crud-shell-angular.mjs +0 -5
  120. package/fesm2022/smartsoft001-crud-shell-angular.mjs +0 -2810
  121. package/fesm2022/smartsoft001-crud-shell-angular.mjs.map +0 -1
  122. package/index.d.ts +0 -18
  123. package/index.d.ts.map +0 -1
  124. package/lib/+state/crud.actions.d.ts +0 -152
  125. package/lib/+state/crud.actions.d.ts.map +0 -1
  126. package/lib/+state/crud.effects.d.ts +0 -18
  127. package/lib/+state/crud.effects.d.ts.map +0 -1
  128. package/lib/+state/crud.facade.d.ts +0 -44
  129. package/lib/+state/crud.facade.d.ts.map +0 -1
  130. package/lib/+state/crud.reducer.d.ts +0 -43
  131. package/lib/+state/crud.reducer.d.ts.map +0 -1
  132. package/lib/+state/crud.selectors.d.ts +0 -10
  133. package/lib/+state/crud.selectors.d.ts.map +0 -1
  134. package/lib/components/components.module.d.ts +0 -27
  135. package/lib/components/components.module.d.ts.map +0 -1
  136. package/lib/components/export/export.component.d.ts +0 -21
  137. package/lib/components/export/export.component.d.ts.map +0 -1
  138. package/lib/components/filter/base/base.component.d.ts +0 -39
  139. package/lib/components/filter/base/base.component.d.ts.map +0 -1
  140. package/lib/components/filter/check/check.component.d.ts +0 -19
  141. package/lib/components/filter/check/check.component.d.ts.map +0 -1
  142. package/lib/components/filter/date/date.component.d.ts +0 -16
  143. package/lib/components/filter/date/date.component.d.ts.map +0 -1
  144. package/lib/components/filter/date-time/date-time.component.d.ts +0 -15
  145. package/lib/components/filter/date-time/date-time.component.d.ts.map +0 -1
  146. package/lib/components/filter/date-with-edit/date-with-edit.component.d.ts +0 -17
  147. package/lib/components/filter/date-with-edit/date-with-edit.component.d.ts.map +0 -1
  148. package/lib/components/filter/filter.component.d.ts +0 -14
  149. package/lib/components/filter/filter.component.d.ts.map +0 -1
  150. package/lib/components/filter/flag/flag.component.d.ts +0 -8
  151. package/lib/components/filter/flag/flag.component.d.ts.map +0 -1
  152. package/lib/components/filter/index.d.ts +0 -10
  153. package/lib/components/filter/index.d.ts.map +0 -1
  154. package/lib/components/filter/int/int.component.d.ts +0 -15
  155. package/lib/components/filter/int/int.component.d.ts.map +0 -1
  156. package/lib/components/filter/radio/radio.component.d.ts +0 -8
  157. package/lib/components/filter/radio/radio.component.d.ts.map +0 -1
  158. package/lib/components/filter/text/text.component.d.ts +0 -8
  159. package/lib/components/filter/text/text.component.d.ts.map +0 -1
  160. package/lib/components/filters/filters.component.d.ts +0 -83
  161. package/lib/components/filters/filters.component.d.ts.map +0 -1
  162. package/lib/components/filters-config/filters-config.component.d.ts +0 -19
  163. package/lib/components/filters-config/filters-config.component.d.ts.map +0 -1
  164. package/lib/components/group/group.component.d.ts +0 -23
  165. package/lib/components/group/group.component.d.ts.map +0 -1
  166. package/lib/components/index.d.ts +0 -8
  167. package/lib/components/index.d.ts.map +0 -1
  168. package/lib/components/multiselect/multiselect.component.d.ts +0 -28
  169. package/lib/components/multiselect/multiselect.component.d.ts.map +0 -1
  170. package/lib/crud-full.module.d.ts +0 -28
  171. package/lib/crud-full.module.d.ts.map +0 -1
  172. package/lib/crud.config.d.ts +0 -65
  173. package/lib/crud.config.d.ts.map +0 -1
  174. package/lib/crud.module.d.ts +0 -34
  175. package/lib/crud.module.d.ts.map +0 -1
  176. package/lib/factories/list-pagination/list-pagination.factory.d.ts +0 -20
  177. package/lib/factories/list-pagination/list-pagination.factory.d.ts.map +0 -1
  178. package/lib/models/index.d.ts +0 -2
  179. package/lib/models/index.d.ts.map +0 -1
  180. package/lib/models/interfaces.d.ts +0 -30
  181. package/lib/models/interfaces.d.ts.map +0 -1
  182. package/lib/pages/index.d.ts +0 -7
  183. package/lib/pages/index.d.ts.map +0 -1
  184. package/lib/pages/item/base/base.component.d.ts +0 -25
  185. package/lib/pages/item/base/base.component.d.ts.map +0 -1
  186. package/lib/pages/item/item.component.d.ts +0 -70
  187. package/lib/pages/item/item.component.d.ts.map +0 -1
  188. package/lib/pages/item/standard/standard.component.d.ts +0 -8
  189. package/lib/pages/item/standard/standard.component.d.ts.map +0 -1
  190. package/lib/pages/list/base/base.component.d.ts +0 -15
  191. package/lib/pages/list/base/base.component.d.ts.map +0 -1
  192. package/lib/pages/list/list.component.d.ts +0 -54
  193. package/lib/pages/list/list.component.d.ts.map +0 -1
  194. package/lib/pages/list/standard/standard.component.d.ts +0 -14
  195. package/lib/pages/list/standard/standard.component.d.ts.map +0 -1
  196. package/lib/pipes/form-options/form-options.pipe.d.ts +0 -15
  197. package/lib/pipes/form-options/form-options.pipe.d.ts.map +0 -1
  198. package/lib/pipes/index.d.ts +0 -3
  199. package/lib/pipes/index.d.ts.map +0 -1
  200. package/lib/pipes/pipes.module.d.ts +0 -8
  201. package/lib/pipes/pipes.module.d.ts.map +0 -1
  202. package/lib/providers/model-possibilities/model-possibilities.provider.d.ts +0 -18
  203. package/lib/providers/model-possibilities/model-possibilities.provider.d.ts.map +0 -1
  204. package/lib/services/crud/crud.service.d.ts +0 -38
  205. package/lib/services/crud/crud.service.d.ts.map +0 -1
  206. package/lib/services/list-group/list-group.service.d.ts +0 -15
  207. package/lib/services/list-group/list-group.service.d.ts.map +0 -1
  208. package/lib/services/page/page.service.d.ts +0 -12
  209. package/lib/services/page/page.service.d.ts.map +0 -1
  210. package/lib/services/search/search.service.d.ts +0 -16
  211. package/lib/services/search/search.service.d.ts.map +0 -1
  212. package/lib/services/socket/socket.service.d.ts +0 -10
  213. package/lib/services/socket/socket.service.d.ts.map +0 -1
  214. package/smartsoft001-crud-shell-angular.d.ts.map +0 -1
@@ -0,0 +1,143 @@
1
+ // Create interface for our mock
2
+ import { ɵNoopNgZone as NoopNgZone, NgZone } from '@angular/core';
3
+ import { TestBed } from '@angular/core/testing';
4
+ import {
5
+ BrowserTestingModule,
6
+ platformBrowserTesting,
7
+ } from '@angular/platform-browser/testing';
8
+
9
+ interface MockAuthService {
10
+ expectPermissions: jest.Mock;
11
+ }
12
+
13
+ // Mock getModelOptions
14
+ const mockGetModelOptions = jest.fn();
15
+ jest.mock('@smartsoft001/models', () => ({
16
+ getModelOptions: mockGetModelOptions,
17
+ }));
18
+
19
+ // Mock entire @smartsoft001/angular module
20
+ jest.mock('@smartsoft001/angular', () => ({
21
+ AuthService: jest.fn().mockImplementation(() => ({
22
+ expectPermissions: jest.fn(),
23
+ })),
24
+ }));
25
+
26
+ import { AuthService } from '@smartsoft001/angular';
27
+
28
+ import { PageService } from './page.service';
29
+ import { CrudFullConfig } from '../../crud.config';
30
+
31
+ TestBed.initTestEnvironment(BrowserTestingModule, platformBrowserTesting());
32
+
33
+ describe('crud-shell-angular: PageService', () => {
34
+ let service: PageService<any>;
35
+ let authService: MockAuthService;
36
+ let config: CrudFullConfig<any>;
37
+
38
+ beforeEach(() => {
39
+ config = {
40
+ type: 'TestType',
41
+ title: 'Test Title',
42
+ apiUrl: 'http://test-api.com',
43
+ entity: {} as any,
44
+ add: true,
45
+ edit: true,
46
+ remove: true,
47
+ };
48
+
49
+ TestBed.configureTestingModule({
50
+ providers: [
51
+ PageService,
52
+ { provide: AuthService, useValue: { expectPermissions: jest.fn() } },
53
+ { provide: CrudFullConfig, useValue: config },
54
+ { provide: NgZone, useClass: NoopNgZone },
55
+ ],
56
+ });
57
+
58
+ service = TestBed.inject(PageService);
59
+ authService = TestBed.inject(AuthService) as unknown as MockAuthService;
60
+
61
+ // Reset all mocks before each test
62
+ jest.clearAllMocks();
63
+ mockGetModelOptions.mockReturnValue({
64
+ create: { permissions: ['create'] },
65
+ update: { permissions: ['update'] },
66
+ remove: { permissions: ['delete'] },
67
+ });
68
+ });
69
+
70
+ it('should create service', () => {
71
+ expect(service).toBeTruthy();
72
+ });
73
+
74
+ describe('checkPermissions', () => {
75
+ it('should disable add when user lacks create permissions', () => {
76
+ authService.expectPermissions.mockReturnValue(false);
77
+ service.checkPermissions();
78
+ expect(config.add).toBe(false);
79
+ });
80
+
81
+ it('should keep add enabled when user has create permissions', () => {
82
+ authService.expectPermissions.mockReturnValue(true);
83
+ service.checkPermissions();
84
+ expect(config.add).toBe(true);
85
+ });
86
+
87
+ it('should disable edit when user lacks update permissions', () => {
88
+ authService.expectPermissions.mockReturnValue(false);
89
+ service.checkPermissions();
90
+ expect(config.edit).toBe(false);
91
+ });
92
+
93
+ it('should keep edit enabled when user has update permissions', () => {
94
+ authService.expectPermissions.mockReturnValue(true);
95
+ service.checkPermissions();
96
+ expect(config.edit).toBe(true);
97
+ });
98
+
99
+ it('should disable remove when user lacks delete permissions', () => {
100
+ authService.expectPermissions.mockReturnValue(false);
101
+ service.checkPermissions();
102
+ expect(config.remove).toBe(false);
103
+ });
104
+
105
+ it('should keep remove enabled when user has delete permissions', () => {
106
+ authService.expectPermissions.mockReturnValue(true);
107
+ service.checkPermissions();
108
+ expect(config.remove).toBe(true);
109
+ });
110
+
111
+ it('should not modify add when model has no create permissions defined', () => {
112
+ mockGetModelOptions.mockReturnValue({
113
+ create: {},
114
+ });
115
+ service.checkPermissions();
116
+ expect(config.add).toBe(true);
117
+ });
118
+
119
+ it('should not modify edit when model has no update permissions defined', () => {
120
+ mockGetModelOptions.mockReturnValue({
121
+ update: {},
122
+ });
123
+ service.checkPermissions();
124
+ expect(config.edit).toBe(true);
125
+ });
126
+
127
+ it('should not modify remove when model has no remove permissions defined', () => {
128
+ mockGetModelOptions.mockReturnValue({
129
+ remove: {},
130
+ });
131
+ service.checkPermissions();
132
+ expect(config.remove).toBe(true);
133
+ });
134
+
135
+ it('should handle undefined model options gracefully', () => {
136
+ mockGetModelOptions.mockReturnValue({});
137
+ service.checkPermissions();
138
+ expect(config.add).toBe(true);
139
+ expect(config.edit).toBe(true);
140
+ expect(config.remove).toBe(true);
141
+ });
142
+ });
143
+ });
@@ -0,0 +1,44 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+
3
+ import { AuthService } from '@smartsoft001/angular';
4
+ import { getModelOptions } from '@smartsoft001/models';
5
+
6
+ import { CrudFullConfig } from '../../crud.config';
7
+
8
+ @Injectable()
9
+ export class PageService<T> {
10
+ private authService = inject(AuthService);
11
+ private config = inject(CrudFullConfig<T>);
12
+
13
+ checkPermissions(): void {
14
+ const val: CrudFullConfig<T> = this.config;
15
+ const modelOptions = getModelOptions(val.type);
16
+
17
+ if (
18
+ val.add &&
19
+ modelOptions.create &&
20
+ modelOptions.create.permissions &&
21
+ !this.authService.expectPermissions(modelOptions.create.permissions)
22
+ ) {
23
+ val.add = false;
24
+ }
25
+
26
+ if (
27
+ val.edit &&
28
+ modelOptions.update &&
29
+ modelOptions.update.permissions &&
30
+ !this.authService.expectPermissions(modelOptions.update.permissions)
31
+ ) {
32
+ val.edit = false;
33
+ }
34
+
35
+ if (
36
+ val.remove &&
37
+ modelOptions.remove &&
38
+ modelOptions.remove.permissions &&
39
+ !this.authService.expectPermissions(modelOptions.remove.permissions)
40
+ ) {
41
+ val.remove = false;
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,134 @@
1
+ import { CrudSearchService } from './search.service';
2
+ import { ICrudFilter, ICrudFilterQueryItem } from '../../models';
3
+
4
+ describe('crud-shell-angular: CrudSearchService', () => {
5
+ let service: CrudSearchService;
6
+ const testQuery: ICrudFilterQueryItem = {
7
+ key: 'test',
8
+ value: 'value',
9
+ type: '=',
10
+ };
11
+
12
+ beforeEach(() => {
13
+ service = new CrudSearchService();
14
+ });
15
+
16
+ it('should create service', () => {
17
+ expect(service).toBeTruthy();
18
+ });
19
+
20
+ describe('filter', () => {
21
+ it('should return empty object when disabled', () => {
22
+ service.setEnabled(false);
23
+ service.setFilter({ query: [] });
24
+ expect(service.filter).toEqual({});
25
+ });
26
+
27
+ it('should return filter value when enabled', () => {
28
+ const testFilter: ICrudFilter = { query: [testQuery] };
29
+ service.setEnabled(true);
30
+ service.setFilter(testFilter);
31
+ expect(service.filter).toEqual(testFilter);
32
+ });
33
+ });
34
+
35
+ describe('enabled', () => {
36
+ it('should return false by default', () => {
37
+ expect(service.enabled).toBe(false);
38
+ });
39
+
40
+ it('should return current enabled state', () => {
41
+ service.setEnabled(true);
42
+ expect(service.enabled).toBe(true);
43
+ });
44
+ });
45
+
46
+ describe('enabled$', () => {
47
+ it('should emit current enabled state', (done) => {
48
+ service.enabled$.subscribe((value) => {
49
+ expect(value).toBe(false);
50
+ done();
51
+ });
52
+ });
53
+
54
+ it('should emit new enabled state when changed', (done) => {
55
+ service.setEnabled(true);
56
+ service.enabled$.subscribe((value) => {
57
+ expect(value).toBe(true);
58
+ done();
59
+ });
60
+ });
61
+ });
62
+
63
+ describe('filter$', () => {
64
+ it('should emit empty object when disabled', (done) => {
65
+ service.setEnabled(false);
66
+ service.setFilter({ query: [testQuery] });
67
+
68
+ service.filter$.subscribe((value) => {
69
+ expect(value).toEqual({});
70
+ done();
71
+ });
72
+ });
73
+
74
+ it('should emit current filter when enabled', (done) => {
75
+ const testFilter: ICrudFilter = { query: [testQuery] };
76
+ service.setEnabled(true);
77
+ service.setFilter(testFilter);
78
+
79
+ service.filter$.subscribe((value) => {
80
+ expect(value).toEqual(testFilter);
81
+ done();
82
+ });
83
+ });
84
+
85
+ it('should emit new filter when changed', (done) => {
86
+ const testFilter: ICrudFilter = { query: [testQuery] };
87
+ service.setEnabled(true);
88
+
89
+ service.filter$.subscribe((value) => {
90
+ expect(value).toEqual(testFilter);
91
+ done();
92
+ });
93
+
94
+ service.setFilter(testFilter);
95
+ });
96
+ });
97
+
98
+ describe('setFilter', () => {
99
+ it('should update filter value', () => {
100
+ const testFilter: ICrudFilter = { query: [testQuery] };
101
+ service.setEnabled(true);
102
+ service.setFilter(testFilter);
103
+ expect(service.filter).toEqual(testFilter);
104
+ });
105
+
106
+ it('should not affect enabled state', () => {
107
+ service.setEnabled(false);
108
+ service.setFilter({ query: [] });
109
+ expect(service.enabled).toBe(false);
110
+ });
111
+ });
112
+
113
+ describe('setEnabled', () => {
114
+ it('should update enabled state', () => {
115
+ service.setEnabled(true);
116
+ expect(service.enabled).toBe(true);
117
+ });
118
+
119
+ it('should not affect filter value', () => {
120
+ const testFilter: ICrudFilter = { query: [testQuery] };
121
+ service.setFilter(testFilter);
122
+ service.setEnabled(true);
123
+ expect(service.filter).toEqual(testFilter);
124
+ });
125
+
126
+ it('should make filter return empty object when disabled', () => {
127
+ const testFilter: ICrudFilter = { query: [testQuery] };
128
+ service.setFilter(testFilter);
129
+ service.setEnabled(true);
130
+ service.setEnabled(false);
131
+ expect(service.filter).toEqual({});
132
+ });
133
+ });
134
+ });
@@ -0,0 +1,42 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject, Observable, combineLatest } from 'rxjs';
3
+ import { map } from 'rxjs/operators';
4
+
5
+ import { ICrudFilter } from '../../models';
6
+
7
+ @Injectable({
8
+ providedIn: 'root',
9
+ })
10
+ export class CrudSearchService {
11
+ private _filterSource = new BehaviorSubject<Partial<ICrudFilter>>(null);
12
+ private _enabledSource = new BehaviorSubject<boolean>(false);
13
+
14
+ get filter(): Partial<ICrudFilter> {
15
+ if (!this._enabledSource.value) return {};
16
+ return this._filterSource.value;
17
+ }
18
+
19
+ get enabled(): boolean {
20
+ return this._enabledSource.value;
21
+ }
22
+
23
+ enabled$ = this._enabledSource.asObservable();
24
+
25
+ filter$: Observable<Partial<ICrudFilter>> = combineLatest([
26
+ this._filterSource.asObservable(),
27
+ this.enabled$,
28
+ ]).pipe(
29
+ map(([filter, enabled]) => {
30
+ if (!enabled) return {};
31
+ return filter;
32
+ }),
33
+ );
34
+
35
+ setFilter(val: Partial<ICrudFilter>): void {
36
+ this._filterSource.next(val);
37
+ }
38
+
39
+ setEnabled(val: boolean): void {
40
+ this._enabledSource.next(val);
41
+ }
42
+ }
package/test-setup.ts ADDED
File without changes
package/tsconfig.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "../../../../tsconfig.base.json",
3
+ "files": [],
4
+ "include": [],
5
+ "references": [
6
+ {
7
+ "path": "./tsconfig.lib.json"
8
+ },
9
+ {
10
+ "path": "./tsconfig.spec.json"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "../../../../dist/out-tsc",
5
+ "target": "ES2022",
6
+ "declaration": true,
7
+ "declarationMap": true,
8
+ "inlineSources": true,
9
+ "types": [],
10
+ "lib": ["dom", "es2018"],
11
+ "useDefineForClassFields": false,
12
+ "allowSyntheticDefaultImports": true
13
+ },
14
+ "angularCompilerOptions": {
15
+ "annotateForClosureCompiler": true,
16
+ "skipTemplateCodegen": true,
17
+ "strictMetadataEmit": true,
18
+ "fullTemplateTypeCheck": true,
19
+ "strictInjectionParameters": true,
20
+ "enableResourceInlining": true,
21
+ "compilationMode": "partial",
22
+ "enableIvy": false
23
+ },
24
+ "exclude": [
25
+ "src/test-setup.ts",
26
+ "**/*.spec.ts",
27
+ "**/*.test.ts",
28
+ "jest.config.ts"
29
+ ],
30
+ "include": ["**/*.ts"]
31
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": "./tsconfig.lib.json",
3
+ "compilerOptions": {
4
+ "declarationMap": false,
5
+ "target": "ES2022",
6
+ "useDefineForClassFields": false
7
+ },
8
+ "angularCompilerOptions": {
9
+ "compilationMode": "partial"
10
+ }
11
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "../../../../dist/out-tsc",
5
+ "module": "commonjs",
6
+ "types": ["jest", "node"]
7
+ },
8
+ "files": ["src/test-setup.ts"],
9
+ "include": ["**/*.spec.ts", "**/*.test.ts", "**/*.d.ts"]
10
+ }
package/tslint.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../../../tslint.json",
3
+ "rules": {
4
+ "directive-selector": [true, "attribute", "smart", "camelCase"],
5
+ "component-selector": [true, "element", "smart", "kebab-case"]
6
+ },
7
+ "linterOptions": {
8
+ "exclude": ["!**/*"]
9
+ }
10
+ }
package/esm2022/index.mjs DELETED
@@ -1,18 +0,0 @@
1
- export * from "./lib/+state/crud.selectors";
2
- export * from "./lib/components";
3
- export * from "./lib/crud.config";
4
- export * from "./lib/crud.module";
5
- export * from "./lib/crud-full.module";
6
- export * from "./lib/factories/list-pagination/list-pagination.factory";
7
- export * from "./lib/pipes";
8
- export * from "./lib/providers/model-possibilities/model-possibilities.provider";
9
- export * from "./lib/services/crud/crud.service";
10
- export * from "./lib/services/page/page.service";
11
- export * from "./lib/services/search/search.service";
12
- export * from './lib/+state/crud.actions';
13
- export * from './lib/+state/crud.effects';
14
- export * from './lib/+state/crud.facade';
15
- export * from './lib/+state/crud.reducer';
16
- export * from './lib/models';
17
- export * from './lib/pages';
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NydWQvc2hlbGwvYW5ndWxhci9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMseURBQXlELENBQUM7QUFDeEUsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxrRUFBa0UsQ0FBQztBQUNqRixjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vbGliLytzdGF0ZS9jcnVkLnNlbGVjdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL2NvbXBvbmVudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9jcnVkLmNvbmZpZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL2NydWQubW9kdWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWIvY3J1ZC1mdWxsLm1vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL2ZhY3Rvcmllcy9saXN0LXBhZ2luYXRpb24vbGlzdC1wYWdpbmF0aW9uLmZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9waXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL3Byb3ZpZGVycy9tb2RlbC1wb3NzaWJpbGl0aWVzL21vZGVsLXBvc3NpYmlsaXRpZXMucHJvdmlkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9zZXJ2aWNlcy9jcnVkL2NydWQuc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL3NlcnZpY2VzL3BhZ2UvcGFnZS5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWIvc2VydmljZXMvc2VhcmNoL3NlYXJjaC5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tICcuL2xpYi8rc3RhdGUvY3J1ZC5hY3Rpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vbGliLytzdGF0ZS9jcnVkLmVmZmVjdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvK3N0YXRlL2NydWQuZmFjYWRlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliLytzdGF0ZS9jcnVkLnJlZHVjZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3BhZ2VzJzsiXX0=