1 line
No EOL
12 KiB
JavaScript
1 line
No EOL
12 KiB
JavaScript
import connectionManager from"./../emby-apiclient/connectionmanager.js";import globalize from"./../common/globalize.js";import layoutManager from"./../layoutmanager.js";import focusManager from"./../focusmanager.js";import loading from"./../loading/loading.js";import"./../emby-elements/emby-scroller/emby-scroller.js";import"./../emby-elements/emby-input/emby-input.js";import listView from"./../listview/listview.js";import"./../emby-elements/emby-button/paper-icon-button-light.js";import"./../emby-elements/emby-button/emby-button.js";import"./../emby-elements/emby-dialogclosebutton/emby-dialogclosebutton.js";import dialogHelper from"./../dialoghelper/dialoghelper.js";import dom from"./../dom.js";import responseHelper from"./../common/responsehelper.js";function showAlert(options){return Emby.importModule("./modules/common/dialogs/alert.js").then(function(alert){return alert(options)})}function onDialogClosed(){loading.hide(),this.destroy()}function getEditorHtml(options,apiClient,systemInfo){let html="";html+='<div is="emby-scroller" data-horizontal="false" data-forcescrollbar="true" data-focusscroll="true" class="formDialogContent"><div class="scrollSlider dialogContentInner dialog-content-centered padded-left padded-right flex flex-direction-column">',options.pathReadOnly||(instruction=options.instruction?options.instruction+"<br/><br/>":"",html=(html=(html+='<div class="infoBanner">')+'<div class="infoBannerContent">'+instruction)+globalize.translate("MessageDirectoryPickerInstruction").replace("{0}","<b>\\\\server</b>").replace("{1}","<b>\\\\192.168.1.101</b>"),"synology"===(systemInfo.PackageName||"").toLowerCase()?html=(html+="<br/><br/>")+'<a is="emby-linkbutton" class="button-link" href="https://github.com/MediaBrowser/Wiki/wiki/Synology-:-Setting-Up-Your-Media-Library-Share" target="_blank">'+globalize.translate("LearnHowToCreateSynologyShares")+"</a>":"bsd"===systemInfo.OperatingSystem.toLowerCase()?html=(html=(html+="<br/><br/>")+globalize.translate("MessageDirectoryPickerBSDInstruction")+"<br/>")+'<a is="emby-linkbutton" class="button-link" href="http://doc.freenas.org/9.3/freenas_jails.html#add-storage" target="_blank">'+globalize.translate("LearnMore")+"</a>":"linux"===systemInfo.OperatingSystem.toLowerCase()&&(html=(html+="<br/><br/>")+globalize.translate("MessageDirectoryPickerLinuxInstruction")+"<br/>"),html+="</div></div>"),html=(html+='<form style="margin:0;" class="flex-grow">')+'<div class="inputContainer flex align-items-center"><div class="flex-grow">';var instruction=!0!==options.includeFiles?"Folder":"LabelPath",readOnlyAttribute=options.pathReadOnly?" readonly":"";return html=html+('<input is="emby-input" class="txtDirectoryPickerPath" type="text" required="required" '+readOnlyAttribute+' autocomplete="off" label="'+globalize.translate(instruction)+'"/>')+"</div>",readOnlyAttribute||(html+='<button type="button" is="paper-icon-button-light" class="btnRefreshDirectories emby-input-iconbutton" title="'+globalize.translate("Refresh")+'" aria-label="'+globalize.translate("Refresh")+'"><i class="md-icon">refresh</i></button>'),html+="</div>",options.enableLoginCredentials&&"windows"!==systemInfo.OperatingSystem.toLowerCase()&&apiClient.isMinServerVersion("4.8.0.40")&&(html=(html=(html=(html=(html=(html=(html+='<div class="inputContainer fldUsername hide">')+'<input is="emby-input" class="txtUsername" type="text" label="'+globalize.translate("LabelUsername")+'"/><div class="fieldDescription">')+globalize.translate("UsernameForFolderHelp")+"</div>")+'</div><div class="inputContainer fldPassword hide">')+'<input is="emby-input" class="txtPassword" type="password" label="'+globalize.translate("LabelPassword")+'"/><div class="fieldDescription">')+globalize.translate("PasswordForFolderHelp"))+"</div></div>"),readOnlyAttribute||(html+='<div is="emby-scroller" class="flex flex-direction-column listItems-border scrollFrameY flex-grow result-scroller flex-grow" style="max-height: 20em;margin:2em 0;" data-mousewheel="true" data-horizontal="false" data-focusscroll="adaptive" data-adaptivestartthreshold="30"><div is="emby-itemscontainer" class="results itemsContainer scrollSlider flex-grow flex-direction-column focuscontainer navout-up navout-down"></div></div>'),options.enableNetworkSharePath&&(html=(html=(html=(html+='<div class="inputContainer">')+'<input is="emby-input" class="txtNetworkPath" type="text" autocomplete="off" label="'+globalize.translate("LabelOptionalNetworkPath")+'"/><div class="fieldDescription">')+globalize.translate("LabelOptionalNetworkPathHelp"))+"</div></div>"),html=(html=(html=(html+='<div class="formDialogFooter">')+('<button is="emby-button" type="submit" class="raised button-submit block formDialogFooterItem">'+globalize.translate("ButtonOk")+"</button>")+"</div>")+"</form>"+"</div>")+"</div>"+"</div>"}function validatePath(path,validateWriteable,username,password,apiClient){return apiClient.ajax({type:"POST",url:apiClient.getUrl("Environment/ValidatePath"),data:{ValidateWriteable:validateWriteable,Path:path,Username:username,Password:password}}).catch(function(response){return response&&500===response.status&&validateWriteable?(showAlert("Emby Server requires write access to this folder. Please ensure write access and try again."),Promise.reject()):responseHelper.handleErrorResponse(response)})}function initEditor(instance,content,options,apiClient,fileOptions){var btnRefreshDirectories=content.querySelector(".btnRefreshDirectories");function onPathTextChange(e){var value=this.value,value=value&&(value.startsWith("\\\\")||value.toLowerCase().startsWith("smb://")),fldUsername=content.querySelector(".fldUsername"),fldPassword=content.querySelector(".fldPassword");value?(fldUsername&&fldUsername.classList.remove("hide"),fldPassword&&fldPassword.classList.remove("hide")):(fldUsername&&fldUsername.classList.add("hide"),fldPassword&&fldPassword.classList.add("hide"))}btnRefreshDirectories&&btnRefreshDirectories.addEventListener("click",function(e){instance.path=content.querySelector(".txtDirectoryPickerPath").value,instance.username=content.querySelector(".txtUsername")?.value,instance.password=content.querySelector(".txtPassword")?.value,instance.itemsContainer.resume({refresh:!0}).catch(responseHelper.handleErrorResponse)}),content.querySelector(".txtDirectoryPickerPath").addEventListener("change",onPathTextChange),content.querySelector(".txtDirectoryPickerPath").addEventListener("input",onPathTextChange),content.querySelector("form").addEventListener("submit",function(e){if(options.callback){let path=this.querySelector(".txtDirectoryPickerPath").value,username=this.querySelector(".txtUsername")?.value||null,password=this.querySelector(".txtPassword")?.value||null,networkSharePath=this.querySelector(".txtNetworkPath")?.value||null;validatePath(path,options.validateWriteable,username,password,apiClient).then(function(){options.callback(path,networkSharePath,username,password)})}return e.preventDefault(),e.stopPropagation(),!1})}function getDefaultPath(options,apiClient){return options.path?Promise.resolve(options.path):apiClient.getJSON(apiClient.getUrl("Environment/DefaultDirectoryBrowser")).then(function(result){return result.Path||""},function(){return""})}function onItemAction(e){var e=e.detail.item,path=e.Path;"File"===e.FileType?(this.dlg.querySelector(".txtDirectoryPickerPath").value=path,this.dlg.querySelector(".txtDirectoryPickerPath").dispatchEvent(new CustomEvent("change",{bubbles:!0}))):(this.path=path,this.username=this.dlg.querySelector(".txtUsername")?.value,this.password=this.dlg.querySelector(".txtPassword")?.value,this.itemsContainer.resume({refresh:!0}))}function getItems(query){let path=this.path;if(path&&"string"!=typeof path)return Promise.resolve({Items:[],TotalRecordCount:0});let instance=this;if(instance.options.pathReadOnly)return Promise.resolve({Items:[],TotalRecordCount:0});let apiClient=this.apiClient;var fileOptions=this.fileOptions,promises=[];return"Network"===path?promises.push(apiClient.getNetworkDevices()):path?((fileOptions=Object.assign({},fileOptions)).username=this.username,fileOptions.password=this.password,promises.push(apiClient.getDirectoryContents(path,fileOptions)),promises.push(apiClient.getParentPath(path))):promises.push(apiClient.getDrives()),Promise.all(promises).then(function(responses){var folders=responses[0],responses=responses[1]||"";instance.dlg.querySelector(".txtDirectoryPickerPath").value=path||"";let items=[];path&&items.push({Path:responses,Name:".. ["+globalize.translate("Back")+"]",Icon:"arrow_back"}),items=items.concat(folders.map(function(f){return{Path:f.Path,Name:f.Name,FileType:f.Type,Icon:"File"===f.Type?"description":"folder"}})),path||items.push({Path:"Network",Name:globalize.translate("Network"),Icon:"wifi"});for(let i=0,length=items.length;i<length;i++)items[i].Type="GenericListItem",items[i].ServerId=apiClient.serverId(),"File"!==items[i].FileType&&(items[i].asideIcon="");return loading.hide(),Promise.resolve({Items:items,TotalRecordCount:items.length})})}function getListOptions(items){return{renderer:listView,options:{enableDefaultIcon:!0,action:"custom",fields:["Name"],draggable:!1,draggableXActions:!1,multiSelect:!1,contextMenu:!1,hoverPlayButton:!1,enableUserDataButtons:!1,mediaInfo:!1,defaultBackground:!1,enableFocusScaling:!1,allowBorderXOffset:!1},virtualScrollLayout:"vertical-list"}}function autoFocus(){var context=this.dlg;focusManager.autoFocus(context,{skipIfNotEnabled:!0})}function onItemsContainerUpgraded(){this.itemsContainer.resume({refresh:!0}).then(autoFocus.bind(this))}function onOpened(){var itemsContainer=this.itemsContainer;itemsContainer&&(itemsContainer.resume?onItemsContainerUpgraded.call(this):dom.addEventListener(itemsContainer,"upgraded",onItemsContainerUpgraded.bind(this),{once:!0}))}function afterRefresh(){this.dlg.querySelector(".result-scroller").scrollToBeginning({behavior:"instant"})}function DirectoryBrowser(){}require(["formDialogStyle"]),DirectoryBrowser.prototype.show=function(options){let fileOptions={includeDirectories:!0},apiClient=(null!=(options=options||{}).includeDirectories&&(fileOptions.includeDirectories=options.includeDirectories),null!=options.includeFiles&&(fileOptions.includeFiles=options.includeFiles),connectionManager.currentApiClient()),instance=this;return instance.fileOptions=fileOptions,instance.apiClient=apiClient,instance.options=options,Promise.all([apiClient.getSystemInfo(),getDefaultPath(options,apiClient)]).then(function(responses){var systemInfo=responses[0],responses=responses[1],dlg=dialogHelper.createDialog({size:layoutManager.tv?"fullscreen":"medium-tall",removeOnClose:!0,scrollY:!1}),html=((instance.dlg=dlg).classList.add("ui-body-a"),dlg.classList.add("background-theme-a"),dlg.classList.add("directoryPicker"),dlg.classList.add("formDialog"),""),systemInfo=(html=(html=(html=(html=(html+='<div class="formDialogHeader">')+'<button type="button" is="emby-dialogclosebutton"></button>'+'<h3 class="formDialogHeaderTitle">')+(options.header||globalize.translate("HeaderSelectPath")))+"</h3>"+"</div>")+getEditorHtml(options,apiClient,systemInfo),dlg.innerHTML=html,initEditor(instance,dlg,options,apiClient,fileOptions),dlg.addEventListener("close",onDialogClosed.bind(instance)),dlg.querySelector(".itemsContainer")),html=(systemInfo&&(systemInfo.addEventListener("action-null",onItemAction.bind(instance)),systemInfo.fetchData=getItems.bind(instance),systemInfo.afterRefresh=afterRefresh.bind(instance),systemInfo.getListOptions=getListOptions,instance.itemsContainer=systemInfo),dlg.querySelector(".txtDirectoryPickerPath")),systemInfo=(html.value=responses,instance.path=responses,dlg.querySelector(".txtNetworkPath")),responses=(systemInfo&&(systemInfo.value=options.networkSharePath||""),dlg.querySelector(".txtUsername")),systemInfo=(responses&&(responses.value=options.username||""),instance.username=options.username,dlg.querySelector(".txtPassword"));systemInfo&&(systemInfo.value=options.password||""),instance.password=options.password,dialogHelper.open(dlg),html.dispatchEvent(new CustomEvent("change",{bubbles:!0})),dlg.addEventListener("opened",onOpened.bind(instance))})},DirectoryBrowser.prototype.close=function(){this.dlg&&dialogHelper.close(this.dlg)},DirectoryBrowser.prototype.destroy=function(){this.itemsContainer=null,this.dlg=null,this.path=null,this.options=null,this.fileOptions=null,this.apiClient=null};export default DirectoryBrowser; |