Changeset 3763715
- Timestamp:
- 10/24/2026 08:32:32 PM (5 hours ago)
- Location:
- apex-folders
- Files:
-
- 20 edited
- 1 copied
-
tags/1.1.2 (copied) (copied from apex-folders/trunk )
-
tags/1.1.2/apex-folders.php (modified) (2 diffs)
-
tags/1.1.2/assets/css/apex-main.css (modified) (2 diffs)
-
tags/1.1.2/assets/js/apex-folders.js (modified) (3 diffs)
-
tags/1.1.2/assets/js/folder-counts.js (modified) (1 diff)
-
tags/1.1.2/assets/js/folder-drag-drop.js (modified) (1 diff)
-
tags/1.1.2/assets/js/folder-management.js (modified) (1 diff)
-
tags/1.1.2/includes/class-apex-folders-ui.php (modified) (3 diffs)
-
tags/1.1.2/includes/class-media-query.php (modified) (3 diffs)
-
tags/1.1.2/languages/apex-folders.pot (modified) (2 diffs)
-
tags/1.1.2/readme.txt (modified) (3 diffs)
-
trunk/apex-folders.php (modified) (2 diffs)
-
trunk/assets/css/apex-main.css (modified) (2 diffs)
-
trunk/assets/js/apex-folders.js (modified) (3 diffs)
-
trunk/assets/js/folder-counts.js (modified) (1 diff)
-
trunk/assets/js/folder-drag-drop.js (modified) (1 diff)
-
trunk/assets/js/folder-management.js (modified) (1 diff)
-
trunk/includes/class-apex-folders-ui.php (modified) (3 diffs)
-
trunk/includes/class-media-query.php (modified) (3 diffs)
-
trunk/languages/apex-folders.pot (modified) (2 diffs)
-
trunk/readme.txt (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
apex-folders/tags/1.1.2/apex-folders.php
r3740158 r3763715 12 12 * Plugin URI: https://apex.mountainairweb.com/ 13 13 * Description: Reach the apex of media library organization. 14 * Version: 1.1. 114 * Version: 1.1.2 15 15 * Author: Nick Murray 16 16 * Author URI: https://mountainairweb.com … … 29 29 define( 'APEX_FOLDERS_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); 30 30 define( 'APEX_FOLDERS_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); 31 define( 'APEX_FOLDERS_VERSION', '1.1. 1' );31 define( 'APEX_FOLDERS_VERSION', '1.1.2' ); 32 32 33 33 // Core includes. -
apex-folders/tags/1.1.2/assets/css/apex-main.css
r3740158 r3763715 235 235 } 236 236 237 /* Collapsible parent folders */ 238 .apexfo-toggle { 239 position: absolute; 240 top: 50%; 241 left: 2px; 242 z-index: 1; 243 display: inline-flex; 244 align-items: center; 245 justify-content: center; 246 width: 22px; 247 height: 22px; 248 padding: 0; 249 margin: 0; 250 transform: translateY(-50%); 251 color: var(--apexfo-faint); 252 background: transparent; 253 border: 0; 254 border-radius: 4px; 255 cursor: pointer; 256 } 257 258 .apexfo-toggle .dashicons { 259 font-size: 16px; 260 width: 16px; 261 height: 16px; 262 transform: rotate(90deg); 263 transition: transform 0.15s ease; 264 } 265 266 .apex-folder-list li.apexfo-collapsed .apexfo-toggle .dashicons { 267 transform: none; 268 } 269 270 .apexfo-toggle:hover, 271 .apexfo-toggle:focus { 272 color: var(--apexfo-ink); 273 background: var(--apexfo-cream); 274 outline: none; 275 } 276 277 .apexfo-toggle:focus-visible { 278 box-shadow: var(--apexfo-focus); 279 } 280 281 .apex-folder-list li.has-children > a { 282 padding-left: 26px; 283 } 284 285 .apex-folder-list li.child-folder.apexfo-hidden { 286 display: none; 287 } 288 237 289 /* Actions: rename, subfolder, delete. Shown on hover and keyboard focus. */ 238 290 .apexfo-actions { … … 597 649 } 598 650 651 /* The chip row has no room to fold; show every folder */ 652 .apex-mode-list .apexfo-toggle { 653 display: none; 654 } 655 656 .apex-mode-list .apex-folder-list li.has-children > a { 657 padding-left: 10px; 658 } 659 660 .apex-mode-list .apex-folder-list li.child-folder.apexfo-hidden { 661 display: flex; 662 } 663 599 664 .apex-mode-list .apexfo-actions { 600 665 position: static; -
apex-folders/tags/1.1.2/assets/js/apex-folders.js
r3740158 r3763715 32 32 33 33 /** 34 * Files in a folder, including its subfolders for a parent folder 35 */ 36 function getFolderTotal(folder) { 37 var total = parseInt(folder.count, 10) || 0; 38 39 _.each(folders, function(candidate) { 40 if (parseInt(candidate.parent, 10) === parseInt(folder.id, 10)) { 41 total += parseInt(candidate.count, 10) || 0; 42 } 43 }); 44 45 return total; 46 } 47 48 /** 49 * Whether a file in one folder belongs in the view of another: 50 * the same folder, or a parent folder of it 51 */ 52 function isInFolderView(attachmentFolderId, viewFolderId) { 53 if (attachmentFolderId === viewFolderId) { 54 return true; 55 } 56 57 var folder = _.find(folders, function(candidate) { 58 return parseInt(candidate.id, 10) === attachmentFolderId; 59 }); 60 61 return !!folder && parseInt(folder.parent, 10) === viewFolderId; 62 } 63 64 /** 34 65 * Text shown for a folder in the filter dropdown 35 66 */ 36 67 function getFolderLabel(folder) { 37 return (folder.parent ? '\u2014 ' : '') + folder.name + ' (' + folder.count+ ')';68 return (folder.parent ? '\u2014 ' : '') + folder.name + ' (' + getFolderTotal(folder) + ')'; 38 69 } 39 70 … … 68 99 69 100 folder.count = counts[folder.id].count; 101 }); 102 103 _.each(folders, function(folder) { 70 104 jQuery('select#media-attachment-folder-filter option[value="folder-' + folder.id + '"]').text(getFolderLabel(folder)); 71 105 }); … … 182 216 var folderId = getFolderId(this.props.get('apex_folder')); 183 217 184 if (folderId && attachment.has('apexFolder') && parseInt(attachment.get('apexFolder'), 10) !== folderId) {218 if (folderId && attachment.has('apexFolder') && !isInFolderView(parseInt(attachment.get('apexFolder'), 10), folderId)) { 185 219 return false; 186 220 } -
apex-folders/tags/1.1.2/assets/js/folder-counts.js
r3740158 r3763715 88 88 .replace('%2$d', total); 89 89 90 showCount($item, folderData.count, title, skipHighlight); 90 // A parent folder shows everything inside it, subfolders included 91 showCount($item, total === null ? folderData.count : total, title, skipHighlight); 91 92 }); 92 93 -
apex-folders/tags/1.1.2/assets/js/folder-drag-drop.js
r3740158 r3763715 254 254 // Highlight this folder 255 255 $folder.addClass('drag-over'); 256 257 // Open a folded parent so its subfolders can be dropped on too 258 if ($folder.hasClass('apexfo-collapsed')) { 259 $folder.find('.apexfo-toggle').trigger('click'); 260 } 256 261 }, 257 262 out: function(event, ui) { -
apex-folders/tags/1.1.2/assets/js/folder-management.js
r3740097 r3763715 73 73 } 74 74 75 /** 76 * Collapsible parent folders. The choice is remembered in this browser; 77 * the folder being viewed always starts open. 78 */ 79 var collapsedKey = 'apexfo_collapsed'; 80 var collapsed = {}; 81 82 try { 83 collapsed = JSON.parse(localStorage.getItem(collapsedKey)) || {}; 84 } catch (e) { 85 collapsed = {}; 86 } 87 88 function setExpanded($parent, expanded) { 89 var folderId = $parent.data('folder-id'); 90 91 $parent.toggleClass('apexfo-collapsed', !expanded); 92 $parent.find('.apexfo-toggle').attr('aria-expanded', expanded ? 'true' : 'false'); 93 $('.apex-folder-list li.child-folder[data-parent-id="' + folderId + '"]').toggleClass('apexfo-hidden', !expanded); 94 } 95 96 // Apply remembered choices, except where the current folder lives 97 $('.apex-folder-list li.parent-folder.has-children').each(function() { 98 var $parent = $(this); 99 var folderId = $parent.data('folder-id'); 100 var holdsCurrent = $parent.hasClass('current') || 101 $('.apex-folder-list li.child-folder.current[data-parent-id="' + folderId + '"]').length > 0; 102 103 if (!holdsCurrent && typeof collapsed[folderId] === 'boolean') { 104 setExpanded($parent, !collapsed[folderId]); 105 } 106 }); 107 108 $('.apex-folder-list').on('click', '.apexfo-toggle', function(e) { 109 e.preventDefault(); 110 e.stopPropagation(); 111 112 var $parent = $(this).closest('li'); 113 var expanded = $parent.hasClass('apexfo-collapsed'); 114 115 setExpanded($parent, expanded); 116 117 collapsed[$parent.data('folder-id')] = !expanded; 118 try { 119 localStorage.setItem(collapsedKey, JSON.stringify(collapsed)); 120 } catch (e) { 121 // Remembering the choice is a convenience only 122 } 123 }); 124 75 125 // Add subfolder handler 76 126 $('.add-subfolder').on('click', function(e) { -
apex-folders/tags/1.1.2/includes/class-apex-folders-ui.php
r3740158 r3763715 116 116 * @param int $parent_id Parent folder ID for subfolders. 117 117 * @param int $total Count including subfolders, for parent folders. 118 */ 119 private function render_folder_item( $folder, $current_folder, $classes, $parent_id = 0, $total = 0 ) { 118 * @param bool $expanded Whether a parent folder's subfolders are shown. 119 */ 120 private function render_folder_item( $folder, $current_folder, $classes, $parent_id = 0, $total = 0, $expanded = true ) { 120 121 $is_current = $current_folder === $folder->slug; 121 122 $url = wp_nonce_url( admin_url( 'upload.php?apex_folder=' . $folder->slug ), 'apex_folder_view' ); 122 123 $is_system = (int) $folder->term_id === (int) apex_folders_get_unassigned_id(); 124 $has_children = false !== strpos( $classes, 'has-children' ); 125 126 if ( $has_children && ! $expanded ) { 127 $classes .= ' apexfo-collapsed'; 128 } 123 129 124 130 echo '<li class="' . esc_attr( trim( ( $is_current ? 'current ' : '' ) . $classes ) ) . '" data-folder-id="' . intval( $folder->term_id ) . '"' . ( $parent_id ? ' data-parent-id="' . intval( $parent_id ) . '"' : '' ) . '>'; 131 132 // Parent folders fold their subfolders away 133 if ( $has_children ) { 134 echo '<button type="button" class="apexfo-toggle" data-folder-id="' . intval( $folder->term_id ) . '" aria-expanded="' . ( $expanded ? 'true' : 'false' ) . '" aria-label="' . esc_attr__( 'Show or hide subfolders', 'apex-folders' ) . '"><span class="dashicons dashicons-arrow-right-alt2"></span></button>'; 135 } 136 125 137 echo '<a href="' . esc_url( $url ) . '"' . ( $is_current ? ' aria-current="page"' : '' ) . '>'; 126 138 echo $this->icon( $is_system ? 'inbox' : 'folder' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Static SVG markup. … … 132 144 $count_title = sprintf( __( '%1$d in this folder, %2$d including subfolders', 'apex-folders' ), $folder->count, $total ); 133 145 } 134 echo '<span class="apexfo-count"' . ( $count_title ? ' title="' . esc_attr( $count_title ) . '"' : '' ) . '>' . intval( $folder->count ) . '</span>'; 146 // A parent folder shows everything inside it, subfolders included 147 echo '<span class="apexfo-count"' . ( $count_title ? ' title="' . esc_attr( $count_title ) . '"' : '' ) . '>' . intval( max( $total, $folder->count ) ) . '</span>'; 135 148 echo '</a>'; 136 149 … … 231 244 } 232 245 233 $this->render_folder_item( $folder, $current_folder, 'custom-folder parent-folder' . ( $has_children ? ' has-children' : '' ), 0, $total ); 246 // Subfolders start folded away, unless the folder being viewed is in this group. 247 // The visitor's own choice, remembered by the browser, is applied by JavaScript. 248 $expanded = $current_folder === $folder->slug; 249 if ( $has_children && ! $expanded ) { 250 foreach ( $child_folders[ $folder->term_id ] as $child ) { 251 if ( $current_folder === $child->slug ) { 252 $expanded = true; 253 } 254 } 255 } 256 257 $this->render_folder_item( $folder, $current_folder, 'custom-folder parent-folder' . ( $has_children ? ' has-children' : '' ), 0, $total, $expanded ); 234 258 235 259 // Display children if any 236 260 if ( $has_children ) { 237 261 foreach ( $child_folders[ $folder->term_id ] as $child ) { 238 $this->render_folder_item( $child, $current_folder, 'custom-folder child-folder' , $folder->term_id );262 $this->render_folder_item( $child, $current_folder, 'custom-folder child-folder' . ( $expanded ? '' : ' apexfo-hidden' ), $folder->term_id ); 239 263 } 240 264 } -
apex-folders/tags/1.1.2/includes/class-media-query.php
r3740097 r3763715 51 51 'field' => 'term_id', 52 52 'terms' => $term->term_id, 53 'include_children' => false,53 'include_children' => true, 54 54 'operator' => 'IN' // Explicitly set operator 55 55 ), … … 95 95 } 96 96 97 // Show only the folder's own files, the same as the list view does97 // A parent folder shows its own files and its subfolders' files 98 98 unset( $query['apex_folder'] ); 99 99 … … 106 106 'field' => 'term_id', 107 107 'terms' => array( (int) $term->term_id ), 108 'include_children' => false,108 'include_children' => true, 109 109 ); 110 110 -
apex-folders/tags/1.1.2/languages/apex-folders.pot
r3740158 r3763715 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: Apex Folders 1.1. 1\n"5 "Project-Id-Version: Apex Folders 1.1.2\n" 6 6 "Report-Msgid-Bugs-To: https://mountainairweb.com\n" 7 7 "MIME-Version: 1.0\n" … … 189 189 msgstr "" 190 190 191 #: includes/class-apex-folders-ui.php:134 192 msgid "Show or hide subfolders" 193 msgstr "" 194 191 195 #. translators: %1$d: files in this folder, %2$d: files including subfolders 192 #: includes/class-apex-folders-ui.php:1 32 includes/class-apex-folders-ui.php:320196 #: includes/class-apex-folders-ui.php:144 includes/class-apex-folders-ui.php:344 193 197 msgid "%1$d in this folder, %2$d including subfolders" 194 198 msgstr "" 195 199 196 #: includes/class-apex-folders-ui.php:1 40 includes/class-apex-folders-ui.php:140200 #: includes/class-apex-folders-ui.php:153 includes/class-apex-folders-ui.php:153 197 201 msgid "Add subfolder" 198 202 msgstr "" 199 203 200 #: includes/class-apex-folders-ui.php:1 42 includes/class-apex-folders-ui.php:142204 #: includes/class-apex-folders-ui.php:155 includes/class-apex-folders-ui.php:155 201 205 msgid "Rename folder" 202 206 msgstr "" 203 207 204 #: includes/class-apex-folders-ui.php:1 43 includes/class-apex-folders-ui.php:143208 #: includes/class-apex-folders-ui.php:156 includes/class-apex-folders-ui.php:156 205 209 msgid "Delete folder" 206 210 msgstr "" 207 211 208 #: includes/class-apex-folders-ui.php: 197212 #: includes/class-apex-folders-ui.php:210 209 213 msgid "Apex Folders" 210 214 msgstr "" 211 215 212 #: includes/class-apex-folders-ui.php:2 06216 #: includes/class-apex-folders-ui.php:219 213 217 msgid "All files" 214 218 msgstr "" 215 219 216 #: includes/class-apex-folders-ui.php:2 16includes/class-apex-folders-utilities.php:33220 #: includes/class-apex-folders-ui.php:229 includes/class-apex-folders-utilities.php:33 217 221 msgid "Folders" 218 222 msgstr "" 219 223 220 #: includes/class-apex-folders-ui.php:2 19224 #: includes/class-apex-folders-ui.php:232 221 225 msgid "No folders yet. Add one below, then drag files onto it." 222 226 msgstr "" 223 227 224 #: includes/class-apex-folders-ui.php:2 45228 #: includes/class-apex-folders-ui.php:269 225 229 msgid "Add folder" 226 230 msgstr "" 227 231 228 #: includes/class-apex-folders-ui.php:2 47232 #: includes/class-apex-folders-ui.php:271 229 233 msgid "Drag a file onto a folder to move it. Use Bulk select to move several at once." 230 234 msgstr "" 231 235 232 #: includes/class-apex-folders-ui.php:2 51236 #: includes/class-apex-folders-ui.php:275 233 237 msgid "is a free tool from Apex by Mountain Air Web." 234 238 msgstr "" 235 239 236 #: includes/class-apex-folders-ui.php:2 52240 #: includes/class-apex-folders-ui.php:276 237 241 msgid "Meet the other Apex tools" 238 242 msgstr "" 239 243 240 #: includes/class-apex-folders-ui.php: 297244 #: includes/class-apex-folders-ui.php:321 241 245 msgid "Create New Folder" 242 246 msgstr "" 243 247 244 #: includes/class-apex-folders-ui.php: 298248 #: includes/class-apex-folders-ui.php:322 245 249 msgid "Create Folder" 246 250 msgstr "" 247 251 248 #: includes/class-apex-folders-ui.php: 299252 #: includes/class-apex-folders-ui.php:323 249 253 msgid "Folder Name:" 250 254 msgstr "" 251 255 252 #: includes/class-apex-folders-ui.php:3 00256 #: includes/class-apex-folders-ui.php:324 253 257 msgid "Parent Folder (optional):" 254 258 msgstr "" 255 259 256 #: includes/class-apex-folders-ui.php:3 01260 #: includes/class-apex-folders-ui.php:325 257 261 msgid "None (top level)" 258 262 msgstr "" 259 263 260 #: includes/class-apex-folders-ui.php:3 02264 #: includes/class-apex-folders-ui.php:326 261 265 msgid "Create New Subfolder" 262 266 msgstr "" 263 267 264 #: includes/class-apex-folders-ui.php:3 03268 #: includes/class-apex-folders-ui.php:327 265 269 msgid "Create Subfolder" 266 270 msgstr "" 267 271 268 #: includes/class-apex-folders-ui.php:3 04272 #: includes/class-apex-folders-ui.php:328 269 273 msgid "Subfolder Name:" 270 274 msgstr "" 271 275 272 #: includes/class-apex-folders-ui.php:3 05276 #: includes/class-apex-folders-ui.php:329 273 277 msgid "Parent folder:" 274 278 msgstr "" 275 279 276 #: includes/class-apex-folders-ui.php:3 06280 #: includes/class-apex-folders-ui.php:330 277 281 msgid "Rename Folder" 278 282 msgstr "" 279 283 280 #: includes/class-apex-folders-ui.php:3 07284 #: includes/class-apex-folders-ui.php:331 281 285 msgid "New Name:" 282 286 msgstr "" 283 287 284 #: includes/class-apex-folders-ui.php:3 08288 #: includes/class-apex-folders-ui.php:332 285 289 msgid "Cancel" 286 290 msgstr "" 287 291 288 #: includes/class-apex-folders-ui.php:3 09292 #: includes/class-apex-folders-ui.php:333 289 293 msgid "Save" 290 294 msgstr "" 291 295 292 296 #. translators: %s: folder name 293 #: includes/class-apex-folders-ui.php:3 11297 #: includes/class-apex-folders-ui.php:335 294 298 msgid "Are you sure you want to delete the folder \"%s\"?" 295 299 msgstr "" 296 300 297 301 #. translators: %s: folder name 298 #: includes/class-apex-folders-ui.php:3 12302 #: includes/class-apex-folders-ui.php:336 299 303 msgid "Files in this folder will be moved to the Unassigned folder." 300 304 msgstr "" 301 305 302 306 #. translators: %s: folder name 303 #: includes/class-apex-folders-ui.php:3 13307 #: includes/class-apex-folders-ui.php:337 304 308 msgid "Error creating folder:" 305 309 msgstr "" 306 310 307 311 #. translators: %s: folder name 308 #: includes/class-apex-folders-ui.php:3 14312 #: includes/class-apex-folders-ui.php:338 309 313 msgid "Error creating subfolder:" 310 314 msgstr "" 311 315 312 316 #. translators: %s: folder name 313 #: includes/class-apex-folders-ui.php:3 15317 #: includes/class-apex-folders-ui.php:339 314 318 msgid "Error renaming folder:" 315 319 msgstr "" 316 320 317 #: includes/class-apex-folders-ui.php:3 16321 #: includes/class-apex-folders-ui.php:340 318 322 msgid "Error deleting folder:" 319 323 msgstr "" 320 324 321 #: includes/class-apex-folders-ui.php:3 17325 #: includes/class-apex-folders-ui.php:341 322 326 msgid "Unknown error" 323 327 msgstr "" 324 328 325 #: includes/class-apex-folders-ui.php:3 18329 #: includes/class-apex-folders-ui.php:342 326 330 msgid "Network error. Please try again." 327 331 msgstr "" 328 332 329 333 #. translators: %1$d: folder's own file count, %2$d: total file count including subfolders 330 #: includes/class-apex-folders-ui.php:4 02334 #: includes/class-apex-folders-ui.php:426 331 335 msgid "%1$d / %2$d total" 332 336 msgstr "" 333 337 334 #: includes/class-apex-folders-ui.php:4 39338 #: includes/class-apex-folders-ui.php:463 335 339 msgid "Folder" 336 340 msgstr "" 337 341 338 #: includes/class-apex-folders-ui.php:4 42342 #: includes/class-apex-folders-ui.php:466 339 343 msgid "Select a folder for this media item" 340 344 msgstr "" -
apex-folders/tags/1.1.2/readme.txt
r3740158 r3763715 4 4 Requires at least: 5.3 5 5 Tested up to: 7.1 6 Stable tag: 1.1. 16 Stable tag: 1.1.2 7 7 Requires PHP: 7.2 8 8 License: GPLv2 or later … … 86 86 == Changelog == 87 87 88 = 1.1.2 = 89 * Parent folders now show their subfolders' files too, in the Media Library and in the editor's media picker, and their counts include subfolders. 90 * Parent folders can be collapsed. The folder you are viewing always starts open, and your choice is remembered. 91 * Hovering a collapsed folder while dragging opens it, so you can drop onto a subfolder. 92 88 93 = 1.1.1 = 89 94 * New look: the folder sidebar, uploader and filters follow the Apex design, with folder icons, count badges and hover actions. … … 109 114 110 115 == Upgrade Notice == 116 117 = 1.1.2 = 118 Parent folders include their subfolders' files and counts, and can be collapsed. 111 119 112 120 = 1.1.1 = -
apex-folders/trunk/apex-folders.php
r3740158 r3763715 12 12 * Plugin URI: https://apex.mountainairweb.com/ 13 13 * Description: Reach the apex of media library organization. 14 * Version: 1.1. 114 * Version: 1.1.2 15 15 * Author: Nick Murray 16 16 * Author URI: https://mountainairweb.com … … 29 29 define( 'APEX_FOLDERS_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); 30 30 define( 'APEX_FOLDERS_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); 31 define( 'APEX_FOLDERS_VERSION', '1.1. 1' );31 define( 'APEX_FOLDERS_VERSION', '1.1.2' ); 32 32 33 33 // Core includes. -
apex-folders/trunk/assets/css/apex-main.css
r3740158 r3763715 235 235 } 236 236 237 /* Collapsible parent folders */ 238 .apexfo-toggle { 239 position: absolute; 240 top: 50%; 241 left: 2px; 242 z-index: 1; 243 display: inline-flex; 244 align-items: center; 245 justify-content: center; 246 width: 22px; 247 height: 22px; 248 padding: 0; 249 margin: 0; 250 transform: translateY(-50%); 251 color: var(--apexfo-faint); 252 background: transparent; 253 border: 0; 254 border-radius: 4px; 255 cursor: pointer; 256 } 257 258 .apexfo-toggle .dashicons { 259 font-size: 16px; 260 width: 16px; 261 height: 16px; 262 transform: rotate(90deg); 263 transition: transform 0.15s ease; 264 } 265 266 .apex-folder-list li.apexfo-collapsed .apexfo-toggle .dashicons { 267 transform: none; 268 } 269 270 .apexfo-toggle:hover, 271 .apexfo-toggle:focus { 272 color: var(--apexfo-ink); 273 background: var(--apexfo-cream); 274 outline: none; 275 } 276 277 .apexfo-toggle:focus-visible { 278 box-shadow: var(--apexfo-focus); 279 } 280 281 .apex-folder-list li.has-children > a { 282 padding-left: 26px; 283 } 284 285 .apex-folder-list li.child-folder.apexfo-hidden { 286 display: none; 287 } 288 237 289 /* Actions: rename, subfolder, delete. Shown on hover and keyboard focus. */ 238 290 .apexfo-actions { … … 597 649 } 598 650 651 /* The chip row has no room to fold; show every folder */ 652 .apex-mode-list .apexfo-toggle { 653 display: none; 654 } 655 656 .apex-mode-list .apex-folder-list li.has-children > a { 657 padding-left: 10px; 658 } 659 660 .apex-mode-list .apex-folder-list li.child-folder.apexfo-hidden { 661 display: flex; 662 } 663 599 664 .apex-mode-list .apexfo-actions { 600 665 position: static; -
apex-folders/trunk/assets/js/apex-folders.js
r3740158 r3763715 32 32 33 33 /** 34 * Files in a folder, including its subfolders for a parent folder 35 */ 36 function getFolderTotal(folder) { 37 var total = parseInt(folder.count, 10) || 0; 38 39 _.each(folders, function(candidate) { 40 if (parseInt(candidate.parent, 10) === parseInt(folder.id, 10)) { 41 total += parseInt(candidate.count, 10) || 0; 42 } 43 }); 44 45 return total; 46 } 47 48 /** 49 * Whether a file in one folder belongs in the view of another: 50 * the same folder, or a parent folder of it 51 */ 52 function isInFolderView(attachmentFolderId, viewFolderId) { 53 if (attachmentFolderId === viewFolderId) { 54 return true; 55 } 56 57 var folder = _.find(folders, function(candidate) { 58 return parseInt(candidate.id, 10) === attachmentFolderId; 59 }); 60 61 return !!folder && parseInt(folder.parent, 10) === viewFolderId; 62 } 63 64 /** 34 65 * Text shown for a folder in the filter dropdown 35 66 */ 36 67 function getFolderLabel(folder) { 37 return (folder.parent ? '\u2014 ' : '') + folder.name + ' (' + folder.count+ ')';68 return (folder.parent ? '\u2014 ' : '') + folder.name + ' (' + getFolderTotal(folder) + ')'; 38 69 } 39 70 … … 68 99 69 100 folder.count = counts[folder.id].count; 101 }); 102 103 _.each(folders, function(folder) { 70 104 jQuery('select#media-attachment-folder-filter option[value="folder-' + folder.id + '"]').text(getFolderLabel(folder)); 71 105 }); … … 182 216 var folderId = getFolderId(this.props.get('apex_folder')); 183 217 184 if (folderId && attachment.has('apexFolder') && parseInt(attachment.get('apexFolder'), 10) !== folderId) {218 if (folderId && attachment.has('apexFolder') && !isInFolderView(parseInt(attachment.get('apexFolder'), 10), folderId)) { 185 219 return false; 186 220 } -
apex-folders/trunk/assets/js/folder-counts.js
r3740158 r3763715 88 88 .replace('%2$d', total); 89 89 90 showCount($item, folderData.count, title, skipHighlight); 90 // A parent folder shows everything inside it, subfolders included 91 showCount($item, total === null ? folderData.count : total, title, skipHighlight); 91 92 }); 92 93 -
apex-folders/trunk/assets/js/folder-drag-drop.js
r3740158 r3763715 254 254 // Highlight this folder 255 255 $folder.addClass('drag-over'); 256 257 // Open a folded parent so its subfolders can be dropped on too 258 if ($folder.hasClass('apexfo-collapsed')) { 259 $folder.find('.apexfo-toggle').trigger('click'); 260 } 256 261 }, 257 262 out: function(event, ui) { -
apex-folders/trunk/assets/js/folder-management.js
r3740097 r3763715 73 73 } 74 74 75 /** 76 * Collapsible parent folders. The choice is remembered in this browser; 77 * the folder being viewed always starts open. 78 */ 79 var collapsedKey = 'apexfo_collapsed'; 80 var collapsed = {}; 81 82 try { 83 collapsed = JSON.parse(localStorage.getItem(collapsedKey)) || {}; 84 } catch (e) { 85 collapsed = {}; 86 } 87 88 function setExpanded($parent, expanded) { 89 var folderId = $parent.data('folder-id'); 90 91 $parent.toggleClass('apexfo-collapsed', !expanded); 92 $parent.find('.apexfo-toggle').attr('aria-expanded', expanded ? 'true' : 'false'); 93 $('.apex-folder-list li.child-folder[data-parent-id="' + folderId + '"]').toggleClass('apexfo-hidden', !expanded); 94 } 95 96 // Apply remembered choices, except where the current folder lives 97 $('.apex-folder-list li.parent-folder.has-children').each(function() { 98 var $parent = $(this); 99 var folderId = $parent.data('folder-id'); 100 var holdsCurrent = $parent.hasClass('current') || 101 $('.apex-folder-list li.child-folder.current[data-parent-id="' + folderId + '"]').length > 0; 102 103 if (!holdsCurrent && typeof collapsed[folderId] === 'boolean') { 104 setExpanded($parent, !collapsed[folderId]); 105 } 106 }); 107 108 $('.apex-folder-list').on('click', '.apexfo-toggle', function(e) { 109 e.preventDefault(); 110 e.stopPropagation(); 111 112 var $parent = $(this).closest('li'); 113 var expanded = $parent.hasClass('apexfo-collapsed'); 114 115 setExpanded($parent, expanded); 116 117 collapsed[$parent.data('folder-id')] = !expanded; 118 try { 119 localStorage.setItem(collapsedKey, JSON.stringify(collapsed)); 120 } catch (e) { 121 // Remembering the choice is a convenience only 122 } 123 }); 124 75 125 // Add subfolder handler 76 126 $('.add-subfolder').on('click', function(e) { -
apex-folders/trunk/includes/class-apex-folders-ui.php
r3740158 r3763715 116 116 * @param int $parent_id Parent folder ID for subfolders. 117 117 * @param int $total Count including subfolders, for parent folders. 118 */ 119 private function render_folder_item( $folder, $current_folder, $classes, $parent_id = 0, $total = 0 ) { 118 * @param bool $expanded Whether a parent folder's subfolders are shown. 119 */ 120 private function render_folder_item( $folder, $current_folder, $classes, $parent_id = 0, $total = 0, $expanded = true ) { 120 121 $is_current = $current_folder === $folder->slug; 121 122 $url = wp_nonce_url( admin_url( 'upload.php?apex_folder=' . $folder->slug ), 'apex_folder_view' ); 122 123 $is_system = (int) $folder->term_id === (int) apex_folders_get_unassigned_id(); 124 $has_children = false !== strpos( $classes, 'has-children' ); 125 126 if ( $has_children && ! $expanded ) { 127 $classes .= ' apexfo-collapsed'; 128 } 123 129 124 130 echo '<li class="' . esc_attr( trim( ( $is_current ? 'current ' : '' ) . $classes ) ) . '" data-folder-id="' . intval( $folder->term_id ) . '"' . ( $parent_id ? ' data-parent-id="' . intval( $parent_id ) . '"' : '' ) . '>'; 131 132 // Parent folders fold their subfolders away 133 if ( $has_children ) { 134 echo '<button type="button" class="apexfo-toggle" data-folder-id="' . intval( $folder->term_id ) . '" aria-expanded="' . ( $expanded ? 'true' : 'false' ) . '" aria-label="' . esc_attr__( 'Show or hide subfolders', 'apex-folders' ) . '"><span class="dashicons dashicons-arrow-right-alt2"></span></button>'; 135 } 136 125 137 echo '<a href="' . esc_url( $url ) . '"' . ( $is_current ? ' aria-current="page"' : '' ) . '>'; 126 138 echo $this->icon( $is_system ? 'inbox' : 'folder' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Static SVG markup. … … 132 144 $count_title = sprintf( __( '%1$d in this folder, %2$d including subfolders', 'apex-folders' ), $folder->count, $total ); 133 145 } 134 echo '<span class="apexfo-count"' . ( $count_title ? ' title="' . esc_attr( $count_title ) . '"' : '' ) . '>' . intval( $folder->count ) . '</span>'; 146 // A parent folder shows everything inside it, subfolders included 147 echo '<span class="apexfo-count"' . ( $count_title ? ' title="' . esc_attr( $count_title ) . '"' : '' ) . '>' . intval( max( $total, $folder->count ) ) . '</span>'; 135 148 echo '</a>'; 136 149 … … 231 244 } 232 245 233 $this->render_folder_item( $folder, $current_folder, 'custom-folder parent-folder' . ( $has_children ? ' has-children' : '' ), 0, $total ); 246 // Subfolders start folded away, unless the folder being viewed is in this group. 247 // The visitor's own choice, remembered by the browser, is applied by JavaScript. 248 $expanded = $current_folder === $folder->slug; 249 if ( $has_children && ! $expanded ) { 250 foreach ( $child_folders[ $folder->term_id ] as $child ) { 251 if ( $current_folder === $child->slug ) { 252 $expanded = true; 253 } 254 } 255 } 256 257 $this->render_folder_item( $folder, $current_folder, 'custom-folder parent-folder' . ( $has_children ? ' has-children' : '' ), 0, $total, $expanded ); 234 258 235 259 // Display children if any 236 260 if ( $has_children ) { 237 261 foreach ( $child_folders[ $folder->term_id ] as $child ) { 238 $this->render_folder_item( $child, $current_folder, 'custom-folder child-folder' , $folder->term_id );262 $this->render_folder_item( $child, $current_folder, 'custom-folder child-folder' . ( $expanded ? '' : ' apexfo-hidden' ), $folder->term_id ); 239 263 } 240 264 } -
apex-folders/trunk/includes/class-media-query.php
r3740097 r3763715 51 51 'field' => 'term_id', 52 52 'terms' => $term->term_id, 53 'include_children' => false,53 'include_children' => true, 54 54 'operator' => 'IN' // Explicitly set operator 55 55 ), … … 95 95 } 96 96 97 // Show only the folder's own files, the same as the list view does97 // A parent folder shows its own files and its subfolders' files 98 98 unset( $query['apex_folder'] ); 99 99 … … 106 106 'field' => 'term_id', 107 107 'terms' => array( (int) $term->term_id ), 108 'include_children' => false,108 'include_children' => true, 109 109 ); 110 110 -
apex-folders/trunk/languages/apex-folders.pot
r3740158 r3763715 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: Apex Folders 1.1. 1\n"5 "Project-Id-Version: Apex Folders 1.1.2\n" 6 6 "Report-Msgid-Bugs-To: https://mountainairweb.com\n" 7 7 "MIME-Version: 1.0\n" … … 189 189 msgstr "" 190 190 191 #: includes/class-apex-folders-ui.php:134 192 msgid "Show or hide subfolders" 193 msgstr "" 194 191 195 #. translators: %1$d: files in this folder, %2$d: files including subfolders 192 #: includes/class-apex-folders-ui.php:1 32 includes/class-apex-folders-ui.php:320196 #: includes/class-apex-folders-ui.php:144 includes/class-apex-folders-ui.php:344 193 197 msgid "%1$d in this folder, %2$d including subfolders" 194 198 msgstr "" 195 199 196 #: includes/class-apex-folders-ui.php:1 40 includes/class-apex-folders-ui.php:140200 #: includes/class-apex-folders-ui.php:153 includes/class-apex-folders-ui.php:153 197 201 msgid "Add subfolder" 198 202 msgstr "" 199 203 200 #: includes/class-apex-folders-ui.php:1 42 includes/class-apex-folders-ui.php:142204 #: includes/class-apex-folders-ui.php:155 includes/class-apex-folders-ui.php:155 201 205 msgid "Rename folder" 202 206 msgstr "" 203 207 204 #: includes/class-apex-folders-ui.php:1 43 includes/class-apex-folders-ui.php:143208 #: includes/class-apex-folders-ui.php:156 includes/class-apex-folders-ui.php:156 205 209 msgid "Delete folder" 206 210 msgstr "" 207 211 208 #: includes/class-apex-folders-ui.php: 197212 #: includes/class-apex-folders-ui.php:210 209 213 msgid "Apex Folders" 210 214 msgstr "" 211 215 212 #: includes/class-apex-folders-ui.php:2 06216 #: includes/class-apex-folders-ui.php:219 213 217 msgid "All files" 214 218 msgstr "" 215 219 216 #: includes/class-apex-folders-ui.php:2 16includes/class-apex-folders-utilities.php:33220 #: includes/class-apex-folders-ui.php:229 includes/class-apex-folders-utilities.php:33 217 221 msgid "Folders" 218 222 msgstr "" 219 223 220 #: includes/class-apex-folders-ui.php:2 19224 #: includes/class-apex-folders-ui.php:232 221 225 msgid "No folders yet. Add one below, then drag files onto it." 222 226 msgstr "" 223 227 224 #: includes/class-apex-folders-ui.php:2 45228 #: includes/class-apex-folders-ui.php:269 225 229 msgid "Add folder" 226 230 msgstr "" 227 231 228 #: includes/class-apex-folders-ui.php:2 47232 #: includes/class-apex-folders-ui.php:271 229 233 msgid "Drag a file onto a folder to move it. Use Bulk select to move several at once." 230 234 msgstr "" 231 235 232 #: includes/class-apex-folders-ui.php:2 51236 #: includes/class-apex-folders-ui.php:275 233 237 msgid "is a free tool from Apex by Mountain Air Web." 234 238 msgstr "" 235 239 236 #: includes/class-apex-folders-ui.php:2 52240 #: includes/class-apex-folders-ui.php:276 237 241 msgid "Meet the other Apex tools" 238 242 msgstr "" 239 243 240 #: includes/class-apex-folders-ui.php: 297244 #: includes/class-apex-folders-ui.php:321 241 245 msgid "Create New Folder" 242 246 msgstr "" 243 247 244 #: includes/class-apex-folders-ui.php: 298248 #: includes/class-apex-folders-ui.php:322 245 249 msgid "Create Folder" 246 250 msgstr "" 247 251 248 #: includes/class-apex-folders-ui.php: 299252 #: includes/class-apex-folders-ui.php:323 249 253 msgid "Folder Name:" 250 254 msgstr "" 251 255 252 #: includes/class-apex-folders-ui.php:3 00256 #: includes/class-apex-folders-ui.php:324 253 257 msgid "Parent Folder (optional):" 254 258 msgstr "" 255 259 256 #: includes/class-apex-folders-ui.php:3 01260 #: includes/class-apex-folders-ui.php:325 257 261 msgid "None (top level)" 258 262 msgstr "" 259 263 260 #: includes/class-apex-folders-ui.php:3 02264 #: includes/class-apex-folders-ui.php:326 261 265 msgid "Create New Subfolder" 262 266 msgstr "" 263 267 264 #: includes/class-apex-folders-ui.php:3 03268 #: includes/class-apex-folders-ui.php:327 265 269 msgid "Create Subfolder" 266 270 msgstr "" 267 271 268 #: includes/class-apex-folders-ui.php:3 04272 #: includes/class-apex-folders-ui.php:328 269 273 msgid "Subfolder Name:" 270 274 msgstr "" 271 275 272 #: includes/class-apex-folders-ui.php:3 05276 #: includes/class-apex-folders-ui.php:329 273 277 msgid "Parent folder:" 274 278 msgstr "" 275 279 276 #: includes/class-apex-folders-ui.php:3 06280 #: includes/class-apex-folders-ui.php:330 277 281 msgid "Rename Folder" 278 282 msgstr "" 279 283 280 #: includes/class-apex-folders-ui.php:3 07284 #: includes/class-apex-folders-ui.php:331 281 285 msgid "New Name:" 282 286 msgstr "" 283 287 284 #: includes/class-apex-folders-ui.php:3 08288 #: includes/class-apex-folders-ui.php:332 285 289 msgid "Cancel" 286 290 msgstr "" 287 291 288 #: includes/class-apex-folders-ui.php:3 09292 #: includes/class-apex-folders-ui.php:333 289 293 msgid "Save" 290 294 msgstr "" 291 295 292 296 #. translators: %s: folder name 293 #: includes/class-apex-folders-ui.php:3 11297 #: includes/class-apex-folders-ui.php:335 294 298 msgid "Are you sure you want to delete the folder \"%s\"?" 295 299 msgstr "" 296 300 297 301 #. translators: %s: folder name 298 #: includes/class-apex-folders-ui.php:3 12302 #: includes/class-apex-folders-ui.php:336 299 303 msgid "Files in this folder will be moved to the Unassigned folder." 300 304 msgstr "" 301 305 302 306 #. translators: %s: folder name 303 #: includes/class-apex-folders-ui.php:3 13307 #: includes/class-apex-folders-ui.php:337 304 308 msgid "Error creating folder:" 305 309 msgstr "" 306 310 307 311 #. translators: %s: folder name 308 #: includes/class-apex-folders-ui.php:3 14312 #: includes/class-apex-folders-ui.php:338 309 313 msgid "Error creating subfolder:" 310 314 msgstr "" 311 315 312 316 #. translators: %s: folder name 313 #: includes/class-apex-folders-ui.php:3 15317 #: includes/class-apex-folders-ui.php:339 314 318 msgid "Error renaming folder:" 315 319 msgstr "" 316 320 317 #: includes/class-apex-folders-ui.php:3 16321 #: includes/class-apex-folders-ui.php:340 318 322 msgid "Error deleting folder:" 319 323 msgstr "" 320 324 321 #: includes/class-apex-folders-ui.php:3 17325 #: includes/class-apex-folders-ui.php:341 322 326 msgid "Unknown error" 323 327 msgstr "" 324 328 325 #: includes/class-apex-folders-ui.php:3 18329 #: includes/class-apex-folders-ui.php:342 326 330 msgid "Network error. Please try again." 327 331 msgstr "" 328 332 329 333 #. translators: %1$d: folder's own file count, %2$d: total file count including subfolders 330 #: includes/class-apex-folders-ui.php:4 02334 #: includes/class-apex-folders-ui.php:426 331 335 msgid "%1$d / %2$d total" 332 336 msgstr "" 333 337 334 #: includes/class-apex-folders-ui.php:4 39338 #: includes/class-apex-folders-ui.php:463 335 339 msgid "Folder" 336 340 msgstr "" 337 341 338 #: includes/class-apex-folders-ui.php:4 42342 #: includes/class-apex-folders-ui.php:466 339 343 msgid "Select a folder for this media item" 340 344 msgstr "" -
apex-folders/trunk/readme.txt
r3740158 r3763715 4 4 Requires at least: 5.3 5 5 Tested up to: 7.1 6 Stable tag: 1.1. 16 Stable tag: 1.1.2 7 7 Requires PHP: 7.2 8 8 License: GPLv2 or later … … 86 86 == Changelog == 87 87 88 = 1.1.2 = 89 * Parent folders now show their subfolders' files too, in the Media Library and in the editor's media picker, and their counts include subfolders. 90 * Parent folders can be collapsed. The folder you are viewing always starts open, and your choice is remembered. 91 * Hovering a collapsed folder while dragging opens it, so you can drop onto a subfolder. 92 88 93 = 1.1.1 = 89 94 * New look: the folder sidebar, uploader and filters follow the Apex design, with folder icons, count badges and hover actions. … … 109 114 110 115 == Upgrade Notice == 116 117 = 1.1.2 = 118 Parent folders include their subfolders' files and counts, and can be collapsed. 111 119 112 120 = 1.1.1 =
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)