UNPKG

catreact

Version:

Catavolt Core React Components

376 lines (375 loc) 16.6 kB
"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; } }, };