From bc9d7e67a896b93f6b6986da3a2e69d8abee75ea Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Sun, 11 Oct 2026 17:57:36 +0200 Subject: [PATCH] Rebuild File Manager's non-Bootstrap interface on the core widgets --- filemin/filemin-lib.pl | 617 +++++++++++++---- filemin/images/icons/quick/acls.png | Bin 1182 -> 0 bytes filemin/images/icons/quick/bookmark-new.png | Bin 466 -> 0 bytes filemin/images/icons/quick/browse.png | Bin 944 -> 0 bytes filemin/images/icons/quick/chattr.png | Bin 734 -> 0 bytes filemin/images/icons/quick/chcon.png | Bin 631 -> 0 bytes filemin/images/icons/quick/chmod.png | Bin 956 -> 0 bytes filemin/images/icons/quick/chown.png | Bin 788 -> 0 bytes filemin/images/icons/quick/compress.png | Bin 738 -> 0 bytes filemin/images/icons/quick/document-new.png | Bin 529 -> 0 bytes filemin/images/icons/quick/drive-harddisk.png | Bin 864 -> 0 bytes filemin/images/icons/quick/edit-copy.png | Bin 589 -> 0 bytes filemin/images/icons/quick/edit-cut.png | Bin 981 -> 0 bytes filemin/images/icons/quick/edit-find.png | Bin 884 -> 0 bytes filemin/images/icons/quick/edit-paste.png | Bin 608 -> 0 bytes filemin/images/icons/quick/edit.png | Bin 702 -> 0 bytes filemin/images/icons/quick/extract.png | Bin 660 -> 0 bytes filemin/images/icons/quick/folder-new.png | Bin 557 -> 0 bytes filemin/images/icons/quick/from-url.png | Bin 1470 -> 0 bytes filemin/images/icons/quick/go-down.png | Bin 537 -> 0 bytes filemin/images/icons/quick/go-next.png | Bin 522 -> 0 bytes filemin/images/icons/quick/invert.png | Bin 356 -> 0 bytes filemin/images/icons/quick/remove.png | Bin 838 -> 0 bytes filemin/images/icons/quick/rename.png | Bin 736 -> 0 bytes filemin/images/icons/quick/select-all.png | Bin 294 -> 0 bytes filemin/images/icons/quick/upload.png | Bin 754 -> 0 bytes filemin/search.cgi | 1 - filemin/unauthenticated/css/plain.css | 85 +++ filemin/unauthenticated/dropdown/fg.menu.css | 114 --- filemin/unauthenticated/dropdown/fg.menu.js | 648 ------------------ .../jquery/images/ui-icons_444444_256x240.png | Bin 7090 -> 0 bytes .../jquery/images/ui-icons_555555_256x240.png | Bin 7074 -> 0 bytes .../jquery/images/ui-icons_777620_256x240.png | Bin 4618 -> 0 bytes .../jquery/images/ui-icons_777777_256x240.png | Bin 7111 -> 0 bytes .../jquery/images/ui-icons_cc0000_256x240.png | Bin 4618 -> 0 bytes .../jquery/images/ui-icons_ffffff_256x240.png | Bin 6487 -> 0 bytes .../unauthenticated/jquery/jquery-ui.min.css | 7 - .../unauthenticated/jquery/jquery-ui.min.js | 6 - filemin/unauthenticated/jquery/jquery.min.js | 2 - filemin/unauthenticated/js/legacy.js | 475 ------------- filemin/unauthenticated/js/plain.js | 183 +++++ .../templates/legacy_dialogs.html | 246 ------- .../templates/legacy_quicks.html | 29 - filemin/unauthenticated/templates/quicks.html | 67 -- 44 files changed, 764 insertions(+), 1716 deletions(-) delete mode 100644 filemin/images/icons/quick/acls.png delete mode 100644 filemin/images/icons/quick/bookmark-new.png delete mode 100644 filemin/images/icons/quick/browse.png delete mode 100644 filemin/images/icons/quick/chattr.png delete mode 100644 filemin/images/icons/quick/chcon.png delete mode 100644 filemin/images/icons/quick/chmod.png delete mode 100644 filemin/images/icons/quick/chown.png delete mode 100644 filemin/images/icons/quick/compress.png delete mode 100644 filemin/images/icons/quick/document-new.png delete mode 100644 filemin/images/icons/quick/drive-harddisk.png delete mode 100644 filemin/images/icons/quick/edit-copy.png delete mode 100644 filemin/images/icons/quick/edit-cut.png delete mode 100644 filemin/images/icons/quick/edit-find.png delete mode 100644 filemin/images/icons/quick/edit-paste.png delete mode 100644 filemin/images/icons/quick/edit.png delete mode 100644 filemin/images/icons/quick/extract.png delete mode 100644 filemin/images/icons/quick/folder-new.png delete mode 100644 filemin/images/icons/quick/from-url.png delete mode 100644 filemin/images/icons/quick/go-down.png delete mode 100644 filemin/images/icons/quick/go-next.png delete mode 100644 filemin/images/icons/quick/invert.png delete mode 100644 filemin/images/icons/quick/remove.png delete mode 100644 filemin/images/icons/quick/rename.png delete mode 100644 filemin/images/icons/quick/select-all.png delete mode 100644 filemin/images/icons/quick/upload.png create mode 100644 filemin/unauthenticated/css/plain.css delete mode 100644 filemin/unauthenticated/dropdown/fg.menu.css delete mode 100644 filemin/unauthenticated/dropdown/fg.menu.js delete mode 100644 filemin/unauthenticated/jquery/images/ui-icons_444444_256x240.png delete mode 100644 filemin/unauthenticated/jquery/images/ui-icons_555555_256x240.png delete mode 100644 filemin/unauthenticated/jquery/images/ui-icons_777620_256x240.png delete mode 100644 filemin/unauthenticated/jquery/images/ui-icons_777777_256x240.png delete mode 100644 filemin/unauthenticated/jquery/images/ui-icons_cc0000_256x240.png delete mode 100644 filemin/unauthenticated/jquery/images/ui-icons_ffffff_256x240.png delete mode 100644 filemin/unauthenticated/jquery/jquery-ui.min.css delete mode 100644 filemin/unauthenticated/jquery/jquery-ui.min.js delete mode 100644 filemin/unauthenticated/jquery/jquery.min.js delete mode 100644 filemin/unauthenticated/js/legacy.js create mode 100644 filemin/unauthenticated/js/plain.js delete mode 100644 filemin/unauthenticated/templates/legacy_dialogs.html delete mode 100644 filemin/unauthenticated/templates/legacy_quicks.html delete mode 100644 filemin/unauthenticated/templates/quicks.html diff --git a/filemin/filemin-lib.pl b/filemin/filemin-lib.pl index 3a3b1e6c5..8848d0860 100644 --- a/filemin/filemin-lib.pl +++ b/filemin/filemin-lib.pl @@ -11,7 +11,7 @@ eval "use File::MimeInfo"; our ($path, $quote_escaped_path, $urlized_path, $base, $cwd, $upload_max, $confdir, $template_name, $bookmarks, $page, $pagelimit, $edit_icon, - $rename_icon, $extract_icon, $goto_icon, $root_icon, $head); + $rename_icon, $extract_icon, $goto_icon, $root_icon); our (%access, %userconfig, %allowed_for_edit); our (@allowed_paths, @allowed_for_edit, @remote_user_info); @@ -413,124 +413,9 @@ if ($tinfo{'bootstrap'}) { "unauthenticated/templates/dialogs.html"); } -# Interface for legacy themes +# Interface for other themes, built from the core widgets else { - - # Set icons variables - $edit_icon = - "$text{"; - $rename_icon = - ""; - $extract_icon = - ""; - $goto_icon = - ""; - $head .= ""; - $head .= ""; - $head .= ""; - $head .= ""; - $head .= ""; - $head .= ""; - $head .= ""; - print $head; - - # Set "root" icon - if ($base eq '/') { - $root_icon = - ""; - } - else { - $root_icon = "~"; - } - # Legacy breadcrumbs - print "
" . - "" . - "$root_icon / "; - my @breadcr = split('/', $path); - my $cp = ''; - for (my $i = 1; - $i <= scalar(@breadcr)-1; $i++) { - chomp($breadcr[$i]); - $cp = $cp.'/'.$breadcr[$i]; - print "" . - &html_escape($breadcr[$i]) . - " / "; - } - print "
"; - # And pagination - $page = $in{'page'}; - $pagelimit = $userconfig{'per_page'}; - $pages = ceil((scalar(@list))/$pagelimit); - if (not defined $page or $page > $pages) { - $page = 1; - } - print "Pages: "; - for (my $i = 1; $i <= $pages; $i++) { - if ($page eq $i) { - print "" . - &html_escape($i) . - ""; - } - else { - print "" . - &html_escape($i) . - ""; - } - } - print "
"; - - # And toolbar - print_template( - "unauthenticated/templates/" . - "legacy_quicks.html"); - print_template( - "unauthenticated/templates/" . - "legacy_dialogs.html"); + print &plain_interface_head(); } my $info_total; my $info_files = scalar @files; @@ -801,6 +686,18 @@ for (my $count = 1 + $pagelimit * ($page - 1); print ui_columns_end(); print &ui_hidden("path", $path),"\n"; print &ui_form_end(); +# Close the widget page area opened by the non-Bootstrap interface +print &ui_page_end() if (!$tinfo{'bootstrap'}); +} + +# list_bookmarks() +# Returns the directories the user has bookmarked +sub list_bookmarks +{ +$confdir = "$remote_user_info[7]/.filemin"; +return () if (!-e "$confdir/.bookmarks"); +my $bookmarks = &read_file_lines($confdir.'/.bookmarks', 1); +return grep { $_ ne '' } @$bookmarks; } # get_bookmarks() @@ -811,10 +708,8 @@ $confdir = "$remote_user_info[7]/.filemin"; if (!-e "$confdir/.bookmarks") { return "
  • $text{'no_bookmarks'}
  • "; } -my $bookmarks = - &read_file_lines($confdir.'/.bookmarks', 1); $result = ''; -foreach $bookmark (@$bookmarks) { +foreach $bookmark (&list_bookmarks()) { $result .= "
  • " . @@ -824,6 +719,486 @@ foreach $bookmark (@$bookmarks) { return $result; } +# plain_interface_head() +# Returns the top of the file list for themes without Bootstrap : the +# module assets, the breadcrumbs, the toolbar of menus and buttons, the +# page links and the dialogs behind the toolbar, all built from the core +# widgets. Also sets the row action icons and the pagination that the +# shared listing code uses, and opens the widget page area that +# print_interface closes after the listing. +sub plain_interface_head +{ +my $rv = ""; + +# Row action icons from the built-in icon set +$edit_icon = &ui_svg_icon('edit', { 'title' => $text{'edit'} }); +$rename_icon = &ui_svg_icon('cursor-text', { 'title' => $text{'rename'} }); +$extract_icon = &ui_svg_icon('unarchive', + { 'title' => $text{'extract_archive'} }); +$goto_icon = &ui_svg_icon('arrow-right', { 'title' => $text{'goto_folder'} }); + +# Server-side pagination, with as many entries per page as the user chose +$page = int($in{'page'} || 0) || 1; +$pagelimit = int($userconfig{'per_page'} || 0) || 50; +$pages = ceil(scalar(@list) / $pagelimit) || 1; +$page = 1 if ($page > $pages); + +# The widget page area, with the module's own stylesheet and script +$rv .= &ui_page_start({ 'class' => 'filemin_page' }); +$rv .= &plain_asset_tags(); + +# Breadcrumbs at the left and the toolbar at the right +$rv .= &ui_tag('div', &plain_breadcrumb().&plain_toolbar(), + { 'class' => 'filemin_head' }); + +# Page links, when the listing does not fit on one page. The URL is +# relative, so a search keeps its query from page to page +my $pager = &ui_pager({ + 'page' => $page, + 'pages' => $pages, + 'href' => "?path=".&urlize($path). + (defined($query) && $query ne '' ? + "&query=".&urlize($query) : ""). + ($in{'caseins'} ? "&caseins=1" : ""). + "&page=" }); +$rv .= &ui_tag('div', $pager, { 'class' => 'filemin_pager' }) if ($pager); + +# The dialogs opened from the toolbar and the rows +$rv .= &plain_dialogs(); +return $rv; +} + +# plain_asset_tags() +# Returns the tags loading the module's stylesheet and script for the +# widget interface, each keyed by its modification time so that a changed +# file is fetched at once, and the permissions calculator shared with the +# Bootstrap interface +sub plain_asset_tags +{ +my $rv = ""; +foreach my $file ('css/plain.css', 'js/plain.js') { + my @st = stat("$module_root_directory/unauthenticated/$file"); + my $url = "unauthenticated/$file?".(@st ? $st[9] : &get_webmin_version()); + if ($file =~ /\.css$/) { + $rv .= &ui_tag('link', undef, + { 'rel' => 'stylesheet', 'href' => $url })."\n"; + } + else { + $rv .= &ui_tag('script', undef, + { 'src' => $url, 'defer' => undef })."\n"; + } + } +$rv .= &ui_tag('script', undef, + { 'src' => 'unauthenticated/js/chmod-calculator.js' })."\n"; +return $rv; +} + +# plain_breadcrumb() +# Returns the path to the current directory as breadcrumb links, starting +# with the allowed base directory : the disk when it is the root, else +# the home +sub plain_breadcrumb +{ +my @items = ( { 'icon' => $base eq '/' ? 'hard-drive' : 'home', + 'href' => 'index.cgi?path=', + 'title' => $base } ); +my $cp = ''; +foreach my $part (grep { $_ ne '' } split(/\//, $path)) { + $cp .= '/'.$part; + push(@items, { 'label' => $part, + 'href' => 'index.cgi?path='.&urlize($cp) }); + } +return &ui_breadcrumb(\@items, { 'class' => 'filemin_crumbs' }); +} + +# plain_toolbar() +# Returns the toolbar : the File, Edit, Tools and Bookmarks menus, and the +# refresh and delete buttons. Entries acting on the selected entries are +# marked, so that plain.js asks for a selection first. Tools whose +# command is missing are left out. +sub plain_toolbar +{ +my $urlpath = &urlize($path); +my $sel = { 'data-filemin-selection' => '1' }; +my @file = ( + { 'label' => $text{'create_file'}, 'icon' => 'file-plus', + 'dialog' => 'filemin_create_file' }, + { 'label' => $text{'create_folder'}, 'icon' => 'folder-plus', + 'dialog' => 'filemin_create_folder' }, + '-', + { 'label' => $text{'upload_files'}, 'icon' => 'upload', + 'dialog' => 'filemin_upload' }, + { 'label' => $text{'get_from_url'}, 'icon' => 'globe', + 'dialog' => 'filemin_download' }, + ); +my @edit = ( + { 'label' => $text{'copy_selected'}, 'icon' => 'copy', + 'attrs' => { %$sel, 'data-filemin-submit' => 'copy.cgi' } }, + { 'label' => $text{'cut_selected'}, 'icon' => 'scissors', + 'attrs' => { %$sel, 'data-filemin-submit' => 'cut.cgi' } }, + { 'label' => $text{'paste'}, 'icon' => 'clipboard', + 'href' => 'paste.cgi?path='.$urlpath }, + '-', + { 'label' => $text{'select_all'}, 'icon' => 'check-square', + 'attrs' => { 'data-filemin-select' => 'all' } }, + { 'label' => $text{'invert_selection'}, 'icon' => 'square-half', + 'attrs' => { 'data-filemin-select' => 'invert' } }, + ); +my @tools = ( + { 'label' => $text{'search'}, 'icon' => 'search', + 'dialog' => 'filemin_search' }, + '-', + { 'label' => $text{'compress_selected'}, 'icon' => 'archive', + 'dialog' => 'filemin_compress', 'attrs' => $sel }, + { 'label' => $text{'chmod_selected'}, 'icon' => 'lock', + 'dialog' => 'filemin_chmod', 'attrs' => $sel }, + { 'label' => $text{'chown_selected'}, 'icon' => 'user', + 'dialog' => 'filemin_chown', 'attrs' => $sel }, + ); +push(@tools, { 'label' => $text{'chattr_selected'}, 'icon' => 'tag', + 'dialog' => 'filemin_chattr', 'attrs' => $sel }) + if (&has_command('chattr')); +push(@tools, { 'label' => $text{'chcon_selected'}, 'icon' => 'shield', + 'dialog' => 'filemin_chcon', 'attrs' => $sel }) + if (&get_selinux_status()); +push(@tools, { 'label' => $text{'acls_selected'}, 'icon' => 'key', + 'dialog' => 'filemin_acls', 'attrs' => $sel }) + if (&has_command('setfacl')); +my @bookmarks = ( + { 'label' => $text{'bookmark_folder'}, 'icon' => 'bookmark', + 'href' => 'bookmark.cgi?path='.$urlpath }, + '-', + ); +my @marks = &list_bookmarks(); +if (@marks) { + push(@bookmarks, map { { 'label' => $_, 'icon' => 'folder', + 'href' => 'index.cgi?path='.&urlize($_) } } + @marks); + } +else { + push(@bookmarks, { 'label' => $text{'no_bookmarks'}, 'disabled' => 1 }); + } +my @buttons = ( + &ui_dropdown($text{'menu_file'}, \@file, { 'icon' => 'file' }), + &ui_dropdown($text{'menu_edit'}, \@edit, { 'icon' => 'clipboard' }), + &ui_dropdown($text{'menu_tools'}, \@tools, { 'icon' => 'gear' }), + &ui_dropdown($text{'menu_bookmarks'}, \@bookmarks, + { 'icon' => 'book', 'align' => 'end' }), + &ui_action_button($text{'refresh'}, 'neutral', + { 'icon' => 'refresh', 'href' => 'index.cgi?path='.$urlpath }), + &ui_dialog_button($text{'delete'}, 'filemin_delete', 'danger', + { 'icon' => 'trash', 'attrs' => $sel }), + ); +return &ui_tag('div', join("\n", @buttons), + { 'class' => 'filemin_toolbar', 'role' => 'toolbar' }); +} + +# plain_dialog_table(&rows) +# Returns a two-column table of label and input rows for a dialog body. +# A row with an empty label spans the table. +sub plain_dialog_table +{ +my ($rows) = @_; +my $rv = &ui_table_start(undef, "width=100%", 2); +foreach my $row (@$rows) { + $rv .= defined($row->[0]) && $row->[0] ne '' ? + &ui_table_row($row->[0], $row->[1]) : + &ui_table_row(undef, $row->[1], 2); + } +$rv .= &ui_table_end(); +return $rv; +} + +# plain_dialogs() +# Returns the dialogs behind the toolbar and the row actions. A dialog +# acting on the selected entries carries the script to run in a +# data-filemin-apply attribute : plain.js sends the selection form to that +# script with the dialog's fields as URL parameters, as the action +# scripts expect them. The other dialogs are ordinary forms posting to +# their script. +sub plain_dialogs +{ +my $rv = ""; +my $hidden_path = &ui_hidden('path', $path); +my $cancel = $text{'dialog_cancel'}; +my $recursive = &ui_checkbox('recursive', 'true', $text{'dialog_recursive'}, 0); +my $apply = sub { + # A form sent to the selection, closed natively if the script fails + my ($script, $name) = @_; + return { 'method' => 'dialog', + 'name' => $name, + 'attrs' => { 'data-filemin-apply' => $script } }; + }; +my $change = [ { 'label' => $text{'dialog_change'}, 'state' => 'success', + 'icon' => 'check' } ]; + +# Shown when an action needs a selection and nothing is checked +$rv .= &ui_dialog({ + 'id' => 'filemin_nothing', + 'title' => $text{'warning_title'}, + 'state' => 'warning', + 'size' => 'small', + 'text' => $text{'nothing_selected'}, + 'close' => $text{'dialog_ok'} }); + +# New file and directory +foreach my $kind ([ 'file', 'create_file', 'new_file_name', 'file-plus' ], + [ 'folder', 'create_folder', 'new_folder_name', 'folder-plus' ]) { + my ($what, $title, $label, $icon) = @$kind; + $rv .= &ui_dialog({ + 'id' => 'filemin_create_'.$what, + 'title' => $text{$title}, + 'icon' => $icon, + 'size' => 'small', + 'form' => 'create_'.$what.'.cgi', + 'body' => &plain_dialog_table([ + [ $text{$label}, + &ui_textbox('name', '', 30, 0, undef, 'required') ], + ]).$hidden_path, + 'buttons' => [ { 'label' => $text{'create'}, 'state' => 'success', + 'icon' => 'check' } ], + 'close' => $cancel }); + } + +# Rename, filled in by the row link +$rv .= &ui_dialog({ + 'id' => 'filemin_rename', + 'title' => $text{'rename'}, + 'icon' => 'cursor-text', + 'size' => 'small', + 'form' => 'rename.cgi', + 'body' => &plain_dialog_table([ + [ $text{'new_name'}, + &ui_textbox('name', '', 30, 0, undef, 'required') ], + ]).&ui_hidden('file', '').$hidden_path, + 'buttons' => [ { 'label' => $text{'rename'}, 'state' => 'success', + 'icon' => 'check' } ], + 'close' => $cancel }); + +# Upload. The options travel in the URL, which upload.cgi reads before +# the files arrive, so plain.js adds them to the action on submit +my $upload_url = "upload.cgi?path=".&urlize($path)."&id=".$upid; +$rv .= &ui_dialog({ + 'id' => 'filemin_upload', + 'title' => $text{'upload_files'}, + 'icon' => 'upload', + 'form' => { 'action' => $upload_url, + 'method' => 'form-data', + 'attrs' => { + 'data-filemin-upload' => $upload_url, + 'data-filemin-tracker' => + &get_webprefix()."/uptracker.cgi?id=".$upid } }, + 'body' => &plain_dialog_table([ + [ $text{'upload_files'}, + &ui_upload('upfiles', 40, 0, 'multiple required') ], + [ undef, + &ui_checkbox('opt_dirs', 1, $text{'upload_dirs'}, 0, + 'data-filemin-upload-dirs')."
    ". + &ui_checkbox('opt_extract', 1, $text{'extract_uploaded'}, 0, + "data-filemin-upload-option='extract_uploaded'"). + "
    ". + &ui_checkbox('opt_overwrite', 1, $text{'overwrite_existing'}, 0, + "data-filemin-upload-option='overwrite_existing'") ], + ]), + 'buttons' => [ { 'label' => $text{'upload_files'}, 'state' => 'success', + 'icon' => 'upload' } ], + 'close' => $cancel }); + +# Download from a URL +$rv .= &ui_dialog({ + 'id' => 'filemin_download', + 'title' => $text{'get_from_url'}, + 'icon' => 'globe', + 'form' => 'http_download.cgi', + 'body' => &plain_dialog_table([ + [ $text{'dialog_file_url'}, + &ui_tag('input', undef, { 'type' => 'url', 'name' => 'link', + 'class' => 'ui_textbox', 'size' => 40, + 'autocomplete' => 'url', + 'required' => undef }) ], + [ $text{'dialog_user_name'}, + &ui_textbox('username', '', 25, 0, undef, "autocomplete='off'") ], + [ $text{'dialog_user_pass'}, + &ui_password('password', '', 25, 0, undef, + "autocomplete='new-password' data-password-meter-skip") ], + ]).$hidden_path, + 'buttons' => [ { 'label' => $text{'dialog_download'}, 'state' => 'success', + 'icon' => 'download' } ], + 'close' => $cancel }); + +# Search under the current directory +$rv .= &ui_dialog({ + 'id' => 'filemin_search', + 'title' => $text{'search'}, + 'icon' => 'search', + 'size' => 'small', + 'form' => 'search.cgi', + 'body' => &plain_dialog_table([ + [ $text{'search_label'}, + &ui_textbox('query', '', 30, 0, undef, 'required') ], + [ undef, &ui_checkbox('caseins', 1, $text{'search_insensitive'}, 1) ], + ]).$hidden_path, + 'buttons' => [ { 'label' => $text{'search_go'}, 'state' => 'success', + 'icon' => 'search' } ], + 'close' => $cancel }); + +# Compress the selection into an archive +$rv .= &ui_dialog({ + 'id' => 'filemin_compress', + 'title' => $text{'compress_selected'}, + 'icon' => 'archive', + 'size' => 'small', + 'form' => &$apply('compress.cgi'), + 'body' => &plain_dialog_table([ + [ $text{'archive_name'}, + &ui_textbox('arch', '', 30, 0, undef, 'required') ], + [ $text{'type'}, + &ui_select('method', 'tar', [ [ 'plain-tar', '.tar' ], + [ 'xz-tar', '.tar.xz' ], + [ 'tar', '.tar.gz' ], + [ 'zstd-tar', '.zstd' ], + [ 'zip', '.zip' ] ]) ], + ]), + 'buttons' => [ { 'label' => $text{'dialog_compress'}, 'state' => 'success', + 'icon' => 'archive' } ], + 'close' => $cancel }); + +# Permissions. The form is named for the calculator, whose fields are +# kept out of the parameters; the perms parameter the script reads is a +# hidden field that plain.js keeps equal to the octal field +my $matrix = &ui_tag_start('table', { 'class' => 'filemin_chmod_matrix' }). + &ui_tag('tr', &ui_tag('th', ''). + join('', map { &ui_tag('th', &html_escape($text{$_})) } + ('chmod_owner', 'chmod_group', 'chmod_others'))); +foreach my $bit ([ 'chmod_read', 4 ], [ 'chmod_write', 2 ], + [ 'chmod_execute', 1 ]) { + $matrix .= &ui_tag('tr', &ui_tag('td', &html_escape($text{$bit->[0]})). + join('', map { &ui_tag('td', &ui_checkbox($_.$bit->[1], $bit->[1], + undef, 0, 'data-filemin-chmod data-filemin-skip')) } + ('owner', 'group', 'other'))); + } +foreach my $extra ([ 'chmod_sticky', 'sticky', 1 ], [ 'chmod_setgid', 'setgid', 2 ]) { + $matrix .= &ui_tag('tr', &ui_tag('td', &html_escape($text{$extra->[0]})). + &ui_tag('td', &ui_checkbox($extra->[1], $extra->[2], undef, 0, + 'data-filemin-chmod data-filemin-skip')). + &ui_tag('td', '').&ui_tag('td', '')); + } +$matrix .= &ui_tag_end('table'); +$rv .= &ui_dialog({ + 'id' => 'filemin_chmod', + 'title' => $text{'chmod_selected'}, + 'icon' => 'lock', + 'form' => &$apply('chmod.cgi', 'chmod'), + 'body' => &plain_dialog_table([ + [ $text{'permissions'}, + &ui_textbox('t_total', '0644', 4, 0, 4, + "data-filemin-chmod-octal data-filemin-skip ". + "pattern='[0-7]{3,4}' required")." ". + &ui_textbox('sym_total', '', 12, 0, undef, + 'readonly data-filemin-skip'). + &ui_hidden('perms', '0644') ], + [ undef, $matrix ], + [ $text{'chmod_apply_to'}, + &ui_select('applyto', 1, + [ map { [ $_->[0], $text{$_->[1]} ] } + ( [ 1, 'chmod_dir_only' ], + [ 2, 'chmod_dir_and_its_files' ], + [ 3, 'chmod_all' ], + [ 4, 'chmod_dir_files_and_subs_files' ], + [ 5, 'chmod_dir_and_subs' ] ) ]) ], + ]), + 'buttons' => $change, + 'close' => $cancel }); + +# Ownership +$rv .= &ui_dialog({ + 'id' => 'filemin_chown', + 'title' => $text{'chown_selected'}, + 'icon' => 'user', + 'size' => 'small', + 'form' => &$apply('chown.cgi'), + 'body' => &plain_dialog_table([ + [ $text{'user_name'}, + &ui_textbox('owner', '', 20, 0, undef, 'required') ], + [ $text{'group_name'}, + &ui_textbox('group', '', 20, 0, undef, 'required') ], + [ undef, $recursive ], + ]), + 'buttons' => $change, + 'close' => $cancel }); + +# File attributes and SELinux context, which take one label each +foreach my $tool ([ 'chattr', 'tag', 'attr_label' ], + [ 'chcon', 'shield', 'context_label' ]) { + my ($what, $icon, $label) = @$tool; + $rv .= &ui_dialog({ + 'id' => 'filemin_'.$what, + 'title' => $text{$what.'_selected'}, + 'icon' => $icon, + 'size' => 'small', + 'form' => &$apply($what.'.cgi'), + 'body' => &plain_dialog_table([ + [ $text{$label}, + &ui_textbox('label', '', 25, 0, undef, 'required') ], + [ undef, $recursive ], + ]), + 'buttons' => $change, + 'close' => $cancel }); + } + +# Access control lists, when setfacl exists +if (&has_command('setfacl')) { + $rv .= &ui_dialog({ + 'id' => 'filemin_acls', + 'title' => $text{'acls_selected'}, + 'icon' => 'key', + 'form' => &$apply('setfacl.cgi'), + 'body' => &plain_dialog_table([ + [ $text{'acls_action'}, + &ui_select('action', '-m', + [ [ '', '' ], [ '-m', 'Modify (-m)' ], + [ '-x', 'Remove (-x)' ], + [ '-b', 'Remove all extended (-b)' ], + [ '-k', 'Remove default (-k)' ] ]) ], + [ $text{'acls_applyto'}, + &ui_select('apply_to', [ ], + [ map { [ $_->[0], $text{$_->[1]} ] } + ( [ 'u', 'acls_user' ], [ 'g', 'acls_group' ], + [ 'm', 'acls_mask' ], [ 'o', 'acls_other' ] ) ], + 4, 1) ], + [ $text{'acls_perms'}, + &ui_select('perms', '', + [ map { [ $_, $_ ] } + ( '', '---', 'r--', '-w-', '--x', + 'r-x', 'rw-', '-wx', 'rwx' ) ]) ], + [ $text{'acls_user'}, $acl_user_select ], + [ $text{'acls_group'}, $acl_group_select ], + [ undef, &ui_checkbox('recursive', 1, $text{'dialog_recursive'}, 0) ], + [ undef, $acl_manual ], + ]), + 'buttons' => $change, + 'close' => $cancel }); + } + +# Delete, after listing what is selected. Cancel takes the focus, so +# Enter does not delete by accident +$rv .= &ui_dialog({ + 'id' => 'filemin_delete', + 'title' => $text{'remove_selected'}, + 'state' => 'danger', + 'icon' => 'trash', + 'form' => &$apply('delete.cgi'), + 'body' => &ui_tag('p', &html_escape($text{'about_to_delete'})). + &ui_tag('pre', '', { 'id' => 'filemin_delete_items', + 'class' => 'filemin_delete_items' }). + &ui_tag('p', &html_escape($text{'are_you_sure'})), + 'buttons' => [ { 'label' => $text{'delete'}, 'state' => 'danger', + 'icon' => 'trash' } ], + 'close' => $cancel, + 'focus' => 'close' }); +return $rv; +} + # get_paste_buffer_file() # Returns the location of the file for temporary copy/paste state sub get_paste_buffer_file diff --git a/filemin/images/icons/quick/acls.png b/filemin/images/icons/quick/acls.png deleted file mode 100644 index 83b12af513b5a010ac0930739a6f6b3a33f79e87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1182 zcmV;P1Y!G$P)EX>4Tx04R}tkv&MmKpe$iQ$>-Ah#iUuW~fdUL`5963Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4RLx;QDiNQwVT3N2zhIPS;0dyl(!fKV?p&FUBjG~G5+ ziMW`_u8Li+5D-B>h7pjNWz0!Z629Z>9s$1I#dwzgxj#p*nzI-X5Q%4*VcNtS#M7I$ z!FiuJ%!;x~d`>)O(glehxvqHp#<}3Kz%#>UIyFxmCKd~Ath6yJni}yGaa7fG$`>*o ztDLtuYvn3y-jlyDl+#z1xlVHk2`pj>5=1DdqJ%PR#Aww?v5=zuxQ~C(^-JVZ$W;O( z#{w$QAiI9>Klt6Pm7kpOl0tEy^TlyKMu4tepiy(2?_Ep>8>Y}I({00006VoOIv04M-005NH~3Nruz010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=K>fJCJB!oUrhi202y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00MSNL_t(I%VS^|1(blP(`FfqOR4*pmQ_1Hdi;cwVgmz1 z5?PH+Z5Q+MN&RDB6#CD|B>dmO(e2i}`3tluGB`aWr=5XO=s!BvH?%l^@zO0OWVKAh z8v5(kAI7Ioo`zwQyMFz?!O>%fjFH7y7#J8B8XH^VFI>D7$;-?0O-M+%XF`A1F?7wZ z-+o{e77>=hYUz)k47YFJ7eo<^jZ2N-<(K}?$Rzxqfl=r`JE!Eg_RfCGKY#!8pQkpYoMdhB|yN+GHcmdsEn)31r z)g~q{4xBl2lLaQo!NJPl?CdZpG9u&!N*MqA_3IA<0|NsO4-e;+tG9kbgc<)ZFf#po z_~^;sWy?1+eEItQHv=Qn|EW{@j~W>n+j@K3?M_V%|K#mudoD75PmFA-ne+760-57hE438w-P#mBAM-F76#t zQqoK3%$~A=puzo9<}e;Ve4u~t-otrs-+m_O2u4Om23s4WV?X~e`QptWZ=OGiU9)C; zJ~4(eFfcIu|No!i(BZRIaxx-w@ftjL{xXAq|NfJl^+kjQ+*$A`c=7BN0|Uc%k`3nM wE=KNRw(X6BE=y5WLY3c7sD_ zw>!ZP;85fyD~@&13f4h!v8a{eb7-S6cs+Whiw^?%|MT9D2tt zCSW}O9e4!Z01%O7N2s;#0Z;DGTK7aGw0Tu_Y^KxcHt^t@bMN~URloo*e|QsDR0V&O zCHx<70Ms2l21bsaP!dJpx>D-I3K2Q*)>mr9)q=I9!2a?5;&xSVT`6_!=nFe>eGxgN zLXY!;Jl|is$E5{sUL40GfGo>`Mc}cB46IN}?bx}9-1y*Dt2OR+y90oJzi)=ap?g2S zz$4&jK5sL-OdDswwOupDyryY-+h{b-0n#+x>U280MPNS)+ma;7eH2AG@C*<|QJy5p zhMS`bo~8iUcl0SgUtSXkflJ_X?$v-j;EvhPz7V`}tnJPF0_;nb%oQI3;s5{u07*qo IM6N<$f^WFNQvd(} diff --git a/filemin/images/icons/quick/browse.png b/filemin/images/icons/quick/browse.png deleted file mode 100644 index f9fd372e3244052479b2892439a9c79e2a8a50b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 944 zcmV;h15f;kP)I z%8~Bsp7Xo^bMF6$AP4}cR4Nvb1T03w0AUaWYRui(a1No@KYKeUN+k!sAt{Z{zpY|koRn7Imk?*IwM zwikN`T`=ZUV67CMpIro82M|WZ7$rv%Eyu%hT!gSOMx$j9EqjlJ8x;cx2M|idXszjg z?4T_#ORZLCy?UE=r-SeNEG#W?etH@iwkKc(>Lj?YSRH{a$D>iJap&fbEIwc6Z0Tus z8(Z9~u3=jV&K9!hK41iVQn96EjMm3s+j97A{Vp$Fe1WH)DH9(wnR)g(Qpp4x_tz;F zUqi>?c*QdAYXgKjE3@u&dE{eI2xL<>UAm3E^ue{2YOO7b*{wj_9ngd z4pZmnKpW5oWAv!vI0CRNj$9#+UX6PXNqPxhdi8aLG2C8TC5|Pf*?H>q2Gwd6;rbYO zM6n!pg_hCC%)-_-wwq$<(h3(>Tyz}vy{t9$&3mk^{=~~GuOP$bP_35HF<7Z+?AGb9 zLmYOF8xYSTWdF2UcN-s{rkA6Kc0b)<>=Op3xlG&x5c@+G8o7xjh2W1 zGd%46D8^c6LTE*2=XZ+J^B5g-&}@veUf&hwk#+u8{Q z_W6Gyghg$y-2k)=gx#>WI6qq~J(Qrg4%!iDZ^U@(J8@4mX|0P31@=vpAlQ z<7KejG)^Lko$#>i1hw7HU)R37b>r8q{jWt31XL=OW#A2tc+d)oSB;P^;Bdr81@%4g=Wl0F26jH7MhGl^ei?EWrl2FCt4}7rKxN8B_ zfJPKWlkN7OUP+$GcU;6(3OFU*fAIZaI*yxZ3E#@*_ziH@qD7D3d{RV~tpmlT!Uoa1 zfC7AuqUc<^-AZjrbzh6!Zl?phVDGW$`v;F^2TGn}1sJ8Y5|Me}W{!q`i3;#3ilS5b zu7^e)9}m53JeZWxB?sko|J%Y08>fQ{syX4ZUcdf$QNKHQ_0Vg&R2kA zz;(x|)QvGiPN#F$H%JP@z!Q-<;B5xJ54e>}+yG7kPk|Y&^{e&uU#V?Eg)Ws*bO-1F z&w=lme>8xTz$4&15CaPqMXKm#4eq;$d<7n6p0NNN7LhZ+<4lrE#+ZpD*?ty=ftznE ze|W0MP~y1RjiRWLjoyz<;GT%g1;GJFYptw2W2>Uj={&DG0lWwH122u~T}zTqOR1s1 z(omjLuh+CKH``EFSJ!^{zF!4ii^%NQST!91I-o+2qN2a07*qoM6N<$f~z}AoB#j- diff --git a/filemin/images/icons/quick/chcon.png b/filemin/images/icons/quick/chcon.png deleted file mode 100644 index 494249195c7819d549bd10134bf6fe01c968c5c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 631 zcmV--0*L*IP)~+mXwU4rFF8DI0T`%RfmEgf({C<9o!WWQXB z7DU^c&SSM*Wf79-!dWcgaDc7iJC0!l&v6NRkZKg!sQ3(q z@fq(?#VH(Whc#}1$$P{hktiXY)57CQhh;shT5E$}U-S~RWEFJO6S zXh^G4z`4-CPX7I=>FH^eN~L9B0#|Uq4Yjv%70FB{BbiJpm&<=Dj^kJy$5p(;gD`o` z>>1{;l1`_8R;yKgeSHQ72L1q=pP$#?-!FmJL^R+tYR~*OP&693yY;0@7lF2P_Pft&?bca#Kfp7?Y!ah93 z{%kgDW@g6t__)#0QH4Um?Ck6oxRnR^Tu^x=JdYHMMTJ5^S65d}MQ?Af<>lp$Mz$Nb zg7@U}dAVG!R=OyPN9M9gLJY%4fK2C{Q~vf&~t>9 Rni>EA002ovPDHLkV1n}-8}R@D diff --git a/filemin/images/icons/quick/chmod.png b/filemin/images/icons/quick/chmod.png deleted file mode 100644 index 8363b33ffe1bde24de052a67b5ff2b38348bd5d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 956 zcmV;t14I0YP);8cUVIIM50wK=?5|utd`> zZOD_JcILe|-+A-C^L8{TB@2q?d>2~aSs-Qw2rIE8papdQca@ZKp5ByF-f+fIUDpqQ zE8t4k^#dto)bSZoO7A?3r8#>=wzjsu+TGp#99ReR;c(~$E`SSXtOM(NdwX|wc6Po1 zB5%t$l1``Z1INH~zu*5*)3hq^6sS7-RMWJo-|v6u#QmO5r|(NCBPx~(>Maxs_kbGk z3-H((SAm~hT6KJno!DBTP`Ia-MI~>NN~K1IVVn;JgPV@6{~y%6242o4hGBG4sniIV z%xr3n2gPF1&gb)o!0=r(pU)o_i$xn4%)m6~92!jsUkK41jYi)%CusxS8SsYJ>-}~x7{sKM9d+kGAn<3a)jAMDJO>z$#~*~l z;V(O#j$gqxG))T_hGF-5y|01OC8iza>G%6VDP;q=R*#v><(>&49sy5)Cqjrvxm@m< zs~p!-%0|E64>D~eO(pM&IbvDXH8568W5@Q|75WcCmzehcD3i$?heDyYE0dvRS$Au- z+A44hxK*pwRxQiA>y8VBLhVc@bIi2mrApo%Ah@xy@v&{&Dml8QX}81S@F75})!LL& zUZ@$zVzKt=>8Zt(xF3P;tQ1|~J77JV&Aw;bwt6duQp)qo%gaxk`MJ9c*=*JZz6btL zOED9pR4T>FmwX_~gr=X<5=daqKc9GRwh2J~iNGxAjV z=;Y+&)8*x58I4AN1Ky8BBGG2Ec>`c=ZLQyEH0r>4yWP)oQn!~tE&0}_y(*4X~Rg$7T$g)e8<`Qfq{YC`uh4SMN!@Xzt3}AiN#{Z)YMe<%+12WLK(;cCmxR{-PhN* zZFM_3I{HOXl#E@}DlC9@pir;ZD>Sxiy;iFkG)B-DkH>q`>2#Y_IFU$rR#sO0fEU|T z2q|SN&^SSuEbBj$S9!oMMe@awvsTwGjy9f?E? z8fV9ekW%*ee7=}r7(N=?bl)Vk06}2HY;~tu%VtMCLWoXX*WWHJExindLSKcHQU~q> zy7lYf;o;U)D%H_M=sdW9fZOfP9v&V(w@!r>KHw3J+%Jn=;LUl$|BV0dYWf4BR9Xmc S4$mwA0000(JFz1%4WT>5S9A`yqy#+LenbvyCahw$qnGg|_p*RCf z0a-vI1-4~bufi~#2Er7@_So3iK@bG@fqlzJ6f&92({{UE1juHyTfXl<3WDGTkQ>HW zE|(`(S6A zv;LPzL2w%4q~g;M_r)xLd_LdNTDLl#PJC{Oux-0V_wO{(r&t3rIXQW>yuAEXYu$

    if3kK_JLZ@cO1v5R4O+BMC1vu)0=S{*v#ki zAES?)a9Ec0I1Ix=d>S$T2-q$bi-&ZVSKr}5_b!_E@nB+9=vx;wdVZ6-khmw*!8mD&v|bp=2~>PBq?r~>T+{B0qBxMWQq{3ajSXm+*-6NtZUYR+By9tC zo*yfP0VSYbuXo&PwT2N6{eC}dx7)kGC$W-MmSB>azy)w2X;acdz2*9xx#xx=fQ(g@EIcytrZ-8=(wGdptl)g)DiOWFfA06Lw{YD&fcmoqq1 zxS1V>?f|&S^E`U>y>RLgJ0ExQJRf$u-6uv4Hzl40pp^9JvRWSZCA~PlJdcr4-7>Px zsqpSLJ{1i!+j2^$d^?x;X*jh;KhGk)UnKp@VmGgp^yaWKRm?}#=qGq(vR}s+4^`kZ TZXRF&00000NkvXXu0mjfVwv7f diff --git a/filemin/images/icons/quick/drive-harddisk.png b/filemin/images/icons/quick/drive-harddisk.png deleted file mode 100644 index 0e6a85e5f55706bb123de2847ec78df364d61982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 864 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 KMNUMnLSTZ-HkvR1 diff --git a/filemin/images/icons/quick/edit-paste.png b/filemin/images/icons/quick/edit-paste.png deleted file mode 100644 index 3562d6206aadd7f23cf60125bcaa322cbcaefc63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 608 zcmV-m0-ybfP)1G8vmnUErXXGt1{q zqP#p2d0GZ*tzU{rw8~RTT_}p;F|fPJi#TmcL}oy7DyY<3PqzmwN-xe`VJGH;0p@|& zH}AP_D{0_(HSp~y;B(I_nj}fKfaX~hF9NaO+H^X-3&bp2BIg1Rhr@T)+9IH3G#cr4 zyZsRONvY500$XdhfgP&7Ro2=KVAIbDf%8CY=AfaEHVftatsYl${wetA55Se2|F0GP z$rEGD%n8d5%RL%$JY5AWz(Kd${c4OkWVwZMAn)~hO`rwb^1S8dR@xH_UG#T=4Iql+ z_*#}_5pWNP|+?Zdgb-uK^2vHCK0000W#QYQQN}^nAG8lV z%ro!zeLpboe4qDqki=Pp^Gv7!gb8C;01!Y2z{&pr3jqAGEI$JP!!X_e_`MLELq|Lw%k<|<^8PN zGH!4He*s|2mOF}~yqg8?n9z9wfVE5}bGOlG+_GsG6h+zT^?D_oV#P_|AzW3}JGENv zhE2QZ@pxL@ZnrWCej0cP*EH>RwOU=ZX_vfSZ(G;(+Bo<$@DQHOW^a~CrK>jWve)bV zq3ikw06(q5EQinufN#ZOaW|XI?!mO7s;Ya1Lg90_+g(j064wBn8(B3+Hwh%8xm@lk zfMPrze?oFS5{Yamit>u2Z<^hv!t?q3V*sB-QEa5s>AchFtT&s@>sAX|7cG$tko1#0 zZ$7Pcz?>tHjJ8^>hp|}fwJ3@o0lWGlBj9gil%8k07nDSYPTf-_wn!M_zECujt^=F kfNcPOW^mF>K3*vP0%kldLM6C9w*UYD07*qoM6N<$f|2|)v;Y7A diff --git a/filemin/images/icons/quick/extract.png b/filemin/images/icons/quick/extract.png deleted file mode 100644 index b07e2e6825c0a0e41f896fad976f287af317538b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 660 zcmV;F0&D$=P)K~y-6os=<)6G0TmfA3fc7Ma~>BN*@sZ4(fy6cMq~%Hs4h z2$rG&!AcMkvGh1ZKR~cND?#pTvM35BoRtTj;E9dNW`oMzB|MAF!m`QkW%J;%v-95k z=0A@&BdSUcbAYpe0zZLqR$?A#*%ie8sxIP=s;(MiHh?`~<0zs;f3O zvnCI89oPjvTi-Rttf#@{m>N4k+4H=6!{P8MFiOOWuIs)Hg5XKAELq?PdUrS+UID_C zJmb3VRuBYFz<#7EX%YHGc~-~+*mm0lQ+$0vZW-EMEI>YKP9 zr?}m2Zv&xa6aW!b72tx1JOohHXTS%h?*Vq>^HDr$s`>~xB_elX|6k)>5goN}p~*hX zDn&mTp9h{11^iXj_bKraP+SHK(;M|XBfc~kW=j)UbfFdk3ya%g;99MAvD4|~;7-@f z11oS)sZ{#CUa#o;{w)!?or^r}ie9Bs836}?Mv8-0tF_-~G|qIp-A_580932hKh0+I u7xpELo=pMH0hfT&%YcF3z(?Rap#K4G+eS|fvnKNZ00003+Z8-v%Bm2+zCS?s1l7uYn)F zigjbmfvQd@J6b?SL{^-0&w;b6Dpd8)5>NnCHRrO5nN#t18E91@cnlClQBgG&MG-9n z&H=2oAF3u1dA2kd_$VTWeo<9-fX%xA1AMCZa&9RPcB=Zh2{amwuJ+pP_7iLE+|E7N zh{$d^?*b>@AR=!lkD;pWS!*8yHwFW|Z}5cc&KQ$B=W4-8k`z8fQ^(gSrzUZdBt@^+ z%Yfe@c&MtGH;KrapH=lDOgtWsGv}PCg5x+YqA29rvuTLJhja2o74^{WI| vLfl}wPXGOxb*cjoE1y4H;N`Vd+=>1Hb^WA;V@#ga00000NkvXXu0mjfLxJRp diff --git a/filemin/images/icons/quick/from-url.png b/filemin/images/icons/quick/from-url.png deleted file mode 100644 index a15d5783651a7865ac4720e86be9be089dacdb97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1470 zcmV;v1ws0WP)$8Y^L^hrEK+JDR*3fxc-}|9N6-5T?>zuQh!ha=|BdzD8vxXG`;wKM_JaFM-tXVtr!2(jYg`rgU+O+V%iSYUa-$&@uzy zBkEr9!Zn3V3BK`UgZiPx9(Bkq9&rBhD#M>Rz!yJcs8pW>QW_AMjN#H3V_NMtcUMB1 z%_7A_((V+Hsa|{>@aC;2_-p-$rypNoa73}S)}R&%!ki|Xa!fv0V`Ln%xh{Z^fDjn^ zvXWenU~l^j-KfC)TooN=NK`*B|M_V;@(iua6u)@6fX;;!RmAc}hqcvNl-Haqc^0Na zq%a=~OHYiFFw(Di?6Y@SSgbHyZ1U`->l6kPI&Kh^N)zV$`NPdge2*r`2iT^gRN7&7 zN-#MbAcZG(5rEWy=o*6*pq1dEnUIOW4@n}py}m%E$J2@f5CTC!D%->MPQpkwc2B@4SU+v}2+F6E1YMhzgBTnu))_|y0)7*S(nj~IjY3TylUPaet5n3Rm1Syd! zAdH(_m^os5->`JYFrN>(JiSaaw@t&QNfJl3oIMRMj$^h~#(D4NImXA!?A1p9tE=8S z9vNQ4*V|+|mfJfKIu~$XQ8AEKv`*4kquAfd07wZ4Yc1Y8cD6>japO_6>T=lnmav>@kFlrqA#U_>YQEJ=aDPwC5K8f*3f=e8>E0{d9 z!DEZ-T>8`>IXifZY*OXoSQT?%d1dnfUR`>I%85qj0{UB)T1~UFI)t_6l(8`uCloS{ za8X37nWkDxF*yuV<1s<-2I<@c)Z26pEm!OFsIZ5>Er(pbKV(FJO#8R7(6x4gbPg?Em`bhy4$L}vps`G8+Oy29p0 zNOJGK-)r8#lTWPqXcu@ItnGNpAC&mf;tsZE*xU15Kbk^>CwzHvi*J2t52Qe4LyjZO zJJlj0B~KX(A@JUV_avqR-r+@q&ATIvcO9P`IL1^WURWQ)dGPHPzkl7cv7-6z*J3_B z5pZoik5d6kh>wMxxAs7#QiF+eABlJAb|Q|p`uOpsb)w^l-F?qXn^VY)0q;;@nz!!c z`N|I@kIV{=kF)3?z*&0$I1TK!E9F;;Gjmt+gT(=@6jCWt@fkjUuEpG#AZaE1rCVTO zb{q%9QA8ZaB(6vt$5gE)4q{T~q;^;-zY6RM?>$0@1>hOrK|uZw&+|XW0sjPE^4>4~ Y3wR=h^HY=5q5uE@07*qoM6N<$g8y8r^Z)<= diff --git a/filemin/images/icons/quick/go-down.png b/filemin/images/icons/quick/go-down.png deleted file mode 100644 index 3353789476f90a64a90b74a9bfff85d1dc0300da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmV+!0_OdRP)U28iKpS||0d#r;uEH?9wrx9}Kdo)saTtcz zz?BZV2n_Jzx^5H%!Oc842!b2ebtB-#n5~prv@E66j^}wtz%g*_dESvyYG>*hb4~wv zR{7y@cu=WS$^iX-e;|Z7!!VJb$~4kKh|6ZPSp*P5T&6+6+!bHqfXei}kGZ$M4gR)% b-_`UERS(4Pe8tjp00000NkvXXu0mjfOAYT7 diff --git a/filemin/images/icons/quick/go-next.png b/filemin/images/icons/quick/go-next.png deleted file mode 100644 index 299d5a9731d1a891cf6b65c5879dcd34e6aac4e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 522 zcmV+l0`>igP)q$No<3vBn|WEM}S9}Oy;susjNgd{tH|xmBMbf`=d}Od;>0%z==cPoEz2a_3yP>E#xjSzoMS| zU;(4yaCjUw<@5PqJRUCql*{GoPNy^Ueg6nJ63(DGzJ_hrrJy^HgcTPtx;y=${|>4}$tjByMz-jQ{`u M07*qoM6N<$f(cFIoB#j- diff --git a/filemin/images/icons/quick/invert.png b/filemin/images/icons/quick/invert.png deleted file mode 100644 index 7543d1bfb0303de7f61f6b169a37f5573a03dc27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4E|asa4+Yc zt7R~G`UDjA5(iN;C z!DSJPuVFbh3EKJEdVXd5@xpXZ%E64M;B_U})iXBj+Q{an^LB{Ts5X)=Ob diff --git a/filemin/images/icons/quick/remove.png b/filemin/images/icons/quick/remove.png deleted file mode 100644 index 884d4733625f162b9d595077a21c39c9e87285a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 838 zcmV-M1G)T(P)eo}K~y-6)s<05Q(+Xx|J&W&uAeirz|?Zi7Hy`W1L-9wa21G5 zLqY68@<9Xxp@$xP351>mpL|F}g>XX7C<2K=Z4W*4;y@i(VPv|ka29P%$8L9XJ3Xj# zyWaT{K6K!`oWu9K=lg%>oU0-toP?=QgnE)-O`f<4Kp6l5z$Sn{vb+GG9DoR53&0UQ zl`2*ND4#T&?+r8N40ye!eNYA(@On+dj5#OG=AQizsE$yGDBD#;R54|-4307(Ia9=F zq>wH8mltY@NFXA?zr0X8Qpgr(iWrSDAvtBS3=&br{@DymCF_bZM_o-%EEsrf((xJ< zfZwS!zNOMjci+A527qTbt~oAnYU^oE4Fa$xC3p3ehDY5ipPm8;<)~keb}+aKAgu&Y0t+FZ z&otlCG+iP_8+o3Cl9!0l#`%_}>5$JS?{h^dgwRKy$$h8Uaru^JYMx&UDfO*J%9Ba%Y}014IThUeGlYlz7!CL4$-Lspj?JZGQGjsd{0`&~$H9>NVeK2g=%>&D*RI5dTkt{0u-Ly=ai z6tOo@w9oFQ_)Z5AF(P6V-|2|<+1(L)14UY`lIR>CBBFZvNXx+)xa6D|5(nB{Si$5R5-k Q&Hw-a07*qoM6N<$f;}>Gr~m)} diff --git a/filemin/images/icons/quick/rename.png b/filemin/images/icons/quick/rename.png deleted file mode 100644 index 190400a90ba997e8d304a8da04e85982520269be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 736 zcmV<60w4W}P)^ZESKv9U2*QIs8E-dyzr_gVAX8R;^aM2JF#xfd#Y-!+^FUBtWy- z^wHM+P;hv7c=&p)R=Wti1?)f|U5@xN?J3ieu-WjGR`C<>)gspw1}oS2xnY*|+KL+!hP z-FzI&<#IQdmzU3VdVD@#G7^cr(=_e8l#=dkg2CW+ygb=P$xPi@7D)nN0ef`tq5f!;LWrKF=)^G~101LQ7FFQ0v+@moc~=7-13SHf|0@2ykNziRma diff --git a/filemin/images/icons/quick/select-all.png b/filemin/images/icons/quick/select-all.png deleted file mode 100644 index d0562c466e86805a6f7683b21e9e60e6ad699826..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4-v_LG{Bry6=?2hS^sxF_NG|%+T@+o?KTx(9<4bA6g@9X}+@x~|r53Bd3n=SiS zOV5|#iSVwvxa~V8c{an^LB{Ts5R-kR+ diff --git a/filemin/images/icons/quick/upload.png b/filemin/images/icons/quick/upload.png deleted file mode 100644 index 210345890699d3d0efc7e3de5e4044970e38d1b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 754 zcmV z4C9%z@y{^vWb|Y_dGg@FL@F;zQe!kyUP4W=6n1uIc081}+q!K?`Wz=SpMCZ>&#ti6 z0w9D4fq>B}w$@4jVXfu$$0v_(%wJmz{P6lns*>L;JHOT*-FyB*0Qpb*&$hI?Hz$+& zNbQEsB%Yc6ares8MGpu)-Ygp_^urW0*g;(c*&;x`vFHTKB+4 zTh_}BywF3%rsufh3)a``tSlFCJ<$Uz6{TP;F{zF%@TJ_qAix;tbz2X{QZ65}v|L1_ zVYmPCOc&nydP?&w!4DmhI72_iwk;*t$XK1ZDhw8ctQ~`*k&V={t+nMVzXDK+A=p_4<+tbirS`UaQNq4Lx ztW7fa^-n~*jLBY4lI~PEN~z3EFgS{V9k)iPb$Lc-9|l-`a3^#9U_i#_)&2=3^nZ2j z+CADB24tBXI62&nj;5xA%Y$;hFew~rd-4cKTp*ICW?_1Ee6}=E%6m?pz#SuS3j|() zoL400m&o}O_$5MmKn1r~t* kKg&fc0loomthHPJ0EGcPaf*G)x&QzG07*qoM6N<$f(cttKmY&$ diff --git a/filemin/search.cgi b/filemin/search.cgi index 53bbf06ed..d83f67fd6 100755 --- a/filemin/search.cgi +++ b/filemin/search.cgi @@ -13,7 +13,6 @@ $query = $in{'query'}; $text{'search_results'} . " '" . &html_escape($query) . "'", ""); -print $head; if ($in{'caseins'}) { $criteria = '-iname'; } diff --git a/filemin/unauthenticated/css/plain.css b/filemin/unauthenticated/css/plain.css new file mode 100644 index 000000000..02a3b30e3 --- /dev/null +++ b/filemin/unauthenticated/css/plain.css @@ -0,0 +1,85 @@ +/* + * plain.css + * Layout of the File Manager for themes without Bootstrap. The toolbar, + * its menus, the dialogs and the page links are core widgets styled by + * ui-lib.css; this file only arranges them around the listing and + * styles the row action links and the permissions matrix. + */ + +/* Breadcrumbs at the left, toolbar at the right, wrapping on a narrow + * frame */ +.filemin_head { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 8px 16px; +} +.filemin_head .ui_breadcrumb { + min-width: 0; + font-size: 1.05em; +} +.filemin_toolbar { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 6px; + margin-left: auto; +} +.filemin_pager { display: flex; } +.filemin_page .total { color: var(--ui-fg-muted); } + +/* Row action links hold icons and sit side by side */ +.filemin_page .action-link { + display: inline-flex; + align-items: center; + margin-right: 4px; + color: var(--ui-fg-muted); + vertical-align: middle; +} +.filemin_page .action-link:hover { color: var(--ui-accent); } +.filemin_page td > a > img { vertical-align: middle; } + +/* Dialog forms sit flush inside the dialog body, and stay within it : + * both the theme's wrapper table and the form table take the dialog + * width with fixed columns, the label column has a set width, and the + * inputs fit the value column instead of widening the dialog */ +.filemin_page .ui_dialog_body > table.wrapper { margin: 0; } +.filemin_page .ui_dialog_body table.wrapper, +.filemin_page .ui_dialog_body table.ui_table { + width: 100%; + table-layout: fixed; +} +.filemin_page .ui_dialog_body td.ui_form_label { + width: 8.5em; + white-space: nowrap; +} +.filemin_page .ui_dialog_body td.ui_form_value select { width: 100%; } +.filemin_page .ui_dialog_body td.ui_form_value + input:not([type="checkbox"]):not([type="radio"]) { + max-width: 100%; +} + +/* The permissions matrix */ +.filemin_chmod_matrix { border-collapse: collapse; } +.filemin_chmod_matrix th, .filemin_chmod_matrix td { + padding: 2px 12px 2px 0; + text-align: left; + font-weight: normal; +} +.filemin_chmod_matrix th { font-weight: 600; } +.filemin_chmod_matrix input[type="checkbox"] { margin: 0; } + +/* The entries about to be deleted */ +.filemin_delete_items { + max-height: 180px; + margin: 8px 0; + padding: 8px 10px; + overflow: auto; + border: 1px solid var(--ui-border-soft); + background: var(--ui-surface-2); + font-family: var(--ui-font-mono); + font-size: 0.92em; + white-space: pre-wrap; + overflow-wrap: anywhere; +} diff --git a/filemin/unauthenticated/dropdown/fg.menu.css b/filemin/unauthenticated/dropdown/fg.menu.css deleted file mode 100644 index 820db38d8..000000000 --- a/filemin/unauthenticated/dropdown/fg.menu.css +++ /dev/null @@ -1,114 +0,0 @@ -/* Styles for jQuery menu widget -Author: Maggie Wachs, maggie@filamentgroup.com -Date: September 2008 -*/ - - -/* REQUIRED STYLES - the menus will only render correctly with these rules */ - -.fg-menu-container { position: absolute; top:0; left:-999px; padding: .4em; overflow: hidden; } -.fg-menu-container.fg-menu-flyout { overflow: visible; } - -.fg-menu, .fg-menu ul { list-style-type:none; padding: 0; margin:0; } - -.fg-menu { position:relative; } -.fg-menu-flyout .fg-menu { position:static; } - -.fg-menu ul { position:absolute; top:0; } -.fg-menu ul ul { top:-1px; } - -.fg-menu-container.fg-menu-ipod .fg-menu-content, -.fg-menu-container.fg-menu-ipod .fg-menu-content ul { background: none !important; } - -.fg-menu.fg-menu-scroll, -.fg-menu ul.fg-menu-scroll { overflow: scroll; overflow-x: hidden; } - -.fg-menu li { clear:both; float:left; width:100%; margin: 0; padding:0; border: 0; } -.fg-menu li li { font-size:1em; } /* inner li font size must be reset so that they don't blow up */ - -.fg-menu-flyout ul ul { padding: .4em; } -.fg-menu-flyout li { position:relative; } - -.fg-menu-scroll { overflow: scroll; overflow-x: hidden; } - -.fg-menu-breadcrumb { margin: 0; padding: 0; } - -.fg-menu-footer { margin-top: .4em; padding: .4em; } -.fg-menu-header { margin-bottom: .4em; padding: .4em; } - -.fg-menu-breadcrumb li { float: left; list-style: none; margin: 0; padding: 0 .2em; font-size: .9em; opacity: .7; } -.fg-menu-breadcrumb li.fg-menu-prev-list, -.fg-menu-breadcrumb li.fg-menu-current-crumb { clear: left; float: none; opacity: 1; } -.fg-menu-breadcrumb li.fg-menu-current-crumb { padding-top: .2em; } - -.fg-menu-breadcrumb a, -.fg-menu-breadcrumb span { float: left; } - -.fg-menu-footer a:link, -.fg-menu-footer a:visited { float:left; width:100%; text-decoration: none; } -.fg-menu-footer a:hover, -.fg-menu-footer a:active { } - -.fg-menu-footer a span { float:left; cursor: pointer; } - -.fg-menu-breadcrumb .fg-menu-prev-list a:link, -.fg-menu-breadcrumb .fg-menu-prev-list a:visited, -.fg-menu-breadcrumb .fg-menu-prev-list a:hover, -.fg-menu-breadcrumb .fg-menu-prev-list a:active { background-image: none; text-decoration:none; } - -.fg-menu-breadcrumb .fg-menu-prev-list a { float: left; padding-right: .4em; } -.fg-menu-breadcrumb .fg-menu-prev-list a .ui-icon { float: left; } - -.fg-menu-breadcrumb .fg-menu-current-crumb a:link, -.fg-menu-breadcrumb .fg-menu-current-crumb a:visited, -.fg-menu-breadcrumb .fg-menu-current-crumb a:hover, -.fg-menu-breadcrumb .fg-menu-current-crumb a:active { display:block; background-image:none; font-size:1.3em; text-decoration:none; } - - - -/* REQUIRED LINK STYLES: links are "display:block" by default; if the menu options are split into - selectable node links and 'next' links, the script floats the node links left and floats the 'next' links to the right */ - -.fg-menu a:link, -.fg-menu a:visited, -.fg-menu a:hover, -.fg-menu a:active { float:left; width:92%; padding:.3em 3%; text-decoration:none; outline: 0 !important; } - -.fg-menu a { border: 1px dashed transparent; } - -.fg-menu a.ui-state-default:link, -.fg-menu a.ui-state-default:visited, -.fg-menu a.ui-state-default:hover, -.fg-menu a.ui-state-default:active, -.fg-menu a.ui-state-hover:link, -.fg-menu a.ui-state-hover:visited, -.fg-menu a.ui-state-hover:hover, -.fg-menu a.ui-state-hover:active, - .fg-menu a.ui-state-active:link, - .fg-menu a.ui-state-active:visited, - .fg-menu a.ui-state-active:hover, -.fg-menu a.ui-state-active:active { border-style: solid; font-weight: normal; } - -.fg-menu a span { display:block; cursor:pointer; } - - - /* SUGGESTED STYLES - for use with jQuery UI Themeroller CSS */ - -.fg-menu-indicator span { float:left; } -.fg-menu-indicator span.ui-icon { float:right; } - -.fg-menu-content.ui-widget-content, -.fg-menu-content ul.ui-widget-content { border:0; } - - -/* ICONS AND DIVIDERS */ - -.fg-menu.fg-menu-has-icons a:link, -.fg-menu.fg-menu-has-icons a:visited, -.fg-menu.fg-menu-has-icons a:hover, -.fg-menu.fg-menu-has-icons a:active { padding-left:20px; } - -.fg-menu .horizontal-divider hr, .fg-menu .horizontal-divider span { padding:0; margin:5px .6em; } -.fg-menu .horizontal-divider hr { border:0; height:1px; } -.fg-menu .horizontal-divider span { font-size:.9em; text-transform: uppercase; padding-left:.2em; } - diff --git a/filemin/unauthenticated/dropdown/fg.menu.js b/filemin/unauthenticated/dropdown/fg.menu.js deleted file mode 100644 index 1edcce0d5..000000000 --- a/filemin/unauthenticated/dropdown/fg.menu.js +++ /dev/null @@ -1,648 +0,0 @@ -/*-------------------------------------------------------------------- -Scripts for creating and manipulating custom menus based on standard