120 lines
2.3 KiB
TypeScript
120 lines
2.3 KiB
TypeScript
namespace formgen.input
|
|
{
|
|
|
|
/**
|
|
*/
|
|
type type_field<type_value> = {
|
|
name : string;
|
|
input : interface_input<type_value>;
|
|
marked : boolean;
|
|
};
|
|
|
|
|
|
/**
|
|
*/
|
|
export class class_input_group implements interface_input<Record<string, any>>
|
|
{
|
|
|
|
/**
|
|
*/
|
|
private fields : Array<type_field<any>>;
|
|
|
|
|
|
/**
|
|
*/
|
|
private label : (null | string);
|
|
|
|
|
|
/**
|
|
*/
|
|
public constructor(
|
|
fields : Array<type_field<any>>,
|
|
{
|
|
"label": label = null,
|
|
}
|
|
:
|
|
{
|
|
label ?: (null | string);
|
|
}
|
|
=
|
|
{
|
|
}
|
|
)
|
|
{
|
|
this.fields = fields;
|
|
this.label = label;
|
|
}
|
|
|
|
|
|
/**
|
|
* [implementation]
|
|
*/
|
|
public async setup(
|
|
element_target : Element
|
|
) : Promise<void>
|
|
{
|
|
const element_container : Element = document.createElement("div");
|
|
element_container.classList.add("formgen-input");
|
|
element_container.classList.add("formgen-input-group");
|
|
// label
|
|
{
|
|
if (this.label === null)
|
|
{
|
|
// do nothing
|
|
}
|
|
else
|
|
{
|
|
const element_label : Element = document.createElement("label");
|
|
element_label.textContent = this.label;
|
|
element_container.appendChild(element_label);
|
|
}
|
|
}
|
|
// fields
|
|
{
|
|
const element_fields : Element = document.createElement("div");
|
|
element_fields.classList.add("formgen-input-group-fields");
|
|
for (const field of this.fields)
|
|
{
|
|
const element_field : Element = document.createElement("div");
|
|
element_field.classList.add("formgen-input-group-field");
|
|
element_field.classList.toggle("formgen-input-group-field-marked", field.marked);
|
|
element_field.setAttribute("rel", field.name);
|
|
await field.input.setup(element_field);
|
|
element_fields.appendChild(element_field);
|
|
}
|
|
element_container.appendChild(element_fields);
|
|
}
|
|
element_target.appendChild(element_container);
|
|
return Promise.resolve<void>(undefined);
|
|
}
|
|
|
|
|
|
/**
|
|
* [implementation]
|
|
*/
|
|
public async read(
|
|
) : Promise<Record<string, any>>
|
|
{
|
|
let result : Record<string, any> = {};
|
|
for (const field of this.fields)
|
|
{
|
|
result[field.name] = await field.input.read();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
/**
|
|
* [implementation]
|
|
*/
|
|
public write(
|
|
value : Record<string, any>
|
|
) : Promise<void>
|
|
{
|
|
return Promise.reject(new Error("not implemented"));
|
|
}
|
|
|
|
}
|
|
|
|
}
|