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.
Files changed (43) hide show
  1. package/core/source/FirstSource.js +36 -0
  2. package/core/source/index.js +21 -0
  3. package/dbm.js +16 -5
  4. package/flow/controllers/index.js +2 -1
  5. package/flow/controllers/timing/IntervalStep.js +60 -0
  6. package/flow/controllers/timing/index.js +1 -0
  7. package/flow/updatefunctions/animation/AnimateValue.js +39 -0
  8. package/flow/updatefunctions/animation/index.js +13 -0
  9. package/flow/updatefunctions/dom/ElementPosition.js +2 -4
  10. package/flow/updatefunctions/index.js +1 -0
  11. package/flow/updatefunctions/logic/FloatMod.js +26 -0
  12. package/flow/updatefunctions/logic/PositionedItems.js +1 -1
  13. package/flow/updatefunctions/logic/index.js +18 -0
  14. package/flow/updatefunctions/thirdparty/google/index.js +3 -0
  15. package/flow/updatefunctions/thirdparty/google/maps/AutoComplete.js +132 -0
  16. package/flow/updatefunctions/thirdparty/google/maps/index.js +3 -0
  17. package/flow/updatefunctions/thirdparty/index.js +2 -1
  18. package/graphapi/webclient/ApiConnection.js +1 -0
  19. package/graphapi/webclient/decode/index.js +16 -0
  20. package/package.json +1 -1
  21. package/react/admin/EditPage.js +2 -0
  22. package/react/admin/objects/EditObject.js +3 -0
  23. package/react/admin/pageeditors/LinkPreviews.js +98 -0
  24. package/react/admin/pageeditors/index.js +1 -0
  25. package/react/area/FixedWidthInfiniteSlideshow.js +50 -0
  26. package/react/area/List.js +4 -0
  27. package/react/area/index.js +1 -0
  28. package/react/blocks/content/LinkList.js +67 -0
  29. package/react/blocks/content/LinkListCard.js +83 -0
  30. package/react/blocks/content/index.js +3 -1
  31. package/react/blocks/index.js +22 -0
  32. package/react/form/Form.js +49 -0
  33. package/react/form/Option.js +18 -0
  34. package/react/form/index.js +3 -1
  35. package/react/image/CoverScaledImage.js +20 -1
  36. package/react/interaction/CommandButton.js +16 -3
  37. package/react/text/HtmlText.js +6 -1
  38. package/react/text/NumberDisplay.js +30 -0
  39. package/react/text/OptionalLink.js +21 -0
  40. package/react/text/index.js +2 -0
  41. package/utils/ArrayFunctions.js +16 -0
  42. package/utils/CompareFunctions.js +14 -0
  43. 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
+ }
@@ -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
 
@@ -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";
@@ -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
+
@@ -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 = Dbm.utils.UrlFunctions.createCoverScaledImageUrl(image, width, height);
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 command = this.getPropValue("command");
16
-
17
- command.perform(this, aEvent);
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) {
@@ -7,7 +7,12 @@ export default class HtmlText extends Dbm.react.BaseObject {
7
7
 
8
8
  _renderMainElement() {
9
9
 
10
- let text = "" + this.getPropValue("text");
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
+ }
@@ -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") {
@@ -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
  }
@@ -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 = getCoverScaledImageUrl(aImageData["resizeUrl"], aWantedWidth, aWantedHeight);
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) {