diff --git a/backend/secfit/groups/models.py b/backend/secfit/groups/models.py index 63f3793df5f692db7b5a79981454fbaeda070f57..b6d7b50cebe6c27d59cbe794125a5b4b02a01a6d 100644 --- a/backend/secfit/groups/models.py +++ b/backend/secfit/groups/models.py @@ -5,7 +5,6 @@ from django.contrib.contenttypes.models import ContentType from django.urls import reverse from django.db import models from django.contrib.auth import get_user_model -from workouts.models import Workout # Create your models here. diff --git a/backend/secfit/groups/serializers.py b/backend/secfit/groups/serializers.py index c681927326c206f61a929ca9e633d0e8d105ff82..d58a16e01cb9c5ea34b0b6dd2ad2429b4d43ccc2 100644 --- a/backend/secfit/groups/serializers.py +++ b/backend/secfit/groups/serializers.py @@ -11,7 +11,7 @@ class GroupSerializer(serializers.HyperlinkedModelSerializer): fields = ["owner", "name", "description"] -class MembershipSerializer(serializers.HyperlinkedModelSerializer): +class MembershipSerializer(serializers.ModelSerializer): member = serializers.ReadOnlyField(source="member.username") class Meta: diff --git a/frontend/www/group.html b/frontend/www/group.html new file mode 100644 index 0000000000000000000000000000000000000000..f491a0a8e8776415332c240d1a8113f065ff7d58 --- /dev/null +++ b/frontend/www/group.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Group</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> + + <script src="https://kit.fontawesome.com/0ce6c392ca.js" crossorigin="anonymous"></script> + <link rel="stylesheet" href="styles/style.css"> + <script src="scripts/navbar.js" type="text/javascript" defer></script> +</head> + <body> + <navbar-el></navbar-el> + + <div class="container"> + <div class="row"> + <div class="col-lg"> + <h3 class="mt-3">Create Group</h3> + </div> + </div> + <form class="row g-3" id="form-group"> + <div class="col-lg-6 "> + <label for="inputName" class="form-label">Name</label> + <input type="text" class="form-control" id="inputName" name="name" readonly> + </div> + <div class="col-lg-6"></div> + <div class="col-lg-6"> + <label for="inputDescription" class="form-label">Description</label> + <textarea class="form-control" id="inputDescription" name="description" readonly></textarea> + </div> + <div class="col-lg-6"></div> + <div class="col-lg-6"> + <input type="button" class="btn btn-primary" id="btn-ok-group" value=" OK "> + <input type="button" class="btn btn-secondary" id="btn-cancel-group" value="Cancel"> + </div> + <div class="col-lg-6"> + + </div> + </form> + </div> + <script src="scripts/defaults.js"></script> + <script src="scripts/scripts.js"></script> + <script src="scripts/group.js"></script> + <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script> + </body> +</html> \ No newline at end of file diff --git a/frontend/www/groups.html b/frontend/www/groups.html new file mode 100644 index 0000000000000000000000000000000000000000..24ec44695e5eac67051bc2d968f21651f6388592 --- /dev/null +++ b/frontend/www/groups.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Groups</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> + + <script src="https://kit.fontawesome.com/0ce6c392ca.js" crossorigin="anonymous"></script> + <link rel="stylesheet" href="styles/style.css"> + <script src="scripts/navbar.js" type="text/javascript" defer></script> +</head> +<body> + <navbar-el></navbar-el> + + <div class="container"> + <div class="row"> + <div class="col-lg text-center"> + <h3 class="mt-5">View your groups!</h3> + <p>Here you can view, create, and edit groups you own.</p> + <input type="button" class="btn btn-primary" id="btn-create-group" value="Create new group"> + </div> + <div class="row"> + <div class="col-lg text-center"> + <div class="list-group mt-1" id="div-content"></div> + </div> + </div> + </div> + + <template id="template-group"> + <a class="list-group-item list-group-item-action flex-column align-items-start my-1 exercise" href=""> + <div class="d-flex w-100 justify-content-between align-items-center"> + <h5 class="mb-1"></h5> + </div> + <div class="d-flex"> + <p class="mb-1"> + </p> + </div> + </a> + </template> + + <script src="scripts/defaults.js"></script> + <script src="scripts/scripts.js"></script> + <script src="scripts/groups.js"></script> + <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script> +</body> +</html> \ No newline at end of file diff --git a/frontend/www/scripts/group.js b/frontend/www/scripts/group.js new file mode 100644 index 0000000000000000000000000000000000000000..adb777226b7ea76fda839b0cc098315a2e9543c2 --- /dev/null +++ b/frontend/www/scripts/group.js @@ -0,0 +1,39 @@ +let cancelButton; +let okButton; +let oldFormData; + +function handleCancelButtonDuringCreate() { + window.location.replace("groups.html"); +} + +async function createExercise() { + let form = document.querySelector("#form-group"); + let formData = new FormData(form); + let body = {"name": formData.get("name"), + "description": formData.get("description"), + }; + + let response = await sendRequest("POST", `${HOST}/api/groups/`, body); + + if (response.ok) { + window.location.replace("groups.html"); + } else { + let data = await response.json(); + let alert = createAlert("Could not create new group!", data); + document.body.prepend(alert); + } +} + +window.addEventListener("DOMContentLoaded", async () => { + cancelButton = document.querySelector("#btn-cancel-group"); + okButton = document.querySelector("#btn-ok-group"); + oldFormData = null; + + setReadOnly(false, "#form-group"); + + okButton.className = okButton.className.replace(" hide", ""); + cancelButton.className = cancelButton.className.replace(" hide", ""); + + okButton.addEventListener("click", async () => await createExercise()); + cancelButton.addEventListener("click", handleCancelButtonDuringCreate); +}); \ No newline at end of file diff --git a/frontend/www/scripts/groups.js b/frontend/www/scripts/groups.js new file mode 100644 index 0000000000000000000000000000000000000000..b15df62715851ccd568fa700a7f4a20e9cf56eed --- /dev/null +++ b/frontend/www/scripts/groups.js @@ -0,0 +1,42 @@ +async function fetchGroups(request) { + let response = await sendRequest("GET", `${HOST}/api/groups/`); + + if (response.ok) { + let data = await response.json(); + + let groups = data.results; + let container = document.getElementById('div-content'); + let exerciseTemplate = document.querySelector("#template-group"); + groups.forEach(group => { + const exerciseAnchor = exerciseTemplate.content.firstElementChild.cloneNode(true); + exerciseAnchor.href = `exercise.html?id=${group.id}`; + + const h5 = exerciseAnchor.querySelector("h5"); + h5.textContent = group.name; + + const p = exerciseAnchor.querySelector("p"); + p.textContent = group.description; + + container.appendChild(exerciseAnchor); + }); + } + + return response; +} + +function createGroup() { + window.location.replace("group.html"); +} + +window.addEventListener("DOMContentLoaded", async () => { + let createButton = document.querySelector("#btn-create-group"); + createButton.addEventListener("click", createGroup); + + let response = await fetchGroups(); + + if (!response.ok) { + let data = await response.json(); + let alert = createAlert("Could not retrieve groups!", data); + document.body.prepend(alert); + } +});