1 line
No EOL
12 KiB
JavaScript
1 line
No EOL
12 KiB
JavaScript
import dom from"./../dom.js";import playbackManager from"./../common/playback/playbackmanager.js";import connectionManager from"./../emby-apiclient/connectionmanager.js";import itemManager from"./../common/itemmanager/itemmanager.js";import itemShortcuts from"./../shortcuts.js";import commandProcessor from"./../commandprocessor.js";import textEncoding from"./../common/textencoding.js";require(["css!modules/multiselect/multiselect.css"]);let rangeSelectionInfo,selectedItems=[],selectedItemsMap={},currentSelectionCommandsPanel,appHeader=document.querySelector(".skinHeader"),currentHeader;function getSelectedItemsMap(serverId){return serverId=serverId||"0",selectedItemsMap[serverId]||(selectedItemsMap[serverId]={})}function hideSelections(){dom.removeEventListener(window,"keydown",onKeyDown,{});var selectionCommandsPanel=currentSelectionCommandsPanel;if(selectionCommandsPanel){selectionCommandsPanel.remove(),currentSelectionCommandsPanel=null,selectedItems=[],selectedItemsMap={},rangeSelectionInfo=null;let elems=document.querySelectorAll(".multi-select-active"),i,length;for(i=0,length=elems.length;i<length;i++)elems[i].classList.remove("multi-select-active"),dom.removeEventListener(elems[i],"pointerenter",onPointerEnter,{passive:!0,capture:!0}),elems[i].dispatchEvent(new CustomEvent("multiselectinactive",{bubbles:!0,cancelable:!1,detail:{}}));for(elems=document.querySelectorAll(".chkItemSelect:checked"),i=0,length=elems.length;i<length;i++)elems[i].checked=!1,elems[i].classList.remove("chkItemSelect-selecthint");for(elems=document.querySelectorAll(".item-multiselected"),i=0,length=elems.length;i<length;i++)elems[i].classList.remove("item-multiselected")}currentHeader&&(currentHeader.classList.remove("headroomDisabled"),currentHeader=null)}function getSelectedItemsContainer(){return rangeSelectionInfo?.itemsContainer||document.querySelector(".multi-select-active")}function executeCommand(command,hideSelectionsEarly){var items=selectedItems,itemsContainer=getSelectedItemsContainer();return hideSelectionsEarly&&hideSelections(),commandProcessor.executeCommand(command,items,{itemsContainer:itemsContainer}).then(hideSelections)}function onCommandButtonClick(e){e=e.target.closest("button");e&&executeCommand(e.getAttribute("data-command"))}function showSelectionCommands(chkItemSelect){var header,selectionCommandsPanel=currentSelectionCommandsPanel;selectionCommandsPanel||((selectionCommandsPanel=document.createElement("div")).classList.add("selectionCommandsPanel"),header=(chkItemSelect=chkItemSelect.closest(".dialog"))?.querySelector(".formDialogHeader")||appHeader,(currentHeader=header).appendChild(selectionCommandsPanel),header.classList.add("headroomDisabled"),chkItemSelect&&(chkItemSelect.removeEventListener("close",hideSelections),chkItemSelect.addEventListener("close",hideSelections)),(currentSelectionCommandsPanel=selectionCommandsPanel).innerHTML='<button is="paper-icon-button-light" class="btnCloseSelectionPanel"><i class="md-icon">close</i></button><h1 class="itemSelectionCount"></h1><div class="multiSelectActionsContainer flex align-items-center"><div class="multiSelectPrimaryButtons flex align-items-center"></div><button is="paper-icon-button-light" class="btnSelectionPanelOptions md-icon"></button></div>',selectionCommandsPanel.querySelector(".btnCloseSelectionPanel").addEventListener("click",hideSelections),selectionCommandsPanel.querySelector(".multiSelectPrimaryButtons").addEventListener("click",onCommandButtonClick),header=selectionCommandsPanel.querySelector(".btnSelectionPanelOptions"),dom.addEventListener(header,"click",showMenuForSelectedItems,{passive:!0}))}function mapApiClientArrayToObject(responses){var map={};for(let i=0,length=responses.length;i<length;i++){var user=responses[i];map[user.ServerId]=user}return map}function getUsersFromServersForSelectedItems(items){var promises=[],servers={};for(let i=0,length=items.length;i<length;i++){var item=items[i],serverId=item.ServerId;serverId&&!servers[serverId]&&(servers[serverId]=!0,promises.push(connectionManager.getApiClient(item).getCurrentUser()))}return Promise.all(promises).then(mapApiClientArrayToObject)}function showMenuForSelectedItems(e){let items=selectedItems,button=e.target.closest("button");return getUsersFromServersForSelectedItems(items).then(function(users){return Emby.importModule("./modules/itemcontextmenu.js").then(function(itemContextMenu){var itemsContainer=getSelectedItemsContainer();return itemContextMenu.show({items:items,hasItemIcon:!0,positionTo:button,users:users,multiSelect:!1,positionY:"bottom",itemsContainer:itemsContainer}).then(hideSelections)})})}function getSelectedItemIdentifier(item){return item.PlaylistItemId||item.Id||item}function isPrimaryCommand(command){return!0===command.primaryCommand}function showHideQuickButtons(){var panel=currentSelectionCommandsPanel;if(panel){var panel=panel.querySelector(".multiSelectPrimaryButtons"),items=selectedItems;if(items.length){var user=connectionManager.getApiClient(items[0])?.getCurrentUserCached(),commands=itemManager.getCommands({items:items,user:user}).filter(isPrimaryCommand);let html="",buttonCount=0;for(let i=0,length=commands.length;i<length&&buttonCount<3;i++){var command=commands[i],name=textEncoding.htmlEncode(command.name),icon=command.icon;let iconClass="md-icon autortl";switch(icon){case"":case"":case"":case"":case"":case"":case"":case"":case"":iconClass+=" md-icon-fill"}html+='<button is="paper-icon-button-light" data-command="'+command.id+'" class="'+iconClass+'" title="'+name+'" aria-label="'+name+'">'+icon+"</button>",buttonCount++}panel.innerHTML=html}else panel.innerHTML=""}}function addOrRemoveSelectedItem(item,itemElement,add){let serverId=item.ServerId,id=getSelectedItemIdentifier(item);add?(itemElement&&itemElement.classList.add("item-multiselected"),selectedItems.filter(function(i){return getSelectedItemIdentifier(i)===id&&i.ServerId===serverId}).length||(selectedItems.push(item),getSelectedItemsMap(serverId)[id]=!0)):(itemElement&&itemElement.classList.remove("item-multiselected"),selectedItems=selectedItems.filter(function(i){return getSelectedItemIdentifier(i)!==id||i.ServerId!==serverId}),getSelectedItemsMap(serverId)[id]=null)}function onPointerEnter(e){var target;rangeSelectionInfo&&(target=e.target).matches(this.getItemSelector())&&setRangeSelectionInfo(e,this,target,!0)}function showSelections(chkItemSelect,selected){chkItemSelect.classList.contains("chkItemSelect")||(chkItemSelect=chkItemSelect.querySelector(".chkItemSelect")),null==selected?selected=chkItemSelect.checked:chkItemSelect.checked=selected;var itemsContainer=chkItemSelect.closest("[is=emby-itemscontainer]"),itemElement=itemShortcuts.getItemElementFromChildNode(chkItemSelect,!0,itemsContainer);addOrRemoveSelectedItem(itemShortcuts.getItemFromChildNode(itemElement,null,itemsContainer),itemElement,selected),selectedItems.length?(dom.removeEventListener(window,"keydown",onKeyDown,{}),dom.addEventListener(window,"keydown",onKeyDown,{}),itemsContainer.classList.contains("multi-select-active")||dom.addEventListener(itemsContainer,"pointerenter",onPointerEnter,{passive:!0,capture:!0}),itemsContainer.classList.add("multi-select-active"),itemsContainer.dispatchEvent(new CustomEvent("multiselectactive",{bubbles:!0,cancelable:!1,detail:{}})),showSelectionCommands(chkItemSelect),(itemElement=document.querySelector(".itemSelectionCount"))&&(itemElement.innerHTML=selectedItems.length)):hideSelections(),showHideQuickButtons()}function onChange(e){var target=e.target,chkItemSelect=target.closest(".chkItemSelect");if(chkItemSelect)if(itemShortcuts.getItemElementFromChildNode(target,!0,this))return showSelections(chkItemSelect,chkItemSelect.checked),e.preventDefault(),e.stopPropagation(),!1}function changeSelectionRange(rangeInfo,endIndex,isHintOnly){var previousEndIndex=rangeInfo.endIndex,startIndex=(isHintOnly||(rangeInfo.endIndex=endIndex),rangeInfo.startIndex),newRangeMin=Math.min(startIndex,endIndex),newRangeMax=Math.max(startIndex,endIndex),minIndexForUpdates=null==previousEndIndex?newRangeMin:Math.min(startIndex,Math.min(endIndex,previousEndIndex)),maxIndexForUpdates=null==previousEndIndex?newRangeMax:Math.max(startIndex,Math.max(endIndex,previousEndIndex)),itemsContainer=rangeInfo.itemsContainer,hinted=(console.log("changeSelectionRange: minIndexForUpdates: "+minIndexForUpdates+", maxIndexForUpdates: "+maxIndexForUpdates+", newRangeMin: "+newRangeMin+", newRangeMax: "+newRangeMax),[]);for(let i=minIndexForUpdates;i<=maxIndexForUpdates;i++){var chkItemSelect,isChecked,newChecked,item=itemsContainer.getItem(i);item&&(isChecked=(chkItemSelect=itemsContainer.getElement(i)?.querySelector(".chkItemSelect"))?chkItemSelect.checked:isSelected(item),newChecked=i>=newRangeMin&&i<=newRangeMax,isHintOnly?chkItemSelect&&(newChecked&&!isChecked?(chkItemSelect.classList.add("chkItemSelect-selecthint"),hinted.push(chkItemSelect)):chkItemSelect.classList.remove("chkItemSelect-selecthint")):isChecked!==newChecked&&(chkItemSelect?(chkItemSelect.checked=newChecked,chkItemSelect.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1}))):addOrRemoveSelectedItem(item,null,newChecked)))}if(isHintOnly){var hintedElems=itemsContainer.querySelectorAll(".chkItemSelect-selecthint");for(let i=0,length=hintedElems.length;i<length;i++){var elem=hintedElems[i];hinted.includes(elem)||elem.classList.remove("chkItemSelect-selecthint")}}showHideQuickButtons()}let supportsTouchEvent="ontouchstart"in document.documentElement;function removeAllHints(){var elems=document.querySelectorAll(".chkItemSelect-selecthint");for(let i=0,length=elems.length;i<length;i++)elems[i].classList.remove("chkItemSelect-selecthint")}function setRangeSelectionInfo(e,itemsContainer,target,isHintOnly){let pointerType=e.pointerType;if("touch"!==(pointerType=pointerType||(supportsTouchEvent?"touch":"mouse"))){target=itemShortcuts.getItemElementFromChildNode(target,!0,itemsContainer);if(target){target=itemsContainer.indexOfElement(target);let rangeInfo=rangeSelectionInfo;if(!e.shiftKey||!rangeInfo)return isHintOnly?void removeAllHints():void(rangeSelectionInfo=rangeInfo={itemsContainer:itemsContainer,startIndex:target});rangeInfo.itemsContainer===itemsContainer&&changeSelectionRange(rangeInfo,target,isHintOnly)}}}function onKeyDown(e){var target;" "!==e.key||(target=e.target).closest("button,a")||(target=target.closest(".itemsContainer"))&&(e.preventDefault(),onContainerClick.call(target,e))}function onContainerClick(e){var target=e.target,chkItemSelectContainer=target.closest(".chkItemSelectContainer");if(chkItemSelectContainer)return setRangeSelectionInfo(e,this,target),!1;if(selectedItems.length){var itemElement=itemShortcuts.getItemElementFromChildNode(target,!0,this);if(itemElement)if(!chkItemSelectContainer)return showSelections(chkItemSelectContainer=itemElement.querySelector(".chkItemSelect"),!chkItemSelectContainer.checked),setRangeSelectionInfo(e,this,target),e.preventDefault(),e.stopPropagation(),!1}}function MultiSelect(options){options.container.addEventListener("change",onChange)}function isSelected(item){var id=getSelectedItemIdentifier(item);return!!id&&getSelectedItemsMap(item.ServerId)[id]}document.addEventListener("viewbeforehide",hideSelections),MultiSelect.prototype.showSelections=showSelections,MultiSelect.prototype.onContainerClick=onContainerClick,MultiSelect.isSelected=isSelected,MultiSelect.canPlay=function(){var items=selectedItems;for(let i=0,length=items.length;i<length;i++)if(playbackManager.canPlay(items[i]))return!0;return!1},MultiSelect.getSelectedItems=function(){return selectedItems},MultiSelect.play=function(){return executeCommand("play",!0)},MultiSelect.shuffle=function(){return executeCommand("shuffle",!0)};export default MultiSelect; |