neo.mjs 6.18.2 → 6.19.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/README.md +28 -214
- package/apps/ServiceWorker.mjs +2 -2
- package/apps/colors/view/ViewportController.mjs +7 -3
- package/apps/portal/data/blog.json +13 -0
- package/apps/portal/view/HeaderToolbar.mjs +2 -2
- package/apps/portal/view/Viewport.mjs +4 -2
- package/apps/portal/view/ViewportController.mjs +89 -8
- package/apps/portal/view/blog/Container.mjs +8 -8
- package/apps/portal/view/blog/List.mjs +6 -6
- package/apps/portal/view/home/MainContainer.mjs +9 -10
- package/apps/portal/view/home/parts/BaseContainer.mjs +8 -1
- package/apps/portal/view/home/parts/Colors.mjs +4 -4
- package/apps/portal/view/home/parts/Helix.mjs +2 -2
- package/apps/portal/view/home/parts/How.mjs +3 -3
- package/apps/portal/view/home/parts/MainNeo.mjs +6 -7
- package/apps/portal/view/home/parts/References.mjs +88 -0
- package/apps/portal/view/learn/ContentView.mjs +3 -1
- package/apps/portal/view/learn/MainContainer.mjs +3 -2
- package/apps/portal/view/learn/MainContainerController.mjs +11 -0
- package/apps/portal/view/learn/PageContainer.mjs +5 -3
- package/apps/portal/view/services/Component.mjs +73 -0
- package/apps/website/data/blog.json +13 -0
- package/examples/ServiceWorker.mjs +2 -2
- package/examples/component/carousel/MainContainer.mjs +42 -33
- package/examples/layout/cube/MainContainer.mjs +217 -0
- package/examples/layout/cube/app.mjs +6 -0
- package/examples/layout/cube/index.html +11 -0
- package/examples/layout/cube/neo-config.json +6 -0
- package/package.json +7 -7
- package/resources/data/deck/learnneo/pages/2023-10-14T19-25-08-153Z.md +2 -2
- package/resources/data/deck/learnneo/pages/ComponentModels.md +6 -6
- package/resources/data/deck/learnneo/pages/ComponentsAndContainers.md +10 -10
- package/resources/data/deck/learnneo/pages/Config.md +6 -6
- package/resources/data/deck/learnneo/pages/CustomComponents.md +4 -4
- package/resources/data/deck/learnneo/pages/DescribingTheUI.md +4 -4
- package/resources/data/deck/learnneo/pages/Earthquakes-01-goals.md +32 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-01-generate-a-workspace.md +47 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-02-generate-the-starter-app.md +150 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-03-debugging.md +136 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-04-fetch-data.md +146 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-05-refactor-the-table.md +146 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-06-use-a-view-model.md +301 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-07-use-the-google-maps-addon.md +175 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-08-events.md +38 -0
- package/resources/data/deck/learnneo/pages/Earthquakes.md +10 -10
- package/resources/data/deck/learnneo/pages/Events.md +7 -7
- package/resources/data/deck/learnneo/pages/Extending.md +7 -7
- package/resources/data/deck/learnneo/pages/Glossary.md +0 -0
- package/resources/data/deck/learnneo/pages/GuideEvents.md +97 -19
- package/resources/data/deck/learnneo/pages/GuideViewModels.md +21 -21
- package/resources/data/deck/learnneo/pages/References.md +8 -8
- package/resources/data/deck/learnneo/pages/TestLivePreview.md +5 -4
- package/resources/data/deck/learnneo/pages/TodoList.md +9 -9
- package/resources/data/deck/learnneo/pages/Welcome.md +3 -3
- package/resources/data/deck/learnneo/pages/WhyNeo-Multi-Window.md +2 -2
- package/resources/data/deck/learnneo/pages/WhyNeo-Speed.md +2 -2
- package/resources/data/deck/learnneo/tree.json +2 -1
- package/resources/images/apps/portal/neo-references.png +0 -0
- package/resources/scss/src/apps/portal/HeaderToolbar.scss +0 -46
- package/resources/scss/src/apps/portal/Viewport.scss +16 -1
- package/resources/scss/src/apps/portal/blog/Container.scss +7 -7
- package/resources/scss/src/apps/portal/blog/List.scss +20 -16
- package/resources/scss/src/apps/portal/home/parts/BaseContainer.scss +33 -4
- package/resources/scss/src/apps/portal/home/parts/MainNeo.scss +4 -5
- package/resources/scss/src/apps/portal/home/parts/References.scss +46 -0
- package/resources/scss/src/apps/portal/learn/ContentTreeList.scss +20 -0
- package/resources/scss/src/apps/portal/learn/ContentView.scss +4 -0
- package/resources/scss/src/apps/portal/learn/MainContainer.scss +1 -1
- package/resources/scss/src/apps/portal/learn/PageContainer.scss +22 -16
- package/resources/scss/src/apps/portal/services/Component.scss +20 -0
- package/resources/scss/src/{apps/portal/learn → code}/LivePreview.scss +1 -1
- package/resources/scss/src/component/Carousel.scss +21 -0
- package/resources/scss/src/component/Helix.scss +1 -2
- package/resources/scss/src/examples/layout/cube/MainContainer.scss +7 -0
- package/resources/scss/src/layout/Cube.scss +80 -0
- package/resources/scss/src/tab/Container.scss +10 -10
- package/resources/scss/theme-neo-light/apps/portal/blog/Container.scss +3 -0
- package/resources/scss/theme-neo-light/form/field/Search.scss +1 -1
- package/resources/scss/theme-neo-light/tooltip/Base.scss +1 -1
- package/src/DefaultConfig.mjs +2 -2
- package/src/Main.mjs +15 -1
- package/src/Neo.mjs +14 -3
- package/{apps/portal/view/learn → src/code}/LivePreview.mjs +43 -27
- package/src/component/Base.mjs +18 -1
- package/src/container/Base.mjs +3 -1
- package/src/dialog/Base.mjs +1 -2
- package/src/layout/Base.mjs +43 -6
- package/src/layout/Card.mjs +21 -59
- package/src/layout/Cube.mjs +428 -0
- package/src/layout/Fit.mjs +9 -38
- package/src/layout/Flexbox.mjs +16 -17
- package/src/layout/Form.mjs +13 -70
- package/src/layout/Grid.mjs +6 -18
- package/src/main/addon/ResizeObserver.mjs +18 -2
- package/src/main/mixin/DeltaUpdates.mjs +16 -3
- package/src/util/Array.mjs +36 -0
- package/src/vdom/Helper.mjs +328 -445
- package/src/vdom/VNode.mjs +12 -1
- package/test/siesta/siesta.js +16 -1
- package/test/siesta/tests/VdomCalendar.mjs +2111 -37
- package/test/siesta/tests/VdomHelper.mjs +283 -47
- package/test/siesta/tests/vdom/Advanced.mjs +367 -0
- package/test/siesta/tests/vdom/layout/Cube.mjs +189 -0
- package/test/siesta/tests/vdom/table/Container.mjs +133 -0
- package/apps/portal/view/home/parts/HelloWorld.mjs +0 -83
- package/apps/portal/view/home/preview/PageCodeContainer.mjs +0 -55
- package/resources/scss/src/apps/portal/home/preview/PageCodeContainer.scss +0 -115
- package/resources/scss/theme-neo-light/apps/portal/learn/ContentTreeList.scss +0 -23
package/src/container/Base.mjs
CHANGED
package/src/dialog/Base.mjs
CHANGED
@@ -363,12 +363,11 @@ class Base extends Panel {
|
|
363
363
|
await me.render(true);
|
364
364
|
|
365
365
|
let [dialogRect, bodyRect] = await me.getDomRect([me.id, 'document.body']);
|
366
|
-
console.log(dialogRect, bodyRect);
|
367
366
|
|
368
367
|
// Move to cover the animation target
|
369
368
|
await Neo.applyDeltas(appName, {
|
370
369
|
id,
|
371
|
-
style
|
370
|
+
style: {
|
372
371
|
height: `${rect.height}px`,
|
373
372
|
left : `${rect.left }px`,
|
374
373
|
top : `${rect.top }px`,
|
package/src/layout/Base.mjs
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import CoreBase from '../core/Base.mjs';
|
2
|
+
import NeoArray from '../util/Array.mjs';
|
2
3
|
|
3
4
|
/**
|
4
5
|
* The base class for all other layouts.
|
@@ -29,6 +30,12 @@ class Base extends CoreBase {
|
|
29
30
|
* @protected
|
30
31
|
*/
|
31
32
|
containerId: null,
|
33
|
+
/**
|
34
|
+
* A layout specific CSS selector which gets added to Container the layout is bound to.
|
35
|
+
* @member {String|null} containerCls_=null
|
36
|
+
* @protected
|
37
|
+
*/
|
38
|
+
containerCls_: null,
|
32
39
|
/**
|
33
40
|
* Identifier for all classes that extend layout.Base
|
34
41
|
* @member {Boolean} isLayout=true
|
@@ -45,7 +52,10 @@ class Base extends CoreBase {
|
|
45
52
|
* @returns {Neo.container.Base|null}
|
46
53
|
*/
|
47
54
|
get container() {
|
48
|
-
|
55
|
+
let {containerId} = this;
|
56
|
+
|
57
|
+
// the instance might not be registered yet
|
58
|
+
return Neo.getComponent(containerId) || Neo.get(containerId)
|
49
59
|
}
|
50
60
|
|
51
61
|
/**
|
@@ -67,10 +77,23 @@ class Base extends CoreBase {
|
|
67
77
|
applyChildAttributes(item, index) {}
|
68
78
|
|
69
79
|
/**
|
70
|
-
* Placeholder method
|
71
80
|
* @protected
|
72
81
|
*/
|
73
|
-
applyRenderAttributes() {
|
82
|
+
applyRenderAttributes() {
|
83
|
+
let me = this,
|
84
|
+
{container, containerCls} = me,
|
85
|
+
{wrapperCls} = container;
|
86
|
+
|
87
|
+
if (containerCls) {
|
88
|
+
if (!container) {
|
89
|
+
Neo.logError(me.className + ': applyRenderAttributes -> container not yet created', me.containerId)
|
90
|
+
}
|
91
|
+
|
92
|
+
NeoArray.add(wrapperCls, containerCls);
|
93
|
+
|
94
|
+
container.wrapperCls = wrapperCls
|
95
|
+
}
|
96
|
+
}
|
74
97
|
|
75
98
|
/**
|
76
99
|
*
|
@@ -108,15 +131,29 @@ class Base extends CoreBase {
|
|
108
131
|
/**
|
109
132
|
* Placeholder method
|
110
133
|
* @param {Neo.component.Base} item
|
134
|
+
* @param {Number} index
|
111
135
|
* @protected
|
112
136
|
*/
|
113
|
-
removeChildAttributes(item) {}
|
137
|
+
removeChildAttributes(item, index) {}
|
114
138
|
|
115
139
|
/**
|
116
|
-
* Placeholder method
|
117
140
|
* @protected
|
118
141
|
*/
|
119
|
-
removeRenderAttributes() {
|
142
|
+
removeRenderAttributes() {
|
143
|
+
let me = this,
|
144
|
+
{container, containerCls} = me,
|
145
|
+
{wrapperCls} = container;
|
146
|
+
|
147
|
+
if (containerCls) {
|
148
|
+
if (!container) {
|
149
|
+
Neo.logError(me.className + ': removeRenderAttributes -> container not yet created', me.containerId)
|
150
|
+
}
|
151
|
+
|
152
|
+
NeoArray.remove(wrapperCls, containerCls);
|
153
|
+
|
154
|
+
container.wrapperCls = wrapperCls
|
155
|
+
}
|
156
|
+
}
|
120
157
|
}
|
121
158
|
|
122
159
|
Neo.setupClass(Base);
|
package/src/layout/Card.mjs
CHANGED
@@ -49,6 +49,11 @@ class Card extends Base {
|
|
49
49
|
* @member {Number} activeIndex_=0
|
50
50
|
*/
|
51
51
|
activeIndex_: 0,
|
52
|
+
/**
|
53
|
+
* @member {String|null} containerCls='neo-layout-card'
|
54
|
+
* @protected
|
55
|
+
*/
|
56
|
+
containerCls: 'neo-layout-card',
|
52
57
|
/*
|
53
58
|
* Remove the DOM of inactive cards.
|
54
59
|
* This will keep the instances & vdom trees
|
@@ -72,8 +77,7 @@ class Card extends Base {
|
|
72
77
|
*/
|
73
78
|
async afterSetActiveIndex(value, oldValue) {
|
74
79
|
let me = this,
|
75
|
-
{
|
76
|
-
container = Neo.getComponent(containerId) || Neo.get(containerId), // the instance might not be registered yet
|
80
|
+
{container, removeInactiveCards} = me,
|
77
81
|
sCfg = me.constructor,
|
78
82
|
needsTransition = me.slideDirection && oldValue !== undefined,
|
79
83
|
needsUpdate = false,
|
@@ -144,7 +148,7 @@ class Card extends Base {
|
|
144
148
|
let me = this,
|
145
149
|
isActiveIndex = me.activeIndex === index,
|
146
150
|
sCfg = me.constructor,
|
147
|
-
childCls = item.wrapperCls,
|
151
|
+
childCls = item.wrapperCls || [],
|
148
152
|
{vdom} = item;
|
149
153
|
|
150
154
|
NeoArray.add(childCls, sCfg.itemCls);
|
@@ -153,29 +157,12 @@ class Card extends Base {
|
|
153
157
|
if (!keepInDom && me.removeInactiveCards) {
|
154
158
|
vdom.removeDom = !isActiveIndex;
|
155
159
|
item.wrapperCls = childCls;
|
156
|
-
item.update()
|
160
|
+
item.update?.() // can get called for an item config
|
157
161
|
} else {
|
158
162
|
item.wrapperCls = childCls
|
159
163
|
}
|
160
164
|
}
|
161
165
|
|
162
|
-
/**
|
163
|
-
* Applies CSS classes to the container this layout is bound to
|
164
|
-
*/
|
165
|
-
applyRenderAttributes() {
|
166
|
-
let me = this,
|
167
|
-
container = Neo.getComponent(me.containerId),
|
168
|
-
wrapperCls = container?.wrapperCls || [];
|
169
|
-
|
170
|
-
if (!container) {
|
171
|
-
Neo.logError('layout.Card: applyRenderAttributes -> container not yet created', me.containerId)
|
172
|
-
}
|
173
|
-
|
174
|
-
NeoArray.add(wrapperCls, 'neo-layout-card');
|
175
|
-
|
176
|
-
container.wrapperCls = wrapperCls
|
177
|
-
}
|
178
|
-
|
179
166
|
/**
|
180
167
|
* Triggered before the slideDirection config gets changed
|
181
168
|
* @param {String} value
|
@@ -194,14 +181,11 @@ class Card extends Base {
|
|
194
181
|
* @returns {Neo.component.Base}
|
195
182
|
*/
|
196
183
|
async loadModule(item, index) {
|
197
|
-
let me
|
198
|
-
{
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
{vdom} = container,
|
203
|
-
{module} = item,
|
204
|
-
proto, wrapperCls;
|
184
|
+
let me = this,
|
185
|
+
{container} = me,
|
186
|
+
items = container.items,
|
187
|
+
{module} = item,
|
188
|
+
proto;
|
205
189
|
|
206
190
|
if (!Neo.isNumber(index)) {
|
207
191
|
index = items.indexOf(item)
|
@@ -209,49 +193,27 @@ class Card extends Base {
|
|
209
193
|
|
210
194
|
item.isLoading = true; // prevent the item from getting queued multiple times inside form.Container
|
211
195
|
|
212
|
-
module
|
213
|
-
module
|
214
|
-
proto
|
215
|
-
|
196
|
+
module = await module();
|
197
|
+
module = module.default;
|
198
|
+
proto = module.prototype;
|
199
|
+
|
200
|
+
item.className = proto.className;
|
201
|
+
item.module = module;
|
216
202
|
|
217
|
-
item
|
218
|
-
item.wrapperCls = [...wrapperCls, sCfg.itemCls];
|
219
|
-
item.module = module;
|
203
|
+
me.applyChildAttributes(item, index);
|
220
204
|
|
221
205
|
delete item.isLoading;
|
222
206
|
delete item.vdom;
|
223
207
|
|
224
208
|
items[index] = item = Neo.create(item);
|
225
209
|
|
226
|
-
|
227
|
-
item.vdom.removeDom = true
|
228
|
-
}
|
210
|
+
container.getVdomItemsRoot().cn[index] = item.vdom;
|
229
211
|
|
230
212
|
container.fire('cardLoaded', {item});
|
231
213
|
|
232
|
-
vdom.cn[index] = item.vdom;
|
233
|
-
|
234
214
|
return item
|
235
215
|
}
|
236
216
|
|
237
|
-
/**
|
238
|
-
* Removes all CSS rules from the container this layout is bound to.
|
239
|
-
* Gets called when switching to a different layout.
|
240
|
-
*/
|
241
|
-
removeRenderAttributes() {
|
242
|
-
let me = this,
|
243
|
-
container = Neo.getComponent(me.containerId),
|
244
|
-
wrapperCls = container?.wrapperCls || [];
|
245
|
-
|
246
|
-
if (!container) {
|
247
|
-
Neo.logError('layout.Card: removeRenderAttributes -> container not yet created', me.containerId)
|
248
|
-
}
|
249
|
-
|
250
|
-
NeoArray.remove(wrapperCls, 'neo-layout-card');
|
251
|
-
|
252
|
-
container.wrapperCls = wrapperCls
|
253
|
-
}
|
254
|
-
|
255
217
|
/**
|
256
218
|
* @param {Number} index
|
257
219
|
* @param {Number} oldIndex
|
@@ -0,0 +1,428 @@
|
|
1
|
+
import Card from './Card.mjs';
|
2
|
+
import NeoArray from '../util/Array.mjs';
|
3
|
+
|
4
|
+
const configSymbol = Symbol.for('configSymbol');
|
5
|
+
|
6
|
+
/**
|
7
|
+
* See: examples/layout.Cube for a demo.
|
8
|
+
* Strongly inspired by https://www.mobzystems.com/code/3d-css-and-custom-properties/
|
9
|
+
* @class Neo.layout.Cube
|
10
|
+
* @extends Neo.layout.Card
|
11
|
+
*/
|
12
|
+
class Cube extends Card {
|
13
|
+
/**
|
14
|
+
* @member {Object} faces
|
15
|
+
* @static
|
16
|
+
*/
|
17
|
+
static faces = {
|
18
|
+
front : [ 0, 0, 0],
|
19
|
+
back : [ 0, 180, 0],
|
20
|
+
left : [ 0, 90, 0],
|
21
|
+
right : [ 0, 270, 0],
|
22
|
+
top : [270, 0, 0],
|
23
|
+
bottom: [ 90, 0, 0]
|
24
|
+
}
|
25
|
+
|
26
|
+
static config = {
|
27
|
+
/**
|
28
|
+
* @member {String} className='Neo.layout.Cube'
|
29
|
+
* @protected
|
30
|
+
*/
|
31
|
+
className: 'Neo.layout.Cube',
|
32
|
+
/**
|
33
|
+
* @member {String} ntype='layout-cube'
|
34
|
+
* @protected
|
35
|
+
*/
|
36
|
+
ntype: 'layout-cube',
|
37
|
+
/**
|
38
|
+
* @member {String|null} activeFace_=null
|
39
|
+
*/
|
40
|
+
activeFace_: null,
|
41
|
+
/**
|
42
|
+
* @member {Number|null} activeIndex=null
|
43
|
+
*/
|
44
|
+
activeIndex: null,
|
45
|
+
/**
|
46
|
+
* @member {String|null} containerCls='neo-layout-fit'
|
47
|
+
* @protected
|
48
|
+
*/
|
49
|
+
containerCls: 'neo-layout-cube',
|
50
|
+
/**
|
51
|
+
* Updates the cube size to fit the owner container dimensions
|
52
|
+
* @member {Boolean} fitContainer_=false
|
53
|
+
*/
|
54
|
+
fitContainer_: false,
|
55
|
+
/**
|
56
|
+
* Important for dynamically switching from a cube to a card layout
|
57
|
+
* @member {Boolean} hideInactiveCardsOnDestroy=false
|
58
|
+
*/
|
59
|
+
hideInactiveCardsOnDestroy: false,
|
60
|
+
/**
|
61
|
+
* @member {Number} perspective_=600
|
62
|
+
*/
|
63
|
+
perspective_: 600,
|
64
|
+
/**
|
65
|
+
* @member {Number} rotateX_=0
|
66
|
+
*/
|
67
|
+
rotateX_: 0,
|
68
|
+
/**
|
69
|
+
* @member {Number} rotateY_=0
|
70
|
+
*/
|
71
|
+
rotateY_: 0,
|
72
|
+
/**
|
73
|
+
* @member {Number} rotateZ_=0
|
74
|
+
*/
|
75
|
+
rotateZ_: 0,
|
76
|
+
/**
|
77
|
+
* @member {Number} sideX_=300
|
78
|
+
*/
|
79
|
+
sideX_: 300,
|
80
|
+
/**
|
81
|
+
* @member {Number} sideY_=300
|
82
|
+
*/
|
83
|
+
sideY_: 300,
|
84
|
+
/**
|
85
|
+
* @member {Number} sideZ_=300
|
86
|
+
*/
|
87
|
+
sideZ_: 300
|
88
|
+
}
|
89
|
+
|
90
|
+
/**
|
91
|
+
* @member {Function|null} #cachedVdomItemsRoot=null
|
92
|
+
* @private
|
93
|
+
*/
|
94
|
+
#cachedVdomItemsRoot = null
|
95
|
+
|
96
|
+
/**
|
97
|
+
* @param {Object} config
|
98
|
+
*/
|
99
|
+
construct(config) {
|
100
|
+
super.construct(config);
|
101
|
+
|
102
|
+
let me = this,
|
103
|
+
{container} = me;
|
104
|
+
|
105
|
+
me.nestVdom();
|
106
|
+
|
107
|
+
container.mounted && container.update();
|
108
|
+
|
109
|
+
me.timeout(100).then(() => {
|
110
|
+
container.addCls('neo-animate')
|
111
|
+
})
|
112
|
+
}
|
113
|
+
|
114
|
+
/**
|
115
|
+
* Triggered after the activeFace config got changed
|
116
|
+
* @param {String|null} value
|
117
|
+
* @param {String|null} oldValue
|
118
|
+
* @protected
|
119
|
+
*/
|
120
|
+
afterSetActiveFace(value, oldValue) {
|
121
|
+
if (value) {
|
122
|
+
this.activeIndex = Object.keys(Cube.faces).indexOf(value)
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
/**
|
127
|
+
* Triggered after the activeIndex config got changed
|
128
|
+
* @param {Number|null} value
|
129
|
+
* @param {Number|null} oldValue
|
130
|
+
* @protected
|
131
|
+
*/
|
132
|
+
async afterSetActiveIndex(value, oldValue) {
|
133
|
+
if (Neo.isNumber(value)) {
|
134
|
+
let me = this,
|
135
|
+
{container} = me,
|
136
|
+
item = container.items[value];
|
137
|
+
|
138
|
+
// Since activeFace & activeIndex are optional, we need to clear out default values
|
139
|
+
if (!Neo.isNumber(oldValue)) {
|
140
|
+
delete me[configSymbol].rotateX;
|
141
|
+
delete me[configSymbol].rotateY;
|
142
|
+
delete me[configSymbol].rotateZ;
|
143
|
+
}
|
144
|
+
|
145
|
+
if (Neo.typeOf(item.module) === 'Function') {
|
146
|
+
await me.loadModule(item, value);
|
147
|
+
container.update();
|
148
|
+
|
149
|
+
await me.timeout(100) // wait for the view to get painted first
|
150
|
+
}
|
151
|
+
|
152
|
+
this.rotateTo(...Object.values(Cube.faces)[value])
|
153
|
+
}
|
154
|
+
}
|
155
|
+
|
156
|
+
/**
|
157
|
+
* Triggered after the fitContainer config got changed
|
158
|
+
* @param {Boolean} value
|
159
|
+
* @param {Boolean} oldValue
|
160
|
+
* @protected
|
161
|
+
*/
|
162
|
+
afterSetFitContainer(value, oldValue) {
|
163
|
+
if (value) {
|
164
|
+
let me = this,
|
165
|
+
{container} = me;
|
166
|
+
|
167
|
+
if (container.mounted) {
|
168
|
+
me.updateContainerSize()
|
169
|
+
} else {
|
170
|
+
container.on('mounted', () => {
|
171
|
+
me.updateContainerSize()
|
172
|
+
})
|
173
|
+
}
|
174
|
+
}
|
175
|
+
}
|
176
|
+
|
177
|
+
/**
|
178
|
+
* Triggered after the perspective config got changed
|
179
|
+
* @param {Number} value
|
180
|
+
* @param {Number} oldValue
|
181
|
+
* @protected
|
182
|
+
*/
|
183
|
+
afterSetPerspective(value, oldValue) {
|
184
|
+
this.updateContainerCssVar('--perspective', value + 'px')
|
185
|
+
}
|
186
|
+
|
187
|
+
/**
|
188
|
+
* Triggered after the rotateX config got changed
|
189
|
+
* @param {Number} value
|
190
|
+
* @param {Number} oldValue
|
191
|
+
* @protected
|
192
|
+
*/
|
193
|
+
afterSetRotateX(value, oldValue) {
|
194
|
+
this.rotateTo(value)
|
195
|
+
}
|
196
|
+
|
197
|
+
/**
|
198
|
+
* Triggered after the rotateY config got changed
|
199
|
+
* @param {Number} value
|
200
|
+
* @param {Number} oldValue
|
201
|
+
* @protected
|
202
|
+
*/
|
203
|
+
afterSetRotateY(value, oldValue) {
|
204
|
+
this.rotateTo(null, value)
|
205
|
+
}
|
206
|
+
|
207
|
+
/**
|
208
|
+
* Triggered after the rotateZ config got changed
|
209
|
+
* @param {Number} value
|
210
|
+
* @param {Number} oldValue
|
211
|
+
* @protected
|
212
|
+
*/
|
213
|
+
afterSetRotateZ(value, oldValue) {
|
214
|
+
this.rotateTo(null, null, value)
|
215
|
+
}
|
216
|
+
|
217
|
+
/**
|
218
|
+
* Triggered after the sideX config got changed
|
219
|
+
* @param {Number} value
|
220
|
+
* @param {Number} oldValue
|
221
|
+
* @protected
|
222
|
+
*/
|
223
|
+
afterSetSideX(value, oldValue) {
|
224
|
+
this.updateContainerCssVar('--side-x', value + 'px')
|
225
|
+
}
|
226
|
+
|
227
|
+
/**
|
228
|
+
* Triggered after the sideX config got changed
|
229
|
+
* @param {Number} value
|
230
|
+
* @param {Number} oldValue
|
231
|
+
* @protected
|
232
|
+
*/
|
233
|
+
afterSetSideY(value, oldValue) {
|
234
|
+
this.updateContainerCssVar('--side-y', value + 'px')
|
235
|
+
}
|
236
|
+
|
237
|
+
/**
|
238
|
+
* Triggered after the sideX config got changed
|
239
|
+
* @param {Number} value
|
240
|
+
* @param {Number} oldValue
|
241
|
+
* @protected
|
242
|
+
*/
|
243
|
+
afterSetSideZ(value, oldValue) {
|
244
|
+
this.updateContainerCssVar('--side-z', value + 'px')
|
245
|
+
}
|
246
|
+
|
247
|
+
/**
|
248
|
+
* Initially sets the CSS classes of the container items this layout is bound to.
|
249
|
+
* @param {Neo.component.Base} item
|
250
|
+
* @param {Number} index
|
251
|
+
*/
|
252
|
+
applyChildAttributes(item, index) {
|
253
|
+
let {wrapperCls} = item;
|
254
|
+
|
255
|
+
wrapperCls = NeoArray.union(wrapperCls, 'neo-face', Object.keys(Cube.faces)[index]);
|
256
|
+
|
257
|
+
switch(index) {
|
258
|
+
case 0:
|
259
|
+
case 1:
|
260
|
+
wrapperCls = NeoArray.union(wrapperCls, 'neo-face-z');
|
261
|
+
break;
|
262
|
+
case 2:
|
263
|
+
case 3:
|
264
|
+
wrapperCls = NeoArray.union(wrapperCls, 'neo-face-x');
|
265
|
+
break;
|
266
|
+
case 4:
|
267
|
+
case 5:
|
268
|
+
wrapperCls = NeoArray.union(wrapperCls, 'neo-face-y');
|
269
|
+
break;
|
270
|
+
}
|
271
|
+
|
272
|
+
item.wrapperCls = wrapperCls
|
273
|
+
}
|
274
|
+
|
275
|
+
/**
|
276
|
+
*
|
277
|
+
*/
|
278
|
+
destroy(...args) {
|
279
|
+
let me = this,
|
280
|
+
{container} = me,
|
281
|
+
{style, vdom} = container;
|
282
|
+
|
283
|
+
Object.assign(style, {
|
284
|
+
'--perspective': null,
|
285
|
+
'--rot-x' : null,
|
286
|
+
'--rot-y' : null,
|
287
|
+
'--rot-z' : null,
|
288
|
+
'--side-x' : null,
|
289
|
+
'--side-y' : null,
|
290
|
+
'--side-z' : null
|
291
|
+
});
|
292
|
+
|
293
|
+
container.style = style;
|
294
|
+
|
295
|
+
vdom.cn = container.getVdomItemsRoot().cn;
|
296
|
+
|
297
|
+
if (me.hideInactiveCardsOnDestroy) {
|
298
|
+
vdom.cn.forEach((item, index) => {
|
299
|
+
if (index !== me.activeIndex) {
|
300
|
+
item.removeDom = true
|
301
|
+
}
|
302
|
+
})
|
303
|
+
}
|
304
|
+
|
305
|
+
// override
|
306
|
+
container.getVdomItemsRoot = me.#cachedVdomItemsRoot;
|
307
|
+
|
308
|
+
container.update();
|
309
|
+
|
310
|
+
super.destroy(...args)
|
311
|
+
}
|
312
|
+
|
313
|
+
nestVdom() {
|
314
|
+
let me = this,
|
315
|
+
{container} = me,
|
316
|
+
{vdom} = container,
|
317
|
+
{cn} = vdom;
|
318
|
+
|
319
|
+
vdom.cn = [
|
320
|
+
{cls: ['neo-plane'], cn: [
|
321
|
+
{cls: ['neo-box'], cn}
|
322
|
+
]}
|
323
|
+
];
|
324
|
+
|
325
|
+
// Cache the original method for run-time container layout changes
|
326
|
+
me.#cachedVdomItemsRoot = container.getVdomItemsRoot;
|
327
|
+
|
328
|
+
// Override
|
329
|
+
container.getVdomItemsRoot = function() {
|
330
|
+
return this.vdom.cn[0].cn[0]
|
331
|
+
}
|
332
|
+
|
333
|
+
me.timeout(50).then(() => {
|
334
|
+
// Important when switching from a card layout to this one
|
335
|
+
container.vdom.cn[0].cn[0].cn.forEach(node => {
|
336
|
+
delete node.removeDom
|
337
|
+
});
|
338
|
+
|
339
|
+
container.update()
|
340
|
+
})
|
341
|
+
}
|
342
|
+
|
343
|
+
/**
|
344
|
+
* Removes all CSS rules from a container item this layout is bound to.
|
345
|
+
* Gets called when switching to a different layout.
|
346
|
+
* @param {Neo.component.Base} item
|
347
|
+
* @param {Number} index
|
348
|
+
* @protected
|
349
|
+
*/
|
350
|
+
removeChildAttributes(item, index) {
|
351
|
+
let {wrapperCls} = item;
|
352
|
+
|
353
|
+
NeoArray.remove(wrapperCls, ['neo-face', Object.keys(Cube.faces)[index]]);
|
354
|
+
|
355
|
+
switch(index) {
|
356
|
+
case 0:
|
357
|
+
case 1:
|
358
|
+
NeoArray.remove(wrapperCls, 'neo-face-z');
|
359
|
+
break;
|
360
|
+
case 2:
|
361
|
+
case 3:
|
362
|
+
NeoArray.remove(wrapperCls, 'neo-face-x');
|
363
|
+
break;
|
364
|
+
case 4:
|
365
|
+
case 5:
|
366
|
+
NeoArray.remove(wrapperCls, 'neo-face-y');
|
367
|
+
break;
|
368
|
+
}
|
369
|
+
|
370
|
+
item.wrapperCls = wrapperCls
|
371
|
+
}
|
372
|
+
|
373
|
+
/**
|
374
|
+
* @protected
|
375
|
+
*/
|
376
|
+
removeRenderAttributes() {
|
377
|
+
super.removeRenderAttributes();
|
378
|
+
this.container.removeCls('neo-animate')
|
379
|
+
}
|
380
|
+
|
381
|
+
/**
|
382
|
+
* @param {Number|null} [x]
|
383
|
+
* @param {Number|null} [y]
|
384
|
+
* @param {Number|null} [z]
|
385
|
+
*/
|
386
|
+
rotateTo(x, y, z) {
|
387
|
+
let me = this,
|
388
|
+
{container} = me,
|
389
|
+
{style} = container;
|
390
|
+
|
391
|
+
if (Neo.isNumber(x)) {me._rotateX = x; style['--rot-x'] = x + 'deg'}
|
392
|
+
if (Neo.isNumber(y)) {me._rotateY = y; style['--rot-y'] = y + 'deg'}
|
393
|
+
if (Neo.isNumber(z)) {me._rotateZ = z; style['--rot-z'] = z + 'deg'}
|
394
|
+
|
395
|
+
container.style = style
|
396
|
+
}
|
397
|
+
|
398
|
+
/**
|
399
|
+
* @param {String} name
|
400
|
+
* @param {String} value
|
401
|
+
*/
|
402
|
+
updateContainerCssVar(name, value) {
|
403
|
+
let {container} = this,
|
404
|
+
{style} = container;
|
405
|
+
|
406
|
+
style[name] = value;
|
407
|
+
|
408
|
+
container.style = style
|
409
|
+
}
|
410
|
+
|
411
|
+
/**
|
412
|
+
*
|
413
|
+
*/
|
414
|
+
async updateContainerSize() {
|
415
|
+
let {container} = this,
|
416
|
+
{height, width} = await container.getDomRect(container.id);
|
417
|
+
|
418
|
+
this.set({
|
419
|
+
sideX: width,
|
420
|
+
sideY: height,
|
421
|
+
sideZ: Math.min(height, width)
|
422
|
+
})
|
423
|
+
}
|
424
|
+
}
|
425
|
+
|
426
|
+
Neo.setupClass(Cube);
|
427
|
+
|
428
|
+
export default Cube;
|