neo.mjs 6.10.4 → 6.10.5
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/apps/ServiceWorker.mjs +2 -2
- package/apps/form/model/SideNav.mjs +3 -3
- package/apps/form/view/SideNavList.mjs +8 -3
- package/apps/form/view/ViewportController.mjs +6 -7
- package/apps/portal/Overwrites.mjs +21 -0
- package/apps/portal/app.mjs +7 -0
- package/apps/portal/data/blog.json +743 -0
- package/apps/portal/index.html +15 -0
- package/apps/portal/model/BlogPost.mjs +59 -0
- package/apps/{learnneo → portal}/model/Content.mjs +3 -3
- package/apps/{learnneo → portal}/neo-config.json +1 -1
- package/apps/portal/store/BlogPosts.mjs +43 -0
- package/apps/{learnneo → portal}/store/Content.mjs +2 -5
- package/apps/{learnneo/view/home → portal/view}/HeaderToolbar.mjs +22 -14
- package/apps/portal/view/Viewport.mjs +59 -0
- package/apps/portal/view/ViewportController.mjs +79 -0
- package/apps/portal/view/blog/Container.mjs +50 -0
- package/apps/portal/view/blog/List.mjs +173 -0
- package/apps/{newwebsite/view/Viewport.mjs → portal/view/home/MainContainer.mjs} +7 -8
- package/apps/{learnneo/view/home → portal/view/learn}/ContentTreeList.mjs +6 -6
- package/apps/{learnneo/view/home → portal/view/learn}/ContentView.mjs +3 -3
- package/apps/{learnneo/view → portal/view/learn}/LivePreview.mjs +6 -6
- package/apps/{learnneo/view/home → portal/view/learn}/MainContainer.mjs +27 -31
- package/apps/{learnneo/view/home → portal/view/learn}/MainContainerController.mjs +3 -3
- package/apps/{learnneo/view/home → portal/view/learn}/MainContainerModel.mjs +3 -3
- package/apps/website/Overwrites.mjs +16 -0
- package/apps/website/app.mjs +2 -1
- package/apps/website/view/blog/List.mjs +1 -1
- package/buildScripts/webpack/development/webpack.config.appworker.mjs +3 -1
- package/buildScripts/webpack/json/myApps.template.json +1 -1
- package/buildScripts/webpack/production/webpack.config.appworker.mjs +3 -1
- package/examples/ServiceWorker.mjs +2 -2
- package/package.json +2 -2
- package/resources/examples/data/formSideNav.json +19 -19
- package/resources/scss/src/apps/portal/blog/Container.scss +18 -0
- package/resources/scss/src/apps/portal/blog/List.scss +183 -0
- package/resources/scss/src/apps/{newwebsite/Viewport.scss → portal/home/MainContainer.scss} +1 -1
- package/resources/scss/src/tab/Strip.scss +1 -0
- package/resources/scss/theme-neo-light/button/Base.scss +5 -5
- package/resources/scss/theme-neo-light/tab/header/Button.scss +8 -7
- package/src/DefaultConfig.mjs +2 -2
- package/src/component/Base.mjs +5 -0
- package/src/component/Toast.mjs +5 -2
- package/src/container/Base.mjs +14 -0
- package/src/controller/Application.mjs +2 -1
- package/src/controller/Base.mjs +14 -3
- package/src/controller/Component.mjs +1 -1
- package/src/core/Base.mjs +7 -5
- package/src/data/RecordFactory.mjs +3 -3
- package/src/form/Container.mjs +50 -0
- package/src/form/field/Text.mjs +2 -2
- package/src/form/field/TextArea.mjs +5 -0
- package/src/main/addon/WindowPosition.mjs +24 -14
- package/src/tab/Strip.mjs +21 -36
- package/src/tab/header/Button.mjs +5 -7
- package/src/worker/Base.mjs +41 -29
- package/src/worker/Manager.mjs +4 -3
- package/src/worker/mixin/RemoteMethodAccess.mjs +20 -18
- package/apps/learnneo/app.mjs +0 -6
- package/apps/learnneo/index.html +0 -21
- package/apps/learnneo/view/Viewport.mjs +0 -52
- package/apps/learnneo/view/ViewportController.mjs +0 -19
- package/apps/newwebsite/app.mjs +0 -6
- package/apps/newwebsite/index.html +0 -13
- package/apps/newwebsite/neo-config.json +0 -7
- /package/resources/scss/src/apps/{learnneo/home → portal}/HeaderToolbar.scss +0 -0
- /package/resources/scss/src/apps/{learnneo → portal}/Viewport.scss +0 -0
- /package/resources/scss/src/apps/{learnneo/home → portal/learn}/ContentTreeList.scss +0 -0
- /package/resources/scss/src/apps/{learnneo/home → portal/learn}/ContentView.scss +0 -0
- /package/resources/scss/src/apps/{learnneo/home → portal/learn}/MainContainer.scss +0 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
<!DOCTYPE HTML>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
5
|
+
<meta charset="UTF-8">
|
6
|
+
<title>neo.mjs</title>
|
7
|
+
<link
|
8
|
+
href="https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&family=Source+Sans+3:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&family=Source+Serif+4:ital,opsz,wght@0,8..60,400;0,8..60,500;0,8..60,600;0,8..60,700;1,8..60,400;1,8..60,500;1,8..60,600;1,8..60,700&display=swap"
|
9
|
+
rel="stylesheet">
|
10
|
+
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
<script src="../../src/MicroLoader.mjs" type="module"></script>
|
14
|
+
</body>
|
15
|
+
</html>
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import Model from '../../../src/data/Model.mjs';
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @class Portal.model.BlogPost
|
5
|
+
* @extends Neo.data.Model
|
6
|
+
*/
|
7
|
+
class BlogPost extends Model {
|
8
|
+
static config = {
|
9
|
+
/**
|
10
|
+
* @member {String} className='Portal.model.BlogPost'
|
11
|
+
* @protected
|
12
|
+
*/
|
13
|
+
className: 'Portal.model.BlogPost',
|
14
|
+
/**
|
15
|
+
* @member {Object[]} fields
|
16
|
+
*/
|
17
|
+
fields: [{
|
18
|
+
name: 'author',
|
19
|
+
type: 'String'
|
20
|
+
}, {
|
21
|
+
name: 'authorImage',
|
22
|
+
type: 'String'
|
23
|
+
}, {
|
24
|
+
name: 'backgroundColor',
|
25
|
+
type: 'String'
|
26
|
+
}, {
|
27
|
+
name: 'date',
|
28
|
+
type: 'String'
|
29
|
+
}, {
|
30
|
+
name: 'id',
|
31
|
+
type: 'Integer'
|
32
|
+
}, {
|
33
|
+
name: 'image',
|
34
|
+
type: 'String'
|
35
|
+
}, {
|
36
|
+
name: 'name',
|
37
|
+
type: 'String'
|
38
|
+
}, {
|
39
|
+
name: 'provider',
|
40
|
+
type: 'String'
|
41
|
+
},{
|
42
|
+
name: 'publisher',
|
43
|
+
type: 'String'
|
44
|
+
}, {
|
45
|
+
name: 'selectedInto',
|
46
|
+
type: 'Array'
|
47
|
+
}, {
|
48
|
+
name: 'type',
|
49
|
+
type: 'String'
|
50
|
+
}, {
|
51
|
+
name: 'url',
|
52
|
+
type: 'String'
|
53
|
+
}]
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
Neo.applyClassConfig(BlogPost);
|
58
|
+
|
59
|
+
export default BlogPost;
|
@@ -1,16 +1,16 @@
|
|
1
1
|
import Model from '../../../src/data/Model.mjs';
|
2
2
|
|
3
3
|
/**
|
4
|
-
* @class
|
4
|
+
* @class Portal.model.Content
|
5
5
|
* @extends Neo.data.Model
|
6
6
|
*/
|
7
7
|
class Content extends Model {
|
8
8
|
static config = {
|
9
9
|
/**
|
10
|
-
* @member {String} className='
|
10
|
+
* @member {String} className='Portal.model.Content'
|
11
11
|
* @protected
|
12
12
|
*/
|
13
|
-
className: '
|
13
|
+
className: 'Portal.model.Content',
|
14
14
|
/**
|
15
15
|
* @member {Object[]} fields
|
16
16
|
*/
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import BlogPost from '../model/BlogPost.mjs';
|
2
|
+
import Store from '../../../src/data/Store.mjs';
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @class Portal.store.BlogPosts
|
6
|
+
* @extends Neo.data.Store
|
7
|
+
*/
|
8
|
+
class BlogPosts extends Store {
|
9
|
+
static config = {
|
10
|
+
/**
|
11
|
+
* @member {String} className='Portal.store.BlogPosts'
|
12
|
+
* @protected
|
13
|
+
*/
|
14
|
+
className: 'Portal.store.BlogPosts',
|
15
|
+
/**
|
16
|
+
* @member {Boolean} autoLoad=true
|
17
|
+
*/
|
18
|
+
autoLoad: true,
|
19
|
+
/**
|
20
|
+
* @member {String} keyProperty='id'
|
21
|
+
*/
|
22
|
+
keyProperty: 'id',
|
23
|
+
/**
|
24
|
+
* @member {Neo.data.Model} model=BlogPost
|
25
|
+
*/
|
26
|
+
model: BlogPost,
|
27
|
+
/**
|
28
|
+
* @member {Object[]} sorters=[{property: 'id', direction: 'DESC'}]
|
29
|
+
*/
|
30
|
+
sorters: [{
|
31
|
+
property : 'id',
|
32
|
+
direction: 'DESC'
|
33
|
+
}],
|
34
|
+
/**
|
35
|
+
* @member {String} url='../../apps/portal/data/blog.json'
|
36
|
+
*/
|
37
|
+
url: '../../apps/portal/data/blog.json'
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
Neo.applyClassConfig(BlogPosts);
|
42
|
+
|
43
|
+
export default BlogPosts;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import ContentModel from '../model/Content.mjs';
|
2
|
-
import Store
|
2
|
+
import Store from '../../../src/data/Store.mjs';
|
3
3
|
|
4
4
|
/**
|
5
5
|
* @class LearnNeo.store.Content
|
@@ -15,10 +15,7 @@ class Content extends Store {
|
|
15
15
|
/**
|
16
16
|
* @member {Neo.data.Model} model=ContentModel
|
17
17
|
*/
|
18
|
-
model: ContentModel
|
19
|
-
// autoLoad: true
|
20
|
-
|
21
|
-
|
18
|
+
model: ContentModel
|
22
19
|
}
|
23
20
|
|
24
21
|
xonConstructed() {
|
@@ -1,38 +1,47 @@
|
|
1
|
-
import Base from '
|
2
|
-
import Label from '
|
1
|
+
import Base from '../../../src/toolbar/Base.mjs';
|
2
|
+
import Label from '../../../src/component/Label.mjs';
|
3
3
|
|
4
4
|
/**
|
5
|
-
* @class
|
5
|
+
* @class Portal.view.learn.HeaderToolbar
|
6
6
|
* @extends Neo.container.Base
|
7
7
|
*/
|
8
8
|
class HeaderToolbar extends Base {
|
9
9
|
static config = {
|
10
10
|
/**
|
11
|
-
* @member {String} className='
|
11
|
+
* @member {String} className='Portal.view.learn.HeaderToolbar'
|
12
12
|
* @protected
|
13
13
|
*/
|
14
|
-
className: '
|
14
|
+
className: 'Portal.view.learn.HeaderToolbar',
|
15
15
|
/**
|
16
16
|
* @member {String[]} cls=['learnneo-header-toolbar']
|
17
17
|
*/
|
18
18
|
cls: ['learnneo-header-toolbar'],
|
19
|
+
/**
|
20
|
+
* @member {Object} itemDefaults
|
21
|
+
*/
|
22
|
+
itemDefaults: {
|
23
|
+
ntype: 'button',
|
24
|
+
ui : 'ghost'
|
25
|
+
},
|
19
26
|
/**
|
20
27
|
* @member {Object[]} items
|
21
28
|
*/
|
22
29
|
items: [{
|
23
|
-
|
24
|
-
|
25
|
-
text
|
30
|
+
cls : ['logo'],
|
31
|
+
route: '/home',
|
32
|
+
text : 'neo.mjs'
|
26
33
|
}, '->', {
|
27
|
-
text: '
|
28
|
-
|
34
|
+
text : 'Learn',
|
35
|
+
route: '/learn'
|
36
|
+
}, {
|
37
|
+
text : 'Blog',
|
38
|
+
reference: 'blog-header-button',
|
39
|
+
route : '/blog'
|
29
40
|
}, {
|
30
|
-
text: '
|
31
|
-
ui : 'ghost'
|
41
|
+
text: 'Docs'
|
32
42
|
}, {
|
33
43
|
cls : ['github-button'],
|
34
44
|
iconCls: 'fa-brands fa-github',
|
35
|
-
ui : 'ghost',
|
36
45
|
url : 'https://github.com/neomjs/neo',
|
37
46
|
tooltip: {
|
38
47
|
html: 'GitHub',
|
@@ -41,7 +50,6 @@ class HeaderToolbar extends Base {
|
|
41
50
|
}
|
42
51
|
}, {
|
43
52
|
iconCls: 'fa-brands fa-slack',
|
44
|
-
ui : 'ghost',
|
45
53
|
url : 'https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA',
|
46
54
|
tooltip: {
|
47
55
|
html: 'Join Slack',
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import BaseViewport from '../../../src/container/Viewport.mjs';
|
2
|
+
import Container from '../../../src/container/Base.mjs';
|
3
|
+
import HeaderToolbar from './HeaderToolbar.mjs';
|
4
|
+
import ViewportController from './ViewportController.mjs';
|
5
|
+
|
6
|
+
/**
|
7
|
+
* @class Portal.view.Viewport
|
8
|
+
* @extends Neo.container.Viewport
|
9
|
+
*/
|
10
|
+
class Viewport extends BaseViewport {
|
11
|
+
static config = {
|
12
|
+
/**
|
13
|
+
* @member {String} className='Portal.view.Viewport'
|
14
|
+
* @protected
|
15
|
+
*/
|
16
|
+
className: 'Portal.view.Viewport',
|
17
|
+
/**
|
18
|
+
* @member {Neo.controller.Component} controller=ViewportController
|
19
|
+
*/
|
20
|
+
controller: ViewportController,
|
21
|
+
/**
|
22
|
+
* @member {Object[]} items
|
23
|
+
*/
|
24
|
+
items: [{
|
25
|
+
module: HeaderToolbar,
|
26
|
+
flex : 'none'
|
27
|
+
}, {
|
28
|
+
module : Container,
|
29
|
+
layout : {ntype: 'card', activeIndex: null},
|
30
|
+
reference: 'main-content',
|
31
|
+
|
32
|
+
items: [
|
33
|
+
{module: () => import('./home/MainContainer.mjs')},
|
34
|
+
{module: () => import('./learn/MainContainer.mjs')},
|
35
|
+
{module: () => import('./blog/Container.mjs')}
|
36
|
+
]
|
37
|
+
}]
|
38
|
+
}
|
39
|
+
|
40
|
+
/**
|
41
|
+
*
|
42
|
+
*/
|
43
|
+
async onConstructed() {
|
44
|
+
super.onConstructed();
|
45
|
+
|
46
|
+
let me = this,
|
47
|
+
data = await Neo.Main.getByPath({path: 'location.search'}),
|
48
|
+
searchString = data?.substr(1),
|
49
|
+
search = searchString ? JSON.parse(`{"${decodeURI(searchString.replace(/&/g, "\",\"").replace(/=/g, "\":\""))}"}`) : {};
|
50
|
+
|
51
|
+
me.deck = search.deck || 'learnneo';
|
52
|
+
|
53
|
+
me.addCls(me.deck)
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
Neo.applyClassConfig(Viewport);
|
58
|
+
|
59
|
+
export default Viewport;
|
@@ -0,0 +1,79 @@
|
|
1
|
+
import Controller from '../../../src/controller/Component.mjs';
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @class Portal.view.ViewportController
|
5
|
+
* @extends Neo.controller.Component
|
6
|
+
*/
|
7
|
+
class ViewportController extends Controller {
|
8
|
+
static config = {
|
9
|
+
/**
|
10
|
+
* @member {String} className='Portal.view.ViewportController'
|
11
|
+
* @protected
|
12
|
+
*/
|
13
|
+
className: 'Portal.view.ViewportController',
|
14
|
+
/**
|
15
|
+
* @member {String|null} defaultHash='/home'
|
16
|
+
*/
|
17
|
+
defaultHash: '/home',
|
18
|
+
/**
|
19
|
+
* @member {Object} routes
|
20
|
+
*/
|
21
|
+
routes: {
|
22
|
+
'/blog' : 'onBlogRoute',
|
23
|
+
'/home' : 'onHomeRoute',
|
24
|
+
'/learn': 'onLearnRoute'
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
/**
|
29
|
+
* @param {Object[]} records
|
30
|
+
*/
|
31
|
+
onBlogPostStoreLoad(records) {
|
32
|
+
this.getReference('blog-header-button').badgeText = records.length + ''
|
33
|
+
}
|
34
|
+
|
35
|
+
/**
|
36
|
+
* @param {Object} params
|
37
|
+
* @param {Object} value
|
38
|
+
* @param {Object} oldValue
|
39
|
+
*/
|
40
|
+
onBlogRoute(params, value, oldValue) {
|
41
|
+
this.setMainContentIndex(2)
|
42
|
+
}
|
43
|
+
|
44
|
+
/**
|
45
|
+
* @param {Object} data
|
46
|
+
*/
|
47
|
+
onBlogSearchFieldChange(data) {
|
48
|
+
this.getReference('blog-list').filterItems(data)
|
49
|
+
}
|
50
|
+
|
51
|
+
/**
|
52
|
+
* @param {Object} params
|
53
|
+
* @param {Object} value
|
54
|
+
* @param {Object} oldValue
|
55
|
+
*/
|
56
|
+
onHomeRoute(params, value, oldValue) {
|
57
|
+
this.setMainContentIndex(0)
|
58
|
+
}
|
59
|
+
|
60
|
+
/**
|
61
|
+
* @param {Object} params
|
62
|
+
* @param {Object} value
|
63
|
+
* @param {Object} oldValue
|
64
|
+
*/
|
65
|
+
onLearnRoute(params, value, oldValue) {
|
66
|
+
this.setMainContentIndex(1)
|
67
|
+
}
|
68
|
+
|
69
|
+
/**
|
70
|
+
* @param {Number} value
|
71
|
+
*/
|
72
|
+
setMainContentIndex(value) {
|
73
|
+
this.getReference('main-content').layout.activeIndex = value
|
74
|
+
}
|
75
|
+
}
|
76
|
+
|
77
|
+
Neo.applyClassConfig(ViewportController);
|
78
|
+
|
79
|
+
export default ViewportController;
|
@@ -0,0 +1,50 @@
|
|
1
|
+
import BaseContainer from '../../../../src/container/Base.mjs';
|
2
|
+
import List from './List.mjs';
|
3
|
+
import SearchField from '../../../../src/form/field/Search.mjs';
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @class Portal.view.blog.Container
|
7
|
+
* @extends Neo.container.Base
|
8
|
+
*/
|
9
|
+
class Container extends BaseContainer {
|
10
|
+
static config = {
|
11
|
+
/**
|
12
|
+
* @member {String} className='Portal.view.blog.Container'
|
13
|
+
* @protected
|
14
|
+
*/
|
15
|
+
className: 'Portal.view.blog.Container',
|
16
|
+
/**
|
17
|
+
* @member {String[]} baseCls=['website-blog-container','neo-container']
|
18
|
+
*/
|
19
|
+
baseCls: ['website-blog-container', 'neo-container'],
|
20
|
+
/**
|
21
|
+
* @member {Array} items
|
22
|
+
*/
|
23
|
+
items: [{ //#323232
|
24
|
+
module: BaseContainer,
|
25
|
+
cls : ['website-blog-toolbar', 'neo-container'],
|
26
|
+
flex : 'none',
|
27
|
+
layout: {ntype: 'hbox', align: 'stretch'},
|
28
|
+
|
29
|
+
items: [{
|
30
|
+
module : SearchField,
|
31
|
+
cls : ['website-blog-searchfield', 'neo-searchfield', 'neo-textfield'],
|
32
|
+
listeners : {change: 'onBlogSearchFieldChange'},
|
33
|
+
placeholderText: 'Filter Items',
|
34
|
+
width : 240
|
35
|
+
}]
|
36
|
+
}, {
|
37
|
+
module : List,
|
38
|
+
flex : 1,
|
39
|
+
reference: 'blog-list'
|
40
|
+
}],
|
41
|
+
/**
|
42
|
+
* @member {Object} layout={ntype: 'vbox', align: 'stretch'}
|
43
|
+
*/
|
44
|
+
layout: {ntype: 'vbox', align: 'stretch'}
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
Neo.applyClassConfig(Container);
|
49
|
+
|
50
|
+
export default Container;
|
@@ -0,0 +1,173 @@
|
|
1
|
+
import BaseList from '../../../../src/list/Base.mjs';
|
2
|
+
import BlogPosts from '../../store/BlogPosts.mjs';
|
3
|
+
import VDomUtil from '../../../../src/util/VDom.mjs';
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @class Portal.view.blog.List
|
7
|
+
* @extends Neo.list.Base
|
8
|
+
*/
|
9
|
+
class List extends BaseList {
|
10
|
+
/**
|
11
|
+
* A regex to enforce a maxLength (word break)
|
12
|
+
* @member {RegExp} nameRegEx
|
13
|
+
* @protected
|
14
|
+
* @static
|
15
|
+
*/
|
16
|
+
static nameRegEx = /^(.{65}[^\s]*).*/
|
17
|
+
|
18
|
+
static config = {
|
19
|
+
/**
|
20
|
+
* @member {String} className='Portal.view.blog.List'
|
21
|
+
* @protected
|
22
|
+
*/
|
23
|
+
className: 'Portal.view.blog.List',
|
24
|
+
/**
|
25
|
+
* @member {String[]} baseCls=['website-blog-list','neo-list']
|
26
|
+
*/
|
27
|
+
baseCls: ['website-blog-list', 'neo-list'],
|
28
|
+
/**
|
29
|
+
* @member {Neo.data.Store} store=BlogPosts
|
30
|
+
*/
|
31
|
+
store: BlogPosts,
|
32
|
+
/**
|
33
|
+
* @member {Boolean} useWrapperNode=true
|
34
|
+
*/
|
35
|
+
useWrapperNode: true,
|
36
|
+
/**
|
37
|
+
* @member {Object} _vdom
|
38
|
+
*/
|
39
|
+
_vdom:
|
40
|
+
{cn: [
|
41
|
+
{tag: 'ul', cn: []}
|
42
|
+
]}
|
43
|
+
}
|
44
|
+
|
45
|
+
/**
|
46
|
+
* @param {Neo.data.Store} value
|
47
|
+
* @param {Neo.data.Store} oldValue
|
48
|
+
*/
|
49
|
+
afterSetStore(value, oldValue) {
|
50
|
+
super.afterSetStore(value, oldValue);
|
51
|
+
|
52
|
+
value.on({
|
53
|
+
load : 'onBlogPostStoreLoad',
|
54
|
+
scope: this.getController()
|
55
|
+
});
|
56
|
+
}
|
57
|
+
|
58
|
+
/**
|
59
|
+
* @param {Object} record
|
60
|
+
*/
|
61
|
+
createItemContent(record) {
|
62
|
+
let basePath;
|
63
|
+
|
64
|
+
if (Neo.config.isGitHubPages) {
|
65
|
+
basePath = '../../../../resources/website';
|
66
|
+
|
67
|
+
if (Neo.config.environment !== 'development') {
|
68
|
+
basePath = '../../' + basePath;
|
69
|
+
}
|
70
|
+
} else {
|
71
|
+
basePath = 'https://raw.githubusercontent.com/neomjs/pages/main/resources/website';
|
72
|
+
}
|
73
|
+
|
74
|
+
const vdomCn = [
|
75
|
+
{cls: ['content'], cn: [
|
76
|
+
{cls: ['neo-full-size', 'preview-image'], style: {
|
77
|
+
backgroundImage: `url('${basePath}/blog/${record.image}'), linear-gradient(#777, #333)`}
|
78
|
+
},
|
79
|
+
{cls: ['neo-relative'], cn: [
|
80
|
+
{cls: ['neo-absolute', 'neo-item-bottom-position'], cn: [
|
81
|
+
{tag: 'a', cls: ['neo-title'], href: record.url, target: '_blank', cn: [
|
82
|
+
{flag: 'name', html: record.name.replace(List.nameRegEx, "$1")}
|
83
|
+
]},
|
84
|
+
{cls: ['neo-top-20'], cn: [
|
85
|
+
{tag: 'img', cls: ['neo-user-image'], src: `${basePath}/blogAuthor/${record.authorImage}`},
|
86
|
+
{cls: ['neo-inner-content'], cn: [
|
87
|
+
{cls: ['neo-inner-details'], flag: 'author', cn: [
|
88
|
+
{tag: 'span', cls: ['neo-bold'], html: record.author}
|
89
|
+
]},
|
90
|
+
{cls: ['neo-inner-details'], html: record.date}
|
91
|
+
]}
|
92
|
+
]}
|
93
|
+
]}
|
94
|
+
]}
|
95
|
+
]}
|
96
|
+
];
|
97
|
+
|
98
|
+
if (record.publisher.length > 0) {
|
99
|
+
VDomUtil.getByFlag(vdomCn[0], 'author').cn.push(
|
100
|
+
{vtype: 'text', html : ' in '},
|
101
|
+
{tag: 'span', cls: ['neo-bold'], html: record.publisher}
|
102
|
+
);
|
103
|
+
}
|
104
|
+
|
105
|
+
if (record.selectedInto.length > 0) {
|
106
|
+
vdomCn[0].cn[1].cn.unshift(
|
107
|
+
{cls: ['neo-absolute', 'neo-item-top-position'], cn: [
|
108
|
+
{html: `Officially selected by ${record.provider} into`},
|
109
|
+
{cls: ['neo-bold'], html: record.selectedInto.join('</br>')}
|
110
|
+
]}
|
111
|
+
)
|
112
|
+
}
|
113
|
+
|
114
|
+
return vdomCn
|
115
|
+
}
|
116
|
+
|
117
|
+
/**
|
118
|
+
* Custom filtering logic
|
119
|
+
* @param {Object} data
|
120
|
+
*/
|
121
|
+
filterItems(data) {
|
122
|
+
let me = this,
|
123
|
+
emptyValue = !data.value || data.value === '',
|
124
|
+
store = me.store,
|
125
|
+
valueRegEx = new RegExp(data.value, 'gi'),
|
126
|
+
hasMatch, itemName, name, record;
|
127
|
+
|
128
|
+
me.getVdomRoot().cn.forEach((item, index) => {
|
129
|
+
hasMatch = false;
|
130
|
+
itemName = VDomUtil.getByFlag(item, 'name');
|
131
|
+
record = store.getAt(index);
|
132
|
+
name = record.name.replace(List.nameRegEx, "$1");
|
133
|
+
|
134
|
+
item.style = item.style || {};
|
135
|
+
|
136
|
+
if (emptyValue) {
|
137
|
+
itemName.html = name;
|
138
|
+
delete item.style.display
|
139
|
+
} else {
|
140
|
+
itemName.html = name.replace(valueRegEx, match => {
|
141
|
+
hasMatch = true;
|
142
|
+
return `<span class="neo-highlight-search">${match}</span>`
|
143
|
+
});
|
144
|
+
|
145
|
+
if (hasMatch) {
|
146
|
+
delete item.style.display
|
147
|
+
} else {
|
148
|
+
item.style.display = 'none'
|
149
|
+
}
|
150
|
+
}
|
151
|
+
});
|
152
|
+
|
153
|
+
me.update()
|
154
|
+
}
|
155
|
+
|
156
|
+
/**
|
157
|
+
* @returns {Object}
|
158
|
+
*/
|
159
|
+
getVdomRoot() {
|
160
|
+
return this.vdom.cn[0]
|
161
|
+
}
|
162
|
+
|
163
|
+
/**
|
164
|
+
* @returns {Object}
|
165
|
+
*/
|
166
|
+
getVnodeRoot() {
|
167
|
+
return this.vnode.childNodes[0]
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
Neo.applyClassConfig(List);
|
172
|
+
|
173
|
+
export default List;
|
@@ -1,18 +1,17 @@
|
|
1
|
-
import
|
2
|
-
import
|
3
|
-
import Container from '../../../src/container/Base.mjs';
|
1
|
+
import Button from '../../../../src/button/Base.mjs';
|
2
|
+
import Container from '../../../../src/container/Base.mjs';
|
4
3
|
|
5
4
|
/**
|
6
|
-
* @class
|
7
|
-
* @extends Neo.container.
|
5
|
+
* @class Portal.view.home.MainContainer
|
6
|
+
* @extends Neo.container.Base
|
8
7
|
*/
|
9
|
-
class Viewport extends
|
8
|
+
class Viewport extends Container {
|
10
9
|
static config = {
|
11
10
|
/**
|
12
|
-
* @member {String} className='
|
11
|
+
* @member {String} className='Portal.view.home.MainContainer'
|
13
12
|
* @protected
|
14
13
|
*/
|
15
|
-
className: '
|
14
|
+
className: 'Portal.view.home.MainContainer',
|
16
15
|
/**
|
17
16
|
* @member {String[]} cls=['newwebsite-viewport']
|
18
17
|
*/
|
@@ -1,18 +1,18 @@
|
|
1
1
|
import ContentStore from '../../store/Content.mjs'
|
2
|
-
import
|
3
|
-
import
|
2
|
+
import LivePreview from './LivePreview.mjs';
|
3
|
+
import TreeList from '../../../../src/tree/List.mjs';
|
4
4
|
|
5
5
|
/**
|
6
|
-
* @class
|
6
|
+
* @class Portal.view.learn.ContentTreeList
|
7
7
|
* @extends Neo.container.Base
|
8
8
|
*/
|
9
9
|
class ContentTreeList extends TreeList {
|
10
10
|
static config = {
|
11
11
|
/**
|
12
|
-
* @member {String} className='
|
12
|
+
* @member {String} className='Portal.view.learn.ContentTreeList'
|
13
13
|
* @protected
|
14
14
|
*/
|
15
|
-
className: '
|
15
|
+
className: 'Portal.view.learn.ContentTreeList',
|
16
16
|
/**
|
17
17
|
* @member {String[]} cls=['topics-tree']
|
18
18
|
*/
|
@@ -78,7 +78,7 @@ class ContentTreeList extends TreeList {
|
|
78
78
|
}
|
79
79
|
|
80
80
|
extractNeoContent(htmlString, map) {
|
81
|
-
// 1. Replace <pre data-neo> with <div id='neo-preview-2'/>
|
81
|
+
// 1. Replace <pre data-neo> with <div id='neo-preview-2'/>
|
82
82
|
// and update map with key/value pairs, where the key is the ID and the value is the <pre> contents.
|
83
83
|
|
84
84
|
// Define a regular expression to match <pre data-javascript> tags
|
@@ -1,16 +1,16 @@
|
|
1
1
|
import Component from '../../../../src/component/Base.mjs';
|
2
2
|
|
3
3
|
/**
|
4
|
-
* @class
|
4
|
+
* @class Portal.view.learn.ContentView
|
5
5
|
* @extends Neo.component.Base
|
6
6
|
*/
|
7
7
|
class ContentView extends Component {
|
8
8
|
static config = {
|
9
9
|
/**
|
10
|
-
* @member {String} className='
|
10
|
+
* @member {String} className='Portal.view.learn.ContentView'
|
11
11
|
* @protected
|
12
12
|
*/
|
13
|
-
className: '
|
13
|
+
className: 'Portal.view.learn.ContentView',
|
14
14
|
/**
|
15
15
|
* @member {String[]} baseCls=['learn-content']
|
16
16
|
* @protected
|