diff --git a/pandora_console/include/javascript/pandora_visual_console.js b/pandora_console/include/javascript/pandora_visual_console.js index 81af3e0ad7..556a273316 100755 --- a/pandora_console/include/javascript/pandora_visual_console.js +++ b/pandora_console/include/javascript/pandora_visual_console.js @@ -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; diff --git a/visual_console_client/src/Form.ts b/visual_console_client/src/Form.ts index 08ba3dcd68..2838ebca83 100644 --- a/visual_console_client/src/Form.ts +++ b/visual_console_client/src/Form.ts @@ -2,12 +2,22 @@ import TypedEvent, { Listener, Disposable } from "./lib/TypedEvent"; import { AnyObject } from "./lib/types"; import { t } from "./lib"; +interface InputGroupDataRequestedEvent { + identifier: string; + params: AnyObject; + done: (error: Error | null, data?: T | null) => void; +} + // TODO: Document export abstract class InputGroup { private _name: string = ""; private _element?: HTMLElement; public initialData: Data; protected currentData: Partial = {}; + // Event manager for data requests. + private readonly dataRequestedEventManager = new TypedEvent< + InputGroupDataRequestedEvent> + >(); public constructor(name: string, initialData: Data) { this.name = name; @@ -58,6 +68,20 @@ export abstract class InputGroup { // TODO: Update item. } + protected requestData( + identifier: string, + params: AnyObject, + done: (error: Error | null, data?: Partial | null) => void + ): void { + this.dataRequestedEventManager.emit({ identifier, params, done }); + } + + public onDataRequested( + listener: Listener>> + ): 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(); + // Event manager for item data requests. + private readonly itemDataRequestedEventManager = new TypedEvent< + InputGroupDataRequestedEvent> + >(); + 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): Disposable { return this.submitEventManager.on(listener); } + + public onInputGroupDataRequested( + listener: Listener>> + ): Disposable { + return this.itemDataRequestedEventManager.on(listener); + } }