/* This examples shows how to do file selection — usually for upload — in Ox.UI. */ 'use strict'; /* Load the `UI` module. */ Ox.load('UI', function() { var $elements = [ /* Ox.FileButton has the following options:
            disabled
                If true, the button is disabled
            image
                Symbol name (if type is 'image'),
                default is 'file' or 'files'
                (depending on maxFiles)
            maxFiles
                Maximum number of files,
                default is -1 (unlimited)
            maxSize
                Maximum total size in bytes,
                default is -1 (unlimited)
            title
                Button title (if type is 'text')
                and tooltip text
            type
                Type, either 'text' or 'image',
                default is 'text'
            width
                Width in px (if type is 'text')
            
Ox.FileButton fires a `click` event (not on click, like Ox.Button, but once the user has selected one or more files) that we can bind to like this:
            $fileButton.bindEvent({
                click: function(data) {
                    // Print array of files
                    Ox.print(data.files);
                }
            });
            
We create two image buttons and two text buttons: one of each to select a single file, one for multiple files. */ Ox.FileButton({ maxFiles: 1, title: 'Select File...', type: 'image' }), Ox.FileButton({ title: 'Select Files...', type: 'image' }), Ox.FileButton({ maxFiles: 1, title: 'Select File...', width: 128 }), Ox.FileButton({ title: 'Select Files...', width: 128 }), /* Ox.FileInput is a form element, so it has a value option and fires a `change` event. Its other options are similar to Ox.FileButton, without `image`, `title` and `type`, and we can bind to its `change` event like this:
            $fileInput.bindEvent({
                change: function(data) {
                    // Print array of files
                    Ox.print(data.value);
                }
            });
            
Again, we create one input to select a single file and one for multiple files. */ Ox.FileInput({ maxFiles: 1, maxSize: 1000000, width: 256 }), Ox.FileInput({ maxSize: 1000000, width: 256 }) ], /* File selection also works from a menu. A basic menu item looks like `{id: 'id', title: 'Title'}`, and its `click` event fires on click. By adding a `file` property (which takes the same `maxFiles`, `maxSize` and `width` options as Ox.FileButton), we enable file selection, and the `click` event now fires once one or more files are selected. We can bind to it like this:
        $mainMenu.bindEvent({
            click: function(data) {
                if (data.id == 'foo') {
                    // Print array of files
                    Ox.print(data.files);
                }
            }
        });
        
Note that keyboard navigation works as well. Just like any other menu item, it can be activated by pressing `enter`, which opens the file selection dialog. */ $menu = Ox.MainMenu({ menus: [ {id: 'file', title: 'File', items: [ {id: 'file', title: 'Select File...', file: { maxFiles: 1, width: 80 }}, {id: 'files', title: 'Select Files...', file: { width: 80 }}, {id: 'disabled', title: 'Disabled', file: { width: 80 }, disabled: true} ]} ] }) /* On click, we display the event data and open a dialog. */ .bindEvent({ click: function(data) { showEvent(data); openDialog(data); } }), /* This is a container for our buttons and inputs. */ $main = Ox.Element(), /* This is the list that will display the event data. */ $list = Ox.TreeList({ data: {}, expanded: true, width: 256 }), /* They both share a panel. */ $innerPanel = Ox.SplitPanel({ elements: [ {element: $main}, {element: $list, resizable: true, resize: [256], size: 256} ], orientation: 'horizontal' }), /* Menu and inner panel go into the outer panel. */ $outerPanel = Ox.SplitPanel({ elements: [ {element: $menu, size: 20}, {element: $innerPanel} ], orientation: 'vertical' }) .appendTo(Ox.$body); /* Here, we append the buttons and inputs to the container. For each element, we add an event handler (`click` event for buttons, `change` event for inputs) to display the event data. */ $elements.forEach(function($element, i) { $element .css({top: 16 + 32 * i + 'px'}) .bindEvent( $element.is('.OxFileButton') ? 'click' : 'change', showEvent ) .appendTo($main); }); /* When the user selects one or more files via the menu, we open a dialog. This dialog contains an Ox.FileInput that is populated with the selected file(s). */ function openDialog(data) { var $button = Ox.Button({ id: 'close', title: 'Close' }) .bindEvent({ click: function() { $dialog.close(); } }), $content = Ox.Element().css(getContentCSS(data)), $input = Ox.FileInput({ maxFiles: data.id == 'file' ? 1 : -1, value: data.files, width: 256 }) .css({top: '16px', marginBottom: '16px'}) .bindEvent({ change: function(data) { showEvent(data); $content.css(getContentCSS(data)); } }) .appendTo($content), $dialog = Ox.Dialog({ buttons: [$button], content: $content, height: 129, keys: {escape: 'close'}, title: data.title.replace('...', ''), width: 288 + (data.id == 'file' ? 0 : Ox.UI.SCROLLBAR_SIZE) }) .open(); function getContentCSS(data) { return {height: 49 + (data.files || data.value).length * 16 + 'px'}; } } /* Whenever any of our FileButtons fires a `click` event, or any of our FileInputs fires a `change` event, we display the event data. Note that we have to transform the file object to a regular object before we can pass it to the list. */ function showEvent(data) { var key = data.files ? 'files' : 'value'; data[key] = data[key].map(function(file) { var object = {}; Object.keys(file).forEach(function(key) { object[key] = file[key]; }); return object; }); $list.options({data: data}); } });