neo.mjs 7.2.0 → 7.4.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 +12 -6
- package/apps/ServiceWorker.mjs +2 -2
- package/apps/portal/index.html +1 -1
- package/apps/portal/model/Example.mjs +14 -4
- package/apps/portal/resources/data/examples_devmode.json +141 -173
- package/apps/portal/resources/data/examples_dist_dev.json +135 -164
- package/apps/portal/resources/data/examples_dist_prod.json +135 -164
- package/apps/portal/store/Examples.mjs +1 -8
- package/apps/portal/view/blog/List.mjs +12 -14
- package/apps/portal/view/examples/List.mjs +181 -37
- package/apps/portal/view/examples/TabContainer.mjs +6 -3
- package/apps/portal/view/home/FooterContainer.mjs +1 -1
- package/apps/realworld/api/Article.mjs +7 -1
- package/apps/realworld/api/Favorite.mjs +7 -1
- package/apps/realworld/api/Profile.mjs +7 -1
- package/apps/realworld/api/Tag.mjs +7 -1
- package/apps/realworld/api/User.mjs +7 -1
- package/apps/realworld2/api/Article.mjs +7 -1
- package/apps/realworld2/api/Favorite.mjs +7 -1
- package/apps/realworld2/api/Profile.mjs +7 -1
- package/apps/realworld2/api/Tag.mjs +7 -1
- package/apps/realworld2/api/User.mjs +7 -1
- package/examples/ServiceWorker.mjs +2 -2
- package/examples/table/container/MainStore.mjs +0 -6
- package/package.json +5 -3
- package/resources/scss/src/apps/portal/examples/List.scss +16 -0
- package/resources/scss/src/apps/portal/examples/TabContainer.scss +2 -2
- package/src/DefaultConfig.mjs +2 -2
- package/src/Main.mjs +8 -0
- package/src/calendar/view/MainContainer.mjs +6 -5
- package/src/component/Base.mjs +4 -3
- package/src/component/DateSelector.mjs +4 -5
- package/src/dialog/Base.mjs +3 -1
- package/src/form/field/Time.mjs +3 -2
- package/src/list/Base.mjs +15 -2
- package/src/main/DomAccess.mjs +7 -5
- package/src/main/DomEvents.mjs +2 -1
- package/src/selection/grid/CellColumnModel.mjs +1 -1
- package/src/selection/grid/CellColumnRowModel.mjs +2 -2
- package/src/selection/grid/CellModel.mjs +16 -23
- package/src/selection/grid/CellRowModel.mjs +1 -1
- package/src/selection/grid/ColumnModel.mjs +14 -8
- package/src/selection/grid/RowModel.mjs +15 -10
- package/src/selection/table/CellColumnModel.mjs +1 -1
- package/src/selection/table/CellColumnRowModel.mjs +1 -1
- package/src/selection/table/CellModel.mjs +16 -25
- package/src/selection/table/CellRowModel.mjs +1 -1
- package/src/selection/table/ColumnModel.mjs +16 -10
- package/src/selection/table/RowModel.mjs +14 -9
- package/src/table/View.mjs +2 -2
- package/src/worker/App.mjs +11 -0
- package/src/worker/ServiceBase.mjs +14 -5
@@ -1,5 +1,5 @@
|
|
1
1
|
import BaseList from '../../../../src/list/Base.mjs';
|
2
|
-
import
|
2
|
+
import VDomUtil from '../../../../src/util/VDom.mjs';
|
3
3
|
|
4
4
|
/**
|
5
5
|
* @class Portal.view.examples.List
|
@@ -25,13 +25,24 @@ class List extends BaseList {
|
|
25
25
|
*/
|
26
26
|
baseCls: ['portal-examples-list', 'neo-list'],
|
27
27
|
/**
|
28
|
-
* @member {
|
28
|
+
* @member {String} baseUrl='https://neomjs.com/'
|
29
29
|
*/
|
30
|
-
|
30
|
+
baseUrl: 'https://neomjs.com/',
|
31
31
|
/**
|
32
|
-
*
|
32
|
+
* The env of the example links.
|
33
|
+
* Valid values are 'development', 'dist/development', 'dist/production'
|
34
|
+
* @member {String} environment='development'
|
33
35
|
*/
|
34
|
-
|
36
|
+
environment: 'development',
|
37
|
+
/**
|
38
|
+
* Specify how many example item images to preload when intersecting
|
39
|
+
* @member {Number} preloadImages=5
|
40
|
+
*/
|
41
|
+
preloadImages: 5,
|
42
|
+
/**
|
43
|
+
* @member {String} sourceBaseUrl='https://github.com/neomjs/neo/tree/dev/'
|
44
|
+
*/
|
45
|
+
sourceBaseUrl: 'https://github.com/neomjs/neo/tree/dev/',
|
35
46
|
/**
|
36
47
|
* @member {Boolean} useWrapperNode=true
|
37
48
|
*/
|
@@ -46,31 +57,9 @@ class List extends BaseList {
|
|
46
57
|
}
|
47
58
|
|
48
59
|
/**
|
49
|
-
*
|
50
|
-
* @param {Object|Neo.data.Store} value
|
51
|
-
* @param {Object|Neo.data.Store} oldValue
|
52
|
-
* @returns {Neo.data.Store}
|
53
|
-
* @protected
|
60
|
+
* @member {String} imageBasePath
|
54
61
|
*/
|
55
|
-
|
56
|
-
if (value) {
|
57
|
-
if (value.isClass) {
|
58
|
-
value = {
|
59
|
-
module: value,
|
60
|
-
url : this.storeUrl
|
61
|
-
};
|
62
|
-
} else if (Neo.isObject(value)) {
|
63
|
-
value.url = this.storeUrl;
|
64
|
-
}
|
65
|
-
}
|
66
|
-
|
67
|
-
return super.beforeSetStore(value, oldValue);
|
68
|
-
}
|
69
|
-
|
70
|
-
/**
|
71
|
-
* @param {Object} record
|
72
|
-
*/
|
73
|
-
createItemContent(record) {
|
62
|
+
get imageBasePath() {
|
74
63
|
let basePath;
|
75
64
|
|
76
65
|
if (Neo.config.isGitHubPages) {
|
@@ -83,17 +72,50 @@ class List extends BaseList {
|
|
83
72
|
basePath = 'https://raw.githubusercontent.com/neomjs/pages/main/resources_pub/website/examples'
|
84
73
|
}
|
85
74
|
|
75
|
+
return basePath
|
76
|
+
}
|
77
|
+
|
78
|
+
/**
|
79
|
+
* @param {Object} config
|
80
|
+
*/
|
81
|
+
construct(config) {
|
82
|
+
super.construct(config);
|
83
|
+
|
84
|
+
let me = this;
|
85
|
+
|
86
|
+
me.addDomListeners({
|
87
|
+
intersect: me.onIntersect,
|
88
|
+
scope : me
|
89
|
+
})
|
90
|
+
}
|
91
|
+
|
92
|
+
/**
|
93
|
+
* Triggered after the mounted config got changed
|
94
|
+
* @param {Boolean} value
|
95
|
+
* @param {Boolean} oldValue
|
96
|
+
* @protected
|
97
|
+
*/
|
98
|
+
afterSetMounted(value, oldValue) {
|
99
|
+
super.afterSetMounted(value, oldValue);
|
100
|
+
value && this.registerIntersectionObserver()
|
101
|
+
}
|
102
|
+
|
103
|
+
/**
|
104
|
+
* @param {Object} record
|
105
|
+
*/
|
106
|
+
createItemContent(record) {
|
107
|
+
let me = this;
|
108
|
+
|
86
109
|
return [
|
87
|
-
{cls: ['content', 'neo-relative'], cn: [
|
88
|
-
{cls: ['neo-
|
89
|
-
|
90
|
-
},
|
110
|
+
{cls: ['content', 'neo-relative'], data: {recordId: record.id}, removeDom: me.isHiddenItem(record), cn: [
|
111
|
+
{cls: ['neo-multi-window'], data: {neoTooltip: 'Multi Window Demo'}, removeDom: !record.sharedWorkers, cn: [
|
112
|
+
{cls: ['far', 'fa-window-restore']}
|
113
|
+
]},
|
114
|
+
{cls: ['neo-full-size', 'preview-image'], flag: `image-${record.id}`},
|
91
115
|
{cls: ['neo-absolute', 'neo-item-bottom-position'], cn: [
|
92
|
-
{
|
93
|
-
{html: record.name.replace(List.nameRegEx, "$1")}
|
94
|
-
]},
|
116
|
+
{...me.createLink(record)},
|
95
117
|
{cls: ['neo-top-20'], cn: [
|
96
|
-
{
|
118
|
+
{...me.createSourceLink(record)},
|
97
119
|
{cls: ['neo-inner-content'], cn: [
|
98
120
|
{cls: ['neo-inner-details'], html: record.browsers.join(', ')},
|
99
121
|
{cls: ['neo-inner-details'], html: record.environments.join(', ')}
|
@@ -104,6 +126,56 @@ class List extends BaseList {
|
|
104
126
|
]
|
105
127
|
}
|
106
128
|
|
129
|
+
/**
|
130
|
+
*
|
131
|
+
* @param {Object} record
|
132
|
+
* @returns {Object}
|
133
|
+
*/
|
134
|
+
createLink(record) {
|
135
|
+
let externalLink = record.url.startsWith('http'),
|
136
|
+
|
137
|
+
vdom = {
|
138
|
+
tag : 'a',
|
139
|
+
cls : ['neo-title'],
|
140
|
+
cn : [{html: record.name.replace(List.nameRegEx, "$1")}],
|
141
|
+
href: record.url
|
142
|
+
};
|
143
|
+
|
144
|
+
// We can use a shorter syntax for pointing examples to neomjs.com, but not all examples have to be there.
|
145
|
+
if (!externalLink) {
|
146
|
+
vdom.href = this.baseUrl + record.url
|
147
|
+
}
|
148
|
+
|
149
|
+
// Do not open multi-window examples inside a new browser window, in case the environment is the same.
|
150
|
+
// E.g. opening the multi-window covid app & the portal app inside the same app worker is problematic.
|
151
|
+
if (!record.sharedWorkers || this.environment !== Neo.config.environment || externalLink) {
|
152
|
+
vdom.target = '_blank'
|
153
|
+
}
|
154
|
+
|
155
|
+
return vdom
|
156
|
+
}
|
157
|
+
|
158
|
+
/**
|
159
|
+
*
|
160
|
+
* @param {Object} record
|
161
|
+
* @returns {Object}
|
162
|
+
*/
|
163
|
+
createSourceLink(record) {
|
164
|
+
let vdom = {
|
165
|
+
tag : 'a',
|
166
|
+
cls : ['fab fa-github', 'neo-github-image'],
|
167
|
+
href : record.sourceUrl,
|
168
|
+
target: '_blank'
|
169
|
+
};
|
170
|
+
|
171
|
+
// We can use a shorter syntax for pointing examples to neomjs/neo repo, but not all examples have to be there.
|
172
|
+
if (!record.sourceUrl.startsWith('http')) {
|
173
|
+
vdom.href = this.sourceBaseUrl + record.sourceUrl
|
174
|
+
}
|
175
|
+
|
176
|
+
return vdom
|
177
|
+
}
|
178
|
+
|
107
179
|
/**
|
108
180
|
* @returns {Object}
|
109
181
|
*/
|
@@ -117,6 +189,78 @@ class List extends BaseList {
|
|
117
189
|
getVnodeRoot() {
|
118
190
|
return this.vnode.childNodes[0]
|
119
191
|
}
|
192
|
+
|
193
|
+
/**
|
194
|
+
* @param {Object} record
|
195
|
+
* @returns {Boolean}
|
196
|
+
*/
|
197
|
+
isHiddenItem(record) {
|
198
|
+
if (record.hidden) {
|
199
|
+
return true
|
200
|
+
}
|
201
|
+
|
202
|
+
// We only want to show the portal app for the non-current environment.
|
203
|
+
// => A link to itself feels pointless
|
204
|
+
return record.sourceUrl === 'apps/portal' && this.environment === Neo.config.environment
|
205
|
+
}
|
206
|
+
|
207
|
+
/**
|
208
|
+
* @param {Object} data
|
209
|
+
*/
|
210
|
+
onIntersect(data) {
|
211
|
+
let me = this,
|
212
|
+
{imageBasePath, store} = me,
|
213
|
+
record = store.get(parseInt(data.data.recordId)),
|
214
|
+
i = store.indexOf(record),
|
215
|
+
len = Math.min(i + me.preloadImages, store.getCount()),
|
216
|
+
needsUpdate = false,
|
217
|
+
node;
|
218
|
+
|
219
|
+
for (; i < len; i++) {
|
220
|
+
node = VDomUtil.getByFlag(me.vdom, `image-${record.id}`);
|
221
|
+
|
222
|
+
if (!node.style) {
|
223
|
+
needsUpdate = true;
|
224
|
+
|
225
|
+
node.style = {
|
226
|
+
backgroundImage: `url('${imageBasePath}/${record.image}'), linear-gradient(#777, #333)`
|
227
|
+
}
|
228
|
+
}
|
229
|
+
}
|
230
|
+
|
231
|
+
needsUpdate && me.update()
|
232
|
+
}
|
233
|
+
|
234
|
+
/**
|
235
|
+
*
|
236
|
+
*/
|
237
|
+
async registerIntersectionObserver() {
|
238
|
+
let me = this,
|
239
|
+
opts = {id: me.id, observe: ['.content'], windowId: me.windowId},
|
240
|
+
i = 0,
|
241
|
+
len = me.intersectionObserverReconnects,
|
242
|
+
data;
|
243
|
+
|
244
|
+
await me.timeout(150);
|
245
|
+
|
246
|
+
data = await Neo.main.addon.IntersectionObserver.register({
|
247
|
+
...opts,
|
248
|
+
callback: 'isVisible',
|
249
|
+
root : `#${me.parentId}`
|
250
|
+
});
|
251
|
+
|
252
|
+
if (data.countTargets < 1) {
|
253
|
+
for (; i < len; i++) {
|
254
|
+
await me.timeout(100);
|
255
|
+
|
256
|
+
data = await Neo.main.addon.IntersectionObserver.observe(opts);
|
257
|
+
|
258
|
+
if (data.countTargets > 0) {
|
259
|
+
break
|
260
|
+
}
|
261
|
+
}
|
262
|
+
}
|
263
|
+
}
|
120
264
|
}
|
121
265
|
|
122
266
|
export default Neo.setupClass(List);
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import Container from '../../../../src/tab/Container.mjs';
|
2
|
+
import ExampleStore from '../../store/Examples.mjs';
|
2
3
|
import List from './List.mjs';
|
3
4
|
import TabContainerController from './TabContainerController.mjs';
|
4
5
|
|
@@ -42,23 +43,25 @@ class TabContainer extends Container {
|
|
42
43
|
*/
|
43
44
|
items: [{
|
44
45
|
reference : 'examples-devmode-list',
|
45
|
-
|
46
|
+
store : {module: ExampleStore, url: '../../apps/portal/resources/data/examples_devmode.json'},
|
46
47
|
tabButtonConfig: {
|
47
48
|
iconCls: 'fa fa-chess-knight',
|
48
49
|
route : '/examples/devmode',
|
49
50
|
text : 'DevMode'
|
50
51
|
}
|
51
52
|
}, {
|
53
|
+
environment : 'dist/development',
|
52
54
|
reference : 'examples-dist-dev-list',
|
53
|
-
|
55
|
+
store : {module: ExampleStore, url: '../../apps/portal/resources/data/examples_dist_dev.json'},
|
54
56
|
tabButtonConfig: {
|
55
57
|
iconCls: 'fa fa-chess-queen',
|
56
58
|
route : '/examples/dist_dev',
|
57
59
|
text : 'dist/dev'
|
58
60
|
}
|
59
61
|
}, {
|
62
|
+
environment : 'dist/production',
|
60
63
|
reference : 'examples-dist-prod-list',
|
61
|
-
|
64
|
+
store : {module: ExampleStore, url: '../../apps/portal/resources/data/examples_dist_prod.json'},
|
62
65
|
tabButtonConfig: {
|
63
66
|
iconCls: 'fa fa-chess-king',
|
64
67
|
route : '/examples/dist_prod',
|
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
|
|
3
3
|
/**
|
4
4
|
* @class RealWorld.api.Article
|
5
5
|
* @extends RealWorld.api.Base
|
6
|
+
* @singleton
|
6
7
|
*/
|
7
8
|
class Article extends Base {
|
8
9
|
static config = {
|
@@ -14,7 +15,12 @@ class Article extends Base {
|
|
14
15
|
/**
|
15
16
|
* @member {String} resource='/articles'
|
16
17
|
*/
|
17
|
-
resource: '/articles'
|
18
|
+
resource: '/articles',
|
19
|
+
/**
|
20
|
+
* @member {Boolean} singleton=true
|
21
|
+
* @protected
|
22
|
+
*/
|
23
|
+
singleton: true
|
18
24
|
}
|
19
25
|
|
20
26
|
/**
|
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
|
|
3
3
|
/**
|
4
4
|
* @class RealWorld.api.Favorite
|
5
5
|
* @extends RealWorld.api.Base
|
6
|
+
* @singleton
|
6
7
|
*/
|
7
8
|
class Favorite extends Base {
|
8
9
|
static config = {
|
@@ -10,7 +11,12 @@ class Favorite extends Base {
|
|
10
11
|
* @member {String} className='RealWorld.api.Favorite'
|
11
12
|
* @protected
|
12
13
|
*/
|
13
|
-
className: 'RealWorld.api.Favorite'
|
14
|
+
className: 'RealWorld.api.Favorite',
|
15
|
+
/**
|
16
|
+
* @member {Boolean} singleton=true
|
17
|
+
* @protected
|
18
|
+
*/
|
19
|
+
singleton: true
|
14
20
|
}
|
15
21
|
|
16
22
|
/**
|
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
|
|
3
3
|
/**
|
4
4
|
* @class RealWorld.api.Profile
|
5
5
|
* @extends RealWorld.api.Base
|
6
|
+
* @singleton
|
6
7
|
*/
|
7
8
|
class Profile extends Base {
|
8
9
|
static config = {
|
@@ -14,7 +15,12 @@ class Profile extends Base {
|
|
14
15
|
/**
|
15
16
|
* @member {String} resource='/profiles'
|
16
17
|
*/
|
17
|
-
resource: '/profiles'
|
18
|
+
resource: '/profiles',
|
19
|
+
/**
|
20
|
+
* @member {Boolean} singleton=true
|
21
|
+
* @protected
|
22
|
+
*/
|
23
|
+
singleton: true
|
18
24
|
}
|
19
25
|
|
20
26
|
/**
|
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
|
|
3
3
|
/**
|
4
4
|
* @class RealWorld.api.Tag
|
5
5
|
* @extends RealWorld.api.Base
|
6
|
+
* @singleton
|
6
7
|
*/
|
7
8
|
class Tag extends Base {
|
8
9
|
static config = {
|
@@ -14,7 +15,12 @@ class Tag extends Base {
|
|
14
15
|
/**
|
15
16
|
* @member {String} resource='/tags'
|
16
17
|
*/
|
17
|
-
resource: '/tags'
|
18
|
+
resource: '/tags',
|
19
|
+
/**
|
20
|
+
* @member {Boolean} singleton=true
|
21
|
+
* @protected
|
22
|
+
*/
|
23
|
+
singleton: true
|
18
24
|
}
|
19
25
|
}
|
20
26
|
|
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
|
|
3
3
|
/**
|
4
4
|
* @class RealWorld.api.User
|
5
5
|
* @extends RealWorld.api.Base
|
6
|
+
* @singleton
|
6
7
|
*/
|
7
8
|
class User extends Base {
|
8
9
|
static config = {
|
@@ -14,7 +15,12 @@ class User extends Base {
|
|
14
15
|
/**
|
15
16
|
* @member {String} resource='/tags'
|
16
17
|
*/
|
17
|
-
resource: '/users'
|
18
|
+
resource: '/users',
|
19
|
+
/**
|
20
|
+
* @member {Boolean} singleton=true
|
21
|
+
* @protected
|
22
|
+
*/
|
23
|
+
singleton: true
|
18
24
|
}
|
19
25
|
}
|
20
26
|
|
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
|
|
3
3
|
/**
|
4
4
|
* @class RealWorld2.api.Article
|
5
5
|
* @extends RealWorld2.api.Base
|
6
|
+
* @singleton
|
6
7
|
*/
|
7
8
|
class Article extends Base {
|
8
9
|
static config = {
|
@@ -14,7 +15,12 @@ class Article extends Base {
|
|
14
15
|
/**
|
15
16
|
* @member {String} resource='/articles'
|
16
17
|
*/
|
17
|
-
resource: '/articles'
|
18
|
+
resource: '/articles',
|
19
|
+
/**
|
20
|
+
* @member {Boolean} singleton=true
|
21
|
+
* @protected
|
22
|
+
*/
|
23
|
+
singleton: true
|
18
24
|
}
|
19
25
|
|
20
26
|
/**
|
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
|
|
3
3
|
/**
|
4
4
|
* @class RealWorld2.api.Favorite
|
5
5
|
* @extends RealWorld2.api.Base
|
6
|
+
* @singleton
|
6
7
|
*/
|
7
8
|
class Favorite extends Base {
|
8
9
|
static config = {
|
@@ -10,7 +11,12 @@ class Favorite extends Base {
|
|
10
11
|
* @member {String} className='RealWorld2.api.Favorite'
|
11
12
|
* @protected
|
12
13
|
*/
|
13
|
-
className: 'RealWorld2.api.Favorite'
|
14
|
+
className: 'RealWorld2.api.Favorite',
|
15
|
+
/**
|
16
|
+
* @member {Boolean} singleton=true
|
17
|
+
* @protected
|
18
|
+
*/
|
19
|
+
singleton: true
|
14
20
|
}
|
15
21
|
|
16
22
|
/**
|
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
|
|
3
3
|
/**
|
4
4
|
* @class RealWorld2.api.Profile
|
5
5
|
* @extends RealWorld2.api.Base
|
6
|
+
* @singleton
|
6
7
|
*/
|
7
8
|
class Profile extends Base {
|
8
9
|
static config = {
|
@@ -14,7 +15,12 @@ class Profile extends Base {
|
|
14
15
|
/**
|
15
16
|
* @member {String} resource='/profiles'
|
16
17
|
*/
|
17
|
-
resource: '/profiles'
|
18
|
+
resource: '/profiles',
|
19
|
+
/**
|
20
|
+
* @member {Boolean} singleton=true
|
21
|
+
* @protected
|
22
|
+
*/
|
23
|
+
singleton: true
|
18
24
|
}
|
19
25
|
|
20
26
|
/**
|
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
|
|
3
3
|
/**
|
4
4
|
* @class RealWorld2.api.Tag
|
5
5
|
* @extends RealWorld2.api.Base
|
6
|
+
* @singleton
|
6
7
|
*/
|
7
8
|
class Tag extends Base {
|
8
9
|
static config = {
|
@@ -14,7 +15,12 @@ class Tag extends Base {
|
|
14
15
|
/**
|
15
16
|
* @member {String} resource='/tags'
|
16
17
|
*/
|
17
|
-
resource: '/tags'
|
18
|
+
resource: '/tags',
|
19
|
+
/**
|
20
|
+
* @member {Boolean} singleton=true
|
21
|
+
* @protected
|
22
|
+
*/
|
23
|
+
singleton: true
|
18
24
|
}
|
19
25
|
}
|
20
26
|
|
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
|
|
3
3
|
/**
|
4
4
|
* @class RealWorld2.api.User
|
5
5
|
* @extends RealWorld2.api.Base
|
6
|
+
* @singleton
|
6
7
|
*/
|
7
8
|
class User extends Base {
|
8
9
|
static config = {
|
@@ -14,7 +15,12 @@ class User extends Base {
|
|
14
15
|
/**
|
15
16
|
* @member {String} resource='/tags'
|
16
17
|
*/
|
17
|
-
resource: '/users'
|
18
|
+
resource: '/users',
|
19
|
+
/**
|
20
|
+
* @member {Boolean} singleton=true
|
21
|
+
* @protected
|
22
|
+
*/
|
23
|
+
singleton: true
|
18
24
|
}
|
19
25
|
}
|
20
26
|
|
@@ -41,12 +41,6 @@ class MainStore extends Store {
|
|
41
41
|
firstname: 'Bastian',
|
42
42
|
githubId : 'bhaustein',
|
43
43
|
lastname : 'Haustein'
|
44
|
-
}, {
|
45
|
-
colspan : {firstname: 3},
|
46
|
-
country : 'Germany',
|
47
|
-
firstname: 'Colspan 3',
|
48
|
-
githubId : 'random',
|
49
|
-
lastname : ''
|
50
44
|
}]
|
51
45
|
}
|
52
46
|
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "neo.mjs",
|
3
|
-
"version": "7.
|
3
|
+
"version": "7.4.0",
|
4
4
|
"description": "The webworkers driven UI framework",
|
5
5
|
"type": "module",
|
6
6
|
"repository": {
|
@@ -31,6 +31,8 @@
|
|
31
31
|
"javascript",
|
32
32
|
"frontend",
|
33
33
|
"framework",
|
34
|
+
"offscreencanvas",
|
35
|
+
"sharedworker",
|
34
36
|
"webworker",
|
35
37
|
"ecmascript",
|
36
38
|
"css",
|
@@ -49,7 +51,7 @@
|
|
49
51
|
"clean-webpack-plugin": "^4.0.0",
|
50
52
|
"commander": "^12.1.0",
|
51
53
|
"cssnano": "^7.0.6",
|
52
|
-
"envinfo": "^7.
|
54
|
+
"envinfo": "^7.14.0",
|
53
55
|
"fs-extra": "^11.2.0",
|
54
56
|
"highlightjs-line-numbers.js": "^2.8.0",
|
55
57
|
"inquirer": "^10.2.2",
|
@@ -57,7 +59,7 @@
|
|
57
59
|
"monaco-editor": "0.50.0",
|
58
60
|
"neo-jsdoc": "1.0.1",
|
59
61
|
"neo-jsdoc-x": "1.0.5",
|
60
|
-
"postcss": "^8.4.
|
62
|
+
"postcss": "^8.4.47",
|
61
63
|
"sass": "^1.78.0",
|
62
64
|
"siesta-lite": "5.5.2",
|
63
65
|
"url": "^0.11.4",
|
@@ -5,6 +5,7 @@
|
|
5
5
|
cursor : default;
|
6
6
|
display : flex;
|
7
7
|
max-width : 800px;
|
8
|
+
margin : 0 auto;
|
8
9
|
overflow : hidden;
|
9
10
|
padding : 0;
|
10
11
|
transition : height var(--portal-transition-duration) ease-out, margin-bottom var(--portal-transition-duration) ease-out;
|
@@ -50,6 +51,21 @@
|
|
50
51
|
transition: margin var(--portal-transition-duration) ease-out;
|
51
52
|
}
|
52
53
|
|
54
|
+
.neo-multi-window {
|
55
|
+
align-items : center;
|
56
|
+
background-color: #fff;
|
57
|
+
border-radius : 50%;
|
58
|
+
box-shadow : 0 5px 10px rgba(0, 0, 0, 0.3);
|
59
|
+
color : #3E63DD;
|
60
|
+
display : flex;
|
61
|
+
height : 2em;
|
62
|
+
justify-content : center;
|
63
|
+
position : absolute;
|
64
|
+
right : 1em;
|
65
|
+
top : 1em;
|
66
|
+
width : 2em;
|
67
|
+
}
|
68
|
+
|
53
69
|
.neo-relative {
|
54
70
|
position: relative;
|
55
71
|
}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
.portal-examples-tab-container.neo-tab-container {
|
2
|
-
|
3
|
-
max-width: 830px;
|
2
|
+
|
4
3
|
}
|
5
4
|
|
5
|
+
// must not be inside the root class to honor the styling for tab button drag&drop
|
6
6
|
.portal-examples-tab-header-toolbar.neo-tab-header-toolbar {
|
7
7
|
background-color: #8BA6FF;
|
8
8
|
|
package/src/DefaultConfig.mjs
CHANGED
@@ -262,12 +262,12 @@ const DefaultConfig = {
|
|
262
262
|
useVdomWorker: true,
|
263
263
|
/**
|
264
264
|
* buildScripts/injectPackageVersion.mjs will update this value
|
265
|
-
* @default '7.
|
265
|
+
* @default '7.4.0'
|
266
266
|
* @memberOf! module:Neo
|
267
267
|
* @name config.version
|
268
268
|
* @type String
|
269
269
|
*/
|
270
|
-
version: '7.
|
270
|
+
version: '7.4.0'
|
271
271
|
};
|
272
272
|
|
273
273
|
Object.assign(DefaultConfig, {
|
package/src/Main.mjs
CHANGED
@@ -53,6 +53,7 @@ class Main extends core.Base {
|
|
53
53
|
'importAddon',
|
54
54
|
'log',
|
55
55
|
'redirectTo',
|
56
|
+
'reloadWindow',
|
56
57
|
'setNeoConfig',
|
57
58
|
'setRoute',
|
58
59
|
'windowClose',
|
@@ -410,6 +411,13 @@ class Main extends core.Base {
|
|
410
411
|
this.addon[addon.constructor.name] = addon
|
411
412
|
}
|
412
413
|
|
414
|
+
/**
|
415
|
+
* @param {Object} data
|
416
|
+
*/
|
417
|
+
reloadWindow(data) {
|
418
|
+
location.reload()
|
419
|
+
}
|
420
|
+
|
413
421
|
/**
|
414
422
|
* Triggers the different DOM operation queues
|
415
423
|
* @protected
|