@verisoft/ui-core 20.0.0 → 20.1.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/.eslintrc.json +48 -0
- package/jest.config.ts +21 -0
- package/ng-package.json +11 -0
- package/package.json +6 -18
- package/project.json +36 -0
- package/src/index.ts +6 -0
- package/src/lib/common/angular-helper.ts +44 -0
- package/src/lib/common/constants.ts +5 -0
- package/src/lib/common/control.models.ts +80 -0
- package/src/lib/common/datasource-component.model.spec.ts +42 -0
- package/src/lib/common/datasource-component.model.ts +43 -0
- package/src/lib/common/deactivate-guard.model.ts +5 -0
- package/src/lib/common/download-file.ts +20 -0
- package/src/lib/common/filter.ts +7 -0
- package/src/lib/common/icons.ts +34 -0
- package/src/lib/common/index.ts +10 -0
- package/src/lib/common/notificable-property.model.ts +5 -0
- package/src/lib/common/rxjs.spec.ts +58 -0
- package/src/lib/common/rxjs.ts +21 -0
- package/src/lib/components/action-button-group/action-button-group.model.ts +15 -0
- package/src/lib/components/action-button-group/action-button.model.ts +15 -0
- package/src/lib/components/action-button-group/index.ts +2 -0
- package/src/lib/components/base-form/base-form-input.component.ts +120 -0
- package/src/lib/components/base-form/base-form.component.ts +236 -0
- package/src/lib/components/base-form/directives/detail-store.directive.ts +219 -0
- package/src/lib/components/base-form/index.ts +4 -0
- package/src/lib/components/base-form/models/base-form-input.models.ts +11 -0
- package/src/lib/components/base-form/models/base-form.models.ts +31 -0
- package/src/lib/components/base-form/models/index.ts +2 -0
- package/src/lib/components/breadcrumb/breadcrumb.model.ts +21 -0
- package/src/lib/components/breadcrumb/breadcrumb.service.ts +9 -0
- package/src/lib/components/breadcrumb/breadcrumbcore.component.ts +117 -0
- package/src/lib/components/breadcrumb/index.ts +3 -0
- package/src/lib/components/button/button.model.ts +21 -0
- package/src/lib/components/button/index.ts +1 -0
- package/src/lib/components/calendar/calendar.model.ts +16 -0
- package/src/lib/components/calendar/index.ts +1 -0
- package/src/lib/components/checkbox/checkbox.model.ts +10 -0
- package/src/lib/components/checkbox/index.ts +1 -0
- package/src/lib/components/confirm-dialog/confirm-dialog.model.ts +31 -0
- package/src/lib/components/confirm-dialog/index.ts +1 -0
- package/src/lib/components/dropdown/dropdown.model.ts +16 -0
- package/src/lib/components/dropdown/index.ts +1 -0
- package/src/lib/components/dropdown-button/dropdown-button.model.ts +18 -0
- package/src/lib/components/dropdown-button/index.ts +1 -0
- package/src/lib/components/dynamic-component/dynamic-component.model.ts +2 -0
- package/src/lib/components/dynamic-component/index.ts +1 -0
- package/src/lib/components/filter/filter.model.ts +17 -0
- package/src/lib/components/filter/index.ts +1 -0
- package/src/lib/components/form-field/form-field.model.ts +15 -0
- package/src/lib/components/form-field/index.ts +1 -0
- package/src/lib/components/generic-field/generic-field.model.ts +10 -0
- package/src/lib/components/generic-field/index.ts +1 -0
- package/src/lib/components/generic-form/generic-form.component.ts +33 -0
- package/src/lib/components/generic-form/index.ts +1 -0
- package/src/lib/components/header/header.model.ts +18 -0
- package/src/lib/components/header/index.ts +1 -0
- package/src/lib/components/icons/icons.component.ts +22 -0
- package/src/lib/components/icons/icons.model.ts +16 -0
- package/src/lib/components/icons/index.ts +2 -0
- package/src/lib/components/index.ts +37 -0
- package/src/lib/components/input-group/index.ts +1 -0
- package/src/lib/components/input-group/input-group.model.ts +17 -0
- package/src/lib/components/loader/index.ts +1 -0
- package/src/lib/components/loader/loader.model.ts +7 -0
- package/src/lib/components/multiselect/index.ts +1 -0
- package/src/lib/components/multiselect/mutiselect.model.ts +13 -0
- package/src/lib/components/number-input/index.ts +1 -0
- package/src/lib/components/number-input/number-input.model.ts +14 -0
- package/src/lib/components/page-header/index.ts +3 -0
- package/src/lib/components/page-header/page-header.model.ts +11 -0
- package/src/lib/components/page-header/page-header.service.ts +9 -0
- package/src/lib/components/page-header/page-headercore.component.ts +42 -0
- package/src/lib/components/password/index.ts +1 -0
- package/src/lib/components/password/password.model.ts +25 -0
- package/src/lib/components/radiobutton/index.ts +1 -0
- package/src/lib/components/radiobutton/radiobutton.model.ts +16 -0
- package/src/lib/components/section/index.ts +1 -0
- package/src/lib/components/section/section.model.ts +11 -0
- package/src/lib/components/side-menu/directives/side-menu-service.directive.ts +31 -0
- package/src/lib/components/side-menu/index.ts +4 -0
- package/src/lib/components/side-menu/services/side-menu-provider.service.ts +13 -0
- package/src/lib/components/side-menu/services/side-menu.service.ts +62 -0
- package/src/lib/components/side-menu/side-menu.model.ts +67 -0
- package/src/lib/components/slider/index.ts +1 -0
- package/src/lib/components/slider/slider.model.ts +13 -0
- package/src/lib/components/snackbar/index.ts +1 -0
- package/src/lib/components/snackbar/snackbar.model.ts +7 -0
- package/src/lib/components/stepper/index.ts +1 -0
- package/src/lib/components/stepper/stepper.model.ts +24 -0
- package/src/lib/components/switch/index.ts +1 -0
- package/src/lib/components/switch/switch.model.ts +8 -0
- package/src/lib/components/tab-view/index.ts +1 -0
- package/src/lib/components/tab-view/tab-view.model.ts +22 -0
- package/src/lib/components/table/column-configuration.ts +38 -0
- package/src/lib/components/table/index.ts +4 -0
- package/src/lib/components/table/table-builder.ts +93 -0
- package/src/lib/components/table/table-column.directive.ts +62 -0
- package/src/lib/components/table/table.models.ts +261 -0
- package/src/lib/components/table-filter/index.ts +1 -0
- package/src/lib/components/table-filter/table-filter.model.ts +22 -0
- package/src/lib/components/tag/index.ts +1 -0
- package/src/lib/components/tag/tag.model.ts +13 -0
- package/src/lib/components/textarea/index.ts +1 -0
- package/src/lib/components/textarea/textarea.model.ts +13 -0
- package/src/lib/components/textfield/index.ts +1 -0
- package/src/lib/components/textfield/textfield.model.ts +13 -0
- package/src/lib/components/tooltip/index.ts +1 -0
- package/src/lib/components/tooltip/tooltip.model.ts +13 -0
- package/src/lib/components/unsubscribe.component.ts +12 -0
- package/src/lib/directives/datasource.directive.ts +275 -0
- package/src/lib/directives/index.ts +4 -0
- package/src/lib/directives/shortcut.directive.ts +37 -0
- package/src/lib/directives/table-datasource.directive.ts +184 -0
- package/src/lib/directives/table-filter.directive.ts +69 -0
- package/src/lib/format/format.ts +74 -0
- package/src/lib/pipes/error/error.codes.ts +11 -0
- package/src/lib/pipes/error/error.models.ts +27 -0
- package/src/lib/pipes/error/error.pipe.ts +27 -0
- package/src/lib/pipes/error/warning.codes.ts +5 -0
- package/src/lib/pipes/error/warning.pipe.ts +27 -0
- package/src/lib/pipes/helper/enumToList.pipe.ts +16 -0
- package/src/lib/pipes/index.ts +7 -0
- package/src/lib/pipes/keyOrFn/keyOrFn.pipe.ts +23 -0
- package/src/lib/services/confirm-dialog.service.ts +44 -0
- package/src/lib/services/index.ts +4 -0
- package/src/lib/services/leave-form.service.ts +53 -0
- package/src/lib/services/screen-size.service.ts +25 -0
- package/src/lib/services/table.service.ts +22 -0
- package/src/test-setup.ts +8 -0
- package/tsconfig.json +28 -0
- package/tsconfig.lib.json +17 -0
- package/tsconfig.lib.prod.json +9 -0
- package/tsconfig.spec.json +16 -0
- package/fesm2022/verisoft-ui-core.mjs +0 -2021
- package/fesm2022/verisoft-ui-core.mjs.map +0 -1
- package/index.d.ts +0 -1107
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": ["../../../.eslintrc.base.json"],
|
|
3
|
+
"ignorePatterns": ["!**/*"],
|
|
4
|
+
"overrides": [
|
|
5
|
+
{
|
|
6
|
+
"files": ["*.ts"],
|
|
7
|
+
"extends": [
|
|
8
|
+
"plugin:@nx/angular",
|
|
9
|
+
"plugin:@angular-eslint/template/process-inline-templates"
|
|
10
|
+
],
|
|
11
|
+
"rules": {
|
|
12
|
+
"@angular-eslint/directive-selector": [
|
|
13
|
+
"error",
|
|
14
|
+
{
|
|
15
|
+
"type": "attribute",
|
|
16
|
+
"prefix": "v",
|
|
17
|
+
"style": "camelCase"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"@angular-eslint/component-selector": [
|
|
21
|
+
"error",
|
|
22
|
+
{
|
|
23
|
+
"type": "element",
|
|
24
|
+
"prefix": "v",
|
|
25
|
+
"style": "kebab-case"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"files": ["*.html"],
|
|
32
|
+
"extends": ["plugin:@nx/angular-template"],
|
|
33
|
+
"rules": {}
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"files": ["*.json"],
|
|
37
|
+
"parser": "jsonc-eslint-parser",
|
|
38
|
+
"rules": {
|
|
39
|
+
"@nx/dependency-checks": [
|
|
40
|
+
"error",
|
|
41
|
+
{
|
|
42
|
+
"ignoredFiles": ["{projectRoot}/eslint.config.{js,cjs,mjs}"]
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
package/jest.config.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
displayName: 'ui-core',
|
|
3
|
+
preset: '../../../jest.preset.js',
|
|
4
|
+
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
|
|
5
|
+
coverageDirectory: '../../../coverage/src/libs/ui-core',
|
|
6
|
+
transform: {
|
|
7
|
+
'^.+\\.(ts|mjs|js|html)$': [
|
|
8
|
+
'jest-preset-angular',
|
|
9
|
+
{
|
|
10
|
+
tsconfig: '<rootDir>/tsconfig.spec.json',
|
|
11
|
+
stringifyContentPathRegex: '\\.(html|svg)$',
|
|
12
|
+
},
|
|
13
|
+
],
|
|
14
|
+
},
|
|
15
|
+
transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
|
|
16
|
+
snapshotSerializers: [
|
|
17
|
+
'jest-preset-angular/build/serializers/no-ng-attributes',
|
|
18
|
+
'jest-preset-angular/build/serializers/ng-snapshot',
|
|
19
|
+
'jest-preset-angular/build/serializers/html-comment',
|
|
20
|
+
],
|
|
21
|
+
};
|
package/ng-package.json
ADDED
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verisoft/ui-core",
|
|
3
|
-
"version": "20.
|
|
3
|
+
"version": "20.1.0",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@verisoft/core": "~20.
|
|
6
|
-
"@verisoft/store": "~20.
|
|
5
|
+
"@verisoft/core": "~20.1.0",
|
|
6
|
+
"@verisoft/store": "~20.1.0",
|
|
7
7
|
"@angular/core": "~20.2.0",
|
|
8
8
|
"@angular/common": "~20.2.0",
|
|
9
9
|
"@angular/forms": "~20.2.0",
|
|
@@ -15,19 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"lodash-es": "^4.17.21",
|
|
18
|
-
"uuid": "^11.0.0"
|
|
19
|
-
"tslib": "^2.3.0"
|
|
18
|
+
"uuid": "^11.0.0"
|
|
20
19
|
},
|
|
21
|
-
"sideEffects": false
|
|
22
|
-
|
|
23
|
-
"typings": "index.d.ts",
|
|
24
|
-
"exports": {
|
|
25
|
-
"./package.json": {
|
|
26
|
-
"default": "./package.json"
|
|
27
|
-
},
|
|
28
|
-
".": {
|
|
29
|
-
"types": "./index.d.ts",
|
|
30
|
-
"default": "./fesm2022/verisoft-ui-core.mjs"
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
20
|
+
"sideEffects": false
|
|
21
|
+
}
|
package/project.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ui-core",
|
|
3
|
+
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
+
"sourceRoot": "src/libs/ui-core/src",
|
|
5
|
+
"prefix": "lib",
|
|
6
|
+
"projectType": "library",
|
|
7
|
+
"tags": [],
|
|
8
|
+
"targets": {
|
|
9
|
+
"build": {
|
|
10
|
+
"executor": "@nx/angular:package",
|
|
11
|
+
"outputs": ["{workspaceRoot}/dist/{projectRoot}"],
|
|
12
|
+
"options": {
|
|
13
|
+
"project": "src/libs/ui-core/ng-package.json"
|
|
14
|
+
},
|
|
15
|
+
"configurations": {
|
|
16
|
+
"production": {
|
|
17
|
+
"tsConfig": "src/libs/ui-core/tsconfig.lib.prod.json"
|
|
18
|
+
},
|
|
19
|
+
"development": {
|
|
20
|
+
"tsConfig": "src/libs/ui-core/tsconfig.lib.json"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"defaultConfiguration": "production"
|
|
24
|
+
},
|
|
25
|
+
"test": {
|
|
26
|
+
"executor": "@nx/jest:jest",
|
|
27
|
+
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
|
|
28
|
+
"options": {
|
|
29
|
+
"jestConfig": "src/libs/ui-core/jest.config.ts"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"lint": {
|
|
33
|
+
"executor": "@nx/eslint:lint"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { OnChanges, SimpleChange, SimpleChanges } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
export function setComponentProperties<TComponent>(
|
|
4
|
+
component: TComponent,
|
|
5
|
+
value: Partial<TComponent>,
|
|
6
|
+
firstChange = false
|
|
7
|
+
) {
|
|
8
|
+
if (!value || !component) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const simpleChanges = Object.keys(value).reduce(
|
|
13
|
+
(changes: SimpleChanges, property: string) => {
|
|
14
|
+
const indexedComponent = component as unknown as {
|
|
15
|
+
[key: string]: TComponent[keyof TComponent];
|
|
16
|
+
};
|
|
17
|
+
const indexedValue = value as unknown as {
|
|
18
|
+
[key: string]: TComponent[keyof TComponent];
|
|
19
|
+
};
|
|
20
|
+
const previousValue = indexedComponent[property];
|
|
21
|
+
const currentValue = indexedValue[
|
|
22
|
+
property
|
|
23
|
+
] as TComponent[keyof TComponent];
|
|
24
|
+
if (currentValue !== previousValue) {
|
|
25
|
+
indexedComponent[property] = currentValue;
|
|
26
|
+
const change = new SimpleChange(
|
|
27
|
+
previousValue,
|
|
28
|
+
currentValue,
|
|
29
|
+
firstChange
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
return { ...changes, [property]: change };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return changes;
|
|
36
|
+
},
|
|
37
|
+
{}
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
const changeableComponent = component as unknown as OnChanges;
|
|
41
|
+
if (changeableComponent['ngOnChanges']) {
|
|
42
|
+
changeableComponent.ngOnChanges(simpleChanges);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export enum ControlSeverity {
|
|
2
|
+
success = 'success',
|
|
3
|
+
info = 'info',
|
|
4
|
+
warning = 'warning',
|
|
5
|
+
danger = 'danger',
|
|
6
|
+
help = 'help',
|
|
7
|
+
primary = 'primary',
|
|
8
|
+
secondary = 'secondary',
|
|
9
|
+
contrast = 'contrast',
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export enum GovControlSeverity {
|
|
13
|
+
primary = 'primary',
|
|
14
|
+
secondary = 'secondary',
|
|
15
|
+
neutral = 'neutral',
|
|
16
|
+
error = 'error',
|
|
17
|
+
success = 'success',
|
|
18
|
+
warning = 'warning',
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export enum GovButtonType {
|
|
22
|
+
solid = 'solid',
|
|
23
|
+
outlined = "outlined",
|
|
24
|
+
base = "base",
|
|
25
|
+
link = "link"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export enum IconPosition {
|
|
29
|
+
left = 'left',
|
|
30
|
+
right = 'right',
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export enum SlotPosition {
|
|
34
|
+
top = 'top',
|
|
35
|
+
bottom = 'bottom',
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export enum Position{
|
|
39
|
+
top = 'top',
|
|
40
|
+
bottom = 'bottom',
|
|
41
|
+
left = 'left',
|
|
42
|
+
right = 'right',
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export enum FieldSize {
|
|
46
|
+
small = 'small',
|
|
47
|
+
medium = 'medium',
|
|
48
|
+
large = 'large',
|
|
49
|
+
xl = 'xl',
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export enum FieldAlign {
|
|
53
|
+
left = 'left',
|
|
54
|
+
center = 'center',
|
|
55
|
+
right = 'right',
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export enum FieldType {
|
|
59
|
+
text = 'text',
|
|
60
|
+
number = 'number',
|
|
61
|
+
password = 'password',
|
|
62
|
+
search = 'search',
|
|
63
|
+
date = 'date',
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export enum LayoutType {
|
|
67
|
+
horizontal = 'horizontal',
|
|
68
|
+
vertical = 'vertical',
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export type ControlSeverityType = keyof typeof ControlSeverity;
|
|
72
|
+
export type GovControlSeverityType = keyof typeof GovControlSeverity;
|
|
73
|
+
export type GovButtonTypeType = keyof typeof GovButtonType;
|
|
74
|
+
export type IconPositionType = keyof typeof IconPosition;
|
|
75
|
+
export type SlotPositionType = keyof typeof SlotPosition;
|
|
76
|
+
export type PositionType = keyof typeof Position;
|
|
77
|
+
export type FieldSizeType = keyof typeof FieldSize;
|
|
78
|
+
export type FieldAlignType = keyof typeof FieldAlign;
|
|
79
|
+
export type FieldTypeType = keyof typeof FieldType;
|
|
80
|
+
export type LayoutTypeType = keyof typeof LayoutType;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { setDataToArray } from './datasource-component.model';
|
|
2
|
+
|
|
3
|
+
describe('setDataToArray', () => {
|
|
4
|
+
test('Should return data when target array is null and data is passed.', () => {
|
|
5
|
+
const data = ['item 1', 'item 2'];
|
|
6
|
+
const targetData = undefined;
|
|
7
|
+
|
|
8
|
+
const actual = setDataToArray(targetData, data);
|
|
9
|
+
|
|
10
|
+
expect(actual).toEqual(data);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test('Should return data when target array is null and data is passed.', () => {
|
|
14
|
+
const data = ['item 1', 'item 2'];
|
|
15
|
+
const targetData: string[] = [];
|
|
16
|
+
|
|
17
|
+
const actual = setDataToArray(targetData, data);
|
|
18
|
+
|
|
19
|
+
expect(actual).toEqual(data);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('Should return extended target array when target array is empty and data is passed and offset is specified.', () => {
|
|
23
|
+
const data = ['item 1', 'item 2'];
|
|
24
|
+
const targetData: string[] = [];
|
|
25
|
+
const offset = 1;
|
|
26
|
+
|
|
27
|
+
const actual = setDataToArray(targetData, data, offset);
|
|
28
|
+
|
|
29
|
+
expect(actual).toEqual([undefined, ...data]);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('Should return target array extended to total items when data is passed and total is specified.', () => {
|
|
33
|
+
const data = ['item 1', 'item 2'];
|
|
34
|
+
const targetData: string[] = [];
|
|
35
|
+
const total = 5;
|
|
36
|
+
const offset = 0;
|
|
37
|
+
|
|
38
|
+
const actual = setDataToArray(targetData, data, offset, total);
|
|
39
|
+
|
|
40
|
+
expect(actual.length).toEqual(total);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { EventEmitter, SimpleChanges } from '@angular/core';
|
|
2
|
+
import { FilterEvent, LazyLoadEvent, RequestParams } from '@verisoft/core';
|
|
3
|
+
|
|
4
|
+
export interface DataSourceComponentModel<TEntity> {
|
|
5
|
+
ngOnChanges?: (changes: SimpleChanges) => void;
|
|
6
|
+
lazy: boolean;
|
|
7
|
+
loading: boolean;
|
|
8
|
+
filter: boolean;
|
|
9
|
+
options: TEntity[] | undefined;
|
|
10
|
+
optionValue: string | undefined;
|
|
11
|
+
optionLabel: string | undefined;
|
|
12
|
+
showed: EventEmitter<any>;
|
|
13
|
+
cleared: EventEmitter<any>;
|
|
14
|
+
filtered: EventEmitter<FilterEvent>;
|
|
15
|
+
lazyLoad: EventEmitter<LazyLoadEvent>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function setDataToArray<T>(
|
|
19
|
+
targetArray: (T | undefined)[] | undefined,
|
|
20
|
+
data: T[],
|
|
21
|
+
offset = 0,
|
|
22
|
+
total: number | undefined = undefined,
|
|
23
|
+
defaultItem: T | undefined = undefined
|
|
24
|
+
): (T | undefined)[] {
|
|
25
|
+
const totalItems = total ?? data.length + offset;
|
|
26
|
+
if (!targetArray) {
|
|
27
|
+
targetArray = Array(totalItems).fill(defaultItem);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (targetArray.length < totalItems) {
|
|
31
|
+
targetArray = targetArray.concat(
|
|
32
|
+
new Array(totalItems - targetArray.length).fill(defaultItem)
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
for (let i = 0; i < data.length; i++) {
|
|
37
|
+
targetArray[i + offset] = data[i] ?? defaultItem;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return targetArray;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type ExtendedRequestType<T> = RequestParams<T> & { useNewData: boolean}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function downloadText(
|
|
2
|
+
filename: string,
|
|
3
|
+
text: string,
|
|
4
|
+
mimeType: string | undefined = 'text/plain'
|
|
5
|
+
): void {
|
|
6
|
+
const blob = new Blob([text], { type: mimeType });
|
|
7
|
+
downloadFile(filename, blob);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function downloadFile(
|
|
11
|
+
filename: string,
|
|
12
|
+
blob: Blob
|
|
13
|
+
): void {
|
|
14
|
+
const url = window.URL.createObjectURL(blob);
|
|
15
|
+
const a = document.createElement('a');
|
|
16
|
+
a.href = url;
|
|
17
|
+
a.download = filename;
|
|
18
|
+
a.click();
|
|
19
|
+
window.URL.revokeObjectURL(url);
|
|
20
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface CommonIcons {
|
|
2
|
+
add: string;
|
|
3
|
+
minus: string;
|
|
4
|
+
delete: string;
|
|
5
|
+
filter: string;
|
|
6
|
+
download: string;
|
|
7
|
+
save: string;
|
|
8
|
+
print: string;
|
|
9
|
+
edit: string;
|
|
10
|
+
settings: string;
|
|
11
|
+
house: string;
|
|
12
|
+
calendar: string;
|
|
13
|
+
chevronRight: string;
|
|
14
|
+
chevronLeft: string;
|
|
15
|
+
chevronDown: string;
|
|
16
|
+
chevronUp: string;
|
|
17
|
+
checkbox: string;
|
|
18
|
+
warning: string;
|
|
19
|
+
search: string;
|
|
20
|
+
action: string;
|
|
21
|
+
user: string;
|
|
22
|
+
logout: string;
|
|
23
|
+
crossCircle: string;
|
|
24
|
+
infoCircle: string;
|
|
25
|
+
cross: string;
|
|
26
|
+
arrowLeft: string;
|
|
27
|
+
arrowRight: string;
|
|
28
|
+
questionCircle: string;
|
|
29
|
+
checkCircle: string;
|
|
30
|
+
sitemap: string;
|
|
31
|
+
check: string;
|
|
32
|
+
envelope: string;
|
|
33
|
+
loader: string;
|
|
34
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './angular-helper';
|
|
2
|
+
export * from './control.models';
|
|
3
|
+
export * from './constants';
|
|
4
|
+
export * from './datasource-component.model';
|
|
5
|
+
export * from './filter';
|
|
6
|
+
export * from './notificable-property.model';
|
|
7
|
+
export * from './rxjs';
|
|
8
|
+
export * from './icons';
|
|
9
|
+
export * from './download-file';
|
|
10
|
+
export * from './deactivate-guard.model'
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { QueryList } from '@angular/core';
|
|
2
|
+
import { skip, Subject } from 'rxjs';
|
|
3
|
+
import { NotificableProperty } from './notificable-property.model';
|
|
4
|
+
import { queryListChanged } from './rxjs';
|
|
5
|
+
|
|
6
|
+
describe('queryListChanged', () => {
|
|
7
|
+
let queryList: QueryList<NotificableProperty>;
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
queryList = new QueryList<NotificableProperty>();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('should emit initial value', (done) => {
|
|
14
|
+
queryListChanged(queryList).subscribe((result) => {
|
|
15
|
+
expect(result).toEqual([]);
|
|
16
|
+
done();
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should emit when propertyChanged emits', (done) => {
|
|
21
|
+
const propertyChanged = new Subject<void>();
|
|
22
|
+
const item = { propertyChanged } as NotificableProperty;
|
|
23
|
+
queryList.reset([item]);
|
|
24
|
+
queryList.notifyOnChanges();
|
|
25
|
+
|
|
26
|
+
queryListChanged(queryList)
|
|
27
|
+
.pipe(skip(1))
|
|
28
|
+
.subscribe((result) => {
|
|
29
|
+
expect(result).toEqual([item]);
|
|
30
|
+
done();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
propertyChanged.next();
|
|
35
|
+
}, 60);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should debounce emissions', (done) => {
|
|
39
|
+
const propertyChanged = new Subject<void>();
|
|
40
|
+
const item = { propertyChanged } as NotificableProperty;
|
|
41
|
+
queryList.reset([item]);
|
|
42
|
+
queryList.notifyOnChanges();
|
|
43
|
+
|
|
44
|
+
const emittedValues: NotificableProperty[][] = [];
|
|
45
|
+
queryListChanged(queryList).subscribe((result) => {
|
|
46
|
+
emittedValues.push(result);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
propertyChanged.next();
|
|
50
|
+
propertyChanged.next();
|
|
51
|
+
|
|
52
|
+
setTimeout(() => {
|
|
53
|
+
expect(emittedValues.length).toBe(1);
|
|
54
|
+
expect(emittedValues[0]).toEqual([item]);
|
|
55
|
+
done();
|
|
56
|
+
}, 100);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { QueryList } from '@angular/core';
|
|
2
|
+
import { debounceTime, map, merge, startWith, switchMap } from 'rxjs';
|
|
3
|
+
import { NotificableProperty } from './notificable-property.model';
|
|
4
|
+
|
|
5
|
+
export function queryListChanged<TEntity>(list: QueryList<TEntity>) {
|
|
6
|
+
return list.changes.pipe(
|
|
7
|
+
startWith({}),
|
|
8
|
+
switchMap(() => {
|
|
9
|
+
const actionPropertyChanges$ = list
|
|
10
|
+
.toArray()
|
|
11
|
+
.filter((action) => (<NotificableProperty>action).propertyChanged)
|
|
12
|
+
.map((action) => (<NotificableProperty>action).propertyChanged);
|
|
13
|
+
|
|
14
|
+
return merge(...actionPropertyChanges$).pipe(
|
|
15
|
+
startWith({}),
|
|
16
|
+
map(() => list.toArray())
|
|
17
|
+
);
|
|
18
|
+
}),
|
|
19
|
+
debounceTime(50)
|
|
20
|
+
);
|
|
21
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { IconPositionType } from '../../common';
|
|
3
|
+
import { ActionButton } from './action-button.model';
|
|
4
|
+
|
|
5
|
+
export const ACTION_BUTTON_GROUP_COMPONENT_TOKEN =
|
|
6
|
+
new InjectionToken<ActionButtonGroupCore>('ActionButtonGroupComponentToken');
|
|
7
|
+
|
|
8
|
+
export interface ActionButtonGroupCore {
|
|
9
|
+
maxItems: number;
|
|
10
|
+
maxItemsMobile: number;
|
|
11
|
+
items: ActionButton[];
|
|
12
|
+
menuIconPos: IconPositionType;
|
|
13
|
+
menuIcon: string;
|
|
14
|
+
label?: string;
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import { ControlSeverityType, FieldSizeType, NotificableProperty } from '../../common';
|
|
3
|
+
|
|
4
|
+
export interface ActionButton extends NotificableProperty {
|
|
5
|
+
disabled: boolean;
|
|
6
|
+
toolTip?: string;
|
|
7
|
+
id?: string;
|
|
8
|
+
icon?: string;
|
|
9
|
+
outlined: boolean;
|
|
10
|
+
raised: boolean;
|
|
11
|
+
severity?: ControlSeverityType;
|
|
12
|
+
label?: string;
|
|
13
|
+
size?: FieldSizeType;
|
|
14
|
+
click: EventEmitter<MouseEvent>;
|
|
15
|
+
}
|