dbm 1.1.23 → 1.2.1
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/core/source/FirstSource.js +36 -0
- package/core/source/index.js +21 -0
- package/dbm.js +16 -5
- package/flow/controllers/index.js +2 -1
- package/flow/controllers/timing/IntervalStep.js +60 -0
- package/flow/controllers/timing/index.js +1 -0
- package/flow/updatefunctions/animation/AnimateValue.js +39 -0
- package/flow/updatefunctions/animation/index.js +13 -0
- package/flow/updatefunctions/dom/ElementPosition.js +2 -4
- package/flow/updatefunctions/index.js +1 -0
- package/flow/updatefunctions/logic/FloatMod.js +26 -0
- package/flow/updatefunctions/logic/PositionedItems.js +1 -1
- package/flow/updatefunctions/logic/index.js +18 -0
- package/flow/updatefunctions/thirdparty/google/index.js +3 -0
- package/flow/updatefunctions/thirdparty/google/maps/AutoComplete.js +132 -0
- package/flow/updatefunctions/thirdparty/google/maps/index.js +3 -0
- package/flow/updatefunctions/thirdparty/index.js +2 -1
- package/graphapi/webclient/ApiConnection.js +1 -0
- package/graphapi/webclient/decode/index.js +16 -0
- package/package.json +1 -1
- package/react/admin/EditPage.js +2 -0
- package/react/admin/objects/EditObject.js +3 -0
- package/react/admin/pageeditors/LinkPreviews.js +98 -0
- package/react/admin/pageeditors/index.js +1 -0
- package/react/area/FixedWidthInfiniteSlideshow.js +50 -0
- package/react/area/List.js +4 -0
- package/react/area/index.js +1 -0
- package/react/blocks/content/LinkList.js +67 -0
- package/react/blocks/content/LinkListCard.js +83 -0
- package/react/blocks/content/index.js +3 -1
- package/react/blocks/index.js +22 -0
- package/react/form/Form.js +49 -0
- package/react/form/Option.js +18 -0
- package/react/form/index.js +3 -1
- package/react/image/CoverScaledImage.js +20 -1
- package/react/interaction/CommandButton.js +16 -3
- package/react/text/HtmlText.js +6 -1
- package/react/text/NumberDisplay.js +30 -0
- package/react/text/OptionalLink.js +21 -0
- package/react/text/index.js +2 -0
- package/utils/ArrayFunctions.js +16 -0
- package/utils/CompareFunctions.js +14 -0
- package/utils/UrlFunctions.js +22 -5
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Dbm from "../../index.js";
|
|
3
|
+
|
|
4
|
+
export default class FixedWidthInfiniteSlideshow extends Dbm.react.BaseObject {
|
|
5
|
+
_construct() {
|
|
6
|
+
super._construct();
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
_renderMainElement() {
|
|
12
|
+
//console.log("FixedWidthInfiniteSlideshow::render");
|
|
13
|
+
//console.log(this);
|
|
14
|
+
|
|
15
|
+
let viewWidth = this.getPropValueWithDefault("viewWidth", 1000);
|
|
16
|
+
let prepLength = this.getPropValueWithDefault("prepareLength", 20);
|
|
17
|
+
let elementWidth = this.getPropValueWithDefault("elementWidth", 200);
|
|
18
|
+
let spacing = this.getPropValueWithDefault("spacing", 0);
|
|
19
|
+
|
|
20
|
+
let index = this.getPropValue("index");
|
|
21
|
+
|
|
22
|
+
let elements = this.getPropValue("children");;
|
|
23
|
+
|
|
24
|
+
let numberOfElements = elements.length;
|
|
25
|
+
|
|
26
|
+
let stepLength = elementWidth+spacing;
|
|
27
|
+
let movedLength = index*stepLength;
|
|
28
|
+
|
|
29
|
+
let startPosition = movedLength-prepLength;
|
|
30
|
+
let startIndex = Math.floor(startPosition/stepLength);
|
|
31
|
+
|
|
32
|
+
let endPosition = (startPosition + viewWidth + 2*prepLength);
|
|
33
|
+
let endIndex = Math.floor(endPosition/stepLength);
|
|
34
|
+
|
|
35
|
+
let children = [];
|
|
36
|
+
for(let i = startIndex; i <= endIndex; i++) {
|
|
37
|
+
let currentPosition = i*stepLength-movedLength;
|
|
38
|
+
let elementIndex = Dbm.utils.NumberFunctions.floatMod(i, numberOfElements);
|
|
39
|
+
|
|
40
|
+
//METODO: send in styles instead of forcing full size
|
|
41
|
+
let style = {"transform": "translateX(" + currentPosition + "px)", position: "absolute", left: 0, top: 0};
|
|
42
|
+
let child = React.createElement("div", {"key": i, "className": "full-size", "style": style}, elements[elementIndex])
|
|
43
|
+
children.push(child);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return this._createMainElement("div", {},
|
|
47
|
+
children
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
}
|
package/react/area/List.js
CHANGED
|
@@ -43,9 +43,13 @@ export default class List extends Dbm.react.BaseObject {
|
|
|
43
43
|
if(keyField !== "(root)") {
|
|
44
44
|
key = Dbm.objectPath(currentItem, keyField);
|
|
45
45
|
}
|
|
46
|
+
else if(keyField !== "(index)") {
|
|
47
|
+
key = i;
|
|
48
|
+
}
|
|
46
49
|
|
|
47
50
|
let values = {};
|
|
48
51
|
values[as] = currentItem;
|
|
52
|
+
values[as + "/index"] = i;
|
|
49
53
|
newChildren.push(React.createElement(Dbm.react.context.AddContextVariables, {key: key, values: values}, mainChildren));
|
|
50
54
|
}
|
|
51
55
|
|
package/react/area/index.js
CHANGED
|
@@ -7,6 +7,7 @@ export {default as ScrollActivatedArea} from "./ScrollActivatedArea.js";
|
|
|
7
7
|
export {default as OpenCloseExpandableArea} from "./OpenCloseExpandableArea.js";
|
|
8
8
|
export {default as ResponsiveLayout} from "./ResponsiveLayout.js";
|
|
9
9
|
export {default as List} from "./List.js";
|
|
10
|
+
export {default as FixedWidthInfiniteSlideshow} from "./FixedWidthInfiniteSlideshow.js";
|
|
10
11
|
|
|
11
12
|
export const responsiveLayout = function(aDefaultLayout) {
|
|
12
13
|
let newResponsiveLayout = new Dbm.react.area.ResponsiveLayout();
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Dbm from "../../../index.js";
|
|
3
|
+
|
|
4
|
+
export default class LinkList extends Dbm.react.BaseObject {
|
|
5
|
+
_construct() {
|
|
6
|
+
super._construct();
|
|
7
|
+
|
|
8
|
+
let listId = this.context.blockData.list;
|
|
9
|
+
|
|
10
|
+
this.item.requireProperty("loaded", false);
|
|
11
|
+
this.item.requireProperty("items", []);
|
|
12
|
+
|
|
13
|
+
let graphApi = Dbm.getInstance().repository.getItem("cachedGraphApi").controller;
|
|
14
|
+
{
|
|
15
|
+
let request = graphApi.requestRange(
|
|
16
|
+
[
|
|
17
|
+
{type: "objectRelationQuery", "path": "in:in:linkPreview", "fromIds": [listId]}
|
|
18
|
+
],
|
|
19
|
+
["linkPreview"]
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
this.item.requireProperty("loadedStatus", 0);
|
|
23
|
+
Dbm.flow.addUpdateCommandWhenMatched(this.item.properties.loadedStatus, Dbm.loading.LoadingStatus.LOADED, Dbm.commands.callFunction(this._loaded.bind(this), [request]));
|
|
24
|
+
this.item.properties.loadedStatus.connectInput(request.properties.status);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
_loaded(aRequest) {
|
|
29
|
+
console.log("LinkList::_loaded");
|
|
30
|
+
console.log(aRequest);
|
|
31
|
+
|
|
32
|
+
let items = aRequest.items;
|
|
33
|
+
|
|
34
|
+
let today = (new Date()).toISOString().split("T")[0];
|
|
35
|
+
items = Dbm.utils.ArrayFunctions.filterByField(items, "page", null, function(aItem) {
|
|
36
|
+
if(aItem && aItem.publishDate) {
|
|
37
|
+
if(aItem.publishDate > today) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return false;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
Dbm.utils.ArrayFunctions.sortOnField(items, "page.publishDate");
|
|
47
|
+
items.reverse();
|
|
48
|
+
|
|
49
|
+
this.item.items = items;
|
|
50
|
+
this.item.loaded = true;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
_renderMainElement() {
|
|
54
|
+
|
|
55
|
+
let element = Dbm.getInstance().repository.getItem("linkListCard").element;
|
|
56
|
+
|
|
57
|
+
return React.createElement("div", {"className": "content-narrow"},
|
|
58
|
+
React.createElement(Dbm.react.area.HasData, {check: this.item.properties.loaded},
|
|
59
|
+
React.createElement(Dbm.react.area.List, {items: this.item.properties.items},
|
|
60
|
+
element,
|
|
61
|
+
React.createElement("div", {"data-slot": "spacing", "className": "spacing small"})
|
|
62
|
+
)
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Dbm from "../../../index.js";
|
|
3
|
+
|
|
4
|
+
export default class LinkListCard extends Dbm.react.BaseObject {
|
|
5
|
+
_construct() {
|
|
6
|
+
super._construct();
|
|
7
|
+
|
|
8
|
+
let mobileLayout = React.createElement(Dbm.react.text.Link, {"href": Dbm.core.source.first(Dbm.react.source.contextVariable("item.link"), Dbm.react.source.contextVariable("item.page.url")), "className": "custom-styled-link"},
|
|
9
|
+
React.createElement("div", {"className": "standard-card standard-card-padding"},
|
|
10
|
+
React.createElement(Dbm.react.image.WidthScaledImage, {image: Dbm.core.source.first(Dbm.react.source.contextVariable("item.image"), Dbm.react.source.contextVariable("item.page.image")), targetWidth: 300, className: "card-image-mobile background-cover"}),
|
|
11
|
+
React.createElement("div", {"className": "spacing small"}),
|
|
12
|
+
React.createElement("div", {},
|
|
13
|
+
React.createElement("h3", {"className": "no-margins"},
|
|
14
|
+
Dbm.react.text.text(Dbm.core.source.first(Dbm.react.source.contextVariable("item.title"), Dbm.react.source.contextVariable("item.page.title")))
|
|
15
|
+
),
|
|
16
|
+
React.createElement("div", {"className": "body-text"},
|
|
17
|
+
Dbm.react.text.htmlText(Dbm.react.source.contextVariable("item.description")),
|
|
18
|
+
),
|
|
19
|
+
React.createElement("div", {"className": "flex-row justify-between"},
|
|
20
|
+
React.createElement("div", {"className": "flex-row-item"}),
|
|
21
|
+
React.createElement("div", {"className": "flex-row-item standard-card-read-more-link"},
|
|
22
|
+
React.createElement("div", {className: "flex-row micro-item-spacing vertically-center-items"},
|
|
23
|
+
React.createElement("div", {className: "flex-row-item flex-resize"},
|
|
24
|
+
Dbm.react.text.text(Dbm.react.source.blockData("buttonText"))
|
|
25
|
+
),
|
|
26
|
+
React.createElement("div", {className: "flex-row-item flex-no-resize"},
|
|
27
|
+
React.createElement(Dbm.react.image.Image, {src: "/assets/img/read-more-right-arrow.svg", className: "right-arrow-read-more-link-icon background-contain"})
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
)
|
|
31
|
+
)
|
|
32
|
+
)
|
|
33
|
+
)
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
let desktopLayout = React.createElement(Dbm.react.text.Link, {"href": Dbm.core.source.first(Dbm.react.source.contextVariable("item.link"), Dbm.react.source.contextVariable("item.page.url")), "className": "custom-styled-link"},
|
|
37
|
+
React.createElement("div", {"className": "standard-card standard-card-padding"},
|
|
38
|
+
React.createElement("div", {"className": "flex-row small-item-spacing"},
|
|
39
|
+
React.createElement("div", {"className": "flex-row-item flex-no-resize"},
|
|
40
|
+
React.createElement(Dbm.react.image.WidthScaledImage, {image: Dbm.core.source.first(Dbm.react.source.contextVariable("item.image"), Dbm.react.source.contextVariable("item.page.image")), targetWidth: 200, className: "card-image-desktop background-cover"})
|
|
41
|
+
),
|
|
42
|
+
React.createElement("div", {"className": "flex-row-item flex-resize"},
|
|
43
|
+
React.createElement("h3", {"className": "no-margins"},
|
|
44
|
+
Dbm.react.text.text(Dbm.core.source.first(Dbm.react.source.contextVariable("item.title"), Dbm.react.source.contextVariable("item.page.title")))
|
|
45
|
+
),
|
|
46
|
+
React.createElement("div", {"className": "spacing small"}),
|
|
47
|
+
React.createElement("div", {"className": "body-text"},
|
|
48
|
+
Dbm.react.text.htmlText(Dbm.react.source.contextVariable("item.description")),
|
|
49
|
+
),
|
|
50
|
+
|
|
51
|
+
React.createElement("div", {"className": "spacing small"}),
|
|
52
|
+
React.createElement("div", {"className": "flex-row justify-between"},
|
|
53
|
+
React.createElement("div", {"className": "flex-row-item"}),
|
|
54
|
+
React.createElement("div", {"className": "flex-row-item standard-card-read-more-link"},
|
|
55
|
+
React.createElement("div", {className: "flex-row micro-item-spacing vertically-center-items"},
|
|
56
|
+
React.createElement("div", {className: "flex-row-item flex-resize"},
|
|
57
|
+
Dbm.react.text.text(Dbm.core.source.firstWithDefault(Dbm.react.source.contextVariable("item.linkText"), "Read more"))
|
|
58
|
+
),
|
|
59
|
+
React.createElement("div", {className: "flex-row-item flex-no-resize"},
|
|
60
|
+
React.createElement(Dbm.react.image.Image, {src: "/assets/img/read-more-right-arrow.svg", className: "right-arrow-read-more-link-icon background-contain"})
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
)
|
|
64
|
+
)
|
|
65
|
+
)
|
|
66
|
+
)
|
|
67
|
+
)
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
this.responsiveLayout = Dbm.react.area.responsiveLayout(mobileLayout).addLayout(desktopLayout, 600);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
_renderMainElement() {
|
|
78
|
+
|
|
79
|
+
return React.createElement("div", {}, React.createElement("div", {
|
|
80
|
+
ref: this.createRef("mainElement")
|
|
81
|
+
}, this.responsiveLayout.mainElement));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export {default as Card} from "./Card.js";
|
|
2
2
|
export {default as ContentBlock} from "./ContentBlock.js";
|
|
3
|
-
export {default as AnchorPosition} from "./AnchorPosition.js";
|
|
3
|
+
export {default as AnchorPosition} from "./AnchorPosition.js";
|
|
4
|
+
export {default as LinkList} from "./LinkList.js";
|
|
5
|
+
export {default as LinkListCard} from "./LinkListCard.js";
|
package/react/blocks/index.js
CHANGED
|
@@ -215,6 +215,15 @@ export let registerAllBlocks = function() {
|
|
|
215
215
|
registerBlock("content/contentBlock", "Content block", createElement(Dbm.react.blocks.content.ContentBlock, {}), editor, {}, {});
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
+
{
|
|
219
|
+
let editor = createElement(Dbm.react.admin.editor.EditorBlockName, {},
|
|
220
|
+
createElement(Dbm.react.form.LabelledArea, {label: "Link list"},
|
|
221
|
+
createElement(Dbm.react.admin.editor.fields.SelectObjectField, {name: "list", "objectType": "linkList"})
|
|
222
|
+
)
|
|
223
|
+
);
|
|
224
|
+
registerBlock("content/linkList", "Link list", createElement(Dbm.react.blocks.content.LinkList, {}), editor, {}, {});
|
|
225
|
+
}
|
|
226
|
+
|
|
218
227
|
{
|
|
219
228
|
let editor = createElement(Dbm.react.admin.editor.EditorBlockName, {},
|
|
220
229
|
createElement(Dbm.react.form.LabelledArea, {label: "Link name"},
|
|
@@ -380,11 +389,24 @@ export let registerAllBlocks = function() {
|
|
|
380
389
|
|
|
381
390
|
let pageEditors = [].concat(admin.pageEditors);
|
|
382
391
|
|
|
392
|
+
{
|
|
393
|
+
let newEditor = Dbm.getInstance().repository.getItem("admin/pageEditors/linkPreviews");
|
|
394
|
+
newEditor.setValue("element", React.createElement(Dbm.react.admin.pageeditors.LinkPreviews));
|
|
395
|
+
pageEditors.push(newEditor);
|
|
396
|
+
}
|
|
397
|
+
|
|
383
398
|
{
|
|
384
399
|
let newEditor = Dbm.getInstance().repository.getItem("admin/pageEditors/helpSections");
|
|
385
400
|
newEditor.setValue("element", React.createElement(Dbm.react.admin.pageeditors.HelpSections));
|
|
386
401
|
pageEditors.push(newEditor);
|
|
387
402
|
}
|
|
388
403
|
|
|
404
|
+
|
|
405
|
+
|
|
389
406
|
admin.pageEditors = pageEditors;
|
|
407
|
+
|
|
408
|
+
{
|
|
409
|
+
let elementItem = Dbm.getRepositoryItem("linkListCard");
|
|
410
|
+
elementItem.setValue("element", React.createElement(Dbm.react.blocks.content.LinkListCard));
|
|
411
|
+
}
|
|
390
412
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Dbm from "../../index.js";
|
|
3
|
+
|
|
4
|
+
export default class Form extends Dbm.react.BaseObject {
|
|
5
|
+
_construct() {
|
|
6
|
+
super._construct();
|
|
7
|
+
|
|
8
|
+
this._callback_submitBound = this._callback_submit.bind(this);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
_callback_submit(aEvent) {
|
|
12
|
+
//console.log("_callback_submit");
|
|
13
|
+
//console.log(aEvent);
|
|
14
|
+
|
|
15
|
+
let preventSubmit = this.getPropValue("preventSubmit");
|
|
16
|
+
if(preventSubmit) {
|
|
17
|
+
aEvent.preventDefault();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let commands = this.getPropValue("commands");
|
|
21
|
+
if(!commands) {
|
|
22
|
+
commands = this.getPropValue("command");
|
|
23
|
+
}
|
|
24
|
+
if(commands) {
|
|
25
|
+
aEvent.preventDefault();
|
|
26
|
+
commands = Dbm.utils.ArrayFunctions.singleOrArray(commands);
|
|
27
|
+
|
|
28
|
+
let currentArray = commands;
|
|
29
|
+
let currentArrayLength = currentArray.length;
|
|
30
|
+
for(let i = 0; i < currentArrayLength; i++) {
|
|
31
|
+
let command = currentArray[i];
|
|
32
|
+
command.perform(this, aEvent);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else{
|
|
36
|
+
return !preventSubmit;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
_renderMainElement() {
|
|
43
|
+
|
|
44
|
+
let children = this.getPropValue("children");
|
|
45
|
+
|
|
46
|
+
return this._createMainElement("form", {onSubmit: this._callback_submitBound}, children);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Dbm from "../../index.js";
|
|
3
|
+
|
|
4
|
+
export default class Option extends Dbm.react.BaseObject {
|
|
5
|
+
_construct() {
|
|
6
|
+
super._construct();
|
|
7
|
+
|
|
8
|
+
this.getDynamicProp("value", "");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
_renderMainElement() {
|
|
12
|
+
|
|
13
|
+
let value = this.getDynamicProp("value").value;
|
|
14
|
+
|
|
15
|
+
return this._createMainElement("option", {"value": value,}, this.getPropValue("children"));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
package/react/form/index.js
CHANGED
|
@@ -8,4 +8,6 @@ export {default as GraphApiSelectOrCreateObject} from "./GraphApiSelectOrCreateO
|
|
|
8
8
|
export {default as GraphApiImage} from "./GraphApiImage.js";
|
|
9
9
|
export {default as EditArray} from "./EditArray.js";
|
|
10
10
|
export {default as TextArea} from "./TextArea.js";
|
|
11
|
-
export {default as EditObjectProperty} from "./EditObjectProperty.js";
|
|
11
|
+
export {default as EditObjectProperty} from "./EditObjectProperty.js";
|
|
12
|
+
export {default as Form} from "./Form.js";
|
|
13
|
+
export {default as Option} from "./Option.js";
|
|
@@ -10,6 +10,7 @@ export default class CoverScaledImage extends Dbm.react.BaseObject {
|
|
|
10
10
|
delete aProps["image"];
|
|
11
11
|
delete aProps["targetWidth"];
|
|
12
12
|
delete aProps["targetHeight"];
|
|
13
|
+
delete aProps["skipWindowSize"];
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
_renderMainElement() {
|
|
@@ -17,7 +18,15 @@ export default class CoverScaledImage extends Dbm.react.BaseObject {
|
|
|
17
18
|
let image = this.getPropValue("image");
|
|
18
19
|
let width = this.getPropValue("targetWidth");
|
|
19
20
|
let height = this.getPropValue("targetHeight");
|
|
20
|
-
let url
|
|
21
|
+
let url;
|
|
22
|
+
|
|
23
|
+
if(this.getPropValue("skipWindowSize")) {
|
|
24
|
+
url = Dbm.utils.UrlFunctions.createCoverScaledImageUrlWithPixelDensity(image, width, height, Math.floor(window.devicePixelRatio), 10000);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
url = Dbm.utils.UrlFunctions.createCoverScaledImageUrl(image, width, height);
|
|
28
|
+
}
|
|
29
|
+
|
|
21
30
|
|
|
22
31
|
let newProps = this._copyProps({src: url});
|
|
23
32
|
|
|
@@ -29,6 +38,16 @@ export default class CoverScaledImage extends Dbm.react.BaseObject {
|
|
|
29
38
|
let elementType = this.getPropValue("elementType");
|
|
30
39
|
if(elementType) {
|
|
31
40
|
newProps["elementType"] = elementType;
|
|
41
|
+
|
|
42
|
+
if(elementType === "img" && Dbm.utils.UrlFunctions.imageShouldScale(image)) {
|
|
43
|
+
|
|
44
|
+
let images = [];
|
|
45
|
+
images.push(Dbm.utils.UrlFunctions.createCoverScaledImageUrlWithPixelDensity(image, width, height, 1, 10000) + " 1x");
|
|
46
|
+
images.push(Dbm.utils.UrlFunctions.createCoverScaledImageUrlWithPixelDensity(image, width, height, 2, 10000) + " 2x");
|
|
47
|
+
images.push(Dbm.utils.UrlFunctions.createCoverScaledImageUrlWithPixelDensity(image, width, height, 3, 10000) + " 3x");
|
|
48
|
+
|
|
49
|
+
newProps["srcset"] = images.join(", ");
|
|
50
|
+
}
|
|
32
51
|
}
|
|
33
52
|
|
|
34
53
|
return React.createElement(Dbm.react.image.Image, newProps, this.getPropValue("children"));
|
|
@@ -12,10 +12,23 @@ export default class CommandButton extends Dbm.react.BaseObject {
|
|
|
12
12
|
//console.log("_callback_click");
|
|
13
13
|
//console.log(aEvent);
|
|
14
14
|
|
|
15
|
-
let
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
let commands = this.getPropValue("commands");
|
|
16
|
+
if(!commands) {
|
|
17
|
+
commands = this.getPropValue("command");
|
|
18
|
+
}
|
|
19
|
+
if(commands) {
|
|
20
|
+
commands = Dbm.utils.ArrayFunctions.singleOrArray(commands);
|
|
18
21
|
|
|
22
|
+
let currentArray = commands;
|
|
23
|
+
let currentArrayLength = currentArray.length;
|
|
24
|
+
for(let i = 0; i < currentArrayLength; i++) {
|
|
25
|
+
let command = currentArray[i];
|
|
26
|
+
command.perform(this, aEvent);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else{
|
|
30
|
+
console.warn("Button doesn't have any commands", this);
|
|
31
|
+
}
|
|
19
32
|
}
|
|
20
33
|
|
|
21
34
|
_performClone(aChild, aProps) {
|
package/react/text/HtmlText.js
CHANGED
|
@@ -7,7 +7,12 @@ export default class HtmlText extends Dbm.react.BaseObject {
|
|
|
7
7
|
|
|
8
8
|
_renderMainElement() {
|
|
9
9
|
|
|
10
|
-
let
|
|
10
|
+
let rawText = this.getPropValue("text");;
|
|
11
|
+
let text = "";
|
|
12
|
+
|
|
13
|
+
if(rawText !== undefined && rawText !== null) {
|
|
14
|
+
text += rawText;
|
|
15
|
+
}
|
|
11
16
|
|
|
12
17
|
return this._createMainElement("span", {"dangerouslySetInnerHTML": {__html: text}});;
|
|
13
18
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import Dbm from "../../index.js";
|
|
2
|
+
|
|
3
|
+
export default class NumberDisplay extends Dbm.react.BaseObject {
|
|
4
|
+
_construct() {
|
|
5
|
+
super._construct();
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
render() {
|
|
9
|
+
let text = this.getPropValue("number");
|
|
10
|
+
let number = 1*text;
|
|
11
|
+
|
|
12
|
+
if(!isNaN(number)) {
|
|
13
|
+
|
|
14
|
+
let offset = this.getPropValueWithDefault("offset", 0);
|
|
15
|
+
if(offset) {
|
|
16
|
+
number += offset;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
if("numberOfDecimals" in this.props) {
|
|
21
|
+
text = number.toFixed(this.getPropValue("numberOfDecimals"));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
text = "" + number;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return text;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import Dbm from "../../index.js";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
export default class OptionalLink extends Dbm.react.BaseObject {
|
|
5
|
+
_construct() {
|
|
6
|
+
super._construct();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
_renderMainElement() {
|
|
10
|
+
|
|
11
|
+
let url = this.getPropValue("href");
|
|
12
|
+
let children = this.getPropValue("children");
|
|
13
|
+
if(url) {
|
|
14
|
+
return this._createMainElement(Dbm.react.text.Link, {href: url}, children);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
return React.createElement(React.Fragment, {}, children);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
}
|
|
21
|
+
}
|
package/react/text/index.js
CHANGED
|
@@ -4,6 +4,8 @@ import {createElement} from "react";
|
|
|
4
4
|
export {default as Text} from "./Text.js";
|
|
5
5
|
export {default as HtmlText} from "./HtmlText.js";
|
|
6
6
|
export {default as Link} from "./Link.js";
|
|
7
|
+
export {default as OptionalLink} from "./OptionalLink.js";
|
|
8
|
+
export {default as NumberDisplay} from "./NumberDisplay.js";
|
|
7
9
|
|
|
8
10
|
export let text = function(aText) {
|
|
9
11
|
if(typeof(aText) === "string") {
|
package/utils/ArrayFunctions.js
CHANGED
|
@@ -292,6 +292,22 @@ export const getItemIndexByIfExists = function(aArray, aField, aIdentifier) {
|
|
|
292
292
|
return -1;
|
|
293
293
|
}
|
|
294
294
|
|
|
295
|
+
export const getItemByIfExists = function(aArray, aField, aIdentifier) {
|
|
296
|
+
let index = getItemIndexByIfExists(aArray, aField, aIdentifier);
|
|
297
|
+
|
|
298
|
+
return (index !== -1) ? aArray[index] : null;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export const getItemBy = function(aArray, aField, aIdentifier) {
|
|
302
|
+
let index = getItemIndexByIfExists(aArray, aField, aIdentifier);
|
|
303
|
+
|
|
304
|
+
if(index === -1) {
|
|
305
|
+
console.warn("No item found", aArray, aField, aIdentifier);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return (index !== -1) ? aArray[index] : null;
|
|
309
|
+
}
|
|
310
|
+
|
|
295
311
|
export const sum = function(aArray) {
|
|
296
312
|
|
|
297
313
|
if(!Array.isArray(aArray)) {
|
|
@@ -15,6 +15,14 @@ export const strictEquals = function(aA, aB) {
|
|
|
15
15
|
return aA === aB;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
export const notEquals = function(aA, aB) {
|
|
19
|
+
return aA != aB;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const strictNotEquals = function(aA, aB) {
|
|
23
|
+
return aA !== aB;
|
|
24
|
+
}
|
|
25
|
+
|
|
18
26
|
export const arrayContains = function(aA, aB) {
|
|
19
27
|
if(aA && aA.indexOf && aA.indexOf(aB) >= 0) {
|
|
20
28
|
return true
|
|
@@ -40,6 +48,12 @@ export const fullSetup = function() {
|
|
|
40
48
|
Dbm.getInstance().repository.getItem("compareFunctions/===").setValue("compare", strictEquals);
|
|
41
49
|
Dbm.getInstance().repository.getItem("compareFunctions/strictEquals").setValue("compare", strictEquals);
|
|
42
50
|
|
|
51
|
+
Dbm.getInstance().repository.getItem("compareFunctions/!=").setValue("compare", notEquals);
|
|
52
|
+
Dbm.getInstance().repository.getItem("compareFunctions/notEquals").setValue("compare", notEquals);
|
|
53
|
+
|
|
54
|
+
Dbm.getInstance().repository.getItem("compareFunctions/!==").setValue("compare", strictNotEquals);
|
|
55
|
+
Dbm.getInstance().repository.getItem("compareFunctions/strictNotEquals").setValue("compare", strictNotEquals);
|
|
56
|
+
|
|
43
57
|
Dbm.getInstance().repository.getItem("compareFunctions/arrayContains").setValue("compare", arrayContains);
|
|
44
58
|
Dbm.getInstance().repository.getItem("compareFunctions/inArray").setValue("compare", inArray);
|
|
45
59
|
}
|
package/utils/UrlFunctions.js
CHANGED
|
@@ -31,7 +31,7 @@ export let createScaledImageUrlWithPixelDensity = function(aImageData, aWantedWi
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export let createScaledImageUrl = function(aImageData, aWantedWidth) {
|
|
34
|
-
return createScaledImageUrlWithPixelDensity(aImageData, aWantedWidth, window.devicePixelRatio, window.innerWidth);
|
|
34
|
+
return createScaledImageUrlWithPixelDensity(aImageData, aWantedWidth, Math.floor(window.devicePixelRatio), window.innerWidth);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
export let getCoverScaledImageUrlWithPixelDensity = function(aUrl, aWantedWidth, aWantedHeight, aPixelDensity, aMaxSize) {
|
|
@@ -56,7 +56,24 @@ export let getCoverScaledImageUrlWithPixelDensity = function(aUrl, aWantedWidth,
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
export const getCoverScaledImageUrl = function(aUrl, aWantedWidth, aWantedHeight) {
|
|
59
|
-
return getCoverScaledImageUrlWithPixelDensity(aUrl, aWantedWidth, aWantedHeight, window.devicePixelRatio, window.innerWidth);
|
|
59
|
+
return getCoverScaledImageUrlWithPixelDensity(aUrl, aWantedWidth, aWantedHeight, Math.floor(window.devicePixelRatio), window.innerWidth);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export const imageShouldScale = function(aImageData) {
|
|
63
|
+
if(!aImageData || !aImageData["url"]) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
let url = aImageData["url"];
|
|
68
|
+
if(url.substring(url.length-4).toLowerCase() === ".svg") {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if(!aImageData["resizeUrl"]) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return true;
|
|
60
77
|
}
|
|
61
78
|
|
|
62
79
|
export let createCoverScaledImageUrlWithPixelDensity = function(aImageData, aWantedWidth, aWantedHeight, aPixelDensity, aMaxSize) {
|
|
@@ -70,14 +87,14 @@ export let createCoverScaledImageUrlWithPixelDensity = function(aImageData, aWan
|
|
|
70
87
|
}
|
|
71
88
|
|
|
72
89
|
if(aImageData["resizeUrl"]) {
|
|
73
|
-
url =
|
|
90
|
+
url = getCoverScaledImageUrlWithPixelDensity(aImageData["resizeUrl"], aWantedWidth, aWantedHeight, aPixelDensity, aMaxSize);
|
|
74
91
|
}
|
|
75
92
|
|
|
76
93
|
return url;
|
|
77
94
|
}
|
|
78
95
|
|
|
79
96
|
export let createCoverScaledImageUrl = function(aImageData, aWantedWidth, aWantedHeight) {
|
|
80
|
-
return createCoverScaledImageUrlWithPixelDensity(aImageData, aWantedWidth, aWantedHeight, window.devicePixelRatio, window.innerWidth);
|
|
97
|
+
return createCoverScaledImageUrlWithPixelDensity(aImageData, aWantedWidth, aWantedHeight, Math.floor(window.devicePixelRatio), window.innerWidth);
|
|
81
98
|
}
|
|
82
99
|
|
|
83
100
|
export const getContainScaledImageUrlWithPixelDensity = function(aUrl, aWantedWidth, aWantedHeight, aPixelDensity, aMaxSize) {
|
|
@@ -102,7 +119,7 @@ export const getContainScaledImageUrlWithPixelDensity = function(aUrl, aWantedWi
|
|
|
102
119
|
}
|
|
103
120
|
|
|
104
121
|
export const getContainScaledImageUrl = function(aUrl, aWantedWidth, aWantedHeight) {
|
|
105
|
-
return getContainScaledImageUrlWithPixelDensity(aUrl, aWantedWidth, aWantedHeight, window.devicePixelRatio, window.innerWidth);
|
|
122
|
+
return getContainScaledImageUrlWithPixelDensity(aUrl, aWantedWidth, aWantedHeight, Math.floor(window.devicePixelRatio), window.innerWidth);
|
|
106
123
|
}
|
|
107
124
|
|
|
108
125
|
export let createContainScaledImageUrl = function(aImageData, aWantedWidth, aWantedHeight) {
|