Migrate to mithril.js

This commit is contained in:
2023-02-18 09:22:43 +03:00
parent 024d7fb10d
commit bdc8f8496f
79 changed files with 1697 additions and 149 deletions
@@ -0,0 +1,3 @@
{% include '/private/components/menu-general.js' %}
{% include '/private/components/pages.js' %}
{% include '/private/components/users.js' %}
@@ -0,0 +1,43 @@
function MenuGeneral() {
function logout() {
m.request({
url: '/api',
method: "POST",
body: {
"jsonrpc": "2.0",
"method": 'auth.logout',
"id": 1
}
}).then(
function(response) {
if ('result' in response) {
window.location.href = '/';
}
}
);
};
return {
oninit: function(vnode) {
document.title = SETTINGS.TITLE;
},
view: function(vnode) {
result = [];
result.push(
m('div', {class: 'row'},
m('div', {class: 'col py-2'}, [
m(m.route.Link, {class: 'btn btn-outline-secondary', href: '/'}, m('i', {class: 'fa fa-home'})),
m(m.route.Link, {class: 'btn btn-outline-secondary border-0', href: '/pages'}, 'Статьи'),
m(m.route.Link, {class: 'btn btn-outline-secondary border-0', href: '/tags'}, 'Метки'),
m(m.route.Link, {class: 'btn btn-outline-secondary border-0', href: '/users'}, 'Пользователи'),
m(m.route.Link, {class: 'btn btn-outline-secondary border-0', href: '/api/browse'}, 'API JSON-RPC'),
m('div', {class: 'btn-group float-end'},
m(m.route.Link, {class: 'btn btn-outline-secondary', href: '/profile'}, m('i', {class: 'fa fa-user'})),
m('button', {class: "btn btn-outline-danger", onclick: logout}, m('i', {class: "fa fa-sign-out"})),
)
])
)
)
return result;
}
};
};
@@ -0,0 +1,57 @@
function ComponentPages() {
let data = {
pages: null,
};
function page_render(page, pageIdx) {
let odd = '';
if (pageIdx % 2) {
odd = ' bg-light'
};
let tags = page.tags.map(
function(tag, tagIdx) {
return [
m('i', {class: "fa fa-tag"}),
{tag: '<', children: '&nbsp;'},
m(m.route.Link, {class: "font-monospace text-decoration-none", href: `/tag/${tag.id}`}, tag.name),
{tag: '<', children: '&nbsp;'},
]
}
);
return m('div', {class: 'row'},
m('div', {class: "col py-2" + odd}, [
m(m.route.Link, {class: "text-decoration-none", href: `/page/${page.id}`}, m.trust(page.title)),
m('div', {class: 'row'},
m('div', {class: 'col text-muted'},
m('small', [...tags])
)
)
])
)
};
function pages_render() {
return data.pages.map(page_render);
};
return {
oninit: function(vnode) {
console.log('ComponentPages.oninit');
for (let key in vnode.attrs){
data[key] = vnode.attrs[key];
};
},
onupdate: function(vnode) {
console.log('ComponentPages.onupdate');
for (let key in vnode.attrs){
data[key] = vnode.attrs[key];
};
},
view: function() {
console.log('ComponentPages.view');
if (data.pages!=null) {
let result = [];
result.push(pages_render());
return result;
};
}
};
};
@@ -0,0 +1,41 @@
function ComponentUsers() {
let data = {
users: null,
};
function user_render(user, userIdx) {
let odd = '';
if (userIdx % 2) {
odd = ' bg-light'
};
return m('div', {class: 'row'},
m('div', {class: "col py-2" + odd}, [
m(m.route.Link, {class: "text-decoration-none", href: `/user/${user.id}`}, m.trust(user.name)),
])
)
};
function users_render() {
return data.users.map(user_render);
};
return {
oninit: function(vnode) {
console.log('ComponentUsers.oninit');
for (let key in vnode.attrs){
data[key] = vnode.attrs[key];
};
},
onupdate: function(vnode) {
console.log('ComponentUsers.onupdate');
for (let key in vnode.attrs){
data[key] = vnode.attrs[key];
};
},
view: function() {
console.log('ComponentUsers.view');
if (data.users!=null) {
let result = [];
result.push(users_render());
return result;
};
}
};
};