@smartsoft001/crud-shell-angular 2.76.0 → 2.80.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 (75) hide show
  1. package/fesm2022/smartsoft001-crud-shell-angular.mjs +2840 -0
  2. package/fesm2022/smartsoft001-crud-shell-angular.mjs.map +1 -0
  3. package/index.d.ts +632 -0
  4. package/package.json +18 -3
  5. package/.storybook/addons.js +0 -1
  6. package/.storybook/config.js +0 -5
  7. package/.storybook/tsconfig.json +0 -8
  8. package/.storybook/webpack.config.js +0 -7
  9. package/jest.config.ts +0 -38
  10. package/ng-package.json +0 -7
  11. package/project.json +0 -49
  12. package/src/index.ts +0 -13
  13. package/src/lib/+state/crud.facade.ts +0 -82
  14. package/src/lib/+state/crud.methods.ts +0 -258
  15. package/src/lib/+state/crud.store.ts +0 -77
  16. package/src/lib/components/components.module.ts +0 -58
  17. package/src/lib/components/export/export.component.ts +0 -69
  18. package/src/lib/components/filter/base/base.component.ts +0 -175
  19. package/src/lib/components/filter/check/check.component.scss +0 -25
  20. package/src/lib/components/filter/check/check.component.ts +0 -72
  21. package/src/lib/components/filter/date/date.component.html +0 -30
  22. package/src/lib/components/filter/date/date.component.ts +0 -70
  23. package/src/lib/components/filter/date-time/date-time.component.html +0 -62
  24. package/src/lib/components/filter/date-time/date-time.component.ts +0 -56
  25. package/src/lib/components/filter/date-with-edit/date-with-edit.component.html +0 -109
  26. package/src/lib/components/filter/date-with-edit/date-with-edit.component.ts +0 -70
  27. package/src/lib/components/filter/filter.component.html +0 -52
  28. package/src/lib/components/filter/filter.component.ts +0 -34
  29. package/src/lib/components/filter/flag/flag.component.ts +0 -55
  30. package/src/lib/components/filter/index.ts +0 -9
  31. package/src/lib/components/filter/int/int.component.html +0 -74
  32. package/src/lib/components/filter/int/int.component.ts +0 -57
  33. package/src/lib/components/filter/radio/radio.component.ts +0 -74
  34. package/src/lib/components/filter/text/text.component.ts +0 -46
  35. package/src/lib/components/filters/filters.component.scss +0 -150
  36. package/src/lib/components/filters/filters.component.ts +0 -157
  37. package/src/lib/components/filters-config/filters-config.component.ts +0 -69
  38. package/src/lib/components/group/group.component.ts +0 -93
  39. package/src/lib/components/index.ts +0 -7
  40. package/src/lib/components/multiselect/multiselect.component.html +0 -41
  41. package/src/lib/components/multiselect/multiselect.component.scss +0 -125
  42. package/src/lib/components/multiselect/multiselect.component.ts +0 -104
  43. package/src/lib/crud-full.module.ts +0 -51
  44. package/src/lib/crud.config.ts +0 -79
  45. package/src/lib/crud.module.ts +0 -72
  46. package/src/lib/factories/list-pagination/list-pagination.factory.ts +0 -77
  47. package/src/lib/models/index.ts +0 -1
  48. package/src/lib/models/interfaces.ts +0 -34
  49. package/src/lib/pages/index.ts +0 -6
  50. package/src/lib/pages/item/base/base.component.ts +0 -54
  51. package/src/lib/pages/item/item.component.ts +0 -513
  52. package/src/lib/pages/item/standard/standard.component.scss +0 -0
  53. package/src/lib/pages/item/standard/standard.component.ts +0 -50
  54. package/src/lib/pages/list/base/base.component.ts +0 -29
  55. package/src/lib/pages/list/list.component.stories.ts +0 -77
  56. package/src/lib/pages/list/list.component.ts +0 -438
  57. package/src/lib/pages/list/standard/standard.component.ts +0 -42
  58. package/src/lib/pipes/form-options/form-options.pipe.ts +0 -61
  59. package/src/lib/pipes/index.ts +0 -2
  60. package/src/lib/pipes/pipes.module.ts +0 -9
  61. package/src/lib/providers/model-possibilities/model-possibilities.provider.ts +0 -19
  62. package/src/lib/services/crud/crud.service.spec.ts +0 -303
  63. package/src/lib/services/crud/crud.service.ts +0 -178
  64. package/src/lib/services/list-group/list-group.service.spec.ts +0 -87
  65. package/src/lib/services/list-group/list-group.service.ts +0 -65
  66. package/src/lib/services/page/page.service.spec.ts +0 -143
  67. package/src/lib/services/page/page.service.ts +0 -44
  68. package/src/lib/services/search/search.service.spec.ts +0 -134
  69. package/src/lib/services/search/search.service.ts +0 -42
  70. package/test-setup.ts +0 -0
  71. package/tsconfig.json +0 -13
  72. package/tsconfig.lib.json +0 -31
  73. package/tsconfig.lib.prod.json +0 -11
  74. package/tsconfig.spec.json +0 -10
  75. package/tslint.json +0 -10
@@ -1,143 +0,0 @@
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
- });
@@ -1,44 +0,0 @@
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
- }
@@ -1,134 +0,0 @@
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
- });
@@ -1,42 +0,0 @@
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 DELETED
File without changes
package/tsconfig.json DELETED
@@ -1,13 +0,0 @@
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
- }
package/tsconfig.lib.json DELETED
@@ -1,31 +0,0 @@
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
- }
@@ -1,11 +0,0 @@
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
- }
@@ -1,10 +0,0 @@
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 DELETED
@@ -1,10 +0,0 @@
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
- }