lato_blog 2.1.2 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/MIT-LICENSE +1 -1
- data/app/assets/javascripts/lato_blog/modules/BlogPosts.js +8 -0
- data/app/assets/stylesheets/lato_blog/pages/_posts.scss +1 -1
- data/app/controllers/lato_blog/api/categories_controller.rb +2 -2
- data/app/controllers/lato_blog/api/posts_controller.rb +4 -0
- data/app/controllers/lato_blog/api/tags_controller.rb +32 -0
- data/app/controllers/lato_blog/back/categories_controller.rb +1 -1
- data/app/controllers/lato_blog/back/posts_controller.rb +25 -0
- data/app/controllers/lato_blog/back/tags_controller.rb +137 -0
- data/app/models/lato_blog/post/serializer_helpers.rb +13 -1
- data/app/models/lato_blog/post.rb +5 -0
- data/app/models/lato_blog/tag/entity_helpers.rb +37 -0
- data/app/models/lato_blog/tag/serializer_helpers.rb +52 -0
- data/app/models/lato_blog/tag.rb +83 -0
- data/app/models/lato_blog/tag_parent.rb +9 -0
- data/app/models/lato_blog/tag_post.rb +31 -0
- data/app/views/lato_blog/back/categories/edit.html.erb +2 -0
- data/app/views/lato_blog/back/categories/index.html.erb +9 -3
- data/app/views/lato_blog/back/post_fields/create_relay_field.js.erb +1 -0
- data/app/views/lato_blog/back/post_fields/destroy_relay_field.js.erb +1 -0
- data/app/views/lato_blog/back/posts/edit.html.erb +4 -0
- data/app/views/lato_blog/back/posts/new.html.erb +2 -0
- data/app/views/lato_blog/back/posts/shared/edit/_edit_tags.html.erb +28 -0
- data/app/views/lato_blog/back/posts/shared/index/_index.html.erb +5 -5
- data/app/views/lato_blog/back/tags/edit.html.erb +44 -0
- data/app/views/lato_blog/back/tags/index.html.erb +24 -0
- data/app/views/lato_blog/back/tags/new.html.erb +40 -0
- data/app/views/lato_blog/back/tags/shared/_form.html.erb +34 -0
- data/app/views/lato_blog/back/tags/shared/edit/_edit_informations.html.erb +24 -0
- data/app/views/lato_blog/back/tags/shared/edit/_edit_languages.html.erb +38 -0
- data/app/views/lato_blog/back/tags/shared/new/_new_informations.html.erb +21 -0
- data/app/views/lato_blog/doc/doc/index.html.erb +1 -1
- data/config/configs.yml +5 -0
- data/config/languages/default.yml +11 -1
- data/config/languages/it.yml +10 -0
- data/config/routes/api.rb +4 -0
- data/config/routes/back.rb +5 -1
- data/db/migrate/20171020131140_create_lato_blog_tags.rb +15 -0
- data/db/migrate/20171021131140_create_lato_blog_tag_parents.rb +8 -0
- data/db/migrate/20171022131140_create_lato_blog_tag_posts.rb +10 -0
- data/lib/lato_blog/interface.rb +3 -3
- data/lib/lato_blog/interfaces/categories.rb +66 -0
- data/lib/lato_blog/interfaces/posts.rb +148 -0
- data/lib/lato_blog/interfaces/tags.rb +80 -0
- data/lib/lato_blog/version.rb +1 -1
- metadata +24 -6
- data/lib/lato_blog/interfaces/queries.rb +0 -161
@@ -5,14 +5,14 @@
|
|
5
5
|
<%=raw block.open %>
|
6
6
|
|
7
7
|
<%
|
8
|
-
title = "#{
|
9
|
-
title = "#{
|
10
|
-
title = "#{
|
11
|
-
title = "#{title}#{LANGUAGES[:lato_blog][:mixed][:deleted_posts]}" if status && status === 'deleted'
|
8
|
+
title = "#{LANGUAGES[:lato_blog][:mixed][:published_posts]}" if status && status === 'published'
|
9
|
+
title = "#{LANGUAGES[:lato_blog][:mixed][:drafted_posts]}" if status && status === 'drafted'
|
10
|
+
title = "#{LANGUAGES[:lato_blog][:mixed][:deleted_posts]}" if status && status === 'deleted'
|
12
11
|
%>
|
13
12
|
|
14
|
-
<%=raw cell(:elements, :title).new(label: title, size:
|
13
|
+
<%=raw cell(:elements, :title).new(label: title, size: 4) %>
|
15
14
|
|
15
|
+
<br>
|
16
16
|
|
17
17
|
<%=raw cell(:widgets, :index).new(
|
18
18
|
records: @widget_index_posts,
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<%
|
2
|
+
row = cell(:elements, :row).new
|
3
|
+
block = cell(:elements, :block).new(class: 'xs-12 sm-12 md-12')
|
4
|
+
container_block_big = cell(:elements, :block).new(class: 'xs-12 sm-12 md-8 no-padding no-background no-shadow')
|
5
|
+
container_block_small = cell(:elements, :block).new(class: 'xs-12 sm-12 md-4 no-padding no-background no-shadow')
|
6
|
+
%>
|
7
|
+
|
8
|
+
<!-- MAIN CONTAINER -->
|
9
|
+
<%=raw row.open %>
|
10
|
+
|
11
|
+
<!-- BIG SECTION CONTAINER -->
|
12
|
+
<%=raw container_block_big.open %>
|
13
|
+
|
14
|
+
<%=raw row.open %>
|
15
|
+
|
16
|
+
<%=raw block.open %>
|
17
|
+
|
18
|
+
<%=raw cell(:elements, :title).new(label: @tag.title, size: 4) %>
|
19
|
+
|
20
|
+
<%= render 'lato_blog/back/tags/shared/form', url: lato_blog.tag_path(@tag.id), method: :put %>
|
21
|
+
|
22
|
+
<%=raw block.close %>
|
23
|
+
|
24
|
+
<%=raw row.close %>
|
25
|
+
|
26
|
+
<%=raw container_block_big.close %>
|
27
|
+
<!-- / BIG SECTION CONTAINER -->
|
28
|
+
|
29
|
+
<!-- SMALL SECTION CONTAINER -->
|
30
|
+
<%=raw container_block_small.open %>
|
31
|
+
|
32
|
+
<%=raw row.open %>
|
33
|
+
|
34
|
+
<%= render 'lato_blog/back/tags/shared/edit/edit_informations' %>
|
35
|
+
|
36
|
+
<%= render 'lato_blog/back/tags/shared/edit/edit_languages' %>
|
37
|
+
|
38
|
+
<%=raw row.close %>
|
39
|
+
|
40
|
+
<%=raw container_block_small.close %>
|
41
|
+
<!-- / SMALL SECTION CONTAINER -->
|
42
|
+
|
43
|
+
<%=raw row.close %>
|
44
|
+
<!-- / MAIN CONTAINER -->
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<%
|
2
|
+
row = cell(:elements, :row).new
|
3
|
+
block = cell(:elements, :block).new(class: 'xs-12 sm-12 md-12')
|
4
|
+
%>
|
5
|
+
|
6
|
+
<!-- MAIN CONTAINER -->
|
7
|
+
<%=raw row.open %>
|
8
|
+
|
9
|
+
<%=raw block.open %>
|
10
|
+
|
11
|
+
<%=raw cell(:widgets, :index).new(
|
12
|
+
records: @widget_index_tags,
|
13
|
+
index_url: lato_blog.tags_path,
|
14
|
+
head: [LANGUAGES[:lato_blog][:forms][:title], LANGUAGES[:lato_blog][:forms][:language], LANGUAGES[:lato_blog][:mixed][:number_of_posts]],
|
15
|
+
columns: ['title', 'get_pretty_language', 'get_number_of_posts'],
|
16
|
+
actions: {show: true, new: true, delete: true},
|
17
|
+
search: true,
|
18
|
+
pagination: true
|
19
|
+
) %>
|
20
|
+
|
21
|
+
<%=raw block.close %>
|
22
|
+
|
23
|
+
<%=raw row.close %>
|
24
|
+
<!-- / MAIN CONTAINER -->
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<%
|
2
|
+
row = cell(:elements, :row).new
|
3
|
+
block = cell(:elements, :block).new(class: 'xs-12 sm-12 md-12')
|
4
|
+
container_block_big = cell(:elements, :block).new(class: 'xs-12 sm-12 md-8 no-padding no-background no-shadow')
|
5
|
+
container_block_small = cell(:elements, :block).new(class: 'xs-12 sm-12 md-4 no-padding no-background no-shadow')
|
6
|
+
%>
|
7
|
+
|
8
|
+
<!-- MAIN CONTAINER -->
|
9
|
+
<%=raw row.open %>
|
10
|
+
|
11
|
+
<!-- BIG SECTION CONTAINER -->
|
12
|
+
<%=raw container_block_big.open %>
|
13
|
+
|
14
|
+
<%=raw row.open %>
|
15
|
+
|
16
|
+
<%=raw block.open %>
|
17
|
+
|
18
|
+
<%= render 'lato_blog/back/tags/shared/form', url: lato_blog.tags_path, method: :post %>
|
19
|
+
|
20
|
+
<%=raw block.close %>
|
21
|
+
|
22
|
+
<%=raw row.close %>
|
23
|
+
|
24
|
+
<%=raw container_block_big.close %>
|
25
|
+
<!-- / BIG SECTION CONTAINER -->
|
26
|
+
|
27
|
+
<!-- SMALL SECTION CONTAINER -->
|
28
|
+
<%=raw container_block_small.open %>
|
29
|
+
|
30
|
+
<%=raw row.open %>
|
31
|
+
|
32
|
+
<%= render 'lato_blog/back/tags/shared/new/new_informations' %>
|
33
|
+
|
34
|
+
<%=raw row.close %>
|
35
|
+
|
36
|
+
<%=raw container_block_small.close %>
|
37
|
+
<!-- / SMALL SECTION CONTAINER -->
|
38
|
+
|
39
|
+
<%=raw row.close %>
|
40
|
+
<!-- / MAIN CONTAINER -->
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<%
|
2
|
+
row = cell(:elements, :row).new
|
3
|
+
form = cell(:inputs, :form).new(url: url, method: method)
|
4
|
+
%>
|
5
|
+
|
6
|
+
<%=raw form.open %>
|
7
|
+
|
8
|
+
<input type="hidden" name="parent" value="<%= @tag_parent ? @tag_parent.id : nil %>">
|
9
|
+
|
10
|
+
<%=raw row.open %>
|
11
|
+
|
12
|
+
<% if method === :put %>
|
13
|
+
|
14
|
+
<%=raw cell(:inputs, :text).new(name: 'tag[meta_permalink]', label: LANGUAGES[:lato_blog][:forms][:permalink],
|
15
|
+
required: true, class: 'md-12', value: @tag.meta_permalink) %>
|
16
|
+
|
17
|
+
<% end %>
|
18
|
+
|
19
|
+
<%=raw cell(:inputs, :text).new(name: 'tag[title]', label: LANGUAGES[:lato_blog][:forms][:title],
|
20
|
+
required: true, class: 'md-12', value: @tag.title) %>
|
21
|
+
|
22
|
+
<%=raw row.close %>
|
23
|
+
|
24
|
+
<div class="text-right">
|
25
|
+
|
26
|
+
<%=raw cell(:elements, :button).new(type: 'link', label: LANGUAGES[:lato_blog][:mixed][:cancel],
|
27
|
+
style: 'danger', icon: 'ban', url: lato_blog.tags_path) %>
|
28
|
+
|
29
|
+
<%=raw cell(:elements, :button).new(type: 'submit', label: LANGUAGES[:lato_blog][:mixed][:save],
|
30
|
+
style: 'success', icon: 'check') %>
|
31
|
+
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<%=raw form.close %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<%
|
2
|
+
block = cell(:elements, :block).new(class: 'xs-12 sm-12 md-12')
|
3
|
+
table = cell(:elements, :table, :container).new(border: true)
|
4
|
+
table_body = cell(:elements, :table, :body).new
|
5
|
+
%>
|
6
|
+
|
7
|
+
<%=raw block.open %>
|
8
|
+
|
9
|
+
<%=raw cell(:elements, :title).new(label: LANGUAGES[:lato_blog][:mixed][:info], size: 6) %>
|
10
|
+
|
11
|
+
<%=raw table.open %>
|
12
|
+
|
13
|
+
<%=raw table_body.open %>
|
14
|
+
|
15
|
+
<%=raw cell(:elements, :table, :row).new(labels: [LANGUAGES[:lato_blog][:mixed][:current_language], get_current_language_title]) %>
|
16
|
+
<%=raw cell(:elements, :table, :row).new(labels: [LANGUAGES[:lato_blog][:mixed][:creation_date], @tag.get_pretty_created_at]) %>
|
17
|
+
<%=raw cell(:elements, :table, :row).new(labels: [LANGUAGES[:lato_blog][:mixed][:update_date], @tag.get_pretty_updated_at]) %>
|
18
|
+
<%=raw cell(:elements, :table, :row).new(labels: [LANGUAGES[:lato_blog][:mixed][:superuser_creator], @tag.get_superuser_creator_name]) %>
|
19
|
+
|
20
|
+
<%=raw table_body.close %>
|
21
|
+
|
22
|
+
<%=raw table.close %>
|
23
|
+
|
24
|
+
<%=raw block.close %>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<%
|
2
|
+
block = cell(:elements, :block).new(class: 'xs-12 sm-12 md-12')
|
3
|
+
table = cell(:elements, :table, :container).new
|
4
|
+
table_body = cell(:elements, :table, :body).new
|
5
|
+
%>
|
6
|
+
|
7
|
+
<%=raw block.open %>
|
8
|
+
|
9
|
+
<%=raw cell(:elements, :title).new(label: LANGUAGES[:lato_blog][:mixed][:languages], size: 6) %>
|
10
|
+
|
11
|
+
<%=raw table.open %>
|
12
|
+
|
13
|
+
<%=raw table_body.open %>
|
14
|
+
|
15
|
+
<% CONFIGS[:lato_blog][:languages].values.each do |language| %>
|
16
|
+
|
17
|
+
<% if @tag.meta_language === language[:identifier] %>
|
18
|
+
<%=raw cell(:elements, :table, :row).new(labels: [language[:title], '']) %>
|
19
|
+
<% elsif @tag.get_translation_for_language(language[:identifier]) %>
|
20
|
+
<% language_tag = @tag.get_translation_for_language(language[:identifier]) %>
|
21
|
+
<%=raw cell(:elements, :table, :row).new(labels: [
|
22
|
+
language[:title],
|
23
|
+
"<a href='#{lato_blog.tag_path(language_tag.id)}'>#{LANGUAGES[:lato_blog][:mixed][:show]}</a>"
|
24
|
+
]) %>
|
25
|
+
<% else %>
|
26
|
+
<%=raw cell(:elements, :table, :row).new(labels: [
|
27
|
+
language[:title],
|
28
|
+
"<a href='#{lato_blog.new_tag_path(language: language[:identifier], parent: @tag.tag_parent.id)}'>#{LANGUAGES[:lato_blog][:mixed][:create]}</a>"
|
29
|
+
]) %>
|
30
|
+
<% end %>
|
31
|
+
|
32
|
+
<% end %>
|
33
|
+
|
34
|
+
<%=raw table_body.close %>
|
35
|
+
|
36
|
+
<%=raw table.close %>
|
37
|
+
|
38
|
+
<%=raw block.close %>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%
|
2
|
+
block = cell(:elements, :block).new(class: 'xs-12 sm-12 md-12')
|
3
|
+
table = cell(:elements, :table, :container).new(border: true)
|
4
|
+
table_body = cell(:elements, :table, :body).new
|
5
|
+
%>
|
6
|
+
|
7
|
+
<%=raw block.open %>
|
8
|
+
|
9
|
+
<%=raw cell(:elements, :title).new(label: LANGUAGES[:lato_blog][:mixed][:info], size: 6) %>
|
10
|
+
|
11
|
+
<%=raw table.open %>
|
12
|
+
|
13
|
+
<%=raw table_body.open %>
|
14
|
+
|
15
|
+
<%=raw cell(:elements, :table, :row).new(labels: [LANGUAGES[:lato_blog][:mixed][:current_language], get_current_language_title]) %>
|
16
|
+
|
17
|
+
<%=raw table_body.close %>
|
18
|
+
|
19
|
+
<%=raw table.close %>
|
20
|
+
|
21
|
+
<%=raw block.close %>
|
@@ -66,10 +66,10 @@ post_fields:
|
|
66
66
|
<%=raw cell(:elements, :title).new(label: 'Base fields', size: 4) %>
|
67
67
|
|
68
68
|
<%=raw cell(:elements, :button).new(label: 'Text', url: lato_blog.doc_fields_text_path) %>
|
69
|
+
<%=raw cell(:elements, :button).new(label: 'Image', url: lato_blog.doc_fields_image_path) %>
|
69
70
|
<%=raw cell(:elements, :button).new(label: 'Datetime', url: lato_blog.doc_fields_datetime_path) %>
|
70
71
|
<%=raw cell(:elements, :button).new(label: 'Editor', url: lato_blog.doc_fields_editor_path) %>
|
71
72
|
<%=raw cell(:elements, :button).new(label: 'Geolocalization', url: lato_blog.doc_fields_geolocalization_path) %>
|
72
|
-
<%=raw cell(:elements, :button).new(label: 'Image', url: lato_blog.doc_fields_image_path) %>
|
73
73
|
|
74
74
|
<br> <br>
|
75
75
|
<%=raw cell(:elements, :title).new(label: 'Group fields', size: 4) %>
|
data/config/configs.yml
CHANGED
@@ -79,6 +79,11 @@ menu:
|
|
79
79
|
url: /lato/blog/categories
|
80
80
|
permission_min: 0
|
81
81
|
permission_max: 99
|
82
|
+
tags:
|
83
|
+
title: translate[posts_tags]
|
84
|
+
url: /lato/blog/tags
|
85
|
+
permission_min: 0
|
86
|
+
permission_max: 99
|
82
87
|
fields:
|
83
88
|
title: translate[post_fields]
|
84
89
|
url: /lato/blog/post_fields
|
@@ -3,6 +3,7 @@ menu:
|
|
3
3
|
posts_new: Add new
|
4
4
|
posts_index: Show all
|
5
5
|
posts_categories: Categories
|
6
|
+
posts_tags: Tags
|
6
7
|
post_fields: Fields
|
7
8
|
documentation: Doc. Blog
|
8
9
|
|
@@ -14,6 +15,9 @@ pages:
|
|
14
15
|
categories: Categories
|
15
16
|
categories_new: New category
|
16
17
|
categories_edit: Edit category
|
18
|
+
tags: Tags
|
19
|
+
tags_new: New tag
|
20
|
+
tags_edit: Edit tag
|
17
21
|
documentation: Documentation
|
18
22
|
|
19
23
|
flashes:
|
@@ -29,6 +33,10 @@ flashes:
|
|
29
33
|
category_not_found: Category not found
|
30
34
|
category_update_success: The Category was updated successfully
|
31
35
|
category_destroy_success: The Category was destroied successfully
|
36
|
+
tag_create_success: The Tag was created successfully
|
37
|
+
tag_not_found: Tag not found
|
38
|
+
tag_update_success: The Tag was updated successfully
|
39
|
+
tag_destroy_success: The Tag was destroied successfully
|
32
40
|
post_categories_not_accepted: There are not categories selected
|
33
41
|
post_update_fields_warning: The post is updated but we have some problems with fields
|
34
42
|
post_field_not_found: Field not found
|
@@ -72,7 +80,8 @@ mixed:
|
|
72
80
|
publication_datetime: Publication date
|
73
81
|
child_tree: Child tree
|
74
82
|
categories: Categories
|
75
|
-
|
83
|
+
tags: Tags
|
84
|
+
number_of_posts: Number of articles
|
76
85
|
key: Key
|
77
86
|
typology: Typology
|
78
87
|
visibility: Visibility
|
@@ -80,6 +89,7 @@ mixed:
|
|
80
89
|
post_id: Post id
|
81
90
|
post_field_id: Post field id
|
82
91
|
seo_description: Seo description
|
92
|
+
create_new_post: Create a new article
|
83
93
|
|
84
94
|
posts_status:
|
85
95
|
published: Published
|
data/config/languages/it.yml
CHANGED
@@ -3,6 +3,7 @@ menu:
|
|
3
3
|
posts_new: Aggiungi nuovo
|
4
4
|
posts_index: Visualizza tutti
|
5
5
|
posts_categories: Categorie
|
6
|
+
post_tags: Tags
|
6
7
|
post_fields: Campi
|
7
8
|
documentation: Doc. Blog
|
8
9
|
|
@@ -14,6 +15,9 @@ pages:
|
|
14
15
|
categories: Categorie
|
15
16
|
categories_new: Nuova categoria
|
16
17
|
categories_edit: Modifica categoria
|
18
|
+
tags: Tags
|
19
|
+
tags_new: Nuovo tag
|
20
|
+
tags_edit: Modifica tag
|
17
21
|
documentation: Documentazione
|
18
22
|
|
19
23
|
flashes:
|
@@ -29,6 +33,10 @@ flashes:
|
|
29
33
|
category_not_found: Categoria non trovata
|
30
34
|
category_update_success: Categoria aggiornata con successo
|
31
35
|
category_destroy_success: Categoria eliminata con successo
|
36
|
+
tag_create_success: Tag creato con successo
|
37
|
+
tag_not_found: Tag non trovato
|
38
|
+
tag_update_success: Tag aggiornato con successo
|
39
|
+
tag_destroy_success: Tag eliminato con successo
|
32
40
|
post_categories_not_accepted: Non ci sono categorie selezionate
|
33
41
|
post_update_fields_warning: L'articolo è stato aggiornato ma ci sono state problematiche con il salvataggio dei campi
|
34
42
|
post_field_not_found: Campo non trovato
|
@@ -72,6 +80,7 @@ mixed:
|
|
72
80
|
publication_datetime: Data di pubblicazione
|
73
81
|
child_tree: Albero dei figli
|
74
82
|
categories: Categorie
|
83
|
+
tags: Tags
|
75
84
|
number_of_posts: Numero di articoli
|
76
85
|
key: Chiave
|
77
86
|
typology: Tipologia
|
@@ -80,6 +89,7 @@ mixed:
|
|
80
89
|
post_id: Id articolo
|
81
90
|
post_field_id: Id campo
|
82
91
|
seo_description: Descrizione seo
|
92
|
+
create_new_post: Crea un nuovo articolo
|
83
93
|
|
84
94
|
posts_status:
|
85
95
|
published: Pubblico
|
data/config/routes/api.rb
CHANGED
@@ -8,4 +8,8 @@ namespace :api do
|
|
8
8
|
get 'categories', to: 'categories#index', as: 'categories_index'
|
9
9
|
get 'category', to: 'categories#show', as: 'categories_show'
|
10
10
|
|
11
|
+
# tags
|
12
|
+
get 'tags', to: 'tags#index', as: 'tags_index'
|
13
|
+
get 'tag', to: 'tags#show', as: 'tags_show'
|
14
|
+
|
11
15
|
end
|
data/config/routes/back.rb
CHANGED
@@ -6,6 +6,7 @@ resources :posts, module: 'back'
|
|
6
6
|
post 'posts_extra/update_status', to: 'back/posts#update_status', as: 'posts_update_status'
|
7
7
|
post 'posts_extra/update_publication_datetime', to: 'back/posts#update_publication_datetime', as: 'posts_update_publication_datetime'
|
8
8
|
post 'posts_extra/update_categories', to: 'back/posts#update_categories', as: 'posts_update_categories'
|
9
|
+
post 'posts_extra/update_tags', to: 'back/posts#update_tags', as: 'posts_update_tags'
|
9
10
|
post 'posts_extra/update_seo_description', to: 'back/posts#update_seo_description', as: 'posts_update_seo_description'
|
10
11
|
get 'posts_extra/destroy_all_deleted', to: 'back/posts#destroy_all_deleted', as: 'posts_destroy_all_deleted'
|
11
12
|
|
@@ -15,4 +16,7 @@ post 'post_fields_extra/create_relay_field', to: 'back/post_fields#create_relay_
|
|
15
16
|
post 'post_fields_extra/destroy_relay_field', to: 'back/post_fields#destroy_relay_field', as: 'post_fields_destroy_relay_field'
|
16
17
|
|
17
18
|
# categories
|
18
|
-
resources :categories, module: 'back'
|
19
|
+
resources :categories, module: 'back'
|
20
|
+
|
21
|
+
# tags
|
22
|
+
resources :tags, module: 'back'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class CreateLatoBlogTags < ActiveRecord::Migration[5.1]
|
2
|
+
def change
|
3
|
+
create_table :lato_blog_tags do |t|
|
4
|
+
t.string :title
|
5
|
+
|
6
|
+
t.string :meta_permalink
|
7
|
+
t.string :meta_language
|
8
|
+
|
9
|
+
t.integer :lato_core_superuser_creator_id
|
10
|
+
t.integer :lato_blog_tag_parent_id
|
11
|
+
|
12
|
+
t.timestamps
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/lato_blog/interface.rb
CHANGED
@@ -10,11 +10,11 @@ module LatoBlog
|
|
10
10
|
require 'lato_blog/interfaces/categories'
|
11
11
|
include LatoBlog::Interface::Categories
|
12
12
|
|
13
|
+
require 'lato_blog/interfaces/tags'
|
14
|
+
include LatoBlog::Interface::Tags
|
15
|
+
|
13
16
|
require 'lato_blog/interfaces/fields'
|
14
17
|
include LatoBlog::Interface::Fields
|
15
18
|
|
16
|
-
require 'lato_blog/interfaces/queries'
|
17
|
-
include LatoBlog::Interface::Queries
|
18
|
-
|
19
19
|
end
|
20
20
|
end
|
@@ -30,5 +30,71 @@ module LatoBlog
|
|
30
30
|
category_parents.map { |cp| cp.destroy if cp.categories.empty? }
|
31
31
|
end
|
32
32
|
|
33
|
+
# This function returns an object with the list of categories with some filters.
|
34
|
+
def blog__get_categories(
|
35
|
+
order: nil,
|
36
|
+
language: nil,
|
37
|
+
search: nil,
|
38
|
+
page: nil,
|
39
|
+
per_page: nil
|
40
|
+
)
|
41
|
+
categories = LatoBlog::Category.all
|
42
|
+
|
43
|
+
# apply filters
|
44
|
+
order = order && order == 'ASC' ? 'ASC' : 'DESC'
|
45
|
+
categories = _categories_filter_by_order(categories, order)
|
46
|
+
categories = _categories_filter_by_language(categories, language)
|
47
|
+
categories = _categories_filter_search(categories, search)
|
48
|
+
|
49
|
+
# take categories uniqueness
|
50
|
+
categories = categories.uniq(&:id)
|
51
|
+
|
52
|
+
# save total categories
|
53
|
+
total = categories.length
|
54
|
+
|
55
|
+
# manage pagination
|
56
|
+
page = page&.to_i || 1
|
57
|
+
per_page = per_page&.to_i || 20
|
58
|
+
categories = core__paginate_array(categories, per_page, page)
|
59
|
+
|
60
|
+
# return result
|
61
|
+
{
|
62
|
+
categories: categories && !categories.empty? ? categories.map(&:serialize) : [],
|
63
|
+
page: page,
|
64
|
+
per_page: per_page,
|
65
|
+
order: order,
|
66
|
+
total: total
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
# This function returns a single category searched by id or permalink.
|
71
|
+
def blog__get_category(id: nil, permalink: nil)
|
72
|
+
return {} unless id || permalink
|
73
|
+
|
74
|
+
if id
|
75
|
+
category = LatoBlog::Category.find_by(id: id.to_i)
|
76
|
+
else
|
77
|
+
category = LatoBlog::Category.find_by(meta_permalink: permalink)
|
78
|
+
end
|
79
|
+
|
80
|
+
category.serialize
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def _categories_filter_by_order(categories, order)
|
86
|
+
categories.order("title #{order}")
|
87
|
+
end
|
88
|
+
|
89
|
+
def _categories_filter_by_language(categories, language)
|
90
|
+
return categories unless language
|
91
|
+
categories.where(meta_language: language)
|
92
|
+
end
|
93
|
+
|
94
|
+
def _categories_filter_search(categories, search)
|
95
|
+
return categories unless search
|
96
|
+
categories.where('title like ?', "%#{search}%")
|
97
|
+
end
|
98
|
+
|
33
99
|
end
|
34
100
|
end
|
@@ -9,5 +9,153 @@ module LatoBlog
|
|
9
9
|
post_parents.map { |pp| pp.destroy if pp.posts.empty? }
|
10
10
|
end
|
11
11
|
|
12
|
+
# This function returns an object with the list of posts with some filters.
|
13
|
+
def blog__get_posts(
|
14
|
+
order: nil,
|
15
|
+
language: nil,
|
16
|
+
category_permalink: nil,
|
17
|
+
category_permalink_AND: false,
|
18
|
+
category_id: nil,
|
19
|
+
category_id_AND: false,
|
20
|
+
tag_permalink: nil,
|
21
|
+
tag_permalink_AND: false,
|
22
|
+
tag_id: nil,
|
23
|
+
tag_id_AND: false,
|
24
|
+
search: nil,
|
25
|
+
page: nil,
|
26
|
+
per_page: nil
|
27
|
+
)
|
28
|
+
posts = LatoBlog::Post.published.joins(:post_parent).where('lato_blog_post_parents.publication_datetime <= ?', DateTime.now)
|
29
|
+
|
30
|
+
# apply filters
|
31
|
+
order = order && order == 'ASC' ? 'ASC' : 'DESC'
|
32
|
+
posts = _posts_filter_by_order(posts, order)
|
33
|
+
posts = _posts_filter_by_language(posts, language)
|
34
|
+
if category_permalink || category_id
|
35
|
+
posts = posts.joins(:categories)
|
36
|
+
posts = _posts_filter_by_category_permalink(posts, category_permalink, category_permalink_AND)
|
37
|
+
posts = _posts_filter_category_id(posts, category_id, category_id_AND)
|
38
|
+
end
|
39
|
+
if tag_permalink || tag_id
|
40
|
+
posts = posts.joins(:tags)
|
41
|
+
posts = _posts_filter_by_tag_permalink(posts, tag_permalink, tag_permalink_AND)
|
42
|
+
posts = _posts_filter_tag_id(posts, tag_id, tag_id_AND)
|
43
|
+
end
|
44
|
+
posts = _posts_filter_search(posts, search)
|
45
|
+
|
46
|
+
# take posts uniqueness
|
47
|
+
posts = posts.uniq(&:id)
|
48
|
+
|
49
|
+
# save total posts
|
50
|
+
total = posts.length
|
51
|
+
|
52
|
+
# manage pagination
|
53
|
+
page = page&.to_i || 1
|
54
|
+
per_page = per_page&.to_i || 20
|
55
|
+
posts = core__paginate_array(posts, per_page, page)
|
56
|
+
|
57
|
+
# return result
|
58
|
+
{
|
59
|
+
posts: posts && !posts.empty? ? posts.map(&:serialize) : [],
|
60
|
+
page: page,
|
61
|
+
per_page: per_page,
|
62
|
+
order: order,
|
63
|
+
total: total
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
# This function returns a single post searched by id or permalink.
|
68
|
+
def blog__get_post(id: nil, permalink: nil)
|
69
|
+
return {} unless id || permalink
|
70
|
+
|
71
|
+
if id
|
72
|
+
post = LatoBlog::Post.find_by(id: id.to_i, meta_status: 'published')
|
73
|
+
else
|
74
|
+
post = LatoBlog::Post.find_by(meta_permalink: permalink, meta_status: 'published')
|
75
|
+
end
|
76
|
+
|
77
|
+
post.serialize
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def _posts_filter_by_order(posts, order)
|
83
|
+
posts.order("lato_blog_post_parents.publication_datetime #{order}")
|
84
|
+
end
|
85
|
+
|
86
|
+
def _posts_filter_by_language(posts, language)
|
87
|
+
return posts unless language
|
88
|
+
posts.where(meta_language: language)
|
89
|
+
end
|
90
|
+
|
91
|
+
def _posts_filter_by_category_permalink(posts, category_permalink, category_permalink_AND)
|
92
|
+
return posts unless category_permalink
|
93
|
+
category_permalinks = category_permalink.is_a?(Array) ? category_permalink : category_permalink.split(',')
|
94
|
+
posts = posts.where(lato_blog_categories: { meta_permalink: category_permalinks })
|
95
|
+
# manage AND clause
|
96
|
+
if ['true', true].include?(category_permalink_AND)
|
97
|
+
ids = []
|
98
|
+
posts.pluck(:id).each do |id|
|
99
|
+
ids.push(id) if posts.where(id: id).length >= category_permalinks.length
|
100
|
+
end
|
101
|
+
posts = posts.where(id: ids)
|
102
|
+
end
|
103
|
+
# return posts
|
104
|
+
posts
|
105
|
+
end
|
106
|
+
|
107
|
+
def _posts_filter_category_id(posts, category_id, category_id_AND)
|
108
|
+
return posts unless category_id
|
109
|
+
category_ids = category_id.is_a?(Array) ? category_id : category_id.split(',')
|
110
|
+
posts = posts.where(lato_blog_categories: { id: category_ids })
|
111
|
+
# manage AND clause
|
112
|
+
if ['true', true].include?(category_id_AND)
|
113
|
+
ids = []
|
114
|
+
posts.pluck(:id).each do |id|
|
115
|
+
ids.push(id) if posts.where(id: id).length >= category_ids.length
|
116
|
+
end
|
117
|
+
posts = posts.where(id: ids)
|
118
|
+
end
|
119
|
+
# return posts
|
120
|
+
posts
|
121
|
+
end
|
122
|
+
|
123
|
+
def _posts_filter_by_tag_permalink(posts, tag_permalink, tag_permalink_AND)
|
124
|
+
return posts unless tag_permalink
|
125
|
+
tag_permalinks = tag_permalink.is_a?(Array) ? tag_permalink : tag_permalink.split(',')
|
126
|
+
posts = posts.where(lato_blog_tags: { meta_permalink: tag_permalinks })
|
127
|
+
# manage AND clause
|
128
|
+
if ['true', true].include?(tag_permalink_AND)
|
129
|
+
ids = []
|
130
|
+
posts.pluck(:id).each do |id|
|
131
|
+
ids.push(id) if posts.where(id: id).length >= tag_permalinks.length
|
132
|
+
end
|
133
|
+
posts = posts.where(id: ids)
|
134
|
+
end
|
135
|
+
# return posts
|
136
|
+
posts
|
137
|
+
end
|
138
|
+
|
139
|
+
def _posts_filter_tag_id(posts, tag_id, tag_id_AND)
|
140
|
+
return posts unless tag_id
|
141
|
+
tag_ids = tag_id.is_a?(Array) ? tag_id : tag_id.split(',')
|
142
|
+
posts = posts.where(lato_blog_tags: { id: tag_ids })
|
143
|
+
# manage AND clause
|
144
|
+
if ['true', true].include?(tag_id_AND)
|
145
|
+
ids = []
|
146
|
+
posts.pluck(:id).each do |id|
|
147
|
+
ids.push(id) if posts.where(id: id).length >= tag_ids.length
|
148
|
+
end
|
149
|
+
posts = posts.where(id: ids)
|
150
|
+
end
|
151
|
+
# return posts
|
152
|
+
posts
|
153
|
+
end
|
154
|
+
|
155
|
+
def _posts_filter_search(posts, search)
|
156
|
+
return posts unless search
|
157
|
+
posts.where('lato_blog_posts.title like ?', "%#{params[:search]}%")
|
158
|
+
end
|
159
|
+
|
12
160
|
end
|
13
161
|
end
|