diff --git a/myapp/ns_profile/templates/profile.html b/myapp/ns_profile/templates/profile.html index 8b74053..6ecb12f 100644 --- a/myapp/ns_profile/templates/profile.html +++ b/myapp/ns_profile/templates/profile.html @@ -1,9 +1,9 @@ {% extends "skeleton.html" %} -{% block body %} +{% block content %}

Профиль


Зарегистрирован: {{ user.created.strftime('%Y-%m-%d') }}

-{% endblock body %} +{% endblock content %} diff --git a/myapp/ns_tag/templates/tag.html b/myapp/ns_tag/templates/tag.html index 9e4fefb..5812cbf 100644 --- a/myapp/ns_tag/templates/tag.html +++ b/myapp/ns_tag/templates/tag.html @@ -1,5 +1,5 @@ {% extends "skeleton.html" %} -{% block body %} +{% block content %} {% raw %}

diff --git a/myapp/ns_tag/templates/tags.html b/myapp/ns_tag/templates/tags.html index 6995729..2a0897e 100644 --- a/myapp/ns_tag/templates/tags.html +++ b/myapp/ns_tag/templates/tags.html @@ -1,5 +1,5 @@ {% extends "skeleton.html" %} -{% block body %} +{% block content %}

diff --git a/myapp/ns_user/templates/users.html b/myapp/ns_user/templates/users.html index b71a01a..d70070f 100644 --- a/myapp/ns_user/templates/users.html +++ b/myapp/ns_user/templates/users.html @@ -1,5 +1,5 @@ {% extends "skeleton.html" %} -{% block body %} +{% block content %}

Список пользователей


diff --git a/myapp/static/components/pagination.js b/myapp/static/components/pagination.js new file mode 100644 index 0000000..17dcc60 --- /dev/null +++ b/myapp/static/components/pagination.js @@ -0,0 +1,113 @@ +/* + + + +Vue +... +data: { + pagination: { + page: 1, + per_page: {{ per_page }}, + size: {{ pagedata['count'] }} + }, +} +... + +Flask + pagedata['pagination'] = { + "page": page, + "per_page": app.config['ITEMS_ON_PAGE'], + "size": 0 + } + +*/ + +let paginationTemplate = `
+
+
...
+ + + +
+
`; + +Vue.component('pagination-component', { + template: paginationTemplate, + data: function() { + return { + } + }, + props:{ + pagination: { + type: Array, + required: true, + default: { + page: 1, + per_page: 25, + size: 0 + } + }, + clickHandler: { + type: Function, + default: function() { } + }, + }, + methods: { + handlePageSelected: function(selected) { + /* Установить номер текущей страницы и вызвать функция обновления + * страницы + * + * Аргументы: + * selected -- номер страницы + */ + let vm = this; + vm.pagination.page = selected; + vm.clickHandler(); + }, + pages: function() { + let vm = this; + return Math.ceil(vm.pagination.size/vm.pagination.per_page); + }, + }, + computed: { + has_prev: function() { + let vm = this; + return vm.pagination.page > 1; + }, + has_next: function() { + let vm = this; + return vm.pagination.page < vm.pages(); + }, + iter_pages: function() { + /* */ + let vm = this; + let last = 0; + let left_edge=2, left_current=2, + right_current=5, right_edge=2; + let result = []; + for (let num = 1; num < vm.pages()+1; num++) { + if (num <= left_edge || + (num > vm.pagination.page - left_current - 1 && + num < vm.pagination.page + right_current) || + num > vm.pages() - right_edge) { + if (last + 1 != num) { + result.push(null); + } else { + result.push(num); + } + last = num + } + }; + return result; + }, + } +}); diff --git a/myapp/static/components/tags.js b/myapp/static/components/tags.js new file mode 100644 index 0000000..e8c583a --- /dev/null +++ b/myapp/static/components/tags.js @@ -0,0 +1,268 @@ +var tagsTemplate = ` +
+ +
+
+
+ +
+ + + +
+
+ +
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+ + +
+
+Добавить новый тег [{{ newtag }}]? + +
+
+
Отмена
+
Добавить
+
+
+ +
+
+ + +
+
+{{ key }} + +
+
+ +
+
+ +
`; + +Vue.component('tags-component', { + data: function() { + return { + newtag: '', + groups: {}, + forms: { + modal: false, + panel: false + }, + panels: { + standart: { + visible: false + }, + new: { + visible: false + } + } + } + }, + props: ['tags', 'node', 'url'], + template: tagsTemplate, + methods: { + arrayRemove: function(arr, value) { + /* Удаление элемента из списка */ + return arr.filter(function(ele){ + return ele != value; + }); + }, + removeTag: function (id) { + /* Удаление тега из ресурса */ + let vm = this; + var tag = null; + for (var i = 0; i < vm.tags.length; i++) { + if (id == vm.tags[i].id) { + tag = vm.tags[i] + } + } + if (!tag) {return;} + axios.post( + '/api', + { + "jsonrpc": "2.0", + "method": 'tag.deleteFrom' + vm.url, + "params": { + "id": vm.node, + "tag": tag.id + }, + "id": 1 + } + ).then( + function(response) { + if ('result' in response.data) { + vm.tags = vm.arrayRemove(vm.tags, tag); + } else if ('error' in response.data) { + console.log(response.data); + } + } + ); + }, + addTag: function () { + /* Добавить тег к ресурсу */ + let vm = this; + var newtag = vm.newtag.trim(); + vm.newtag = newtag; + axios.post( + '/api', + { + "jsonrpc": "2.0", + "method": 'tag.exist', + "params": { + name: vm.newtag + }, + "id": 1 + } + ).then( + function(response) { + if ('result' in response.data) { + vm.tag_add_to_node( response.data['result'] ); + } else if ('error' in response.data) { + console.log(response.data); + vm.panels.new.visible = true; + } + } + ).catch( + function (error) { + console.log(error); + } + ); + }, + addNewTag:function () { + /* Добавление нового тега */ + let vm = this; + axios.post( + '/api', + { + "jsonrpc": "2.0", + "method": 'tag.add', + "params": { + name: vm.newtag + }, + "id": 1 + } + ).then( + function(response) { + if ('result' in response.data) { + vm.getTags(); + vm.tag_add_to_node( response.data['result'] ); + } + } + ); + }, + cancelNewTag:function () { + let vm = this; + vm.newtag = ''; + vm.panels.new.visible = false; + }, + // Добавление тега к ресурсу + tag_add_to_node: function(tag) { + let vm = this; + axios.post( + '/api', + { + "jsonrpc": "2.0", + "method": 'tag.addTo' + this.url, + "params": { + "id": vm.node, + "tag": tag.id + }, + "id": 1 + } + ).then( + function(response) { + if ('result' in response.data) { + vm.tags.push(response.data['result']); + vm.newtag = ''; + vm.panels.new.visible = false; + } + } + ); + }, + // Получить список тегов + getTags: function() { + let vm = this; + axios.post( + '/api', + { + "jsonrpc": "2.0", + "method": 'tags.groups', + "params": {}, + "id": 1 + } + ).then( + function(response) { + if ('result' in response.data) { + vm.groups = response.data['result']; + } + } + ).catch( + function (error) { + console.log(error); + } + ); + }, + showPanel: function(panel) { + /* Показать/скрыть панель */ + panel.visible = !panel.visible; + }, + }, + mounted: function() { + let vm = this; + vm.getTags(); + }, + computed: { + tag_ids: function() { + let vm = this; + var result = []; + for (var i = 0; i < vm.tags.length; i++) { + result.push(vm.tags[i].id); + } + return result; + }, + sortedTags: function() { + let vm = this; + if (vm.tags === undefined) {return [];} + vm.tags.sort( + function(a, b) { + if (a.name > b.name) { + return 1; + } + if (a.name < b.name) { + return -1; + } + return 0; + } + ); + return vm.tags; + } + } +}); diff --git a/myapp/templates/error.html b/myapp/templates/error.html index 8774998..35737a7 100644 --- a/myapp/templates/error.html +++ b/myapp/templates/error.html @@ -1,5 +1,5 @@ {% extends "skeleton.html" %} -{% block body %} +{% block content %}

{{ error_code }}: {{ error_message }}


diff --git a/myapp/templates/inc/editor.js b/myapp/templates/inc/editor.js new file mode 100644 index 0000000..c6496e2 --- /dev/null +++ b/myapp/templates/inc/editor.js @@ -0,0 +1,37 @@ +{% macro plugin(type="tinymce") -%} +{% if type=="tinymce" %} + +{% elif type=="ckeditor" %} + +{% endif %} +{%- endmacro %} + +{% macro ckeditor(name) -%} +CKEDITOR.replace( '{{ name }}', { + customConfig: '/static/js/ckeditor-conf.js' +} ); +{%- endmacro %} + +{% macro tinymce(name) -%} +tinymce.init({ + selector: 'textarea#{{ name }}', + height: 400, + language: 'ru', + plugins: "code link image table", + toolbar: "table tabledelete | tableprops tablerowprops tablecellprops | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol" +}); +{%- endmacro %} + +{% macro getValue(name, param, type="tinymce") -%} +{% if type=="tinymce" %} +let value = tinymce.get("{{ name }}").getContent(); +if (value != {{ param }}) { + {{ param }} = value; +} +{% elif type=="ckeditor" %} +var value = CKEDITOR.instances["{{ name }}"].getData(); +if (value != {{ param }}) { + {{ param }} = value; +} +{% endif %} +{%- endmacro %} diff --git a/myapp/templates/index.html b/myapp/templates/index.html index 8ecec0c..501c62f 100644 --- a/myapp/templates/index.html +++ b/myapp/templates/index.html @@ -1,5 +1,5 @@ {% extends "skeleton.html" %} -{% block body %} +{% block content %}
diff --git a/myapp/templates/navbar.html b/myapp/templates/navbar.html index 661e328..4aaae9e 100644 --- a/myapp/templates/navbar.html +++ b/myapp/templates/navbar.html @@ -1,19 +1,13 @@
-{% if session.logged_in %} -
- - -
-{% else %} - -{% endif %} - -Статья +Статьи Метки Пользователи API JSON-RPC + + +
diff --git a/myapp/templates/page.html b/myapp/templates/page.html deleted file mode 100644 index e74ace7..0000000 --- a/myapp/templates/page.html +++ /dev/null @@ -1,112 +0,0 @@ -{% extends "skeleton.html" %} -{% block body %} - -{% raw %} -

-
-{{ page.title }}

-
- -
-
- -
- - -
- -
- - -
- -
-
- -
-
-
-
-
-
- -
-
- - -{% endraw %} - -{% endblock %} - -{% block breadcrumb %} - -{% endblock %} - -{% block script %} - - - -{% endblock %} diff --git a/myapp/templates/skeleton.html b/myapp/templates/skeleton.html index 5389f0b..3bdc8fe 100644 --- a/myapp/templates/skeleton.html +++ b/myapp/templates/skeleton.html @@ -7,8 +7,8 @@
{% include 'navbar.html' %} -{% block body %} -{% endblock body %} +{% block content %} +{% endblock content %} {% block breadcrumb %} {% endblock %} diff --git a/myapp/templates/user/navbar.html b/myapp/templates/user/navbar.html new file mode 100644 index 0000000..89df47d --- /dev/null +++ b/myapp/templates/user/navbar.html @@ -0,0 +1,16 @@ + diff --git a/myapp/templates/user/skeleton.html b/myapp/templates/user/skeleton.html new file mode 100644 index 0000000..309f1d1 --- /dev/null +++ b/myapp/templates/user/skeleton.html @@ -0,0 +1,33 @@ + + + {% include 'header.html' %} + +
+ +
+{% include 'user/navbar.html' %} + +{% block content %} +{% endblock content %} + +{% block breadcrumb %} +{% endblock %} + +{% include 'footer.html' %} +
+
+ +{% block script %} + +{% endblock script %} + + +