diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 5e8f360..8c822f1 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -7,6 +7,7 @@ @import "bootstrap/scss/bootstrap"; @import "font-awesome-sprockets"; @import "font-awesome"; +@import "choices.js/public/assets/styles/choices.min"; // Your CSS partials @import "components/index"; diff --git a/app/assets/stylesheets/pages/_home.scss b/app/assets/stylesheets/pages/_home.scss index 46d8e60..bc2eb9f 100644 --- a/app/assets/stylesheets/pages/_home.scss +++ b/app/assets/stylesheets/pages/_home.scss @@ -97,6 +97,10 @@ font-size: 20px; } +.choices__list--multiple .choices__item { + background-color: #167FFB; +} + .editor-selector { color: #167FFB; font-size: 20px; diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index e8a7261..b8f48cc 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -30,6 +30,8 @@ def home end @confirmRemoveTeam = t 'confirmRemoveTeam' + @selectsOneOrMoreCategories = t 'selectsOneOrMoreCategories' + @resetFilters = t 'resetFilters' end diff --git a/app/javascript/components/datepicker.js b/app/javascript/components/datepicker.js index 922bcf5..ab636b2 100644 --- a/app/javascript/components/datepicker.js +++ b/app/javascript/components/datepicker.js @@ -1,10 +1,10 @@ import $ from 'jquery'; import 'daterangepicker'; import 'moment'; +import { Observable } from 'rxjs'; const initDatepicker = (daysToDisplay) => { - $(document).ready(function () { if (document.getElementById('datefield').value != `01/01/2000 - ${moment().format('DD/MM/YYYY')}`) { $('input[name="daterange"]').daterangepicker({ startDate: moment(), @@ -45,20 +45,9 @@ const initDatepicker = (daysToDisplay) => { }, opens: 'right' }, function (start, end, label) { - const events = document.querySelectorAll('#events') - events.forEach(element => { - const elementSelected = document.getElementById("teams"); - if (elementSelected.options[elementSelected.selectedIndex].value == 0) { - element.style.display = ''; - } - const tournamentDate = element.innerText.trim().substring(6, 10) + "-" + element.innerText.trim().substring(3, 5) + "-" + element.innerText.trim().substring(0, 2) - if (tournamentDate < start.format('YYYY-MM-DD') || tournamentDate > end.format('YYYY-MM-DD')) { - element.style.display = 'none'; - } - }); + // Callback do not use here work with RxJs Subject on Application.js }); } - }); } export { initDatepicker }; \ No newline at end of file diff --git a/app/javascript/components/filter.js b/app/javascript/components/filter.js deleted file mode 100644 index 3c71c1c..0000000 --- a/app/javascript/components/filter.js +++ /dev/null @@ -1,74 +0,0 @@ -import { initDatepicker } from "./datepicker"; - -// const initFilter = (daysToDisplay) => { -// const toggle = document.querySelector('#isTournamentOpen'); -// const events = document.querySelectorAll('#events'); -// toggle.addEventListener('click', () => { -// if (document.querySelector('#isTournamentOpen').value === "true") { -// events.forEach(element => { -// if (element.getElementsByClassName('btn-danger sqValidation')[0]) { -// let eventClosed = element.getElementsByClassName('btn-danger sqValidation')[0].parentNode.parentNode.parentNode.parentNode; -// eventClosed.style.display = ''; -// } -// }); -// document.querySelector('#isTournamentOpen').value = false - -// initializeDatepickeField(daysToDisplay); - -// } else { -// events.forEach(element => { -// if (element.getElementsByClassName('btn-danger sqValidation')[0]) { -// let eventClosed = element.getElementsByClassName('btn-danger sqValidation')[0].parentNode.parentNode.parentNode.parentNode; -// eventClosed.style.display = 'none'; -// } -// }); -// document.querySelector('#isTournamentOpen').value = true -// } -// }); -// } - -const initSelectorFilter = (daysToDisplay) => { - const elementSelected = document.getElementById("teams"); - elementSelected.addEventListener("change", function () { - - const events = document.querySelectorAll('#events'); - events.forEach(element => { - element.style.display = ''; - initializeDatepickeField(daysToDisplay); - }); - - if (elementSelected.options[elementSelected.selectedIndex].value != 0) { - events.forEach(element => { - element.style.display = 'none'; - }); - - const specificTeamEvents = document.querySelectorAll('#team-' + elementSelected.options[elementSelected.selectedIndex].value); - specificTeamEvents.forEach(element => { - element.parentNode.parentNode.parentNode.style.display = ''; - }); - document.getElementById('datefield').value = `01/01/2000 - ${moment().format('DD/MM/YYYY')}`; - } - }); -} - -const initializeDatepickeField = (daysToDisplay) => { - - initDatepicker(daysToDisplay); - - const events = document.querySelectorAll('#events'); - const start = moment(); - const end = moment().add(daysToDisplay, 'days'); - events.forEach(element => { - element.style.display = ''; - const tournamentDate = element.innerText.trim().substring(6, 10) + "-" + element.innerText.trim().substring(3, 5) + "-" + element.innerText.trim().substring(0, 2) - if (tournamentDate < start.format('YYYY-MM-DD') || tournamentDate > end.format('YYYY-MM-DD')) { - element.style.display = 'none'; - } - }); - document.getElementById('datefield').focus(); - -} - -export { - initSelectorFilter -}; \ No newline at end of file diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 918ad51..491e73f 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -1,24 +1,111 @@ import "bootstrap"; +import $ from 'jquery'; + import { initPopover } from "../components/popover"; -import { initSelectorFilter } from "../components/filter"; import { initDatepicker } from "../components/datepicker"; import { initFlashes } from "../components/flashes"; +import Choices from 'choices.js'; +import { Subject } from "rxjs"; + const daysToDisplay = 365 // Days in future displayed by daterangepicker initFlashes(); initPopover(); initDatepicker(daysToDisplay); -initSelectorFilter(daysToDisplay); - -const start = moment(); -const end = moment().add(daysToDisplay, 'days'); -const events = document.querySelectorAll('#events') -events.forEach(element => { - element.style.display = ''; - const tournamentDate = element.innerText.trim().substring(6, 10) + "-" + element.innerText.trim().substring(3, 5) + "-" + element.innerText.trim().substring(0, 2) - if (tournamentDate < start.format('YYYY-MM-DD') || tournamentDate > end.format('YYYY-MM-DD')) { - element.style.display = 'none'; + +const choices = new Choices('#categories-selection', { + removeItemButton: true, + classNames: { + highlightedState: 'is-active', } }); +const subject = new Subject(); + +subject.subscribe({ + next: (picker) => { + // console.log(`observerA: started`) + + // console.log(`StartDate: ${picker.startDate.format('YYYY-MM-DD')}`); + // console.log(`EndDate: ${picker.endDate.format('YYYY-MM-DD')}`); + + const start = picker.startDate; + const end = picker.endDate; + + const teamSelector = document.getElementById("teams"); + const teamSelected = teamSelector.options[teamSelector.selectedIndex].value; + + const events = document.querySelectorAll('#events'); + + events.forEach(element => { + + // Reset all entries if all selectors set to all + + if (teamSelected === "0" && document.getElementById("categories-selection").value === "0") { + element.style.display = ''; + } else { + element.style.display = 'none'; + } + + if (choices.passedElement.element.length === 0) { + choices.setChoiceByValue("0"); + } + + // Filtering consecutivelly by organizer AND category + + if (teamSelected === "0" || teamSelected === element.getElementsByClassName("organizer")[0].firstChild.nextSibling.id.substr(5)) { + for (let i=0; i < element.querySelectorAll(".sqPlaces").length; i++) { + for (let j=0; j < choices.passedElement.element.length; j++) { + if (choices.passedElement.element[j].value === "0" || choices.passedElement.element[j].value === element.querySelectorAll(".sqPlaces")[i].id.substring(9)) { + element.style.display = ''; + } + } + } + } + + // Filter by selected date + + const tournamentDate = element.innerText.trim().substring(6, 10) + "-" + element.innerText.trim().substring(3, 5) + "-" + element.innerText.trim().substring(0, 2) + if (tournamentDate < start.format('YYYY-MM-DD') || tournamentDate > end.format('YYYY-MM-DD')) { + element.style.display = 'none'; + } + }); + } +}); + +const resetBtn = document.getElementById("reset-button"); +resetBtn.addEventListener("click", function () { + $('input[name="daterange"]').data('daterangepicker').setStartDate(moment()); + $('input[name="daterange"]').data('daterangepicker').setEndDate(moment().add(daysToDisplay, 'days')); + let picker = $('input[name="daterange"]').data('daterangepicker') + + document.getElementById("teams").value = 0; + + choices.removeActiveItems(); + choices.setChoiceByValue("0"); + + subject.next(picker); +}); + +$('input[name="daterange"]').on('apply.daterangepicker', function(ev, picker) { + subject.next(picker); +}); + +const teamSelector = document.getElementById("teams"); +teamSelector.addEventListener("change", function () { + let picker = $('input[name="daterange"]').data('daterangepicker') + subject.next(picker); +}); + +choices.passedElement.element.addEventListener('change', function(categoriesEvent) { + + if (categoriesEvent.detail.value === "0") { + choices.removeActiveItems(categoriesEvent.detail.id); + } else { + choices.removeActiveItemsByValue("0"); + } + + let picker = $('input[name="daterange"]').data('daterangepicker') + subject.next(picker, categoriesEvent); +}); \ No newline at end of file diff --git a/app/views/pages/home.html.erb b/app/views/pages/home.html.erb index ebbeb0f..a602471 100644 --- a/app/views/pages/home.html.erb +++ b/app/views/pages/home.html.erb @@ -207,10 +207,10 @@