Skip to content

Commit a17b163

Browse files
[CST-22299] reintroduce rating/slider/editor/colorpicker models
1 parent d6b16e0 commit a17b163

14 files changed

+531
-29
lines changed

src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,18 @@ import { DynamicListDirective } from '@ng-dynamic-forms/core/directive/dynamic-l
2929
import { DynamicTemplateDirective } from '@ng-dynamic-forms/core/directive/dynamic-template.directive';
3030
import { DynamicCheckboxModel } from '@ng-dynamic-forms/core/model/checkbox/dynamic-checkbox.model';
3131
import { DynamicCheckboxGroupModel } from '@ng-dynamic-forms/core/model/checkbox/dynamic-checkbox-group.model';
32+
import { DynamicColorPickerModel } from '@ng-dynamic-forms/core/model/colorpicker/dynamic-colorpicker.model';
3233
import { DynamicDatePickerModel } from '@ng-dynamic-forms/core/model/datepicker/dynamic-datepicker.model';
3334
import { DynamicFormControlModel } from '@ng-dynamic-forms/core/model/dynamic-form-control.model';
35+
import { DynamicEditorModel } from '@ng-dynamic-forms/core/model/editor/dynamic-editor.model';
3436
import { DynamicFileUploadModel } from '@ng-dynamic-forms/core/model/file-upload/dynamic-file-upload.model';
3537
import { DynamicFormArrayModel } from '@ng-dynamic-forms/core/model/form-array/dynamic-form-array.model';
3638
import { DynamicFormGroupModel } from '@ng-dynamic-forms/core/model/form-group/dynamic-form-group.model';
3739
import { DynamicInputModel } from '@ng-dynamic-forms/core/model/input/dynamic-input.model';
3840
import { DynamicRadioGroupModel } from '@ng-dynamic-forms/core/model/radio/dynamic-radio-group.model';
41+
import { DynamicRatingModel } from '@ng-dynamic-forms/core/model/rating/dynamic-rating.model';
3942
import { DynamicSelectModel } from '@ng-dynamic-forms/core/model/select/dynamic-select.model';
43+
import { DynamicSliderModel } from '@ng-dynamic-forms/core/model/slider/dynamic-slider.model';
4044
import { DynamicSwitchModel } from '@ng-dynamic-forms/core/model/switch/dynamic-switch.model';
4145
import { DynamicTextAreaModel } from '@ng-dynamic-forms/core/model/textarea/dynamic-textarea.model';
4246
import { DynamicTimePickerModel } from '@ng-dynamic-forms/core/model/timepicker/dynamic-timepicker.model';
@@ -105,17 +109,21 @@ describe('DsDynamicFormControlContainerComponent test suite', () => {
105109
const formModel = [
106110
new DynamicCheckboxModel({ id: 'checkbox' }),
107111
new DynamicCheckboxGroupModel({ id: 'checkboxGroup', group: [] }),
112+
new DynamicColorPickerModel({ id: 'colorpicker' }),
108113
new DynamicDatePickerModel({ id: 'datepicker' }),
114+
new DynamicEditorModel({ id: 'editor' }),
109115
new DynamicFileUploadModel({ id: 'upload', url: '' }),
110116
new DynamicFormArrayModel({ id: 'formArray', groupFactory: () => [] }),
111117
new DynamicFormGroupModel({ id: 'formGroup', group: [] }),
112118
new DynamicInputModel({ id: 'input', maxLength: 51 }),
113119
new DynamicRadioGroupModel({ id: 'radioGroup' }),
120+
new DynamicRatingModel({ id: 'rating' }),
114121
new DynamicSelectModel({
115122
id: 'select',
116123
options: [{ value: 'One' }, { value: 'Two' }],
117124
value: 'One',
118125
}),
126+
new DynamicSliderModel({ id: 'slider' }),
119127
new DynamicSwitchModel({ id: 'switch' }),
120128
new DynamicTextAreaModel({ id: 'textarea' }),
121129
new DynamicTimePickerModel({ id: 'timepicker' }),
@@ -188,7 +196,7 @@ describe('DsDynamicFormControlContainerComponent test suite', () => {
188196
}),
189197
new DynamicQualdropModel({ id: 'combobox', readOnly: false, required: false }),
190198
];
191-
const testModel = formModel[6];
199+
const testModel = formModel[8];
192200
let formGroup: UntypedFormGroup;
193201
let fixture: ComponentFixture<DsDynamicFormControlContainerComponent>;
194202
let component: DsDynamicFormControlContainerComponent;
@@ -343,28 +351,32 @@ describe('DsDynamicFormControlContainerComponent test suite', () => {
343351
const testFn = dsDynamicFormControlMapFn;
344352
expect(testFn(formModel[0])).toEqual(DynamicNGBootstrapCheckboxComponent);
345353
expect(testFn(formModel[1])).toEqual(DynamicNGBootstrapCheckboxGroupComponent);
346-
expect(testFn(formModel[2])).toEqual(DsDatePickerInlineComponent);
347-
(formModel[2] as DynamicDatePickerModel).inline = true;
348-
expect(testFn(formModel[2])).toEqual(DynamicNGBootstrapCalendarComponent);
349-
expect(testFn(formModel[3])).toBeNull();
350-
expect(testFn(formModel[4])).toEqual(DsDynamicFormArrayComponent);
351-
expect(testFn(formModel[5])).toEqual(DsDynamicFormGroupComponent);
352-
expect(testFn(formModel[6])).toEqual(DynamicNGBootstrapInputComponent);
353-
expect(testFn(formModel[7])).toEqual(DynamicNGBootstrapRadioGroupComponent);
354-
expect(testFn(formModel[8])).toEqual(DynamicNGBootstrapSelectComponent);
355-
expect(testFn(formModel[9])).toBeNull();
356-
expect(testFn(formModel[10])).toEqual(DynamicNGBootstrapTextAreaComponent);
357-
expect(testFn(formModel[11])).toEqual(DynamicNGBootstrapTimePickerComponent);
358-
expect(testFn(formModel[12])).toEqual(DsDynamicOneboxComponent);
359-
expect(testFn(formModel[13])).toEqual(DsDynamicScrollableDropdownComponent);
360-
expect(testFn(formModel[14])).toEqual(DsDynamicTagComponent);
361-
expect(testFn(formModel[15])).toEqual(DsDynamicListComponent);
362-
expect(testFn(formModel[16])).toEqual(DsDynamicListComponent);
363-
expect(testFn(formModel[17])).toEqual(DsDynamicRelationGroupComponent);
364-
expect(testFn(formModel[18])).toEqual(DsDatePickerComponent);
365-
expect(testFn(formModel[19])).toEqual(DsDynamicLookupComponent);
366-
expect(testFn(formModel[20])).toEqual(DsDynamicLookupComponent);
367-
expect(testFn(formModel[21])).toEqual(DsDynamicFormGroupComponent);
354+
expect(testFn(formModel[2])).toBeNull();
355+
expect(testFn(formModel[3])).toEqual(DsDatePickerInlineComponent);
356+
(formModel[3] as DynamicDatePickerModel).inline = true;
357+
expect(testFn(formModel[3])).toEqual(DynamicNGBootstrapCalendarComponent);
358+
expect(testFn(formModel[4])).toBeNull();
359+
expect(testFn(formModel[5])).toBeNull();
360+
expect(testFn(formModel[6])).toEqual(DsDynamicFormArrayComponent);
361+
expect(testFn(formModel[7])).toEqual(DsDynamicFormGroupComponent);
362+
expect(testFn(formModel[8])).toEqual(DynamicNGBootstrapInputComponent);
363+
expect(testFn(formModel[9])).toEqual(DynamicNGBootstrapRadioGroupComponent);
364+
expect(testFn(formModel[10])).toBeNull();
365+
expect(testFn(formModel[11])).toEqual(DynamicNGBootstrapSelectComponent);
366+
expect(testFn(formModel[12])).toBeNull();
367+
expect(testFn(formModel[13])).toBeNull();
368+
expect(testFn(formModel[14])).toEqual(DynamicNGBootstrapTextAreaComponent);
369+
expect(testFn(formModel[15])).toEqual(DynamicNGBootstrapTimePickerComponent);
370+
expect(testFn(formModel[16])).toEqual(DsDynamicOneboxComponent);
371+
expect(testFn(formModel[17])).toEqual(DsDynamicScrollableDropdownComponent);
372+
expect(testFn(formModel[18])).toEqual(DsDynamicTagComponent);
373+
expect(testFn(formModel[19])).toEqual(DsDynamicListComponent);
374+
expect(testFn(formModel[20])).toEqual(DsDynamicListComponent);
375+
expect(testFn(formModel[21])).toEqual(DsDynamicRelationGroupComponent);
376+
expect(testFn(formModel[22])).toEqual(DsDatePickerComponent);
377+
expect(testFn(formModel[23])).toEqual(DsDynamicLookupComponent);
378+
expect(testFn(formModel[24])).toEqual(DsDynamicLookupComponent);
379+
expect(testFn(formModel[25])).toEqual(DsDynamicFormGroupComponent);
368380
});
369381

370382
});
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import {
2+
DYNAMIC_FORM_CONTROL_TYPE_COLORPICKER,
3+
DynamicColorPickerModel,
4+
} from './dynamic-colorpicker.model';
5+
6+
describe('DynamicColorPickerModel test suite', () => {
7+
let model: DynamicColorPickerModel;
8+
const config = {
9+
id: 'colorpicker',
10+
value: '#ffffff',
11+
};
12+
13+
beforeEach(() => model = new DynamicColorPickerModel(config));
14+
15+
it('should initialize correctly', () => {
16+
expect(model.disabled).toBe(false);
17+
expect(model.format).toBeNull();
18+
expect(model.hidden).toBe(false);
19+
expect(model.id).toEqual(config.id);
20+
expect(model.inline).toBe(false);
21+
expect(model.label).toBeNull();
22+
expect(model.type).toEqual(DYNAMIC_FORM_CONTROL_TYPE_COLORPICKER);
23+
expect(model.value).toBe(config.value);
24+
expect(model.disabledChanges).toBeDefined();
25+
expect(model.valueChanges).toBeDefined();
26+
});
27+
28+
it('should serialize correctly', () => {
29+
const json = JSON.parse(JSON.stringify(model));
30+
31+
expect(json.id).toEqual(model.id);
32+
expect(json.value).toBe(model.value);
33+
expect(json.type).toEqual(DYNAMIC_FORM_CONTROL_TYPE_COLORPICKER);
34+
});
35+
});
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { serializable } from '../../decorator/serializable.decorator';
2+
import {
3+
isBoolean,
4+
isString,
5+
} from '../../utils/core.utils';
6+
import {
7+
DynamicFormValueControlModel,
8+
DynamicFormValueControlModelConfig,
9+
} from '../dynamic-form-value-control.model';
10+
import { DynamicFormControlLayout } from '../misc/dynamic-form-control-layout.model';
11+
12+
export const DYNAMIC_FORM_CONTROL_TYPE_COLORPICKER = 'COLORPICKER';
13+
14+
export interface DynamicColorPickerModelConfig extends DynamicFormValueControlModelConfig<string | object> {
15+
format?: string;
16+
inline?: boolean;
17+
}
18+
19+
export class DynamicColorPickerModel extends DynamicFormValueControlModel<string | object> {
20+
@serializable() format: string | null;
21+
@serializable() inline: boolean;
22+
23+
@serializable() readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_COLORPICKER;
24+
25+
constructor(config: DynamicColorPickerModelConfig, layout?: DynamicFormControlLayout) {
26+
super(config, layout);
27+
28+
this.format = isString(config.format) ? config.format : null;
29+
this.inline = isBoolean(config.inline) ? config.inline : false;
30+
}
31+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import {
2+
DYNAMIC_FORM_CONTROL_TYPE_EDITOR,
3+
DynamicEditorModel,
4+
} from './dynamic-editor.model';
5+
6+
describe('DynamicEditorModel test suite', () => {
7+
let model: DynamicEditorModel;
8+
const config: any = {
9+
id: 'editor',
10+
validators: { required: null, minLength: 5 },
11+
};
12+
13+
beforeEach(() => model = new DynamicEditorModel(config));
14+
15+
it('should initialize correctly', () => {
16+
expect(model.disabled).toBe(false);
17+
expect(model.errorMessages).toBeNull();
18+
expect(model.hasErrorMessages).toBe(false);
19+
expect(model.hidden).toBe(false);
20+
expect(model.id).toEqual(config.id);
21+
expect(model.label).toBeNull();
22+
expect(model.type).toEqual(DYNAMIC_FORM_CONTROL_TYPE_EDITOR);
23+
expect(model.value).toBeNull();
24+
expect(model.disabledChanges).toBeDefined();
25+
expect(model.valueChanges).toBeDefined();
26+
});
27+
28+
it('should set disabled property correctly', () => {
29+
model.disabled = true;
30+
31+
expect(model.disabled).toBe(true);
32+
});
33+
34+
it('should serialize correctly', () => {
35+
const json = JSON.parse(JSON.stringify(model));
36+
37+
expect(json.id).toEqual(model.id);
38+
expect(Object.keys(json.validators).length).toBe(Object.keys(model.validators as any).length);
39+
expect(json.value).toBe(model.value);
40+
expect(json.type).toEqual(DYNAMIC_FORM_CONTROL_TYPE_EDITOR);
41+
});
42+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { serializable } from '../../decorator/serializable.decorator';
2+
import {
3+
DynamicInputControlModel,
4+
DynamicInputControlModelConfig,
5+
} from '../dynamic-input-control.model';
6+
import { DynamicFormControlLayout } from '../misc/dynamic-form-control-layout.model';
7+
8+
export const DYNAMIC_FORM_CONTROL_TYPE_EDITOR = 'EDITOR';
9+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
10+
export interface DynamicEditorModelConfig extends DynamicInputControlModelConfig<string> {
11+
}
12+
13+
export class DynamicEditorModel extends DynamicInputControlModel<string> {
14+
@serializable() readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_EDITOR;
15+
16+
constructor(config: DynamicEditorModelConfig, layout?: DynamicFormControlLayout) {
17+
super(config, layout);
18+
}
19+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import {
2+
DYNAMIC_FORM_CONTROL_TYPE_RATING,
3+
DynamicRatingModel,
4+
} from './dynamic-rating.model';
5+
6+
describe('DynamicRatingModel test suite', () => {
7+
let model: DynamicRatingModel;
8+
const config = {
9+
id: 'rating',
10+
max: 5,
11+
value: 2,
12+
};
13+
14+
beforeEach(() => model = new DynamicRatingModel(config));
15+
16+
it('should initialize correctly', () => {
17+
expect(model.disabled).toBe(false);
18+
expect(model.hidden).toBe(false);
19+
expect(model.id).toEqual(config.id);
20+
expect(model.label).toBeNull();
21+
expect(model.max).toBe(config.max);
22+
expect(model.type).toEqual(DYNAMIC_FORM_CONTROL_TYPE_RATING);
23+
expect(model.value).toBe(config.value);
24+
expect(model.disabledChanges).toBeDefined();
25+
expect(model.valueChanges).toBeDefined();
26+
});
27+
28+
it('should serialize correctly', () => {
29+
const json = JSON.parse(JSON.stringify(model));
30+
31+
expect(json.id).toEqual(model.id);
32+
expect(json.value).toBe(model.value);
33+
expect(json.type).toEqual(DYNAMIC_FORM_CONTROL_TYPE_RATING);
34+
});
35+
});
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { serializable } from '../../decorator/serializable.decorator';
2+
import { isNumber } from '../../utils/core.utils';
3+
import {
4+
DynamicFormValueControlModel,
5+
DynamicFormValueControlModelConfig,
6+
} from '../dynamic-form-value-control.model';
7+
import { DynamicFormControlLayout } from '../misc/dynamic-form-control-layout.model';
8+
9+
export const DYNAMIC_FORM_CONTROL_TYPE_RATING = 'RATING';
10+
11+
export interface DynamicRatingModelConfig extends DynamicFormValueControlModelConfig<number> {
12+
max?: number;
13+
}
14+
15+
export class DynamicRatingModel extends DynamicFormValueControlModel<number> {
16+
@serializable() max: number | null;
17+
@serializable() readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_RATING;
18+
19+
constructor(config: DynamicRatingModelConfig, layout?: DynamicFormControlLayout) {
20+
super(config, layout);
21+
22+
this.max = isNumber(config.max) ? config.max : 10;
23+
}
24+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import {
2+
DYNAMIC_FORM_CONTROL_TYPE_SLIDER,
3+
DynamicSliderModel,
4+
} from './dynamic-slider.model';
5+
6+
describe('DynamicSliderModel test suite', () => {
7+
let model: DynamicSliderModel;
8+
const config = {
9+
id: 'slider',
10+
min: 0,
11+
max: 100,
12+
step: 1,
13+
value: 27,
14+
additional: {
15+
test: true,
16+
},
17+
};
18+
19+
beforeEach(() => model = new DynamicSliderModel(config));
20+
21+
it('should initialize correctly', () => {
22+
expect(model.disabled).toBe(false);
23+
expect(model.hidden).toBe(false);
24+
expect(model.id).toEqual(config.id);
25+
expect(model.label).toBeNull();
26+
expect(model.min).toBe(config.min);
27+
expect(model.max).toBe(config.max);
28+
expect(model.step).toBe(config.step);
29+
expect(model.type).toEqual(DYNAMIC_FORM_CONTROL_TYPE_SLIDER);
30+
expect(model.value).toBe(config.value);
31+
expect(model.vertical).toBe(false);
32+
expect(model.disabledChanges).toBeDefined();
33+
expect(model.valueChanges).toBeDefined();
34+
});
35+
36+
it('should get additional', () => {
37+
38+
expect(model.getAdditional('test', null)).toBe(true);
39+
});
40+
41+
it('should serialize correctly', () => {
42+
const json = JSON.parse(JSON.stringify(model));
43+
44+
expect(json.id).toEqual(model.id);
45+
expect(json.value).toBe(model.value);
46+
expect(json.type).toEqual(DYNAMIC_FORM_CONTROL_TYPE_SLIDER);
47+
});
48+
});
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { serializable } from '../../decorator/serializable.decorator';
2+
import {
3+
isBoolean,
4+
isNumber,
5+
} from '../../utils/core.utils';
6+
import {
7+
DynamicFormValueControlModel,
8+
DynamicFormValueControlModelConfig,
9+
} from '../dynamic-form-value-control.model';
10+
import { DynamicFormControlLayout } from '../misc/dynamic-form-control-layout.model';
11+
12+
export const DYNAMIC_FORM_CONTROL_TYPE_SLIDER = 'SLIDER';
13+
14+
export interface DynamicSliderModelConfig extends DynamicFormValueControlModelConfig<number> {
15+
max?: number;
16+
min?: number;
17+
step?: number;
18+
vertical?: boolean;
19+
}
20+
21+
export class DynamicSliderModel extends DynamicFormValueControlModel<number> {
22+
@serializable() max: number | null;
23+
@serializable() min: number | null;
24+
@serializable() step: number | null;
25+
@serializable() vertical: boolean;
26+
27+
@serializable() readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_SLIDER;
28+
29+
constructor(config: DynamicSliderModelConfig, layout?: DynamicFormControlLayout) {
30+
super(config, layout);
31+
32+
this.max = isNumber(config.max) ? config.max : 10;
33+
this.min = isNumber(config.min) ? config.min : 0;
34+
this.step = isNumber(config.step) ? config.step : 1;
35+
this.vertical = isBoolean(config.vertical) ? config.vertical : false;
36+
}
37+
}

0 commit comments

Comments
 (0)