()
| 1740 | // ───────────────────── |
| 1741 | |
| 1742 | function attachPortalFolderPickers() { |
| 1743 | const body = document.getElementById('clientPortalsBody'); |
| 1744 | if (!body) return; |
| 1745 | |
| 1746 | body.querySelectorAll('.portal-card').forEach(card => { |
| 1747 | const input = card.querySelector('[data-portal-field="folder"]'); |
| 1748 | const browseBtn = card.querySelector('.portal-folder-browse-btn'); |
| 1749 | const sourceSelect = card.querySelector('[data-portal-field="sourceId"]'); |
| 1750 | if (!input) return; |
| 1751 | |
| 1752 | if (input.dataset._portalFolderPickerBound === '1') return; |
| 1753 | input.dataset._portalFolderPickerBound = '1'; |
| 1754 | |
| 1755 | // Preferred path: if you ever add a central folder picker, use it: |
| 1756 | const useNativePicker = typeof window.FileRiseFolderPicker === 'function'; |
| 1757 | |
| 1758 | const getSourceId = () => normalizePortalSourceId(sourceSelect ? sourceSelect.value : '') || getPortalSourceFallbackId(); |
| 1759 | |
| 1760 | const openPicker = async () => { |
| 1761 | const sourceId = getSourceId(); |
| 1762 | if (useNativePicker) { |
| 1763 | try { |
| 1764 | const folder = await window.FileRiseFolderPicker({ |
| 1765 | current: input.value || '', |
| 1766 | mode: 'select-folder', |
| 1767 | source: 'client-portals', |
| 1768 | sourceId |
| 1769 | }); |
| 1770 | if (folder) input.value = folder; |
| 1771 | return; |
| 1772 | } catch (e) { |
| 1773 | console.error('Folder picker error', e); |
| 1774 | showToast(t('admin_portal_open_folder_picker_failed')); |
| 1775 | return; |
| 1776 | } |
| 1777 | } |
| 1778 | |
| 1779 | // Fallback: datalist built from /api/folder/getFolderList.php |
| 1780 | try { |
| 1781 | const safeSourceId = (sourceId || 'local').replace(/[^A-Za-z0-9_-]/g, '') || 'local'; |
| 1782 | const datalistId = 'portalFolderList-' + safeSourceId; |
| 1783 | let datalist = document.getElementById(datalistId); |
| 1784 | if (!datalist) { |
| 1785 | datalist = document.createElement('datalist'); |
| 1786 | datalist.id = datalistId; |
| 1787 | document.body.appendChild(datalist); |
| 1788 | |
| 1789 | const folders = await loadPortalFolderList(sourceId); |
| 1790 | datalist.innerHTML = ''; |
| 1791 | folders.forEach(f => { |
| 1792 | const opt = document.createElement('option'); |
| 1793 | opt.value = f; |
| 1794 | datalist.appendChild(opt); |
| 1795 | }); |
| 1796 | } |
| 1797 | |
| 1798 | input.setAttribute('list', datalistId); |
| 1799 | input.focus(); |
no test coverage detected