import dialogHelper from 'dialogHelper'; import layoutManager from 'layoutManager'; import globalize from 'globalize'; import dom from 'dom'; import 'emby-button'; import 'css!./actionSheet'; import 'material-icons'; import 'scrollStyles'; import 'listViewStyle'; function getOffsets(elems) { const results = []; if (!document) { return results; } for (const elem of elems) { const box = elem.getBoundingClientRect(); results.push({ top: box.top, left: box.left, width: box.width, height: box.height }); } return results; } function getPosition(options, dlg) { const windowSize = dom.getWindowSize(); const windowHeight = windowSize.innerHeight; const windowWidth = windowSize.innerWidth; const pos = getOffsets([options.positionTo])[0]; if (options.positionY !== 'top') { pos.top += (pos.height || 0) / 2; } pos.left += (pos.width || 0) / 2; const height = dlg.offsetHeight || 300; const width = dlg.offsetWidth || 160; // Account for popup size pos.top -= height / 2; pos.left -= width / 2; // Avoid showing too close to the bottom const overflowX = pos.left + width - windowWidth; const overflowY = pos.top + height - windowHeight; if (overflowX > 0) { pos.left -= (overflowX + 20); } if (overflowY > 0) { pos.top -= (overflowY + 20); } pos.top += (options.offsetTop || 0); pos.left += (options.offsetLeft || 0); // Do some boundary checking pos.top = Math.max(pos.top, 10); pos.left = Math.max(pos.left, 10); return pos; } function centerFocus(elem, horiz, on) { import('scrollHelper').then(({default: scrollHelper}) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); } export function show(options) { // items // positionTo // showCancel // title const dialogOptions = { removeOnClose: true, enableHistory: options.enableHistory, scrollY: false }; let isFullscreen; if (layoutManager.tv) { dialogOptions.size = 'fullscreen'; isFullscreen = true; dialogOptions.autoFocus = true; } else { dialogOptions.modal = false; dialogOptions.entryAnimation = options.entryAnimation; dialogOptions.exitAnimation = options.exitAnimation; dialogOptions.entryAnimationDuration = options.entryAnimationDuration || 140; dialogOptions.exitAnimationDuration = options.exitAnimationDuration || 100; dialogOptions.autoFocus = false; } const dlg = dialogHelper.createDialog(dialogOptions); if (isFullscreen) { dlg.classList.add('actionsheet-fullscreen'); } else { dlg.classList.add('actionsheet-not-fullscreen'); } dlg.classList.add('actionSheet'); if (options.dialogClass) { dlg.classList.add(options.dialogClass); } let html = ''; const scrollClassName = layoutManager.tv ? 'scrollY smoothScrollY hiddenScrollY' : 'scrollY'; let style = ''; // Admittedly a hack but right now the scrollbar is being factored into the width which is causing truncation if (options.items.length > 20) { const minWidth = dom.getWindowSize().innerWidth >= 300 ? 240 : 200; style += 'min-width:' + minWidth + 'px;'; } let renderIcon = false; const icons = []; let itemIcon; for (const item of options.items) { itemIcon = item.icon || (item.selected ? 'check' : null); if (itemIcon) { renderIcon = true; } icons.push(itemIcon || ''); } if (layoutManager.tv) { html += ``; } // If any items have an icon, give them all an icon just to make sure they're all lined up evenly const center = options.title && (!renderIcon /*|| itemsWithIcons.length != options.items.length*/); if (center || layoutManager.tv) { html += '
' + options.text + '
'; } let scrollerClassName = 'actionSheetScroller'; if (layoutManager.tv) { scrollerClassName += ' actionSheetScroller-tv focuscontainer-x focuscontainer-y'; } html += '