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
         |