From a2badcbfe8ef94ef2e8257be8db7c930f75a56a7 Mon Sep 17 00:00:00 2001 From: Gert Date: Mon, 20 Apr 2015 20:41:34 +0200 Subject: [PATCH] Hook up page filtering [fixes #22][fixes #23] --- classes/controller.php | 38 +++++++++++ pages/admin/pages-filter.md | 7 ++ themes/grav/js/pages-all.js | 65 ++++++++++++++++++- themes/grav/templates/pages-filter.json.twig | 5 ++ themes/grav/templates/pages.html.twig | 4 +- .../partials/plugins-details.html.twig | 2 +- 6 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 pages/admin/pages-filter.md create mode 100644 themes/grav/templates/pages-filter.json.twig diff --git a/classes/controller.php b/classes/controller.php index 2e70bc1f..a6a11eb0 100644 --- a/classes/controller.php +++ b/classes/controller.php @@ -9,6 +9,7 @@ use Grav\Common\Themes; use Grav\Common\Uri; use Grav\Common\Data; use Grav\Common\Page; +use Grav\Common\Page\Collection; use Grav\Common\User\User; class AdminController @@ -265,6 +266,43 @@ class AdminController return true; } + protected function taskFilterPages() + { + $data = $this->post; + + $flags = !empty($data['flags']) ? array_map('strtolower', explode(',', $data['flags'])) : []; + $queries = !empty($data['query']) ? explode(',', $data['query']) : []; + + $collection = $this->grav['pages']->all(); + + if (count($flags)) { + if (in_array('modular', $flags)) + $collection = $collection->modular(); + + if (in_array('visible', $flags)) + $collection = $collection->visible(); + + if (in_array('routable', $flags)) + $collection = $collection->routable(); + } + + if (!empty($queries)) { + foreach ($collection as $page) { + foreach ($queries as $query) { + $query = trim($query); + + // $page->content(); + if (stripos($page->getRawContent(), $query) === false && stripos($page->title(), $query) === false) { + $collection->remove($page); + } + } + } + } + + $this->admin->json_response = ['success', 'Pages filtered']; + $this->admin->collection = $collection; + } + protected function taskListmedia() { $page = $this->admin->page(true); diff --git a/pages/admin/pages-filter.md b/pages/admin/pages-filter.md new file mode 100644 index 00000000..7a7463e1 --- /dev/null +++ b/pages/admin/pages-filter.md @@ -0,0 +1,7 @@ +--- +title: Pages Filter + +access: + admin.pages: true + admin.super: true +--- diff --git a/themes/grav/js/pages-all.js b/themes/grav/js/pages-all.js index da076912..a4479e45 100644 --- a/themes/grav/js/pages-all.js +++ b/themes/grav/js/pages-all.js @@ -14,10 +14,71 @@ $(function(){ // selectize $('input.page-filter').selectize({ - delimiter: ',', - create: false + maxItems: null, + valueField: 'flag', + labelField: 'flag', + searchField: ['flag'], + options: [ + {flag: 'Modular'}, + {flag: 'Visible'}, + {flag: 'Routable'} + ], }); + var startFilterPages = function () { + + $('input[name="page-search"]').focus(); + var flags = $('input[name="page-filter"]').val(), + query = $('input[name="page-search"]').val(); + + if (!flags.length && !query.length) { + return finishFilterPages([], true); + } + + GravAjax({ + dataType: 'json', + method: 'POST', + url: GravAdmin.config.base_url_relative + '/pages-filter.json/task:filterPages', + data: { + flags: flags, + query: query + }, + success: function (result, status) { + finishFilterPages(result.results); + } + }); + }; + + var finishFilterPages = function (pages, reset) { + var items = $('[data-nav-id]'); + + items.removeClass('search-match'); + + if (reset) { + items.addClass('search-match'); + } else { + pages.forEach(function (id) { + var match = items.filter('[data-nav-id="' + id + '"]'); + match.addClass('search-match'); + match.find('[data-nav-id]').addClass('search-match'); + match.parents('[data-nav-id]').addClass('search-match'); + }); + } + + items.each(function (key, item) { + if ($(item).hasClass('search-match')) { + $(item).show(); + } else { + $(item).hide(); + } + }); + }; + + // selectize + $('input[name="page-search"]').on('input', startFilterPages); + $('input[name="page-filter"]').on('change', startFilterPages); + + // auto generate folder based on title // on user input on folder, autogeneration stops // if user empties the folder, autogeneration restarts diff --git a/themes/grav/templates/pages-filter.json.twig b/themes/grav/templates/pages-filter.json.twig new file mode 100644 index 00000000..cb7d2501 --- /dev/null +++ b/themes/grav/templates/pages-filter.json.twig @@ -0,0 +1,5 @@ +{"status":{{admin.json_response[0]|json_encode}}, "results":[ +{%- for search_result in admin.collection -%} +{{- search_result.route|json_encode -}}{{ not loop.last ? ',' }} +{%- endfor -%} +]} diff --git a/themes/grav/templates/pages.html.twig b/themes/grav/templates/pages.html.twig index 17bf9a07..a4ced819 100644 --- a/themes/grav/templates/pages.html.twig +++ b/themes/grav/templates/pages.html.twig @@ -45,7 +45,7 @@ (p.routable ? 'Routable • ' : 'Not Routable • ') ~ (p.visible ? 'Visible • ' : 'Not Visible • ') %} -
  • +
  • 0 ? 'data-toggle="children"' : ''}} data-hint="{{ description|trim(' • ') }}" class="hint--bottom"> @@ -131,7 +131,7 @@ {% else %}
    - +