UNPKG

catreact

Version:

Catavolt Core React Components

280 lines (279 loc) 12.2 kB
/** * 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); }); } } });