catreact
Version:
Catavolt Core React Components
376 lines (375 loc) • 16.6 kB
JavaScript
"use strict";
/**
* Created by rburson on 7/25/16.
*/
Object.defineProperty(exports, "__esModule", { value: true });
var catreact_core_1 = require("./catreact-core");
var catavolt_sdk_1 = require("catavolt-sdk");
var CvInitMode;
(function (CvInitMode) {
CvInitMode[CvInitMode["NORMAL"] = 0] = "NORMAL";
CvInitMode[CvInitMode["DEFERRED"] = 1] = "DEFERRED";
CvInitMode[CvInitMode["MANUAL"] = 2] = "MANUAL";
})(CvInitMode = exports.CvInitMode || (exports.CvInitMode = {}));
/**
* Render a EditorContext
*/
exports.CvEditorBase = {
editorContext: function (nextProps, nextContext) {
var editorContext = null;
var paneRef = null;
if (nextProps) {
if (nextProps.detailsContext) {
editorContext = nextProps.detailsContext;
}
else if (nextProps.paneRef !== null && nextProps.paneRef !== undefined) {
var formContext = this.formContext(nextProps, nextContext);
editorContext = this._getEditorContext(formContext, nextProps.paneRef);
}
}
else {
if (this.props.detailsContext) {
editorContext = this.props.detailsContext;
}
else {
var formContext = this.formContext();
editorContext = this._getEditorContext(formContext, this.props.paneRef);
}
}
return editorContext;
},
formContext: function (nextProps, nextContext) {
if (nextProps && nextProps.formContext) {
return nextProps.formContext;
}
else if (nextContext) {
return this.firstInScope(catavolt_sdk_1.FormContext, nextContext.cvContext.scopeCtx);
}
else {
return this.props.formContext || this.firstInScope(catavolt_sdk_1.FormContext);
}
},
getChildContext: function () {
var ctx = this.getDefaultChildContext();
ctx.cvContext.scopeCtx.scopeObj = this.editorContext();
return ctx;
},
refresh: function (nextProps, nextContext, callback) {
var _this = this;
var editorContext = this.editorContext(nextProps, nextContext);
if (editorContext && this.isMounted()) {
if (editorContext.isDestroyed) {
callback && callback(true);
if (this.isMounted()) {
this.forceUpdate();
}
}
else {
catreact_core_1.CvActionBase._publishActionStarted('#refresh', editorContext, false, this.props.actionListeners, this.eventRegistry());
editorContext.read().onComplete(function (entityRecTry) {
if (entityRecTry.isFailure) {
var event_1 = {
type: catreact_core_1.CvEventType.MESSAGE,
eventObj: {
message: 'refresh(): failed to read editorContext',
messageObj: entityRecTry.failure,
type: catreact_core_1.CvMessageType.ERROR
}
};
_this.eventRegistry().publish(event_1, false);
callback && callback(null, entityRecTry.failure);
}
else {
callback && callback(true);
if (_this.isMounted()) {
_this.forceUpdate();
}
}
catreact_core_1.CvActionBase._publishActionFinished('#refresh', editorContext, _this.props.actionListeners, _this.eventRegistry());
});
}
}
},
_checkDestroyed: function () {
var editorContext = this.editorContext();
if (editorContext && editorContext.isDestroyed) {
this._publishStateChange(catreact_core_1.CvStateChangeType.DESTROYED);
}
},
_componentDidMount: function () {
if (!this.props.initMode || this.props.initMode === CvInitMode.NORMAL)
this.refresh();
if (this.props.actionProvider) {
this.props.actionProvider.subscribe(this._handleAction);
}
this.eventRegistry()
.subscribe(this._dataChangeListener, catreact_core_1.CvEventType.STATE_CHANGE);
},
_componentWillReceiveProps: function (nextProps, nextContext) {
if (nextProps.actionProvider && nextProps.actionProvider !== this.props.actionProvider) {
nextProps.actionProvider.subscribe(this._handleAction);
}
if (!this.props.initMode || this.props.initMode === CvInitMode.NORMAL) {
if (this.editorContext() !== this.editorContext(nextProps, nextContext)) {
this.refresh(nextProps, nextContext);
}
}
},
_componentWillUnmount: function () {
this.eventRegistry().unsubscribe(this._dataChangeListener);
},
_dataChangeListener: function (dataChangeResult) {
if (dataChangeResult.eventObj.type === catreact_core_1.CvStateChangeType.DATA_CHANGE
&& dataChangeResult.eventObj.source !== this.editorContext()) {
if (this.props.initMode && (this.props.initMode === CvInitMode.NORMAL
|| this.props.initMode === CvInitMode.DEFERRED)) {
this.refresh();
}
}
},
_getDefaultProps: function () {
return {
formContext: null,
paneRef: null,
//called 'details' instead of 'editor' for compatibility's sake
detailsContext: null,
detailsRenderer: null,
errorRenderer: null,
navigationListeners: [],
stateChangeListeners: [],
actionListeners: [],
actionProvider: null,
initMode: CvInitMode.NORMAL
};
},
_getEditorContext: function (formContext, paneRef) {
var editorContext = null;
formContext.childrenContexts.some(function (childContext) {
if (childContext instanceof catavolt_sdk_1.EditorContext &&
childContext.paneRef == paneRef) {
editorContext = childContext;
return true;
}
else {
return false;
}
});
return editorContext;
},
_getCallbackObj: function () {
var _this = this;
var suppressEvents = false;
return {
clear: function () {
_this.editorContext().entityRec.propNames.forEach(function (propName) {
_this._getCallbackObj().setPropValue(propName, null);
});
},
getPropValueForDisplay: function (propName) {
var editorContext = _this.editorContext();
var prop = editorContext.buffer.propAtName(propName);
var propDef = editorContext.entityRecDef.propDefAtName(propName);
return catavolt_sdk_1.PropFormatter.formatForRead(prop, propDef);
},
getPropValueForEdit: function (propName) {
var editorContext = _this.editorContext();
var prop = editorContext.buffer.propAtName(propName);
var propDef = editorContext.entityRecDef.propDefAtName(propName);
return catavolt_sdk_1.PropFormatter.formatForWrite(prop, propDef);
},
openReadMode: function (resultCallback) {
_this.editorContext().changePaneMode(catavolt_sdk_1.PaneMode.READ).onComplete(function (entityRecDefTry) {
if (entityRecDefTry.isSuccess) {
if (!suppressEvents) {
_this._publishStateChange(catreact_core_1.CvStateChangeType.MODE_CHANGE_READ);
_this._checkDestroyed();
_this.refresh(null, null, resultCallback);
}
else {
resultCallback(entityRecDefTry.success);
}
}
else {
var event_2 = {
type: catreact_core_1.CvEventType.MESSAGE,
eventObj: {
message: 'Could not open read mode',
messageObj: entityRecDefTry.failure,
type: catreact_core_1.CvMessageType.ERROR
}
};
if (!suppressEvents)
_this.eventRegistry().publish(event_2, false);
resultCallback(null, entityRecDefTry.failure);
}
});
},
openWriteMode: function (resultCallback) {
_this.editorContext().changePaneMode(catavolt_sdk_1.PaneMode.WRITE).onComplete(function (entityRecDefTry) {
if (entityRecDefTry.isSuccess) {
if (!suppressEvents) {
_this.refresh(null, null, resultCallback);
_this._publishStateChange(catreact_core_1.CvStateChangeType.MODE_CHANGE_WRITE);
_this._checkDestroyed();
}
else {
resultCallback(entityRecDefTry.success);
}
}
else {
var event_3 = {
type: catreact_core_1.CvEventType.MESSAGE,
eventObj: {
message: 'Could not open edit mode',
messageObj: entityRecDefTry.failure,
type: catreact_core_1.CvMessageType.ERROR
}
};
if (!suppressEvents)
_this.eventRegistry().publish(event_3, false);
resultCallback(null, entityRecDefTry.failure);
}
});
},
refresh: function () {
_this.refresh();
},
saveChanges: function (resultCallback, navTarget) {
var editorContext = _this.editorContext();
editorContext.write().onComplete(function (writeTry) {
if (writeTry.isFailure) {
var event_4 = {
type: catreact_core_1.CvEventType.MESSAGE,
eventObj: {
message: 'Save changes failed',
messageObj: writeTry.failure,
type: catreact_core_1.CvMessageType.ERROR
}
};
if (!suppressEvents)
_this.eventRegistry().publish(event_4, false);
resultCallback(null, Error(writeTry.failure));
}
else {
var either = writeTry.success;
var result = either.isLeft ? _this._handleNavigation(either.left, '#write', navTarget, editorContext.isDestroyed) : null;
if (!suppressEvents) {
_this._publishStateChange(catreact_core_1.CvStateChangeType.DATA_CHANGE);
_this._checkDestroyed();
if (_this.isMounted()) {
_this.forceUpdate();
}
}
resultCallback(result);
}
});
},
setBinaryPropWithDataUrl: function (name, dataUrl) {
_this.editorContext().setBinaryPropWithDataUrl(name, dataUrl);
},
setBinaryPropWithEncodedData: function (name, encodedData) {
_this.editorContext().setBinaryPropWithEncodedData(name, encodedData);
},
setPropValue: function (name, value) {
catavolt_sdk_1.Log.debug('setting: ' + name + ' : ' + value);
var editorContext = _this.editorContext();
var parsedValue = editorContext.setPropValue(name, value);
var propDef = editorContext.propDefAtName(name);
if (propDef && propDef.canCauseSideEffects) {
editorContext.processSideEffects(name, parsedValue).onComplete(function (propChangeTry) {
if (propChangeTry.isFailure) {
var event_5 = {
type: catreact_core_1.CvEventType.MESSAGE,
eventObj: {
message: 'Process side effects failed',
messageObj: propChangeTry.failure,
type: catreact_core_1.CvMessageType.ERROR
}
};
if (!suppressEvents)
_this.eventRegistry().publish(event_5, false);
}
else {
if (_this.isMounted()) {
if (!suppressEvents)
_this.forceUpdate();
}
}
});
}
},
suppressEvents: function (val) { suppressEvents = val; }
};
},
_handleAction: function (params) {
var event = params.event;
var callback = params.callback;
if (event.eventObj.clientAction) {
var actionId = event.eventObj.actionId;
if (actionId === '#refresh') {
this.refresh(null, null, callback);
}
else {
callback(null, "Action " + actionId + " not yet implemented.");
}
}
},
_handleNavigation: function (navRequest, actionId, navTarget, sourceIsDestroyed) {
var resourceId = catreact_core_1.CvResourceManager.resourceIdForObject(navRequest, this.catavolt());
var event = {
type: catreact_core_1.CvEventType.NAVIGATION,
resourceId: resourceId,
eventObj: {
navRequest: navRequest,
actionId: actionId,
navTarget: navTarget,
sourceIsDestroyed: sourceIsDestroyed,
type: catreact_core_1.CvNavigationResultUtil.determineType(navRequest)
}
};
this.eventRegistry().publish(event, catreact_core_1.CvResourceManager.shouldCacheResult(this.eventRegistry()));
this.props.navigationListeners.forEach(function (listener) {
listener(event);
});
return event;
},
_publishStateChange: function (type) {
var editorContext = this.editorContext();
if (editorContext) {
var event_6 = {
type: catreact_core_1.CvEventType.STATE_CHANGE,
resourceId: null,
eventObj: { source: editorContext, type: type }
};
this.eventRegistry().publish(event_6, false);
this.props.stateChangeListeners.forEach(function (listener) {
listener(event_6);
});
}
},
_render: function () {
var editorContext = this.editorContext();
if (editorContext && !editorContext.isDestroyed) {
if (editorContext.hasError) {
return this.props.errorRenderer ? this.props.errorRenderer(this.getChildContext().cvContext, editorContext.error) : null;
}
else if (this.props.renderer) {
return this.props.renderer(this.getChildContext().cvContext);
}
else if (this.props.detailsRenderer) {
if (editorContext.buffer) {
return this.props.detailsRenderer(this.getChildContext().cvContext, editorContext.entityRec, this._getCallbackObj());
}
else {
return null;
}
}
else {
return null;
}
}
else {
return null;
}
},
};