dbm 1.1.20 → 1.1.21
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/package.json +1 -1
- package/react/BaseObject.js +5 -0
- package/react/admin/EditObjectById.js +54 -0
- package/react/admin/EditPage.js +122 -96
- package/react/admin/index.js +3 -1
- package/react/admin/pageeditors/HelpSections.js +96 -0
- package/react/admin/pageeditors/index.js +1 -0
- package/react/blocks/faq/AskAQuestion.js +10 -3
- package/react/blocks/index.js +19 -0
- package/tracking/Controller.js +24 -0
- package/utils/UrlFunctions.js +45 -25
package/package.json
CHANGED
package/react/BaseObject.js
CHANGED
|
@@ -10,12 +10,17 @@ export default class BaseObject extends Component {
|
|
|
10
10
|
this._construct();
|
|
11
11
|
|
|
12
12
|
this._prepareProps();
|
|
13
|
+
this._constructAfterProps();
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
_construct() {
|
|
16
17
|
|
|
17
18
|
}
|
|
18
19
|
|
|
20
|
+
_constructAfterProps() {
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
|
|
19
24
|
_prepareProps() {
|
|
20
25
|
//console.log("_prepareProps");
|
|
21
26
|
let props = this.props;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Dbm from "../../index.js";
|
|
3
|
+
|
|
4
|
+
export default class EditObjectById extends Dbm.react.BaseObject {
|
|
5
|
+
_constructAfterProps() {
|
|
6
|
+
super._constructAfterProps();
|
|
7
|
+
|
|
8
|
+
let editorGroup = this.context.editorGroup;
|
|
9
|
+
if(!editorGroup) {
|
|
10
|
+
editorGroup = new Dbm.graphapi.webclient.admin.EditorGroup();
|
|
11
|
+
}
|
|
12
|
+
this.item.setValue("editorGroup", editorGroup);
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
|
|
16
|
+
|
|
17
|
+
let id = this.getPropValue("id");
|
|
18
|
+
console.log(id);
|
|
19
|
+
|
|
20
|
+
let allLoaded = Dbm.flow.updatefunctions.logic.allAtValue(Dbm.loading.LoadingStatus.LOADED);
|
|
21
|
+
this.item.requireProperty("loaded", false);
|
|
22
|
+
|
|
23
|
+
{
|
|
24
|
+
let request = graphApi.requestRange(
|
|
25
|
+
[
|
|
26
|
+
{"type": "includePrivate"},
|
|
27
|
+
{"type": "includeDraft"},
|
|
28
|
+
{"type": "idSelection", "ids": [id]},
|
|
29
|
+
],
|
|
30
|
+
["admin_fields", "relations"]
|
|
31
|
+
);
|
|
32
|
+
allLoaded.addCheck(request.properties.status);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
this.item.properties.loaded.connectInput(allLoaded.output.properties.value);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
_renderMainElement() {
|
|
39
|
+
|
|
40
|
+
let id = this.getPropValue("id");
|
|
41
|
+
let item = Dbm.getInstance().repository.getItem(id);
|
|
42
|
+
let itemEditor = this.item.editorGroup.getItemEditor(id);
|
|
43
|
+
|
|
44
|
+
let children = this.getPropValue("children");
|
|
45
|
+
|
|
46
|
+
return React.createElement("div", {},
|
|
47
|
+
React.createElement(Dbm.react.area.HasData, {check: this.item.properties.loaded},
|
|
48
|
+
React.createElement(Dbm.react.context.AddContextVariables, {values: {"editorGroup": this.item.editorGroup, "item": item, "itemEditor": itemEditor}},
|
|
49
|
+
children
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
}
|
package/react/admin/EditPage.js
CHANGED
|
@@ -42,6 +42,18 @@ export default class EditPage extends Dbm.react.BaseObject {
|
|
|
42
42
|
let saveData = editorGroup.getSaveData();
|
|
43
43
|
let itemSaveData = saveData.getItemSaveData(page.id);
|
|
44
44
|
|
|
45
|
+
let itemEditor = editorGroup.getItemEditor(page.id);
|
|
46
|
+
let content = itemEditor.getEditor("content").item.editValue.getValue();
|
|
47
|
+
|
|
48
|
+
let preloadImages = [];
|
|
49
|
+
|
|
50
|
+
let pageEditorItem = Dbm.getInstance().repository.getItem("admin/editor/pageEditor");
|
|
51
|
+
if(pageEditorItem.generateContentPreload) {
|
|
52
|
+
preloadImages = pageEditorItem.generateContentPreload(content);
|
|
53
|
+
}
|
|
54
|
+
debugger;
|
|
55
|
+
|
|
56
|
+
itemSaveData.setField("contentPreloadTags", preloadImages);
|
|
45
57
|
itemSaveData.setField("lastModified", (new Date()).toISOString());
|
|
46
58
|
itemSaveData.createChange("clearCache", {});
|
|
47
59
|
|
|
@@ -162,125 +174,139 @@ export default class EditPage extends Dbm.react.BaseObject {
|
|
|
162
174
|
let editorGroup = this.item.editorGroup;
|
|
163
175
|
let itemEditor = editorGroup.getItemEditor(page.id);
|
|
164
176
|
|
|
177
|
+
let admin = Dbm.getInstance().repository.getItem("admin");
|
|
178
|
+
let pageEditors = admin.requireProperty("pageEditors", []);
|
|
179
|
+
|
|
165
180
|
return React.createElement("div", {},
|
|
166
181
|
React.createElement(Dbm.react.context.AddContextVariables, {values: {"editorGroup": editorGroup, "itemEditor": itemEditor}},
|
|
167
|
-
React.createElement(
|
|
168
|
-
React.createElement("div", {},
|
|
169
|
-
React.createElement("
|
|
170
|
-
"
|
|
182
|
+
React.createElement(Dbm.react.admin.EditObjectById, {id: page.id},
|
|
183
|
+
React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
|
|
184
|
+
React.createElement("div", {},
|
|
185
|
+
React.createElement("label", {className: "standard-field-label"},
|
|
186
|
+
"Page title"
|
|
187
|
+
),
|
|
188
|
+
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"}),
|
|
171
189
|
),
|
|
172
|
-
React.createElement(
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
"
|
|
190
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
191
|
+
React.createElement("div", {},
|
|
192
|
+
React.createElement("label", {className: "standard-field-label"},
|
|
193
|
+
"Navigation name"
|
|
194
|
+
),
|
|
195
|
+
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"}),
|
|
178
196
|
),
|
|
179
|
-
React.createElement(
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
"Url"
|
|
197
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
198
|
+
React.createElement("div", {},
|
|
199
|
+
React.createElement("label", {className: "standard-field-label"},
|
|
200
|
+
"Url"
|
|
201
|
+
),
|
|
202
|
+
React.createElement(Dbm.react.form.FormField, {"value": itemEditor.getEditor("url").item.editValue.value, className: "standard-field standard-field-padding full-width", placeholder: "Url"}),
|
|
185
203
|
),
|
|
186
|
-
React.createElement(
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
"
|
|
204
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
205
|
+
React.createElement("div", {},
|
|
206
|
+
React.createElement("label", {className: "standard-field-label"},
|
|
207
|
+
"Publish date"
|
|
208
|
+
),
|
|
209
|
+
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"}),
|
|
210
|
+
),
|
|
211
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
212
|
+
React.createElement("div", {},
|
|
213
|
+
React.createElement("label", {className: "standard-field-label"},
|
|
214
|
+
"Category"
|
|
215
|
+
),
|
|
216
|
+
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"}),
|
|
192
217
|
),
|
|
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
218
|
),
|
|
195
219
|
React.createElement("div", {className: "spacing standard"}),
|
|
196
|
-
React.createElement("div", {},
|
|
220
|
+
React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
|
|
197
221
|
React.createElement("label", {className: "standard-field-label"},
|
|
198
|
-
"
|
|
222
|
+
"Seo description"
|
|
199
223
|
),
|
|
200
|
-
React.createElement(Dbm.react.form.
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
224
|
+
React.createElement(Dbm.react.form.FormField, {"value": itemEditor.getEditor("meta/description").item.editValue.value, className: "standard-field standard-field-padding full-width", placeholder: "Description"}),
|
|
225
|
+
React.createElement("div", {className: "spacing micro"}),
|
|
226
|
+
React.createElement("div", {className: "flex-row justify-between"},
|
|
227
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
228
|
+
React.createElement("div", {onClick: () => {this._generateSeoSummary()}, className: "action-button action-button-padding"}, "Generate"),
|
|
229
|
+
),
|
|
230
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
231
|
+
Dbm.react.text.text(this.item.properties.descriptionLength),
|
|
232
|
+
" / ",
|
|
233
|
+
"155"
|
|
234
|
+
)
|
|
235
|
+
),
|
|
236
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
237
|
+
React.createElement(Dbm.react.form.LabelledArea, {label: "Main image"},
|
|
238
|
+
React.createElement(Dbm.react.admin.editorsgroup.EditRelation, {"direction": "in", "relationType": "isMainImageFor", "objectType": "image"},
|
|
239
|
+
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"})
|
|
240
|
+
)
|
|
213
241
|
),
|
|
214
|
-
React.createElement("div", {className: "
|
|
215
|
-
|
|
216
|
-
"
|
|
217
|
-
|
|
242
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
243
|
+
React.createElement("div", {className: "flex-row small-item-spacing"},
|
|
244
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
245
|
+
React.createElement(Dbm.react.form.Checkbox, {checked: itemEditor.getEditor("seo/noIndex").item.editValue.value}),
|
|
246
|
+
"Noindex"
|
|
247
|
+
),
|
|
248
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
249
|
+
React.createElement(Dbm.react.form.Checkbox, {checked: itemEditor.getEditor("seo/noFollow").item.editValue.value}),
|
|
250
|
+
"Nofollow"
|
|
251
|
+
),
|
|
218
252
|
)
|
|
219
253
|
),
|
|
220
254
|
React.createElement("div", {className: "spacing standard"}),
|
|
221
|
-
React.createElement(
|
|
222
|
-
React.createElement(
|
|
223
|
-
|
|
255
|
+
React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
|
|
256
|
+
React.createElement("label", {className: "standard-field-label"},
|
|
257
|
+
"Content"
|
|
258
|
+
),
|
|
259
|
+
React.createElement("div", {},
|
|
260
|
+
React.createElement(Dbm.react.admin.editor.Editor, {"value": itemEditor.getEditor("content").item.editValue.value, "ref": this.createRef("editor")}),
|
|
224
261
|
)
|
|
225
262
|
),
|
|
226
|
-
React.createElement(
|
|
227
|
-
|
|
228
|
-
React.createElement(
|
|
229
|
-
React.createElement(
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
React.createElement(Dbm.react.form.Checkbox, {checked: itemEditor.getEditor("seo/noFollow").item.editValue.value}),
|
|
234
|
-
"Nofollow"
|
|
263
|
+
React.createElement(Dbm.react.area.HasData, {check: pageEditors},
|
|
264
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
265
|
+
React.createElement(Dbm.react.area.List, {items: pageEditors, as: "editor"},
|
|
266
|
+
React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
|
|
267
|
+
React.createElement(Dbm.react.area.InsertElement, {element: Dbm.react.source.contextVariable("editor.element")})
|
|
268
|
+
),
|
|
269
|
+
React.createElement("div", {className: "spacing standard", "data-slot": "spacing"}),
|
|
235
270
|
),
|
|
236
|
-
)
|
|
237
|
-
),
|
|
238
|
-
React.createElement("div", {className: "spacing standard"}),
|
|
239
|
-
React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
|
|
240
|
-
React.createElement("label", {className: "standard-field-label"},
|
|
241
|
-
"Content"
|
|
242
271
|
),
|
|
243
|
-
React.createElement("div", {},
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
React.createElement("div", {className: "flex-row-item"},
|
|
256
|
-
React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._export()}},
|
|
257
|
-
"Export"
|
|
272
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
273
|
+
React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
|
|
274
|
+
React.createElement("label", {className: "standard-field-label", "onClick": () => {this._toggleImportExport()}},
|
|
275
|
+
"Import/export"
|
|
276
|
+
),
|
|
277
|
+
React.createElement(Dbm.react.area.OpenCloseExpandableArea, {open: this.item.properties.importExportOpen},
|
|
278
|
+
React.createElement("div", {},
|
|
279
|
+
React.createElement("div", {className: "flex-row small-item-spacing"},
|
|
280
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
281
|
+
React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._export()}},
|
|
282
|
+
"Export"
|
|
283
|
+
)
|
|
258
284
|
)
|
|
259
|
-
)
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
285
|
+
),
|
|
286
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
287
|
+
React.createElement(Dbm.react.form.TextArea, {value: this.item.properties.importText, className: "standard-field standard-field-padding full-width"}),
|
|
288
|
+
React.createElement("div", {className: "flex-row small-item-spacing"},
|
|
289
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
290
|
+
React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._import()}},
|
|
291
|
+
"Import"
|
|
292
|
+
)
|
|
267
293
|
)
|
|
268
294
|
)
|
|
295
|
+
/*
|
|
296
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
297
|
+
React.createElement("div", {onClick: () => {this._generateHelpSectionSuggestions()}, className: "action-button action-button-padding"}, "Dev: Help sections"),
|
|
298
|
+
),
|
|
299
|
+
*/
|
|
269
300
|
)
|
|
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
301
|
)
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
302
|
+
|
|
303
|
+
),
|
|
304
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
305
|
+
React.createElement("div", {className: "save-all-position"},
|
|
306
|
+
React.createElement(Dbm.react.area.OpenCloseExpandableArea, {open: this.item.properties.changed},
|
|
307
|
+
React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._save()}},
|
|
308
|
+
"Save all changes"
|
|
309
|
+
)
|
|
284
310
|
)
|
|
285
311
|
)
|
|
286
312
|
)
|
package/react/admin/index.js
CHANGED
|
@@ -2,9 +2,11 @@ export {default as CreatePage} from "./CreatePage.js";
|
|
|
2
2
|
export {default as EditPage} from "./EditPage.js";
|
|
3
3
|
export {default as SelectImageFromLibrary} from "./SelectImageFromLibrary.js";
|
|
4
4
|
export {default as SelectedImage} from "./SelectedImage.js";
|
|
5
|
+
export {default as EditObjectById} from "./EditObjectById.js";
|
|
5
6
|
|
|
6
7
|
export * as editor from "./editor/index.js";
|
|
7
8
|
export * as pages from "./pages/index.js";
|
|
8
9
|
export * as website from "./website/index.js";
|
|
9
10
|
export * as objects from "./objects/index.js";
|
|
10
|
-
export * as editorsgroup from "./editorsgroup/index.js";
|
|
11
|
+
export * as editorsgroup from "./editorsgroup/index.js";
|
|
12
|
+
export * as pageeditors from "./pageeditors/index.js";
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Dbm from "../../../index.js";
|
|
3
|
+
|
|
4
|
+
export default class HelpSections extends Dbm.react.BaseObject {
|
|
5
|
+
_construct() {
|
|
6
|
+
super._construct();
|
|
7
|
+
|
|
8
|
+
let item = this.context.item;
|
|
9
|
+
let itemEditor = this.context.itemEditor;
|
|
10
|
+
|
|
11
|
+
{
|
|
12
|
+
let direction = "in";
|
|
13
|
+
let relationType = "for";
|
|
14
|
+
let objectType = "helpSection";
|
|
15
|
+
let relations = Dbm.utils.ArrayFunctions.filterByField(Dbm.objectPath(item, "relations/" + direction + "." + relationType + ".objects"), "objectTypes", objectType, "arrayContains");
|
|
16
|
+
let editor = itemEditor.addMultipleIncomingRelationsEditor(relationType, objectType, Dbm.utils.ArrayFunctions.mapField(relations, "id"), ["relations"]);
|
|
17
|
+
console.log(relations, editor);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
_addArrayRow(aArrayEditor) {
|
|
22
|
+
console.log("_addArrayRow");
|
|
23
|
+
|
|
24
|
+
let changes = [
|
|
25
|
+
{"type": "addOutgoingRelation", "data": {"value": this.context.item.id, "type": "for"}}
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
let request = Dbm.getInstance().repository.getItem("graphApi").controller.createItem(["helpSection"], "public", changes, ["id"]);
|
|
29
|
+
|
|
30
|
+
Dbm.flow.addUpdateCommandWhenMatched(request.properties.status, 1, Dbm.commands.callFunction(this._created.bind(this), [request, aArrayEditor]));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
_created(aRequest, aArrayEditor) {
|
|
34
|
+
console.log("_created");
|
|
35
|
+
console.log(aRequest);
|
|
36
|
+
|
|
37
|
+
aArrayEditor.push(aRequest.item.id);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
_removeArrayRow(aArrayEditor, aItem) {
|
|
41
|
+
aArrayEditor.removeItem(aItem);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
_renderMainElement() {
|
|
45
|
+
|
|
46
|
+
let direction = "in";
|
|
47
|
+
let relationType = "for";
|
|
48
|
+
let objectType = "helpSection";
|
|
49
|
+
|
|
50
|
+
return React.createElement("div", {},
|
|
51
|
+
React.createElement("h2", {}, "Faq questions"),
|
|
52
|
+
|
|
53
|
+
React.createElement(Dbm.react.form.EditArray, {"value": Dbm.react.source.contextVariable("itemEditor.item.editor_multipleRelations_" + direction + "_" + relationType + "_" + objectType + ".item.editValue.item.properties.value")},
|
|
54
|
+
React.createElement("div", {},
|
|
55
|
+
React.createElement("h3", {}, "Question ", Dbm.react.text.text(Dbm.react.source.contextVariable("item.properties.value"))),
|
|
56
|
+
React.createElement(Dbm.react.admin.EditObjectById, {id: Dbm.react.source.contextVariable("item.value")},
|
|
57
|
+
React.createElement("div", {},
|
|
58
|
+
React.createElement(Dbm.react.form.LabelledArea, {label: "Question"},
|
|
59
|
+
React.createElement(Dbm.react.admin.editorsgroup.EditField, {"fieldName": "question"},
|
|
60
|
+
React.createElement(Dbm.react.form.FormField, {value: Dbm.react.source.contextVariable("valueEditor.editValue.value"), className: "standard-field standard-field-padding full-width"})
|
|
61
|
+
)
|
|
62
|
+
),
|
|
63
|
+
React.createElement(Dbm.react.form.LabelledArea, {label: "Title"},
|
|
64
|
+
React.createElement(Dbm.react.admin.editorsgroup.EditField, {"fieldName": "title", "initialDataPath": "title"},
|
|
65
|
+
React.createElement(Dbm.react.form.FormField, {value: Dbm.react.source.contextVariable("valueEditor.editValue.value"), className: "standard-field standard-field-padding full-width"})
|
|
66
|
+
)
|
|
67
|
+
)
|
|
68
|
+
),
|
|
69
|
+
React.createElement(Dbm.react.form.LabelledArea, {label: "Description"},
|
|
70
|
+
React.createElement(Dbm.react.admin.editorsgroup.EditField, {"fieldName": "description"},
|
|
71
|
+
React.createElement(Dbm.react.form.TextArea, {value: Dbm.react.source.contextVariable("valueEditor.editValue.value"), className: "standard-field standard-field-padding full-width"})
|
|
72
|
+
)
|
|
73
|
+
),
|
|
74
|
+
React.createElement(Dbm.react.form.LabelledArea, {label: "Link text"},
|
|
75
|
+
React.createElement(Dbm.react.admin.editorsgroup.EditField, {"fieldName": "linkText"},
|
|
76
|
+
React.createElement(Dbm.react.form.FormField, {value: Dbm.react.source.contextVariable("valueEditor.editValue.value"), className: "standard-field standard-field-padding full-width"})
|
|
77
|
+
)
|
|
78
|
+
)
|
|
79
|
+
),
|
|
80
|
+
),
|
|
81
|
+
React.createElement("div", {"data-slot": "after"},
|
|
82
|
+
React.createElement("div", {"className": "spacing standard"}),
|
|
83
|
+
React.createElement(Dbm.react.interaction.CommandButton, {command: Dbm.commands.callFunction(this._addArrayRow.bind(this), [Dbm.react.source.contextVariable("arrayEditor")])},
|
|
84
|
+
React.createElement("div", {"className": "flex-row"},
|
|
85
|
+
React.createElement("div", {"className": "flex-row-item"},
|
|
86
|
+
React.createElement("div", {"className": "action-button action-button-padding"}, "Add")
|
|
87
|
+
)
|
|
88
|
+
),
|
|
89
|
+
|
|
90
|
+
)
|
|
91
|
+
)
|
|
92
|
+
),
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {default as HelpSections} from "./HelpSections.js";
|
|
@@ -117,9 +117,11 @@ export default class AskAQuestion extends Dbm.react.BaseObject {
|
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
_renderMainElement() {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
|
|
121
|
+
let askElement = null;
|
|
122
|
+
if(!this.context.blockData.skipSearch) {
|
|
123
|
+
askElement = React.createElement("div", {},
|
|
124
|
+
React.createElement("form", {
|
|
123
125
|
onSubmit: aEvent => {
|
|
124
126
|
aEvent.preventDefault();
|
|
125
127
|
this._search();
|
|
@@ -146,6 +148,11 @@ export default class AskAQuestion extends Dbm.react.BaseObject {
|
|
|
146
148
|
)
|
|
147
149
|
),
|
|
148
150
|
React.createElement("div", {className: "spacing small"}),
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return React.createElement("div", {className: "content-narrow"},
|
|
155
|
+
askElement,
|
|
149
156
|
React.createElement(Dbm.react.area.InsertElement, {element: this.item.properties.resultElement})
|
|
150
157
|
);
|
|
151
158
|
}
|
package/react/blocks/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import React from "react";
|
|
1
2
|
import Dbm from "../../index.js";
|
|
2
3
|
import {createElement} from "react";
|
|
3
4
|
|
|
@@ -219,6 +220,10 @@ export let registerAllBlocks = function() {
|
|
|
219
220
|
createElement(Dbm.react.form.LabelledArea, {label: "Initial sections"},
|
|
220
221
|
createElement(Dbm.react.admin.editor.fields.SelectObjectsField, {objectType: "helpSection", name:"initialSections", "encoding": "title", "nameField": "title"})
|
|
221
222
|
),
|
|
223
|
+
createElement(Dbm.react.form.LabelledArea, {label: "Hide ask a question"},
|
|
224
|
+
createElement(Dbm.react.admin.editor.fields.CheckboxField, {"name": "skipSearch"}),
|
|
225
|
+
"Hide"
|
|
226
|
+
),
|
|
222
227
|
);
|
|
223
228
|
registerBlock("faq/askAQuestion", "FAQ / Ask a question", createElement(Dbm.react.blocks.faq.AskAQuestion, {}), editor, {}, {});
|
|
224
229
|
}
|
|
@@ -359,4 +364,18 @@ export let registerAllBlocks = function() {
|
|
|
359
364
|
|
|
360
365
|
objectTypeEditor.editors = newArray;
|
|
361
366
|
}
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
let admin = Dbm.getInstance().repository.getItem("admin");
|
|
370
|
+
admin.requireProperty("pageEditors", []);
|
|
371
|
+
|
|
372
|
+
let pageEditors = [].concat(admin.pageEditors);
|
|
373
|
+
|
|
374
|
+
{
|
|
375
|
+
let newEditor = Dbm.getInstance().repository.getItem("admin/pageEditors/helpSections");
|
|
376
|
+
newEditor.setValue("element", React.createElement(Dbm.react.admin.pageeditors.HelpSections));
|
|
377
|
+
pageEditors.push(newEditor);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
admin.pageEditors = pageEditors;
|
|
362
381
|
}
|
package/tracking/Controller.js
CHANGED
|
@@ -212,6 +212,30 @@ export default class Controller extends Dbm.core.BaseObject {
|
|
|
212
212
|
this.trackEvent("Checkout started", data);
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
+
trackAddShipping(aProductOrProducts) {
|
|
216
|
+
let items = Dbm.utils.ArrayFunctions.singleOrArray(aProductOrProducts);
|
|
217
|
+
|
|
218
|
+
let data = {
|
|
219
|
+
currency: this.item.currency,
|
|
220
|
+
value: this._getValueFromItems(items),
|
|
221
|
+
items: items
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
this.trackEvent("Add shipping", data);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
trackAddPayment(aProductOrProducts) {
|
|
228
|
+
let items = Dbm.utils.ArrayFunctions.singleOrArray(aProductOrProducts);
|
|
229
|
+
|
|
230
|
+
let data = {
|
|
231
|
+
currency: this.item.currency,
|
|
232
|
+
value: this._getValueFromItems(items),
|
|
233
|
+
items: items
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
this.trackEvent("Add payment", data);
|
|
237
|
+
}
|
|
238
|
+
|
|
215
239
|
trackPurchase(aTransactionId, aProductOrProducts) {
|
|
216
240
|
let items = Dbm.utils.ArrayFunctions.singleOrArray(aProductOrProducts);
|
|
217
241
|
|
package/utils/UrlFunctions.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export let
|
|
1
|
+
export let createScaledImageUrlWithPixelDensity = function(aImageData, aWantedWidth, aPixelDensity, aMaxSize) {
|
|
2
2
|
if(!aImageData || !aImageData["url"]) {
|
|
3
3
|
return null;
|
|
4
4
|
}
|
|
@@ -10,10 +10,10 @@ export let createScaledImageUrl = function(aImageData, aWantedWidth) {
|
|
|
10
10
|
|
|
11
11
|
if(aImageData["resizeUrl"]) {
|
|
12
12
|
let scaleToWidth = Math.min(
|
|
13
|
-
Math.round(
|
|
13
|
+
Math.round(aPixelDensity*aWantedWidth),
|
|
14
14
|
Math.max(
|
|
15
15
|
100,
|
|
16
|
-
100*Math.round(
|
|
16
|
+
100*Math.round(aPixelDensity*aMaxSize/100)
|
|
17
17
|
)
|
|
18
18
|
);
|
|
19
19
|
|
|
@@ -30,7 +30,36 @@ export let createScaledImageUrl = function(aImageData, aWantedWidth) {
|
|
|
30
30
|
return url;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
export let
|
|
33
|
+
export let createScaledImageUrl = function(aImageData, aWantedWidth) {
|
|
34
|
+
return createScaledImageUrlWithPixelDensity(aImageData, aWantedWidth, window.devicePixelRatio, window.innerWidth);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export let getCoverScaledImageUrlWithPixelDensity = function(aUrl, aWantedWidth, aWantedHeight, aPixelDensity, aMaxSize) {
|
|
38
|
+
let scaleToWidth = Math.min(
|
|
39
|
+
Math.round(aPixelDensity*aWantedWidth),
|
|
40
|
+
Math.max(
|
|
41
|
+
100,
|
|
42
|
+
100*Math.round(aPixelDensity*aMaxSize/100)
|
|
43
|
+
)
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
let scaleToHeight = Math.round(aWantedHeight*scaleToWidth/aWantedWidth);
|
|
47
|
+
|
|
48
|
+
let scaleString = "width=" + scaleToWidth + ",height=" + scaleToHeight + ",fit=cover";
|
|
49
|
+
|
|
50
|
+
let format = "webp";
|
|
51
|
+
if(format) {
|
|
52
|
+
scaleString += ",format=" + format;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return aUrl.split("{scale}").join(scaleString);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const getCoverScaledImageUrl = function(aUrl, aWantedWidth, aWantedHeight) {
|
|
59
|
+
return getCoverScaledImageUrlWithPixelDensity(aUrl, aWantedWidth, aWantedHeight, window.devicePixelRatio, window.innerWidth);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export let createCoverScaledImageUrlWithPixelDensity = function(aImageData, aWantedWidth, aWantedHeight, aPixelDensity, aMaxSize) {
|
|
34
63
|
if(!aImageData || !aImageData["url"]) {
|
|
35
64
|
return null;
|
|
36
65
|
}
|
|
@@ -41,35 +70,22 @@ export let createCoverScaledImageUrl = function(aImageData, aWantedWidth, aWante
|
|
|
41
70
|
}
|
|
42
71
|
|
|
43
72
|
if(aImageData["resizeUrl"]) {
|
|
44
|
-
|
|
45
|
-
Math.round(window.devicePixelRatio*aWantedWidth),
|
|
46
|
-
Math.max(
|
|
47
|
-
100,
|
|
48
|
-
100*Math.round(window.devicePixelRatio*window.innerWidth/100)
|
|
49
|
-
)
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
let scaleToHeight = Math.round(aWantedHeight*scaleToWidth/aWantedWidth);
|
|
53
|
-
|
|
54
|
-
let scaleString = "width=" + scaleToWidth + ",height=" + scaleToHeight + ",fit=cover";
|
|
55
|
-
|
|
56
|
-
let format = "webp";
|
|
57
|
-
if(format) {
|
|
58
|
-
scaleString += ",format=" + format;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
url = aImageData["resizeUrl"].split("{scale}").join(scaleString);
|
|
73
|
+
url = getCoverScaledImageUrl(aImageData["resizeUrl"], aWantedWidth, aWantedHeight);
|
|
62
74
|
}
|
|
63
75
|
|
|
64
76
|
return url;
|
|
65
77
|
}
|
|
66
78
|
|
|
67
|
-
export
|
|
79
|
+
export let createCoverScaledImageUrl = function(aImageData, aWantedWidth, aWantedHeight) {
|
|
80
|
+
return createCoverScaledImageUrlWithPixelDensity(aImageData, aWantedWidth, aWantedHeight, window.devicePixelRatio, window.innerWidth);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export const getContainScaledImageUrlWithPixelDensity = function(aUrl, aWantedWidth, aWantedHeight, aPixelDensity, aMaxSize) {
|
|
68
84
|
let scaleToWidth = Math.min(
|
|
69
|
-
Math.round(
|
|
85
|
+
Math.round(aPixelDensity*aWantedWidth),
|
|
70
86
|
Math.max(
|
|
71
87
|
100,
|
|
72
|
-
100*Math.round(
|
|
88
|
+
100*Math.round(aPixelDensity*aMaxSize/100)
|
|
73
89
|
)
|
|
74
90
|
);
|
|
75
91
|
|
|
@@ -85,6 +101,10 @@ export const getContainScaledImageUrl = function(aUrl, aWantedWidth, aWantedHeig
|
|
|
85
101
|
return aUrl.split("{scale}").join(scaleString);
|
|
86
102
|
}
|
|
87
103
|
|
|
104
|
+
export const getContainScaledImageUrl = function(aUrl, aWantedWidth, aWantedHeight) {
|
|
105
|
+
return getContainScaledImageUrlWithPixelDensity(aUrl, aWantedWidth, aWantedHeight, window.devicePixelRatio, window.innerWidth);
|
|
106
|
+
}
|
|
107
|
+
|
|
88
108
|
export let createContainScaledImageUrl = function(aImageData, aWantedWidth, aWantedHeight) {
|
|
89
109
|
if(!aImageData || !aImageData["url"]) {
|
|
90
110
|
return null;
|