ui-framework-jps
Version:
A simple UI framework for state management and UI components
180 lines • 6.5 kB
JavaScript
import { StateEventType, StateManagerType } from "../interface/StateManager";
import { StateContextDelegate } from "../delegate/StateContextDelegate";
import { StateChangedDelegate } from "../delegate/StateChangedDelegate";
import debug from "debug";
const logger = debug('abstract-async-state-manager');
export class AbstractAsynchronousStateManager {
constructor(id, managerName) {
this.contextDelegate = null;
this.initialised = false;
this.delegate = new StateChangedDelegate(managerName);
this.emitEvents();
this.bHasCompletedRun = [];
this.bIsRunInProgress = [];
this.managerName = managerName;
this.stateBuffers = [];
}
addChangeListenerForName(name, listener) {
this.delegate.addChangeListenerForName(name, listener);
/* have we already completed the run for the state? */
if (this.hasCompletedRun(name)) {
let foundIndex = this.stateBuffers.findIndex(element => element.name === name);
if (foundIndex >= 0) {
let state = this.stateBuffers[foundIndex];
listener.stateChanged(this.managerName, name, state.value);
}
}
}
addStateNameToConfigurations(stateName) {
let state = {
name: stateName,
value: [],
hasBeenSet: false
};
this.stateBuffers.push(state);
this.bIsRunInProgress.push(false);
this.bHasCompletedRun.push(false);
}
forceResetForGet(stateName) {
let foundIndex = this.stateBuffers.findIndex((config) => config.name === stateName);
if (foundIndex >= 0) {
this.bHasCompletedRun[foundIndex] = false;
this.bIsRunInProgress[foundIndex] = false;
}
}
getConfiguredStateNames() {
let results = [];
this.stateBuffers.forEach((config) => {
results.push(config.name);
});
return results;
}
hasCompletedRun(stateName) {
let result = false;
let foundIndex = this.stateBuffers.findIndex((config) => config.name === stateName);
if (foundIndex >= 0) {
result = this.bHasCompletedRun[foundIndex];
}
return result;
}
setCompletedRun(stateName, values) {
let foundIndex = this.stateBuffers.findIndex((config) => config.name === stateName);
if (foundIndex >= 0) {
this.bHasCompletedRun[foundIndex] = true;
this.bIsRunInProgress[foundIndex] = false;
this.stateBuffers[foundIndex].value = values;
}
}
isRunInProgress(stateName) {
let result = false;
let foundIndex = this.stateBuffers.findIndex((config) => config.name === stateName);
if (foundIndex >= 0) {
result = this.bIsRunInProgress[foundIndex];
}
return result;
}
setRunInProgress(stateName) {
let foundIndex = this.stateBuffers.findIndex((config) => config.name === stateName);
if (foundIndex >= 0) {
this.bIsRunInProgress[foundIndex] = true;
}
}
clearRunInProgress(stateName) {
let foundIndex = this.stateBuffers.findIndex((config) => config.name === stateName);
if (foundIndex >= 0) {
this.bIsRunInProgress[foundIndex] = false;
}
}
setContextSupplier(name, supplier) {
this.contextDelegate = new StateContextDelegate(this, name, supplier);
}
stateContextChanged(newContext) {
}
addNewItemToState(name, item, isPersisted) {
this._addItemToState(name, item, isPersisted);
}
emitEvents() {
this.delegate.emitEvents();
}
findItemInState(name, item) {
return this._findItemInState(name, item);
}
getStateByName(name) {
let result = [];
if (this.isRunInProgress(name)) {
logger(`Getting state for name ${name} in progress`);
return [];
}
else if (this.hasCompletedRun(name)) {
logger(`Getting state for name ${name} has already completed`);
let foundIndex = this.stateBuffers.findIndex(element => element.name === name);
if (foundIndex >= 0) {
let state = this.stateBuffers[foundIndex];
result = state.value;
}
}
else {
this._getState(name);
}
return result;
}
informChangeListenersForStateWithName(name, stateObjValue, eventType, previousObjValue) {
this.delegate.informChangeListenersForStateWithName(name, stateObjValue, eventType, previousObjValue);
}
isItemInState(name, item) {
return true;
}
removeItemFromState(name, item, isPersisted) {
logger(`Removing item from state ${name} is persisted ${isPersisted}`);
logger(item);
this._removeItemFromState(name, item, isPersisted);
return true;
}
setStateByName(name, stateObjectForName, informListeners) {
// state supplied from elsewhere, set run completed
}
suppressEvents() {
this.delegate.suppressEvents();
}
updateItemInState(name, item, isPersisted) {
this._updateItemInState(name, item, isPersisted);
return true;
}
findItemsInState(name, filters) {
return this._findItemsInState(name, filters);
}
getType() {
return StateManagerType.AsyncRemote;
}
fireStateChanged(name) {
if (this.isEmittingEvents()) {
let foundIndex = this.stateBuffers.findIndex((config) => config.name === name);
if (foundIndex >= 0) {
const state = this.stateBuffers[foundIndex];
this.delegate.informChangeListenersForStateWithName(name, state.value, StateEventType.StateChanged, null);
}
}
}
fireStateChangedForAllStates() {
if (this.isEmittingEvents()) {
this.stateBuffers.forEach((state) => {
this.delegate.informChangeListenersForStateWithName(state.name, state.value, StateEventType.StateChanged, null);
});
}
}
isEmittingEvents() {
return this.delegate.isEmittingEvents();
}
getAvailableStateNames() {
return this.getConfiguredStateNames();
}
isInitialised() {
return this.initialised;
}
setInitialised() {
this.initialised = true;
}
postInitialise() {
}
}
//# sourceMappingURL=AbstractAsynchronousStateManager.js.map