diff --git a/core/document-resources.js b/core/document-resources.js index 1c39f2243..bc096d290 100644 --- a/core/document-resources.js +++ b/core/document-resources.js @@ -130,7 +130,12 @@ exports.DocumentResources = class DocumentResources extends Montage { const classListScope = cssContext.classListScope; const cssLayerName = cssContext.cssLayerName; const stylesheet = target.sheet; - const cssRules = stylesheet.cssRules; + let cssRules; + try { + cssRules = stylesheet.cssRules; + } catch (e) { + cssRules = []; + } /** * Adding CSS Layers, and Scoping for components in dev mode. diff --git a/data/model/inspectors/organization.mod/organization.css b/data/model/inspectors/organization.mod/organization.css new file mode 100644 index 000000000..3a810e71b --- /dev/null +++ b/data/model/inspectors/organization.mod/organization.css @@ -0,0 +1,30 @@ + +.OrganizationInspector { + height: 100%; + + + + .field { + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + align-items: start; + background: white; + } + .roleListItem { + border: 1px solid #eeeeee; + align-content: center; + padding: 12px 8px; + } + .roleListItem.selected { + background: #d9d9d9; + } + .roleList { + width: 100%; + height: 100%; + } + +} + + diff --git a/data/model/inspectors/organization.mod/organization.html b/data/model/inspectors/organization.mod/organization.html new file mode 100644 index 000000000..d5a7e9567 --- /dev/null +++ b/data/model/inspectors/organization.mod/organization.html @@ -0,0 +1,49 @@ + + + + + + + +
+
+
+
+
+
+
+
+
+ + diff --git a/data/model/inspectors/organization.mod/organization.js b/data/model/inspectors/organization.mod/organization.js new file mode 100644 index 000000000..088da10d7 --- /dev/null +++ b/data/model/inspectors/organization.mod/organization.js @@ -0,0 +1,63 @@ +var Component = require("../../../../ui/component").Component; + +const DataService = require("../../../../data/service/data-service").DataService; + + +exports.Organization = class Organization extends Component { + + context = null; + + getContext() { + const grandparent = this.parentComponent && this.parentComponent.parentComponent; + return grandparent && grandparent.context; + } + + _roleSelection; + + get roleSelection() { + return this._roleSelection; + } + + set roleSelection(value) { + if (this._roleSelection !== value) { + this._roleSelection = value; + } + } + + enterDocument(firstTime) { + if (firstTime) { + if (!this.data){ + throw new Error("Department context is required for Organization inspector"); + } + this.#buildJobRolesFromDepartment(this.data).then((roles) => { + this.roles = roles; + }); + this.context = this.getContext(); + this.addRangeAtPathChangeListener("roleSelection", this, "_handleSelectionChange"); + } + } + + _handleSelectionChange(plus, minus, index) { + var obj = {plus: plus, context: this.context}; + this.dispatchEventNamed("cascadingListPush", true, false, obj); + } + + #buildJobRolesFromDepartment(department) { + return DataService.mainService + .updateObjectProperties(department, "suborganizations") + .then(() => { + return Promise.all( + department.suborganizations.map((suborg) => { + return DataService.mainService.updateObjectProperties(suborg, "jobRoles").then(() => { + return suborg.jobRoles; + }); + }) + ); + }) + .then((results) => { + return results.flat(); + }); + // const { suborganizations = [] } = department; + // return suborganizations.flatMap((suborg) => suborg.jobRoles || []); + } +}; diff --git a/data/model/party/organization-cascading-list-ui-descriptor.mjson b/data/model/party/organization-cascading-list-ui-descriptor.mjson new file mode 100644 index 000000000..bead058b3 --- /dev/null +++ b/data/model/party/organization-cascading-list-ui-descriptor.mjson @@ -0,0 +1,10 @@ +{ + "root": { + "prototype": "core/meta/user-interface-descriptor", + "values": { + "cascadingListItemHeaderRightCollectionNameExpression": "", + "cascadingListItemHeaderRightNameExpression": "'Add'", + "cascadingListItemFooterMiddleCollectionNameExpression": "length + ' item' + (length == 1 ? '' : 's')" + } + } +} diff --git a/data/model/party/organization-ui-descriptor.mjson b/data/model/party/organization-ui-descriptor.mjson index a3b4e2d76..a762d5dc7 100644 --- a/data/model/party/organization-ui-descriptor.mjson +++ b/data/model/party/organization-ui-descriptor.mjson @@ -2,6 +2,9 @@ "root": { "prototype": "core/meta/user-interface-descriptor", "values": { + "inspectorComponentModule": { + "%": "data/model/inspectors/organization.mod" + }, "collectionNameExpression": "'Organization'", "collectionInspectorComponentModule": { "%": "ui/list.mod" diff --git a/data/model/party/organization.mjson b/data/model/party/organization.mjson index e63267000..5b72e22e4 100644 --- a/data/model/party/organization.mjson +++ b/data/model/party/organization.mjson @@ -26,6 +26,9 @@ "userInterfaceDescriptorModules": { "*": { "%": "./organization-ui-descriptor.mjson" + }, + "mod/ui/cascading-list.mod": { + "%": "./organization-cascading-list-ui-descriptor.mjson" } } diff --git a/ui/action-target.mod/action-target.js b/ui/action-target.mod/action-target.js index d0f37bd9a..04f4a93ff 100644 --- a/ui/action-target.mod/action-target.js +++ b/ui/action-target.mod/action-target.js @@ -17,7 +17,7 @@ var Component = require("../component").Component, * @extends Control */ var ActionTarget = exports.ActionTarget = Control.specialize( /** @lends ActionTarget.prototype # */ { - + hasTemplate: { value: false }, diff --git a/ui/cascading-list.mod/cascading-list.js b/ui/cascading-list.mod/cascading-list.js index 7db634a8d..11ecf24af 100644 --- a/ui/cascading-list.mod/cascading-list.js +++ b/ui/cascading-list.mod/cascading-list.js @@ -244,6 +244,16 @@ CascadingList.addClassProperties( { if (!this._populatePromise && object) { var self = this; + if(Array.isArray(object)){ + //TODO: + //1) Find the highest common ancestor with existing object descriptor among all instances in the array + //2) Grab UI descriptor for that ancestor + } + else{ + //TODO: + //1) Refactor below to be used in both cases once UI descriptor is obtained + + } this._populatePromise = this.loadUserInterfaceDescriptor(object).then(function (UIDescriptor) { var context = self._createCascadingListContextWithObjectAndColumnIndex( object,