Skip to content

Commit

Permalink
Squad settings on event creation
Browse files Browse the repository at this point in the history
  • Loading branch information
Alf-Melmac committed Jan 28, 2022
1 parent 3f1b572 commit daa2447
Show file tree
Hide file tree
Showing 7 changed files with 261 additions and 159 deletions.
6 changes: 3 additions & 3 deletions src/main/java/de/webalf/slotbot/model/dtos/GuildDto.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package de.webalf.slotbot.model.dtos;

import lombok.AccessLevel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.Value;
import lombok.experimental.SuperBuilder;

import javax.validation.constraints.Size;
Expand All @@ -16,9 +16,9 @@
*/
@EqualsAndHashCode(callSuper = true)
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
@Value
@Data
@SuperBuilder
public class GuildDto extends AbstractIdEntityDto {
@Size(max = TEXT)
String groupIdentifier;
private String groupIdentifier;
}
14 changes: 13 additions & 1 deletion src/main/resources/static/assets/js/eventSave.js
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,13 @@ function getSquads(update = false) {
name: $completeSquad.find('.js-squad-name').val().trim(),
slotList: []
};
const $squadSettings = $completeSquad.find('.js-settings');
const squadReservedFor = $squadSettings.attr('data-reservedfor');
if (squadReservedFor) {
squad.reservedFor = {
id: squadReservedFor
};
}
if (update) {
squad.id = $completeSquad.data('squadid');
}
Expand All @@ -140,7 +147,12 @@ function getSquads(update = false) {
number: $slot.find('.js-slot-number').val()
};
const $slotSettings = $slot.find('.js-settings');
slot.reservedFor = $slotSettings.attr('data-reservedfor');
const slotReservedFor = $slotSettings.attr('data-reservedfor');
if (slotReservedFor) {
slot.reservedFor = {
id: slotReservedFor
};
}
const blocked = $slotSettings.attr('data-blocked') === "true";
slot.blocked = blocked;
if (blocked) {
Expand Down
296 changes: 156 additions & 140 deletions src/main/resources/static/assets/js/slotList.js
Original file line number Diff line number Diff line change
@@ -1,155 +1,171 @@
$(function () {
"use strict";

// Sortable
const $sortable = $('.js-sortable');
$sortable.sortable();

const $squads = $('#squads');
const $addSquad = $('#addSquad');

//Only allow positive whole numbers
$squads.on('keypress', '.js-slot-number', event => {
const charCode = event.charCode;
return (charCode === 8 || charCode === 0 || charCode === 13) ? null : charCode >= 48 && charCode <= 57;
});

const newSlot =
`<div class="form-row align-items-center js-slot">
<div class="col-md-1">
<input class="form-control js-slot-number" type="number" min="1" value="{defaultSlotValue}" required>
</div>
<div class="col-md-10">
<input class="form-control js-slot-name" type="text" placeholder="Slot Name" required>
</div>
<div class="col-md-1">
<div class="dropdown">
<div class="btn btn-xl btn-wht p-0 pr-1" type="button" data-toggle="dropdown" aria-expanded="false">
<em class="fas fa-ellipsis-h"></em>
</div>
<div class="dropdown-menu">
<button class="dropdown-item js-settings" type="button" data-toggle="modal" data-target="#slotSettings">
<div class="row">
<div class="col-3">
<em class="fas fa-user-cog"></em>
</div>
<div class="col-9">
<span>Regeln</span>
</div>
</div>
</button>
<button class="dropdown-item js-trash" type="button">
<div class="row">
<div class="col-3">
<em class="far fa-trash-alt"></em>
</div>
<div class="col-9">
<span>Löschen</span>
</div>
</div>
</button>
</div>
</div>
</div>
</div>`;

const newSquad =
`<div class="form-group js-complete-squad">
<div class="form-row align-items-center js-squad">
<div><em class="fas fa-arrows-alt-v"></em></div>
<div class="col-md-11">
<input class="form-control js-squad-name" type="text" placeholder="Squad Name" required>
</div>
<div class="d-flex btn btn-xl btn-wht js-trash" type="button"><em class="far fa-trash-alt"></em></div>
</div>
<div class="ml-5 js-slots">
${newSlot}
<div type="button" class="btn btn-success rounded-circle js-add-slot" title="Slot hinzufügen">
<em class="fas fa-plus"></em>
</div>
</div>
</div>`;

$addSquad.on('click', function () {
$squads.append(newSquad.replace('{defaultSlotValue}', findFirstUnusedSlotNumber()));
$(this).appendTo($squads);
});

if ($squads.hasClass('js-wizard')) { //Create initial squad in wizard
$addSquad.trigger('click');
}

$squads.on('click', '.js-add-slot', function () {
const $this = $(this);
const $slots = $this.parent('.js-slots');
$slots.append(newSlot.replace('{defaultSlotValue}', findFirstUnusedSlotNumber()));
$this.appendTo($slots);
});

function findFirstUnusedSlotNumber() {
const slotNumbers = getSlotNumbers().sort((a, b) => a - b);
let slotNumber = 1;

for (const currentNumber of slotNumbers) {
while (slotNumber < currentNumber) {
if (slotNumber !== currentNumber) {
return slotNumber;
}

slotNumber++;
}
slotNumber++;
}
return slotNumber;
}

$('#renumber').on('click', function () {
$squads.find('.js-slot-number').each(function (index) {
$(this).val(index + 1);
});
});
"use strict";

// Sortable
const $sortable = $('.js-sortable');
$sortable.sortable();

const $squads = $('#squads');
const $addSquad = $('#addSquad');

//Only allow positive whole numbers
$squads.on('keypress', '.js-slot-number', event => {
const charCode = event.charCode;
return (charCode === 8 || charCode === 0 || charCode === 13) ? null : charCode >= 48 && charCode <= 57;
});

const dropDownMenu =
`<div class="dropdown">
<div class="btn btn-xl btn-wht p-0 pr-1" type="button" data-toggle="dropdown" aria-expanded="false">
<em class="fas fa-ellipsis-h"></em>
</div>
<div class="dropdown-menu">
<button class="dropdown-item js-settings" type="button" data-toggle="modal" data-target="#{replace_target}">
<div class="row">
<div class="col-3">
<em class="fas fa-user-cog"></em>
</div>
<div class="col-9">
<span>Regeln</span>
</div>
</div>
</button>
<button class="dropdown-item js-trash" type="button">
<div class="row">
<div class="col-3">
<em class="far fa-trash-alt"></em>
</div>
<div class="col-9">
<span>Löschen</span>
</div>
</div>
</button>
</div>
</div>`;

function dropdownMenu(dataTarget) {
return dropDownMenu.replace('{replace_target}', dataTarget);
}

const newSlot =
`<div class="form-row align-items-center js-slot">
<div class="col-md-1">
<input class="form-control js-slot-number" type="number" min="1" value="{defaultSlotValue}" required>
</div>
<div class="col-md-10">
<input class="form-control js-slot-name" type="text" placeholder="Slot Name" required>
</div>
<div class="col-md-1">
${dropdownMenu('slotSettings')}
</div>
</div>`;

const newSquad =
`<div class="form-group js-complete-squad">
<div class="form-row align-items-center js-squad">
<div><em class="fas fa-arrows-alt-v"></em></div>
<div class="col-md-11">
<input class="form-control js-squad-name" type="text" placeholder="Squad Name" required>
</div>
${dropdownMenu('squadSettings')}
</div>
<div class="ml-5 js-slots">
${newSlot}
<div type="button" class="btn btn-success rounded-circle js-add-slot" title="Slot hinzufügen">
<em class="fas fa-plus"></em>
</div>
</div>
</div>`;

$addSquad.on('click', function () {
$squads.append(newSquad.replace('{defaultSlotValue}', findFirstUnusedSlotNumber()));
$(this).appendTo($squads);
});

if ($squads.hasClass('js-wizard')) { //Create initial squad in wizard
$addSquad.trigger('click');
}

$squads.on('click', '.js-add-slot', function () {
const $this = $(this);
const $slots = $this.parent('.js-slots');
$slots.append(newSlot.replace('{defaultSlotValue}', findFirstUnusedSlotNumber()));
$this.appendTo($slots);
});

function findFirstUnusedSlotNumber() {
const slotNumbers = getSlotNumbers().sort((a, b) => a - b);
let slotNumber = 1;

for (const currentNumber of slotNumbers) {
while (slotNumber < currentNumber) {
if (slotNumber !== currentNumber) {
return slotNumber;
}

slotNumber++;
}
slotNumber++;
}
return slotNumber;
}

$squads.on('click', '.js-trash', function () {
const $row = $(this).parents('.form-row');
if ($row.hasClass('js-squad')) {
$row.parent('.js-complete-squad').remove();
} else {
$row.remove();
}
});

$('#renumber').on('click', function () {
$squads.find('.js-slot-number').each(function (index) {
$(this).val(index + 1);
});
});
});

function getSlotNumbers() {
return $.map($('.js-slot-number'), el => parseInt($(el).val()));
return $.map($('.js-slot-number'), el => parseInt($(el).val()));
}

function checkUniqueSlotNumbers() {
const slotNumbers = getSlotNumbers();
return slotNumbers.length === new Set(slotNumbers).size;
const slotNumbers = getSlotNumbers();
return slotNumbers.length === new Set(slotNumbers).size;
}

function addSlotList(slotList) {
$('#uploadSlotlistModal').modal('hide'); //Close upload modal
$('#squads').find('.js-trash').trigger('click'); //Remove all existing squads and slots
$('#uploadSlotlistModal').modal('hide'); //Close upload modal
$('#squads').find('.js-trash').trigger('click'); //Remove all existing squads and slots

for (const squad of slotList) {
$('#addSquad').trigger('click');
fillSquad($('.js-complete-squad').last(), squad);
}
for (const squad of slotList) {
$('#addSquad').trigger('click');
fillSquad($('.js-complete-squad').last(), squad);
}
}

function fillSquad($squad, squad) {
$squad.find('.js-squad-name').val(squad.name);
let first = true;
for (const slot of squad.slotList) {
if (!first) {
$squad.find('.js-add-slot').trigger('click');
} else {
first = false;
}
const $slot = $squad.find('.js-slot').last();
if (slot.number !== 0) {
$slot.find('.js-slot-number').val(slot.number);
}
$slot.find('.js-slot-name').val(slot.name);
const $slotSettings = $slot.find('.js-setting');
$slotSettings.attr('data-reservedfor', slot.reservedFor);
const blocked = slot.blocked;
$slotSettings.attr('data-blocked', blocked);
if (blocked) {
$slotSettings.attr('data-replacementtext', slot.text);
}
}
$squad.find('.js-squad-name').val(squad.name);
let first = true;
for (const slot of squad.slotList) {
if (!first) {
$squad.find('.js-add-slot').trigger('click');
} else {
first = false;
}
const $slot = $squad.find('.js-slot').last();
if (slot.number !== 0) {
$slot.find('.js-slot-number').val(slot.number);
}
$slot.find('.js-slot-name').val(slot.name);
const $slotSettings = $slot.find('.js-setting');
$slotSettings.attr('data-reservedfor', slot.reservedFor);
const blocked = slot.blocked;
$slotSettings.attr('data-blocked', blocked);
if (blocked) {
$slotSettings.attr('data-replacementtext', slot.text);
}
}
}

0 comments on commit daa2447

Please sign in to comment.