@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.
- package/fesm2022/smartsoft001-crud-shell-angular.mjs +2840 -0
- package/fesm2022/smartsoft001-crud-shell-angular.mjs.map +1 -0
- package/index.d.ts +632 -0
- package/package.json +18 -3
- package/.storybook/addons.js +0 -1
- package/.storybook/config.js +0 -5
- package/.storybook/tsconfig.json +0 -8
- package/.storybook/webpack.config.js +0 -7
- package/jest.config.ts +0 -38
- package/ng-package.json +0 -7
- package/project.json +0 -49
- package/src/index.ts +0 -13
- package/src/lib/+state/crud.facade.ts +0 -82
- package/src/lib/+state/crud.methods.ts +0 -258
- package/src/lib/+state/crud.store.ts +0 -77
- package/src/lib/components/components.module.ts +0 -58
- package/src/lib/components/export/export.component.ts +0 -69
- package/src/lib/components/filter/base/base.component.ts +0 -175
- package/src/lib/components/filter/check/check.component.scss +0 -25
- package/src/lib/components/filter/check/check.component.ts +0 -72
- package/src/lib/components/filter/date/date.component.html +0 -30
- package/src/lib/components/filter/date/date.component.ts +0 -70
- package/src/lib/components/filter/date-time/date-time.component.html +0 -62
- package/src/lib/components/filter/date-time/date-time.component.ts +0 -56
- package/src/lib/components/filter/date-with-edit/date-with-edit.component.html +0 -109
- package/src/lib/components/filter/date-with-edit/date-with-edit.component.ts +0 -70
- package/src/lib/components/filter/filter.component.html +0 -52
- package/src/lib/components/filter/filter.component.ts +0 -34
- package/src/lib/components/filter/flag/flag.component.ts +0 -55
- package/src/lib/components/filter/index.ts +0 -9
- package/src/lib/components/filter/int/int.component.html +0 -74
- package/src/lib/components/filter/int/int.component.ts +0 -57
- package/src/lib/components/filter/radio/radio.component.ts +0 -74
- package/src/lib/components/filter/text/text.component.ts +0 -46
- package/src/lib/components/filters/filters.component.scss +0 -150
- package/src/lib/components/filters/filters.component.ts +0 -157
- package/src/lib/components/filters-config/filters-config.component.ts +0 -69
- package/src/lib/components/group/group.component.ts +0 -93
- package/src/lib/components/index.ts +0 -7
- package/src/lib/components/multiselect/multiselect.component.html +0 -41
- package/src/lib/components/multiselect/multiselect.component.scss +0 -125
- package/src/lib/components/multiselect/multiselect.component.ts +0 -104
- package/src/lib/crud-full.module.ts +0 -51
- package/src/lib/crud.config.ts +0 -79
- package/src/lib/crud.module.ts +0 -72
- package/src/lib/factories/list-pagination/list-pagination.factory.ts +0 -77
- package/src/lib/models/index.ts +0 -1
- package/src/lib/models/interfaces.ts +0 -34
- package/src/lib/pages/index.ts +0 -6
- package/src/lib/pages/item/base/base.component.ts +0 -54
- package/src/lib/pages/item/item.component.ts +0 -513
- package/src/lib/pages/item/standard/standard.component.scss +0 -0
- package/src/lib/pages/item/standard/standard.component.ts +0 -50
- package/src/lib/pages/list/base/base.component.ts +0 -29
- package/src/lib/pages/list/list.component.stories.ts +0 -77
- package/src/lib/pages/list/list.component.ts +0 -438
- package/src/lib/pages/list/standard/standard.component.ts +0 -42
- package/src/lib/pipes/form-options/form-options.pipe.ts +0 -61
- package/src/lib/pipes/index.ts +0 -2
- package/src/lib/pipes/pipes.module.ts +0 -9
- package/src/lib/providers/model-possibilities/model-possibilities.provider.ts +0 -19
- package/src/lib/services/crud/crud.service.spec.ts +0 -303
- package/src/lib/services/crud/crud.service.ts +0 -178
- package/src/lib/services/list-group/list-group.service.spec.ts +0 -87
- package/src/lib/services/list-group/list-group.service.ts +0 -65
- package/src/lib/services/page/page.service.spec.ts +0 -143
- package/src/lib/services/page/page.service.ts +0 -44
- package/src/lib/services/search/search.service.spec.ts +0 -134
- package/src/lib/services/search/search.service.ts +0 -42
- package/test-setup.ts +0 -0
- package/tsconfig.json +0 -13
- package/tsconfig.lib.json +0 -31
- package/tsconfig.lib.prod.json +0 -11
- package/tsconfig.spec.json +0 -10
- 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
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
|
-
}
|
package/tsconfig.lib.prod.json
DELETED
package/tsconfig.spec.json
DELETED
package/tslint.json
DELETED