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.
- package/commands/CommandBaseObject.js +25 -0
- package/commands/SetProperty.js +18 -0
- package/commands/index.js +20 -8
- package/core/source/FromObject.js +8 -0
- package/core/source/index.js +9 -0
- package/flow/controllers/edit/EditMultipleValues.js +57 -0
- package/flow/controllers/edit/EditValue.js +52 -0
- package/flow/controllers/edit/index.js +2 -0
- package/flow/controllers/index.js +2 -1
- package/graphapi/webclient/admin/EditorGroup.js +59 -0
- package/graphapi/webclient/admin/ItemEditor.js +74 -0
- package/graphapi/webclient/admin/ItemSaveData.js +63 -0
- package/graphapi/webclient/admin/SaveData.js +60 -0
- package/graphapi/webclient/admin/SaveFunctions.js +7 -0
- package/graphapi/webclient/admin/ValueEditor.js +61 -0
- package/graphapi/webclient/admin/index.js +8 -0
- package/graphapi/webclient/decode/index.js +16 -3
- package/graphapi/webclient/index.js +17 -1
- package/package.json +1 -1
- package/react/admin/EditPage.js +87 -66
- package/react/admin/SelectImageFromLibrary.js +56 -0
- package/react/admin/editor/Editor.js +2 -0
- package/react/admin/editor/fields/ImageField.js +143 -4
- package/react/admin/index.js +1 -0
- package/react/area/OpenCloseExpandableArea.js +1 -1
- package/react/image/CoverScaledImage.js +5 -0
- package/react/image/Image.js +10 -1
- package/react/image/WidthScaledImage.js +5 -0
- package/react/modules/index.js +11 -1
- package/react/text/index.js +2 -2
- package/site/BrowserUpdater.js +64 -0
- package/site/SiteDataLoader.js +9 -13
- package/site/SiteNavigation.js +0 -15
- package/site/index.js +20 -1
- package/utils/ArrayFunctions.js +0 -1
- package/utils/UrlFunctions.js +39 -13
package/react/admin/EditPage.js
CHANGED
|
@@ -7,42 +7,51 @@ export default class EditPage extends Dbm.react.BaseObject {
|
|
|
7
7
|
|
|
8
8
|
let page = this.context.page;
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
this.item.setValue("
|
|
12
|
-
this.item.
|
|
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
|
|
14
|
+
let id = page.id;
|
|
15
|
+
let itemEditor = editorGroup.getItemEditor(id);
|
|
17
16
|
|
|
18
|
-
|
|
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
|
-
|
|
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
|
-
|
|
28
|
-
let
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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":
|
|
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.
|
|
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(
|
|
60
|
-
React.createElement("div", {},
|
|
61
|
-
React.createElement("
|
|
62
|
-
"
|
|
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
|
-
"
|
|
104
|
+
"Seo description"
|
|
70
105
|
),
|
|
71
|
-
React.createElement(Dbm.react.form.FormField, {"value":
|
|
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
|
-
"
|
|
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", {
|
|
93
|
-
Dbm.react.
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
+
|
|
@@ -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
|
-
|
|
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
|
|
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
|
})
|
package/react/admin/index.js
CHANGED
|
@@ -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;
|
package/react/image/Image.js
CHANGED
|
@@ -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
|
-
|
|
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;
|
package/react/modules/index.js
CHANGED
|
@@ -1 +1,11 @@
|
|
|
1
|
-
|
|
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
|
+
}
|
package/react/text/index.js
CHANGED
|
@@ -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
|
+
}
|