dbm 1.1.1 → 1.1.3

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 (36) hide show
  1. package/commands/CommandBaseObject.js +25 -0
  2. package/commands/SetProperty.js +18 -0
  3. package/commands/index.js +20 -8
  4. package/core/source/FromObject.js +8 -0
  5. package/core/source/index.js +9 -0
  6. package/flow/controllers/edit/EditMultipleValues.js +57 -0
  7. package/flow/controllers/edit/EditValue.js +52 -0
  8. package/flow/controllers/edit/index.js +2 -0
  9. package/flow/controllers/index.js +2 -1
  10. package/graphapi/webclient/admin/EditorGroup.js +59 -0
  11. package/graphapi/webclient/admin/ItemEditor.js +74 -0
  12. package/graphapi/webclient/admin/ItemSaveData.js +63 -0
  13. package/graphapi/webclient/admin/SaveData.js +60 -0
  14. package/graphapi/webclient/admin/SaveFunctions.js +7 -0
  15. package/graphapi/webclient/admin/ValueEditor.js +61 -0
  16. package/graphapi/webclient/admin/index.js +8 -0
  17. package/graphapi/webclient/decode/index.js +16 -3
  18. package/graphapi/webclient/index.js +17 -1
  19. package/package.json +1 -1
  20. package/react/admin/EditPage.js +87 -66
  21. package/react/admin/SelectImageFromLibrary.js +56 -0
  22. package/react/admin/editor/Editor.js +2 -0
  23. package/react/admin/editor/fields/ImageField.js +143 -4
  24. package/react/admin/index.js +1 -0
  25. package/react/area/OpenCloseExpandableArea.js +1 -1
  26. package/react/image/CoverScaledImage.js +5 -0
  27. package/react/image/Image.js +10 -1
  28. package/react/image/WidthScaledImage.js +5 -0
  29. package/react/modules/index.js +11 -1
  30. package/react/text/index.js +2 -2
  31. package/site/BrowserUpdater.js +64 -0
  32. package/site/SiteDataLoader.js +9 -13
  33. package/site/SiteNavigation.js +0 -15
  34. package/site/index.js +20 -1
  35. package/utils/ArrayFunctions.js +0 -1
  36. package/utils/UrlFunctions.js +39 -13
@@ -7,42 +7,51 @@ export default class EditPage extends Dbm.react.BaseObject {
7
7
 
8
8
  let page = this.context.page;
9
9
 
10
- this.item.setValue("title", page.title);
11
- this.item.setValue("navigationName", page.navigationName);
12
- this.item.setValue("content", page.content);
13
- this.item.setValue("description", page["meta/description"]);
14
- this.item.setValue("url", page.url);
10
+ let editorGroup = new Dbm.graphapi.webclient.admin.EditorGroup();
11
+ this.item.setValue("editorGroup", editorGroup);
12
+ this.item.requireProperty("changed", false).connectInput(editorGroup.item.properties.changed);
15
13
 
16
- let descriptionLength = Dbm.flow.updatefunctions.basic.length(this.item.properties.description);
14
+ let id = page.id;
15
+ let itemEditor = editorGroup.getItemEditor(id);
17
16
 
18
- this.item.requireProperty("descriptionLength", 0).connectInput(descriptionLength.output.properties.length);
17
+ itemEditor.addFieldEditor("title", page.title, "title");
18
+ itemEditor.addFieldEditor("navigationName", page.navigationName); //METODO: add update encoding
19
+ itemEditor.addFieldEditor("content", page.content, "content");
20
+ itemEditor.addEditor("url", page.url, Dbm.graphapi.webclient.admin.SaveFunctions.setUrl, "url");
19
21
 
20
- //METODO: add editors
22
+ let descriptionEditor = itemEditor.addFieldEditor("meta/description", page["meta/description"], "meta/description");
23
+ let descriptionLength = Dbm.flow.updatefunctions.basic.length(descriptionEditor.item.editValue.value);
24
+ this.item.requireProperty("descriptionLength", 0).connectInput(descriptionLength.output.properties.length);
21
25
  }
22
26
 
23
27
  _save() {
24
28
  console.log("_save");
25
29
 
26
30
  let page = this.context.page;
27
- let id = page.id;
28
- let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
29
- //console.log(this.item.content);
30
- //console.log(this.item.content.blocks[1].data.text);
31
-
32
- graphApi.editItem(id, [
33
- {"type": "setField", "data": {"value": this.item.content, "field": "content"}},
34
- {"type": "setField", "data": {"value": this.item.title, "field": "title"}},
35
- {"type": "setField", "data": {"value": this.item.navigationName, "field": "navigationName"}},
36
- {"type": "setField", "data": {"value": this.item.description, "field": "meta/description"}},
37
- {"type": "setField", "data": {"value": (new Date()).toISOString(), "field": "lastModified"}},
38
- {"type": "setUrl", "data": {"value": this.item.url}}
39
- ], ["content", "title", "url", "meta/description"]);
31
+
32
+ let editorGroup = this.item.editorGroup;
33
+
34
+ let saveData = editorGroup.getSaveData();
35
+ let itemSaveData = saveData.getItemSaveData(page.id);
36
+
37
+ itemSaveData.setField("lastModified", (new Date()).toISOString());
38
+ itemSaveData.createChange("clearCache", {});
39
+
40
+ console.log(editorGroup, saveData);
41
+
42
+ saveData.save();
40
43
  }
41
44
 
42
45
  _generateSeoSummary() {
46
+
47
+ let page = this.context.page;
48
+
49
+ let editorGroup = this.item.editorGroup;
50
+ let itemEditor = editorGroup.getItemEditor(page.id);
51
+
43
52
  let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
44
53
 
45
- let request = graphApi.requestData("admin/seoSummary", {"value": {"title": this.item.title, "content": this.item.content}});
54
+ let request = graphApi.requestData("admin/seoSummary", {"value": {"title": itemEditor.getEditor("title").item.editValue.getValue(), "content": itemEditor.getEditor("content").item.editValue.getValue()}});
46
55
  Dbm.flow.addUpdateCommandWhenMatched(request.properties.status, Dbm.loading.LoadingStatus.LOADED, Dbm.commands.callFunction(this._dataLoaded.bind(this), [request]));
47
56
 
48
57
  }
@@ -50,66 +59,78 @@ export default class EditPage extends Dbm.react.BaseObject {
50
59
  _dataLoaded(aRequest) {
51
60
  let summary = Dbm.objectPath(aRequest, "data.seoSummary");
52
61
 
53
- this.item.description = summary;
62
+ let page = this.context.page;
63
+
64
+ let editorGroup = this.item.editorGroup;
65
+ let itemEditor = editorGroup.getItemEditor(page.id);
66
+
67
+ itemEditor.getEditor("meta/description").item.editValue.item.value = summary;
54
68
  }
55
69
 
56
70
  _renderMainElement() {
57
71
 
72
+ let page = this.context.page;
73
+
74
+ let editorGroup = this.item.editorGroup;
75
+ let itemEditor = editorGroup.getItemEditor(page.id);
76
+
58
77
  return React.createElement("div", {},
59
- React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
60
- React.createElement("div", {},
61
- React.createElement("label", {className: "standard-field-label"},
62
- "Page title"
78
+ React.createElement(Dbm.react.context.AddContextVariables, {values: {"editorGroup": editorGroup, "itemEditor": itemEditor}},
79
+ React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
80
+ React.createElement("div", {},
81
+ React.createElement("label", {className: "standard-field-label"},
82
+ "Page title"
83
+ ),
84
+ React.createElement(Dbm.react.form.FormField, {"value": itemEditor.getEditor("title").item.editValue.value, className: "standard-field standard-field-padding full-width page-title-form-field", placeholder: "Title"}),
85
+ ),
86
+ React.createElement("div", {className: "spacing standard"}),
87
+ React.createElement("div", {},
88
+ React.createElement("label", {className: "standard-field-label"},
89
+ "Navigation name"
90
+ ),
91
+ React.createElement(Dbm.react.form.FormField, {"value": itemEditor.getEditor("navigationName").item.editValue.value, className: "standard-field standard-field-padding full-width", placeholder: "Name showed in menues and breadcrumbs"}),
92
+ ),
93
+ React.createElement("div", {className: "spacing standard"}),
94
+ React.createElement("div", {},
95
+ React.createElement("label", {className: "standard-field-label"},
96
+ "Url"
97
+ ),
98
+ React.createElement(Dbm.react.form.FormField, {"value": itemEditor.getEditor("url").item.editValue.value, className: "standard-field standard-field-padding full-width", placeholder: "Url"}),
63
99
  ),
64
- React.createElement(Dbm.react.form.FormField, {"value": this.item.properties.title, className: "standard-field standard-field-padding full-width page-title-form-field", placeholder: "Title"}),
65
100
  ),
66
101
  React.createElement("div", {className: "spacing standard"}),
67
- React.createElement("div", {},
102
+ React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
68
103
  React.createElement("label", {className: "standard-field-label"},
69
- "Navigation name"
104
+ "Seo description"
70
105
  ),
71
- React.createElement(Dbm.react.form.FormField, {"value": this.item.properties.navigationName, className: "standard-field standard-field-padding full-width", placeholder: "Name showed in menues and breadcrumbs"}),
106
+ React.createElement(Dbm.react.form.FormField, {"value": itemEditor.getEditor("meta/description").item.editValue.value, className: "standard-field standard-field-padding full-width", placeholder: "Description"}),
107
+ React.createElement("div", {className: "spacing micro"}),
108
+ React.createElement("div", {className: "flex-row justify-between"},
109
+ React.createElement("div", {className: "flex-row-item"},
110
+ React.createElement("div", {onClick: () => {this._generateSeoSummary()}, className: "action-button action-button-padding"}, "Generate"),
111
+ ),
112
+ React.createElement("div", {className: "flex-row-item"},
113
+ Dbm.react.text.text(this.item.properties.descriptionLength),
114
+ " / ",
115
+ "155"
116
+ )
117
+ )
72
118
  ),
73
119
  React.createElement("div", {className: "spacing standard"}),
74
- React.createElement("div", {},
120
+ React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
75
121
  React.createElement("label", {className: "standard-field-label"},
76
- "Url"
77
- ),
78
- React.createElement(Dbm.react.form.FormField, {"value": this.item.properties.url, className: "standard-field standard-field-padding full-width", placeholder: "Url"}),
79
- ),
80
- ),
81
- React.createElement("div", {className: "spacing standard"}),
82
- React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
83
- React.createElement("label", {className: "standard-field-label"},
84
- "Seo description"
85
- ),
86
- React.createElement(Dbm.react.form.FormField, {"value": this.item.properties.description, className: "standard-field standard-field-padding full-width", placeholder: "Description"}),
87
- React.createElement("div", {className: "spacing micro"}),
88
- React.createElement("div", {className: "flex-row justify-between"},
89
- React.createElement("div", {className: "flex-row-item"},
90
- React.createElement("div", {onClick: () => {this._generateSeoSummary()}}, "Generate"),
122
+ "Content"
91
123
  ),
92
- React.createElement("div", {className: "flex-row-item"},
93
- Dbm.react.text.text(this.item.properties.descriptionLength),
94
- " / ",
95
- "155"
124
+ React.createElement("div", {},
125
+ React.createElement(Dbm.react.admin.editor.Editor, {"value": itemEditor.getEditor("content").item.editValue.value}),
96
126
  )
97
- )
98
- ),
99
- React.createElement("div", {className: "spacing standard"}),
100
- React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
101
- React.createElement("label", {className: "standard-field-label"},
102
- "Content"
103
127
  ),
104
- React.createElement("div", {},
105
- React.createElement(Dbm.react.admin.editor.Editor, {"value": this.item.properties.content}),
106
- )
107
- ),
108
- React.createElement("div", {className: "spacing standard"}),
109
- React.createElement("div", {className: "flex-row justify-center"},
110
- React.createElement("div", {className: "flex-row-item"},
111
- React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._save()}},
112
- "Save"
128
+ React.createElement("div", {className: "spacing standard"}),
129
+ React.createElement("div", {className: "save-all-position"},
130
+ React.createElement(Dbm.react.area.OpenCloseExpandableArea, {open: this.item.properties.changed},
131
+ React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._save()}},
132
+ "Save all changes"
133
+ )
113
134
  )
114
135
  )
115
136
  )
@@ -0,0 +1,56 @@
1
+ import React from "react";
2
+ import Dbm from "../../index.js";
3
+
4
+ export default class SelectImageFromLibrary extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ this.item.requireProperty("loaded", false);
9
+ this.item.requireProperty("rows", []);
10
+
11
+ this._selectCommand = Dbm.commands.callFunction(this._selected.bind(this), [Dbm.react.source.contextVariable("item")]);
12
+
13
+ let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
14
+ let request = graphApi.requestRange(
15
+ [
16
+ {"type": "byObjectType", "objectType": "image"}
17
+ ],
18
+ ["name", "image"]
19
+ );
20
+
21
+ Dbm.flow.addUpdateCommandWhenMatched(request.properties.status, Dbm.loading.LoadingStatus.LOADED, Dbm.commands.callFunction(this._dataLoaded.bind(this), [request]));
22
+ }
23
+
24
+ _dataLoaded(aRequest) {
25
+ console.log("_dataLoaded");
26
+ console.log(aRequest);
27
+
28
+ //METODO: create rows
29
+ this.item.rows = aRequest.items;
30
+
31
+ this.item.loaded = true;
32
+ }
33
+
34
+ _selected(aImage) {
35
+ console.log("_selected");
36
+ console.log(aImage);
37
+
38
+ Dbm.commands.performCommands(this.getPropValue("selectedCommands"), this, aImage);
39
+ }
40
+
41
+ _renderMainElement() {
42
+
43
+ return React.createElement("div", {},
44
+ React.createElement(Dbm.react.area.HasData, {check: this.item.properties.loaded},
45
+ React.createElement("div", {className: "flex-row flex-wrap"},
46
+ React.createElement(Dbm.react.area.List, {items: this.item.properties.rows},
47
+ React.createElement(Dbm.react.interaction.CommandButton, {command: this._selectCommand},
48
+ React.createElement(Dbm.react.image.WidthScaledImage, {image: Dbm.react.source.contextVariable("item"), targetWidth: 120, className: "background-contain image-library-preview image-library-margins"})
49
+ )
50
+ )
51
+ )
52
+ )
53
+ );
54
+ }
55
+ }
56
+
@@ -138,6 +138,8 @@ export default class Editor extends Dbm.react.BaseObject {
138
138
  }
139
139
 
140
140
  tools = {...tools, ...toolsFromConfig};
141
+
142
+ console.log(">>>>>>>", content);
141
143
 
142
144
  const editor = new window.EditorJS({
143
145
  minHeight: 0,
@@ -2,19 +2,27 @@ import React from "react";
2
2
  import Dbm from "../../../../index.js";
3
3
 
4
4
  export default class ImageField extends Dbm.react.BaseObject {
5
+
5
6
  _construct() {
6
7
  super._construct();
7
8
 
8
9
  this._valueChangedBound = this._valueChanged.bind(this);
9
10
  this._objectChangedBound = this._objectChanged.bind(this);
10
11
  this._callback_fileChangedBound = this._callback_fileChanged.bind(this);
12
+ this._altTextChangedBound = this._altTextChanged.bind(this);
11
13
 
12
14
  let fieldName = this.getPropValue("name");
13
15
 
16
+
17
+
14
18
  let editorData = Dbm.objectPath(this.context, "moduleData.editorData");
15
19
 
16
20
  Dbm.flow.addUpdateCommand(this.item.requireProperty("value", this._getObjectData()), Dbm.commands.callFunction(this._valueChangedBound));
17
21
 
22
+ let altText = Dbm.objectPath(this.item.value, "altText");
23
+
24
+ Dbm.flow.addUpdateCommand(this.item.requireProperty("altText", altText), Dbm.commands.callFunction(this._altTextChangedBound));
25
+
18
26
  Dbm.flow.addUpdateCommand(editorData.properties.data, Dbm.commands.callFunction(this._objectChangedBound));
19
27
 
20
28
  let imageElement = React.createElement("div", {className: "flex-row small-item-spacing"},
@@ -22,20 +30,137 @@ export default class ImageField extends Dbm.react.BaseObject {
22
30
  React.createElement(Dbm.react.image.WidthScaledImage, {"image": Dbm.react.source.contextVariable("moduleData.editorData.data." + fieldName), targetWidth: 120, className: "editor-preview background-contain"}),
23
31
  ),
24
32
  React.createElement("div", {className: "flex-row-item flex-resize"},
25
- Dbm.react.text.text(Dbm.react.source.contextVariable("moduleData.editorData.data." + fieldName + ".url"))
33
+ Dbm.react.text.text(Dbm.react.source.contextVariable("moduleData.editorData.data." + fieldName + ".url")),
34
+ React.createElement("div", {className: "spacing small"}),
35
+ React.createElement("div", {},
36
+ React.createElement(Dbm.react.area.HasData, {check: Dbm.react.source.contextVariable("moduleData.editorData.data." + fieldName + ".id"), checkType: "invert/default"},
37
+ React.createElement(Dbm.react.interaction.CommandButton, {command: Dbm.commands.callFunction(this._addToLibrary.bind(this))},
38
+ React.createElement("div", {className: "action-button action-button-padding"},
39
+ "Add to library"
40
+ )
41
+ )
42
+
43
+ ),
44
+ React.createElement(Dbm.react.area.HasData, {check: Dbm.react.source.contextVariable("moduleData.editorData.data." + fieldName + ".id")},
45
+ React.createElement(Dbm.react.form.FormField, {value: this.item.properties.altText, className: "standard-field standard-field-padding full-width"}),
46
+ React.createElement("div", {className: "spacing micro"}),
47
+ React.createElement("div", {className: "flex-row small-item-spacing"},
48
+ React.createElement("div", {className: "flex-row-item"},
49
+ React.createElement(Dbm.react.interaction.CommandButton, {command: Dbm.commands.callFunction(this._generateAltText.bind(this))},
50
+ React.createElement("div", {className: "action-button action-button-padding"},
51
+ "Generate"
52
+ )
53
+ )
54
+ ),
55
+ React.createElement("div", {className: "flex-row-item"},
56
+ React.createElement(Dbm.react.interaction.CommandButton, {command: Dbm.commands.callFunction(this._saveAltTextToLibrary.bind(this))},
57
+ React.createElement("div", {className: "action-button action-button-padding"},
58
+ "Save to library"
59
+ )
60
+ )
61
+ )
62
+ )
63
+ )
64
+ ),
26
65
  ),
27
66
  React.createElement("div", {className: "flex-row-item flex-no-resize"},
28
67
  React.createElement("div", {onClick: () => {this.removeImage()}}, "Remove")
29
68
  )
30
69
  );
31
70
 
32
- let uploadElement = React.createElement("input", {"type": "file", onChange: this._callback_fileChangedBound, className: "full-width"});
71
+ this.item.requireProperty("selectMode", "overview");
72
+
73
+ let uploadElement = React.createElement("div", {className: "flex-row small-item-spacing halfs"},
74
+ React.createElement("div", {className: "flex-row-item"},
75
+ React.createElement("input", {"type": "file", onChange: this._callback_fileChangedBound, className: "full-width"})
76
+ ),
77
+ React.createElement("div", {className: "flex-row-item"},
78
+ React.createElement(Dbm.react.interaction.CommandButton, {command: Dbm.commands.setProperty(this.item.properties.selectMode, "library")},
79
+ React.createElement("div", {className: "flex-row-item"}, "Select from library")
80
+ )
81
+ ),
82
+ );
83
+
84
+ let libraryElement = React.createElement("div", {},
85
+ React.createElement(Dbm.react.admin.SelectImageFromLibrary, {selectedCommands: [
86
+ Dbm.commands.callFunction(this._imageSelected.bind(this), [Dbm.core.source.event()]),
87
+ Dbm.commands.setProperty(this.item.properties.selectMode, "overview")
88
+ ]})
89
+ );
33
90
 
34
- let elementSwitch =Dbm.flow.updatefunctions.logic.switchValue(this.item.properties.value).setDefaultValue(imageElement).addCase(null, uploadElement);
91
+ let selectSwitch = Dbm.flow.updatefunctions.logic.switchValue(this.item.properties.selectMode).setDefaultValue(uploadElement).addCase("library", libraryElement);
92
+
93
+ let selectElement = React.createElement("div", {},
94
+ React.createElement(Dbm.react.area.InsertElement, {element: selectSwitch.output.properties.value})
95
+ );
96
+
97
+ let elementSwitch = Dbm.flow.updatefunctions.logic.switchValue(this.item.properties.value).setDefaultValue(imageElement).addCase(null, selectElement);
35
98
 
36
99
  this.item.requireProperty("element", null).connectInput(elementSwitch.output.properties.value);
37
100
  }
38
101
 
102
+ _addToLibrary() {
103
+ let imageData = this.item.value;
104
+
105
+ let objectType = "image";
106
+
107
+ let parsedUrl = URL.parse(imageData.url);
108
+
109
+ let fileName = parsedUrl.pathname.substring(parsedUrl.pathname.lastIndexOf("/")+1);
110
+
111
+ let changes = [
112
+ {"type": "setIdentifier", "data": {"value": imageData.identifier, "field": "name"}},
113
+ {"type": "setField", "data": {"value": fileName, "field": "name"}},
114
+ {"type": "setField", "data": {"value": fileName, "field": "originalFileName"}},
115
+ {"type": "setField", "data": {"value": parsedUrl.pathname, "field": "path"}},
116
+ {"type": "setField", "data": {"value": imageData.url, "field": "url"}},
117
+ {"type": "setField", "data": {"value": imageData.resizeUrl, "field": "resizeUrl"}},
118
+ ];
119
+
120
+ let request = Dbm.getInstance().repository.getItem("graphApi").controller.createItem([objectType], "public", changes);
121
+
122
+ Dbm.flow.addUpdateCommand(request.properties.status, Dbm.commands.callFunction(this._libraryImageCreated.bind(this), [request]));
123
+ }
124
+
125
+ _libraryImageCreated(aRequest) {
126
+ //console.log("_libraryImageCreated");
127
+ //console.log(aRequest);
128
+
129
+ let imageData = {...this.item.value};
130
+
131
+ imageData.id = aRequest.item.id;
132
+ this.item.value = imageData;
133
+ }
134
+
135
+ _generateAltText() {
136
+
137
+ let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
138
+
139
+ let request = graphApi.requestData("admin/altText", {"id": this.item.value.id});
140
+ Dbm.flow.addUpdateCommandWhenMatched(request.properties.status, Dbm.loading.LoadingStatus.LOADED, Dbm.commands.callFunction(this._altTextLoaded.bind(this), [request]));
141
+
142
+ }
143
+
144
+ _altTextLoaded(aRequest) {
145
+ this.item.altText = Dbm.objectPath(aRequest, "data.altText");
146
+ }
147
+
148
+ _saveAltTextToLibrary() {
149
+ let changes = [
150
+ {"type": "setField", "data": {"value": this.item.altText, "field": "altText"}},
151
+ ];
152
+
153
+ let request = Dbm.getInstance().repository.getItem("graphApi").controller.editItem(this.item.value.id, changes);
154
+ }
155
+
156
+ _imageSelected(aImage) {
157
+ //console.log("_imageSelected");
158
+ //console.log(aImage);
159
+
160
+ let imageData = {id: aImage.id, url: aImage.url, resizeUrl: aImage.resizeUrl, identifier: aImage.identifier, altText: aImage.altText};
161
+ this.item.value = imageData;
162
+ }
163
+
39
164
  _getObjectData() {
40
165
  let fieldName = this.getPropValue("name");
41
166
 
@@ -61,6 +186,20 @@ export default class ImageField extends Dbm.react.BaseObject {
61
186
 
62
187
  editorData.data = newData;
63
188
  this.context.moduleData.editorData.editorBlock.dataUpdated();
189
+
190
+ if(newValue) {
191
+ this.item.altText = newValue.altText;
192
+ }
193
+
194
+ }
195
+
196
+ _altTextChanged() {
197
+
198
+ if(this.item.value && this.item.value.altText !== this.item.altText) {
199
+ let newValue = {...this.item.value};
200
+ newValue.altText = this.item.altText;
201
+ this.item.value = newValue;
202
+ }
64
203
  }
65
204
 
66
205
  _objectChanged() {
@@ -121,7 +260,7 @@ export default class ImageField extends Dbm.react.BaseObject {
121
260
  headers: new Headers(headers),
122
261
  body: aFile
123
262
  }).then(() => {
124
- this.item.value = {url: aPreSign.data.publicUrl, resizeUrl: aPreSign.data.publicResizeUrl, identifier: aPreSign.data.identifier};
263
+ this.item.value = {id: aPreSign.data.id, url: aPreSign.data.publicUrl, resizeUrl: aPreSign.data.publicResizeUrl, identifier: aPreSign.data.identifier};
125
264
  console.log("Uploaded", this.item.value);
126
265
  //METODO: send update to editor
127
266
  })
@@ -1,4 +1,5 @@
1
1
  export {default as CreatePage} from "./CreatePage.js";
2
2
  export {default as EditPage} from "./EditPage.js";
3
+ export {default as SelectImageFromLibrary} from "./SelectImageFromLibrary.js";
3
4
 
4
5
  export * as editor from "./editor/index.js";
@@ -25,7 +25,7 @@ export default class OpenCloseExpandableArea extends Dbm.react.BaseObject {
25
25
  //console.log(aEnvelope, this, this.item.element);
26
26
 
27
27
  if(aEnvelope === 0) {
28
- return {"height": "0px", "overflow": "hidden"};
28
+ return {"height": "0px", "overflow": "hidden", "display": "none", "visibility": "hidden"};
29
29
  }
30
30
  else if(aEnvelope === 1 || !this.item.element) {
31
31
  return {};
@@ -21,6 +21,11 @@ export default class CoverScaledImage extends Dbm.react.BaseObject {
21
21
 
22
22
  let newProps = this._copyProps({src: url});
23
23
 
24
+ let altText = Dbm.objectPath(image, "altText");
25
+ if(altText) {
26
+ newProps["alt"] = altText;
27
+ }
28
+
24
29
  let elementType = this.getPropValue("elementType");
25
30
  if(elementType) {
26
31
  newProps["elementType"] = elementType;
@@ -11,6 +11,7 @@ export default class Image extends Dbm.react.BaseObject {
11
11
  let isDiv = (elementType !== "img");
12
12
  if(isDiv) {
13
13
  delete aProps["src"];
14
+ delete aProps["alt"];
14
15
  }
15
16
  }
16
17
 
@@ -26,7 +27,15 @@ export default class Image extends Dbm.react.BaseObject {
26
27
  };
27
28
  let className = "image";
28
29
 
29
- return this._createMainElement("div", {style: imageStyle, className: className}, this.getPropValue("children"));
30
+ let props = {style: imageStyle, className: className};
31
+
32
+ let altText = this.getPropValue("alt");
33
+ if(altText) {
34
+ props["role"] = "img";
35
+ props["aria-label"] = altText;
36
+ }
37
+
38
+ return this._createMainElement("div", props, this.getPropValue("children"));
30
39
  }
31
40
  else {
32
41
  let className = "image";
@@ -19,6 +19,11 @@ export default class WidthScaledImage extends Dbm.react.BaseObject {
19
19
 
20
20
  let newProps = this._copyProps({src: url});
21
21
 
22
+ let altText = Dbm.objectPath(image, "altText");
23
+ if(altText) {
24
+ newProps["alt"] = altText;
25
+ }
26
+
22
27
  let elementType = this.getPropValue("elementType");
23
28
  if(elementType) {
24
29
  newProps["elementType"] = elementType;
@@ -1 +1,11 @@
1
- export {default as ModuleCreator} from "./ModuleCreator.js";
1
+ import Dbm from "../../index.js";
2
+
3
+ export {default as ModuleCreator} from "./ModuleCreator.js";
4
+
5
+ export const addModuleCreator = function(aName, aElement) {
6
+ let module = new Dbm.react.modules.ModuleCreator();
7
+ module.setMainElement(aElement);
8
+ module.item.register("moduleCreators/" + aName);
9
+
10
+ return module;
11
+ }
@@ -12,9 +12,9 @@ export let text = function(aText) {
12
12
  return createElement(Dbm.react.text.Text, {text: aText});
13
13
  }
14
14
 
15
- export let htmlText = function(aText, aElementType = "span") {
15
+ export let htmlText = function(aText, aElementType = "span", aAdditionalProps = {}) {
16
16
  if(typeof(aText) === "string") {
17
17
  //return createElement(aElementType, {"dangerouslySetInnerHTML": {__html: aText}});
18
18
  }
19
- return createElement(Dbm.react.text.HtmlText, {text: aText, elementType: aElementType});
19
+ return createElement(Dbm.react.text.HtmlText, {text: aText, elementType: aElementType, ...aAdditionalProps});
20
20
  }
@@ -0,0 +1,64 @@
1
+ import Dbm from "../index.js";
2
+
3
+ export default class BrowserUpdater extends Dbm.core.BaseObject {
4
+ _construct() {
5
+ super._construct();
6
+
7
+ this.item.setValue("titleSuffix", "");
8
+ this.item.setValue("pageData", null);
9
+
10
+ Dbm.flow.addUpdateCommand(this.item.properties.pageData, Dbm.commands.callFunction(this._pageDataUpdated.bind(this)));
11
+ }
12
+
13
+ setTitleSuffix(aSuffix, aDelimiter = " - ") {
14
+ this.item.titleSuffix = aDelimiter + aSuffix;
15
+
16
+ return this;
17
+ }
18
+
19
+ _trackPage(aUrl) {
20
+ //console.log("_trackPage");
21
+
22
+ let trackingController = Dbm.getInstance().repository.getItem("trackingController").controller;
23
+ if(trackingController) {
24
+ trackingController.trackPage(aUrl);
25
+ }
26
+ }
27
+
28
+ _pageDataUpdated() {
29
+
30
+ let title = Dbm.objectPath(this.item.pageData, "page.title") + this.item.titleSuffix;
31
+ document.title = title;
32
+ {
33
+ let element = document.querySelector('meta[property="og:title"]');
34
+ if(element) {
35
+ element.setAttribute("content", title);
36
+ }
37
+ }
38
+
39
+
40
+ let description = Dbm.objectPath(this.item.pageData, "page.meta/description");
41
+ {
42
+ let element = document.querySelector('meta[name="description"]');
43
+ if(element) {
44
+ element.setAttribute("content", description);
45
+ }
46
+ }
47
+
48
+ {
49
+ let element = document.querySelector('meta[property="og:description"]');
50
+ if(element) {
51
+ element.setAttribute("content", description);
52
+ }
53
+ }
54
+
55
+
56
+ //METODO: set canonical
57
+
58
+ //METODO: set structured data
59
+
60
+ window.scrollTo(0, 0);
61
+
62
+ this._trackPage(document.location.href);
63
+ }
64
+ }