dbm 1.4.15 → 1.4.17

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 (90) hide show
  1. package/commands/index.js +1 -1
  2. package/css/admin.css +6 -1
  3. package/css/all.css +4 -1
  4. package/css/cookie-bar.css +40 -0
  5. package/css/elements.css +41 -0
  6. package/css/form-field.css +46 -0
  7. package/css/grid.css +8 -0
  8. package/css/icons.css +2 -0
  9. package/css/utils.css +12 -6
  10. package/dbm.js +1 -1
  11. package/ecommerce/Cart.js +44 -9
  12. package/ecommerce/LocalStorageCartLoader.js +7 -3
  13. package/flow/controllers/select/SingleSelection.js +7 -0
  14. package/flow/updatefunctions/basic/index.js +1 -1
  15. package/graphapi/webclient/decode/Relations.js +12 -0
  16. package/loading/index.js +34 -0
  17. package/package.json +1 -1
  18. package/react/BaseObject.js +22 -5
  19. package/react/admin/editor/Editor.js +5 -6
  20. package/react/admin/editor/fields/ArrayField.js +24 -7
  21. package/react/admin/editor/fields/Link.js +53 -0
  22. package/react/admin/editor/fields/index.js +2 -1
  23. package/react/admin/objects/ExploreObject.js +103 -0
  24. package/react/admin/objects/explore/Relation.js +67 -0
  25. package/react/admin/objects/explore/RelationType.js +38 -0
  26. package/react/admin/objects/explore/RelationTypeGroup.js +22 -0
  27. package/react/admin/objects/explore/index.js +3 -0
  28. package/react/admin/objects/index.js +3 -1
  29. package/react/admin/objects/itemeditors/DraggableHierarchyDisplay.js +1 -1
  30. package/react/admin/objects/itemeditors/TextAreaField.js +26 -0
  31. package/react/admin/objects/itemeditors/index.js +1 -0
  32. package/react/animation/AnimationController.js +1 -3
  33. package/react/animation/index.js +15 -0
  34. package/react/area/InsertElement.js +3 -0
  35. package/react/area/Layout.js +20 -0
  36. package/react/area/List.js +4 -0
  37. package/react/area/ModalDialog.js +89 -0
  38. package/react/area/NativeElement.js +37 -0
  39. package/react/area/RepeatedSlider.js +73 -0
  40. package/react/area/SingleItemSlideshow.js +69 -0
  41. package/react/area/SlideshowSteps.js +45 -0
  42. package/react/area/index.js +7 -1
  43. package/react/blocks/admin/objects/Explore.js +18 -0
  44. package/react/blocks/admin/objects/index.js +2 -1
  45. package/react/blocks/content/Buttons.js +33 -0
  46. package/react/blocks/content/ContentBlock.js +7 -2
  47. package/react/blocks/content/SectionsGrid.js +19 -0
  48. package/react/blocks/content/Spacing.js +13 -0
  49. package/react/blocks/content/SpacingLine.js +18 -0
  50. package/react/blocks/content/index.js +5 -1
  51. package/react/blocks/index.js +108 -0
  52. package/react/context/AddContextVariables.js +9 -4
  53. package/react/cookies/CookieBar.js +6 -4
  54. package/react/cookies/CookieOverlayMessage.js +6 -4
  55. package/react/dynamic/DesignRepositoryProxy.js +22 -0
  56. package/react/dynamic/DynamicDesignElement.js +24 -0
  57. package/react/dynamic/index.js +60 -0
  58. package/react/form/EditObjectProperty.js +15 -2
  59. package/react/form/EditableContent.js +71 -0
  60. package/react/form/GraphApiImageWithAltText.js +268 -0
  61. package/react/form/Link.js +40 -0
  62. package/react/form/Url.js +25 -0
  63. package/react/form/index.js +4 -0
  64. package/react/index.js +12 -0
  65. package/react/interaction/Checked.js +32 -0
  66. package/react/interaction/ClickOutsideTrigger.js +1 -1
  67. package/react/interaction/index.js +2 -1
  68. package/react/svg/AddGlobalFilterClasses.js +3 -3
  69. package/react/svg/BlendColorFilter.js +42 -0
  70. package/react/svg/GlobalFilters.js +1 -1
  71. package/react/svg/MatrixFilter.js +1 -3
  72. package/react/svg/index.js +20 -0
  73. package/react/text/index.js +4 -0
  74. package/repository/Item.js +8 -0
  75. package/repository/admin/index.js +10 -0
  76. package/repository/index.js +3 -0
  77. package/repository/proxy/RepositoryProxy.js +60 -0
  78. package/repository/proxy/index.js +1 -0
  79. package/site/BrowserUpdater.js +3 -3
  80. package/startup/index.js +1 -1
  81. package/tracking/Controller.js +26 -8
  82. package/tracking/ConversionLinker.js +53 -0
  83. package/tracking/DataLayerTracker.js +27 -18
  84. package/tracking/GtagTracker.js +112 -0
  85. package/tracking/MetaPixelTracker.js +1 -1
  86. package/tracking/PageListTracker.js +46 -0
  87. package/tracking/SingleAccountMetaPixelTracker.js +118 -0
  88. package/tracking/TagManagerTracker.js +2 -2
  89. package/tracking/index.js +58 -0
  90. package/utils/svg/ColorMatrixFunctions.js +13 -0
@@ -0,0 +1,71 @@
1
+ import React from "react";
2
+ import Dbm from "../../index.js";
3
+
4
+ export default class EditableContent extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ let valueProperty = this.getDynamicPropWithoutState("value", "");
9
+ this.getDynamicPropWithoutState("editing", false);
10
+ this.state["formUpdate"] = 0;
11
+ this._currentValue = "";
12
+
13
+ this._callback_focusBound = this._callback_focus.bind(this);
14
+ this._callback_blurBound = this._callback_blur.bind(this);
15
+
16
+ this._elementChangedBound = this._elementChanged.bind(this);
17
+ this._callback_inputBound = this._callback_input.bind(this);
18
+
19
+ this.createRef("contentElement");
20
+ Dbm.flow.addUpdateCommand(this.item.properties.contentElement, Dbm.commands.callFunction(this._elementChangedBound));
21
+
22
+ valueProperty.addUpdate(this._getScopedCallFunctionCommand(this._valueChanged));
23
+ }
24
+
25
+ _callback_focus(aEvent) {
26
+ //console.log("_callback_focus");
27
+ //console.log(aEvent);
28
+
29
+ this.getDynamicProp("editing").getMostUpstreamProperty().setValue(true);
30
+ }
31
+
32
+ _callback_blur(aEvent) {
33
+ //console.log("_callback_blur");
34
+ //console.log(aEvent);
35
+
36
+ this.getDynamicProp("editing").getMostUpstreamProperty().setValue(false);
37
+ }
38
+
39
+ _valueChanged() {
40
+ //console.log("_elementChanged");
41
+
42
+ if(this.item.contentElement) {
43
+ let value = this.getPropValueWithoutNull("value", "");
44
+ if(value !== this._currentValue) {
45
+ this.item.contentElement.innerHTML = value;
46
+ }
47
+ }
48
+ }
49
+
50
+ _elementChanged() {
51
+ //console.log("_elementChanged");
52
+
53
+ this.item.contentElement.innerHTML = this.getPropValueWithoutNull("value", "");
54
+ this.item.contentElement.addEventListener("input", this._callback_inputBound, false);
55
+
56
+ }
57
+
58
+ _callback_input(aEvent) {
59
+ //console.log("_callback_input");
60
+
61
+ let value = "" + this.item.contentElement.innerHTML;
62
+ this._currentValue = value;
63
+ this.getDynamicProp("value").getMostUpstreamProperty().setValue(value);
64
+ this.setState({"formUpdate": this.state.formUpdate}); //MENOTE: trigger change direct to not lose focus on input
65
+ }
66
+
67
+ _renderMainElement() {
68
+ return this._createMainElement("div", {contentEditable: true, ref: this.createRef("contentElement"), className: "standard-field standard-field-padding"});
69
+ }
70
+ }
71
+
@@ -0,0 +1,268 @@
1
+ import React from "react";
2
+ import Dbm from "../../index.js";
3
+
4
+ export default class GraphApiImageWithAltText extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ let valueProperty = this.getDynamicProp("value", {});
9
+
10
+ this._callback_fileChangedBound = this._callback_fileChanged.bind(this);
11
+ this._altTextChangedBound = this._altTextChanged.bind(this);
12
+
13
+ Dbm.flow.addUpdateCommand(valueProperty, this._getScopedCallFunctionCommand(this._valueUpdated));
14
+
15
+ let altText = Dbm.objectPath(this.item.value, "altText");
16
+
17
+ Dbm.flow.addUpdateCommand(this.item.requireProperty("altText", altText), Dbm.commands.callFunction(this._altTextChangedBound));
18
+
19
+ let imageElement = React.createElement("div", {className: "flex-row small-item-spacing"},
20
+ React.createElement("div", {className: "flex-row-item flex-no-resize"},
21
+ React.createElement(Dbm.react.image.WidthScaledImage, {"image": valueProperty, targetWidth: 120, className: "editor-preview background-contain"}),
22
+ ),
23
+ React.createElement("div", {className: "flex-row-item flex-resize"},
24
+ Dbm.react.text.text(Dbm.core.source.staticObject(valueProperty, "url")),
25
+ React.createElement("div", {className: "spacing small"}),
26
+ React.createElement("div", {},
27
+ React.createElement(Dbm.react.area.HasData, {check: valueProperty, checkType: "invert/default"},
28
+ React.createElement(Dbm.react.interaction.CommandButton, {command: Dbm.commands.callFunction(this._addToLibrary.bind(this))},
29
+ React.createElement("div", {className: "action-button action-button-padding"},
30
+ "Add to library"
31
+ )
32
+ )
33
+
34
+ ),
35
+ React.createElement(Dbm.react.area.HasData, {check: valueProperty},
36
+ React.createElement(Dbm.react.form.FormField, {value: this.item.properties.altText, className: "standard-field standard-field-padding full-width"}),
37
+ React.createElement("div", {className: "spacing micro"}),
38
+ React.createElement("div", {className: "flex-row small-item-spacing"},
39
+ React.createElement("div", {className: "flex-row-item"},
40
+ React.createElement(Dbm.react.interaction.CommandButton, {command: Dbm.commands.callFunction(this._generateAltText.bind(this))},
41
+ React.createElement("div", {className: "action-button action-button-padding"},
42
+ "Generate"
43
+ )
44
+ )
45
+ ),
46
+ React.createElement("div", {className: "flex-row-item"},
47
+ React.createElement(Dbm.react.interaction.CommandButton, {command: Dbm.commands.callFunction(this._saveAltTextToLibrary.bind(this))},
48
+ React.createElement("div", {className: "action-button action-button-padding"},
49
+ "Save to library"
50
+ )
51
+ )
52
+ ),
53
+ React.createElement("div", {className: "flex-row-item flex-resize"}),
54
+ React.createElement("div", {className: "flex-row-item"},
55
+ React.createElement(Dbm.react.interaction.CommandButton, {command: Dbm.commands.callFunction(this._updateFromLibrary.bind(this))},
56
+ React.createElement("div", {className: "action-button action-button-padding"},
57
+ "Update from library"
58
+ )
59
+ )
60
+ )
61
+ )
62
+ )
63
+ ),
64
+ ),
65
+ React.createElement("div", {className: "flex-row-item flex-no-resize"},
66
+ React.createElement("div", {onClick: () => {this.removeImage()}}, "Remove")
67
+ )
68
+ );
69
+
70
+ this.item.requireProperty("selectMode", "overview");
71
+
72
+ let uploadElement = React.createElement("div", {className: "flex-row small-item-spacing halfs"},
73
+ React.createElement("div", {className: "flex-row-item"},
74
+ React.createElement("input", {"type": "file", onChange: this._callback_fileChangedBound, className: "full-width"})
75
+ ),
76
+ React.createElement("div", {className: "flex-row-item"},
77
+ React.createElement(Dbm.react.interaction.CommandButton, {command: Dbm.commands.setProperty(this.item.properties.selectMode, "library")},
78
+ React.createElement("div", {className: "flex-row-item"}, "Select from library")
79
+ )
80
+ ),
81
+ );
82
+
83
+ let libraryElement = React.createElement("div", {},
84
+ React.createElement(Dbm.react.admin.SelectImageFromLibrary, {selectedCommands: [
85
+ Dbm.commands.callFunction(this._imageSelected.bind(this), [Dbm.core.source.event()]),
86
+ Dbm.commands.setProperty(this.item.properties.selectMode, "overview")
87
+ ]})
88
+ );
89
+
90
+ let selectSwitch = Dbm.flow.updatefunctions.logic.switchValue(this.item.properties.selectMode).setDefaultValue(uploadElement).addCase("library", libraryElement);
91
+
92
+ let selectElement = React.createElement("div", {},
93
+ React.createElement(Dbm.react.area.InsertElement, {element: selectSwitch.output.properties.value})
94
+ );
95
+
96
+ let elementSwitch = Dbm.flow.updatefunctions.logic.switchValue(valueProperty).setDefaultValue(imageElement).addCase(null, selectElement);
97
+
98
+ this.item.requireProperty("element", null).connectInput(elementSwitch.output.properties.value);
99
+ }
100
+
101
+ _valueUpdated() {
102
+ let imageData = this.getPropValue("value");
103
+
104
+ if(imageData && imageData.altText && imageData.altText !== this.item.altText) {
105
+ this.item.altText = imageData.altText;
106
+ }
107
+ }
108
+
109
+ _addToLibrary() {
110
+ let imageData = this.getPropValue("value");
111
+
112
+ let objectType = "image";
113
+
114
+ let parsedUrl = URL.parse(imageData.url);
115
+
116
+ let fileName = parsedUrl.pathname.substring(parsedUrl.pathname.lastIndexOf("/")+1);
117
+
118
+ let changes = [
119
+ {"type": "setIdentifier", "data": {"value": imageData.identifier, "field": "name"}},
120
+ {"type": "setField", "data": {"value": fileName, "field": "name"}},
121
+ {"type": "setField", "data": {"value": fileName, "field": "originalFileName"}},
122
+ {"type": "setField", "data": {"value": parsedUrl.pathname, "field": "path"}},
123
+ {"type": "setField", "data": {"value": imageData.url, "field": "url"}},
124
+ {"type": "setField", "data": {"value": imageData.resizeUrl, "field": "resizeUrl"}},
125
+ ];
126
+
127
+ let request = Dbm.getInstance().repository.getItem("graphApi").controller.createItem([objectType], "public", changes);
128
+
129
+ Dbm.flow.addUpdateCommand(request.properties.status, Dbm.commands.callFunction(this._libraryImageCreated.bind(this), [request]));
130
+ }
131
+
132
+ _libraryImageCreated(aRequest) {
133
+ //console.log("_libraryImageCreated");
134
+ //console.log(aRequest);
135
+
136
+ let imageData = {...this.item.value};
137
+
138
+ imageData.id = aRequest.item.id;
139
+ this.getDynamicProp("value").getMostUpstreamProperty().value = imageData;
140
+ }
141
+
142
+ _generateAltText() {
143
+
144
+ let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
145
+
146
+ let request = graphApi.requestData("admin/altText", {"id": this.item.value.id});
147
+ Dbm.flow.addUpdateCommandWhenMatched(request.properties.status, Dbm.loading.LoadingStatus.LOADED, Dbm.commands.callFunction(this._altTextLoaded.bind(this), [request]));
148
+
149
+ }
150
+
151
+ _altTextLoaded(aRequest) {
152
+ this.item.altText = Dbm.objectPath(aRequest, "data.altText");
153
+ }
154
+
155
+ _saveAltTextToLibrary() {
156
+ let changes = [
157
+ {"type": "setField", "data": {"value": this.item.altText, "field": "altText"}},
158
+ ];
159
+
160
+ let request = Dbm.getInstance().repository.getItem("graphApi").controller.editItem(this.getPropValue("value").id, changes);
161
+ }
162
+
163
+ _updateFromLibrary() {
164
+ console.log("_updateFromLibrary");
165
+
166
+ let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
167
+
168
+ let request = graphApi.requestItem(this.getPropValue("value").id, ["image"]);
169
+ Dbm.flow.addUpdateCommandWhenMatched(request.properties.status, Dbm.loading.LoadingStatus.LOADED, Dbm.commands.callFunction(this._libraryImageLoaded.bind(this), [request]));
170
+
171
+ }
172
+
173
+ _libraryImageLoaded(aRequest) {
174
+ console.log("_libraryImageLoaded");
175
+ console.log(aRequest);
176
+
177
+ let item = aRequest.item;
178
+
179
+ let imageData = {id: item.id, url: item.url, resizeUrl: item.resizeUrl, identifier: item.identifier, altText: item.altText};
180
+ this.getDynamicProp("value").getMostUpstreamProperty().value = null;
181
+
182
+ setTimeout(() => {
183
+ this.getDynamicProp("value").getMostUpstreamProperty().value = imageData;
184
+ }, 100);
185
+
186
+ }
187
+
188
+ _imageSelected(aImage) {
189
+ console.log("_imageSelected");
190
+ console.log(aImage);
191
+
192
+ let imageData = {id: aImage.id, url: aImage.url, resizeUrl: aImage.resizeUrl, identifier: aImage.identifier, altText: aImage.altText};
193
+ this.getDynamicProp("value").getMostUpstreamProperty().value = imageData;
194
+ }
195
+
196
+ _altTextChanged() {
197
+
198
+ let value = this.getPropValue("value");
199
+ if(value && value.altText !== this.item.altText) {
200
+ let newValue = {...value};
201
+ newValue.altText = this.item.altText;
202
+ this.getDynamicProp("value").getMostUpstreamProperty().value = newValue;
203
+ }
204
+ }
205
+
206
+ _callback_fileChanged(aEvent) {
207
+ console.log("_callback_fileChanged");
208
+ console.log(aEvent, aEvent.target.files);
209
+
210
+ let files = aEvent.target.files;
211
+ if(files.length > 0) {
212
+ this.uploadImage(files[0]);
213
+ }
214
+ }
215
+
216
+ removeImage() {
217
+ this.item.value = null;
218
+
219
+ return this;
220
+ }
221
+
222
+ uploadImage(aFile) {
223
+
224
+ let graphApi = Dbm.getInstance().repository.getItem("graphApi").controller;
225
+
226
+ let preSign = graphApi.requestData("fileUpload", {"fileName": aFile.name, "mimeType": aFile.type});
227
+
228
+ Dbm.flow.addDirectUpdateCommand(preSign.getProperty("status"), Dbm.commands.callFunction(this._statusChanged.bind(this), [preSign, aFile]));
229
+
230
+ }
231
+
232
+ _statusChanged(aPreSign, aFile) {
233
+ console.log("_statusChanged");
234
+ console.log(aPreSign, aFile);
235
+
236
+ if(aPreSign.status === 1) {
237
+ let url = aPreSign.data.url;
238
+ console.log(url, aPreSign.data);
239
+
240
+ let headers = {
241
+ 'Content-Type': aFile.type,
242
+ 'Cache-Control': 'no-cache',
243
+ };
244
+
245
+ let additionalHeaders = aPreSign.data.additionalHeaders;
246
+ for(let objectName in additionalHeaders) {
247
+ headers[objectName] = additionalHeaders[objectName];
248
+ }
249
+
250
+ fetch(url, {
251
+ method: 'PUT',
252
+ headers: new Headers(headers),
253
+ body: aFile
254
+ }).then(() => {
255
+ this.item.value = {id: aPreSign.data.id, url: aPreSign.data.publicUrl, resizeUrl: aPreSign.data.publicResizeUrl, identifier: aPreSign.data.identifier};
256
+ console.log("Uploaded", this.item.value);
257
+ //METODO: send update to editor
258
+ })
259
+
260
+ }
261
+ }
262
+
263
+ _renderMainElement() {
264
+ return this._createMainElement("div", {},
265
+ React.createElement(Dbm.react.area.InsertElement, {element: this.item.properties.element})
266
+ );
267
+ }
268
+ }
@@ -0,0 +1,40 @@
1
+ import React from "react";
2
+ import Dbm from "../../index.js";
3
+
4
+ export default class Link extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ this.getDynamicPropWithoutState("value", {});
9
+ this.getDynamicPropWithoutState("editing", false);
10
+ }
11
+
12
+ _renderMainElement() {
13
+
14
+ let objectProperty = this.getDynamicPropWithoutState("value", {});
15
+ let textFieldName = this.getPropValueWithDefault("textFieldName", "text");
16
+ let urlFieldName = this.getPropValueWithDefault("urlFieldName", "url");
17
+ let editing = this.getDynamicPropWithoutState("editing", false);
18
+
19
+ return this._createMainElement("div", {},
20
+ React.createElement("div", {"className": "flex-row"},
21
+ React.createElement("div", {"className": "flex-row-item quarter flex-resize"},
22
+ React.createElement("div", {"className": "flex-row-item absolute-container"},
23
+ React.createElement(Dbm.react.form.EditObjectProperty, {"value": objectProperty, "path": textFieldName},
24
+ React.createElement(Dbm.react.form.FormField, {"className": "integrated-field standard-field-padding with-left-field-icon full-width", value: Dbm.react.source.contextVariable("value"), editing: editing})
25
+ ),
26
+ React.createElement(Dbm.react.image.Image, {"src": "/assets/img/icons/text.svg", "className": "field-icon left-field-icon-position background-contain field-icon-color no-pointer-events", "alt": "Link text"})
27
+ )
28
+ ),
29
+ React.createElement("div", {"className": "flex-row-item half flex-resize"},
30
+ React.createElement("div", {"className": "flex-row-item absolute-container"},
31
+ React.createElement(Dbm.react.form.Url, {"className": "standard-field-padding with-left-field-icon full-width", value: objectProperty, urlFieldName: urlFieldName, editing: editing}),
32
+ React.createElement(Dbm.react.image.Image, {"src": "/assets/img/icons/link.svg", "className": "field-icon left-field-icon-position background-contain field-icon-color no-pointer-events", "alt": "URL"}),
33
+ )
34
+ )
35
+ )
36
+
37
+ );
38
+ }
39
+ }
40
+
@@ -0,0 +1,25 @@
1
+ import React from "react";
2
+ import Dbm from "../../index.js";
3
+
4
+ export default class Url extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ this.getDynamicPropWithoutState("value", {});
9
+ this.getDynamicPropWithoutState("editing", false);
10
+ }
11
+
12
+ _renderMainElement() {
13
+
14
+ let objectProperty = this.getDynamicPropWithoutState("value", {});
15
+ let urlFieldName = this.getPropValueWithDefault("urlFieldName", "url");
16
+ let editing = this.getDynamicPropWithoutState("editing", false);
17
+
18
+ return React.createElement("div", {},
19
+ React.createElement(Dbm.react.form.EditObjectProperty, {"value": objectProperty, "path": urlFieldName},
20
+ this._createMainElement(Dbm.react.form.FormField, {"className": "integrated-field standard-field-padding-vertical", value: Dbm.react.source.contextVariable("value"), editing: editing})
21
+ )
22
+ );
23
+ }
24
+ }
25
+
@@ -18,6 +18,10 @@ export {default as Option} from "./Option.js";
18
18
  export {default as Dropdown} from "./Dropdown.js";
19
19
  export {default as GraphApiObjectOptions} from "./GraphApiObjectOptions.js";
20
20
  export {default as CustomSelection} from "./CustomSelection.js";
21
+ export {default as Url} from "./Url.js";
22
+ export {default as Link} from "./Link.js";
23
+ export {default as EditableContent} from "./EditableContent.js";
24
+ export {default as GraphApiImageWithAltText} from "./GraphApiImageWithAltText.js";
21
25
 
22
26
  export const validationStateClassName = function(aChildren) {
23
27
  return React.createElement(Dbm.react.AddProps, {className: Dbm.react.source.contextVariable("field.properties.validationState")},
package/react/index.js CHANGED
@@ -1,8 +1,11 @@
1
+ import Dbm from "../index.js";
2
+
1
3
  export {default as BaseObject} from "./BaseObject.js";
2
4
  export {default as RefToProperty} from "./RefToProperty.js";
3
5
  export {default as AddProps} from "./AddProps.js";
4
6
 
5
7
  export * as ChildFunctions from "./ChildFunctions.js";
8
+ export * as dynamic from "./dynamic/index.js";
6
9
 
7
10
  export * as modules from "./modules/index.js";
8
11
  export * as admin from "./admin/index.js";
@@ -19,3 +22,12 @@ export * as animation from "./animation/index.js";
19
22
  export * as interaction from "./interaction/index.js";
20
23
  export * as thirdparty from "./thirdparty/index.js";
21
24
  export * as svg from "./svg/index.js";
25
+
26
+
27
+ export let design = null;
28
+
29
+ export const setupDesign = function() {
30
+ let repositoryProxy = new Dbm.react.dynamic.DesignRepositoryProxy();
31
+
32
+ design = repositoryProxy.proxy;
33
+ }
@@ -0,0 +1,32 @@
1
+ import React from "react";
2
+ import Dbm from "../../index.js";
3
+
4
+ export default class Checked extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+
8
+ this.getDynamicProp("checked", false);
9
+
10
+ this._clickedCommand = this._getScopedCallFunctionCommand(this._clicked);
11
+ }
12
+
13
+ _clicked() {
14
+ //console.log("_clicked");
15
+
16
+ let checkedProperty = this.getDynamicProp("checked");
17
+ let newValue = this.getPropValueWithDefault("preventUncheck", false) ? true : !checkedProperty.value;
18
+ checkedProperty.getMostUpstreamProperty().setValue(newValue);
19
+ }
20
+
21
+ _renderMainElement() {
22
+
23
+ let checkedProperty = this.getDynamicProp("checked");
24
+
25
+ return React.createElement(Dbm.react.context.AddContextVariables, {values: {selected: checkedProperty}},
26
+ React.createElement(Dbm.react.interaction.CommandButton, {"command": this._clickedCommand},
27
+ this.getPropValue("children")
28
+ )
29
+ );
30
+ }
31
+ }
32
+
@@ -15,7 +15,7 @@ export default class ClickOutsideTrigger extends Dbm.react.BaseObject {
15
15
  if(!commands) {
16
16
  commands = this.getPropValue("command");
17
17
  }
18
- if(commands) {
18
+ if(commands && this.getPropValueWithoutNull("active")) {
19
19
  let currentElement = this.item["mainElement"];
20
20
  if(!currentElement.contains(aEvent.srcElement)) {
21
21
  commands = Dbm.utils.ArrayFunctions.singleOrArray(commands);
@@ -6,4 +6,5 @@ export {default as CommandButton} from "./CommandButton.js";
6
6
  export {default as ConfirmButton} from "./ConfirmButton.js";
7
7
  export {default as ClickOutsideTrigger} from "./ClickOutsideTrigger.js";
8
8
  export {default as HoverArea} from "./HoverArea.js";
9
- export {default as HoverDropdown} from "./HoverDropdown.js";
9
+ export {default as HoverDropdown} from "./HoverDropdown.js";
10
+ export {default as Checked} from "./Checked.js";
@@ -1,5 +1,4 @@
1
1
  import Dbm from "../../index.js";
2
- import React from "react";
3
2
 
4
3
  export default class GlobalFilters extends Dbm.core.BaseObject {
5
4
  _construct() {
@@ -18,9 +17,9 @@ export default class GlobalFilters extends Dbm.core.BaseObject {
18
17
  console.log("_updateStyles");
19
18
 
20
19
  let colorFilters = Dbm.getRepositoryItem("globalSvg");
21
- console.log(colorFilters.filters.length);
22
20
 
23
21
  if(colorFilters.filters.length) {
22
+
24
23
  if(!this._styleTag) {
25
24
  this._styleTag = document.createElement("style");
26
25
  document.head.appendChild(this._styleTag);
@@ -28,7 +27,8 @@ export default class GlobalFilters extends Dbm.core.BaseObject {
28
27
 
29
28
  let declarations = Dbm.utils.ArrayFunctions.mapField(colorFilters.filters, "classDeclaration");
30
29
  this._styleTag.innerHTML = declarations.join("\n");
31
- console.log(declarations);
30
+
31
+
32
32
  }
33
33
  }
34
34
  }
@@ -0,0 +1,42 @@
1
+ import Dbm from "../../index.js";
2
+ import React from "react";
3
+
4
+ export default class BlendColorFilter extends Dbm.react.BaseObject {
5
+ _construct() {
6
+ super._construct();
7
+ }
8
+
9
+ _removedUsedProps(aProps) {
10
+ delete aProps["id"];
11
+ delete aProps["color"];
12
+ delete aProps["blendMode"];
13
+ delete aProps["saturation"];
14
+ delete aProps["min"];
15
+ delete aProps["max"];
16
+ }
17
+
18
+ _renderMainElement() {
19
+
20
+ let id = this.getPropValue("id");
21
+ let color = this.getPropValue("color");
22
+
23
+ let blendMode = this.getPropValueWithoutNull("blendMode", "multiply");
24
+ let saturation = this.getPropValueWithoutNull("saturation", 0);
25
+ let min = this.getPropValueWithoutNull("min", 0);
26
+ let max = this.getPropValueWithoutNull("max", 1);
27
+
28
+ let scale = max-min;
29
+
30
+ //MENOTE: React converts floodColor to flood-color
31
+ return this._createMainElement("filter", {id: id, colorInterpolationFilters: "sRGB", x: "0%", y: "0%", width: "100%", height: "100%"},
32
+ React.createElement("feColorMatrix", {type: "saturate", values: saturation, result: "saturated"}),
33
+ React.createElement("feComponentTransfer", {in: "saturated", result: "scaled"},
34
+ React.createElement("feFuncR", {type: "linear", slope: scale, intercept: min}),
35
+ React.createElement("feFuncG", {type: "linear", slope: scale, intercept: min}),
36
+ React.createElement("feFuncB", {type: "linear", slope: scale, intercept: min}),
37
+ ),
38
+ React.createElement("feFlood", {floodColor: color, result: "tint", floodOpacity: "1", x: "0%", y: "0%", width: "100%", height: "100%"}),
39
+ React.createElement("feBlend", {in: "scaled", in2: "tint", mode: blendMode})
40
+ );
41
+ }
42
+ }
@@ -11,7 +11,7 @@ export default class GlobalFilters extends Dbm.react.BaseObject {
11
11
  let colorFilters = Dbm.getRepositoryItem("globalSvg");
12
12
  colorFilters.requireProperty("filters", []);
13
13
 
14
- return this._createMainElement("svg", {xmlns: "http://www.w3.org/2000/svg", style: {display: "none"}},
14
+ return this._createMainElement("svg", {xmlns: "http://www.w3.org/2000/svg", style: {width: 0, height: 0, display: "block"}, "aria-hidden": 'true'},
15
15
  React.createElement("defs", null,
16
16
  React.createElement(Dbm.react.area.List, {items: colorFilters.properties.filters},
17
17
  React.createElement(Dbm.react.area.InsertElement, {element: Dbm.react.source.item("element")})
@@ -16,10 +16,8 @@ export default class MatrixFilter extends Dbm.react.BaseObject {
16
16
  let id = this.getPropValue("id");
17
17
  let matrix = this.getPropValue("matrix");
18
18
 
19
- console.log(id);
20
-
21
19
  return this._createMainElement("filter", {id: id},
22
- React.createElement("feColorMatrix", {type: "matrix", values: matrix})
20
+ React.createElement("feColorMatrix", {type: "matrix", values: matrix, "colorInterpolationFilters": "sRGB"})
23
21
  );
24
22
  }
25
23
  }
@@ -3,6 +3,7 @@ import React from "react";
3
3
 
4
4
  export {default as GlobalFilters} from "./GlobalFilters.js";
5
5
  export {default as MatrixFilter} from "./MatrixFilter.js";
6
+ export {default as BlendColorFilter} from "./BlendColorFilter.js";
6
7
  export {default as AddGlobalFilterClasses} from "./AddGlobalFilterClasses.js";
7
8
 
8
9
  export const addGlobalRgbColorFilter = function(aName, aR, aG, aB) {
@@ -42,4 +43,23 @@ export const addGlobalHexColorFilter = function(aName, aColor) {
42
43
  let b = value & 255;
43
44
 
44
45
  return addGlobalRgbColorFilter(aName, r, g, b)
46
+ }
47
+
48
+ export const createGlobalHexBlendFilter = function(aName, aColor, aBlendMode = "multiply", aSaturation = 0, aMin = 0, aMax = 1) {
49
+ let colorFilters = Dbm.getRepositoryItem("globalSvg");
50
+ colorFilters.requireProperty("filters", []);
51
+
52
+ let item = Dbm.getRepositoryItem("globalSvg/filters/" + aName);
53
+ item.setValue("element", React.createElement(Dbm.react.svg.BlendColorFilter, {"id": aName, "color": aColor, "blendMode": aBlendMode, "saturation": aSaturation, "min": aMin, "max": aMax}));
54
+ item.setValue("classDeclaration", "." + aName + "{filter:url(\"#" + aName + "\")}");
55
+
56
+ let filters = [].concat(colorFilters.filters);
57
+ filters.push(item);
58
+ colorFilters.filters = filters;
59
+
60
+ return item;
61
+ }
62
+
63
+ export const createGlobalRgbBlendFilter = function(aName, aR, aG, aB, aBlendMode = "multiply", aSaturation = 0, aMin = 0, aMax = 1) {
64
+ return createGlobalHexBlendFilter(aName, "rgb(" + aR + ", " + aG +", " + aB + ")", aBlendMode, aSaturation, aMin, aMax);
45
65
  }
@@ -25,4 +25,8 @@ export const htmlText = function(aText, aElementType = "span", aAdditionalProps
25
25
 
26
26
  export const translatedText = function(aText, aTextId) {
27
27
  return createElement(Dbm.react.text.TranslatedText, {text: aText, textId: aTextId});
28
+ }
29
+
30
+ export const blockDataText = function(aFieldName) {
31
+ return createElement(Dbm.react.text.Text, {text: Dbm.react.source.blockData(aFieldName)});
28
32
  }
@@ -13,6 +13,14 @@ export default class Item extends Dbm.core.LifeCycleObject {
13
13
  return this._id;
14
14
  }
15
15
 
16
+ set id(aValue) {
17
+ console.warn("Use setId instead");
18
+ debugger;
19
+ this.setId(aValue);
20
+
21
+ return this._id;
22
+ }
23
+
16
24
  register(aId) {
17
25
  this.setId(aId);
18
26
  Dbm.getInstance().repository.addItem(this);
@@ -0,0 +1,10 @@
1
+ import Dbm from "../../index.js";
2
+
3
+ export const getObjectTypeEditor = function(aTypeName) {
4
+ let objectTypeEditor = Dbm.repository.getItem("admin/objectTypeEditors/" + aTypeName);
5
+ if(!objectTypeEditor.editors) {
6
+ objectTypeEditor.setValue("editors", []);
7
+ }
8
+
9
+ return objectTypeEditor;
10
+ }