File Browser Widget

filebrowser.htm (hint: right click, save as)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<!--
  Test/Development/Documentation page
  - enable web server file access
  - upload to web file path, e.g. /sd/dev/filebrowser.htm
  - open in framework by e.g. http://test1.local/#/dev/filebrowser.htm
-->

<style>
/* Note: set height or min-height on the filebrowser tbody.
   Default height by class "filebrowser" is 310px (each file row has a height of 31px with the default font size) */
#myfilebrowser tbody {
  height: 35vh;
}
</style>

<div class="panel panel-primary">
  <div class="panel-heading">FileBrowser Test/Demo</div>
  <div class="panel-body">
    
    <div class="filebrowser" id="myfilebrowser" />
    
    <hr/>
    <pre id="log"/>
    <button type="button" class="btn btn-default" id="action-setpath">Set path to /sd/logs/log</button>
    <button type="button" class="btn btn-default" id="action-stopload">Stop loading dir</button>
    <button type="button" class="btn btn-default" id="action-filteron">Filter *.zip</button>
    <button type="button" class="btn btn-default" id="action-filteroff">Filter off</button>
    <button type="button" class="btn btn-default" id="action-sortoff">Sort off</button>
    <p>Note: the test widget is configured to stop/inhibit loading on selection of a ".txt" file or a directory matching "DCIM".</p>
  </div>
</div>

<script>

// =======================================================================================
// FileBrowser Widget:
// 
// Test/demo of init with all options.
// Note: you can init a filebrowser without any options.
// Defaults are path & quicknav as shown below, no sorting, no callbacks.
// 
// The input object passed to all callbacks contains these fields:
//  - path          -- the full path (dir + "/" + file)
//  - file          -- the file part of the currently selected path
//  - dir           -- the directory part of the currently selected path
//  - noload        -- set to true to inhibit directory loading (see onPathChange)
// 
// Note: path, file & dir are unvalidated user input.
// 
// Note on sorting: disabling initial sorting improves user interaction while loading the
//  directory, i.e. to select files/dirs while the loader is running. This may
//  be an option especially for large directories. The user can still sort manually.
// 
// Methods:
//  - getInput()                  -- retrieve input object
//  - setPath(newpath, reload)    -- add trailing slash to enter dir w/o file selection
//  - sortList(by, dir)           -- sort file list
//  - loadDir()                   -- trigger directory reload
//  - stopLoad()                  -- abort directory loading
//  - newDir()                    -- open create directory sub dialog
// 

$('#myfilebrowser').filebrowser({
  path: '/sd/',
  quicknav: ['/sd/', '/store/'],
  filter: null,       // see Filter examples below
  sortBy: "name",     // …or "size" or "date" or null (disable)
  sortDir: 1,         // …or -1 for reverse
  onUpdate: function(input) {
    // This is called after any widget configuration update, use for custom extensions.
    $('#log').append('onUpdate: ' + JSON.stringify(input) + '\n');
  },
  onPathChange: function(input) {
    // Called whenever the path changes.
    $('#log').append('onPathChange: ' + JSON.stringify(input) + '\n');
    // To inhibit loading the directory for the new path, set input.noload to true:
    if (input.dir.indexOf("DCIM") >= 0 || input.file.indexOf('.txt') >= 0) {
      $('#log').append('inhibiting directory loading\n');
      input.noload = true;
    }
  },
  onAction: function(input) {
    // This is called when the user doubleclicks an entry or presses Enter in a directory:
    $('#log').append('onAction: ' + JSON.stringify(input) + '\n');
  },
});

$('#action-setpath').on('click', function(ev) {
  $('#myfilebrowser').filebrowser('setPath', '/sd/logs/log', true);
});
$('#action-stopload').on('click', function(ev) {
  $('#myfilebrowser').filebrowser('stopLoad');
});
$('#action-sortoff').on('click', function(ev) {
  $('#myfilebrowser').filebrowser('sortList', '');
});

// Filter example:
$('#action-filteron').on('click', function(ev) {
  $('#myfilebrowser').filebrowser({
    // The list filter may be given as a string (regular expression applied to file name):
    filter: "\\.zip$",
    // A string filter always lists directories.
    
    // For advanced usage, you may alternatively specify a filter callback like this:
    //  filter: function(f) { return f.isdir || f.name.match("\\.zip$"); }
    // The function is called per list entry object with…
    // - isdir: true = is sub directory
    // - name: the name part (file or directory, dir with trailing '/')
    // - path: the full path of this entry
    // - size: formatted size ('6.8k')
    // - date: formatted date ('23-Nov-2018 17:42')
    // - bytes: size in bytes, -1 for directories
    // - isodate: ISO style date 'YYYY-mm-dd HH:MM'
    // - class: '', can be used to add a custom row class
    // Return true to allow the entry to be added to the list.
    
    // Note: list filters do not restrict the allowed path input. To do so,
    // register onPathChange or onAction and check the input in your callback.
    // See FileDialog widget "select" option handling for an example.
  });
});
$('#action-filteroff').on('click', function(ev) {
  $('#myfilebrowser').filebrowser({
    filter: null
  });
});

</script>