neo.mjs 6.10.3 → 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/portal/view/HeaderToolbar.mjs +65 -0
- 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 +32 -19
- 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/data/deck/learnneo/p/stylesheet.md +4 -1
- package/resources/design-tokens/json/component.json +22 -0
- package/resources/design-tokens/json/core.json +4 -0
- package/resources/design-tokens/json/semantic.json +8 -0
- 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/src/tooltip/Base.scss +10 -6
- package/resources/scss/theme-dark/tooltip/Base.scss +10 -0
- package/resources/scss/theme-light/tooltip/Base.scss +10 -0
- package/resources/scss/theme-neo-light/button/Base.scss +24 -20
- package/resources/scss/theme-neo-light/design-tokens/Component.scss +6 -0
- package/resources/scss/theme-neo-light/design-tokens/Core.scss +2 -0
- package/resources/scss/theme-neo-light/design-tokens/Semantic.scss +4 -2
- package/resources/scss/theme-neo-light/tab/header/Button.scss +8 -7
- package/resources/scss/theme-neo-light/tooltip/Base.scss +13 -0
- package/src/DefaultConfig.mjs +2 -2
- package/src/Main.mjs +1 -1
- 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/core/Observable.mjs +15 -15
- 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 +72 -34
- package/src/tab/Strip.mjs +21 -36
- package/src/tab/header/Button.mjs +5 -7
- package/src/worker/App.mjs +26 -1
- package/src/worker/Base.mjs +41 -29
- package/src/worker/Canvas.mjs +4 -4
- 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/learnneo/view/home/HeaderToolbar.mjs +0 -47
- 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() {
|
@@ -0,0 +1,65 @@
|
|
1
|
+
import Base from '../../../src/toolbar/Base.mjs';
|
2
|
+
import Label from '../../../src/component/Label.mjs';
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @class Portal.view.learn.HeaderToolbar
|
6
|
+
* @extends Neo.container.Base
|
7
|
+
*/
|
8
|
+
class HeaderToolbar extends Base {
|
9
|
+
static config = {
|
10
|
+
/**
|
11
|
+
* @member {String} className='Portal.view.learn.HeaderToolbar'
|
12
|
+
* @protected
|
13
|
+
*/
|
14
|
+
className: 'Portal.view.learn.HeaderToolbar',
|
15
|
+
/**
|
16
|
+
* @member {String[]} cls=['learnneo-header-toolbar']
|
17
|
+
*/
|
18
|
+
cls: ['learnneo-header-toolbar'],
|
19
|
+
/**
|
20
|
+
* @member {Object} itemDefaults
|
21
|
+
*/
|
22
|
+
itemDefaults: {
|
23
|
+
ntype: 'button',
|
24
|
+
ui : 'ghost'
|
25
|
+
},
|
26
|
+
/**
|
27
|
+
* @member {Object[]} items
|
28
|
+
*/
|
29
|
+
items: [{
|
30
|
+
cls : ['logo'],
|
31
|
+
route: '/home',
|
32
|
+
text : 'neo.mjs'
|
33
|
+
}, '->', {
|
34
|
+
text : 'Learn',
|
35
|
+
route: '/learn'
|
36
|
+
}, {
|
37
|
+
text : 'Blog',
|
38
|
+
reference: 'blog-header-button',
|
39
|
+
route : '/blog'
|
40
|
+
}, {
|
41
|
+
text: 'Docs'
|
42
|
+
}, {
|
43
|
+
cls : ['github-button'],
|
44
|
+
iconCls: 'fa-brands fa-github',
|
45
|
+
url : 'https://github.com/neomjs/neo',
|
46
|
+
tooltip: {
|
47
|
+
html: 'GitHub',
|
48
|
+
showDelay: '0',
|
49
|
+
hideDelay: '0'
|
50
|
+
}
|
51
|
+
}, {
|
52
|
+
iconCls: 'fa-brands fa-slack',
|
53
|
+
url : 'https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA',
|
54
|
+
tooltip: {
|
55
|
+
html: 'Join Slack',
|
56
|
+
showDelay: '0',
|
57
|
+
hideDelay: '0'
|
58
|
+
}
|
59
|
+
}]
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
Neo.applyClassConfig(HeaderToolbar);
|
64
|
+
|
65
|
+
export default HeaderToolbar;
|
@@ -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
|