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,