dbm 1.1.18 → 1.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/flow/updatefunctions/basic/index.js +14 -0
  2. package/graphapi/webclient/ApiConnection.js +1 -0
  3. package/graphapi/webclient/WebSocketConnection.js +1 -0
  4. package/graphapi/webclient/admin/ItemEditor.js +21 -1
  5. package/graphapi/webclient/decode/index.js +12 -1
  6. package/package.json +1 -1
  7. package/react/admin/CreatePage.js +37 -2
  8. package/react/admin/EditPage.js +62 -12
  9. package/react/admin/editor/fields/ImageField.js +31 -0
  10. package/react/admin/editorsgroup/EditIdentifer.js +25 -0
  11. package/react/admin/editorsgroup/index.js +2 -1
  12. package/react/admin/objects/ObjectList.js +8 -1
  13. package/react/admin/objects/RunObjectCommands.js +13 -5
  14. package/react/admin/objects/UserList.js +123 -0
  15. package/react/admin/objects/UserListRow.js +35 -0
  16. package/react/admin/objects/index.js +2 -0
  17. package/react/admin/objects/itemeditors/Identifier.js +45 -0
  18. package/react/admin/objects/itemeditors/MainImage.js +46 -0
  19. package/react/admin/objects/itemeditors/PageRepresentation.js +46 -0
  20. package/react/admin/objects/itemeditors/RichDescription.js +1 -1
  21. package/react/admin/objects/itemeditors/SingleRelation.js +52 -0
  22. package/react/admin/objects/itemeditors/index.js +5 -1
  23. package/react/admin/website/EditLocalBusiness.js +9 -0
  24. package/react/blocks/admin/objects/List.js +7 -1
  25. package/react/blocks/admin/objects/RunObjectCommands.js +18 -1
  26. package/react/blocks/admin/objects/User.js +47 -0
  27. package/react/blocks/admin/objects/Users.js +15 -0
  28. package/react/blocks/admin/objects/index.js +3 -1
  29. package/react/blocks/faq/AskAQuestion.js +2 -2
  30. package/react/blocks/faq/HelpSectionRowItem.js +1 -1
  31. package/react/blocks/index.js +64 -5
  32. package/utils/ArrayFunctions.js +20 -0
@@ -31,5 +31,19 @@ export const propertyOf = function(aValue, aPropertyName) {
31
31
  updateFunction.input.properties.value.setOrConnect(aValue);
32
32
  updateFunction.input.properties.propertyName.setOrConnect(aPropertyName);
33
33
 
34
+ return updateFunction;
35
+ }
36
+
37
+ export const combine = function(...aValues) {
38
+ let updateFunction = new Dbm.flow.updatefunctions.basic.CombineString();
39
+
40
+ let currentArray = aValues;
41
+ let currentArrayLength = currentArray.length;
42
+ for(let i = 0; i < currentArrayLength; i++) {
43
+ let currentData = currentArray[i];
44
+ updateFunction.addPart(currentData);
45
+ }
46
+
47
+
34
48
  return updateFunction;
35
49
  }
@@ -60,6 +60,7 @@ export default class ApiConnection extends Dbm.core.BaseObject {
60
60
 
61
61
  requestItem(aId, aEncode) {
62
62
  let item = this._getRequestItem();
63
+ item.requireProperty("item", null);
63
64
 
64
65
  let encodeString = aEncode.join(",");
65
66
 
@@ -84,6 +84,7 @@ export default class WebSocketConnection extends Dbm.core.BaseObject {
84
84
 
85
85
  requestItem(aId, aEncode) {
86
86
  let item = this._getRequestItem();
87
+ item.requireProperty("item", null);
87
88
  item.setValue("requestData", {"type": "item", "id": aId, "encode": aEncode, "requestId": item.id});
88
89
  this._runRequest(item);
89
90
 
@@ -105,7 +105,7 @@ export default class ItemEditor extends Dbm.core.BaseObject {
105
105
  }
106
106
 
107
107
  getVisibilityEditor(aInitialValue) {
108
- let name = "visibility"
108
+ let name = "visibility";
109
109
  let valueEditor = this.item["visibility"];
110
110
  if(!valueEditor) {
111
111
  valueEditor = new Dbm.graphapi.webclient.admin.ValueEditor();
@@ -124,6 +124,26 @@ export default class ItemEditor extends Dbm.core.BaseObject {
124
124
  return valueEditor;
125
125
  }
126
126
 
127
+ getIdentiferEditor(aInitialValue) {
128
+ let name = "identifer";
129
+ let valueEditor = this.item["identifer"];
130
+ if(!valueEditor) {
131
+ valueEditor = new Dbm.graphapi.webclient.admin.ValueEditor();
132
+ valueEditor.item.editValue.setInitialValue(aInitialValue);
133
+
134
+ valueEditor.item.setValue("itemEditor", this.item);
135
+ valueEditor.item.setValue("updateEncoding", "identifer");
136
+
137
+ this.item.anyChange.addCheck(valueEditor.item.properties.changed);
138
+ this.item.setValue(name, valueEditor);
139
+ this.item.editors = [].concat(this.item.editors, valueEditor);
140
+
141
+ valueEditor.addSaveFunction(Dbm.graphapi.webclient.admin.SaveFunctions.setIdentifier);
142
+ }
143
+
144
+ return valueEditor;
145
+ }
146
+
127
147
  addCommandsToSaveData(aSaveData) {
128
148
 
129
149
  let editedItemId = Dbm.objectPath(this.item, "editedItem.id");
@@ -59,7 +59,9 @@ export const fullSetup = function() {
59
59
  {
60
60
  let name = "urlRequest";
61
61
  let currentDecoder = new Dbm.graphapi.webclient.decode.DecodeBaseObject();
62
- currentDecoder.item.setValue("copyFields", ["meta/description", "seo/noIndex", "seo/noFollow"]);
62
+ currentDecoder.item.setValue("copyFields", ["meta/description", "seo/noIndex", "seo/noFollow", "publishDate"]);
63
+ currentDecoder.item.setValue("copyLink", ["category"]);
64
+ currentDecoder.item.setValue("copyLinks", ["categories"]);
63
65
  currentDecoder.item.setValue("encodingType", name);
64
66
  currentDecoder.item.register(decodePrefix + name);
65
67
  }
@@ -174,4 +176,13 @@ export const fullSetup = function() {
174
176
  currentDecoder.item.setValue("encodingType", name);
175
177
  currentDecoder.item.register(decodePrefix + name);
176
178
  }
179
+
180
+ {
181
+ let name = "admin_user";
182
+ let currentDecoder = new Dbm.graphapi.webclient.decode.DecodeBaseObject();
183
+ currentDecoder.item.setValue("copyFields", ["name", "username"]);
184
+ currentDecoder.item.setValue("copyLinks", ["roles"]);
185
+ currentDecoder.item.setValue("encodingType", name);
186
+ currentDecoder.item.register(decodePrefix + name);
187
+ }
177
188
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dbm",
3
- "version": "1.1.18",
3
+ "version": "1.1.20",
4
4
  "main": "index.js",
5
5
  "type": "module",
6
6
  "scripts": {},
@@ -6,6 +6,9 @@ export default class CreatePage extends Dbm.react.BaseObject {
6
6
  super._construct();
7
7
 
8
8
  this.item.requireProperty("title", "");
9
+ this.item.requireProperty("parent", 0);
10
+ Dbm.flow.addUpdateCommand(this.item.properties.parent, Dbm.commands.callFunction(this._parentSelected.bind(this)));
11
+ this.item.requireProperty("parentUrl", "");
9
12
  this.item.requireProperty("url", "");
10
13
  this.item.requireProperty("freeUrl", "");
11
14
  this.item.requireProperty("updateSlugFromTitle", true);
@@ -22,7 +25,7 @@ export default class CreatePage extends Dbm.react.BaseObject {
22
25
  console.log(this.item.updateSlugFromTitle);
23
26
 
24
27
  if(this.item.updateSlugFromTitle) {
25
- this.item.url = Dbm.utils.StringFunctions.createNiceFilePath(this.item.title);
28
+ this.item.url = this.item.parentUrl + Dbm.utils.StringFunctions.createNiceFilePath(this.item.title);
26
29
  }
27
30
 
28
31
  }
@@ -49,10 +52,12 @@ export default class CreatePage extends Dbm.react.BaseObject {
49
52
 
50
53
  _freeUrlStatusChanged(aUrl, aRequest) {
51
54
  console.log("_freeUrlStatusChanged");
55
+ console.log(aUrl, aRequest);
56
+
52
57
  if(aRequest.status === 1) {
53
58
  let currentUrl = this.item.url;
54
59
  if(!currentUrl) {
55
- currentUrl = Dbm.utils.StringFunctions.createNiceFilePath(this.item.title);
60
+ currentUrl = this.item.parentUrl + Dbm.utils.StringFunctions.createNiceFilePath(this.item.title);
56
61
  this.item.url = currentUrl;
57
62
  }
58
63
  if(currentUrl === aUrl) {
@@ -65,13 +70,34 @@ export default class CreatePage extends Dbm.react.BaseObject {
65
70
  this.item.updateSlugFromTitle = false;
66
71
  }
67
72
 
73
+ _parentSelected() {
74
+ console.log("_parentSelected");
75
+ let id = this.item.parent;
76
+ console.log(id);
77
+
78
+ let parentUrl = "";
79
+
80
+ if(id) {
81
+ let item = Dbm.getInstance().repository.getItem(id);
82
+
83
+ parentUrl = item.url.substring(1);
84
+ }
85
+
86
+ this.item.parentUrl = parentUrl;
87
+
88
+ this._titleChanged();
89
+ }
90
+
68
91
  _create() {
69
92
  console.log("_create");
70
93
 
71
94
  let fullUrl = this.item.freeUrl + "/";
72
95
 
96
+ let currentDate = (new Date()).toISOString().split("T")[0];
97
+
73
98
  let changes = [
74
99
  {"type": "setField", "data": {"value": this.item.title, "field": "title"}},
100
+ {"type": "setField", "data": {"value": currentDate, "field": "publishDate"}},
75
101
  {"type": "setUrl", "data": {"value": fullUrl}}
76
102
  ]
77
103
 
@@ -96,6 +122,15 @@ export default class CreatePage extends Dbm.react.BaseObject {
96
122
  React.createElement(Dbm.react.form.FormField, {"value": this.item.properties.title, "id": this._titleFieldId, className: "standard-field standard-field-padding full-width"}),
97
123
  ),
98
124
  React.createElement("div", {className: "spacing standard"}),
125
+ React.createElement("div", {},
126
+ React.createElement("label", {className: "standard-field-label"},
127
+ "Parent page"
128
+ ),
129
+ React.createElement("div", {},
130
+ React.createElement(Dbm.react.form.GraphApiObjectSelection, {"value": this.item.properties.parent, objectType: "page", encoding: "urlRequest", nameField: "url", className: "standard-field standard-field-padding full-width"}),
131
+ )
132
+ ),
133
+ React.createElement("div", {className: "spacing standard"}),
99
134
  React.createElement("div", {},
100
135
  React.createElement("label", {className: "standard-field-label"},
101
136
  "Url"
@@ -17,6 +17,8 @@ export default class EditPage extends Dbm.react.BaseObject {
17
17
  itemEditor.addFieldEditor("title", page.title, "title");
18
18
  itemEditor.addFieldEditor("navigationName", page.navigationName); //METODO: add update encoding
19
19
  itemEditor.addFieldEditor("content", page.content, "content");
20
+ itemEditor.addFieldEditor("publishDate", page.publishDate, "urlRequest");
21
+ itemEditor.addOutgoingRelationEditor("in", "group/pageCategory", page.category ? page.category.id : 0, "urlRequest");
20
22
  itemEditor.addEditor("url", page.url, Dbm.graphapi.webclient.admin.SaveFunctions.setUrl, "url");
21
23
 
22
24
  let descriptionEditor = itemEditor.addFieldEditor("meta/description", page["meta/description"], "meta/description");
@@ -26,6 +28,7 @@ export default class EditPage extends Dbm.react.BaseObject {
26
28
  itemEditor.addFieldEditor("seo/noIndex", page["seo/noIndex"], "seo/noIndex");
27
29
  itemEditor.addFieldEditor("seo/noFollow", page["seo/noFollow"], "seo/noFollow");
28
30
 
31
+ this.item.requireProperty("importExportOpen", "");
29
32
  this.item.requireProperty("importText", "");
30
33
  }
31
34
 
@@ -146,6 +149,12 @@ export default class EditPage extends Dbm.react.BaseObject {
146
149
  console.log(aRequest, titles);
147
150
  }
148
151
 
152
+ _toggleImportExport() {
153
+ console.log("_toggleImportExport");
154
+
155
+ this.item.importExportOpen = !this.item.importExportOpen;
156
+ }
157
+
149
158
  _renderMainElement() {
150
159
 
151
160
  let page = this.context.page;
@@ -176,6 +185,20 @@ export default class EditPage extends Dbm.react.BaseObject {
176
185
  ),
177
186
  React.createElement(Dbm.react.form.FormField, {"value": itemEditor.getEditor("url").item.editValue.value, className: "standard-field standard-field-padding full-width", placeholder: "Url"}),
178
187
  ),
188
+ React.createElement("div", {className: "spacing standard"}),
189
+ React.createElement("div", {},
190
+ React.createElement("label", {className: "standard-field-label"},
191
+ "Publish date"
192
+ ),
193
+ React.createElement(Dbm.react.form.FormField, {"value": itemEditor.getEditor("publishDate").item.editValue.value, className: "standard-field standard-field-padding full-width", placeholder: "YYYY-MM-DD", "type": "date"}),
194
+ ),
195
+ React.createElement("div", {className: "spacing standard"}),
196
+ React.createElement("div", {},
197
+ React.createElement("label", {className: "standard-field-label"},
198
+ "Category"
199
+ ),
200
+ React.createElement(Dbm.react.form.GraphApiObjectSelection, {"value": itemEditor.getEditor("relation_out_in_group/pageCategory").item.editValue.value, objectType: "group/pageCategory", className: "standard-field standard-field-padding full-width"}),
201
+ ),
179
202
  ),
180
203
  React.createElement("div", {className: "spacing standard"}),
181
204
  React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
@@ -194,7 +217,13 @@ export default class EditPage extends Dbm.react.BaseObject {
194
217
  "155"
195
218
  )
196
219
  ),
197
-
220
+ React.createElement("div", {className: "spacing standard"}),
221
+ React.createElement(Dbm.react.form.LabelledArea, {label: "Main image"},
222
+ React.createElement(Dbm.react.admin.editorsgroup.EditRelation, {"direction": "in", "relationType": "isMainImageFor", "objectType": "image"},
223
+ React.createElement(Dbm.react.form.GraphApiImage, {value: Dbm.react.source.contextVariable("valueEditor.editValue.value"), "objectType": "page", "encoding": "title", nameField: "title", className: "standard-field standard-field-padding full-width"})
224
+ )
225
+ ),
226
+ React.createElement("div", {className: "spacing standard"}),
198
227
  React.createElement("div", {className: "flex-row small-item-spacing"},
199
228
  React.createElement("div", {className: "flex-row-item"},
200
229
  React.createElement(Dbm.react.form.Checkbox, {checked: itemEditor.getEditor("seo/noIndex").item.editValue.value}),
@@ -213,18 +242,39 @@ export default class EditPage extends Dbm.react.BaseObject {
213
242
  ),
214
243
  React.createElement("div", {},
215
244
  React.createElement(Dbm.react.admin.editor.Editor, {"value": itemEditor.getEditor("content").item.editValue.value, "ref": this.createRef("editor")}),
245
+ )
246
+ ),
247
+ React.createElement("div", {className: "spacing standard"}),
248
+ React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
249
+ React.createElement("label", {className: "standard-field-label", "onClick": () => {this._toggleImportExport()}},
250
+ "Import/export"
216
251
  ),
217
- React.createElement("div", {className: "spacing small"}),
218
- React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._export()}},
219
- "Export"
220
- ),
221
- React.createElement(Dbm.react.form.FormField, {value: this.item.properties.importText}),
222
- React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._import()}},
223
- "Import"
224
- ),
225
- React.createElement("div", {className: "flex-row-item"},
226
- React.createElement("div", {onClick: () => {this._generateHelpSectionSuggestions()}, className: "action-button action-button-padding"}, "Dev: Help sections"),
227
- ),
252
+ React.createElement(Dbm.react.area.OpenCloseExpandableArea, {open: this.item.properties.importExportOpen},
253
+ React.createElement("div", {},
254
+ React.createElement("div", {className: "flex-row small-item-spacing"},
255
+ React.createElement("div", {className: "flex-row-item"},
256
+ React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._export()}},
257
+ "Export"
258
+ )
259
+ )
260
+ ),
261
+ React.createElement("div", {className: "spacing standard"}),
262
+ React.createElement(Dbm.react.form.TextArea, {value: this.item.properties.importText, className: "standard-field standard-field-padding full-width"}),
263
+ React.createElement("div", {className: "flex-row small-item-spacing"},
264
+ React.createElement("div", {className: "flex-row-item"},
265
+ React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._import()}},
266
+ "Import"
267
+ )
268
+ )
269
+ )
270
+ /*
271
+ React.createElement("div", {className: "flex-row-item"},
272
+ React.createElement("div", {onClick: () => {this._generateHelpSectionSuggestions()}, className: "action-button action-button-padding"}, "Dev: Help sections"),
273
+ ),
274
+ */
275
+ )
276
+ )
277
+
228
278
  ),
229
279
  React.createElement("div", {className: "spacing standard"}),
230
280
  React.createElement("div", {className: "save-all-position"},
@@ -58,6 +58,14 @@ export default class ImageField extends Dbm.react.BaseObject {
58
58
  "Save to library"
59
59
  )
60
60
  )
61
+ ),
62
+ React.createElement("div", {className: "flex-row-item flex-resize"}),
63
+ React.createElement("div", {className: "flex-row-item"},
64
+ React.createElement(Dbm.react.interaction.CommandButton, {command: Dbm.commands.callFunction(this._updateFromLibrary.bind(this))},
65
+ React.createElement("div", {className: "action-button action-button-padding"},
66
+ "Update from library"
67
+ )
68
+ )
61
69
  )
62
70
  )
63
71
  )
@@ -153,6 +161,29 @@ export default class ImageField extends Dbm.react.BaseObject {
153
161
  let request = Dbm.getInstance().repository.getItem("graphApi").controller.editItem(this.item.value.id, changes);
154
162
  }
155
163
 
164
+ _updateFromLibrary() {
165
+ let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
166
+
167
+ let request = graphApi.requestItem(this.item.value.id, ["image"]);
168
+ Dbm.flow.addUpdateCommandWhenMatched(request.properties.status, Dbm.loading.LoadingStatus.LOADED, Dbm.commands.callFunction(this._libraryImageLoaded.bind(this), [request]));
169
+
170
+ }
171
+
172
+ _libraryImageLoaded(aRequest) {
173
+ console.log("_libraryImageLoaded");
174
+ console.log(aRequest);
175
+
176
+ let item = aRequest.item;
177
+
178
+ let imageData = {id: item.id, url: item.url, resizeUrl: item.resizeUrl, identifier: item.identifier, altText: item.altText};
179
+ this.item.value = null;
180
+
181
+ setTimeout(() => {
182
+ this.item.value = imageData;
183
+ }, 100);
184
+
185
+ }
186
+
156
187
  _imageSelected(aImage) {
157
188
  //console.log("_imageSelected");
158
189
  //console.log(aImage);
@@ -0,0 +1,25 @@
1
+ import React from "react";
2
+ import Dbm from "../../../index.js";
3
+
4
+ export default class EditVisibility extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ let item = this.context.item;
9
+ let itemEditor = this.context.itemEditor;
10
+ let initialDataPath = this.getPropValueWithDefault("initialDataPath", "identifier");
11
+ let initialData = Dbm.objectPath(item, initialDataPath);
12
+
13
+ let editor = itemEditor.getIdentiferEditor(initialData);
14
+ this.item.setValue("editor", editor.item);
15
+ }
16
+
17
+ _renderMainElement() {
18
+
19
+ let children = this.getPropValue("children")
20
+
21
+ return React.createElement("div", {},
22
+ React.createElement(Dbm.react.context.AddContextVariables, {"values": {"valueEditor": this.item.editor}}, children)
23
+ );
24
+ }
25
+ }
@@ -1,4 +1,5 @@
1
1
  export {default as EditField} from "./EditField.js";
2
2
  export {default as EditItem} from "./EditItem.js";
3
3
  export {default as EditRelation} from "./EditRelation.js";
4
- export {default as EditVisibility} from "./EditVisibility.js";
4
+ export {default as EditVisibility} from "./EditVisibility.js";
5
+ export {default as EditIdentifer} from "./EditIdentifer.js";
@@ -44,6 +44,7 @@ export default class ObjectList extends Dbm.react.BaseObject {
44
44
 
45
45
  _create() {
46
46
  console.log("_create");
47
+
47
48
  let objectType = this.getPropValue("objectType");
48
49
  let encodings = this.getPropValueWithDefault("encodings", ["name"]);
49
50
  let visibility = this.getPropValueWithDefault("visibility", "private");
@@ -52,7 +53,13 @@ export default class ObjectList extends Dbm.react.BaseObject {
52
53
  {"type": "setField", "data": {"value": "Unnamed " + objectType, "field": "name"}}
53
54
  ];
54
55
 
55
- let request = Dbm.getInstance().repository.getItem("graphApi").controller.createItem([objectType], visibility, changes, encodings);
56
+ let types = [objectType];
57
+ let additionalTypes = this.getPropValue("additionalTypes");
58
+ if(additionalTypes) {
59
+ types = types.concat(additionalTypes);
60
+ }
61
+
62
+ let request = Dbm.getInstance().repository.getItem("graphApi").controller.createItem(types, visibility, changes, encodings);
56
63
 
57
64
  Dbm.flow.addUpdateCommand(request.properties.status, Dbm.commands.callFunction(this._created.bind(this), [request]));
58
65
  }
@@ -45,11 +45,19 @@ export default class RunObjectCommands extends Dbm.react.BaseObject {
45
45
  let id = this.getPropValue("id");
46
46
 
47
47
  return React.createElement("div", {},
48
- React.createElement(Dbm.react.form.FormField, {value: this.getDynamicProp("id")}),
49
- React.createElement(Dbm.react.form.TextArea, {value: this.item.properties.changes}),
50
- React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._runCommand()}},
51
- "Run"
52
- )
48
+ React.createElement(Dbm.react.form.LabelledArea, {"label": "Item id"}),
49
+ React.createElement(Dbm.react.form.FormField, {value: this.getDynamicProp("id"), "className": "standard-field standard-field-padding full-width"}),
50
+ React.createElement("div", {className: "spacing small"}),
51
+ React.createElement(Dbm.react.form.LabelledArea, {"label": "Command"}),
52
+ React.createElement(Dbm.react.form.TextArea, {value: this.item.properties.changes, "className": "standard-field standard-field-padding full-width"}),
53
+ React.createElement("div", {className: "spacing small"}),
54
+ React.createElement("div", {className: "flex-row"},
55
+ React.createElement("div", {className: "flex-row-item"},
56
+ React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._runCommand()}},
57
+ "Run"
58
+ )
59
+ )
60
+ )
53
61
  )
54
62
  }
55
63
  }
@@ -0,0 +1,123 @@
1
+ import React from "react";
2
+ import Dbm from "../../../index.js";
3
+
4
+ export default class UserList extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ this.item.requireProperty("username", "");
9
+ this.item.requireProperty("password", "");
10
+ this.item.requireProperty("role", null);
11
+
12
+ let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
13
+
14
+ this.item.requireProperty("items", []);
15
+
16
+ let encodings = ["admin_user"];
17
+
18
+ let allLoaded = Dbm.flow.updatefunctions.logic.allAtValue(Dbm.loading.LoadingStatus.LOADED);
19
+ this.item.requireProperty("loaded", false);
20
+
21
+ {
22
+ let request = graphApi.requestRange(
23
+ [
24
+ {"type": "includePrivate"},
25
+ {"type": "includeDraft"},
26
+ {"type": "byObjectType", "objectType": "user"},
27
+ ],
28
+ encodings
29
+ );
30
+ Dbm.flow.addUpdateCommandWhenMatched(request.properties.status, Dbm.loading.LoadingStatus.LOADED, Dbm.commands.callFunction(this._loaded.bind(this), [request]));
31
+ allLoaded.addCheck(request.properties.status);
32
+ }
33
+
34
+ this.item.properties.loaded.connectInput(allLoaded.output.properties.value);
35
+ }
36
+
37
+ _loaded(aRequest) {
38
+ console.log("_loaded");
39
+
40
+ let currentArray = [].concat(aRequest.items);
41
+
42
+ let nameField = this.getPropValueWithDefault("nameField", "name");
43
+ Dbm.utils.ArrayFunctions.sortOnField(currentArray, nameField);
44
+
45
+ this.item.items = currentArray;
46
+ }
47
+
48
+ _create() {
49
+ console.log("_create");
50
+
51
+ let data = {
52
+ username: this.item.username,
53
+ password: this.item.password,
54
+ role: this.item.role,
55
+ };
56
+
57
+ let request = Dbm.getInstance().repository.getItem("graphApi").controller.performAction("admin/addUser", data);
58
+
59
+ Dbm.flow.addUpdateCommand(request.properties.status, Dbm.commands.callFunction(this._created.bind(this), [request]));
60
+ }
61
+
62
+ _created(aRequest) {
63
+ console.log("_created");
64
+ console.log(aRequest);
65
+
66
+ if(aRequest.data.id) {
67
+ if(!aRequest.data.created) {
68
+ alert("User already exists. No changes made.");
69
+ }
70
+ Dbm.getInstance().repository.getItem("siteNavigation").controller.navigate("/admin/users/user/?id=" + aRequest.data.id);
71
+ }
72
+ else {
73
+ alert("An error occured");
74
+ }
75
+ }
76
+
77
+ _renderMainElement() {
78
+
79
+ let id = Dbm.react.source.contextVariable("item.id");
80
+ let text = Dbm.react.source.contextVariable("item.username");
81
+
82
+ return React.createElement("div", {"className": "standard-alternating-rows"},
83
+ React.createElement(Dbm.react.area.List, {items: this.item.properties.items},
84
+ React.createElement(Dbm.react.admin.objects.UserListRow, {"id": id, "text": text})
85
+ ),
86
+ React.createElement("div", {"className": "spacing standard"}),
87
+ React.createElement("h2", {"className": "no-margins"},
88
+ "New user"
89
+ ),
90
+ React.createElement("div", {"className": "spacing small"}),
91
+ React.createElement(Dbm.react.form.LabelledArea, {"label": "Username"}),
92
+ React.createElement(Dbm.react.form.FormField, {"className": "standard-field standard-field-padding full-width",
93
+ value: this.item.properties.username,
94
+ type: "email",
95
+ name: "username",
96
+ autoComplete: "username"
97
+ }),
98
+ React.createElement("div", {"className": "spacing small"}),
99
+ React.createElement(Dbm.react.form.LabelledArea, {"label": "Password"}),
100
+ React.createElement(Dbm.react.form.FormField, {"className": "standard-field standard-field-padding full-width",
101
+ value: this.item.properties.password,
102
+ type: "password",
103
+ name: "new-password",
104
+ autoComplete: "new-password"}),
105
+ React.createElement("div", {"className": "spacing small"}),
106
+ React.createElement(Dbm.react.form.LabelledArea, {"label": "Role"}),
107
+ React.createElement(Dbm.react.form.Selection, {"className": "standard-field standard-field-padding full-width", value: this.item.properties.role},
108
+ React.createElement("option", {"value": null}, "None"),
109
+ React.createElement("option", {"value": "editor"}, "Editor"),
110
+ React.createElement("option", {"value": "admin"}, "Admin"),
111
+ ),
112
+ React.createElement("div", {"className": "spacing standard"}),
113
+ React.createElement("div", {"className": "flex-row"},
114
+ React.createElement("div", {"className": "flex-row-item"},
115
+ React.createElement(Dbm.react.interaction.CommandButton, {"command": Dbm.commands.callFunction(this._create.bind(this))},
116
+ React.createElement("div", {"className": "standard-button standard-button-padding"}, "Create")
117
+ )
118
+ )
119
+ )
120
+
121
+ )
122
+ }
123
+ }
@@ -0,0 +1,35 @@
1
+ import React from "react";
2
+ import Dbm from "../../../index.js";
3
+
4
+ export default class UserListRow extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+ }
8
+
9
+ _renderMainElement() {
10
+
11
+ let id = this.getPropValue("id");
12
+ let text = this.getPropValue("text");
13
+
14
+ let baseUrl = "/admin/users/user/?id={id}";
15
+ let url = baseUrl.split("{id}").join(id);
16
+
17
+ return React.createElement("div", {"className": "standard-row"},
18
+ React.createElement(Dbm.react.text.Link, {"href": url, "className": "custom-styled-link hover-row"},
19
+ React.createElement("div", {"className": "standard-row-padding"},
20
+ React.createElement("div", {"className": "flex-row small-item-spacing"},
21
+ React.createElement("div", {"className": "flex-row-item flex-no-resize"},
22
+ Dbm.react.text.text(id),
23
+ ),
24
+ React.createElement("div", {"className": "flex-row-item flex-resize"},
25
+ Dbm.react.text.text(text)
26
+ ),
27
+ React.createElement("div", {"className": "flex-row-item flex-no-resize"},
28
+ ">"
29
+ ),
30
+ )
31
+ )
32
+ )
33
+ );
34
+ }
35
+ }
@@ -3,5 +3,7 @@ export {default as ObjectListRow} from "./ObjectListRow.js";
3
3
  export {default as EditObject} from "./EditObject.js";
4
4
  export {default as InjectObjectTypeEditor} from "./InjectObjectTypeEditor.js";
5
5
  export {default as RunObjectCommands} from "./RunObjectCommands.js";
6
+ export {default as UserList} from "./UserList.js";
7
+ export {default as UserListRow} from "./UserListRow.js";
6
8
 
7
9
  export * as itemeditors from "./itemeditors/index.js";
@@ -0,0 +1,45 @@
1
+ import React from "react";
2
+ import Dbm from "../../../../index.js";
3
+
4
+ export default class Identifier extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
9
+
10
+ let id = this.context.item.id;
11
+
12
+ let allLoaded = Dbm.flow.updatefunctions.logic.allAtValue(Dbm.loading.LoadingStatus.LOADED);
13
+ this.item.requireProperty("loaded", false);
14
+
15
+ {
16
+ let request = graphApi.requestRange(
17
+ [
18
+ {"type": "includePrivate"},
19
+ {"type": "includeDraft"},
20
+ {"type": "idSelection", "ids": [id]},
21
+ ],
22
+ ["identifier"]
23
+ );
24
+ allLoaded.addCheck(request.properties.status);
25
+ }
26
+
27
+ this.item.properties.loaded.connectInput(allLoaded.output.properties.value);
28
+ }
29
+
30
+ _renderMainElement() {
31
+
32
+ let id = this.context.item.id;
33
+
34
+ return React.createElement("div", {},
35
+ React.createElement(Dbm.react.area.HasData, {check: this.item.properties.loaded},
36
+ React.createElement(Dbm.react.form.LabelledArea, {label: "Identifer"},
37
+ React.createElement(Dbm.react.admin.editorsgroup.EditIdentifer, {},
38
+ React.createElement(Dbm.react.form.FormField, {value: Dbm.react.source.contextVariable("valueEditor.editValue.value"), className: "standard-field standard-field-padding full-width"})
39
+ )
40
+ )
41
+ )
42
+
43
+ )
44
+ }
45
+ }
@@ -0,0 +1,46 @@
1
+ import React from "react";
2
+ import Dbm from "../../../../index.js";
3
+
4
+ export default class MainImage extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
9
+
10
+ let id = this.context.item.id;
11
+
12
+ let allLoaded = Dbm.flow.updatefunctions.logic.allAtValue(Dbm.loading.LoadingStatus.LOADED);
13
+ this.item.requireProperty("loaded", false);
14
+
15
+ {
16
+ let request = graphApi.requestRange(
17
+ [
18
+ {"type": "includePrivate"},
19
+ {"type": "includeDraft"},
20
+ {"type": "idSelection", "ids": [id]},
21
+ ],
22
+ ["admin_fields", "relations"]
23
+ );
24
+ allLoaded.addCheck(request.properties.status);
25
+ }
26
+
27
+ this.item.properties.loaded.connectInput(allLoaded.output.properties.value);
28
+ }
29
+
30
+ _renderMainElement() {
31
+
32
+ let id = this.context.item.id;
33
+
34
+ return React.createElement("div", {},
35
+
36
+ React.createElement(Dbm.react.area.HasData, {check: this.item.properties.loaded},
37
+ React.createElement(Dbm.react.form.LabelledArea, {label: "Main image"},
38
+ React.createElement(Dbm.react.admin.editorsgroup.EditRelation, {"direction": "in", "relationType": "isMainImageFor", "objectType": "image"},
39
+ React.createElement(Dbm.react.form.GraphApiImage, {value: Dbm.react.source.contextVariable("valueEditor.editValue.value"), "encoding": "title", nameField: "title", className: "standard-field standard-field-padding full-width"})
40
+ )
41
+ )
42
+ )
43
+
44
+ )
45
+ }
46
+ }
@@ -0,0 +1,46 @@
1
+ import React from "react";
2
+ import Dbm from "../../../../index.js";
3
+
4
+ export default class PageRepresentation extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
9
+
10
+ let id = this.context.item.id;
11
+
12
+ let allLoaded = Dbm.flow.updatefunctions.logic.allAtValue(Dbm.loading.LoadingStatus.LOADED);
13
+ this.item.requireProperty("loaded", false);
14
+
15
+ {
16
+ let request = graphApi.requestRange(
17
+ [
18
+ {"type": "includePrivate"},
19
+ {"type": "includeDraft"},
20
+ {"type": "idSelection", "ids": [id]},
21
+ ],
22
+ ["admin_fields", "relations"]
23
+ );
24
+ allLoaded.addCheck(request.properties.status);
25
+ }
26
+
27
+ this.item.properties.loaded.connectInput(allLoaded.output.properties.value);
28
+ }
29
+
30
+ _renderMainElement() {
31
+
32
+ let id = this.context.item.id;
33
+
34
+ return React.createElement("div", {},
35
+
36
+ React.createElement(Dbm.react.area.HasData, {check: this.item.properties.loaded},
37
+ React.createElement(Dbm.react.form.LabelledArea, {label: "Represening page"},
38
+ React.createElement(Dbm.react.admin.editorsgroup.EditRelation, {"direction": "in", "relationType": "pageRepresentationFor", "objectType": "page"},
39
+ React.createElement(Dbm.react.form.GraphApiObjectSelection, {value: Dbm.react.source.contextVariable("valueEditor.editValue.value"), "objectType": "page", "encoding": "title", nameField: "title", className: "standard-field standard-field-padding full-width"})
40
+ )
41
+ )
42
+ )
43
+
44
+ )
45
+ }
46
+ }
@@ -19,7 +19,7 @@ export default class RichDescription extends Dbm.react.BaseObject {
19
19
  {"type": "includeDraft"},
20
20
  {"type": "idSelection", "ids": [id]},
21
21
  ],
22
- ["adbmi_fields"]
22
+ ["admin_fields"]
23
23
  );
24
24
  allLoaded.addCheck(request.properties.status);
25
25
  }
@@ -0,0 +1,52 @@
1
+ import React from "react";
2
+ import Dbm from "../../../../index.js";
3
+
4
+ export default class SingleRelation extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
9
+
10
+ let id = this.context.item.id;
11
+
12
+ let allLoaded = Dbm.flow.updatefunctions.logic.allAtValue(Dbm.loading.LoadingStatus.LOADED);
13
+ this.item.requireProperty("loaded", false);
14
+
15
+ {
16
+ let request = graphApi.requestRange(
17
+ [
18
+ {"type": "includePrivate"},
19
+ {"type": "includeDraft"},
20
+ {"type": "idSelection", "ids": [id]},
21
+ ],
22
+ ["admin_fields", "relations"]
23
+ );
24
+ allLoaded.addCheck(request.properties.status);
25
+ }
26
+
27
+ this.item.properties.loaded.connectInput(allLoaded.output.properties.value);
28
+ }
29
+
30
+ _renderMainElement() {
31
+
32
+ let id = this.context.item.id;
33
+
34
+ let label = this.getPropValue("label");
35
+ let direction = this.getPropValue("direction");
36
+ let relationType = this.getPropValue("relationType");
37
+ let objectType = this.getPropValue("objectType");
38
+ let encoding = this.getPropValueWithDefault("encoding", "name");
39
+ let nameField = this.getPropValueWithDefault("nameField", "name");
40
+
41
+ return React.createElement("div", {},
42
+
43
+ React.createElement(Dbm.react.area.HasData, {check: this.item.properties.loaded},
44
+ React.createElement(Dbm.react.form.LabelledArea, {label: label}),
45
+ React.createElement(Dbm.react.admin.editorsgroup.EditRelation, {"direction": direction, "relationType": relationType, "objectType": objectType},
46
+ React.createElement(Dbm.react.form.GraphApiObjectSelection, {value: Dbm.react.source.contextVariable("valueEditor.editValue.value"), "objectType": objectType, "encoding": encoding, nameField: nameField, className: "standard-field standard-field-padding full-width"})
47
+ )
48
+ )
49
+
50
+ )
51
+ }
52
+ }
@@ -5,4 +5,8 @@ export {default as Link} from "./Link.js";
5
5
  export {default as Visibility} from "./Visibility.js";
6
6
  export {default as LinkedPage} from "./LinkedPage.js";
7
7
  export {default as Question} from "./Question.js";
8
- export {default as RichDescription} from "./RichDescription.js";
8
+ export {default as RichDescription} from "./RichDescription.js";
9
+ export {default as PageRepresentation} from "./PageRepresentation.js";
10
+ export {default as MainImage} from "./MainImage.js";
11
+ export {default as Identifier} from "./Identifier.js";
12
+ export {default as SingleRelation} from "./SingleRelation.js";
@@ -48,6 +48,12 @@ export default class EditWebsite extends Dbm.react.BaseObject {
48
48
  let mainImage = (isMainImageForRelations && isMainImageForRelations.length) ? isMainImageForRelations[0].id : null;
49
49
  itemEditor.addIncomingRelationEditor("isMainImageFor", "image", mainImage, ["relations"]);
50
50
 
51
+ {
52
+ let relatedItems = Dbm.utils.ArrayFunctions.filterByField(Dbm.objectPath(item, "relations/in.for.objects"), "objectTypes", "schema/type", "arrayContains");
53
+ let relatedItem = (relatedItems && relatedItems.length) ? relatedItems[0].id : null;
54
+ itemEditor.addIncomingRelationEditor("for", "schema/type", relatedItem, ["relations"]);
55
+ }
56
+
51
57
  itemEditor.addFieldEditor("phoneNumber", Dbm.objectPath(item, "fields.phoneNumber"), "admin_fields");
52
58
  itemEditor.addFieldEditor("email", Dbm.objectPath(item, "fields.email"), "admin_fields");
53
59
  itemEditor.addFieldEditor("priceRangeDescription", Dbm.objectPath(item, "fields.priceRangeDescription"), "admin_fields");
@@ -83,6 +89,9 @@ export default class EditWebsite extends Dbm.react.BaseObject {
83
89
  React.createElement(Dbm.react.form.LabelledArea, {"label": "Name"},
84
90
  React.createElement(Dbm.react.form.FormField, {"value": Dbm.react.source.contextVariable("itemEditor.value.item.editor_name.item.editValue.item.properties.value"), className: "standard-field standard-field-padding full-width"})
85
91
  ),
92
+ React.createElement(Dbm.react.form.LabelledArea, {"label": "Schema type"},
93
+ React.createElement(Dbm.react.form.GraphApiObjectSelection, {"objectType": "schema/type", "value": Dbm.react.source.contextVariable("itemEditor.value.item.editor_relation_in_for_schema/type.item.editValue.item.properties.value")}),
94
+ ),
86
95
  React.createElement(Dbm.react.form.LabelledArea, {"label": "Image"},
87
96
  React.createElement(Dbm.react.form.GraphApiImage, {"value": Dbm.react.source.contextVariable("itemEditor.value.item.editor_relation_in_isMainImageFor_image.item.editValue.item.properties.value")}),
88
97
  ),
@@ -9,9 +9,15 @@ export default class ObjectList extends Dbm.react.BaseObject {
9
9
  _renderMainElement() {
10
10
 
11
11
  let encodings = Dbm.utils.ArrayFunctions.arrayOrSeparatedString(this.context.blockData.encodings);
12
+ let additionalTypes = [];
13
+
14
+ let additionalTypesString = this.context.blockData.additionalTypes;
15
+ if(additionalTypesString) {
16
+ additionalTypes = Dbm.utils.ArrayFunctions.arrayOrSeparatedString(additionalTypesString);
17
+ }
12
18
 
13
19
  return React.createElement("div", {className: "content-narrow"},
14
- React.createElement(Dbm.react.admin.objects.ObjectList, {objectType: this.context.blockData.objectType, encodings: encodings, nameField: this.context.blockData.nameField, visibility: this.context.blockData.visibility})
20
+ React.createElement(Dbm.react.admin.objects.ObjectList, {objectType: this.context.blockData.objectType, additionalTypes: additionalTypes, encodings: encodings, nameField: this.context.blockData.nameField, visibility: this.context.blockData.visibility})
15
21
  );
16
22
  }
17
23
  }
@@ -8,6 +8,8 @@ export default class Edit extends Dbm.react.BaseObject {
8
8
  let editorGroup = new Dbm.graphapi.webclient.admin.EditorGroup();
9
9
  this.item.setValue("editorGroup", editorGroup);
10
10
  this.item.requireProperty("changed", false).connectInput(editorGroup.item.properties.changed);
11
+
12
+ this.item.requireProperty("open", false);
11
13
  }
12
14
 
13
15
  _save() {
@@ -20,13 +22,28 @@ export default class Edit extends Dbm.react.BaseObject {
20
22
  saveData.save();
21
23
  }
22
24
 
25
+ _toggleOpen() {
26
+ console.log("_toggleOpen");
27
+
28
+ this.item.open = !this.item.open;
29
+ }
30
+
23
31
  _renderMainElement() {
24
32
 
25
33
  let url = new URL(document.location.href);
26
34
  let id = url.searchParams.get("id");
27
35
 
28
36
  return React.createElement("div", {className: "content-narrow"},
29
- React.createElement(Dbm.react.admin.objects.RunObjectCommands, {id: id})
37
+ React.createElement("div", {className: "flex-row small-item-spacing"},
38
+ React.createElement("div", {className: "flex-row-item"},
39
+ React.createElement("div", {className: "action-button action-button-padding", "onClick": () => {this._toggleOpen()}},
40
+ "Run commands"
41
+ )
42
+ )
43
+ ),
44
+ React.createElement(Dbm.react.area.HasData, {check: this.item.properties.open},
45
+ React.createElement(Dbm.react.admin.objects.RunObjectCommands, {id: id})
46
+ )
30
47
  );
31
48
  }
32
49
  }
@@ -0,0 +1,47 @@
1
+ import React from "react";
2
+ import Dbm from "../../../../index.js";
3
+
4
+ export default class User extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ let editorGroup = new Dbm.graphapi.webclient.admin.EditorGroup();
9
+ this.item.setValue("editorGroup", editorGroup);
10
+ this.item.requireProperty("changed", false).connectInput(editorGroup.item.properties.changed);
11
+ }
12
+
13
+ _save() {
14
+ console.log("_save");
15
+
16
+ let editorGroup = this.item.editorGroup;
17
+
18
+ let saveData = editorGroup.getSaveData();
19
+
20
+ saveData.save();
21
+ }
22
+
23
+ _renderMainElement() {
24
+
25
+ let url = new URL(document.location.href);
26
+ let id = url.searchParams.get("id");
27
+
28
+ return React.createElement("div", {className: "content-narrow"},
29
+ React.createElement(Dbm.react.context.AddContextVariables, {values: {"editorGroup": this.item.editorGroup}},
30
+ React.createElement("h2", {className: "no-margins"}, "Edit details"),
31
+ React.createElement("div", {className: "spacing small"}),
32
+ React.createElement(Dbm.react.admin.objects.EditObject, {id: id}),
33
+ React.createElement("div", {className: "spacing standard"}),
34
+ React.createElement("div", {className: "save-all-position"},
35
+ React.createElement(Dbm.react.area.OpenCloseExpandableArea, {open: this.item.properties.changed},
36
+ React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._save()}},
37
+ "Save all changes"
38
+ )
39
+ )
40
+ ),
41
+ React.createElement("h2", {className: "no-margins"}, "New password"),
42
+ React.createElement("div", {className: "spacing small"}),
43
+ "[Insert password field]"
44
+ )
45
+ );
46
+ }
47
+ }
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ import Dbm from "../../../../index.js";
3
+
4
+ export default class Users extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+ }
8
+
9
+ _renderMainElement() {
10
+
11
+ return React.createElement("div", {className: "content-narrow"},
12
+ React.createElement(Dbm.react.admin.objects.UserList, {})
13
+ );
14
+ }
15
+ }
@@ -1,3 +1,5 @@
1
1
  export {default as List} from "./List.js";
2
2
  export {default as Edit} from "./Edit.js";
3
- export {default as RunObjectCommands} from "./RunObjectCommands.js";
3
+ export {default as RunObjectCommands} from "./RunObjectCommands.js";
4
+ export {default as Users} from "./Users.js";
5
+ export {default as User} from "./User.js";
@@ -66,7 +66,7 @@ export default class AskAQuestion extends Dbm.react.BaseObject {
66
66
  let currentRow = new Dbm.repository.Item();
67
67
  currentRow.setId("_dbmInternal/row" + Dbm.getInstance().getNextId());
68
68
  currentRow.setValue("item", currentItem);
69
- currentRow.setValue("element", React.createElement(Dbm.react.blocks.faq.HelpSectionRowItem, {"open": this._getOpenProperty(i)}));
69
+ currentRow.setValue("element", React.createElement(Dbm.react.blocks.faq.HelpSectionRowItem, {"open": this._getOpenProperty(i), "startState": (i === 0 ? "open" : "close")}));
70
70
  rows.push(currentRow);
71
71
  }
72
72
  this.item.results = rows;
@@ -133,7 +133,7 @@ export default class AskAQuestion extends Dbm.react.BaseObject {
133
133
  ),
134
134
  React.createElement("div", {className: "flex-row-item flex-no-resize"},
135
135
  React.createElement("div", {className: "submit-button-field-padding-right-side border-box-sizing full-height"},
136
- React.createElement("button", {className: "skip-default full-height"},
136
+ React.createElement("button", {className: "skip-default full-height", "aria-label": "Search"},
137
137
  React.createElement("div", {className: "field-submit-button field-submit-button-padding full-height", onClick: () => {this._search();}},
138
138
  React.createElement("div", {className: "centered-cell-holder full-size"},
139
139
  React.createElement(Dbm.react.image.Image, {src: "/assets/img/right-arrow.svg", className: "right-arrow-link-icon background-contain"})
@@ -71,7 +71,7 @@ export default class HelpSectionRowItem extends Dbm.react.BaseObject {
71
71
  )
72
72
  )
73
73
  ),
74
- React.createElement(Dbm.react.area.OpenCloseExpandableArea, {open: open},
74
+ React.createElement(Dbm.react.area.OpenCloseExpandableArea, {open: open, startState: this.getPropValue("startState")},
75
75
  answerElement
76
76
  )
77
77
  );
@@ -114,6 +114,10 @@ export let registerAllBlocks = function() {
114
114
  createElement(Dbm.react.admin.editor.fields.TextField, {name: "objectType"})
115
115
  ),
116
116
  createElement("div", {className: "spacing medium"}),
117
+ createElement(Dbm.react.form.LabelledArea, {label: "Additional types (optional)"},
118
+ createElement(Dbm.react.admin.editor.fields.TextField, {name: "additionalTypes"})
119
+ ),
120
+ createElement("div", {className: "spacing medium"}),
117
121
  createElement(Dbm.react.form.LabelledArea, {label: "Encodings"},
118
122
  createElement(Dbm.react.admin.editor.fields.TextField, {name: "encodings"})
119
123
  ),
@@ -138,6 +142,8 @@ export let registerAllBlocks = function() {
138
142
 
139
143
  registerBlock("admin/objects/edit", "Admin / Edit object", createElement(Dbm.react.blocks.admin.objects.Edit));
140
144
  registerBlock("admin/objects/apiCommands", "Admin / Object API commands", createElement(Dbm.react.blocks.admin.objects.RunObjectCommands));
145
+ registerBlock("admin/users", "Admin / Users", createElement(Dbm.react.blocks.admin.objects.Users));
146
+ registerBlock("admin/users/user", "Admin / User", createElement(Dbm.react.blocks.admin.objects.User));
141
147
 
142
148
  {
143
149
  let editor = createElement(Dbm.react.admin.editor.EditorBlockName, {},
@@ -210,15 +216,11 @@ export let registerAllBlocks = function() {
210
216
 
211
217
  {
212
218
  let editor = createElement(Dbm.react.admin.editor.EditorBlockName, {},
213
- createElement(Dbm.react.form.LabelledArea, {label: "Text 1"},
214
- createElement(Dbm.react.admin.editor.fields.TextField, {name: "text1"})
215
- ),
216
- createElement("div", {className: "spacing medium"}),
217
219
  createElement(Dbm.react.form.LabelledArea, {label: "Initial sections"},
218
220
  createElement(Dbm.react.admin.editor.fields.SelectObjectsField, {objectType: "helpSection", name:"initialSections", "encoding": "title", "nameField": "title"})
219
221
  ),
220
222
  );
221
- registerBlock("faq/askAQuestion", "FAQ / Ask a question", createElement(Dbm.react.blocks.faq.AskAQuestion, {}), editor, {}, {"text1": true, "text2": true});
223
+ registerBlock("faq/askAQuestion", "FAQ / Ask a question", createElement(Dbm.react.blocks.faq.AskAQuestion, {}), editor, {}, {});
222
224
  }
223
225
 
224
226
  {
@@ -251,6 +253,11 @@ export let registerAllBlocks = function() {
251
253
  itemEditor.setValue("element", createElement(Dbm.react.admin.objects.itemeditors.Visibility, {}));
252
254
  }
253
255
 
256
+ {
257
+ let itemEditor = Dbm.getInstance().repository.getItem("admin/itemEditors/identifier");
258
+ itemEditor.setValue("element", createElement(Dbm.react.admin.objects.itemeditors.Identifier, {}));
259
+ }
260
+
254
261
  {
255
262
  let itemEditor = Dbm.getInstance().repository.getItem("admin/itemEditors/linkedPage");
256
263
  itemEditor.setValue("element", createElement(Dbm.react.admin.objects.itemeditors.LinkedPage, {}));
@@ -260,6 +267,28 @@ export let registerAllBlocks = function() {
260
267
  let itemEditor = Dbm.getInstance().repository.getItem("admin/itemEditors/question");
261
268
  itemEditor.setValue("element", createElement(Dbm.react.admin.objects.itemeditors.Question, {}));
262
269
  }
270
+
271
+ {
272
+ let itemEditor = Dbm.getInstance().repository.getItem("admin/itemEditors/pageRepresentation");
273
+ itemEditor.setValue("element", createElement(Dbm.react.admin.objects.itemeditors.PageRepresentation, {}));
274
+ }
275
+
276
+ {
277
+ let itemEditor = Dbm.getInstance().repository.getItem("admin/itemEditors/mainImage");
278
+ itemEditor.setValue("element", createElement(Dbm.react.admin.objects.itemeditors.MainImage, {}));
279
+ }
280
+
281
+ {
282
+ let itemEditor = Dbm.getInstance().repository.getItem("admin/itemEditors/user/role");
283
+ itemEditor.setValue("element", createElement(Dbm.react.admin.objects.itemeditors.SingleRelation, {
284
+ "label": "Role",
285
+ "direction": "in",
286
+ "relationType": "for",
287
+ "objectType": "type/userRole",
288
+ encoding: "identifier",
289
+ nameField: "identifier"
290
+ }));
291
+ }
263
292
 
264
293
  {
265
294
  let objectTypeEditor = Dbm.getInstance().repository.getItem("admin/objectTypeEditors/page");
@@ -300,4 +329,34 @@ export let registerAllBlocks = function() {
300
329
  newArray.push(Dbm.getInstance().repository.getItem("admin/itemEditors/visibility"));
301
330
  objectTypeEditor.editors = newArray;
302
331
  }
332
+
333
+ {
334
+ let objectTypeEditor = Dbm.getInstance().repository.getItem("admin/objectTypeEditors/type");
335
+ if(!objectTypeEditor.editors) {
336
+ objectTypeEditor.setValue("editors", []);
337
+ }
338
+
339
+ let newArray = [].concat(objectTypeEditor.editors);
340
+ newArray.push(Dbm.getInstance().repository.getItem("admin/itemEditors/name"));
341
+ newArray.push(Dbm.getInstance().repository.getItem("admin/itemEditors/identifier"));
342
+ newArray.push(Dbm.getInstance().repository.getItem("admin/itemEditors/pageRepresentation"));
343
+ newArray.push(Dbm.getInstance().repository.getItem("admin/itemEditors/mainImage"));
344
+
345
+ objectTypeEditor.editors = newArray;
346
+ }
347
+
348
+ {
349
+ let objectTypeEditor = Dbm.getInstance().repository.getItem("admin/objectTypeEditors/user");
350
+ if(!objectTypeEditor.editors) {
351
+ objectTypeEditor.setValue("editors", []);
352
+ }
353
+
354
+ let newArray = [].concat(objectTypeEditor.editors);
355
+ newArray.push(Dbm.getInstance().repository.getItem("admin/itemEditors/name"));
356
+ newArray.push(Dbm.getInstance().repository.getItem("admin/itemEditors/user/role"));
357
+ newArray.push(Dbm.getInstance().repository.getItem("admin/itemEditors/pageRepresentation"));
358
+ newArray.push(Dbm.getInstance().repository.getItem("admin/itemEditors/mainImage"));
359
+
360
+ objectTypeEditor.editors = newArray;
361
+ }
303
362
  }
@@ -290,4 +290,24 @@ export const getItemIndexByIfExists = function(aArray, aField, aIdentifier) {
290
290
  }
291
291
 
292
292
  return -1;
293
+ }
294
+
295
+ export const sum = function(aArray) {
296
+
297
+ if(!Array.isArray(aArray)) {
298
+ console.warn("No array provided", aArray);
299
+ return 0;
300
+ }
301
+
302
+ let sum = 0;
303
+ let currentArray = aArray;
304
+ let currentArrayLength = currentArray.length;
305
+ for(let i = 0; i < currentArrayLength; i++) {
306
+ let currentValue = 1*currentArray[i];
307
+ if(!isNaN(currentValue)) {
308
+ sum += currentValue;
309
+ }
310
+ }
311
+
312
+ return sum;
293
313
  }