From aa2104c0d3f97829e85ab5f3a3cbf837f0c535a5 Mon Sep 17 00:00:00 2001 From: Robbe Date: Sun, 28 Apr 2024 14:36:35 +0200 Subject: [PATCH 001/145] lijst headers gemaakt --- frontend/frontend/src/i18n/en.ts | 2 + frontend/frontend/src/i18n/nl.ts | 2 + .../subjectsPage/AddChangeSubjectPage.tsx | 40 +++++++++++++++++-- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/frontend/frontend/src/i18n/en.ts b/frontend/frontend/src/i18n/en.ts index a0dc8583..5b5b39fe 100644 --- a/frontend/frontend/src/i18n/en.ts +++ b/frontend/frontend/src/i18n/en.ts @@ -92,6 +92,8 @@ const english = { must_pass: 'Must pass', archive_course_warning: 'Archive Course?', will_archive_projects: 'This will archive all projects.', + first_name: 'first name', + last_name: 'last name', } export default english diff --git a/frontend/frontend/src/i18n/nl.ts b/frontend/frontend/src/i18n/nl.ts index 6f37ec66..8d4f2220 100644 --- a/frontend/frontend/src/i18n/nl.ts +++ b/frontend/frontend/src/i18n/nl.ts @@ -92,6 +92,8 @@ const dutch = { must_pass: 'Moet slagen', archive_course_warning: 'Vak Archiveren?', will_archive_projects: 'Alle opdrachten worden gearchiveerd.', + first_name: 'voornaam', + last_name: 'familienaam', } export default dutch diff --git a/frontend/frontend/src/pages/subjectsPage/AddChangeSubjectPage.tsx b/frontend/frontend/src/pages/subjectsPage/AddChangeSubjectPage.tsx index 53c24963..44e6d99f 100644 --- a/frontend/frontend/src/pages/subjectsPage/AddChangeSubjectPage.tsx +++ b/frontend/frontend/src/pages/subjectsPage/AddChangeSubjectPage.tsx @@ -1,8 +1,9 @@ import { Box, + Card, Divider, IconButton, - ListItemButton, + ListItem, ListItemText, Stack, TextField, @@ -43,12 +44,42 @@ function UserList( ) { return ( <> + + + + {t('first_name')} + + + {t('last_name')} + + + email + + + + + + :not(style)': { marginBottom: '8px', - width: '75vw', }, }} > @@ -61,7 +92,7 @@ function UserList( This makes it possible to click through on a person. */} return ( <> - - + ) })} + ) } From 04a8ced826c0bc621da48f2a2051a075f830b740 Mon Sep 17 00:00:00 2001 From: Robbe Date: Sun, 28 Apr 2024 18:27:05 +0200 Subject: [PATCH 002/145] made basic layout --- .../src/pages/groupsPage/ChooseGroup.tsx | 128 ++++++++++++++++++ frontend/frontend/src/routes.tsx | 6 + 2 files changed, 134 insertions(+) create mode 100644 frontend/frontend/src/pages/groupsPage/ChooseGroup.tsx diff --git a/frontend/frontend/src/pages/groupsPage/ChooseGroup.tsx b/frontend/frontend/src/pages/groupsPage/ChooseGroup.tsx new file mode 100644 index 00000000..2c1b36db --- /dev/null +++ b/frontend/frontend/src/pages/groupsPage/ChooseGroup.tsx @@ -0,0 +1,128 @@ + +import { + Link, + Box, + Card, + Divider, + IconButton, + ListItem, + ListItemText, + Stack, + TextField, + Typography, + Dialog, +} from '@mui/material' +import List from '@mui/material/List' +import React, { ChangeEvent, useEffect, useState } from 'react' +import {Header} from "../../components/Header.tsx"; +import { t } from 'i18next' +import AddCircle from '@mui/icons-material/AddCircle' +import ClearIcon from '@mui/icons-material/Clear' + +export interface Group { + groep_id?: number + studenten: number[] + project: number +} + +export function ChooseGroup() { + + const [groups,setGroups]=useState([1,2,3]); + const [open,setOpen] = useState(false); + + const handleClose = () => { + setOpen(false); + } + + + return ( + <> + +
+ + + :not(style)': { + marginBottom: '8px', + }, + }} + > + {groups.map((id) => { + const group=getGroup(id) + return ( + <> + + + + + {setOpen(true)}} > + {group.studenten.length} + + + + + + + + ) + }) + } + + + + + {"placeholder"} + + + + + + + + + ) +} + +function getGroup(id: number): Group { + return { + groep_id: id, + studenten: [1,2,3], + project: 5 + } +} \ No newline at end of file diff --git a/frontend/frontend/src/routes.tsx b/frontend/frontend/src/routes.tsx index 3699f127..16275139 100644 --- a/frontend/frontend/src/routes.tsx +++ b/frontend/frontend/src/routes.tsx @@ -8,6 +8,7 @@ import ErrorPage from './pages/ErrorPage.tsx' import MainPage from './pages/mainPage/MainPage.tsx' import { GroupsPage } from './pages/groupsPage/GroupsPage.tsx' import { AssignmentPage } from './pages/assignmentPage/AssignmentPage.tsx' +import {ChooseGroup} from "./pages/groupsPage/ChooseGroup.tsx"; //TODO: add change/add course page when implemented const router = createBrowserRouter([ @@ -51,6 +52,11 @@ const router = createBrowserRouter([ element: , errorElement: , }, + { + path: '/groups/choose', + element: , + errorElement: , + }, { path: '*', element: , From cc8b596ec126b7e1b6b52efdff8863b050e2af82 Mon Sep 17 00:00:00 2001 From: Robbe Date: Sat, 4 May 2024 11:57:43 +0200 Subject: [PATCH 003/145] begin integratie groepen kiezen --- .../src/pages/groupsPage/ChooseGroup.tsx | 135 ++++++++++++++++-- frontend/frontend/src/routes.tsx | 2 +- 2 files changed, 122 insertions(+), 15 deletions(-) diff --git a/frontend/frontend/src/pages/groupsPage/ChooseGroup.tsx b/frontend/frontend/src/pages/groupsPage/ChooseGroup.tsx index 2c1b36db..de323cd4 100644 --- a/frontend/frontend/src/pages/groupsPage/ChooseGroup.tsx +++ b/frontend/frontend/src/pages/groupsPage/ChooseGroup.tsx @@ -17,7 +17,8 @@ import React, { ChangeEvent, useEffect, useState } from 'react' import {Header} from "../../components/Header.tsx"; import { t } from 'i18next' import AddCircle from '@mui/icons-material/AddCircle' -import ClearIcon from '@mui/icons-material/Clear' +import { useParams } from 'react-router-dom' +import instance from "../../axiosConfig.ts"; export interface Group { groep_id?: number @@ -25,15 +26,89 @@ export interface Group { project: number } +export interface User { + user: number + is_lesgever: boolean + first_name: string + last_name: string + email: string +} + + export function ChooseGroup() { - const [groups,setGroups]=useState([1,2,3]); + const params = useParams() + + + const [studenten,setStudenten]=useState>({}); + const [groups,setGroups]=useState([]); const [open,setOpen] = useState(false); + //const assignmentId = params.assignmentId + const assignmentId = 14 + const handleClose = () => { setOpen(false); } + useEffect(()=>{ + instance.get('projecten/'+assignmentId) + .then((res) =>{ + instance.get('vakken/'+res.data.vak) + .then((res) => { + //setStudenten(res.data.studenten) + for (let i=0;i { + setStudenten((oldstudenten) => { + console.log("insetStudenten") + console.log(res.data) + console.log(oldstudenten) + //return oldstudenten + return {...oldstudenten,[res.data.user]: res.data} + }) + }) + .catch((err) => { + console.log(err) + }) + } + }) + .catch((err) => { + console.log(err) + }) + }) + .catch((err) => { + console.log(err) + }) + + + instance.get('groepen/?project='+assignmentId) + .then((res) => { + for (let i=0;i { + + let found = false + const id = res.data[i].groep_id + for (const group of oldGroups) { + if (group.groep_id == id) { + found = true + } + } + if (found) { + return oldGroups + } else { + return [...oldGroups,res.data[i]] + } + }) + } + }) + .catch((err) => { + console.log(err) + }) + + },[]) + return ( <> @@ -58,6 +133,23 @@ export function ChooseGroup() { padding: '20px', }} > + + + {t('group_number')} + + + {t('members')} + + + + + - {groups.map((id) => { - const group=getGroup(id) + {groups.map((group: Group) => { + //const group=getGroup(id) return ( <> + + {group.studenten.map((studentid)=>{ + + //return studenten[studentid].first_name + + //console.log(students) + if(studenten[studentid]!=undefined){ + return ( + <> + + {studenten[studentid].first_name+" "+studenten[studentid].last_name} + + + ) + } + })} + + - {setOpen(true)}} > - {group.studenten.length} - , }, { - path: '/groups/choose', + path: '/groups/:assignmentId/choose', element: , errorElement: , }, From 7f1a568c17f953b4d0ff1877751c970928f4e540 Mon Sep 17 00:00:00 2001 From: Mathis De Witte Date: Sat, 4 May 2024 17:26:57 +0200 Subject: [PATCH 004/145] start of RestrictionTemplateUI --- .../cypress/e2e/1-getting-started/todo.cy.js | 143 ++++++++ .../e2e/2-advanced-examples/actions.cy.js | 321 ++++++++++++++++++ .../e2e/2-advanced-examples/aliasing.cy.js | 39 +++ .../e2e/2-advanced-examples/assertions.cy.js | 176 ++++++++++ .../e2e/2-advanced-examples/connectors.cy.js | 98 ++++++ .../e2e/2-advanced-examples/cookies.cy.js | 118 +++++++ .../e2e/2-advanced-examples/cypress_api.cy.js | 185 ++++++++++ .../e2e/2-advanced-examples/files.cy.js | 85 +++++ .../e2e/2-advanced-examples/location.cy.js | 32 ++ .../e2e/2-advanced-examples/misc.cy.js | 90 +++++ .../e2e/2-advanced-examples/navigation.cy.js | 56 +++ .../network_requests.cy.js | 163 +++++++++ .../e2e/2-advanced-examples/querying.cy.js | 114 +++++++ .../spies_stubs_clocks.cy.js | 204 +++++++++++ .../e2e/2-advanced-examples/storage.cy.js | 117 +++++++ .../e2e/2-advanced-examples/traversal.cy.js | 121 +++++++ .../e2e/2-advanced-examples/utilities.cy.js | 107 ++++++ .../e2e/2-advanced-examples/viewport.cy.js | 58 ++++ .../e2e/2-advanced-examples/waiting.cy.js | 30 ++ .../e2e/2-advanced-examples/window.cy.js | 22 ++ .../e2e/subjectsPage/SubjectsPage.cy.js | 17 + .../RestrictionTemplateUI.tsx | 107 ++++++ 22 files changed, 2403 insertions(+) create mode 100644 frontend/frontend/cypress/e2e/1-getting-started/todo.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/actions.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/aliasing.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/assertions.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/connectors.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/cookies.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/cypress_api.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/files.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/location.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/misc.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/navigation.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/network_requests.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/querying.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/spies_stubs_clocks.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/storage.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/traversal.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/utilities.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/viewport.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/waiting.cy.js create mode 100644 frontend/frontend/cypress/e2e/2-advanced-examples/window.cy.js create mode 100644 frontend/frontend/cypress/e2e/subjectsPage/SubjectsPage.cy.js create mode 100644 frontend/frontend/src/pages/addChangeAssignmentPage/RestrictionTemplateUI.tsx diff --git a/frontend/frontend/cypress/e2e/1-getting-started/todo.cy.js b/frontend/frontend/cypress/e2e/1-getting-started/todo.cy.js new file mode 100644 index 00000000..4768ff92 --- /dev/null +++ b/frontend/frontend/cypress/e2e/1-getting-started/todo.cy.js @@ -0,0 +1,143 @@ +/// + +// Welcome to Cypress! +// +// This spec file contains a variety of sample tests +// for a todo list app that are designed to demonstrate +// the power of writing tests in Cypress. +// +// To learn more about how Cypress works and +// what makes it such an awesome testing tool, +// please read our getting started guide: +// https://on.cypress.io/introduction-to-cypress + +describe('example to-do app', () => { + beforeEach(() => { + // Cypress starts out with a blank slate for each test + // so we must tell it to visit our website with the `cy.visit()` command. + // Since we want to visit the same URL at the start of all our tests, + // we include it in our beforeEach function so that it runs before each test + cy.visit('https://example.cypress.io/todo') + }) + + it('displays two todo items by default', () => { + // We use the `cy.get()` command to get all elements that match the selector. + // Then, we use `should` to assert that there are two matched items, + // which are the two default items. + cy.get('.todo-list li').should('have.length', 2) + + // We can go even further and check that the default todos each contain + // the correct text. We use the `first` and `last` functions + // to get just the first and last matched elements individually, + // and then perform an assertion with `should`. + cy.get('.todo-list li').first().should('have.text', 'Pay electric bill') + cy.get('.todo-list li').last().should('have.text', 'Walk the dog') + }) + + it('can add new todo items', () => { + // We'll store our item text in a variable so we can reuse it + const newItem = 'Feed the cat' + + // Let's get the input element and use the `type` command to + // input our new list item. After typing the content of our item, + // we need to type the enter key as well in order to submit the input. + // This input has a data-test attribute so we'll use that to select the + // element in accordance with best practices: + // https://on.cypress.io/selecting-elements + cy.get('[data-test=new-todo]').type(`${newItem}{enter}`) + + // Now that we've typed our new item, let's check that it actually was added to the list. + // Since it's the newest item, it should exist as the last element in the list. + // In addition, with the two default items, we should have a total of 3 elements in the list. + // Since assertions yield the element that was asserted on, + // we can chain both of these assertions together into a single statement. + cy.get('.todo-list li') + .should('have.length', 3) + .last() + .should('have.text', newItem) + }) + + it('can check off an item as completed', () => { + // In addition to using the `get` command to get an element by selector, + // we can also use the `contains` command to get an element by its contents. + // However, this will yield the