lato_blog 2.1.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|