Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/views/pages/admin-playlists.ejs

    r156baa3 r2ab99c0  
    222222</style>
    223223
    224 <%# Het script staat in assets/js/mod/admin-playlists.js; de gegevens via partials/page-data.ejs (shaer-bqr). %>
    225 <%- include('../partials/page-data', { pageData: { csrf: _csrf, copied: t('apl.copied'), delConfirm: t('apl.delete_confirm'), delFailed: t('apl.delete_failed') } }) %>
     224<script>
     225(function() {
     226  const csrf = '<%= _csrf %>';
     227
     228  document.getElementById('pl-new-btn')?.addEventListener('click', () => {
     229    if (typeof window.openPlaylistEditor === 'function') {
     230      window.openPlaylistEditor({ mode: 'create', onSaved: () => location.reload() });
     231    }
     232  });
     233
     234  // Click-to-copy on shortcodes
     235  document.querySelectorAll('[data-copy]').forEach(el => {
     236    el.addEventListener('click', async () => {
     237      try {
     238        await navigator.clipboard.writeText(el.dataset.copy);
     239        el.classList.add('is-copied');
     240        const original = el.textContent;
     241        el.textContent = '✓ <%= t('apl.copied') %>';
     242        setTimeout(() => { el.classList.remove('is-copied'); el.textContent = original; }, 1200);
     243      } catch (_) { /* fall back to selection */ }
     244    });
     245  });
     246
     247  document.querySelectorAll('[data-pl-edit]').forEach(btn => {
     248    btn.addEventListener('click', () => {
     249      if (typeof window.openPlaylistEditor === 'function') {
     250        window.openPlaylistEditor({ mode: 'edit', id: btn.dataset.id, onSaved: () => location.reload() });
     251      }
     252    });
     253  });
     254
     255  document.querySelectorAll('[data-pl-delete]').forEach(btn => {
     256    btn.addEventListener('click', async () => {
     257      const id = btn.dataset.id;
     258      const title = btn.dataset.title || id;
     259      if (!confirm('<%= t('apl.delete_confirm') %>'.replace('{title}', title))) return;
     260      try {
     261        const r = await fetch(`/admin/playlists/api/${encodeURIComponent(id)}/delete`, {
     262          method: 'POST',
     263          headers: { 'X-CSRF-Token': csrf },
     264          credentials: 'same-origin',
     265        });
     266        const j = await r.json();
     267        if (j.ok) location.reload();
     268        else alert('<%= t('apl.delete_failed') %>: ' + (j.error || ''));
     269      } catch (err) {
     270        alert('<%= t('apl.delete_failed') %>: ' + err.message);
     271      }
     272    });
     273  });
     274
     275  // P52 — deep-link from playlist embed (?edit=<id>) auto-opens the editor.
     276  // openPlaylistEditor is defined synchronously by the included partial, so
     277  // it's available by the time this IIFE runs.
     278  (function deepLinkEdit() {
     279    const params = new URLSearchParams(location.search);
     280    const editId = params.get('edit');
     281    if (!editId) return;
     282    if (typeof window.openPlaylistEditor !== 'function') return;
     283    // Strip the query param immediately so reload after save doesn't re-open.
     284    history.replaceState({}, '', location.pathname);
     285    window.openPlaylistEditor({
     286      mode: 'edit',
     287      id: editId,
     288      onSaved: () => location.reload(),
     289    });
     290  })();
     291})();
     292</script>
Note: See TracChangeset for help on using the changeset viewer.