Skip to content

Commit e7a4d41

Browse files
committed
refactor: allowing to create selects
1 parent f94a3eb commit e7a4d41

2 files changed

Lines changed: 31 additions & 0 deletions

File tree

source/js/fields/fieldBuilder.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import NullFieldConditionValidator from "./field/nullField/nullFieldConditionVal
77
import Text from "./field/text/text";
88
import TextConditionsHandler from "./field/text/textConditionHandler";
99
import TextConditionValidator from "./field/text/textConditionValidator";
10+
import Select from "./field/select/select";
11+
import SelectConditionHandler from "./field/select/selectConditionHandler";
12+
import SelectConditionValidator from "./field/select/selectConditionValidator";
1013

1114
class FieldBuilder implements FieldBuilderInterface {
1215
private name: string = 'data-js-field-name';
@@ -23,6 +26,8 @@ class FieldBuilder implements FieldBuilderInterface {
2326
return this.buildCheckbox(field);
2427
case 'text':
2528
return this.buildText(field);
29+
case 'select':
30+
return this.buildSelect(field);
2631
}
2732

2833
return this.buildNullField(field, type);
@@ -37,6 +42,27 @@ class FieldBuilder implements FieldBuilderInterface {
3742
new NullFieldConditionsHandler(field, this.getFieldCondition(field))
3843
);
3944
}
45+
46+
private buildSelect(field: HTMLElement): FieldInterface {
47+
console.log(field)
48+
const select = field.querySelector('select') as HTMLSelectElement;
49+
const options = select?.querySelectorAll('option') as NodeListOf<HTMLOptionElement>;
50+
51+
if (!options || options.length === 0) {
52+
console.error('Select field is missing select element or options');
53+
return this.buildNullField(field, 'select');
54+
}
55+
56+
return new Select(
57+
field,
58+
select,
59+
options,
60+
this.getFieldName(field),
61+
new SelectConditionValidator(),
62+
new SelectConditionHandler(this.getFieldCondition(field))
63+
)
64+
return this.buildNullField(field, 'select');
65+
}
4066

4167
private buildText(field: HTMLElement): FieldInterface {
4268
const input = field.querySelector('input[type="text"]') as HTMLInputElement;

source/js/fields/fieldsInterface.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ interface TextInterface extends FieldInterface {
1919
getInput(): HTMLInputElement;
2020
}
2121

22+
interface SelectInterface extends FieldInterface {
23+
getSelect(): HTMLSelectElement;
24+
getOptions(): NodeListOf<HTMLOptionElement>;
25+
}
26+
2227
interface FieldBuilderInterface {
2328
build(field: HTMLElement, type: string): FieldInterface;
2429
}

0 commit comments

Comments
 (0)