@gogocat/data-bind 1.12.0 → 2.0.0
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/.editorconfig +14 -14
- package/.vscode/launch.json +12 -12
- package/CONFIGURATION.md +294 -0
- package/REACTIVE_MODE.md +553 -0
- package/README.md +266 -829
- package/babel.config.json +30 -0
- package/dist/js/_escape.d.ts +14 -0
- package/dist/js/_escape.d.ts.map +1 -0
- package/dist/js/applyBinding.d.ts +11 -0
- package/dist/js/applyBinding.d.ts.map +1 -0
- package/dist/js/attrBinding.d.ts +12 -0
- package/dist/js/attrBinding.d.ts.map +1 -0
- package/dist/js/binder.d.ts +67 -0
- package/dist/js/binder.d.ts.map +1 -0
- package/dist/js/changeBinding.d.ts +19 -0
- package/dist/js/changeBinding.d.ts.map +1 -0
- package/dist/js/commentWrapper.d.ts +39 -0
- package/dist/js/commentWrapper.d.ts.map +1 -0
- package/dist/js/config.d.ts +55 -0
- package/dist/js/config.d.ts.map +1 -0
- package/dist/js/createBindingOption.d.ts +32 -0
- package/dist/js/createBindingOption.d.ts.map +1 -0
- package/dist/js/createEventBinding.d.ts +10 -0
- package/dist/js/createEventBinding.d.ts.map +1 -0
- package/dist/js/cssBinding.d.ts +15 -0
- package/dist/js/cssBinding.d.ts.map +1 -0
- package/dist/js/dataBind.js +2756 -2530
- package/dist/js/dataBind.min.js +8 -1
- package/dist/js/dataBind.min.js.map +1 -1
- package/dist/js/domWalker.d.ts +9 -0
- package/dist/js/domWalker.d.ts.map +1 -0
- package/dist/js/forOfBinding.d.ts +12 -0
- package/dist/js/forOfBinding.d.ts.map +1 -0
- package/dist/js/hoverBinding.d.ts +13 -0
- package/dist/js/hoverBinding.d.ts.map +1 -0
- package/dist/js/ifBinding.d.ts +12 -0
- package/dist/js/ifBinding.d.ts.map +1 -0
- package/dist/js/index.d.ts +10 -0
- package/dist/js/index.d.ts.map +1 -0
- package/dist/js/modelBinding.d.ts +12 -0
- package/dist/js/modelBinding.d.ts.map +1 -0
- package/dist/js/postProcess.d.ts +3 -0
- package/dist/js/postProcess.d.ts.map +1 -0
- package/dist/js/pubSub.d.ts +11 -0
- package/dist/js/pubSub.d.ts.map +1 -0
- package/dist/js/reactiveProxy.d.ts +28 -0
- package/dist/js/reactiveProxy.d.ts.map +1 -0
- package/dist/js/renderForOfBinding.d.ts +8 -0
- package/dist/js/renderForOfBinding.d.ts.map +1 -0
- package/dist/js/renderIfBinding.d.ts +22 -0
- package/dist/js/renderIfBinding.d.ts.map +1 -0
- package/dist/js/renderIteration.d.ts +16 -0
- package/dist/js/renderIteration.d.ts.map +1 -0
- package/dist/js/renderTemplate.d.ts +14 -0
- package/dist/js/renderTemplate.d.ts.map +1 -0
- package/dist/js/renderTemplatesBinding.d.ts +19 -0
- package/dist/js/renderTemplatesBinding.d.ts.map +1 -0
- package/dist/js/showBinding.d.ts +13 -0
- package/dist/js/showBinding.d.ts.map +1 -0
- package/dist/js/switchBinding.d.ts +13 -0
- package/dist/js/switchBinding.d.ts.map +1 -0
- package/dist/js/textBinding.d.ts +13 -0
- package/dist/js/textBinding.d.ts.map +1 -0
- package/dist/js/types/_escape.d.ts +14 -0
- package/dist/js/types/_escape.d.ts.map +1 -0
- package/dist/js/types/applyBinding.d.ts +11 -0
- package/dist/js/types/applyBinding.d.ts.map +1 -0
- package/dist/js/types/attrBinding.d.ts +12 -0
- package/dist/js/types/attrBinding.d.ts.map +1 -0
- package/dist/js/types/binder.d.ts +67 -0
- package/dist/js/types/binder.d.ts.map +1 -0
- package/dist/js/types/changeBinding.d.ts +19 -0
- package/dist/js/types/changeBinding.d.ts.map +1 -0
- package/dist/js/types/commentWrapper.d.ts +39 -0
- package/dist/js/types/commentWrapper.d.ts.map +1 -0
- package/dist/js/types/config.d.ts +55 -0
- package/dist/js/types/config.d.ts.map +1 -0
- package/dist/js/types/createBindingOption.d.ts +32 -0
- package/dist/js/types/createBindingOption.d.ts.map +1 -0
- package/dist/js/types/createEventBinding.d.ts +10 -0
- package/dist/js/types/createEventBinding.d.ts.map +1 -0
- package/dist/js/types/cssBinding.d.ts +15 -0
- package/dist/js/types/cssBinding.d.ts.map +1 -0
- package/dist/js/types/domWalker.d.ts +9 -0
- package/dist/js/types/domWalker.d.ts.map +1 -0
- package/dist/js/types/forOfBinding.d.ts +12 -0
- package/dist/js/types/forOfBinding.d.ts.map +1 -0
- package/dist/js/types/hoverBinding.d.ts +13 -0
- package/dist/js/types/hoverBinding.d.ts.map +1 -0
- package/dist/js/types/ifBinding.d.ts +12 -0
- package/dist/js/types/ifBinding.d.ts.map +1 -0
- package/dist/js/types/index.d.ts +10 -0
- package/dist/js/types/index.d.ts.map +1 -0
- package/dist/js/types/modelBinding.d.ts +12 -0
- package/dist/js/types/modelBinding.d.ts.map +1 -0
- package/dist/js/types/postProcess.d.ts +3 -0
- package/dist/js/types/postProcess.d.ts.map +1 -0
- package/dist/js/types/pubSub.d.ts +11 -0
- package/dist/js/types/pubSub.d.ts.map +1 -0
- package/dist/js/types/reactiveProxy.d.ts +28 -0
- package/dist/js/types/reactiveProxy.d.ts.map +1 -0
- package/dist/js/types/renderForOfBinding.d.ts +8 -0
- package/dist/js/types/renderForOfBinding.d.ts.map +1 -0
- package/dist/js/types/renderIfBinding.d.ts +22 -0
- package/dist/js/types/renderIfBinding.d.ts.map +1 -0
- package/dist/js/types/renderIteration.d.ts +16 -0
- package/dist/js/types/renderIteration.d.ts.map +1 -0
- package/dist/js/types/renderTemplate.d.ts +14 -0
- package/dist/js/types/renderTemplate.d.ts.map +1 -0
- package/dist/js/types/renderTemplatesBinding.d.ts +19 -0
- package/dist/js/types/renderTemplatesBinding.d.ts.map +1 -0
- package/dist/js/types/showBinding.d.ts +13 -0
- package/dist/js/types/showBinding.d.ts.map +1 -0
- package/dist/js/types/switchBinding.d.ts +13 -0
- package/dist/js/types/switchBinding.d.ts.map +1 -0
- package/dist/js/types/textBinding.d.ts +13 -0
- package/dist/js/types/textBinding.d.ts.map +1 -0
- package/dist/js/types/types.d.ts +111 -0
- package/dist/js/types/types.d.ts.map +1 -0
- package/dist/js/types/util.d.ts +119 -0
- package/dist/js/types/util.d.ts.map +1 -0
- package/dist/js/types.d.ts +111 -0
- package/dist/js/types.d.ts.map +1 -0
- package/dist/js/util.d.ts +119 -0
- package/dist/js/util.d.ts.map +1 -0
- package/eslint.config.js +124 -0
- package/examples/DBMONSTER_COMPARISON.md +123 -0
- package/examples/afterRenderDemo.html +119 -0
- package/examples/bootstrap/css/animate.css +1579 -1579
- package/examples/bootstrap/css/bootstrap.min.css +6 -6
- package/examples/bootstrap/css/homeservices.css +378 -390
- package/examples/bootstrap/css/open-iconic.css +511 -511
- package/examples/bootstrap/fonts/open-iconic.svg +543 -543
- package/examples/bootstrap/js/compMessageDialog.js +20 -19
- package/examples/bootstrap/js/compSearchBar.js +12 -19
- package/examples/bootstrap/js/compSearchResults.js +50 -46
- package/examples/bootstrap/js/featureAdsResult.json +65 -65
- package/examples/bootstrap/js/searchResult.json +57 -57
- package/examples/bootstrap.html +343 -332
- package/examples/css/baseTodo.css +141 -141
- package/examples/css/dbMonsterStyles.css +27 -27
- package/examples/css/indexTodo.css +374 -374
- package/examples/dbmonsterForOfReactive.html +40 -0
- package/examples/dbmonsterReact.html +19 -0
- package/examples/forOfBindingSimpleDebug.html +45 -0
- package/examples/globalConfig.html +131 -0
- package/examples/js/afterRenderDemo.js +190 -0
- package/examples/js/appTodo.js +46 -46
- package/examples/js/attrBindingDemo.js +2 -2
- package/examples/js/dbMonApp.js +24 -26
- package/examples/js/dbMonAppReact.jsx +79 -0
- package/examples/js/dbMonAppReactive.js +28 -0
- package/examples/js/fiberDemo.js +4 -4
- package/examples/js/filtersDemo.js +8 -8
- package/examples/js/forOfDemo.js +7 -9
- package/examples/js/forOfDemoComplex.js +44 -17
- package/examples/js/form.js +14 -14
- package/examples/js/globalConfig.js +117 -0
- package/examples/js/ifBindingDemo.js +16 -16
- package/examples/js/reactiveDemo.js +119 -0
- package/examples/js/switchBindingDemo.js +8 -8
- package/examples/react-dbmonster/dist/bundle.js +43 -0
- package/examples/react-dbmonster/package-lock.json +537 -0
- package/examples/react-dbmonster/package.json +16 -0
- package/examples/react-dbmonster/src/index.jsx +80 -0
- package/examples/reactiveDemo.html +127 -0
- package/examples/refreshRateTest.html +75 -75
- package/index.html +841 -0
- package/package.json +31 -34
- package/rollup.config.js +79 -36
- package/src/{_escape.js → _escape.ts} +19 -17
- package/src/{applyBinding.js → applyBinding.ts} +27 -18
- package/src/{attrBinding.js → attrBinding.ts} +14 -13
- package/src/{binder.js → binder.ts} +289 -181
- package/src/changeBinding.ts +93 -0
- package/src/{commentWrapper.js → commentWrapper.ts} +33 -30
- package/src/config.ts +107 -0
- package/src/{createBindingOption.js → createBindingOption.ts} +39 -15
- package/src/createEventBinding.ts +88 -0
- package/src/{cssBinding.js → cssBinding.ts} +13 -11
- package/src/{domWalker.js → domWalker.ts} +44 -30
- package/src/{forOfBinding.js → forOfBinding.ts} +4 -3
- package/src/hoverBinding.ts +84 -0
- package/src/{ifBinding.js → ifBinding.ts} +14 -12
- package/src/index.ts +53 -0
- package/src/{modelBinding.js → modelBinding.ts} +11 -9
- package/src/{postProcess.js → postProcess.ts} +6 -4
- package/src/{pubSub.js → pubSub.ts} +24 -21
- package/src/reactiveProxy.ts +285 -0
- package/src/{renderForOfBinding.js → renderForOfBinding.ts} +54 -32
- package/src/{renderIfBinding.js → renderIfBinding.ts} +41 -19
- package/src/{renderIteration.js → renderIteration.ts} +24 -8
- package/src/renderTemplate.ts +165 -0
- package/src/renderTemplatesBinding.ts +73 -0
- package/src/{showBinding.js → showBinding.ts} +4 -3
- package/src/{switchBinding.js → switchBinding.ts} +18 -15
- package/src/{textBinding.js → textBinding.ts} +5 -4
- package/src/types.ts +124 -0
- package/src/util.ts +810 -0
- package/test/css/reporter.css +9 -9
- package/test/globals.d.ts +19 -0
- package/test/helpers/testHelper.js +46 -11
- package/test/mocks/featureAdsResult.json +65 -65
- package/test/mocks/searchResult.json +57 -57
- package/test/specs/{attrBinding.spec.js → attrBinding.spec.ts} +103 -106
- package/test/specs/{binder.spec.js → binder.spec.ts} +29 -27
- package/test/specs/blurBinding.spec.ts +60 -0
- package/test/specs/chainableUse.spec.ts +125 -0
- package/test/specs/clickBinding.spec.ts +194 -0
- package/test/specs/{cssBinding.spec.js → cssBinding.spec.ts} +72 -79
- package/test/specs/{dataBindBootstrap.spec.js → dataBindBootstrap.spec.ts} +332 -313
- package/test/specs/{filter.spec.js → filter.spec.ts} +75 -76
- package/test/specs/{forOfBinding.spec.js → forOfBinding.spec.ts} +208 -219
- package/test/specs/formBinding.spec.ts +272 -0
- package/test/specs/ifBinding.spec.ts +165 -0
- package/test/specs/{nestedComponent.spec.js → nestedComponent.spec.ts} +88 -88
- package/test/specs/reactiveProxy.spec.ts +465 -0
- package/test/specs/{showBinding.spec.js → showBinding.spec.ts} +148 -149
- package/test/specs/{switchBinding.spec.js → switchBinding.spec.ts} +172 -173
- package/test/specs/templateBinding.spec.ts +273 -0
- package/test/specs/{textBinding.spec.js → textBinding.spec.ts} +47 -48
- package/test/tsconfig.json +31 -0
- package/test-output.txt +200 -0
- package/test-reactive.html +224 -0
- package/tsconfig.json +28 -0
- package/vendors/lodash.custom.js +4577 -4577
- package/vendors/lodash.custom.min.js +45 -45
- package/vitest.config.js +27 -0
- package/.eslintrc.js +0 -1
- package/.grunt/grunt-contrib-jasmine/boot.js +0 -161
- package/.grunt/grunt-contrib-jasmine/dist/js/dataBind.js +0 -9
- package/.grunt/grunt-contrib-jasmine/grunt-template-jasmine-istanbul/reporter.js +0 -23
- package/.grunt/grunt-contrib-jasmine/jasmine-html.js +0 -853
- package/.grunt/grunt-contrib-jasmine/jasmine.css +0 -271
- package/.grunt/grunt-contrib-jasmine/jasmine.js +0 -9761
- package/.grunt/grunt-contrib-jasmine/jasmine_favicon.png +0 -0
- package/.grunt/grunt-contrib-jasmine/json2.js +0 -489
- package/.grunt/grunt-contrib-jasmine/reporter.js +0 -107
- package/coverage/coverage.json +0 -1
- package/coverage/lcov/lcov-report/base.css +0 -213
- package/coverage/lcov/lcov-report/index.html +0 -93
- package/coverage/lcov/lcov-report/js/dataBind.js.html +0 -6596
- package/coverage/lcov/lcov-report/js/index.html +0 -93
- package/coverage/lcov/lcov-report/prettify.css +0 -1
- package/coverage/lcov/lcov-report/prettify.js +0 -1
- package/coverage/lcov/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov/lcov-report/sorter.js +0 -158
- package/coverage/lcov/lcov.info +0 -1991
- package/eslintrc.json +0 -40
- package/examples/bootstrap/js/bootstrap.min.js +0 -6
- package/examples/bootstrap/js/popper.min.js +0 -5
- package/examples/bootstrap/js/searchSuggestion.js +0 -58
- package/examples/bootstrap/js/typeahead.jquery.js +0 -1538
- package/gruntfile.js +0 -92
- package/gulpfile.js +0 -32
- package/src/applyBindingExport.js +0 -5
- package/src/changeBinding.js +0 -63
- package/src/config.js +0 -66
- package/src/createEventBinding.js +0 -46
- package/src/eventSystem.js +0 -46
- package/src/hoverBinding.js +0 -57
- package/src/index.js +0 -26
- package/src/renderTemplate.js +0 -128
- package/src/renderTemplatesBinding.js +0 -44
- package/src/util.js +0 -648
- package/test/specs/blurBinding.spec.js +0 -57
- package/test/specs/formBinding.spec.js +0 -316
- package/test/specs/ifBinding.spec.js +0 -169
- package/test/specs/templateBinding.spec.js +0 -117
- package/vendors/jasmine-jquery.js +0 -841
- package/vendors/jquery-3.2.1.min.js +0 -4
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// databing message-dialog-component
|
|
2
2
|
|
|
3
|
-
(function(
|
|
3
|
+
(function (window) {
|
|
4
4
|
let compMessageDialog;
|
|
5
5
|
const el = {
|
|
6
|
-
messageModal:
|
|
7
|
-
messageTextArea:
|
|
6
|
+
messageModal: null,
|
|
7
|
+
messageTextArea: null,
|
|
8
8
|
};
|
|
9
9
|
const viewModel = {
|
|
10
10
|
numSelectedProviders: '',
|
|
@@ -13,45 +13,46 @@
|
|
|
13
13
|
selectedProviders: '',
|
|
14
14
|
defaultMessageText: 'Hi,\nCould you please provide a quote for the following work:\n',
|
|
15
15
|
sendingMessage: false,
|
|
16
|
-
onMessageSubmit
|
|
16
|
+
onMessageSubmit(e, formEl, formData) {
|
|
17
17
|
e.preventDefault();
|
|
18
18
|
formData.ids = this.adIds;
|
|
19
19
|
this.sendingMessage = true;
|
|
20
20
|
this.updateStatus();
|
|
21
21
|
console.log('post data: ', formData);
|
|
22
22
|
},
|
|
23
|
-
onTriggerSelectedAds
|
|
23
|
+
onTriggerSelectedAds(selectedAdData) {
|
|
24
24
|
this.selectedAdData = selectedAdData;
|
|
25
25
|
this.numSelectedProviders = selectedAdData.length > 1 ? selectedAdData.length : '';
|
|
26
26
|
this.selectedProviders = selectedAdData.length > 1 ? 'advertisers ID: ' : 'advertiser ID:';
|
|
27
|
-
this.adIds = selectedAdData.map(
|
|
27
|
+
this.adIds = selectedAdData.map((item, index) => {
|
|
28
28
|
return item.id;
|
|
29
29
|
});
|
|
30
30
|
this.selectedProviders += this.adIds.toString();
|
|
31
31
|
this.updateStatus();
|
|
32
32
|
},
|
|
33
|
-
updateStatus
|
|
34
|
-
|
|
33
|
+
updateStatus() {
|
|
34
|
+
// Reactive mode - automatic render!
|
|
35
35
|
},
|
|
36
36
|
};
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
});
|
|
38
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
39
|
+
el.messageModal = document.getElementById('message-modal');
|
|
40
|
+
el.messageTextArea = document.getElementById('message');
|
|
42
41
|
|
|
43
|
-
|
|
44
|
-
compMessageDialog.
|
|
42
|
+
const messageDialogElement = document.querySelector('[data-bind-comp="message-dialog-component"]');
|
|
43
|
+
compMessageDialog = dataBind.init(messageDialogElement, viewModel);
|
|
44
|
+
compMessageDialog.render().then((comp) => {
|
|
45
45
|
const self = comp;
|
|
46
46
|
compMessageDialog.subscribe('TRIGGER-MESSAGE-DIALOG', self.viewModel.onTriggerSelectedAds);
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
// Bootstrap 5 modal events
|
|
49
|
+
el.messageModal.addEventListener('shown.bs.modal', () => {
|
|
50
|
+
el.messageTextArea.defaultValue = self.viewModel.defaultMessageText;
|
|
50
51
|
el.messageTextArea.focus();
|
|
51
52
|
});
|
|
52
53
|
|
|
53
|
-
el.messageModal.
|
|
54
|
-
el.messageTextArea
|
|
54
|
+
el.messageModal.addEventListener('hidden.bs.modal', () => {
|
|
55
|
+
el.messageTextArea.defaultValue = self.viewModel.defaultMessageText;
|
|
55
56
|
self.viewModel.sendingMessage = false;
|
|
56
57
|
});
|
|
57
58
|
// for debug only
|
|
@@ -60,4 +61,4 @@
|
|
|
60
61
|
console.log('compMessageDialog rendered', window.compMessageDialog);
|
|
61
62
|
});
|
|
62
63
|
});
|
|
63
|
-
})(
|
|
64
|
+
})(window);
|
|
@@ -1,27 +1,19 @@
|
|
|
1
1
|
// databing search-bar
|
|
2
2
|
|
|
3
|
-
(function(
|
|
3
|
+
(function (window) {
|
|
4
4
|
let compSearchBar;
|
|
5
|
-
const getFormData = function($form) {
|
|
6
|
-
const sArray = $form.serializeArray();
|
|
7
|
-
const data = {};
|
|
8
|
-
sArray.map(function(n) {
|
|
9
|
-
data[n['name']] = n['value'];
|
|
10
|
-
});
|
|
11
5
|
|
|
12
|
-
return data;
|
|
13
|
-
};
|
|
14
6
|
const viewModel = {
|
|
15
7
|
searchWord: '',
|
|
16
8
|
searchLocation: '',
|
|
17
9
|
searching: false,
|
|
18
|
-
onSearchWordChange
|
|
10
|
+
onSearchWordChange(e, el, newValue, oldValue) {
|
|
19
11
|
console.log('onSearchWordChange: ', ' newValue: ', newValue, ' oldValue: ', oldValue);
|
|
20
12
|
},
|
|
21
|
-
onSearchLocationChange
|
|
13
|
+
onSearchLocationChange(e, el, newValue, oldValue) {
|
|
22
14
|
console.log('onSearchWordChange: ', ' newValue: ', newValue, ' oldValue: ', oldValue);
|
|
23
15
|
},
|
|
24
|
-
onSearchSubmit
|
|
16
|
+
onSearchSubmit(e, form, formData) {
|
|
25
17
|
e.preventDefault();
|
|
26
18
|
|
|
27
19
|
// simple validation
|
|
@@ -36,18 +28,19 @@
|
|
|
36
28
|
this.updateStatus();
|
|
37
29
|
console.log('onSearchSubmit: ', formData);
|
|
38
30
|
},
|
|
39
|
-
onSearchCompleted
|
|
31
|
+
onSearchCompleted() {
|
|
40
32
|
this.searching = false;
|
|
41
33
|
this.updateStatus();
|
|
42
34
|
},
|
|
43
|
-
updateStatus
|
|
44
|
-
|
|
35
|
+
updateStatus() {
|
|
36
|
+
// Reactive mode - automatic render!
|
|
45
37
|
},
|
|
46
38
|
};
|
|
47
39
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
compSearchBar.
|
|
40
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
41
|
+
const searchBarElement = document.querySelector('[data-bind-comp="search-bar"]');
|
|
42
|
+
compSearchBar = dataBind.init(searchBarElement, viewModel);
|
|
43
|
+
compSearchBar.render().then((comp) => {
|
|
51
44
|
const self = comp;
|
|
52
45
|
compSearchBar.subscribe('SEARCH-COMPLETED', self.viewModel.onSearchCompleted);
|
|
53
46
|
// for debug only
|
|
@@ -57,4 +50,4 @@
|
|
|
57
50
|
console.log('compSearchBar rendered', window.compSearchBar);
|
|
58
51
|
});
|
|
59
52
|
});
|
|
60
|
-
})(
|
|
53
|
+
})(window);
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
// databing compSearchResults
|
|
2
2
|
|
|
3
|
-
(function(
|
|
3
|
+
(function (window) {
|
|
4
4
|
const isGithubPage = window.location.hostname === 'gogocat.github.io';
|
|
5
5
|
const examplePath = isGithubPage ? 'https://gogocat.github.io/dataBind/examples/' : '/examples/';
|
|
6
6
|
let compSearchResults;
|
|
7
7
|
const searchUrl = `${examplePath}/bootstrap/js/searchResult.json`;
|
|
8
8
|
const featureAdsResultUrl = `${examplePath}/bootstrap/js/featureAdsResult.json`;
|
|
9
|
-
const
|
|
10
|
-
const converResultsData = function(data) {
|
|
11
|
-
ret = [];
|
|
12
|
-
data.forEach(
|
|
13
|
-
const newItem =
|
|
9
|
+
const searchResultColumns = document.getElementById('search-result-columns');
|
|
10
|
+
const converResultsData = function (data) {
|
|
11
|
+
const ret = [];
|
|
12
|
+
data.forEach((item, index) => {
|
|
13
|
+
const newItem = Object.assign({}, item);
|
|
14
14
|
if (newItem.bookmarked) {
|
|
15
15
|
newItem.bookmarkedCss = 'active';
|
|
16
16
|
}
|
|
@@ -33,51 +33,52 @@
|
|
|
33
33
|
replacedInitResults: false,
|
|
34
34
|
isNewSearch: false,
|
|
35
35
|
currentQuery: null,
|
|
36
|
-
getSearchResults
|
|
36
|
+
getSearchResults(formData) {
|
|
37
37
|
const self = this;
|
|
38
38
|
|
|
39
39
|
this.isNewSearch = JSON.stringify(self.currentQuery) !== JSON.stringify(formData);
|
|
40
40
|
|
|
41
41
|
self.currentQuery = formData;
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
.
|
|
43
|
+
fetch(searchUrl)
|
|
44
|
+
.then(response => response.json())
|
|
45
|
+
.then((data) => {
|
|
45
46
|
// mock network delay
|
|
46
|
-
setTimeout(
|
|
47
|
+
setTimeout(() => {
|
|
47
48
|
self.loading = false;
|
|
48
49
|
self.onSearchResult(data);
|
|
49
50
|
compSearchResults.publish('SEARCH-COMPLETED', data);
|
|
50
51
|
}, 1000);
|
|
51
52
|
})
|
|
52
|
-
.
|
|
53
|
+
.catch((error) => {
|
|
53
54
|
self.loading = false;
|
|
54
55
|
compSearchResults.publish('SEARCH-COMPLETED', {
|
|
55
|
-
fail:
|
|
56
|
+
fail: error,
|
|
56
57
|
});
|
|
57
|
-
self.logError(
|
|
58
|
+
self.logError(error);
|
|
58
59
|
});
|
|
59
60
|
},
|
|
60
|
-
getMessageCheckBoxAttr
|
|
61
|
+
getMessageCheckBoxAttr(data) {
|
|
61
62
|
return {
|
|
62
63
|
id: data.id,
|
|
63
64
|
name: data.id,
|
|
64
65
|
};
|
|
65
66
|
},
|
|
66
|
-
getMessageCheckBoxLabelAttr
|
|
67
|
+
getMessageCheckBoxLabelAttr(data) {
|
|
67
68
|
return {
|
|
68
69
|
for: data.id,
|
|
69
70
|
};
|
|
70
71
|
},
|
|
71
|
-
onSearchResult
|
|
72
|
+
onSearchResult(data) {
|
|
72
73
|
let newResults = [];
|
|
73
74
|
|
|
74
75
|
if (this.isNewSearch) {
|
|
75
|
-
|
|
76
|
+
searchResultColumns.innerHTML = '';
|
|
76
77
|
this.searchResults.length = 0;
|
|
77
78
|
}
|
|
78
79
|
// first search result - remove current results (featured items)
|
|
79
80
|
if (compSearchResults.isServerRendered && !this.replacedInitResults) {
|
|
80
|
-
//
|
|
81
|
+
// searchResultColumns.innerHTML = '';
|
|
81
82
|
this.searchResultTitle = 'Search results';
|
|
82
83
|
// this.searchResults.length = 0;
|
|
83
84
|
this.replacedInitResults = true;
|
|
@@ -99,35 +100,35 @@
|
|
|
99
100
|
|
|
100
101
|
console.log('onSearchResult: ', data);
|
|
101
102
|
},
|
|
102
|
-
logError
|
|
103
|
-
|
|
103
|
+
logError() {
|
|
104
|
+
|
|
104
105
|
console.warn('search result error: ', arguments);
|
|
105
106
|
},
|
|
106
|
-
onMoreResults
|
|
107
|
+
onMoreResults() {
|
|
107
108
|
// get same mock result as example only
|
|
108
109
|
this.loading = true;
|
|
109
110
|
this.updateStatus();
|
|
110
111
|
this.getSearchResults();
|
|
111
112
|
},
|
|
112
|
-
onAdBookmarkClick
|
|
113
|
+
onAdBookmarkClick(e, el) {
|
|
113
114
|
const activeCss = 'active';
|
|
114
|
-
const isActivated =
|
|
115
|
-
const resultIndex =
|
|
115
|
+
const isActivated = el.classList.contains(activeCss);
|
|
116
|
+
const resultIndex = el.getAttribute('data-index');
|
|
116
117
|
|
|
117
118
|
this.searchResults[resultIndex].bookmarked = !isActivated;
|
|
118
119
|
this.searchResults[resultIndex].bookmarkedCss = isActivated ? '' : 'active';
|
|
119
120
|
this.updateStatus();
|
|
120
121
|
},
|
|
121
|
-
onAdMessageCheck
|
|
122
|
-
console.log('onAdMessageCheck: ',
|
|
122
|
+
onAdMessageCheck(e, el, newValue, oldValue) {
|
|
123
|
+
console.log('onAdMessageCheck: ', el, newValue, oldValue);
|
|
123
124
|
this.updateStatus();
|
|
124
125
|
},
|
|
125
|
-
onMessageTriggerClick
|
|
126
|
+
onMessageTriggerClick(e, el) {
|
|
126
127
|
compSearchResults.publish('TRIGGER-MESSAGE-DIALOG', this.selectedResults);
|
|
127
|
-
console.log('onMessageTriggerClick: ',
|
|
128
|
+
console.log('onMessageTriggerClick: ', el);
|
|
128
129
|
},
|
|
129
|
-
updateStatus
|
|
130
|
-
this.selectedResults = this.searchResults.filter(
|
|
130
|
+
updateStatus(opt) {
|
|
131
|
+
this.selectedResults = this.searchResults.filter((result, index) => {
|
|
131
132
|
return result.selected;
|
|
132
133
|
});
|
|
133
134
|
this.messageTriggerCss = this.selectedResults.length ? 'show' : '';
|
|
@@ -136,20 +137,23 @@
|
|
|
136
137
|
};
|
|
137
138
|
|
|
138
139
|
// get server rendered featureAdsResults then init compSearchResults
|
|
139
|
-
|
|
140
|
-
|
|
140
|
+
fetch(featureAdsResultUrl)
|
|
141
|
+
.then(response => response.json())
|
|
142
|
+
.then((featureAdsResultData) => {
|
|
143
|
+
viewModel.searchResults = converResultsData(featureAdsResultData);
|
|
141
144
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
})
|
|
145
|
+
const searchResultsElement = document.querySelector('[data-bind-comp="search-results-component"]');
|
|
146
|
+
compSearchResults = dataBind.init(searchResultsElement, viewModel);
|
|
147
|
+
compSearchResults
|
|
148
|
+
.render() // overwrite default server rendered option
|
|
149
|
+
.then((comp) => {
|
|
150
|
+
const self = comp;
|
|
151
|
+
// subscribe events
|
|
152
|
+
compSearchResults.subscribe('SEARCH-AD', self.viewModel.getSearchResults);
|
|
153
|
+
// for debug only
|
|
154
|
+
window.compSearchResultsViewModel = self.viewModel;
|
|
155
|
+
window.compSearchResults = compSearchResults;
|
|
156
|
+
console.log('compSearchResults rendered', window.compSearchResults);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
})(window);
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
[{
|
|
2
|
-
"id": "001",
|
|
3
|
-
"title": "Card title that wraps to a new line",
|
|
4
|
-
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
5
|
-
"image": "bootstrap/images/pic-home.jpg",
|
|
6
|
-
"bookmarked": false,
|
|
7
|
-
"numLikes": 110
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"id": "002",
|
|
11
|
-
"title": "Card title",
|
|
12
|
-
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
13
|
-
"image": "",
|
|
14
|
-
"bookmarked": false,
|
|
15
|
-
"numLikes": 9
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"id": "003",
|
|
19
|
-
"title": "Card title",
|
|
20
|
-
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
21
|
-
"image": "bootstrap/images/pic-deck.jpg",
|
|
22
|
-
"bookmarked": false,
|
|
23
|
-
"numLikes": 8
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"id": "004",
|
|
27
|
-
"title": "Card title",
|
|
28
|
-
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
29
|
-
"image": "bootstrap/images/pic-carpenter.jpg",
|
|
30
|
-
"bookmarked": false,
|
|
31
|
-
"numLikes": 8,
|
|
32
|
-
"highlight": true
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"id": "005",
|
|
36
|
-
"title": "Card title",
|
|
37
|
-
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
38
|
-
"image": "",
|
|
39
|
-
"bookmarked": false,
|
|
40
|
-
"numLikes": 68
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"id": "006",
|
|
44
|
-
"title": "Card title that wraps to a new line",
|
|
45
|
-
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
46
|
-
"image": "bootstrap/images/pic-bathrooms.jpg",
|
|
47
|
-
"bookmarked": true,
|
|
48
|
-
"numLikes": 99
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"id": "007",
|
|
52
|
-
"title": "Card title",
|
|
53
|
-
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
54
|
-
"image": "",
|
|
55
|
-
"bookmarked": false,
|
|
56
|
-
"numLikes": 9
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"id": "008",
|
|
60
|
-
"title": "Card title",
|
|
61
|
-
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
62
|
-
"image": "bootstrap/images/pic-backyard.jpg",
|
|
63
|
-
"bookmarked": false,
|
|
64
|
-
"numLikes": 24
|
|
65
|
-
}
|
|
1
|
+
[{
|
|
2
|
+
"id": "001",
|
|
3
|
+
"title": "Card title that wraps to a new line",
|
|
4
|
+
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
5
|
+
"image": "bootstrap/images/pic-home.jpg",
|
|
6
|
+
"bookmarked": false,
|
|
7
|
+
"numLikes": 110
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "002",
|
|
11
|
+
"title": "Card title",
|
|
12
|
+
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
13
|
+
"image": "",
|
|
14
|
+
"bookmarked": false,
|
|
15
|
+
"numLikes": 9
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "003",
|
|
19
|
+
"title": "Card title",
|
|
20
|
+
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
21
|
+
"image": "bootstrap/images/pic-deck.jpg",
|
|
22
|
+
"bookmarked": false,
|
|
23
|
+
"numLikes": 8
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "004",
|
|
27
|
+
"title": "Card title",
|
|
28
|
+
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
29
|
+
"image": "bootstrap/images/pic-carpenter.jpg",
|
|
30
|
+
"bookmarked": false,
|
|
31
|
+
"numLikes": 8,
|
|
32
|
+
"highlight": true
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "005",
|
|
36
|
+
"title": "Card title",
|
|
37
|
+
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
38
|
+
"image": "",
|
|
39
|
+
"bookmarked": false,
|
|
40
|
+
"numLikes": 68
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "006",
|
|
44
|
+
"title": "Card title that wraps to a new line",
|
|
45
|
+
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
46
|
+
"image": "bootstrap/images/pic-bathrooms.jpg",
|
|
47
|
+
"bookmarked": true,
|
|
48
|
+
"numLikes": 99
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "007",
|
|
52
|
+
"title": "Card title",
|
|
53
|
+
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
54
|
+
"image": "",
|
|
55
|
+
"bookmarked": false,
|
|
56
|
+
"numLikes": 9
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "008",
|
|
60
|
+
"title": "Card title",
|
|
61
|
+
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
62
|
+
"image": "bootstrap/images/pic-backyard.jpg",
|
|
63
|
+
"bookmarked": false,
|
|
64
|
+
"numLikes": 24
|
|
65
|
+
}
|
|
66
66
|
]
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
[{
|
|
2
|
-
"id": "001",
|
|
3
|
-
"title": "Card title that wraps to a new line",
|
|
4
|
-
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
5
|
-
"image": "bootstrap/images/pic-home.jpg",
|
|
6
|
-
"bookmarked": false,
|
|
7
|
-
"numLikes": 110
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"id": "456",
|
|
11
|
-
"title": "Card title",
|
|
12
|
-
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
13
|
-
"image": "",
|
|
14
|
-
"bookmarked": false,
|
|
15
|
-
"numLikes": 8
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"id": "789",
|
|
19
|
-
"title": "Sample carpemter service",
|
|
20
|
-
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
21
|
-
"image": "bootstrap/images/pic-carpenter.jpg",
|
|
22
|
-
"bookmarked": false,
|
|
23
|
-
"numLikes": 8,
|
|
24
|
-
"highlight": true
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"id": "888",
|
|
28
|
-
"title": "Sample timber floor service",
|
|
29
|
-
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
30
|
-
"image": "bootstrap/images/pic-deck.jpg",
|
|
31
|
-
"bookmarked": false,
|
|
32
|
-
"numLikes": 8
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"id": "222",
|
|
36
|
-
"title": "Sample timber floor service",
|
|
37
|
-
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
38
|
-
"image": "",
|
|
39
|
-
"bookmarked": false,
|
|
40
|
-
"numLikes": 8
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"id": "333",
|
|
44
|
-
"title": "Sample boothroom service",
|
|
45
|
-
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
46
|
-
"image": "bootstrap/images/pic-bathrooms.jpg",
|
|
47
|
-
"bookmarked": true,
|
|
48
|
-
"numLikes": 8
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"id": "444",
|
|
52
|
-
"title": "Sample gardening service",
|
|
53
|
-
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
54
|
-
"image": "bootstrap/images/pic-backyard.jpg",
|
|
55
|
-
"bookmarked": false,
|
|
56
|
-
"numLikes": 8
|
|
57
|
-
}
|
|
1
|
+
[{
|
|
2
|
+
"id": "001",
|
|
3
|
+
"title": "Card title that wraps to a new line",
|
|
4
|
+
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
5
|
+
"image": "bootstrap/images/pic-home.jpg",
|
|
6
|
+
"bookmarked": false,
|
|
7
|
+
"numLikes": 110
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "456",
|
|
11
|
+
"title": "Card title",
|
|
12
|
+
"description": "This card has supporting text below as a natural lead-in to additional content.",
|
|
13
|
+
"image": "",
|
|
14
|
+
"bookmarked": false,
|
|
15
|
+
"numLikes": 8
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "789",
|
|
19
|
+
"title": "Sample carpemter service",
|
|
20
|
+
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
21
|
+
"image": "bootstrap/images/pic-carpenter.jpg",
|
|
22
|
+
"bookmarked": false,
|
|
23
|
+
"numLikes": 8,
|
|
24
|
+
"highlight": true
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "888",
|
|
28
|
+
"title": "Sample timber floor service",
|
|
29
|
+
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
30
|
+
"image": "bootstrap/images/pic-deck.jpg",
|
|
31
|
+
"bookmarked": false,
|
|
32
|
+
"numLikes": 8
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "222",
|
|
36
|
+
"title": "Sample timber floor service",
|
|
37
|
+
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
38
|
+
"image": "",
|
|
39
|
+
"bookmarked": false,
|
|
40
|
+
"numLikes": 8
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "333",
|
|
44
|
+
"title": "Sample boothroom service",
|
|
45
|
+
"description": "This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.",
|
|
46
|
+
"image": "bootstrap/images/pic-bathrooms.jpg",
|
|
47
|
+
"bookmarked": true,
|
|
48
|
+
"numLikes": 8
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "444",
|
|
52
|
+
"title": "Sample gardening service",
|
|
53
|
+
"description": "This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.",
|
|
54
|
+
"image": "bootstrap/images/pic-backyard.jpg",
|
|
55
|
+
"bookmarked": false,
|
|
56
|
+
"numLikes": 8
|
|
57
|
+
}
|
|
58
58
|
]
|