dbm 1.1.20 → 1.1.22
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 +121 -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,17 @@ 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
|
+
|
|
55
|
+
itemSaveData.setField("contentPreloadTags", preloadImages);
|
|
45
56
|
itemSaveData.setField("lastModified", (new Date()).toISOString());
|
|
46
57
|
itemSaveData.createChange("clearCache", {});
|
|
47
58
|
|
|
@@ -162,125 +173,139 @@ export default class EditPage extends Dbm.react.BaseObject {
|
|
|
162
173
|
let editorGroup = this.item.editorGroup;
|
|
163
174
|
let itemEditor = editorGroup.getItemEditor(page.id);
|
|
164
175
|
|
|
176
|
+
let admin = Dbm.getInstance().repository.getItem("admin");
|
|
177
|
+
let pageEditors = admin.requireProperty("pageEditors", []);
|
|
178
|
+
|
|
165
179
|
return React.createElement("div", {},
|
|
166
180
|
React.createElement(Dbm.react.context.AddContextVariables, {values: {"editorGroup": editorGroup, "itemEditor": itemEditor}},
|
|
167
|
-
React.createElement(
|
|
168
|
-
React.createElement("div", {},
|
|
169
|
-
React.createElement("
|
|
170
|
-
"
|
|
181
|
+
React.createElement(Dbm.react.admin.EditObjectById, {id: page.id},
|
|
182
|
+
React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
|
|
183
|
+
React.createElement("div", {},
|
|
184
|
+
React.createElement("label", {className: "standard-field-label"},
|
|
185
|
+
"Page title"
|
|
186
|
+
),
|
|
187
|
+
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
188
|
),
|
|
172
|
-
React.createElement(
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
"
|
|
189
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
190
|
+
React.createElement("div", {},
|
|
191
|
+
React.createElement("label", {className: "standard-field-label"},
|
|
192
|
+
"Navigation name"
|
|
193
|
+
),
|
|
194
|
+
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
195
|
),
|
|
179
|
-
React.createElement(
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
"Url"
|
|
196
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
197
|
+
React.createElement("div", {},
|
|
198
|
+
React.createElement("label", {className: "standard-field-label"},
|
|
199
|
+
"Url"
|
|
200
|
+
),
|
|
201
|
+
React.createElement(Dbm.react.form.FormField, {"value": itemEditor.getEditor("url").item.editValue.value, className: "standard-field standard-field-padding full-width", placeholder: "Url"}),
|
|
185
202
|
),
|
|
186
|
-
React.createElement(
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
"
|
|
203
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
204
|
+
React.createElement("div", {},
|
|
205
|
+
React.createElement("label", {className: "standard-field-label"},
|
|
206
|
+
"Publish date"
|
|
207
|
+
),
|
|
208
|
+
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"}),
|
|
209
|
+
),
|
|
210
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
211
|
+
React.createElement("div", {},
|
|
212
|
+
React.createElement("label", {className: "standard-field-label"},
|
|
213
|
+
"Category"
|
|
214
|
+
),
|
|
215
|
+
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
216
|
),
|
|
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
217
|
),
|
|
195
218
|
React.createElement("div", {className: "spacing standard"}),
|
|
196
|
-
React.createElement("div", {},
|
|
219
|
+
React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
|
|
197
220
|
React.createElement("label", {className: "standard-field-label"},
|
|
198
|
-
"
|
|
221
|
+
"Seo description"
|
|
199
222
|
),
|
|
200
|
-
React.createElement(Dbm.react.form.
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
223
|
+
React.createElement(Dbm.react.form.FormField, {"value": itemEditor.getEditor("meta/description").item.editValue.value, className: "standard-field standard-field-padding full-width", placeholder: "Description"}),
|
|
224
|
+
React.createElement("div", {className: "spacing micro"}),
|
|
225
|
+
React.createElement("div", {className: "flex-row justify-between"},
|
|
226
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
227
|
+
React.createElement("div", {onClick: () => {this._generateSeoSummary()}, className: "action-button action-button-padding"}, "Generate"),
|
|
228
|
+
),
|
|
229
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
230
|
+
Dbm.react.text.text(this.item.properties.descriptionLength),
|
|
231
|
+
" / ",
|
|
232
|
+
"155"
|
|
233
|
+
)
|
|
234
|
+
),
|
|
235
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
236
|
+
React.createElement(Dbm.react.form.LabelledArea, {label: "Main image"},
|
|
237
|
+
React.createElement(Dbm.react.admin.editorsgroup.EditRelation, {"direction": "in", "relationType": "isMainImageFor", "objectType": "image"},
|
|
238
|
+
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"})
|
|
239
|
+
)
|
|
213
240
|
),
|
|
214
|
-
React.createElement("div", {className: "
|
|
215
|
-
|
|
216
|
-
"
|
|
217
|
-
|
|
241
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
242
|
+
React.createElement("div", {className: "flex-row small-item-spacing"},
|
|
243
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
244
|
+
React.createElement(Dbm.react.form.Checkbox, {checked: itemEditor.getEditor("seo/noIndex").item.editValue.value}),
|
|
245
|
+
"Noindex"
|
|
246
|
+
),
|
|
247
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
248
|
+
React.createElement(Dbm.react.form.Checkbox, {checked: itemEditor.getEditor("seo/noFollow").item.editValue.value}),
|
|
249
|
+
"Nofollow"
|
|
250
|
+
),
|
|
218
251
|
)
|
|
219
252
|
),
|
|
220
253
|
React.createElement("div", {className: "spacing standard"}),
|
|
221
|
-
React.createElement(
|
|
222
|
-
React.createElement(
|
|
223
|
-
|
|
254
|
+
React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
|
|
255
|
+
React.createElement("label", {className: "standard-field-label"},
|
|
256
|
+
"Content"
|
|
257
|
+
),
|
|
258
|
+
React.createElement("div", {},
|
|
259
|
+
React.createElement(Dbm.react.admin.editor.Editor, {"value": itemEditor.getEditor("content").item.editValue.value, "ref": this.createRef("editor")}),
|
|
224
260
|
)
|
|
225
261
|
),
|
|
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"
|
|
262
|
+
React.createElement(Dbm.react.area.HasData, {check: pageEditors},
|
|
263
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
264
|
+
React.createElement(Dbm.react.area.List, {items: pageEditors, as: "editor"},
|
|
265
|
+
React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
|
|
266
|
+
React.createElement(Dbm.react.area.InsertElement, {element: Dbm.react.source.contextVariable("editor.element")})
|
|
267
|
+
),
|
|
268
|
+
React.createElement("div", {className: "spacing standard", "data-slot": "spacing"}),
|
|
235
269
|
),
|
|
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
270
|
),
|
|
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"
|
|
271
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
272
|
+
React.createElement("div", {"className": "dbm-admin-box dbm-admin-box-padding"},
|
|
273
|
+
React.createElement("label", {className: "standard-field-label", "onClick": () => {this._toggleImportExport()}},
|
|
274
|
+
"Import/export"
|
|
275
|
+
),
|
|
276
|
+
React.createElement(Dbm.react.area.OpenCloseExpandableArea, {open: this.item.properties.importExportOpen},
|
|
277
|
+
React.createElement("div", {},
|
|
278
|
+
React.createElement("div", {className: "flex-row small-item-spacing"},
|
|
279
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
280
|
+
React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._export()}},
|
|
281
|
+
"Export"
|
|
282
|
+
)
|
|
258
283
|
)
|
|
259
|
-
)
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
284
|
+
),
|
|
285
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
286
|
+
React.createElement(Dbm.react.form.TextArea, {value: this.item.properties.importText, className: "standard-field standard-field-padding full-width"}),
|
|
287
|
+
React.createElement("div", {className: "flex-row small-item-spacing"},
|
|
288
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
289
|
+
React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._import()}},
|
|
290
|
+
"Import"
|
|
291
|
+
)
|
|
267
292
|
)
|
|
268
293
|
)
|
|
294
|
+
/*
|
|
295
|
+
React.createElement("div", {className: "flex-row-item"},
|
|
296
|
+
React.createElement("div", {onClick: () => {this._generateHelpSectionSuggestions()}, className: "action-button action-button-padding"}, "Dev: Help sections"),
|
|
297
|
+
),
|
|
298
|
+
*/
|
|
269
299
|
)
|
|
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
300
|
)
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
301
|
+
|
|
302
|
+
),
|
|
303
|
+
React.createElement("div", {className: "spacing standard"}),
|
|
304
|
+
React.createElement("div", {className: "save-all-position"},
|
|
305
|
+
React.createElement(Dbm.react.area.OpenCloseExpandableArea, {open: this.item.properties.changed},
|
|
306
|
+
React.createElement("div", {"className": "standard-button standard-button-padding", "onClick": () => {this._save()}},
|
|
307
|
+
"Save all changes"
|
|
308
|
+
)
|
|
284
309
|
)
|
|
285
310
|
)
|
|
286
311
|
)
|
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;
|