dbm 1.4.15 → 1.4.16

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 (85) hide show
  1. package/css/admin.css +6 -1
  2. package/css/all.css +4 -1
  3. package/css/cookie-bar.css +40 -0
  4. package/css/elements.css +41 -0
  5. package/css/form-field.css +46 -0
  6. package/css/grid.css +8 -0
  7. package/css/icons.css +2 -0
  8. package/css/utils.css +12 -6
  9. package/dbm.js +1 -1
  10. package/ecommerce/Cart.js +44 -9
  11. package/ecommerce/LocalStorageCartLoader.js +7 -3
  12. package/flow/controllers/select/SingleSelection.js +7 -0
  13. package/flow/updatefunctions/basic/index.js +1 -1
  14. package/graphapi/webclient/decode/Relations.js +12 -0
  15. package/loading/index.js +34 -0
  16. package/package.json +1 -1
  17. package/react/BaseObject.js +22 -5
  18. package/react/admin/editor/Editor.js +5 -6
  19. package/react/admin/editor/fields/ArrayField.js +24 -7
  20. package/react/admin/editor/fields/Link.js +53 -0
  21. package/react/admin/editor/fields/index.js +2 -1
  22. package/react/admin/objects/ExploreObject.js +103 -0
  23. package/react/admin/objects/explore/Relation.js +67 -0
  24. package/react/admin/objects/explore/RelationType.js +38 -0
  25. package/react/admin/objects/explore/RelationTypeGroup.js +22 -0
  26. package/react/admin/objects/explore/index.js +3 -0
  27. package/react/admin/objects/index.js +3 -1
  28. package/react/admin/objects/itemeditors/DraggableHierarchyDisplay.js +1 -1
  29. package/react/admin/objects/itemeditors/TextAreaField.js +26 -0
  30. package/react/admin/objects/itemeditors/index.js +1 -0
  31. package/react/animation/AnimationController.js +1 -3
  32. package/react/animation/index.js +15 -0
  33. package/react/area/InsertElement.js +3 -0
  34. package/react/area/Layout.js +20 -0
  35. package/react/area/List.js +4 -0
  36. package/react/area/NativeElement.js +37 -0
  37. package/react/area/RepeatedSlider.js +73 -0
  38. package/react/area/SingleItemSlideshow.js +69 -0
  39. package/react/area/SlideshowSteps.js +45 -0
  40. package/react/area/index.js +6 -1
  41. package/react/blocks/admin/objects/Explore.js +18 -0
  42. package/react/blocks/admin/objects/index.js +2 -1
  43. package/react/blocks/content/Buttons.js +33 -0
  44. package/react/blocks/content/SectionsGrid.js +19 -0
  45. package/react/blocks/content/Spacing.js +13 -0
  46. package/react/blocks/content/SpacingLine.js +18 -0
  47. package/react/blocks/content/index.js +5 -1
  48. package/react/blocks/index.js +108 -0
  49. package/react/context/AddContextVariables.js +9 -4
  50. package/react/cookies/CookieBar.js +1 -1
  51. package/react/cookies/CookieOverlayMessage.js +2 -2
  52. package/react/dynamic/DesignRepositoryProxy.js +22 -0
  53. package/react/dynamic/DynamicDesignElement.js +24 -0
  54. package/react/dynamic/index.js +60 -0
  55. package/react/form/EditObjectProperty.js +15 -2
  56. package/react/form/EditableContent.js +71 -0
  57. package/react/form/GraphApiImageWithAltText.js +268 -0
  58. package/react/form/Link.js +40 -0
  59. package/react/form/Url.js +25 -0
  60. package/react/form/index.js +4 -0
  61. package/react/index.js +12 -0
  62. package/react/interaction/Checked.js +32 -0
  63. package/react/interaction/ClickOutsideTrigger.js +1 -1
  64. package/react/interaction/index.js +2 -1
  65. package/react/svg/AddGlobalFilterClasses.js +3 -3
  66. package/react/svg/BlendColorFilter.js +42 -0
  67. package/react/svg/GlobalFilters.js +1 -1
  68. package/react/svg/MatrixFilter.js +1 -3
  69. package/react/svg/index.js +20 -0
  70. package/react/text/index.js +4 -0
  71. package/repository/Item.js +8 -0
  72. package/repository/admin/index.js +10 -0
  73. package/repository/index.js +3 -0
  74. package/repository/proxy/RepositoryProxy.js +60 -0
  75. package/repository/proxy/index.js +1 -0
  76. package/site/BrowserUpdater.js +3 -3
  77. package/startup/index.js +1 -1
  78. package/tracking/Controller.js +14 -8
  79. package/tracking/DataLayerTracker.js +27 -18
  80. package/tracking/GtagTracker.js +112 -0
  81. package/tracking/MetaPixelTracker.js +1 -1
  82. package/tracking/SingleAccountMetaPixelTracker.js +118 -0
  83. package/tracking/TagManagerTracker.js +2 -2
  84. package/tracking/index.js +24 -0
  85. package/utils/svg/ColorMatrixFunctions.js +13 -0
@@ -16,12 +16,12 @@ export default class BrowserUpdater extends Dbm.core.BaseObject {
16
16
  return this;
17
17
  }
18
18
 
19
- _trackPage(aUrl) {
19
+ _trackPage(aUrl, aTitle) {
20
20
  //console.log("_trackPage");
21
21
 
22
22
  let trackingController = Dbm.getInstance().repository.getItem("trackingController").controller;
23
23
  if(trackingController) {
24
- trackingController.trackPage(aUrl);
24
+ trackingController.trackPage(aUrl, aTitle);
25
25
  }
26
26
  }
27
27
 
@@ -59,6 +59,6 @@ export default class BrowserUpdater extends Dbm.core.BaseObject {
59
59
 
60
60
  window.scrollTo(0, 0);
61
61
 
62
- this._trackPage(document.location.href);
62
+ this._trackPage(document.location.href, document.title);
63
63
  }
64
64
  }
package/startup/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import Dbm from "../index.js";
2
+ import React from "react";
2
3
 
3
4
  export {default as Runner} from "./Runner.js";
4
5
  export {default as Controller} from "./Controller.js";
@@ -34,5 +35,4 @@ export const setupLibrary = function() {
34
35
  library.setValue("Dbm/flow/addUpdateCommandWhenMatched", Dbm.flow.addUpdateCommandWhenMatched);
35
36
  library.setValue("Dbm/flow/updatefunctions/logic/Condition", Dbm.flow.updatefunctions.logic.Condition);
36
37
  library.setValue("Dbm/flow/updatefunctions/logic/Switch", Dbm.flow.updatefunctions.logic.Switch);
37
-
38
38
  }
@@ -18,11 +18,7 @@ export default class Controller extends Dbm.core.BaseObject {
18
18
  //aItem.propertyInput("allowMarketing", this.item.getProperty("allowMarketing"));
19
19
  //aItem.propertyInput("allowStatistics", this.item.getProperty("allowStatistics"));
20
20
 
21
- let trackers = [].concat(this.item.trackers);
22
-
23
- trackers.push(aItem);
24
-
25
- this.item.trackers = trackers;
21
+ this.item.addToArray("trackers", aItem);
26
22
 
27
23
  if(this.item.active) {
28
24
  aItem.controller.startTracking();
@@ -37,12 +33,22 @@ export default class Controller extends Dbm.core.BaseObject {
37
33
  return this;
38
34
  }
39
35
 
36
+ removeTracker(aItem) {
37
+ this.item.removeFromArray("trackers", aItem);
38
+
39
+ if(this.item.active) {
40
+ aItem.controller.stopTracking();
41
+ }
42
+
43
+ return this;
44
+ }
45
+
40
46
  setupPermissionsFromCookies() {
41
47
  this.item.allowStatistics = Cookies.get("cookie/allowStatistics") === "1";
42
48
  this.item.allowMarketing = Cookies.get("cookie/allowMarketing") === "1";
43
49
 
44
50
  let cookieBarHiddenInitialSetting = Cookies.get("cookie/hideCookieBar") === "1";
45
- let showingCookieBar = Dbm.getInstance().repository.getItem("userSettings").setValue("hideCookieBar", cookieBarHiddenInitialSetting);
51
+ Dbm.getRepositoryItem("userSettings").setValue("hideCookieBar", cookieBarHiddenInitialSetting);
46
52
 
47
53
  return this;
48
54
  }
@@ -135,14 +141,14 @@ export default class Controller extends Dbm.core.BaseObject {
135
141
  return this;
136
142
  }
137
143
 
138
- trackPage(aUrl) {
144
+ trackPage(aUrl, aTitle = null) {
139
145
  if(this.item.active && this.item.allowStatistics) {
140
146
  let currentArray = this.item.trackers;
141
147
  let currentArrayLength = currentArray.length;
142
148
 
143
149
  for(let i = 0; i < currentArrayLength; i++) {
144
150
  let currentTracker = currentArray[i];
145
- currentTracker.controller.trackPage(aUrl);
151
+ currentTracker.controller.trackPage(aUrl, aTitle);
146
152
  }
147
153
  }
148
154
  }
@@ -7,6 +7,8 @@ export default class DataLayerTracker extends Dbm.core.BaseObject {
7
7
  this._statisticsTracking = false;
8
8
  this._marketingTracking = false;
9
9
 
10
+ this.item.setValue("setConsent", true);
11
+ this.item.setValue("sendMarketingEvents", true);
10
12
  this.item.setValue("ecommerceDataWrapper", null);
11
13
  this.item.setValue("eventNameMap", new Dbm.repository.Item());
12
14
  }
@@ -29,12 +31,15 @@ export default class DataLayerTracker extends Dbm.core.BaseObject {
29
31
  window.dataLayer = [];
30
32
  }
31
33
 
32
- this._gtag("consent", "default", {
33
- "ad_storage": "denied",
34
- "ad_user_data": "denied",
35
- "ad_personalization": "denied",
36
- "analytics_storage": "denied"
37
- });
34
+ if(this.item.setConsent) {
35
+ this._gtag("consent", "default", {
36
+ "ad_storage": "denied",
37
+ "ad_user_data": "denied",
38
+ "ad_personalization": "denied",
39
+ "analytics_storage": "denied"
40
+ });
41
+ }
42
+
38
43
 
39
44
  return this;
40
45
  }
@@ -42,9 +47,11 @@ export default class DataLayerTracker extends Dbm.core.BaseObject {
42
47
  startStatisticsTracking() {
43
48
 
44
49
  this._statisticsTracking = true;
45
- this._gtag("consent", "update", {
46
- "analytics_storage": "granted"
47
- });
50
+ if(this.item.setConsent) {
51
+ this._gtag("consent", "update", {
52
+ "analytics_storage": "granted"
53
+ });
54
+ }
48
55
  this.addToDataLayer({"event": "enableStatistics"});
49
56
  this.addToDataLayer({"event": "trackCurrentPage"});
50
57
 
@@ -54,11 +61,13 @@ export default class DataLayerTracker extends Dbm.core.BaseObject {
54
61
  startMarketingTracking() {
55
62
 
56
63
  this._marketingTracking = true;
57
- this._gtag("consent", "update", {
58
- "ad_storage": "granted",
59
- "ad_user_data": "granted",
60
- "ad_personalization": "granted"
61
- });
64
+ if(this.item.setConsent) {
65
+ this._gtag("consent", "update", {
66
+ "ad_storage": "granted",
67
+ "ad_user_data": "granted",
68
+ "ad_personalization": "granted"
69
+ });
70
+ }
62
71
  this.addToDataLayer({"event": "enableMarketing"});
63
72
 
64
73
  return this;
@@ -98,7 +107,7 @@ export default class DataLayerTracker extends Dbm.core.BaseObject {
98
107
 
99
108
  }
100
109
 
101
- if(this._marketingTracking) {
110
+ if(this._marketingTracking && this.item.sendMarketingEvents) {
102
111
  this.addToDataLayer({"event": "trackMarketingEvent", "value": {"name": aEventName, "data": aData}});
103
112
  if(aDataStructure === "raw") {
104
113
  let adjustedData = {
@@ -118,10 +127,10 @@ export default class DataLayerTracker extends Dbm.core.BaseObject {
118
127
  }
119
128
 
120
129
  trackCurrentPage() {
121
- this.trackPage(document.location.href);
130
+ this.trackPage(document.location.href, document.title);
122
131
  }
123
132
 
124
- trackPage(aUrl) {
125
- this.addToDataLayer({"event": "trackPage", "value": {"url": aUrl}});
133
+ trackPage(aUrl, aTitle = null) {
134
+ this.addToDataLayer({"event": "trackPage", "value": {"url": aUrl, "title": aTitle}});
126
135
  }
127
136
  }
@@ -0,0 +1,112 @@
1
+ import Dbm from "../index.js";
2
+
3
+ export default class GtagTracker extends Dbm.core.BaseObject {
4
+ _construct() {
5
+ super._construct();
6
+
7
+ this.item.setValue("tagId", null);
8
+ this.item.setValue("eventNameMap", new Dbm.repository.Item());
9
+
10
+ this.item.eventNameMap.setValue("Product list view", "view_item_list");
11
+ this.item.eventNameMap.setValue("Product view", "view_item");
12
+ this.item.eventNameMap.setValue("Added to cart", "add_to_cart");
13
+ this.item.eventNameMap.setValue("View cart", "view_cart");
14
+ this.item.eventNameMap.setValue("Add shipping", "add_shipping_info");
15
+ this.item.eventNameMap.setValue("Purchase", "purchase");
16
+ this.item.eventNameMap.setValue("Checkout started", "begin_checkout");
17
+ this.item.eventNameMap.setValue("Add payment", "add_payment_info");
18
+
19
+ this.item.setValue("conversionIds", new Dbm.repository.Item());
20
+ }
21
+
22
+ addPurchaseTrackingId(aId) {
23
+
24
+ this.item.conversionIds.setValue("purchase", aId);
25
+
26
+ return this;
27
+ }
28
+
29
+ addToDataLayer(aData) {
30
+
31
+ window.dataLayer.push(aData);
32
+
33
+ return this;
34
+ }
35
+
36
+ _gtag() {
37
+ window.dataLayer.push(arguments);
38
+
39
+ return this;
40
+ }
41
+
42
+ startTracking() {
43
+ if(!window.dataLayer) {
44
+ window.dataLayer = [];
45
+ }
46
+
47
+ this._gtag("config", this.item.tagId, {
48
+ "send_page_view": false
49
+ });
50
+
51
+ return this;
52
+ }
53
+
54
+ startStatisticsTracking() {
55
+
56
+ return this;
57
+ }
58
+
59
+ startMarketingTracking() {
60
+
61
+ return this;
62
+ }
63
+
64
+ stopTracking() {
65
+
66
+ return this;
67
+ }
68
+
69
+ _getSendData(aData) {
70
+ let sendData = {
71
+ ...aData,
72
+ "send_to": this.item.tagId
73
+ }
74
+
75
+ return sendData;
76
+ }
77
+
78
+ trackEvent(aEventName, aData, aDataStructure = null) {
79
+ console.log("trackEvent");
80
+ console.log(aEventName, aData, aDataStructure);
81
+
82
+ let translatedEventName = this.item.eventNameMap[aEventName];
83
+ if(translatedEventName) {
84
+ aEventName = translatedEventName;
85
+
86
+ this._gtag("event", aEventName, this._getSendData(aData));
87
+
88
+ let conversionId = this.item.conversionIds[aEventName];
89
+ if(conversionId) {
90
+ let sendData = this._getSendData(aData);
91
+ sendData["send_to"] += "/" + conversionId;
92
+ this._gtag("event", "conversion", sendData);
93
+ }
94
+ }
95
+
96
+
97
+ }
98
+
99
+ trackCurrentPage() {
100
+ this.trackPage(document.location.href, document.title);
101
+ }
102
+
103
+ trackPage(aUrl, aTitle = null) {
104
+
105
+ let data = {
106
+ page_location: aUrl,
107
+ page_title: aTitle
108
+ };
109
+
110
+ this._gtag("event", "page_view", this._getSendData(data));
111
+ }
112
+ }
@@ -111,7 +111,7 @@ export default class MetaPixelTracker extends Dbm.core.BaseObject {
111
111
  window.fbq("track", "PageView");
112
112
  }
113
113
 
114
- trackPage(aUrl) {
114
+ trackPage(aUrl, aTitle = null) {
115
115
  if(!this._isStarted) return;
116
116
  window.fbq("track", "PageView");
117
117
  }
@@ -0,0 +1,118 @@
1
+ import Dbm from "../index.js";
2
+
3
+ export default class SingleAccountMetaPixelTracker extends Dbm.core.BaseObject {
4
+ _construct() {
5
+ super._construct();
6
+
7
+ this._isStarted = false;
8
+ this.item.requireProperty("pixelId");
9
+ }
10
+
11
+ _setupFunction() {
12
+
13
+ if(window.fbq) return;
14
+
15
+ let fbq = function() {
16
+ fbq.callMethod ? fbq.callMethod.apply(fbq, arguments) : fbq.queue.push(arguments);
17
+ }
18
+ window.fbq = fbq;
19
+
20
+ if(!window._fbq) {
21
+ window._fbq = fbq;
22
+ }
23
+
24
+ fbq.push = fbq;
25
+ fbq.loaded = true;
26
+ fbq.version = "2.0";
27
+ fbq.queue = [];
28
+ fbq.disablePushState = true;
29
+
30
+ return this;
31
+ }
32
+
33
+ startTracking() {
34
+
35
+ //MENOTE: do nothing
36
+
37
+ return this;
38
+ }
39
+
40
+ startStatisticsTracking() {
41
+
42
+ //MENOTE: do nothing
43
+
44
+ return this;
45
+ }
46
+
47
+ startMarketingTracking() {
48
+
49
+ this._isStarted = true;
50
+ this._setupFunction();
51
+ Dbm.loading.loadScript("https://connect.facebook.net/en_US/fbevents.js");
52
+
53
+ let pixelId = this.item.pixelId;
54
+
55
+ if(this.item.pixelId) {
56
+ window.fbq("init", this.item.pixelId);
57
+ window.fbq("trackSingle", this.item.pixelId, "PageView");
58
+ }
59
+
60
+ return this;
61
+ }
62
+
63
+ stopTracking() {
64
+
65
+ return this;
66
+ }
67
+
68
+ _convertGooogleAnalyctisData(aData) {
69
+
70
+ let data = {
71
+ content_type: "product",
72
+ value: aData.value,
73
+ currency: aData.currency,
74
+ contents: aData.items,
75
+ num_items: aData.items.length,
76
+ content_ids: Dbm.utils.ArrayFunctions.mapField(aData.items, "id")
77
+ };
78
+
79
+ if(aData.items.length === 1) {
80
+ data["content_name"] = aData.items[0]["item_name"];
81
+ }
82
+
83
+ return data;
84
+ }
85
+
86
+ trackEvent(aEventName, aData) {
87
+ console.log("trackEvent");
88
+ console.log(aEventName, aData);
89
+
90
+ if(!this._isStarted) return;
91
+
92
+ if(aEventName === "Purchase") {
93
+ window.fbq('trackSingle', this.item.pixelId, 'Purchase', this._convertGooogleAnalyctisData(aData), {eventID: aData.transaction_id});
94
+ }
95
+ else if(aEventName === "Product view") {
96
+ window.fbq('trackSingle', this.item.pixelId, 'ViewContent', this._convertGooogleAnalyctisData(aData));
97
+ }
98
+ else if(aEventName === "Added to cart") {
99
+ window.fbq('trackSingle', this.item.pixelId, 'AddToCart', this._convertGooogleAnalyctisData(aData));
100
+ }
101
+ else if(aEventName === "Checkout started") {
102
+ window.fbq('trackSingle', this.item.pixelId, 'InitiateCheckout', this._convertGooogleAnalyctisData(aData));
103
+ }
104
+ else {
105
+ window.fbq("trackSingleCustom", this.item.pixelId, aEventName, aData);
106
+ }
107
+ }
108
+
109
+ trackCurrentPage() {
110
+ if(!this._isStarted) return;
111
+ window.fbq("trackSingle", this.item.pixelId, "PageView");
112
+ }
113
+
114
+ trackPage(aUrl, aTitle = null) {
115
+ if(!this._isStarted) return;
116
+ window.fbq("trackSingle", this.item.pixelId, "PageView");
117
+ }
118
+ }
@@ -27,7 +27,7 @@ export default class TagManagerTracker extends Dbm.core.BaseObject {
27
27
  }
28
28
 
29
29
  startStatisticsTracking() {
30
- console.log("TagManagerTracker::startStatisticsTracking");
30
+ //console.log("TagManagerTracker::startStatisticsTracking");
31
31
  this.loadTagManager();
32
32
 
33
33
  return this;
@@ -52,7 +52,7 @@ export default class TagManagerTracker extends Dbm.core.BaseObject {
52
52
 
53
53
  }
54
54
 
55
- trackPage(aUrl) {
55
+ trackPage(aUrl, aTitle = null) {
56
56
 
57
57
  }
58
58
  }
package/tracking/index.js CHANGED
@@ -4,6 +4,16 @@ export {default as Controller} from "./Controller.js";
4
4
  export {default as DataLayerTracker} from "./DataLayerTracker.js";
5
5
  export {default as MetaPixelTracker} from "./MetaPixelTracker.js";
6
6
  export {default as TagManagerTracker} from "./TagManagerTracker.js";
7
+ export {default as GtagTracker} from "./GtagTracker.js";
8
+ export {default as SingleAccountMetaPixelTracker} from "./SingleAccountMetaPixelTracker.js";
9
+
10
+ export const addStartTagManagerMarker = function() {
11
+ window.dataLayer=window.dataLayer || [];
12
+ window.dataLayer.push({
13
+ "gtm.start": new Date().getTime(),
14
+ "event": "gtm.js"
15
+ });
16
+ }
7
17
 
8
18
  export const setup = function() {
9
19
 
@@ -18,6 +28,20 @@ export const setup = function() {
18
28
  controller.addTracker(dataLayerTracker.item);
19
29
  }
20
30
 
31
+ export const setupExternalTagManager = function() {
32
+ let controller = new Dbm.tracking.Controller();
33
+ controller.item.register("trackingController");
34
+
35
+ controller.item.allowStatistics = true;
36
+ controller.item.allowMarketing = true;
37
+ controller.start();
38
+
39
+ let dataLayerTracker = new Dbm.tracking.DataLayerTracker();
40
+ dataLayerTracker.item.setConsent = false;
41
+ dataLayerTracker.item.register("tracking/dataLayerTracker");
42
+ controller.addTracker(dataLayerTracker.item);
43
+ }
44
+
21
45
  export const addMetaPixel = function(aPixelId) {
22
46
  let tracker = new Dbm.tracking.MetaPixelTracker();
23
47
  tracker.item.pixelId = aPixelId;
@@ -3,10 +3,23 @@ import Dbm from "../../index.js";
3
3
  export const floodColor = function(aR, aG, aB, aNumberOfDecimals = 4) {
4
4
  let values = "";
5
5
 
6
+ console.log(aR, aG, aB);
7
+
6
8
  values += "0 0 0 0 " + (aR/255).toFixed(aNumberOfDecimals) + " ";
7
9
  values += "0 0 0 0 " + (aG/255).toFixed(aNumberOfDecimals) + " ";
8
10
  values += "0 0 0 0 " + (aB/255).toFixed(aNumberOfDecimals) + " ";
9
11
  values += "0 0 0 1 0";
10
12
 
13
+ return values;
14
+ }
15
+
16
+ export const multiplyColor = function(aR, aG, aB, aNumberOfDecimals = 4) {
17
+ let values = "";
18
+
19
+ values += (aR/255).toFixed(aNumberOfDecimals) + " 0 0 0 0" + " ";
20
+ values += "0 " + (aG/255).toFixed(aNumberOfDecimals) + " 0 0 0" + " ";
21
+ values += "0 0 " + (aB/255).toFixed(aNumberOfDecimals) + " 0 0" + " ";
22
+ values += "0 0 0 1 0";
23
+
11
24
  return values;
12
25
  }