catreact
Version:
Catavolt Core React Components
280 lines (279 loc) • 12.2 kB
JavaScript
/**
* Created by rburson on 12/23/15.
*/
"use strict";
var React = require('react');
var catreact_core_1 = require('./catreact-core');
var catavolt_sdk_1 = require('catavolt-sdk');
/**
* Render a DetailsContext
*/
exports.CvDetailsPane = React.createClass({
mixins: [catreact_core_1.CvBaseMixin],
componentDidMount: function () {
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);
}
this.refresh(nextProps, nextContext);
},
componentWillUnmount: function () {
this.eventRegistry().unsubscribe(this._dataChangeListener);
},
detailsContext: function (nextProps, nextContext) {
var detailsContext = null;
var paneRef = null;
if (nextProps) {
if (nextProps.detailsContext) {
detailsContext = nextProps.detailsContext;
}
else if (nextProps.paneRef) {
var formContext = this.formContext(nextProps, nextContext);
detailsContext = this._getDetailsContext(formContext, nextProps.paneRef);
}
}
else {
if (this.props.detailsContext) {
detailsContext = this.props.detailsContext;
}
else {
var formContext = this.formContext();
detailsContext = this._getDetailsContext(formContext, this.props.paneRef);
}
}
return detailsContext;
},
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.detailsContext();
return ctx;
},
getDefaultProps: function () {
return { formContext: null, paneRef: null, detailsContext: null, detailsRenderer: null, navigationListeners: [], stateChangeListeners: [], actionProvider: null };
},
refresh: function (nextProps, nextContext, callback) {
var _this = this;
var detailsContext = this.detailsContext(nextProps, nextContext);
if (detailsContext && this.isMounted()) {
if (detailsContext.isDestroyed) {
this.forceUpdate();
callback && callback(true);
}
else {
detailsContext.read().onComplete(function (entityRecTry) {
if (entityRecTry.isFailure) {
var event_1 = { type: catreact_core_1.CvEventType.MESSAGE,
eventObj: { message: 'refresh(): failed to read detailsContext', messageObj: entityRecTry.failure, type: catreact_core_1.CvMessageType.ERROR } };
_this.eventRegistry().publish(event_1, false);
callback && callback(null, entityRecTry.failure);
}
else {
_this.forceUpdate();
callback && callback(true);
}
});
}
}
},
render: function () {
var detailsContext = this.detailsContext();
if (detailsContext && !detailsContext.isDestroyed) {
if (this.props.renderer) {
return this.props.renderer(this.getChildContext().cvContext);
}
else if (this.props.detailsRenderer) {
if (detailsContext.buffer) {
return this.props.detailsRenderer(this.getChildContext().cvContext, detailsContext.entityRec, this._getCallbackObj());
}
else {
return null;
}
}
else {
return null;
}
}
else {
return null;
}
},
_checkDestroyed: function () {
var detailsContext = this.detailsContext();
if (detailsContext && detailsContext.isDestroyed) {
var event_2 = {
type: catreact_core_1.CvEventType.STATE_CHANGE,
resourceId: null,
eventObj: { source: detailsContext, type: catreact_core_1.CvStateChangeType.DESTROYED }
};
this.eventRegistry().publish(event_2, false);
this.props.stateChangeListeners.forEach(function (listener) {
listener(event_2);
});
}
},
_dataChangeListener: function (dataChangeResult) {
if (dataChangeResult.eventObj.type === catreact_core_1.CvStateChangeType.DATA_CHANGE
&& dataChangeResult.eventObj.source !== this.detailsContext()) {
this.refresh();
}
},
_getDetailsContext: function (formContext, paneRef) {
var detailsContext = null;
formContext.childrenContexts.some(function (childContext) {
if (childContext instanceof catavolt_sdk_1.DetailsContext &&
childContext.paneRef == paneRef) {
detailsContext = childContext;
return true;
}
else {
return false;
}
});
return detailsContext;
},
_getCallbackObj: function () {
var _this = this;
return {
openReadMode: function (resultCallback) {
_this.detailsContext().changePaneMode(catavolt_sdk_1.PaneMode.READ).onComplete(function (entityRecDefTry) {
if (entityRecDefTry.isSuccess) {
_this.refresh();
resultCallback(entityRecDefTry.success);
_this._checkDestroyed();
}
else {
var event_3 = { type: catreact_core_1.CvEventType.MESSAGE,
eventObj: { message: 'Could not open read mode', messageObj: entityRecDefTry.failure, type: catreact_core_1.CvMessageType.ERROR } };
_this.eventRegistry().publish(event_3, false);
resultCallback(null, entityRecDefTry.failure);
}
});
},
openWriteMode: function (resultCallback) {
_this.detailsContext().changePaneMode(catavolt_sdk_1.PaneMode.WRITE).onComplete(function (entityRecDefTry) {
if (entityRecDefTry.isSuccess) {
_this.refresh();
resultCallback(entityRecDefTry.success);
_this._checkDestroyed();
}
else {
var event_4 = { type: catreact_core_1.CvEventType.MESSAGE,
eventObj: { message: 'Could not open edit mode', messageObj: entityRecDefTry.failure, type: catreact_core_1.CvMessageType.ERROR } };
_this.eventRegistry().publish(event_4, false);
resultCallback(null, entityRecDefTry.failure);
}
});
},
refresh: function () {
_this.refresh();
},
saveChanges: function (resultCallback, navTarget) {
var detailsContext = _this.detailsContext();
detailsContext.write().onComplete(function (writeTry) {
if (writeTry.isFailure) {
var event_5 = { type: catreact_core_1.CvEventType.MESSAGE,
eventObj: { message: 'Save changes failed', messageObj: writeTry.failure, type: catreact_core_1.CvMessageType.ERROR } };
_this.eventRegistry().publish(event_5, false);
resultCallback(null, Error(writeTry.failure));
}
else {
var either = writeTry.success;
var result = either.isLeft ? _this._handleNavigation(either.left, '#write', navTarget, detailsContext.isDestroyed) : null;
_this.forceUpdate();
resultCallback(result);
_this._publishDataChange();
_this._checkDestroyed();
}
});
},
setBinaryPropWithDataUrl: function (name, dataUrl) {
_this.detailsContext().setBinaryPropWithDataUrl(name, dataUrl);
},
setBinaryPropWithEncodedData: function (name, encodedData) {
_this.detailsContext().setBinaryPropWithEncodedData(name, encodedData);
},
setPropValue: function (name, value) {
catavolt_sdk_1.Log.debug('setting: ' + name + ' : ' + value);
var detailsContext = _this.detailsContext();
var parsedValue = detailsContext.setPropValue(name, value);
var propDef = detailsContext.propDefAtName(name);
if (propDef && propDef.canCauseSideEffects) {
detailsContext.processSideEffects(name, parsedValue).onComplete(function (propChangeTry) {
if (propChangeTry.isFailure) {
var event_6 = { type: catreact_core_1.CvEventType.MESSAGE,
eventObj: { message: 'Process side effects failed', messageObj: propChangeTry.failure, type: catreact_core_1.CvMessageType.ERROR } };
_this.eventRegistry().publish(event_6, false);
}
else {
_this.forceUpdate();
}
});
}
}
};
},
_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 = this.resourceIdForObject(navRequest);
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, this.shouldCacheResult());
this.props.navigationListeners.forEach(function (listener) {
listener(event);
});
return event;
},
_publishDataChange: function () {
var detailsContext = this.detailsContext();
if (detailsContext) {
var event_7 = {
type: catreact_core_1.CvEventType.STATE_CHANGE,
resourceId: null,
eventObj: { source: detailsContext, type: catreact_core_1.CvStateChangeType.DATA_CHANGE }
};
this.eventRegistry().publish(event_7, false);
this.props.stateChangeListeners.forEach(function (listener) {
listener(event_7);
});
}
}
});