]> git.wh0rd.org - tt-rss.git/commitdiff
implement filter drag and drop sorting
authorAndrew Dolgov <fox@madoka.volgo-balt.ru>
Sun, 31 Mar 2013 13:15:23 +0000 (17:15 +0400)
committerAndrew Dolgov <fox@madoka.volgo-balt.ru>
Sun, 31 Mar 2013 13:15:23 +0000 (17:15 +0400)
classes/pref/filters.php
js/PrefFilterTree.js
js/prefs.js

index a64333f796050dec63040c09771e135731138815..6ccff51d76fe3d765e3e913cc32a34eb80b72746 100644 (file)
@@ -3,11 +3,47 @@ class Pref_Filters extends Handler_Protected {
 
        function csrf_ignore($method) {
                $csrf_ignored = array("index", "getfiltertree", "edit", "newfilter", "newrule",
-                       "newaction");
+                       "newaction", "savefilterorder");
 
                return array_search($method, $csrf_ignored) !== false;
        }
 
+       function filtersortreset() {
+               db_query($this->link, "UPDATE ttrss_filters2
+                               SET order_id = 0 WHERE owner_uid = " . $_SESSION["uid"]);
+               return;
+       }
+
+       function savefilterorder() {
+               $data = json_decode($_POST['payload'], true);
+
+               #file_put_contents("/tmp/saveorder.json", $_POST['payload']);
+               #$data = json_decode(file_get_contents("/tmp/saveorder.json"), true);
+
+               if (!is_array($data['items']))
+                       $data['items'] = json_decode($data['items'], true);
+
+               $index = 0;
+
+               if (is_array($data) && is_array($data['items'])) {
+                       foreach ($data['items'][0]['items'] as $item) {
+                               $filter_id = (int) str_replace("FILTER:", "", $item['_reference']);
+
+                               if ($filter_id > 0) {
+
+                                       db_query($this->link, "UPDATE ttrss_filters2 SET
+                                               order_id = $index WHERE id = '$filter_id' AND
+                                               owner_uid = " .$_SESSION["uid"]);
+
+                                       ++$index;
+                               }
+                       }
+               }
+
+               return;
+       }
+
+
        function testFilter() {
                $filter = array();
 
@@ -623,6 +659,10 @@ class Pref_Filters extends Handler_Protected {
                print "<button dojoType=\"dijit.form.Button\" onclick=\"return editSelectedFilter()\">".
                        __('Edit')."</button> ";
 
+               print "<button dojoType=\"dijit.form.Button\" onclick=\"return resetFilterOrder()\">".
+                       __('Reset sort order')."</button> ";
+
+
                print "<button dojoType=\"dijit.form.Button\" onclick=\"return removeSelectedFilters()\">".
                        __('Remove')."</button> ";
 
@@ -639,14 +679,16 @@ class Pref_Filters extends Handler_Protected {
                <img src='images/indicator_tiny.gif'>".
                 __("Loading, please wait...")."</div>";
 
-               print "<div dojoType=\"dojo.data.ItemFileWriteStore\" jsId=\"filterStore\"
+               print "<div dojoType=\"fox.PrefFilterStore\" jsId=\"filterStore\"
                        url=\"backend.php?op=pref-filters&method=getfiltertree\">
                </div>
                <div dojoType=\"lib.CheckBoxStoreModel\" jsId=\"filterModel\" store=\"filterStore\"
-               query=\"{id:'root'}\" rootId=\"root\" rootLabel=\"Feeds\"
+                       query=\"{id:'root'}\" rootId=\"root\" rootLabel=\"Filters\"
                        childrenAttrs=\"items\" checkboxStrict=\"false\" checkboxAll=\"false\">
                </div>
                <div dojoType=\"fox.PrefFilterTree\" id=\"filterTree\"
+                       dndController=\"dijit.tree.dndSource\"
+                       betweenThreshold=\"5\"
                        model=\"filterModel\" openOnClick=\"true\">
                <script type=\"dojo/method\" event=\"onLoad\" args=\"item\">
                        Element.hide(\"filterlistLoading\");
index afa2f445aa06dea1e5958a6d38e3c1a634af830b..3546e30fb2db12ab3f7bacd3c8ad4cb31b95ea21 100644 (file)
@@ -1,6 +1,22 @@
 dojo.provide("fox.PrefFilterTree");
 
 dojo.require("lib.CheckBoxTree");
+dojo.require("dojo.data.ItemFileWriteStore");
+
+dojo.declare("fox.PrefFilterStore", dojo.data.ItemFileWriteStore, {
+
+       _saveEverything: function(saveCompleteCallback, saveFailedCallback,
+                                                               newFileContentString) {
+
+               dojo.xhrPost({
+                       url: "backend.php",
+                       content: {op: "pref-filters", method: "savefilterorder",
+                               payload: newFileContentString},
+                       error: saveFailedCallback,
+                       load: saveCompleteCallback});
+       },
+
+});
 
 dojo.declare("fox.PrefFilterTree", lib.CheckBoxTree, {
        _createTreeNode: function(args) {
@@ -48,5 +64,17 @@ dojo.declare("fox.PrefFilterTree", lib.CheckBoxTree, {
                return (!item.error || item.error == '') ? "dijitTreeRow" :
                        "dijitTreeRow Error";
        },
+       checkItemAcceptance: function(target, source, position) {
+               var item = dijit.getEnclosingWidget(target).item;
+
+               // disable copying items
+               source.copyState = function() { return false; };
+
+               return position != 'over';
+       },
+       onDndDrop: function() {
+               this.inherited(arguments);
+               this.tree.model.store.save();
+       },
 });
 
index 7d12e42025a24f192084c288bfa284bdc876bcc6..cc2246374e8211a076785361a1a4c4975c98ec90 100644 (file)
@@ -1563,6 +1563,24 @@ function clearArticleAccessKeys() {
 
        return false;
 }
+
+function resetFilterOrder() {
+       try {
+               notify_progress("Loading, please wait...");
+
+               new Ajax.Request("backend.php", {
+                       parameters: "?op=pref-filters&method=filtersortreset",
+                       onComplete: function(transport) {
+                               updateFilterList();
+                       } });
+
+
+       } catch (e) {
+               exception_error("resetFilterOrder");
+       }
+}
+
+
 function resetFeedOrder() {
        try {
                notify_progress("Loading, please wait...");