define(['dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'emby-button', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle'], function (dialogHelper, dom) { var systemInfo; function getSystemInfo() { var deferred = jQuery.Deferred(); if (systemInfo) { deferred.resolveWith(null, [systemInfo]); } else { ApiClient.getPublicSystemInfo().then(function (info) { systemInfo = info; deferred.resolveWith(null, [systemInfo]); }); } return deferred.promise(); } function onDialogClosed() { Dashboard.hideLoadingMsg(); } function refreshDirectoryBrowser(page, path, fileOptions) { if (path && typeof (path) !== 'string') { throw new Error('invalid path'); } Dashboard.showLoadingMsg(); var promises = []; if (path === "Network") { promises.push(ApiClient.getNetworkDevices()); } else if (path) { promises.push(ApiClient.getDirectoryContents(path, fileOptions)); promises.push(ApiClient.getParentPath(path)); } else { promises.push(ApiClient.getDrives()); } Promise.all(promises).then(function (responses) { var folders = responses[0]; var parentPath = responses[1] || ''; page.querySelector('#txtDirectoryPickerPath').value = path || ""; var html = ''; if (path) { html += getItem("lnkPath lnkDirectory", "", parentPath, '...'); } for (var i = 0, length = folders.length; i < length; i++) { var folder = folders[i]; var cssClass = folder.Type == "File" ? "lnkPath lnkFile" : "lnkPath lnkDirectory"; html += getItem(cssClass, folder.Type, folder.Path, folder.Name); } if (!path) { html += getItem("lnkPath lnkDirectory", "", "Network", Globalize.translate('ButtonNetwork')); } page.querySelector('.results').innerHTML = html; Dashboard.hideLoadingMsg(); }, function () { page.querySelector('#txtDirectoryPickerPath').value = ""; page.querySelector('.results').innerHTML = ''; Dashboard.hideLoadingMsg(); }); } function getItem(cssClass, type, path, name) { var html = ''; html += '
'; html += '
'; html += '
'; html += name; html += '
'; html += '
'; html += 'arrow_forward'; html += '
'; return html; } function getEditorHtml(options, systemInfo) { var html = ''; html += '
'; html += '
'; if (!options.pathReadOnly) { var instruction = options.instruction ? options.instruction + '

' : ''; html += '
'; html += instruction; html += Globalize.translate('MessageDirectoryPickerInstruction') .replace('{0}', '\\\\server') .replace('{1}', '\\\\192.168.1.101'); if (systemInfo.OperatingSystem.toLowerCase() == 'bsd') { html += '
'; html += '
'; html += Globalize.translate('MessageDirectoryPickerBSDInstruction'); html += '
'; html += '' + Globalize.translate('ButtonMoreInformation') + ''; } else if (systemInfo.OperatingSystem.toLowerCase() == 'linux') { html += '
'; html += '
'; html += Globalize.translate('MessageDirectoryPickerLinuxInstruction'); html += '
'; } html += '
'; } html += '
'; html += '
'; html += '
'; var labelKey = options.includeFiles !== true ? 'LabelFolder' : 'LabelPath'; var readOnlyAttribute = options.pathReadOnly ? ' readonly' : ''; html += ''; html += '
'; if (!readOnlyAttribute) { html += ''; } html += '
'; if (!readOnlyAttribute) { html += '
'; } if (options.enableNetworkSharePath) { html += '
'; html += ''; html += '
'; html += Globalize.translate('LabelOptionalNetworkPathHelp'); html += '
'; html += '
'; } html += '
'; html += ''; html += '
'; html += '
'; html += '
'; html += '
'; html += ''; return html; } function initEditor(content, options, fileOptions) { content.addEventListener("click", function (e) { var lnkPath = dom.parentWithClass(e.target, 'lnkPath'); if (lnkPath) { var path = lnkPath.getAttribute('data-path'); if (lnkPath.classList.contains('lnkFile')) { content.querySelector('#txtDirectoryPickerPath').value = path; } else { refreshDirectoryBrowser(content, path, fileOptions); } } }); content.addEventListener("click", function (e) { var btnRefreshDirectories = dom.parentWithClass(e.target, 'btnRefreshDirectories'); if (btnRefreshDirectories) { var path = content.querySelector('#txtDirectoryPickerPath').value; refreshDirectoryBrowser(content, path, fileOptions); } }); content.addEventListener("change", function (e) { var txtDirectoryPickerPath = dom.parentWithTag(e.target, 'INPUT'); if (txtDirectoryPickerPath && txtDirectoryPickerPath.id == 'txtDirectoryPickerPath') { refreshDirectoryBrowser(content, txtDirectoryPickerPath.value, fileOptions); } }); content.querySelector('form').addEventListener('submit', function (e) { if (options.callback) { var networkSharePath = this.querySelector('#txtNetworkPath'); networkSharePath = networkSharePath ? networkSharePath.value : null; options.callback(this.querySelector('#txtDirectoryPickerPath').value, networkSharePath); } e.preventDefault(); e.stopPropagation(); return false; }); } function getDefaultPath(options) { if (options.path) { return Promise.resolve(options.path); } return ApiClient.getJSON(ApiClient.getUrl("Environment/DefaultDirectoryBrowser")).then(function (result) { return result.Path || ''; }, function () { return ''; }); } function directoryBrowser() { var self = this; var currentDialog; self.show = function (options) { options = options || {}; var fileOptions = { includeDirectories: true }; if (options.includeDirectories != null) { fileOptions.includeDirectories = options.includeDirectories; } if (options.includeFiles != null) { fileOptions.includeFiles = options.includeFiles; } Promise.all([getSystemInfo(), getDefaultPath(options)]).then(function (responses) { var systemInfo = responses[0]; var initialPath = responses[1]; var dlg = dialogHelper.createDialog({ size: 'medium-tall', removeOnClose: true, scrollY: false }); dlg.classList.add('ui-body-a'); dlg.classList.add('background-theme-a'); dlg.classList.add('directoryPicker'); dlg.classList.add('formDialog'); var html = ''; html += '
'; html += ''; html += '

'; html += options.header || Globalize.translate('HeaderSelectPath'); html += '

'; html += '
'; html += getEditorHtml(options, systemInfo); dlg.innerHTML = html; initEditor(dlg, options, fileOptions); dlg.addEventListener('close', onDialogClosed); dialogHelper.open(dlg); dlg.querySelector('.btnCloseDialog').addEventListener('click', function () { dialogHelper.close(dlg); }); currentDialog = dlg; var txtCurrentPath = dlg.querySelector('#txtDirectoryPickerPath'); txtCurrentPath.value = initialPath; var txtNetworkPath = dlg.querySelector('#txtNetworkPath'); if (txtNetworkPath) { txtNetworkPath.value = options.networkSharePath || ''; } if (!options.pathReadOnly) { refreshDirectoryBrowser(dlg, txtCurrentPath.value); } }); }; self.close = function () { if (currentDialog) { dialogHelper.close(currentDialog); } }; } return directoryBrowser; });