Update filter
This commit is contained in:
62
docs/source/conf.py
Normal file
62
docs/source/conf.py
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# Configuration file for the Sphinx documentation builder.
|
||||||
|
#
|
||||||
|
# This file only contains a selection of the most common options. For a full
|
||||||
|
# list see the documentation:
|
||||||
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
||||||
|
|
||||||
|
# -- Path setup --------------------------------------------------------------
|
||||||
|
|
||||||
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
|
#
|
||||||
|
# import os
|
||||||
|
# import sys
|
||||||
|
# sys.path.insert(0, os.path.abspath('.'))
|
||||||
|
|
||||||
|
|
||||||
|
# -- Project information -----------------------------------------------------
|
||||||
|
|
||||||
|
project = 'myapp'
|
||||||
|
copyright = 'RemiZOffAlex'
|
||||||
|
author = 'RemiZOffAlex'
|
||||||
|
|
||||||
|
# The full version, including alpha/beta/rc tags
|
||||||
|
release = '0.2'
|
||||||
|
|
||||||
|
|
||||||
|
# -- General configuration ---------------------------------------------------
|
||||||
|
|
||||||
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||||
|
# ones.
|
||||||
|
extensions = [
|
||||||
|
]
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
|
templates_path = ['_templates']
|
||||||
|
|
||||||
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
|
# for a list of supported languages.
|
||||||
|
#
|
||||||
|
# This is also used if you do content translation via gettext catalogs.
|
||||||
|
# Usually you set "language" from the command line for these cases.
|
||||||
|
language = 'ru'
|
||||||
|
|
||||||
|
# List of patterns, relative to source directory, that match files and
|
||||||
|
# directories to ignore when looking for source files.
|
||||||
|
# This pattern also affects html_static_path and html_extra_path.
|
||||||
|
exclude_patterns = []
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for HTML output -------------------------------------------------
|
||||||
|
|
||||||
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
|
# a list of builtin themes.
|
||||||
|
#
|
||||||
|
html_theme = 'classic'
|
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
html_static_path = ['_static']
|
||||||
9
src/myapp/ns_api/page/__init__.py
Normal file
9
src/myapp/ns_api/page/__init__.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
__author__ = 'RemiZOffAlex'
|
||||||
|
__copyright__ = '(c) RemiZOffAlex'
|
||||||
|
__email__ = 'remizoffalex@mail.ru'
|
||||||
|
|
||||||
|
|
||||||
|
from . import ( # noqa F401
|
||||||
|
common,
|
||||||
|
favorite
|
||||||
|
)
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
__author__ = 'RemiZOffAlex'
|
__author__ = 'RemiZOffAlex'
|
||||||
__email__ = 'remizoffalex@mail.ru'
|
__email__ = 'remizoffalex@mail.ru'
|
||||||
|
|
||||||
from . import jsonrpc, login_required
|
from .. import jsonrpc, login_required
|
||||||
from .. import app, lib, models
|
from ... import app, lib, models
|
||||||
from ..mutations.page import page_as_dict
|
from ...mutations.page import page_as_dict
|
||||||
|
|
||||||
|
|
||||||
@jsonrpc.method('page')
|
@jsonrpc.method('page')
|
||||||
@@ -68,7 +68,7 @@ def page_destroy(id: int) -> bool:
|
|||||||
|
|
||||||
@jsonrpc.method('page.update')
|
@jsonrpc.method('page.update')
|
||||||
@login_required
|
@login_required
|
||||||
def page_update(id: int, title: str, text: str) -> dict:
|
def page_update(id: int, title: str, body: str) -> dict:
|
||||||
"""Обновить статью
|
"""Обновить статью
|
||||||
"""
|
"""
|
||||||
page = models.db_session.query(
|
page = models.db_session.query(
|
||||||
@@ -80,13 +80,10 @@ def page_update(id: int, title: str, text: str) -> dict:
|
|||||||
raise ValueError
|
raise ValueError
|
||||||
|
|
||||||
page.title = title
|
page.title = title
|
||||||
page.text = text
|
page.body = body
|
||||||
|
models.db_session.commit()
|
||||||
|
|
||||||
result = page.as_dict()
|
result = page_as_dict(page)
|
||||||
result['user'] = page.user.as_dict()
|
|
||||||
result['tags'] = []
|
|
||||||
for tagLink in page.tags:
|
|
||||||
result['tags'].append(tagLink.tag.as_dict())
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
55
src/myapp/ns_api/page/favorite.py
Normal file
55
src/myapp/ns_api/page/favorite.py
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
__author__ = 'RemiZOffAlex'
|
||||||
|
__email__ = 'remizoffalex@mail.ru'
|
||||||
|
|
||||||
|
from .. import jsonrpc, login_required
|
||||||
|
from ... import acl, app, lib, models
|
||||||
|
from ...mutations.page import page_as_dict
|
||||||
|
|
||||||
|
|
||||||
|
@jsonrpc.method('page.favorite.add')
|
||||||
|
@login_required
|
||||||
|
def page_favorite_add(id: int) -> bool:
|
||||||
|
"""Добавление статьи в избранное
|
||||||
|
"""
|
||||||
|
page = models.db_session.query(
|
||||||
|
models.Page
|
||||||
|
).filter(
|
||||||
|
models.Page.id == id
|
||||||
|
).first()
|
||||||
|
if page is None:
|
||||||
|
raise ValueError
|
||||||
|
exist = models.db_session.query(
|
||||||
|
models.PageFavorite
|
||||||
|
).filter(
|
||||||
|
models.PageFavorite.page_id == id,
|
||||||
|
models.PageFavorite.user_id == lib.get_user().id
|
||||||
|
).first()
|
||||||
|
if exist:
|
||||||
|
raise ValueError
|
||||||
|
|
||||||
|
new_favorite_page = models.PageFavorite(
|
||||||
|
lib.get_user(),
|
||||||
|
page
|
||||||
|
)
|
||||||
|
models.db_session.add(new_favorite_page)
|
||||||
|
models.db_session.commit()
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
@jsonrpc.method('page.favorite.delete')
|
||||||
|
@login_required
|
||||||
|
def page_favorite_delete(id: int) -> bool:
|
||||||
|
"""Удаление статьи из избранного
|
||||||
|
"""
|
||||||
|
exist = models.db_session.query(
|
||||||
|
models.PageFavorite
|
||||||
|
).filter(
|
||||||
|
models.PageFavorite.page_id == id,
|
||||||
|
models.PageFavorite.user_id == lib.get_user().id
|
||||||
|
).first()
|
||||||
|
if exist is None:
|
||||||
|
raise ValueError
|
||||||
|
models.db_session.delete(exist)
|
||||||
|
models.db_session.commit()
|
||||||
|
return True
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
function PanelFilter() {
|
function PanelFilter() {
|
||||||
let data = {
|
let data = {
|
||||||
visible: false,
|
|
||||||
value: '',
|
value: '',
|
||||||
|
visible: true,
|
||||||
isregex: false,
|
isregex: false,
|
||||||
};
|
};
|
||||||
function filter_clear() {
|
function filter_clear() {
|
||||||
@@ -20,12 +20,37 @@ function PanelFilter() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
return {
|
return {
|
||||||
data: data,
|
|
||||||
oninit: function(vnode) {
|
oninit: function(vnode) {
|
||||||
console.log('PanelFilter.oninit');
|
console.log('PanelFilter.oninit');
|
||||||
for (let key in vnode.attrs){
|
for (let key in vnode.attrs){
|
||||||
data[key] = vnode.attrs[key];
|
console.log(key, vnode.attrs[key]);
|
||||||
|
// data[key] = vnode.attrs[key];
|
||||||
|
Object.defineProperty(data, key, {
|
||||||
|
get() {
|
||||||
|
return vnode.attrs[key]
|
||||||
|
},
|
||||||
|
set(value) {
|
||||||
|
vnode.attrs[key] = value
|
||||||
|
},
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
console.log(data);
|
||||||
|
},
|
||||||
|
onbeforeupdate: function (vnode) {
|
||||||
|
console.log('PanelFilter.onbeforeupdate');
|
||||||
|
for (let key in vnode.attrs){
|
||||||
|
console.log(key, vnode.attrs[key]);
|
||||||
|
// data[key] = vnode.attrs[key];
|
||||||
|
Object.defineProperty(data, key, {
|
||||||
|
get() {
|
||||||
|
return vnode.attrs[key]
|
||||||
|
},
|
||||||
|
set(value) {
|
||||||
|
vnode.attrs[key] = value
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
console.log(data);
|
||||||
},
|
},
|
||||||
view: function() {
|
view: function() {
|
||||||
console.log('PanelFilter.view');
|
console.log('PanelFilter.view');
|
||||||
|
|||||||
@@ -4,3 +4,4 @@
|
|||||||
{% include '/components/info.js' %}
|
{% include '/components/info.js' %}
|
||||||
{% include '/components/order_by.js' %}
|
{% include '/components/order_by.js' %}
|
||||||
{% include '/components/pagination.js' %}
|
{% include '/components/pagination.js' %}
|
||||||
|
{% include '/components/tag_short.js' %}
|
||||||
|
|||||||
67
src/myapp/templates/components/tag_short.js
Normal file
67
src/myapp/templates/components/tag_short.js
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
function TagShort() {
|
||||||
|
let data = {
|
||||||
|
tag: null,
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
oninit: function(vnode) {
|
||||||
|
console.log('TagShort.oninit');
|
||||||
|
for (let key in vnode.attrs){
|
||||||
|
data[key] = vnode.attrs[key];
|
||||||
|
};
|
||||||
|
},
|
||||||
|
onbeforeupdate: function(vnode) {
|
||||||
|
console.log('TagShort.onbeforeupdate');
|
||||||
|
for (let key in vnode.attrs){
|
||||||
|
data[key] = vnode.attrs[key];
|
||||||
|
};
|
||||||
|
},
|
||||||
|
view: function(vnode) {
|
||||||
|
console.log('TagShort.view');
|
||||||
|
console.log(data);
|
||||||
|
if (data.tag!=null) {
|
||||||
|
return [
|
||||||
|
m('i', {class: 'fa fa-tag me-1'}),
|
||||||
|
m(m.route.Link, {class: "text-decoration-none me-2", href: `/tag/${data.tag.id}`}, data.tag.name),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
function TagsShort() {
|
||||||
|
let data = {
|
||||||
|
tags: null,
|
||||||
|
};
|
||||||
|
function tag_render(tag, tagIdx) {
|
||||||
|
return [
|
||||||
|
m('i', {class: 'fa fa-tag me-1'}),
|
||||||
|
m(m.route.Link, {class: "text-decoration-none font-monospace me-2", href: `/tag/${tag.id}`}, tag.name),
|
||||||
|
]
|
||||||
|
};
|
||||||
|
function tags_render() {
|
||||||
|
return data.tags.map(tag_render);
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
oninit: function(vnode) {
|
||||||
|
console.log('TagsShort.oninit');
|
||||||
|
for (let key in vnode.attrs){
|
||||||
|
data[key] = vnode.attrs[key];
|
||||||
|
};
|
||||||
|
},
|
||||||
|
onbeforeupdate: function(vnode) {
|
||||||
|
console.log('TagsShort.onbeforeupdate');
|
||||||
|
for (let key in vnode.attrs){
|
||||||
|
data[key] = vnode.attrs[key];
|
||||||
|
};
|
||||||
|
},
|
||||||
|
view: function(vnode) {
|
||||||
|
console.log('TagsShort.view');
|
||||||
|
if (data.tags!=null) {
|
||||||
|
return m('div', {class: 'row'},
|
||||||
|
m('div', {class: 'col text-muted py-2'},
|
||||||
|
m('small', tags_render())
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -7,25 +7,11 @@ function ComponentPages() {
|
|||||||
if (pageIdx % 2) {
|
if (pageIdx % 2) {
|
||||||
odd = ' bg-light'
|
odd = ' bg-light'
|
||||||
};
|
};
|
||||||
let tags = page.tags.map(
|
|
||||||
function(tag, tagIdx) {
|
|
||||||
return [
|
|
||||||
m('i', {class: "fa fa-tag"}),
|
|
||||||
{tag: '<', children: ' '},
|
|
||||||
m(m.route.Link, {class: "font-monospace text-decoration-none", href: `/tag/${tag.id}`}, tag.name),
|
|
||||||
{tag: '<', children: ' '},
|
|
||||||
]
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
return m('div', {class: 'row'},
|
return m('div', {class: 'row'},
|
||||||
m('div', {class: "col py-2" + odd}, [
|
m('div', {class: "col py-2" + odd}, [
|
||||||
m(m.route.Link, {class: "text-decoration-none", href: `/page/${page.id}`}, m.trust(page.title)),
|
m(m.route.Link, {class: "text-decoration-none", href: `/page/${page.id}`}, m.trust(page.title)),
|
||||||
m('div', {class: 'row'},
|
m(TagsShort, { tags: page.tags }),
|
||||||
m('div', {class: 'col text-muted'},
|
|
||||||
m('small', [...tags])
|
|
||||||
)
|
|
||||||
)
|
|
||||||
])
|
])
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
@@ -39,8 +25,8 @@ function ComponentPages() {
|
|||||||
data[key] = vnode.attrs[key];
|
data[key] = vnode.attrs[key];
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
onupdate: function(vnode) {
|
onbeforeupdate: function(vnode) {
|
||||||
console.log('ComponentPages.onupdate');
|
console.log('ComponentPages.onbeforeupdate');
|
||||||
for (let key in vnode.attrs){
|
for (let key in vnode.attrs){
|
||||||
data[key] = vnode.attrs[key];
|
data[key] = vnode.attrs[key];
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
function FavoriteNotes() {
|
function FavoriteNotes() {
|
||||||
let data = {
|
let data = {
|
||||||
filter: PanelFilter(),
|
filter: {
|
||||||
|
value: '',
|
||||||
|
isregex: false,
|
||||||
|
visible: false
|
||||||
|
},
|
||||||
order_by: PanelOrderBy({
|
order_by: PanelOrderBy({
|
||||||
field: 'updated',
|
field: 'updated',
|
||||||
fields: [
|
fields: [
|
||||||
@@ -92,7 +96,7 @@ function FavoriteNotes() {
|
|||||||
m('div', {class: 'col h1 py-2'}, [
|
m('div', {class: 'col h1 py-2'}, [
|
||||||
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
||||||
m(m.route.Link, {class: "btn btn-outline-secondary", href: '/favorite', title: "Вернуться"}, m('i', {class: "fa fa-chevron-left"})),
|
m(m.route.Link, {class: "btn btn-outline-secondary", href: '/favorite', title: "Вернуться"}, m('i', {class: "fa fa-chevron-left"})),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter) }},
|
||||||
m('i', {class: "fa fa-filter"})
|
m('i', {class: "fa fa-filter"})
|
||||||
),
|
),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
||||||
@@ -104,11 +108,11 @@ function FavoriteNotes() {
|
|||||||
),
|
),
|
||||||
m('hr'),
|
m('hr'),
|
||||||
m(MenuFavorite, {menuitem: 'notes'}),
|
m(MenuFavorite, {menuitem: 'notes'}),
|
||||||
|
m(PanelFilter, data.filter),
|
||||||
|
m(data.order_by),
|
||||||
|
m(Pagination, data.pagination),
|
||||||
);
|
);
|
||||||
|
|
||||||
result.push(m(data.filter));
|
|
||||||
result.push(m(data.order_by));
|
|
||||||
result.push(m(Pagination, data.pagination));
|
|
||||||
if (data.notes.length>0) {
|
if (data.notes.length>0) {
|
||||||
result.push(m(ComponentNotes, {notes: data.notes}));
|
result.push(m(ComponentNotes, {notes: data.notes}));
|
||||||
result.push(m(Pagination, data.pagination));
|
result.push(m(Pagination, data.pagination));
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
function FavoritePages() {
|
function FavoritePages() {
|
||||||
let data = {
|
let data = {
|
||||||
filter: PanelFilter(),
|
filter: {
|
||||||
|
value: '',
|
||||||
|
isregex: false,
|
||||||
|
visible: false
|
||||||
|
},
|
||||||
order_by: PanelOrderBy({
|
order_by: PanelOrderBy({
|
||||||
field: 'updated',
|
field: 'updated',
|
||||||
fields: [
|
fields: [
|
||||||
@@ -92,7 +96,7 @@ function FavoritePages() {
|
|||||||
m('div', {class: 'col h1 py-2'}, [
|
m('div', {class: 'col h1 py-2'}, [
|
||||||
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
||||||
m(m.route.Link, {class: "btn btn-outline-secondary", href: '/favorite', title: "Вернуться"}, m('i', {class: "fa fa-chevron-left"})),
|
m(m.route.Link, {class: "btn btn-outline-secondary", href: '/favorite', title: "Вернуться"}, m('i', {class: "fa fa-chevron-left"})),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter) }},
|
||||||
m('i', {class: "fa fa-filter"})
|
m('i', {class: "fa fa-filter"})
|
||||||
),
|
),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
||||||
@@ -104,11 +108,11 @@ function FavoritePages() {
|
|||||||
),
|
),
|
||||||
m('hr'),
|
m('hr'),
|
||||||
m(MenuFavorite, {menuitem: 'pages'}),
|
m(MenuFavorite, {menuitem: 'pages'}),
|
||||||
|
m(PanelFilter, data.filter),
|
||||||
|
m(data.order_by),
|
||||||
|
m(Pagination, data.pagination),
|
||||||
);
|
);
|
||||||
|
|
||||||
result.push(m(data.filter));
|
|
||||||
result.push(m(data.order_by));
|
|
||||||
result.push(m(Pagination, data.pagination));
|
|
||||||
if (data.pages.length>0) {
|
if (data.pages.length>0) {
|
||||||
result.push(m(ComponentPages, {pages: data.pages}));
|
result.push(m(ComponentPages, {pages: data.pages}));
|
||||||
result.push(m(Pagination, data.pagination));
|
result.push(m(Pagination, data.pagination));
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
function Notes() {
|
function Notes() {
|
||||||
let data = {
|
let data = {
|
||||||
filter: PanelFilter(),
|
filter: {
|
||||||
|
value: '',
|
||||||
|
isregex: false,
|
||||||
|
visible: false
|
||||||
|
},
|
||||||
order_by: PanelOrderBy({
|
order_by: PanelOrderBy({
|
||||||
field: 'title',
|
field: 'title',
|
||||||
fields: [
|
fields: [
|
||||||
@@ -86,7 +90,7 @@ function Notes() {
|
|||||||
m('div', {class: 'col py-2 h1'}, [
|
m('div', {class: 'col py-2 h1'}, [
|
||||||
m(m.route.Link, {class: 'btn btn-outline-success btn-lg float-end', href: '/note/add'}, m('i', {class: 'fa fa-plus'})),
|
m(m.route.Link, {class: 'btn btn-outline-success btn-lg float-end', href: '/note/add'}, m('i', {class: 'fa fa-plus'})),
|
||||||
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter) }},
|
||||||
m('i', {class: "fa fa-filter"})
|
m('i', {class: "fa fa-filter"})
|
||||||
),
|
),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
||||||
@@ -96,11 +100,11 @@ function Notes() {
|
|||||||
'Мои заметки',
|
'Мои заметки',
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
m('hr')
|
m('hr'),
|
||||||
|
m(PanelFilter, data.filter),
|
||||||
|
m(data.order_by),
|
||||||
|
m(Pagination, data.pagination),
|
||||||
]);
|
]);
|
||||||
result.push(m(data.filter));
|
|
||||||
result.push(m(data.order_by));
|
|
||||||
result.push(m(Pagination, data.pagination));
|
|
||||||
if (data.notes.length>0) {
|
if (data.notes.length>0) {
|
||||||
result.push(m(ComponentNotes, {notes: data.notes}));
|
result.push(m(ComponentNotes, {notes: data.notes}));
|
||||||
result.push(m(Pagination, data.pagination));
|
result.push(m(Pagination, data.pagination));
|
||||||
|
|||||||
193
src/myapp/templates/private/domains/page/edit.js
Normal file
193
src/myapp/templates/private/domains/page/edit.js
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
function PageEdit() {
|
||||||
|
let data = {
|
||||||
|
uuid: get_id(),
|
||||||
|
page: null,
|
||||||
|
panels: {
|
||||||
|
standart: {
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
editor: null,
|
||||||
|
};
|
||||||
|
function breadcrumbs_render() {
|
||||||
|
let result = m('ul', {class: 'breadcrumb mt-2'}, [
|
||||||
|
m('li', {class: 'breadcrumb-item'}, m(m.route.Link, {href: '/'}, m('i', {class: 'fa fa-home'}))),
|
||||||
|
m('li', {class: 'breadcrumb-item'}, m(m.route.Link, {href: '/pages'}, 'Список статей')),
|
||||||
|
m('li', {class: 'breadcrumb-item'}, m(m.route.Link, {href: `/page/${data.page.id}`}, data.page.title)),
|
||||||
|
m('li', {class: 'breadcrumb-item active'}, 'Редактирование страницы'),
|
||||||
|
]);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
function page_get(id) {
|
||||||
|
m.request({
|
||||||
|
url: '/api',
|
||||||
|
method: "POST",
|
||||||
|
body: {
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"method": 'page',
|
||||||
|
"params": {
|
||||||
|
"id": id,
|
||||||
|
"fields": ["id", "title", "body"]
|
||||||
|
},
|
||||||
|
"id": get_id()
|
||||||
|
}
|
||||||
|
}).then(
|
||||||
|
function(response) {
|
||||||
|
if ('result' in response) {
|
||||||
|
data.page = response['result'];
|
||||||
|
} else if ('error' in response) {
|
||||||
|
bus.emit('notify', {
|
||||||
|
title: 'Редактирование статьи',
|
||||||
|
body: response['error'].message,
|
||||||
|
typeOf: 'danger'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
};
|
||||||
|
function apply() {
|
||||||
|
/* Сохранить */
|
||||||
|
if (data.page.title.length<2) {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
m.request({
|
||||||
|
url: '/api',
|
||||||
|
method: "POST",
|
||||||
|
body: {
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"method": "page.update",
|
||||||
|
"params": {
|
||||||
|
"id": data.page.id,
|
||||||
|
"title": data.page.title,
|
||||||
|
"body": data.page.body
|
||||||
|
},
|
||||||
|
"id": get_id()
|
||||||
|
}
|
||||||
|
}).then(
|
||||||
|
function(response) {
|
||||||
|
if ('result' in response) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
function apply_and_close() {
|
||||||
|
/* Сохранить */
|
||||||
|
if (data.page.title.length<2) {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
m.request({
|
||||||
|
url: '/api',
|
||||||
|
method: "POST",
|
||||||
|
body: {
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"method": "page.update",
|
||||||
|
"params": {
|
||||||
|
"id": data.page.id,
|
||||||
|
"title": data.page.title,
|
||||||
|
"body": data.page.body
|
||||||
|
},
|
||||||
|
"id": get_id()
|
||||||
|
}
|
||||||
|
}).then(
|
||||||
|
function(response) {
|
||||||
|
if ('result' in response) {
|
||||||
|
m.route.set(`/page/${data.page.id}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
function form_submit(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
apply_and_close();
|
||||||
|
};
|
||||||
|
function editor_events(ed) {
|
||||||
|
ed.on('change', function (e) {
|
||||||
|
data.page.body = ed.getContent();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
oncreate(vnode) {
|
||||||
|
console.log('PageEdit.oncreate');
|
||||||
|
if (data.page!=null) {
|
||||||
|
console.log(data.page);
|
||||||
|
if (data.editor==null) {
|
||||||
|
tinymce_config = tinymce_config_init();
|
||||||
|
tinymce_config.selector = `#page_body_${data.uuid}`;
|
||||||
|
tinymce_config.setup = editor_events;
|
||||||
|
tinymce.init(tinymce_config).then(
|
||||||
|
function (editors) {
|
||||||
|
data.editor = editors[0];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
oninit: function(vnode) {
|
||||||
|
console.log('PageEdit.oninit');
|
||||||
|
page_get(vnode.attrs.id);
|
||||||
|
},
|
||||||
|
onbeforeremove: function (vnode) {
|
||||||
|
console.log('PageAdd.onbeforeremove');
|
||||||
|
if (data.editor != null) {
|
||||||
|
data.editor.remove();
|
||||||
|
data.editor = null;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
onbeforeupdate: function (vnode) {
|
||||||
|
console.log('PageEdit.onbeforeupdate');
|
||||||
|
if (data.page != null) {
|
||||||
|
if (data.page.id.toString() !== vnode.attrs.id) {
|
||||||
|
page_get(vnode.attrs.id);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
},
|
||||||
|
onupdate: function(vnode) {
|
||||||
|
console.log('PageEdit.onupdate');
|
||||||
|
if (data.page!=null) {
|
||||||
|
if (data.editor == null) {
|
||||||
|
tinymce_config = tinymce_config_init();
|
||||||
|
tinymce_config.selector = `#page_body_${data.uuid}`;
|
||||||
|
tinymce_config.setup = editor_events;
|
||||||
|
tinymce.init(tinymce_config).then(
|
||||||
|
function (editors) {
|
||||||
|
data.editor = editors[0];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
view: function(vnode) {
|
||||||
|
let result = [];
|
||||||
|
if (data.page!=null) {
|
||||||
|
result.push(
|
||||||
|
breadcrumbs_render(),
|
||||||
|
m('div', {class: 'row'},
|
||||||
|
m('div', {class: 'col h1 py-2'},
|
||||||
|
m(m.route.Link, {class: "btn btn-outline-secondary btn-lg me-2", href: `/page/${data.page.id}`, title: data.page.title}, m('i', {class: 'fa fa-chevron-left'})),
|
||||||
|
'Редактирование страницы',
|
||||||
|
)
|
||||||
|
),
|
||||||
|
m('hr'),
|
||||||
|
m('form', {onsubmit: form_submit}, [
|
||||||
|
m('div', {class: 'mb-2'}, [
|
||||||
|
m('label', {class: 'form-label'}, 'Заголовок'),
|
||||||
|
m('input', {class: 'form-control', type: 'text', oninput: function (e) {data.page.title = e.target.value}, value: data.page.title}, 'Заголовок'),
|
||||||
|
]),
|
||||||
|
m('div', {class: 'mb-2'}, [
|
||||||
|
m('label', {class: 'form-label'}, 'Текст'),
|
||||||
|
m('textarea', { class: 'form-control', cols: '40', rows: '8', id: `page_body_${data.uuid}`, oninput: function (e) {data.page.body = e.target.value}, value: data.page.body})
|
||||||
|
]),
|
||||||
|
m('div', {class: 'row'},
|
||||||
|
m('div', {class: 'col py-2 text-end'}, [
|
||||||
|
m('button', {class: 'btn btn-outline-success btn-lg me-2', type: 'button', onclick: apply}, [m('i', {class: 'fa fa-save me-2'}), 'Сохранить']),
|
||||||
|
m('button', {class: 'btn btn-outline-success btn-lg', type: 'submit'}, [m('i', {class: 'fa fa-save me-2'}), 'Сохранить и закрыть']),
|
||||||
|
])
|
||||||
|
),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
result.push(breadcrumbs_render());
|
||||||
|
};
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
{% include '/private/domains/page/add.js' %}
|
{% include '/private/domains/page/new.js' %}
|
||||||
|
{% include '/private/domains/page/edit.js' %}
|
||||||
{% include '/private/domains/page/page.js' %}
|
{% include '/private/domains/page/page.js' %}
|
||||||
{% include '/private/domains/page/pages.js' %}
|
{% include '/private/domains/page/pages.js' %}
|
||||||
|
|
||||||
Object.assign(
|
Object.assign(
|
||||||
routes,
|
routes,
|
||||||
{
|
{
|
||||||
"/page/add": layout_decorator(PageAdd),
|
"/page/add": layout_decorator(PageNew),
|
||||||
|
"/page/:id/edit": layout_decorator(PageEdit),
|
||||||
"/page/:id": layout_decorator(Page),
|
"/page/:id": layout_decorator(Page),
|
||||||
"/pages": layout_decorator(Pages),
|
"/pages": layout_decorator(Pages),
|
||||||
"/pages/:page": layout_decorator(Pages),
|
"/pages/:page": layout_decorator(Pages),
|
||||||
|
|||||||
64
src/myapp/templates/private/domains/page/menu.js
Normal file
64
src/myapp/templates/private/domains/page/menu.js
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
function PageMenu(arguments) {
|
||||||
|
let data = {
|
||||||
|
menuitem: null,
|
||||||
|
page: null,
|
||||||
|
};
|
||||||
|
for (let key in arguments){
|
||||||
|
data[key] = arguments[key];
|
||||||
|
};
|
||||||
|
function button_common() {
|
||||||
|
if (data.menuitem===null) {
|
||||||
|
return {tag: '<', children: '<div class="btn btn-primary me-2"><i class="fa fa-bars"></i></div>'};
|
||||||
|
} else {
|
||||||
|
return m(m.route.Link, {class: "btn btn-outline-secondary me-2 text-decoration-none", href: `/page/${data.page.id}`, title: data.page.title}, m('i', {class: 'fa fa-bars'}))
|
||||||
|
}
|
||||||
|
};
|
||||||
|
function button_briefcases() {
|
||||||
|
if (data.menuitem==='briefcases') {
|
||||||
|
return {tag: '<', children: '<div class="btn btn-primary me-2">Портфели</div>'};
|
||||||
|
} else {
|
||||||
|
return m(m.route.Link, {class: "btn btn-outline-secondary me-2 text-decoration-none", href: `/page/${data.page.id}/briefcases`}, 'Портфели')
|
||||||
|
}
|
||||||
|
};
|
||||||
|
function button_attachments() {
|
||||||
|
if (data.menuitem==='attachments') {
|
||||||
|
return {tag: '<', children: '<div class="btn btn-primary me-2">Связи</div>'};
|
||||||
|
} else {
|
||||||
|
return m(m.route.Link, {class: "btn btn-outline-secondary me-2 text-decoration-none", href: `/page/${data.page.id}/attachments`}, 'Связи')
|
||||||
|
}
|
||||||
|
};
|
||||||
|
function button_properties() {
|
||||||
|
if (data.menuitem==='properties') {
|
||||||
|
return {tag: '<', children: '<div class="btn btn-primary me-2">Свойства</div>'};
|
||||||
|
} else {
|
||||||
|
return m(m.route.Link, {class: "btn btn-outline-secondary me-2 text-decoration-none", href: `/page/${data.page.id}/properties`}, 'Свойства')
|
||||||
|
}
|
||||||
|
};
|
||||||
|
function button_details() {
|
||||||
|
if (data.menuitem==='details') {
|
||||||
|
return {tag: '<', children: '<div class="btn btn-primary me-2">Сведения</div>'};
|
||||||
|
} else {
|
||||||
|
return m(m.route.Link, {class: "btn btn-outline-secondary me-2 text-decoration-none", href: `/page/${data.page.id}/details`}, 'Сведения')
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
oninit: function(vnode) {
|
||||||
|
console.log('PageMenu.oninit');
|
||||||
|
for (let key in vnode.attrs){
|
||||||
|
data[key] = vnode.attrs[key];
|
||||||
|
};
|
||||||
|
},
|
||||||
|
view: function(vnode) {
|
||||||
|
console.log('PageMenu.view');
|
||||||
|
return m('div', {class: 'row'},
|
||||||
|
m('div', {class: 'col py-2'}, [
|
||||||
|
button_common(),
|
||||||
|
button_briefcases(),
|
||||||
|
button_attachments(),
|
||||||
|
button_properties(),
|
||||||
|
button_details(),
|
||||||
|
])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
function PageAdd() {
|
function PageNew() {
|
||||||
let data = {
|
let data = {
|
||||||
|
uuid: get_id(),
|
||||||
page: {
|
page: {
|
||||||
title: '',
|
title: '',
|
||||||
body: '',
|
body: '',
|
||||||
@@ -22,7 +23,6 @@ function PageAdd() {
|
|||||||
if (data.page.title.length<2) {
|
if (data.page.title.length<2) {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
tinymce_get_value();
|
|
||||||
m.request({
|
m.request({
|
||||||
url: '/api',
|
url: '/api',
|
||||||
method: "POST",
|
method: "POST",
|
||||||
@@ -40,38 +40,43 @@ function PageAdd() {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
function editor_events(ed) {
|
||||||
|
ed.on('change', function (e) {
|
||||||
|
data.page.body = ed.getContent();
|
||||||
|
});
|
||||||
|
};
|
||||||
function tinymce_remove() {
|
function tinymce_remove() {
|
||||||
tinymce.get('page_body').remove();
|
tinymce.get('page_body').remove();
|
||||||
};
|
};
|
||||||
function tinymce_get_value() {
|
|
||||||
let value = tinymce.get('page_body').getContent();
|
|
||||||
if (value != data.page.body) {
|
|
||||||
data.page.body = value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
function tinymce_set_value() {
|
|
||||||
tinymce.get('page_body').setContent(data.page.body);
|
|
||||||
};
|
|
||||||
return {
|
return {
|
||||||
oncreate(vnode) {
|
oncreate(vnode) {
|
||||||
console.log('PageAdd.oncreate');
|
console.log('PageAdd.oncreate');
|
||||||
if (data.editor==null) {
|
if (data.editor==null) {
|
||||||
data.editor = tinymce_init('#page_body');
|
tinymce_config = tinymce_config_init();
|
||||||
|
tinymce_config.selector = `#page_body_${data.uuid}`;
|
||||||
|
tinymce_config.setup = editor_events;
|
||||||
|
tinymce.init(tinymce_config).then(
|
||||||
|
function (editors) {
|
||||||
|
data.editor = editors[0];
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onbeforeremove: function(vnode) {
|
onbeforeremove: function(vnode) {
|
||||||
console.log('PageAdd.onbeforeremove');
|
console.log('PageAdd.onbeforeremove');
|
||||||
if (data.editor!=null) {
|
if (data.editor!=null) {
|
||||||
tinymce_remove();
|
data.editor.remove();
|
||||||
|
data.editor = null;
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
view: function(vnode) {
|
view: function(vnode) {
|
||||||
console.log('PageAdd.view');
|
console.log('PageAdd.view');
|
||||||
result = [];
|
result = [];
|
||||||
result.push([
|
result.push([
|
||||||
|
breadcrumbs_render(),
|
||||||
m('div', {class: 'row'},
|
m('div', {class: 'row'},
|
||||||
m('div', {class: 'col py-2 h1'}, [
|
m('div', {class: 'col py-2 h1'}, [
|
||||||
m(m.route.Link, {class: "btn btn-outline-secondary", href: "/pages", title: "Список статей"}, m('i', {class: 'fa fa-chevron-left'})),
|
m(m.route.Link, {class: "btn btn-outline-secondary btn-lg me-2", href: "/pages", title: "Список статей"}, m('i', {class: 'fa fa-chevron-left'})),
|
||||||
'Новая страница'
|
'Новая страница'
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
@@ -85,11 +90,11 @@ function PageAdd() {
|
|||||||
]),
|
]),
|
||||||
m('div', {class: 'mb-2'}, [
|
m('div', {class: 'mb-2'}, [
|
||||||
m('label', {class: 'form-label'}, 'Текст'),
|
m('label', {class: 'form-label'}, 'Текст'),
|
||||||
m('textarea', {class: 'form-control', cols: '40', rows: '8', id: 'page_body', oninput: function (e) {data.page.body = e.target.value}, value: data.page.body})
|
m('textarea', { class: 'form-control', cols: '40', rows: '8', id: `page_body_${data.uuid}`, oninput: function (e) {data.page.body = e.target.value}, value: data.page.body})
|
||||||
]),
|
]),
|
||||||
m('div', {class: 'row'},
|
m('div', {class: 'row'},
|
||||||
m('div', {class: 'col py-2'}, [
|
m('div', {class: 'col py-2'}, [
|
||||||
m('button', {class: 'btn btn-outline-success btn-lg float-end', type: 'submit'}, [m('i', {class: 'fa fa-save'}), ' Сохранить']),
|
m('button', {class: 'btn btn-outline-success btn-lg float-end', type: 'submit'}, [m('i', {class: 'fa fa-save me-2'}), 'Сохранить']),
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
])
|
])
|
||||||
@@ -44,6 +44,16 @@ function Page() {
|
|||||||
return m(m.route.Link, {class: "btn btn-outline-secondary", href: "/pages", title: "Список статей"}, m('i', {class: 'fa fa-chevron-left'}));
|
return m(m.route.Link, {class: "btn btn-outline-secondary", href: "/pages", title: "Список статей"}, m('i', {class: 'fa fa-chevron-left'}));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
function panels_standart_render() {
|
||||||
|
if (data.panels.standart.visible) {
|
||||||
|
return m('div', { class: 'row' },
|
||||||
|
m('div', { class: 'col py-2' }, [
|
||||||
|
m(ComponentFavorite, { resource: data.page, name: 'page' }),
|
||||||
|
m(m.route.Link, { class: 'btn btn-outline-secondary me-2', href: `/page/${data.page.id}/edit`, title: 'Редактировать' }, m('i', { class: 'fa fa-edit' })),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
return {
|
return {
|
||||||
oninit: function(vnode) {
|
oninit: function(vnode) {
|
||||||
console.log('Page.oninit');
|
console.log('Page.oninit');
|
||||||
@@ -72,7 +82,9 @@ function Page() {
|
|||||||
m.trust(data.page.title),
|
m.trust(data.page.title),
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
|
panels_standart_render(),
|
||||||
m('hr'),
|
m('hr'),
|
||||||
|
m(ComponentTags, { resource: data.page, typeOf: 'page' }),
|
||||||
);
|
);
|
||||||
result.push(m.trust(data.page.body));
|
result.push(m.trust(data.page.body));
|
||||||
result.push(breadcrumbs_render());
|
result.push(breadcrumbs_render());
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
function Pages() {
|
function Pages() {
|
||||||
let data = {
|
let data = {
|
||||||
filter: PanelFilter(),
|
filter: {
|
||||||
|
value: '',
|
||||||
|
isregex: false,
|
||||||
|
visible: false
|
||||||
|
},
|
||||||
order_by: PanelOrderBy({
|
order_by: PanelOrderBy({
|
||||||
field: 'title',
|
field: 'title',
|
||||||
fields: [
|
fields: [
|
||||||
@@ -17,10 +21,12 @@ function Pages() {
|
|||||||
let result = data.raw_pages.filter(page_filter);
|
let result = data.raw_pages.filter(page_filter);
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
pagination: Pagination({
|
pagination: {
|
||||||
clickHandler: pages_get,
|
page: 1,
|
||||||
|
size: 0,
|
||||||
|
// clickHandler: pages_get,
|
||||||
prefix_url: '/pages'
|
prefix_url: '/pages'
|
||||||
}),
|
},
|
||||||
};
|
};
|
||||||
function breadcrumbs_render() {
|
function breadcrumbs_render() {
|
||||||
let result = m('ul', {class: 'breadcrumb mt-3'}, [
|
let result = m('ul', {class: 'breadcrumb mt-3'}, [
|
||||||
@@ -30,18 +36,26 @@ function Pages() {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
function page_filter(page) {
|
function page_filter(page) {
|
||||||
let filter = data.filter.data;
|
let filter = data.filter;
|
||||||
let value = filter.value;
|
let value = filter.value;
|
||||||
if (value.length < 1) {
|
if (value.length < 1) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (page.title.toLowerCase().includes(value.toLowerCase())) {
|
|
||||||
|
let isTitle = null;
|
||||||
|
if (data.filter.isregex) {
|
||||||
|
let regex = new RegExp(value, 'ig');
|
||||||
|
isTitle = regex.test(page.title.toLowerCase());
|
||||||
|
} else {
|
||||||
|
isTitle = page.title.toLowerCase().includes(value.toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isTitle > 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
function pages_get() {
|
function pages_get() {
|
||||||
let pagination = data.pagination.data;
|
|
||||||
m.request({
|
m.request({
|
||||||
url: '/api',
|
url: '/api',
|
||||||
method: "POST",
|
method: "POST",
|
||||||
@@ -50,19 +64,19 @@ function Pages() {
|
|||||||
"jsonrpc": "2.0",
|
"jsonrpc": "2.0",
|
||||||
"method": 'pages',
|
"method": 'pages',
|
||||||
"params": {
|
"params": {
|
||||||
"page": pagination.page,
|
"page": data.pagination.page,
|
||||||
"order_by": {
|
"order_by": {
|
||||||
"field": data.order_by.data.field,
|
"field": data.order_by.data.field,
|
||||||
'order': data.order_by.data.order
|
'order': data.order_by.data.order
|
||||||
},
|
},
|
||||||
"fields": ["id", "title", "tags"]
|
"fields": ["id", "title", "tags"]
|
||||||
},
|
},
|
||||||
"id": 1
|
"id": get_id()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"jsonrpc": "2.0",
|
"jsonrpc": "2.0",
|
||||||
"method": 'pages.count',
|
"method": 'pages.count',
|
||||||
"id": 1
|
"id": get_id()
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -77,24 +91,9 @@ function Pages() {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
function page_render(page, pageIdx) {
|
|
||||||
let odd = '';
|
|
||||||
if (pageIdx % 2) {
|
|
||||||
odd = ' bg-light'
|
|
||||||
};
|
|
||||||
return m('div', {class: 'row'},
|
|
||||||
m('div', {class: `col py-2 ${odd}`}, [
|
|
||||||
m(m.route.Link, {href: `/page/${page.id}`}, m.trust(page.title)),
|
|
||||||
m('div', {class: 'row'},
|
|
||||||
),
|
|
||||||
])
|
|
||||||
);
|
|
||||||
};
|
|
||||||
function pages_render() {
|
|
||||||
return data.pages.map(page_render);
|
|
||||||
};
|
|
||||||
return {
|
return {
|
||||||
oninit: function(vnode) {
|
oninit: function(vnode) {
|
||||||
|
console.log('Pages.oninit');
|
||||||
let pagination = data.pagination.data;
|
let pagination = data.pagination.data;
|
||||||
if (vnode.attrs.page!==undefined) {
|
if (vnode.attrs.page!==undefined) {
|
||||||
pagination.page = Number(vnode.attrs.page);
|
pagination.page = Number(vnode.attrs.page);
|
||||||
@@ -102,7 +101,11 @@ function Pages() {
|
|||||||
document.title = `Список статей - ${SETTINGS.TITLE}`;
|
document.title = `Список статей - ${SETTINGS.TITLE}`;
|
||||||
pages_get();
|
pages_get();
|
||||||
},
|
},
|
||||||
|
onbeforeupdate: function (vnode) {
|
||||||
|
console.log('Pages.onbeforeupdate');
|
||||||
|
},
|
||||||
view: function(vnode) {
|
view: function(vnode) {
|
||||||
|
console.log('Pages.view');
|
||||||
let result = [];
|
let result = [];
|
||||||
result.push(
|
result.push(
|
||||||
breadcrumbs_render(),
|
breadcrumbs_render(),
|
||||||
@@ -110,7 +113,7 @@ function Pages() {
|
|||||||
m('div', {class: 'col h1 py-1'}, [
|
m('div', {class: 'col h1 py-1'}, [
|
||||||
m(m.route.Link, {class: "btn btn-outline-success btn-lg float-end", href: "/page/add", title: "Добавить статью"}, m('i', {class: 'fa fa-plus'})),
|
m(m.route.Link, {class: "btn btn-outline-success btn-lg float-end", href: "/page/add", title: "Добавить статью"}, m('i', {class: 'fa fa-plus'})),
|
||||||
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter) }},
|
||||||
m('i', {class: "fa fa-filter"})
|
m('i', {class: "fa fa-filter"})
|
||||||
),
|
),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
||||||
@@ -118,16 +121,18 @@ function Pages() {
|
|||||||
)
|
)
|
||||||
]),
|
]),
|
||||||
'Статьи',
|
'Статьи',
|
||||||
{tag: '<', children: '<hr />'}
|
|
||||||
])
|
])
|
||||||
)
|
),
|
||||||
|
m('hr'),
|
||||||
|
m(PanelFilter, data.filter),
|
||||||
|
m(data.order_by),
|
||||||
|
m(Pagination, data.pagination),
|
||||||
);
|
);
|
||||||
result.push(m(data.filter));
|
|
||||||
result.push(m(data.order_by));
|
|
||||||
result.push(m(data.pagination));
|
|
||||||
if (data.pages.length>0) {
|
if (data.pages.length>0) {
|
||||||
result.push(m(ComponentPages, {pages: data.pages}));
|
result.push(
|
||||||
result.push(m(data.pagination));
|
m(ComponentPages, {pages: data.pages}),
|
||||||
|
m(Pagination, data.pagination)
|
||||||
|
);
|
||||||
};
|
};
|
||||||
result.push(breadcrumbs_render());
|
result.push(breadcrumbs_render());
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
function TagNotes() {
|
function TagNotes() {
|
||||||
let data = {
|
let data = {
|
||||||
filter: PanelFilter(),
|
filter: {
|
||||||
|
value: '',
|
||||||
|
isregex: false,
|
||||||
|
visible: false
|
||||||
|
},
|
||||||
order_by: PanelOrderBy({
|
order_by: PanelOrderBy({
|
||||||
field: 'title',
|
field: 'title',
|
||||||
fields: [
|
fields: [
|
||||||
@@ -34,7 +38,7 @@ function TagNotes() {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
function note_filter(note) {
|
function note_filter(note) {
|
||||||
let filter = data.filter.data;
|
let filter = data.filter;
|
||||||
let value = filter.value;
|
let value = filter.value;
|
||||||
if ( value.length<1 ) {
|
if ( value.length<1 ) {
|
||||||
return true;
|
return true;
|
||||||
@@ -131,7 +135,7 @@ function TagNotes() {
|
|||||||
m('div', {class: 'col h1 py-2'}, [
|
m('div', {class: 'col h1 py-2'}, [
|
||||||
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
||||||
m(m.route.Link, {class: "btn btn-outline-secondary", href: `/tag/${data.tag.id}`, title: "Вернуться"}, m('i', {class: "fa fa-chevron-left"})),
|
m(m.route.Link, {class: "btn btn-outline-secondary", href: `/tag/${data.tag.id}`, title: "Вернуться"}, m('i', {class: "fa fa-chevron-left"})),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter) }},
|
||||||
m('i', {class: "fa fa-filter"})
|
m('i', {class: "fa fa-filter"})
|
||||||
),
|
),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
||||||
@@ -141,15 +145,15 @@ function TagNotes() {
|
|||||||
`Статьи с тегом [${data.tag.name}]`
|
`Статьи с тегом [${data.tag.name}]`
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
m('hr')
|
m('hr'),
|
||||||
|
// m(MenuTag, {menuitem: 'notes', tag: data.tag}),
|
||||||
|
{tag: MenuTag, attrs: {menuitem: 'notes', tag: data.tag}},
|
||||||
|
m(PanelFilter, data.filter),
|
||||||
|
m(data.order_by),
|
||||||
|
m(Pagination, data.pagination),
|
||||||
);
|
);
|
||||||
|
|
||||||
// result.push(m(MenuTag, {menuitem: 'notes', tag: data.tag}));
|
|
||||||
result.push({tag: MenuTag, attrs: {menuitem: 'notes', tag: data.tag}});
|
|
||||||
|
|
||||||
result.push(m(data.filter));
|
|
||||||
result.push(m(data.order_by));
|
|
||||||
result.push(m(Pagination, data.pagination));
|
|
||||||
if (data.notes.length>0) {
|
if (data.notes.length>0) {
|
||||||
result.push(m(ComponentNotes, {notes: data.notes}));
|
result.push(m(ComponentNotes, {notes: data.notes}));
|
||||||
result.push(m(Pagination, data.pagination));
|
result.push(m(Pagination, data.pagination));
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
function TagPages() {
|
function TagPages() {
|
||||||
let data = {
|
let data = {
|
||||||
filter: PanelFilter(),
|
filter: {
|
||||||
|
value: '',
|
||||||
|
isregex: false,
|
||||||
|
visible: false
|
||||||
|
},
|
||||||
order_by: PanelOrderBy({
|
order_by: PanelOrderBy({
|
||||||
field: 'title',
|
field: 'title',
|
||||||
fields: [
|
fields: [
|
||||||
@@ -34,7 +38,7 @@ function TagPages() {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
function page_filter(page) {
|
function page_filter(page) {
|
||||||
let filter = data.filter.data;
|
let filter = data.filter;
|
||||||
let value = filter.value;
|
let value = filter.value;
|
||||||
if ( value.length<1 ) {
|
if ( value.length<1 ) {
|
||||||
return true;
|
return true;
|
||||||
@@ -131,7 +135,7 @@ function TagPages() {
|
|||||||
m('div', {class: 'col h1 py-2'}, [
|
m('div', {class: 'col h1 py-2'}, [
|
||||||
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
||||||
m(m.route.Link, {class: "btn btn-outline-secondary", href: `/tag/${data.tag.id}`, title: "Вернуться"}, m('i', {class: "fa fa-chevron-left"})),
|
m(m.route.Link, {class: "btn btn-outline-secondary", href: `/tag/${data.tag.id}`, title: "Вернуться"}, m('i', {class: "fa fa-chevron-left"})),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter) }},
|
||||||
m('i', {class: "fa fa-filter"})
|
m('i', {class: "fa fa-filter"})
|
||||||
),
|
),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
||||||
@@ -141,15 +145,15 @@ function TagPages() {
|
|||||||
`Статьи с тегом [${data.tag.name}]`
|
`Статьи с тегом [${data.tag.name}]`
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
m('hr')
|
m('hr'),
|
||||||
|
// m(MenuTag, {menuitem: 'pages', tag: data.tag}),
|
||||||
|
{tag: MenuTag, attrs: {menuitem: 'pages', tag: data.tag}},
|
||||||
|
|
||||||
|
m(data.filter),
|
||||||
|
m(data.order_by),
|
||||||
|
m(Pagination, data.pagination),
|
||||||
);
|
);
|
||||||
|
|
||||||
// result.push(m(MenuTag, {menuitem: 'pages', tag: data.tag}));
|
|
||||||
result.push({tag: MenuTag, attrs: {menuitem: 'pages', tag: data.tag}});
|
|
||||||
|
|
||||||
result.push(m(data.filter));
|
|
||||||
result.push(m(data.order_by));
|
|
||||||
result.push(m(Pagination, data.pagination));
|
|
||||||
if (data.pages.length>0) {
|
if (data.pages.length>0) {
|
||||||
result.push(m(ComponentPages, {pages: data.pages}));
|
result.push(m(ComponentPages, {pages: data.pages}));
|
||||||
result.push(m(Pagination, data.pagination));
|
result.push(m(Pagination, data.pagination));
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
function Tags() {
|
function Tags() {
|
||||||
let data = {
|
let data = {
|
||||||
filter: PanelFilter(),
|
filter: {
|
||||||
|
value: '',
|
||||||
|
isregex: false,
|
||||||
|
visible: false
|
||||||
|
},
|
||||||
raw_groups: {},
|
raw_groups: {},
|
||||||
get groups() {
|
get groups() {
|
||||||
let result = {};
|
let result = {};
|
||||||
@@ -29,7 +33,7 @@ function Tags() {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
function tag_filter(tag) {
|
function tag_filter(tag) {
|
||||||
let filter = data.filter.data;
|
let filter = data.filter;
|
||||||
let value = filter.value;
|
let value = filter.value;
|
||||||
if ( value.length<1 ) {
|
if ( value.length<1 ) {
|
||||||
return true;
|
return true;
|
||||||
@@ -115,7 +119,7 @@ function Tags() {
|
|||||||
breadcrumbs_render(),
|
breadcrumbs_render(),
|
||||||
m('div', {class: 'row'},
|
m('div', {class: 'row'},
|
||||||
m('div', {class: 'col h1 py-2'}, [
|
m('div', {class: 'col h1 py-2'}, [
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary btn-lg me-2", onclick: function() { panel_show(data.filter.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary btn-lg me-2", onclick: function() { panel_show(data.filter) }},
|
||||||
m('i', {class: "fa fa-filter"})
|
m('i', {class: "fa fa-filter"})
|
||||||
),
|
),
|
||||||
m('button', {class: 'btn btn-outline-success btn-lg float-end', onclick: function() { panel_show(data.panels.tag_new) }}, m('i', {class: 'fa fa-plus'})),
|
m('button', {class: 'btn btn-outline-success btn-lg float-end', onclick: function() { panel_show(data.panels.tag_new) }}, m('i', {class: 'fa fa-plus'})),
|
||||||
@@ -123,9 +127,9 @@ function Tags() {
|
|||||||
])
|
])
|
||||||
),
|
),
|
||||||
m('hr'),
|
m('hr'),
|
||||||
|
m(PanelFilter, data.filter),
|
||||||
|
form_tag_new_render(),
|
||||||
);
|
);
|
||||||
result.push(m(data.filter));
|
|
||||||
result.push(form_tag_new_render());
|
|
||||||
if (Object.keys(data.groups).length>0) {
|
if (Object.keys(data.groups).length>0) {
|
||||||
let groups = [];
|
let groups = [];
|
||||||
Object.keys(data.groups).forEach(
|
Object.keys(data.groups).forEach(
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
function Users() {
|
function Users() {
|
||||||
let data = {
|
let data = {
|
||||||
filter: PanelFilter(),
|
filter: {
|
||||||
|
value: '',
|
||||||
|
isregex: false,
|
||||||
|
visible: false
|
||||||
|
},
|
||||||
order_by: PanelOrderBy({
|
order_by: PanelOrderBy({
|
||||||
field: 'name',
|
field: 'name',
|
||||||
fields: [
|
fields: [
|
||||||
@@ -15,11 +19,11 @@ function Users() {
|
|||||||
raw_users: [],
|
raw_users: [],
|
||||||
get users() {
|
get users() {
|
||||||
/* Отфильтрованный список */
|
/* Отфильтрованный список */
|
||||||
let value = data.filter.data.value;
|
let value = data.filter.value;
|
||||||
if ( value.length<1 ) {
|
if ( value.length<1 ) {
|
||||||
return data.raw_users;
|
return data.raw_users;
|
||||||
}
|
}
|
||||||
if (data.filter.data.isregex) {
|
if (data.filter.isregex) {
|
||||||
try {
|
try {
|
||||||
let regex = new RegExp(value, 'ig');
|
let regex = new RegExp(value, 'ig');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -37,12 +41,12 @@ function Users() {
|
|||||||
};
|
};
|
||||||
function user_filter(user) {
|
function user_filter(user) {
|
||||||
/* Фильтр статей */
|
/* Фильтр статей */
|
||||||
let value = data.filter.data.value;
|
let value = data.filter.value;
|
||||||
if ( value.length<1 ) {
|
if ( value.length<1 ) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
let isTitle = null;
|
let isTitle = null;
|
||||||
if ( data.filter.data.isregex) {
|
if ( data.filter.isregex) {
|
||||||
let regex = new RegExp(value, 'ig');
|
let regex = new RegExp(value, 'ig');
|
||||||
isTitle = regex.test(user.name.toLowerCase());
|
isTitle = regex.test(user.name.toLowerCase());
|
||||||
} else {
|
} else {
|
||||||
@@ -130,7 +134,7 @@ function Users() {
|
|||||||
m('div', {class: 'row'},
|
m('div', {class: 'row'},
|
||||||
m('div', {class: 'col h1 py-1'}, [
|
m('div', {class: 'col h1 py-1'}, [
|
||||||
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter) }},
|
||||||
m('i', {class: "fa fa-filter"})
|
m('i', {class: "fa fa-filter"})
|
||||||
),
|
),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
||||||
@@ -141,10 +145,10 @@ function Users() {
|
|||||||
])
|
])
|
||||||
),
|
),
|
||||||
m('hr'),
|
m('hr'),
|
||||||
|
m(PanelFilter, data.filter),
|
||||||
|
m(data.order_by),
|
||||||
|
m(data.pagination),
|
||||||
);
|
);
|
||||||
result.push(m(data.filter));
|
|
||||||
result.push(m(data.order_by));
|
|
||||||
result.push(m(data.pagination));
|
|
||||||
if (data.users.length>0) {
|
if (data.users.length>0) {
|
||||||
result.push(m(ComponentUsers, {users: data.users}));
|
result.push(m(ComponentUsers, {users: data.users}));
|
||||||
result.push(m(data.pagination));
|
result.push(m(data.pagination));
|
||||||
|
|||||||
@@ -39,8 +39,8 @@ function ComponentPages() {
|
|||||||
data[key] = vnode.attrs[key];
|
data[key] = vnode.attrs[key];
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
onupdate: function(vnode) {
|
onbeforeupdate: function(vnode) {
|
||||||
console.log('ComponentPages.onupdate');
|
console.log('ComponentPages.onbeforeupdate');
|
||||||
for (let key in vnode.attrs){
|
for (let key in vnode.attrs){
|
||||||
data[key] = vnode.attrs[key];
|
data[key] = vnode.attrs[key];
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -73,9 +73,10 @@ function Page() {
|
|||||||
])
|
])
|
||||||
),
|
),
|
||||||
m('hr'),
|
m('hr'),
|
||||||
|
m(TagsShort, { tags: data.page.tags }),
|
||||||
|
m.trust(data.page.body),
|
||||||
|
breadcrumbs_render()
|
||||||
);
|
);
|
||||||
result.push(m.trust(data.page.body));
|
|
||||||
result.push(breadcrumbs_render());
|
|
||||||
};
|
};
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
function Pages() {
|
function Pages() {
|
||||||
let data = {
|
let data = {
|
||||||
filter: PanelFilter(),
|
filter: {
|
||||||
|
value: '',
|
||||||
|
isregex: false,
|
||||||
|
visible: false
|
||||||
|
},
|
||||||
order_by: PanelOrderBy({
|
order_by: PanelOrderBy({
|
||||||
field: 'title',
|
field: 'title',
|
||||||
fields: [
|
fields: [
|
||||||
@@ -15,11 +19,12 @@ function Pages() {
|
|||||||
raw_pages: [],
|
raw_pages: [],
|
||||||
get pages() {
|
get pages() {
|
||||||
/* Отфильтрованный список */
|
/* Отфильтрованный список */
|
||||||
let value = data.filter.data.value;
|
let value = data.filter.value;
|
||||||
if ( value.length<1 ) {
|
console.log('Pages.value get', data.filter.value)
|
||||||
|
if (value.length<1 ) {
|
||||||
return data.raw_pages;
|
return data.raw_pages;
|
||||||
}
|
}
|
||||||
if (data.filter.data.isregex) {
|
if (data.filter.isregex) {
|
||||||
try {
|
try {
|
||||||
let regex = new RegExp(value, 'ig');
|
let regex = new RegExp(value, 'ig');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -37,12 +42,12 @@ function Pages() {
|
|||||||
};
|
};
|
||||||
function page_filter(page) {
|
function page_filter(page) {
|
||||||
/* Фильтр статей */
|
/* Фильтр статей */
|
||||||
let value = data.filter.data.value;
|
let value = data.filter.value;
|
||||||
if ( value.length<1 ) {
|
if ( value.length<1 ) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
let isTitle = null;
|
let isTitle = null;
|
||||||
if ( data.filter.data.isregex) {
|
if ( data.filter.isregex) {
|
||||||
let regex = new RegExp(value, 'ig');
|
let regex = new RegExp(value, 'ig');
|
||||||
isTitle = regex.test(page.title.toLowerCase());
|
isTitle = regex.test(page.title.toLowerCase());
|
||||||
} else {
|
} else {
|
||||||
@@ -111,9 +116,6 @@ function Pages() {
|
|||||||
])
|
])
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
function pages_render() {
|
|
||||||
return data.pages.map(page_render);
|
|
||||||
};
|
|
||||||
return {
|
return {
|
||||||
oninit: function(vnode) {
|
oninit: function(vnode) {
|
||||||
let pagination = data.pagination.data;
|
let pagination = data.pagination.data;
|
||||||
@@ -130,7 +132,7 @@ function Pages() {
|
|||||||
m('div', {class: 'row'},
|
m('div', {class: 'row'},
|
||||||
m('div', {class: 'col h1 py-1'}, [
|
m('div', {class: 'col h1 py-1'}, [
|
||||||
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter) }},
|
||||||
m('i', {class: "fa fa-filter"})
|
m('i', {class: "fa fa-filter"})
|
||||||
),
|
),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
||||||
@@ -141,10 +143,10 @@ function Pages() {
|
|||||||
])
|
])
|
||||||
),
|
),
|
||||||
m('hr'),
|
m('hr'),
|
||||||
|
m(PanelFilter, data.filter),
|
||||||
|
m(data.order_by),
|
||||||
|
m(Pagination, data.pagination),
|
||||||
);
|
);
|
||||||
result.push(m(data.filter));
|
|
||||||
result.push(m(data.order_by));
|
|
||||||
result.push(m(data.pagination));
|
|
||||||
if (data.pages.length>0) {
|
if (data.pages.length>0) {
|
||||||
result.push(m(ComponentPages, {pages: data.pages}));
|
result.push(m(ComponentPages, {pages: data.pages}));
|
||||||
result.push(m(data.pagination));
|
result.push(m(data.pagination));
|
||||||
@@ -154,27 +156,3 @@ function Pages() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
/*
|
|
||||||
<div class="row" v-for="() in pages">
|
|
||||||
<div class="col py-2" :class="{'bg-light': pageIdx % 2}">
|
|
||||||
<a :href="'/page/' + page.id">{ page.title }</a>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col small text-muted">
|
|
||||||
<span v-for="(tag, tagIdx) in page.tags">
|
|
||||||
<i class="fa fa-tag"></i> <a class="text-monospace" :href="'/tag/' + tag.id">{ tag.name }</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col small text-muted">
|
|
||||||
<i class="fa fa-user"></i> <a :href="'/user/' + page.user.id">{ page.user.name }</a>
|
|
||||||
Создано: { page.created }
|
|
||||||
Обновлено: { page.updated }
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
*/
|
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
function TagPages() {
|
function TagPages() {
|
||||||
let data = {
|
let data = {
|
||||||
filter: PanelFilter(),
|
filter: {
|
||||||
|
value: '',
|
||||||
|
isregex: false,
|
||||||
|
visible: false
|
||||||
|
},
|
||||||
order_by: PanelOrderBy({
|
order_by: PanelOrderBy({
|
||||||
field: 'title',
|
field: 'title',
|
||||||
fields: [
|
fields: [
|
||||||
@@ -34,7 +38,7 @@ function TagPages() {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
function page_filter(page) {
|
function page_filter(page) {
|
||||||
let filter = data.filter.data;
|
let filter = data.filter;
|
||||||
let value = filter.value;
|
let value = filter.value;
|
||||||
if ( value.length<1 ) {
|
if ( value.length<1 ) {
|
||||||
return true;
|
return true;
|
||||||
@@ -131,7 +135,7 @@ function TagPages() {
|
|||||||
m('div', {class: 'col h1 py-2'}, [
|
m('div', {class: 'col h1 py-2'}, [
|
||||||
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
||||||
m(m.route.Link, {class: "btn btn-outline-secondary", href: `/tag/${data.tag.id}`, title: "Вернуться"}, m('i', {class: "fa fa-chevron-left"})),
|
m(m.route.Link, {class: "btn btn-outline-secondary", href: `/tag/${data.tag.id}`, title: "Вернуться"}, m('i', {class: "fa fa-chevron-left"})),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter) }},
|
||||||
m('i', {class: "fa fa-filter"})
|
m('i', {class: "fa fa-filter"})
|
||||||
),
|
),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
||||||
@@ -141,15 +145,15 @@ function TagPages() {
|
|||||||
`Статьи с тегом [${data.tag.name}]`
|
`Статьи с тегом [${data.tag.name}]`
|
||||||
]),
|
]),
|
||||||
m('hr'),
|
m('hr'),
|
||||||
)
|
),
|
||||||
|
{tag: MenuTag, attrs: {menuitem: 'pages', tag: data.tag}},
|
||||||
|
m(PanelFilter, data.filter),
|
||||||
|
m(data.order_by),
|
||||||
|
m(Pagination, data.pagination),
|
||||||
);
|
);
|
||||||
|
|
||||||
// result.push(m(MenuTag, {menuitem: 'pages', tag: data.tag}));
|
// result.push(m(MenuTag, {menuitem: 'pages', tag: data.tag}));
|
||||||
result.push({tag: MenuTag, attrs: {menuitem: 'pages', tag: data.tag}});
|
|
||||||
|
|
||||||
result.push(m(data.filter));
|
|
||||||
result.push(m(data.order_by));
|
|
||||||
result.push(m(Pagination, data.pagination));
|
|
||||||
if (data.pages.length>0) {
|
if (data.pages.length>0) {
|
||||||
result.push(m(ComponentPages, {pages: data.pages}));
|
result.push(m(ComponentPages, {pages: data.pages}));
|
||||||
result.push(m(Pagination, data.pagination));
|
result.push(m(Pagination, data.pagination));
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
function Tags() {
|
function Tags() {
|
||||||
let data = {
|
let data = {
|
||||||
filter: PanelFilter(),
|
filter: {
|
||||||
|
value: '',
|
||||||
|
isregex: false,
|
||||||
|
visible: false
|
||||||
|
},
|
||||||
raw_groups: {},
|
raw_groups: {},
|
||||||
get groups() {
|
get groups() {
|
||||||
let result = {};
|
let result = {};
|
||||||
@@ -23,7 +27,7 @@ function Tags() {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
function tag_filter(tag) {
|
function tag_filter(tag) {
|
||||||
let filter = data.filter.data;
|
let filter = data.filter;
|
||||||
let value = filter.value;
|
let value = filter.value;
|
||||||
if (value.length < 1) {
|
if (value.length < 1) {
|
||||||
return true;
|
return true;
|
||||||
@@ -64,15 +68,15 @@ function Tags() {
|
|||||||
breadcrumbs_render(),
|
breadcrumbs_render(),
|
||||||
m('div', { class: 'row' },
|
m('div', { class: 'row' },
|
||||||
m('div', { class: "col h1 py-2" }, [
|
m('div', { class: "col h1 py-2" }, [
|
||||||
m('button', { type: "button", class: "btn btn-outline-secondary btn-lg me-2", onclick: function () { panel_show(data.filter.data) } },
|
m('button', { type: "button", class: "btn btn-outline-secondary btn-lg me-2", onclick: function () { panel_show(data.filter) } },
|
||||||
m('i', { class: "fa fa-filter" })
|
m('i', { class: "fa fa-filter" })
|
||||||
),
|
),
|
||||||
'Облако тегов'
|
'Облако тегов'
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
m('hr'),
|
m('hr'),
|
||||||
|
m(PanelFilter, data.filter),
|
||||||
);
|
);
|
||||||
result.push(m(data.filter));
|
|
||||||
if (Object.keys(data.groups).length > 0) {
|
if (Object.keys(data.groups).length > 0) {
|
||||||
let groups = [];
|
let groups = [];
|
||||||
Object.keys(data.groups).forEach(
|
Object.keys(data.groups).forEach(
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
function Users() {
|
function Users() {
|
||||||
document.title = `Список пользователей - ${SETTINGS.TITLE}`;
|
document.title = `Список пользователей - ${SETTINGS.TITLE}`;
|
||||||
let data = {
|
let data = {
|
||||||
filter: PanelFilter(),
|
filter: {
|
||||||
|
value: '',
|
||||||
|
isregex: false,
|
||||||
|
visible: false
|
||||||
|
},
|
||||||
order_by: PanelOrderBy({
|
order_by: PanelOrderBy({
|
||||||
field: 'name',
|
field: 'name',
|
||||||
fields: [
|
fields: [
|
||||||
@@ -16,11 +20,11 @@ function Users() {
|
|||||||
raw_users: [],
|
raw_users: [],
|
||||||
get users() {
|
get users() {
|
||||||
/* Отфильтрованный список */
|
/* Отфильтрованный список */
|
||||||
let value = data.filter.data.value;
|
let value = data.filter.value;
|
||||||
if ( value.length<1 ) {
|
if ( value.length<1 ) {
|
||||||
return data.raw_users;
|
return data.raw_users;
|
||||||
}
|
}
|
||||||
if (data.filter.data.isregex) {
|
if (data.filter.isregex) {
|
||||||
try {
|
try {
|
||||||
let regex = new RegExp(value, 'ig');
|
let regex = new RegExp(value, 'ig');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -38,12 +42,12 @@ function Users() {
|
|||||||
};
|
};
|
||||||
function user_filter(user) {
|
function user_filter(user) {
|
||||||
/* Фильтр статей */
|
/* Фильтр статей */
|
||||||
let value = data.filter.data.value;
|
let value = data.filter.value;
|
||||||
if ( value.length<1 ) {
|
if ( value.length<1 ) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
let isTitle = null;
|
let isTitle = null;
|
||||||
if ( data.filter.data.isregex) {
|
if ( data.filter.isregex) {
|
||||||
let regex = new RegExp(value, 'ig');
|
let regex = new RegExp(value, 'ig');
|
||||||
isTitle = regex.test(user.name.toLowerCase());
|
isTitle = regex.test(user.name.toLowerCase());
|
||||||
} else {
|
} else {
|
||||||
@@ -130,7 +134,7 @@ function Users() {
|
|||||||
m('div', {class: 'row'},
|
m('div', {class: 'row'},
|
||||||
m('div', {class: 'col h1 py-1'}, [
|
m('div', {class: 'col h1 py-1'}, [
|
||||||
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
m('div', {class: "btn-group btn-group-lg me-2"}, [
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.filter) }},
|
||||||
m('i', {class: "fa fa-filter"})
|
m('i', {class: "fa fa-filter"})
|
||||||
),
|
),
|
||||||
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
m('button', {type: "button", class: "btn btn-outline-secondary", onclick: function() { panel_show(data.order_by.data) }},
|
||||||
@@ -141,13 +145,15 @@ function Users() {
|
|||||||
])
|
])
|
||||||
),
|
),
|
||||||
m('hr'),
|
m('hr'),
|
||||||
|
m(PanelFilter, data.filter),
|
||||||
|
m(data.order_by),
|
||||||
|
m(Pagination, data.pagination),
|
||||||
);
|
);
|
||||||
result.push(m(data.filter));
|
|
||||||
result.push(m(data.order_by));
|
|
||||||
result.push(m(data.pagination));
|
|
||||||
if (data.users.length>0) {
|
if (data.users.length>0) {
|
||||||
result.push(m(ComponentUsers, {users: data.users}));
|
result.push(
|
||||||
result.push(m(data.pagination));
|
m(ComponentUsers, {users: data.users}),
|
||||||
|
m(Pagination, data.pagination),
|
||||||
|
);
|
||||||
};
|
};
|
||||||
result.push(breadcrumbs_render());
|
result.push(breadcrumbs_render());
|
||||||
return result
|
return result
|
||||||
|
|||||||
Reference in New Issue
Block a user