Adds a confirm to resource deletion, makes resource file sorting respect folders, a=chris

Chris Pollett [2016-03-04 18:Mar:th]
Adds a confirm to resource deletion, makes resource file sorting respect folders, a=chris
Filename
src/controllers/components/SocialComponent.php
src/models/GroupModel.php
src/models/datasources/DatasourceManager.php
src/views/elements/WikiElement.php
diff --git a/src/controllers/components/SocialComponent.php b/src/controllers/components/SocialComponent.php
index 3e3069f09..c0dda7bcc 100644
--- a/src/controllers/components/SocialComponent.php
+++ b/src/controllers/components/SocialComponent.php
@@ -1811,20 +1811,7 @@ class SocialComponent extends Component implements CrawlConstants
                     $data['RESOURCES_INFO'] =
                         $group_model->getGroupPageResourceUrls($group_id,
                             $data['PAGE_ID'], $sub_path);
-                    if (!empty($data["HEAD"]['sort']) &&
-                        !empty($data["RESOURCES_INFO"]['resources'])) {
-                        $sort_field = substr($data["HEAD"]['sort'], 1);
-                        $callback = ($data["HEAD"]['sort'][0] == 'r') ?
-                            "rorderCallback" : "orderCallback";
-                        if ($sort_field == 'name') {
-                            $callback = ($data["HEAD"]['sort'][0] == 'r') ?
-                                "stringROrderCallback" : "stringOrderCallback";
-                        }
-                        $callback_name = C\NS_LIB . $callback;
-                        $callback_name(null, null, $sort_field);
-                        usort($data["RESOURCES_INFO"]["resources"],
-                            C\NS_LIB . $callback);
-                    }
+                    $this->sortWikiResources($data);
                 }
                 if ($data["HEAD"]['page_type'] == 'presentation' &&
                     $data['CONTROLLER'] == 'group') {
@@ -1840,20 +1827,7 @@ class SocialComponent extends Component implements CrawlConstants
                         $data[$key] = $data["HEAD"][$key];
                     }
                 }
-                if (!empty($data["HEAD"]['sort']) &&
-                    !empty($data["RESOURCES_INFO"]['resources'])) {
-                    $sort_field = substr($data["HEAD"]['sort'], 1);
-                    $callback = ($data["HEAD"]['sort'][0] == 'r') ?
-                        "rorderCallback" : "orderCallback";
-                    if ($sort_field == 'name') {
-                        $callback = ($data["HEAD"]['sort'][0] == 'r') ?
-                            "stringROrderCallback" : "stringOrderCallback";
-                    }
-                    $callback_name = C\NS_LIB . $callback;
-                    $callback_name(null, null, $sort_field);
-                    usort($data["RESOURCES_INFO"]["resources"],
-                        C\NS_LIB . $callback);
-                }
+                $this->sortWikiResources($data);
                 $data['settings'] = "false";
                 if (isset($_REQUEST['settings']) &&
                     $_REQUEST['settings']=='true') {
@@ -1866,6 +1840,34 @@ class SocialComponent extends Component implements CrawlConstants
         }
         return $data;
     }
+    /**
+     *
+     */
+    private function sortWikiResources(&$data)
+    {
+        if (empty($data["HEAD"]['sort']) ||
+            empty($data["RESOURCES_INFO"]['resources'])) {
+            return;
+        }
+        restore_error_handler();
+        $sort_map = @unserialize(L\webdecode($data["HEAD"]['sort']));
+        set_error_handler(C\NS_LIB . "yioop_error_handler");
+        $sort_key = (empty($data['SUB_PATH'])) ? "." : $data['SUB_PATH'];
+        $sort_key = rtrim($sort_key, '/');
+        if (empty($sort_map[$sort_key])) {
+            return;
+        }
+        $sort_field = substr($sort_map[$sort_key], 1);
+        $callback = ($sort_map[$sort_key][0] == 'r') ?
+            "rorderCallback" : "orderCallback";
+        if ($sort_field == 'name') {
+            $callback = ($sort_map[$sort_key][0] == 'r') ?
+                "stringROrderCallback" : "stringOrderCallback";
+        }
+        $callback_name = C\NS_LIB . $callback;
+        $callback_name(null, null, $sort_field);
+        usort($data["RESOURCES_INFO"]["resources"], C\NS_LIB . $callback);
+    }
     /**
      *
      */
@@ -1913,10 +1915,8 @@ class SocialComponent extends Component implements CrawlConstants
                     "</h1>');";
                 break;
             }
-            if (!empty($_REQUEST['sort'])) {
-                $head_object =$parent->parsePageHeadVars(
-                    $page_info['PAGE']);
-            }
+            $head_object =$parent->parsePageHeadVars(
+                $page_info['PAGE']);
             $write_head = false;
             $head_vars = [];
             $page_types = array_keys($data['page_types']);
@@ -1963,11 +1963,26 @@ class SocialComponent extends Component implements CrawlConstants
                                     }
                                 }
                                 $new_key = 'a' . $head_vars[$key];
-                                if (isset($head_object['sort']) &&
-                                    $head_object['sort'] == $new_key) {
+                                if (isset($head_object['sort'])) {
+                                    restore_error_handler();
+                                    $head_object['sort'] = @unserialize(
+                                        L\webdecode($head_object['sort']));
+                                    set_error_handler(C\NS_LIB .
+                                        "yioop_error_handler");
+                                } else {
+                                    $head_object['sort'] = [];
+                                }
+                                $sort_path = empty($sub_path) ? "." :
+                                    $sub_path;
+                                $sort_path = rtrim($sort_path, '/');
+                                if (empty($head_object['sort'][$sort_path]) ||
+                                    $head_object['sort'][$sort_path] ==
+                                    $new_key) {
                                     $new_key = 'r' . $head_vars[$key];
                                 }
-                                $head_vars[$key] = $new_key;
+                                $head_object['sort'][$sort_path] = $new_key;
+                                $head_vars[$key] = L\webencode(serialize(
+                                    $head_object['sort']));
                                 $edit_reason = "Change resource sort";
                                 $write_head = true;
                             } else {
@@ -1990,14 +2005,12 @@ class SocialComponent extends Component implements CrawlConstants
                     }
                 }
             }
-            if ($write_head) {
-                $head_string = "";
-                foreach ($page_defaults as $key => $default) {
-                    $head_string .= $key . "=" . $head_vars[$key].
-                        "\n\n";
-                }
-                $page = $head_string . "END_HEAD_VARS" . $page;
+            $head_string = "";
+            foreach ($page_defaults as $key => $default) {
+                $head_string .= $key . "=" . $head_vars[$key].
+                    "\n\n";
             }
+            $page = $head_string . "END_HEAD_VARS" . $page;
             $page_info['ID'] = $group_model->setPageName($user_id,
                 $group_id, $page_name, $page,
                 $data['CURRENT_LOCALE_TAG'], $edit_reason,
diff --git a/src/models/GroupModel.php b/src/models/GroupModel.php
index c760da1cd..3839ce465 100644
--- a/src/models/GroupModel.php
+++ b/src/models/GroupModel.php
@@ -1390,7 +1390,7 @@ class GroupModel extends Model implements MediaConstants
         $file_name = "$folder/$resource_name";
         $thumb_name = "$thumb_folder/$resource_name.jpg";
         if (file_exists($file_name)) {
-            $this->db->unlinkRecursive($file_name, true);
+            $this->db->unlinkRecursive($file_name);
         }
         if (file_exists($thumb_name)) {
             unlink($thumb_name);
diff --git a/src/models/datasources/DatasourceManager.php b/src/models/datasources/DatasourceManager.php
index e1006c25c..78f3330a0 100755
--- a/src/models/datasources/DatasourceManager.php
+++ b/src/models/datasources/DatasourceManager.php
@@ -237,8 +237,13 @@ abstract class DatasourceManager
      */
     public function traverseDirectory($dir, $callback, $rootToo = true)
     {
+        // single not directory case
+        if (!is_dir($dir)) {
+            return @$callback($dir);
+        }
+        // directory case
         $results = [];
-        if (!is_dir($dir) || !$dh = @opendir($dir)) {
+        if (!$dh = @opendir($dir)) {
             return $results;
         }
         while (false !== ($obj = readdir($dh))) {
diff --git a/src/views/elements/WikiElement.php b/src/views/elements/WikiElement.php
index 46e0ff03c..9f5cf904b 100644
--- a/src/views/elements/WikiElement.php
+++ b/src/views/elements/WikiElement.php
@@ -606,7 +606,7 @@ class WikiElement extends Element implements CrawlConstants
                 e("</div>");
                 $folder_prefix = "$folder_prefix&amp;sf=$sub_path";
             }
-            if (count($data['RESOURCES_INFO']['resources']) > 0) {
+            if (count($data['RESOURCES_INFO']['resources']) > 0 || !$read_mode){
                 e('<table >');
                 if (!$read_mode) {
                     ?><tr><th></th><th><a href='<?=
@@ -620,13 +620,18 @@ class WikiElement extends Element implements CrawlConstants
                     <input type="hidden" name='page_name'
                         value='<?=$data['PAGE_NAME']?>' />
                     <?php
+                    if (!empty($data['SUB_PATH'])) { ?>
+                        <input type="hidden" name='sf'
+                            value='<?=$data['SUB_PATH']; ?>' />
+                        <?php
+                    }
                     $this->view->helper("options")->render("resource-actions",
                         "resource_actions", $data['resource_actions'],
                         'actions', true);
                     ?></form><?php
                     if (!C\MOBILE) {
                         e("</th><th><a href='$folder_prefix&amp;sort=size'>".
-                            tl('wiki_element_size').'</a></th>');
+                            tl('wiki_element_size').'</a>');
                         e("</th><th><a href='".
                             "$folder_prefix&amp;sort=modified'>".
                             tl('wiki_element_modified').'</a></th>');
@@ -723,7 +728,9 @@ class WikiElement extends Element implements CrawlConstants
                             if (!empty($data['SUB_PATH'])) {
                                 $delete_url .= "&amp;sf={$data['SUB_PATH']}";
                             }
-                            e("<td>[<a href='$delete_url'>X</a>]</td>");
+                            e("<td>[<a onclick='javascript:return confirm(\"".
+                                tl('confirm_delete_operation')."\");' ".
+                                "href='$delete_url'>X</a>]</td>");
                         } else {
                             e("<td></td>");
                         }
@@ -738,11 +745,12 @@ class WikiElement extends Element implements CrawlConstants
                     $i++;
                 }
                 e('</table>');
-                return;
             }
         }
-        ?>
-        <div class='red'><?=tl('wiki_element_no_resources')?></div><?php
+        if (count($data['RESOURCES_INFO']['resources']) == 0) {
+            ?>
+            <div class='red'><?=tl('wiki_element_no_resources')?></div><?php
+        }
     }
     /**
      * Used to draw a list of Wiki Pages for the current group. It also
ViewGit