Provides the ability to add file manager (Finder) type highlighting to all elements based on the standard single click, command+click/ctrl+click, command+drag/ctrl+drag, command+A/ctrl+A and shift+click methods. This plugin will by default add a `selected` class to all clicked elements.
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery.finderselect/0.6.0/jquery.finderselect.min.js"></script>
<script src="//oss.maxcdn.com/libs/jquery.finderselect/0.6.0/jquery.finderselect.min.js"></script>
This complex demo shows how finderSelect can be used to create a nested file structure.
Images | ||
Icons | ||
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM |
$(function() { var demo11 = $('#demo11').finderSelect({children:"tr.expanded"}); var activeSegments = [""]; function expandActive(els) { els.each(function() { var el = $(this); var segments = el.attr('data-path').split("/"); segments.pop(); var padding = (segments.length - 1) * 20; if($.inArray(segments.join("/"), activeSegments) > -1) { el.find('td').first().css('padding-left',padding); el.removeClass('hidden') el.addClass('expanded'); } else { el.addClass('hidden'); el.removeClass('expanded'); } }); } expandActive($('#demo11').find('tr')); $( "#demo11").find("tr.folder").dblclick(function() { if($.inArray($(this).attr('data-path'), activeSegments) > -1) { for(var i = activeSegments.length - 1; i >= 0; i--) { if(startsWith(activeSegments[i], $(this).attr('data-path'))) { activeSegments.splice(i, 1); } } $(this).find('.icon-folder-open').removeClass('icon-folder-open').addClass('icon-folder-close'); $(this).find('.icon-angle-down').removeClass('icon-angle-down').addClass('icon-angle-right'); } else { activeSegments.push($(this).attr('data-path')); $(this).find('.icon-folder-close').removeClass('icon-folder-close').addClass('icon-folder-open'); $(this).find('.icon-angle-right').removeClass('icon-angle-right').addClass('icon-angle-down'); } expandActive($('#demo11').find('tr')); }); });
This complex demo shows how finderSelect can be used to create a file browser powered by an external service such as the Github API in the below example.
$(function() { var demo10 = $('#demo10').finderSelect({children:"tr.expanded"}); var demo10BaseUrl = 'https://api.github.com/repos/jquery/jquery/contents/'; var baseDir = "/"; var gitHubLoaded = [""]; function reloadGithub(els) { els.each(function() { var el = $(this); var segments = el.attr('data-path').split("/"); segments.pop(); var padding = (segments.length - 1) * 20; if($.inArray(segments.join("/"), gitHubLoaded) > -1) { el.find('td').first().css('padding-left',padding); el.removeClass('hidden') el.addClass('expanded'); } else { el.remove(); } }); } $.getJSON(demo10BaseUrl ,function(result){ $.each(result, function(i, field){ if(field.type == 'dir') { $('#demo10').append('<tr data-path="'+baseDir + field.path+'" class="folder">' + '<td colspan="3">'+ ' <i class="icon-angle-right icon-fixed-width"></i> ' + '<i class="icon-folder-close icon-fixed-width"></i>' + field.name + '</td></tr>'); } else { $('#demo10').append('<tr data-path="'+baseDir + field.path+'" class="file" data-url="http://upload.wikimedia.org/wikipedia/en/d/d0/Hello.png">' + '<td><i class="icon-fixed-width icon-none"></i> <i class="icon-file icon-fixed-width"></i> '+field.name+'</td>' + '<td>'+ field.sha +'</td>' + '<td>'+ field.size + '</td>' + '</tr>'); } }); }); reloadGithub($('#demo10').find('tr')); $( "#demo10" ).on( "dblclick", "tr.folder", function() { var clicked = $(this); if($.inArray($(this).attr('data-path'), gitHubLoaded) > -1) { for(var i = gitHubLoaded.length - 1; i >= 0; i--) { if(startsWith(gitHubLoaded[i], $(this).attr('data-path'))) { gitHubLoaded.splice(i, 1); } } $(this).find('.icon-folder-open').removeClass('icon-folder-open').addClass('icon-folder-close'); $(this).find('.icon-angle-down').removeClass('icon-angle-down').addClass('icon-angle-right'); reloadGithub($('#demo10').find('tr')); } else { $.getJSON(demo10BaseUrl+$(this).attr('data-path') ,function(result){ $.each(result, function(i, field){ if(field.type == 'dir') { clicked.after('<tr data-path="'+baseDir + field.path+'" class="folder">' + '<td colspan="3">'+ ' <i class="icon-angle-right icon-fixed-width"></i> ' + '<i class="icon-folder-close icon-fixed-width"></i>' + field.name + '</td></tr>'); } else { clicked.after('<tr data-path="'+baseDir + field.path+'" class="file" data-url="http://upload.wikimedia.org/wikipedia/en/d/d0/Hello.png">' + '<td><i class="icon-fixed-width icon-none"></i> <i class="icon-file icon-fixed-width"></i> '+field.name+'</td>' + '<td>'+ field.sha +'</td>' + '<td>'+ field.size + '</td>' + '</tr>'); } }); }).success(function() { reloadGithub($('#demo10').find('tr')); }); gitHubLoaded.push($(this).attr('data-path')); $(this).find('.icon-folder-close').removeClass('icon-folder-close').addClass('icon-folder-open'); $(this).find('.icon-angle-right').removeClass('icon-angle-right').addClass('icon-angle-down'); } }); });
This advanced demo shows how finderSelect can be used as a component to create a file explorer. Make sure to try Ctrl/Cmd+Click, Ctrl+A/Cmd+A & Ctrl+Alt+A/Cmd+Opt+A (Activates only when cursor is over table), Shift+Click, Ctrl/Cmd+Click&Drag and Right Click on the table after you have made a selection.
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM | |
hello.png | Portable Networks Graphic image | Friday, 24 July 2013 4:59PM |
$(function() { var demo1 = $('#demo1').finderSelect({children:"tr",totalSelector:".demo1-count",menuSelector:"#demo1-menu"}); $(".demo1-trash").click(function(){ demo1.finderSelect("selected").remove(); demo1.finderSelect("update"); }); // Opens Preview in Window. Opens with browser only. (There is a 90% chance a popup blocker will stop multiple windows. Working on a better solution) $(".demo1-preview").click(function(){ demo1.finderSelect("selected").each(function(index){ OpenInNewTab($(this).attr('data-url')); }); }); // Opens Edit in Window. Opens using Web Based Pixlr editor. (There is a 90% chance a popup blocker will stop multiple windows. Working on a better solution) $(".demo1-edit").click(function(){ demo1.finderSelect("selected").each(function(){ OpenInNewTab('http://pixlr.com/editor/?image='+$(this).attr('data-url')); }); }); });
finderSelect was design to be easily extended. See the example below to see how the highlighting functions can be overridden to provide new functionality.
$(function() { // Initialise the Demo with the Ctrl Click Functionality as the Default var demo5 = $('#demo5 tbody').finderSelect({enableDesktopCtrlDefault:true}); // Add a hook to the highlight function so that checkboxes in the selection are also checked. demo5.finderSelect('addHook','highlight:before', function(el) { el.find('input').prop('checked', true); }); // Add a hook to the unHighlight function so that checkboxes in the selection are also unchecked. demo5.finderSelect('addHook','unHighlight:before', function(el) { el.find('input').prop('checked', false); }); // Enable Double Click Event. demo5.finderSelect("children").dblclick(function() { alert( "Double Click detected. Useful for linking to detail page." ); }); // Prevent Checkboxes from being triggered twice when click on directly. demo5.on("click", ":checkbox", function(e){ e.preventDefault(); }); // Add Select All functionality to the checkbox in the table header row. $('#demo5').find("thead input[type='checkbox']").change(function () { if ($(this).is(':checked')) { demo5.finderSelect('highlightAll'); } else { demo5.finderSelect('unHighlightAll'); } }); // Add a Safe Zone to show not all child elements have to be active. $(".safezone").on("mousedown", function(e){ return false; }); });
To enable selecting on only tbody rows simply call
# | First Name | Last Name | Username |
---|---|---|---|
1 | Test | Data | Set |
2 | Test | Data | Set |
3 | Test | Data | Set |
4 | Test | Data | Set |
5 | Test | Data | Set |
$(function() { $('#demo2').find('tbody').finderSelect(); });
If you want to use a custom class for highlighting such as using Twitter Bootstrap
# | First Name | Last Name | Username |
---|---|---|---|
1 | Test | Data | Set |
2 | Test | Data | Set |
3 | Test | Data | Set |
4 | Test | Data | Set |
5 | Test | Data | Set |
$(function() { $('#demo3').find('tbody').finderSelect({selectClass:'danger'}); });
This plugin works on all nested elements. The example below shows span tags within a parent div.
$(function() { $('#demo4').finderSelect({selectClass:'label-success'}); });
The following configuration options are available.
Name | Type | Description | Default |
---|---|---|---|
selectClass | string | The Class applied to selected elements. | "selected" |
unSelectClass | string | The Class applied to un-selected elements. | "un-selected" |
currentClass | string | The Class applied to the current selected element. | "selected-current" |
lastClass | string | The Class applied to the last selected element. | "selected-last" |
shiftClass | string | The Class applied to the last shift selected element. | "selected-shift" |
ctrlClass | string | The Class applied to the last ctrl selected element. | "selected-ctrl" |
triggerUpdate | string | The Event omitted whenever finderSelect is updated. | "finderSelectUpdate" |
children | selector string | Manually set the child element selector. Eg "li" for list elements | "selected" |
event | event string | The Event which triggers a selection. | "mousedown" |
cursor | css string | The cursor applied to the finderSelect element | "pointer" |
dragEvent | string | The Event which triggers a drag selection. | "mouseenter" |
enableClickDrag | boolean | Enable/Disable Ctrl + Click + Drag. | true |
enableShiftClick | boolean | Enable/Disable Shift + Click bulk selection. | true |
enableCtrlClick | boolean | Enable/Disable Ctrl + Click Toggle Click. | true |
enableSingleClick | boolean | Enable/Disable The standard Single Click. | true |
enableSelectAll | boolean | Enable/Disable Select All Keyboard Shortcuts. | true |
enableDisableSelection | boolean | Enable/Disable Disabling Text Selection when needed. | true |
enableTouchCtrlDefault | boolean | Enable/Disable Ctrl + Click as the default on touch devices. | true |
enableDesktopCtrlDefault | boolean | Enable/Disable Ctrl + Click as the default. | false |
totalSelector | selector string | The Selector used to update row counts. eg ".demo-count" | false |
menuSelector | string | The Selector used to show the menu elemenet. eg "#demo-menu" | false |
menuXOffset | integer | The X Offset for the menu element | 0 |
menuYOffset | integer | The Y Offset for the menu element | 0 |
The following methods are available.
Name | Parameters | Description | Usage |
---|---|---|---|
highlight | element | Highlights elements | $('#demo').finderSelect('highlight', $('ul')); |
unHighlight | - | UnHighlights elements | $('#demo').finderSelect('unHighlight', $('ul')); |
highlightAll | - | Highlights all child elements. | $('#demo').finderSelect('highlightAll'); |
unHighlightAll | - | UnHighlights all child elements | $('#demo').finderSelect('unHighlightAll'); |
selected | - | Returns all the selected elements. | $('#demo').finderSelect('selected'); |
children | - | Returns all the child elements | $('#demo').finderSelect('children'); |
update | - | Forces an update on element. Useful for when dom changes occur outside finderSelect. | $('#demo').finderSelect('update'); |
addHook | hook, function | Adds a hook to the finderSelect instance. Allows multiple assignment. | $('#demo').finderSelect('addHook','unHighlight:before', function() { /* do something */ }); |
The following hooks are available.
Name | Parameters | Description | Usage |
---|---|---|---|
highlight:before | element, options | Called before the Highlight event | $('#demo').finderSelect('addHook','highlight:before', function(element, options) { /* do something */ }); |
highlight:after | element, options | Called after the Highlight event | $('#demo').finderSelect('addHook','highlight:after', function(element, options) { /* do something */ }); |
unHighlight:before | element, options | Called before the unHighlight event | $('#demo').finderSelect('addHook','unHighlight:before', function(element, options) { /* do something */ }); |
unHighlight:after | element, options | Called after the unHighlight event | $('#demo').finderSelect('addHook','unHighlight:after', function(element, options) { /* do something */ }); |
© Michael Angell 2013