define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle', 'emby-button'], function(loading, dialogHelper, dom) { 'use strict'; function getSystemInfo() { return systemInfo ? Promise.resolve(systemInfo) : ApiClient.getPublicSystemInfo().then( function(info) { systemInfo = info; return info; } ) } function onDialogClosed() { loading.hide() } function refreshDirectoryBrowser(page, path, fileOptions, updatePathOnError) { if (path && typeof path !== 'string') { throw new Error("invalid path"); } loading.show(); var promises = []; if ("Network" === path) { 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] || ""; var html = ""; page.querySelector(".results").scrollTop = 0; page.querySelector("#txtDirectoryPickerPath").value = path || ""; if (path) { html += getItem("lnkPath lnkDirectory", "", parentPath, "..."); } for (var i = 0, length = folders.length; i < length; i++) { var folder = folders[i]; var cssClass = "File" === folder.Type ? "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; loading.hide(); }, function() { if (updatePathOnError) { page.querySelector("#txtDirectoryPickerPath").value = ""; page.querySelector(".results").innerHTML = ""; loading.hide(); } } ); } 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 ("bsd" === systemInfo.OperatingSystem.toLowerCase()) { html += "
"; html += "
"; html += Globalize.translate("MessageDirectoryPickerBSDInstruction"); html += "
"; } else if ("linux" === systemInfo.OperatingSystem.toLowerCase()) { html += "
"; html += "
"; html += Globalize.translate("MessageDirectoryPickerLinuxInstruction"); html += "
"; } html += "
" } html += '
'; html += '
'; html += '
'; var labelKey; if (options.includeFiles !== true) { labelKey = "LabelFolder"; } else { labelKey = "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 alertText(text) { alertTextWithOptions({ text: text }) } function alertTextWithOptions(options) { require(["alert"], function(alert) { alert(options) }) } function validatePath(path, validateWriteable, apiClient) { return apiClient.ajax({ type: "POST", url: apiClient.getUrl("Environment/ValidatePath"), data: { ValidateWriteable: validateWriteable, Path: path } }).catch(function(response) { if (response) { // TODO All alerts (across the project), should use Globalize.translate() if (response.status === 404) { alertText("The path could not be found. Please ensure the path is valid and try again."); return Promise.reject(); } if (response.status === 500) { if (validateWriteable) { alertText("Jellyfin Server requires write access to this folder. Please ensure write access and try again."); } else { alertText("The path could not be found. Please ensure the path is valid and try again.") } return Promise.reject() } } return Promise.resolve() }); } 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, true) }; } }); content.addEventListener("click", function(e) { if (dom.parentWithClass(e.target, "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" === txtDirectoryPickerPath.id) { 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; var path = this.querySelector("#txtDirectoryPickerPath").value; validatePath(path, options.validateWriteable, ApiClient).then(options.callback(path, networkSharePath)); } e.preventDefault(); e.stopPropagation(); return false; }); } function getDefaultPath(options) { if (options.path) { Promise.resolve(options.path); } else { ApiClient.getJSON(ApiClient.getUrl("Environment/DefaultDirectoryBrowser")).then( function(result) { return result.Path || ""; }, function() { return ""; } ); } } function directoryBrowser() { var currentDialog; var self = this; 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; dlg.querySelector("#txtDirectoryPickerPath").value = initialPath; var txtNetworkPath = dlg.querySelector("#txtNetworkPath"); if (txtNetworkPath) { txtNetworkPath.value = options.networkSharePath || ""; } if (!options.pathReadOnly) { refreshDirectoryBrowser(dlg, initialPath, fileOptions, true); } } ); }; self.close = function() { if (currentDialog) { dialogHelper.close(currentDialog); } } } var systemInfo; return directoryBrowser });