Skip to content

Commit

Permalink
Merge pull request #38 from At3flo/dev
Browse files Browse the repository at this point in the history
Category filter and small fixes
  • Loading branch information
matbgn authored Jul 17, 2019
2 parents 0593680 + 7d8885d commit f6cce95
Show file tree
Hide file tree
Showing 12 changed files with 200 additions and 118 deletions.
1 change: 1 addition & 0 deletions app/assets/stylesheets/application.scss
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
4 changes: 4 additions & 0 deletions app/assets/stylesheets/pages/_home.scss
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@
font-size: 20px;
}

.choices__list--multiple .choices__item {
background-color: #167FFB;
}

.editor-selector {
color: #167FFB;
font-size: 20px;
Expand Down
2 changes: 2 additions & 0 deletions app/controllers/pages_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ def home
end

@confirmRemoveTeam = t 'confirmRemoveTeam'
@selectsOneOrMoreCategories = t 'selectsOneOrMoreCategories'
@resetFilters = t 'resetFilters'

end

Expand Down
15 changes: 2 additions & 13 deletions app/javascript/components/datepicker.js
Original file line number Diff line number Diff line change
@@ -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(),
Expand Down Expand Up @@ -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 };
74 changes: 0 additions & 74 deletions app/javascript/components/filter.js

This file was deleted.

109 changes: 98 additions & 11 deletions app/javascript/packs/application.js
Original file line number Diff line number Diff line change
@@ -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);
});
45 changes: 29 additions & 16 deletions app/views/pages/home.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -207,10 +207,10 @@
<!-- All the filters' section -->
<div class="container">
<div class="row align-items-baseline">
<div class="col-4 col-md-2">
<div class="order-2 order-md-1 col-12 col-md-2">
<%= t 'daterange' %> :
</div>
<div class="col-8 col-sm-6">
<div class="order-3 order-md-2 col-12 col-md-6">
<div class="form-group">
<div class="input-group date" id="datetimepicker" data-target-input="nearest">
<input type="text" id="datefield" class="form-control datetimepicker-input" name="daterange" data-target="#datetimepicker" />
Expand All @@ -220,22 +220,20 @@
</div>
</div>
</div>
<div class="col-12 col-md-4">
<!-- <div class="align-items-center material-switch pull-right">
<input type="checkbox" id="isTournamentOpen" value="false"/>
<label for="isTournamentOpen" class="label-primary"></label>
&nbsp; <%= t 'showOpenTournamentsOnly' %>
</div> -->
<div class="order-1 order-md-3 col-12 col-md-4">
<div class="d-flex justify-content-end">
<button type="button" class="btn btn-primary btn-sm" id="reset-button"><%= @resetFilters %></button>
</div>
</div>
</div>
<div class="row row-filter align-items-center">
<div class="col-5 col-md-2">
<div class="row row-filter align-items-baseline">
<div class="col-3 col-md-2">
<%= t "organizer" %> :
</div>
<div class="col-7 col-md-3">
<div class="col-9 col-md-4 pb-3">

<div class="dropdown">
<select class="selectpicker form-control form-control-sm mr-1" id="teams" name="club_id" required
<select class="form-control mr-1" id="teams" name="club_id" required
data-style="btn-default">
<option value='0'><%= t "allOrganizer" %></option>
<% Club.all.each do |club| %>
Expand All @@ -244,6 +242,21 @@
</select>
</div>
</div>
<div class="col-3 col-md-2">
<%= t "category" %> :
</div>
<div class="col-9 col-md-4">

<div class="dropdown">
<%= "<select class='form-control' name='category_id' id='categories-selection' placeholder='#{@selectsOneOrMoreCategories}'
multiple>".html_safe %>
<option value='0' selected><%= t "allcategories" %></option>
<% @categories.each_with_index do |category, i| %>
<%= "<option value='#{Category.first.id+i}'>#{category}</option>".html_safe %>
<% end %>
</select>
</div>
</div>
</div>
<hr>
</div>
Expand Down Expand Up @@ -373,11 +386,11 @@
<% (JSON.parse event["categories"]).keys.each do |categorie| %>
<% if (JSON.parse event["categories"])[categorie]["total_places"].to_i > 0 %>
<% if (JSON.parse event["categories"])[categorie]["places_left"].to_i > 0 %>
<%= "<div class='btn btn-sq-xs btn-success sqPlaces' data-toggle='popover' title='#{t 'availabilityOfPlaces'}'
data-content='#{@categories[categorie.to_i - 1]}: #{t 'placesLeft'}#{(JSON.parse event["categories"])[categorie]["places_left"].to_i}/#{(JSON.parse event["categories"])[categorie]["total_places"]}' data-trigger='hover' data-placement='right'></div>".html_safe %>
<%= "<div class='btn btn-sq-xs btn-success sqPlaces' id='category-#{categorie.to_i}' data-toggle='popover' title='#{t 'availabilityOfPlaces'}'
data-content='#{@categories[categorie.to_i - 1]}: #{t 'placesLeft'}#{(JSON.parse event["categories"])[categorie]["places_left"].to_i}/#{(JSON.parse event["categories"])[categorie]["total_places"]}' data-trigger='hover' data-placement='bottom'></div>".html_safe %>
<% else %>
<%= "<div class='btn btn-sq-xs btn-danger sqPlaces' data-toggle='popover' title='#{t 'availabilityOfPlaces'}'
data-content='#{@categories[categorie.to_i - 1]}: #{t 'full'} #{(JSON.parse event["categories"])[categorie]["total_places"]}/#{(JSON.parse event["categories"])[categorie]["total_places"]}' data-trigger='hover' data-placement='right'></div>".html_safe %>
<%= "<div class='btn btn-sq-xs btn-danger sqPlaces' id='category-#{categorie.to_i}' data-toggle='popover' title='#{t 'availabilityOfPlaces'}'
data-content='#{@categories[categorie.to_i - 1]}: #{t 'full'} #{(JSON.parse event["categories"])[categorie]["total_places"]}/#{(JSON.parse event["categories"])[categorie]["total_places"]}' data-trigger='hover' data-placement='bottom'></div>".html_safe %>
<% end %>
<% end %>
<% end %>
Expand Down
2 changes: 2 additions & 0 deletions config/locales/de.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ de:
confirmRemoveTeam: 'Sind Sie sicher, dass Sie Ihre Mannschaft aus diesem Turnier entfernen wollen?'
teamsInscription: "Registrieren Sie ein Team aus Ihrem Verein"
noTeamRegistredForNow: "Zur Zeit ist noch kein Team angemeldet"
selectsOneOrMoreCategories: "Wählt eine oder mehrere Kategorien aus"
resetFilters: "Filtern zurücksetzen"
simple_form:
labels:
defaults:
Expand Down
2 changes: 2 additions & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ en:
confirmRemoveTeam: 'Are you sure you want to remove your team of this tournament ?'
teamsInscription: "Register a team from your club"
noTeamRegistredForNow: "No team registred for now"
selectsOneOrMoreCategories: "Selects one or more categories"
resetFilters: "Reset filters"
simple_form:
labels:
defaults:
Expand Down
2 changes: 2 additions & 0 deletions config/locales/fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ fr:
confirmRemoveTeam: 'Êtes-vous sûr de vouloir retirer votre équipe pour ce tournoi ?'
teamsInscription: "Inscrire une équipe de votre club"
noTeamRegistredForNow: "Aucune équipe inscrite pour le moment"
selectsOneOrMoreCategories: "Sélectionne une ou plusieurs catégories"
resetFilters: "Réinitialiser les filtres"
simple_form:
labels:
defaults:
Expand Down
6 changes: 4 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "swiss-hockey-tool",
"version": "0.5.0-beta",
"version": "0.6.0-beta",
"description": "The Swiss Hockey Tool (SHT) is an online tool that provide the ability to administer the organization of an Hockey tournament.",
"repository": {
"type": "git",
Expand All @@ -20,9 +20,11 @@
"dependencies": {
"@rails/webpacker": "^4.0.7",
"bootstrap": "^4.3.1",
"choices.js": "^7.0.0",
"daterangepicker": "^3.0.5",
"jquery": "^3.4.1",
"popper.js": "^1.15.0"
"popper.js": "^1.15.0",
"rxjs": "^6.5.2"
},
"devDependencies": {
"webpack-dev-server": "^3.7.2"
Expand Down
Loading

0 comments on commit f6cce95

Please sign in to comment.