diff --git a/css/imce-content.css b/css/imce-content.css index f746e0d..ce557dc 100644 --- a/css/imce-content.css +++ b/css/imce-content.css @@ -457,4 +457,15 @@ body.imce { } .box-view #file-list td.size, .box-view #file-list td.date, .box-view #file-list td.width, .box-view #file-list td.height { display: none; +} +#dir-stat .imce_pager { + text-align:right; + width:49%; + + float:right; +} +#dir-stat .dir-stat-inner { + width:49%; + + float:left; } \ No newline at end of file diff --git a/imce.module b/imce.module index f3dc4bf..f31d1dd 100644 --- a/imce.module +++ b/imce.module @@ -69,6 +69,11 @@ function imce_theme() { $theme['imce_root_text'] = array( 'variables' => array('imce_ref' => NULL), ); + $theme['imce_pager'] = array( + 'template' => 'imce-pager', + 'arguments' => array('imce' => NULL, 'pager' => NULL), + 'path' => $path, + ); $theme['imce_user_page'] = array( 'variables' => array('account' => NULL), ); @@ -79,7 +84,7 @@ function imce_theme() { ); $theme['imce_content'] = array( 'template' => 'imce-content', - 'variables' => array('tree' => NULL, 'forms' => NULL, 'imce_ref' => NULL), + 'arguments' => array('tree' => NULL, 'forms' => NULL, 'imce_ref' => NULL, 'pager' => NULL), 'path' => $path, ); $theme['imce_page'] = array( @@ -198,4 +203,34 @@ function imce_user_page_access($account, $user = FALSE) { */ function imce_reg_dir($dirname) { return $dirname == '.' || is_int($dirname) || (is_string($dirname) && $dirname != '' && !preg_match('@(^\s)|(^/)|(^\./)|(\s$)|(/$)|(/\.$)|(\.\.)|(//)|(\\\\)|(/\./)@', $dirname)); -} \ No newline at end of file +} + +function imce_get_pager($imce) { + $imce_showperpage = variable_get('imce_showperpage', 20); + if ($imce_showperpage != 0) { + $page = 1; + if (isset($_GET['page'])) { + $page = intval($_GET['page']); + } + + $prev = ''; + $next = ''; + if($page > 1) { + $prev = ''.t('Previous').' | '; + } + + if(count($imce['files']) === (int) $imce_showperpage) { + $next = ' | ' . t('Next') . ''; + } + return theme('imce_pager', array( + 'imce' => $imce, + 'pager' => array( + 'page' => $page, + 'prev' => $prev, + 'next' => $next, + ))); + } + else { + return ''; + } +} diff --git a/inc/imce.admin.inc b/inc/imce.admin.inc index 587aa47..42bd060 100644 --- a/inc/imce.admin.inc +++ b/inc/imce.admin.inc @@ -64,6 +64,20 @@ function imce_admin_form($form, &$form_state) { $form['roles'][$rid] = imce_role_form($role, $form['#weighted'], $core); } + //pager settings + $form['pager'] = array( + '#type' => 'fieldset', + '#title' => t('Pager settings'), + '#collapsible' => true, + '#collapsed' => false, + ); + $form['pager']['imce_showperpage'] = array( + '#type' => 'textfield', + '#title' => t('Number files per page'), + '#default_value' => variable_get('imce_showperpage', 20), + '#description' => t('By default 20 shown per page. Smaller number faster rendering. Set to 0 for remove paging'), + ); + //common settings $form['common'] = array( '#type' => 'fieldset', @@ -183,6 +197,14 @@ function imce_admin_submit($form, &$form_state) { variable_set('imce_settings_replace', $form_state['values']['replace']); variable_set('imce_settings_thumb_method', $form_state['values']['thumb_method']); variable_set('imce_settings_disable_private', $form_state['values']['disable_private']); + if (isset($form_state['values']['imce_maxpages'])) { + variable_set('imce_maxpages', $form_state['values']['imce_maxpages']); + } + + if (isset($form_state['values']['imce_showperpage'])) { + variable_set('imce_showperpage', $form_state['values']['imce_showperpage']); + } + drupal_set_message(t('Changes have been saved.')); } @@ -737,4 +759,4 @@ function imce_admin_check_wildcard_upload($rid, $conf = NULL) { } //Include core profile functions. -include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'imce') . '/inc/imce.core.profiles.inc'; \ No newline at end of file +include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'imce') . '/inc/imce.core.profiles.inc'; diff --git a/inc/imce.page.inc b/inc/imce.page.inc index 32e267c..f119c01 100644 --- a/inc/imce.page.inc +++ b/inc/imce.page.inc @@ -73,11 +73,22 @@ function imce_content($user, $scheme = NULL, $jsop = NULL) { } } - $content = theme('imce_content', array( - 'tree' => imce_create_tree($imce), - 'forms' => $forms, - 'imce_ref' => $imce_ref, - )); + //pager start + $page = 1; + + if (isset($_GET['page'])) { + $page = intval($_GET['page']); + } + if (isset($_GET)) { + //first load of the window capture any GET params that were passed in so the pager can still use them. + $_SESSION['imce_init_get'] = $_GET; + } + + //pager end + + $pager = imce_get_pager($imce);//theme('imce_pager', array('imce'=>$imce, 'page'=>$page)); + + $content = theme('imce_content', array('tree'=>imce_create_tree($imce),'forms'=>$forms,'imce_ref'=>$imce_ref,'pager'=>$pager)); //make necessary changes for js conversion $imce['dir'] = str_replace('%2F', '/', rawurlencode($imce['dir'])); @@ -110,6 +121,8 @@ function imce_js($user, $scheme, $jsop = '') { } } } + //pager + $response['data']['dirpager'] = imce_get_pager($imce); //messages $response['messages'] = drupal_get_messages(); @@ -966,6 +979,12 @@ function imce_perm_exists(&$imce, $perm) { /** * Scan directory and return file list, subdirectories, and total size. */ +function _imce_dir_cmp($a, $b) { + if ($a['date'] == $b['date']) { + return 0; + } + return ($a['date'] < $b['date']) ? 1 : -1; +} function imce_scan_directory($dirname, $imce) { $directory = array('dirsize' => 0, 'files' => array(), 'subdirectories' => array(), 'error' => FALSE); @@ -977,6 +996,16 @@ function imce_scan_directory($dirname, $imce) { return $directory; } + $start = 0; + $imce_showperpage = variable_get('imce_showperpage', 10); + if ($imce_showperpage != 0) { + if (isset($_GET['page']) && $_GET['page'] != 1) { + $start = ($_GET['page'] - 1) * $imce_showperpage; + } + } + + // first pass, read all directory entries + $temp_files = array(); while (($file = readdir($handle)) !== FALSE) { // Do not include dot files and folders @@ -998,17 +1027,44 @@ function imce_scan_directory($dirname, $imce) { } $size = filesize($path); $date = filemtime($path); - $directory['files'][$file] = array( + $temp_files[$file] = array( 'name' => $file, 'size' => $size, 'width' => $width, 'height' => $height, 'date' => $date ); - $directory['dirsize'] += $size; } closedir($handle); + + // sort by (harcoded) date descending + uasort($temp_files, '_imce_dir_cmp'); + + // second pass, filter current page + $files_read = 0; + $files_skipped = $start; + foreach ($temp_files as $key => $value) { + // skip the files of the prev-pages + if ($files_skipped > 0) { + $files_skipped--; + continue; + } + + $directory['files'][$key] = $value; + $directory['dirsize'] += $value['size']; + // If we've read the files we wanted, skip the next part + if($imce_showperpage > 0 && ++$files_read >= $imce_showperpage) { + break; + } + } + + // If we couldn't skip enough, we don't have any files left. + // Return an empty list. + if($files_skipped > 0) { + return array(); + } + sort($directory['subdirectories']); return $directory; } @@ -1126,4 +1182,4 @@ function imce_file_register($file) { if (!db_query("SELECT 1 FROM {file_usage} WHERE module = 'imce' AND fid = :fid", array(':fid' => $file->fid))->fetchField()) { file_usage_add($file, 'imce', 'file', $file->fid); } -} \ No newline at end of file +} diff --git a/js/imce.js b/js/imce.js index 49cc156..9b32363 100644 --- a/js/imce.js +++ b/js/imce.js @@ -432,7 +432,7 @@ navUpdate: function(data, dir) { //set cache navCache: function (dir, newdir) { - var C = imce.cache[dir] = {'dir': dir, files: imce.el('file-list'), dirsize: imce.el('dir-size').innerHTML, perm: $.extend({}, imce.conf.perm)}; + var C = imce.cache[dir] = {'dir': dir, files: imce.el('file-list'), dirsize: imce.el('dir-size').innerHTML, dirpager: imce.el('dir-pager').innerHTML, perm: $.extend({}, imce.conf.perm)}; C.files.id = 'cached-list-'+ dir; imce.FW.appendChild(C.files); imce.invoke('cache', C, newdir); @@ -622,6 +622,7 @@ resData: function (data) { imce.fileRemove(removed[i]); } imce.conf.dirsize = data.dirsize; + imce.conf.dirpager = data.dirpager; imce.updateStat(); }, @@ -671,6 +672,7 @@ validateSelCount: function (Min, Max) { updateStat: function () { imce.el('file-count').innerHTML = imce.findex.length; imce.el('dir-size').innerHTML = imce.conf.dirsize; + imce.el('dir-pager').innerHTML = imce.conf.dirpager; }, //serialize selected files. return fids with a colon between them @@ -849,4 +851,4 @@ updateUI: function() { //initiate $(document).ready(imce.initiate); -})(jQuery); \ No newline at end of file +})(jQuery); diff --git a/js/imce_set_app.js b/js/imce_set_app.js index 419f7df..060a5ac 100644 --- a/js/imce_set_app.js +++ b/js/imce_set_app.js @@ -60,7 +60,9 @@ imce.hooks.load.push(function(win) { } } var filename = $('#'+ appFields.url, appWindow.document).val() || ''; - imce.highlight(filename.substr(filename.lastIndexOf('/')+1)); + if (typeof (filename) != 'undefined') { + imce.highlight(filename.substr(filename.lastIndexOf('/')+1)); + } } // Set send to sendtoFunc && imce.setSendTo(Drupal.t('Insert file'), sendtoFunc); @@ -94,4 +96,4 @@ var isFunc = function(str, scope) { return obj && i == len && (typeof obj == 'function' || typeof obj != 'string' && !obj.nodeName && obj.constructor != Array && /^[\s[]?function/.test(obj.toString())) ? obj : false; } -})(jQuery); \ No newline at end of file +})(jQuery); diff --git a/tpl/imce-content.tpl.php b/tpl/imce-content.tpl.php index 53a397c..cd75f27 100644 --- a/tpl/imce-content.tpl.php +++ b/tpl/imce-content.tpl.php @@ -87,11 +87,15 @@ $imce =& $imce_ref['imce'];//keep this line. $imce_ref)); /* see imce-file-list-tpl.php */?> -
+
+ ''. count($imce['files']) .'', '!dirsize' => ''. format_size($imce['dirsize']) .'', '!quota' => ''. ($imce['quota'] ? format_size($imce['quota']) : ($imce['tuquota'] ? format_size($imce['tuquota']) : t('unlimited quota'))) .'' )); ?> +
+
@@ -103,6 +107,8 @@ $imce =& $imce_ref['imce'];//keep this line. -
+
\ No newline at end of file +print $forms; ?>
+ + diff --git a/tpl/imce-pager.tpl.php b/tpl/imce-pager.tpl.php new file mode 100644 index 0000000..9df57a2 --- /dev/null +++ b/tpl/imce-pager.tpl.php @@ -0,0 +1,5 @@ + $pager['page'])); +print $pager['next']; +?>