Added live search to teams demo page

Live search using ajax
This commit is contained in:
Corban-Lee 2023-05-05 00:24:10 +01:00
parent 05efd3109e
commit 0f1c839daa
4 changed files with 88 additions and 35 deletions

View File

@ -0,0 +1,11 @@
import names
from string import ascii_lowercase
created_teams = []
for char in ascii_lowercase:
created_teams.append({
"identifier": char.upper(),
"members": [{
"name": names.get_full_name()
} for i in range(9)]
})

View File

@ -16,32 +16,13 @@
</div>
<div class="col-md-6 col-xl-4">
<div class="input-group mb-4 mb-md-0">
<input type="search" class="form-control" placeholder="Search">
<input type="search" class="form-control" placeholder="Search" id="search">
<button type="button" class="btn border"><i class="bi bi-search"></i></button>
</div>
</div>
</div>
<div class="row">
{% for team in teams %}
<div class="col-12 col-md-6 col-xl-4 mb-4">
<div class="p-4 bg-body-tertiary rounded h-100">
<h4>{{team.identifier}}</h4>
<ul class="list-unstyled ul-cols-2">
{% for member in team.members %}
<li>
<span type="button" class="team-member" onclick="javascript:openEditModal('{{member.name}}');">
{{member.name}}
</span>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endfor %}
</div>
<div class="row" id="teamsContainer"></div>
</div>
<!-- Edit Modal -->
@ -79,6 +60,58 @@
{% block scripts %}
<script type="text/javascript">
$(document).ready(() => {
loadTeams();
var searchTimeout = null;
$("#search").keyup(() => {
clearTimeout(searchTimeout);
searchTimeout = setTimeout(() => {
loadTeams($("#search").val());
}, 500)
})
})
function loadTeams(search="") {
$.ajax({
url: "{% url 'get-teams' %}",
type: "post",
data: {
"csrfmiddlewaretoken": "{{ csrf_token }}",
"search": search
},
success: (results) => {
$("#teamsContainer").html("");
for (var i = 0; i < results.teams.length; i++) {
var team = results.teams[i];
$("#teamsContainer").append(
"<div class='col-12 col-md-6 col-xl-4 mb-4'>" +
"<div class='p-4 bg-body-tertiary rounded h-100'>" +
`<h4>${team.identifier}</h4>` +
"<ul class='list-unstyled ul-cols-2 team-members'>" +
"</ul>" +
"</div>" +
"</div>"
);
for (var j = 0; j < team.members.length; j++) {
var member = team.members[j];
$("#teamsContainer").find(".team-members").last().append(
"<li>" +
`<span type='button' class='team-member' onclick='javascript:openEditModal("${member.name}");'>${member.name}</span>` +
"</li>"
);
}
}
},
error: (xhr, textStatus, errorThrown) => {
alert(errorThrown);
}
});
}
function openEditModal(name) {
var [first, last] = name.split(" ");

View File

@ -7,5 +7,6 @@ urlpatterns = [
path('scoreboard/', views.scoreboard, name='scoreboard'),
path('teams/', views.teams, name='teams'),
path('bulk-peg/', views.bulk_create_pegs, name='bulk-peg')
path('bulk-peg/', views.bulk_create_pegs, name='bulk-peg'),
path('get-teams/', views.get_teams, name='get-teams'),
]

View File

@ -2,10 +2,11 @@
from string import ascii_lowercase
import names
from django.shortcuts import render, redirect
from django.http import JsonResponse
from .models import Peg
from .teams_demo_test import created_teams
def index(request):
return render(request, 'index.html')
@ -17,18 +18,7 @@ def scoreboard(request):
return render(request, 'scoreboard.html')
def teams(request):
teams = []
for char in ascii_lowercase:
teams.append({
"identifier": char.upper(),
"members": [{
"name": names.get_full_name()
} for i in range(9)]
})
context = {"teams": teams}
return render(request, 'teams.html', context=context)
return render(request, 'teams.html')
def bulk_create_pegs(request):
"""Bulk create pegs"""
@ -39,3 +29,21 @@ def bulk_create_pegs(request):
# return to previous page
return redirect(request.META.get('HTTP_REFERER'))
def get_teams(request):
"""Returns list of teams."""
if not request.POST:
return
search = request.POST.get("search")
if search:
created_teams.sort(reverse=True, key=lambda team: next((
member["name"] for member in team["members"]
if search.lower() in member["name"].lower()), ""
))
else:
created_teams.sort(reverse=False, key=lambda team: team["identifier"])
return JsonResponse({"teams": created_teams})