Added async data request to the input groups of the visual console items

This commit is contained in:
Alejandro Gallardo Escobar 2019-07-29 15:31:13 +02:00
parent a8ce05d5c3
commit 9918cc7249
2 changed files with 49 additions and 0 deletions

View File

@ -174,6 +174,16 @@ function createVisualConsole(
var formElement = formContainer.getFormElement();
var $formElement = jQuery(formElement);
formContainer.onInputGroupDataRequested(function(e) {
var identifier = e.identifier;
var params = e.params;
var done = e.done;
switch (identifier) {
default:
done(new Error("identifier not found"));
}
});
formContainer.onSubmit(function(e) {
// Send the update.
var id = props.id;

View File

@ -2,12 +2,22 @@ import TypedEvent, { Listener, Disposable } from "./lib/TypedEvent";
import { AnyObject } from "./lib/types";
import { t } from "./lib";
interface InputGroupDataRequestedEvent<T> {
identifier: string;
params: AnyObject;
done: (error: Error | null, data?: T | null) => void;
}
// TODO: Document
export abstract class InputGroup<Data extends {} = {}> {
private _name: string = "";
private _element?: HTMLElement;
public initialData: Data;
protected currentData: Partial<Data> = {};
// Event manager for data requests.
private readonly dataRequestedEventManager = new TypedEvent<
InputGroupDataRequestedEvent<Partial<Data>>
>();
public constructor(name: string, initialData: Data) {
this.name = name;
@ -58,6 +68,20 @@ export abstract class InputGroup<Data extends {} = {}> {
// TODO: Update item.
}
protected requestData(
identifier: string,
params: AnyObject,
done: (error: Error | null, data?: Partial<Data> | null) => void
): void {
this.dataRequestedEventManager.emit({ identifier, params, done });
}
public onDataRequested(
listener: Listener<InputGroupDataRequestedEvent<Partial<Data>>>
): Disposable {
return this.dataRequestedEventManager.on(listener);
}
protected abstract createContent(): HTMLElement | HTMLElement[];
// public abstract get isValid(): boolean;
@ -75,6 +99,11 @@ export class FormContainer {
private enabledInputGroupNames: string[] = [];
// Event manager for submit events.
private readonly submitEventManager = new TypedEvent<SubmitFormEvent>();
// Event manager for item data requests.
private readonly itemDataRequestedEventManager = new TypedEvent<
InputGroupDataRequestedEvent<Partial<{}>>
>();
private handleItemDataRequested = this.itemDataRequestedEventManager.emit;
public constructor(
title: string,
@ -85,6 +114,8 @@ export class FormContainer {
if (inputGroups.length > 0) {
this.inputGroupsByName = inputGroups.reduce((prevVal, inputGroup) => {
// Add event handlers.
inputGroup.onDataRequested(this.handleItemDataRequested);
prevVal[inputGroup.name] = inputGroup;
return prevVal;
}, this.inputGroupsByName);
@ -108,6 +139,8 @@ export class FormContainer {
inputGroup: InputGroup,
index: number | null = null
): FormContainer {
// Add event handlers.
inputGroup.onDataRequested(this.handleItemDataRequested);
this.inputGroupsByName[inputGroup.name] = inputGroup;
// Remove the current stored name if exist.
@ -218,4 +251,10 @@ export class FormContainer {
public onSubmit(listener: Listener<SubmitFormEvent>): Disposable {
return this.submitEventManager.on(listener);
}
public onInputGroupDataRequested(
listener: Listener<InputGroupDataRequestedEvent<Partial<{}>>>
): Disposable {
return this.itemDataRequestedEventManager.on(listener);
}
}