/* Project specific Javascript goes here. */ function onPositionSelectChange(elem) { elem.querySelectorAll("option").forEach((option) => { if (option.innerText.trim() == elem.value) { option.setAttribute("selected", "selected"); } else { option.removeAttribute("selected"); } }); colorPositions(); refreshLineup(); } function togglePopup(el) { el.querySelector(".Popup-container").classList.toggle("is-open"); } function colorPositions() { for (bcLineup of document.querySelectorAll("[id^=event-lineup]")) { selected_lineup_positions = Array.from( bcLineup.querySelectorAll(".position-select-box option:checked") ).map((el) => el.value); for (position_status of bcLineup.querySelectorAll(".position-status")) { for (class_name of ["u-colorNegative", "u-colorHighlight", "u-colorPositive"]) { position_status.classList.remove(class_name); } occurrences = selected_lineup_positions.filter((s) => s == position_status.innerText).length; if (occurrences == 1) { position_status.classList.add("u-colorPositive"); } else if (occurrences > 1) { position_status.classList.add("u-colorHighlight"); } else { position_status.classList.add("u-colorNegative"); } } } } function initFlagsCheckboxes(){ Array.from(document.querySelectorAll("[id^=event-lineup]")).forEach((bcLineup) => { Array.from( bcLineup.querySelectorAll( ".starting .lineup-slot, \ .position-only .lineup-slot, \ .bench .lineup-slot" ) ).forEach((slot, i) => { const flags = new Set(slot.querySelector("input[name*=flags]")?.value?.split(',')?.map(s=>s.trim())) || new Set() if (flags.has('DHd')) { console.log('dhd') slot.querySelector('[name=flag-dhd]').checked = true; } if (flags.has('DRd') ) { slot.querySelector('[name=flag-drd]').checked = true; } })} ) } function refreshLineup() { Array.from(document.querySelectorAll("[id^=event-lineup]")).forEach((bcLineup) => { Array.from( bcLineup.querySelectorAll( ".starting .lineup-slot, \ .position-only .lineup-slot, \ .bench .lineup-slot" ) ).forEach((slot, i) => { slot.querySelector("input[name*=sequence]").value = i; selected_position = slot.querySelector(".position-select-box option:checked"); const flags = new Set(slot.querySelector("input[name*=flags]")?.value?.split(',')?.map(s=>s.trim())) || new Set() if (slot.querySelector('[name=flag-dhd]').checked) { flags.add('DHd') } else { flags.delete('DHd') } if (slot.querySelector('[name=flag-drd]').checked) { flags.add('DRd') } else { flags.delete('DRd') } if (selected_position && selected_position.text != "--") { slot.querySelector("input[name*=label]").value = selected_position.text; } else { slot.querySelector("input[name*=label]").value = null; } if (slot.closest('.position-only')){ flags.add('PO');flags.delete('') } else { flags.delete('PO');flags.delete('') } if (slot.closest('.bench')){ slot.querySelector("input[name*=sequence]").value = ''; slot.querySelector("input[name*=label]").value = ''; } slot.querySelector("input[name*=flags]").value = Array.from(flags).join(","); }); }); } function refreshFlags(){ } function emailModal(el, url) { form = el.closest("form"); console.log(form) data = new FormData(form); fetch(url, { method: "POST", body: data, headers: { 'CSRF-Token': data.get('_csrf') } }) .then((response) => { if (response.ok) { return response.text(); } else { return Promise.reject(response.text()); } }) .then((html) => { const parser = new DOMParser() const email_modal = parser.parseFromString(html, 'text/html') const email_modal_node = email_modal.firstElementChild.querySelector('#modal') email_modal_node.setAttribute('id', `lineup-email-data-${data.get('event_lineup_id')}`) const body = document.querySelector('body') email_modal_node.classList.add('is-open') body.appendChild(email_modal_node) tinymce.init({ selector:`textarea#email-editor`, content_css:"/css/application.css", plugins: 'image', menubar: false, toolbar: 'undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | outdent indent | image', paste_data_images: true, statusbar:false}) tinymce.remove(); }); } async function onSubmit(form, event) { event.preventDefault(); console.log(event) teamsnap_icon = form.querySelector("#teamsnap-icon"); waiting_icon = form.querySelector("#waiting-icon"); success_icon = form.querySelector("#success-icon"); failure_icon = form.querySelector("#failure-icon"); data = new FormData(form); console.log(form) url = form.attributes.action.textContent; teamsnap_icon.classList.add("u-hidden") waiting_icon.classList.remove("u-hidden"); await fetch(url, { method: "POST", body: data, headers: { 'CSRF-Token': data.get('_csrf') } }) .then((response) => { waiting_icon.classList.add("u-hidden"); if (response.ok) { return response.text(); } else { return Promise.reject(response.text()); } }) .then((text) => { event.submitter.blur() waiting_icon.classList.add("u-hidden"); success_icon.classList.remove("u-hidden"); console.log(text); // success_icon.querySelector("span.message").innerHTML = text; }) .catch((error) => { event.submitter.blur() waiting_icon.classList.add("u-hidden"); failure_icon.classList.remove("u-hidden"); console.log(error); // success_icon.querySelector("span.message").innerHTML = error; }) .finally(()=>{location.reload()});//refresh page setTimeout(() => { [waiting_icon, success_icon, failure_icon].forEach(e=>e.classList.add('u-hidden')) teamsnap_icon.classList.remove('u-hidden') }, 3000) } async function copyEmailTable (element) { // range=document.createRange(); // window.getSelection().removeAllRanges(); // // range.selectNode(document.querySelector('.Modal').querySelector('.Modal-body')); // tinymce.activeEditor.selection.select(tinymce.activeEditor.getBody()); // // window.getSelection().addRange(range); // document.execCommand('copy'); // window.getSelection().removeAllRanges(); const emailStyle = ` ` // html_content = emailStyle+tinymce.activeEditor.getContent() // console.log(html_content) const table = element.closest('form').querySelector('.lineup-table table') // navigator.clipboard.write( // [new ClipboardItem( // { // // 'text/plain': new Blob([tinymce.activeEditor.getContent({format: "text"})], {type: 'text/plain'}), // 'text/plain': new Blob([table.innerText], {type: 'text/plain'}), // 'text/html': new Blob([emailStyle+table.outerHTML], {type: 'text/html'}) // }) // ]) window.getSelection().removeAllRanges(); var range = document.createRange(); range.selectNode(table); window.getSelection().addRange(range); document.execCommand("copy"); window.getSelection().removeAllRanges(); } function toggleChildSlots (element) { console.log(element); console.log(element.closest(".slot-set")) for (lineup_slot of document.querySelectorAll("[id^=lineup-out] .lineup-slot")) { console.log(lineup_slot) const cells = lineup_slot.querySelectorAll('.Panel-cell:has(.sequence), .Panel-cell:has(.drag-handle), .Panel-cell:has(.position-select-box), button:has(+.position-label-flags)') Array.from(cells).forEach(cell=>{ cell.classList.toggle('u-hidden') }) } } function initSlots () { const slots = Array.from(document.querySelectorAll('.lineup-slot')) slots.forEach(slot=>{ if (slot.dataset.initialSlotset) { const parent = document.querySelector(`#${slot.dataset.initialSlotset} .slot-set`) parent.appendChild(slot) slot.removeAttribute('data-initial-slotset') } }) } function insertLineup(direction, teamId, eventId, element) { const currentUrl = window.location.href; let search_params if (Number(direction) > 0) { search_params = new URLSearchParams({ page_size:1, index: 1 }) } else if (Number(direction) < 0) { search_params = new URLSearchParams({ page_size:1, index: -1 }) } else {throw new Error("Needs to be a negative number or a positive number")} fetch(`/${teamId}/event/${eventId}/lineup/adjacent?`+search_params, { method: "GET" }) .then((response) => { if (response.ok) { return response.text(); } else { return Promise.reject(response.text()); } }) .then((html) =>{ const parser = new DOMParser(); const new_lineup_doc = parser.parseFromString(html, 'text/html') const new_lineup_doc_node = new_lineup_doc.firstElementChild.querySelector('[id*=event-lineup]') const main = document.querySelector("main") const new_csrf_token = new_lineup_doc.querySelector('form input[name=csrfToken]').value direction > 0 ? main.appendChild(new_lineup_doc_node) : main.insertBefore(new_lineup_doc_node, element.closest('[id*=event-lineup]')) main.classList.remove(...main.classList) main.classList.add('scroll-horizontal', 'u-spaceSidesSm', 'u-flex') Array.from(document.querySelectorAll("[id^=event-lineup]")).forEach((bcLineup) => { // main.classList.remove('.u-max1200', 'u-flexExpandSides') bcLineup.classList.remove('u-spaceSidesNone', 'u-sm-spaceSidesAuto') } ) Array.from(document.querySelectorAll("[id^=event-lineup] .Panel")).forEach((bcLineupPanel) => { bcLineupPanel.classList.remove('Panel--full') }) for (input of document.querySelectorAll("form input[name=csrfToken]")){ input.value = new_csrf_token } initPage(); }) } function initPage (){ colorPositions(); initSlots(); initFlagsCheckboxes(); refreshLineup(); for (bcLineup of document.querySelectorAll("[id^=event-lineup]")) { options = { animation: 150, handle: ".Panel-cell:has(.drag-handle), .Panel-cell:has(.sequence)", ghostClass: "ghost", group: { name: bcLineup.id, put: [bcLineup.id], pull: [bcLineup.id], }, onAdd: function (/**Event*/ evt) { console.log("added to lineup"); // Add to Lineup var itemEl = evt.item; // dragged HTMLElement refreshLineup(); }, onUpdate: function (/**Event*/ evt) { console.log("update to lineup"); // var itemEl = evt.item; // dragged HTMLElement // refresh_lineup_order(itemEl); refreshLineup(); }, }; new Sortable.create(bcLineup.querySelector("[id^=lineup-starting] .slot-set"), options); new Sortable.create(bcLineup.querySelector("[id^=lineup-positiononly] .slot-set"), options); options["sort"] = false; new Sortable.create(bcLineup.querySelector("[id^=lineup-bench] .slot-set"), options); new Sortable.create(bcLineup.querySelector("[id^=lineup-out] .slot-set"), {...options, group:{...options.group, put:[]}}); } for (lineup_slot of document.querySelectorAll("[id^=lineup-out] .lineup-slot")) { const cells = lineup_slot.querySelectorAll('.Panel-cell:has(.sequence), .Panel-cell:has(.drag-handle), .Panel-cell:has(.position-select-box), button:has(+.position-label-flags)') Array.from(cells).forEach(cell=>{ cell.classList.add('u-hidden') }) } } function mailToLink(el, protocol) { const {to, bcc} = el.dataset const subject = document.getElementById('email-subject').value const email_body = document.getElementById('email-editor').value const url = `${protocol}://compose?recipient=${to}&bcc=${bcc}&subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(email_body)}` console.log(url) // location.href=`mailto:${to}${params}` const windowRef = window.open(url, '_blank'); windowRef.focus(); } function sendAvailabilityReminder(element, eventId, memberIds, csrf_token) { const icon = element.querySelector('svg') const button_text = element.querySelector('span') icon.classList.toggle('u-hidden') button_text.classList.toggle('u-hidden') const loader = '' const loader_node = new DOMParser().parseFromString(loader, "text/html").firstChild.querySelector('span'); element.appendChild(loader_node) element.blur(); const data = new FormData(); const url = "../availability_reminders" data.append('eventId', eventId) for (var i = 0; i < memberIds.length; i++) { data.append('memberIds[]', memberIds[i]); } console.log(data) fetch(url, { method: "POST", body: data, headers: { 'CSRF-Token': csrf_token } }) .then((response) => { if (response.ok) { console.log(response) return response.text(); } else { return Promise.reject(response.text()); } }) .finally(()=>{ loader_node.remove() icon.classList.toggle('u-hidden') button_text.classList.toggle('u-hidden') }) console.log(element, eventId, memberIds) } document.addEventListener('DOMContentLoaded', initPage)