From 1aa6895aeceffb75bce3ea2b6891201a45b768a1 Mon Sep 17 00:00:00 2001 From: Andrew Lalis Date: Tue, 14 May 2019 11:04:28 +0200 Subject: [PATCH] Added user to every page, preparing for special access rights. --- design/TAA.svg | 105 ++++++++++++++++++ .../config/WebSecurityConfig.java | 2 +- .../controllers/CoursesController.java | 2 +- .../controllers/RootController.java | 16 +-- .../controllers/StudentsController.java | 2 +- .../TeachingAssistantsController.java | 2 +- .../controllers/UserPageController.java | 23 ++++ .../controllers/courses/CourseEntity.java | 3 +- .../controllers/courses/CreateCourse.java | 3 +- .../controllers/courses/Generate.java | 3 +- .../courses/entity/ImportStudents.java | 3 +- .../student_teams/ExportStudentTeams.java | 3 +- .../student_teams/GenerateRepositories.java | 3 +- .../student_teams/MergeSingleTeams.java | 3 +- .../student_teams/StudentTeamEntity.java | 3 +- .../student_teams/UpdateBranchProtection.java | 3 +- .../students/InviteAllToRepository.java | 3 +- .../AssignToStudentTeams.java | 3 +- .../CreateTeachingAssistantTeam.java | 3 +- .../TeachingAssistantTeamEntity.java | 3 +- .../students/StudentCreateController.java | 3 +- .../students/StudentEntityController.java | 3 +- .../TeachingAssistantEntityController.java | 3 +- src/main/resources/static/css/footer.css | 20 +--- src/main/resources/static/css/header.css | 40 +------ src/main/resources/static/css/style.css | 1 + src/main/resources/static/images/favicon.ico | Bin 0 -> 15086 bytes src/main/resources/static/images/logo.png | Bin 0 -> 9526 bytes .../resources/templates/fragments/footer.html | 37 ++++-- .../resources/templates/fragments/header.html | 40 +++++-- .../templates/layouts/basic_page.html | 6 +- .../templates/layouts/navbar_page.html | 33 ++++++ src/main/resources/templates/login.html | 34 +----- 33 files changed, 277 insertions(+), 134 deletions(-) create mode 100644 design/TAA.svg create mode 100644 src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/UserPageController.java create mode 100644 src/main/resources/static/images/favicon.ico create mode 100644 src/main/resources/static/images/logo.png create mode 100644 src/main/resources/templates/layouts/navbar_page.html diff --git a/design/TAA.svg b/design/TAA.svg new file mode 100644 index 0000000..db5ff97 --- /dev/null +++ b/design/TAA.svg @@ -0,0 +1,105 @@ + + + + + + + + + + image/svg+xml + + + + + + + + T A A + diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/config/WebSecurityConfig.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/config/WebSecurityConfig.java index 877ac1d..f4adcc0 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/config/WebSecurityConfig.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/config/WebSecurityConfig.java @@ -37,7 +37,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .and() .authorizeRequests() - .antMatchers("/css/**") + .antMatchers("/css/**", "/images/**") .permitAll() .and() diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/CoursesController.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/CoursesController.java index 8883abf..9c947d5 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/CoursesController.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/CoursesController.java @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.PostMapping; * Controller for the list of courses in the system. */ @Controller -public class CoursesController { +public class CoursesController extends UserPageController { private CourseRepository courseRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/RootController.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/RootController.java index 54a8fea..336324b 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/RootController.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/RootController.java @@ -1,22 +1,14 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers; -import nl.andrewlalis.teaching_assistant_assistant.model.security.UserDetails; -import org.springframework.security.core.Authentication; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.GetMapping; @Controller -public class RootController { +public class RootController extends UserPageController { - @RequestMapping( - path = "/", - produces = "text/html" - ) - public String index(Authentication authentication, Model model) { - UserDetails userDetails = (UserDetails) authentication.getPrincipal(); - model.addAttribute("user", userDetails.getUser()); + @GetMapping("/") + public String index(Model model) { return "index"; } - } diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/StudentsController.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/StudentsController.java index 66b8aca..4294597 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/StudentsController.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/StudentsController.java @@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.GetMapping; * Controller for operations dealing with the global collection of students, not particular to one course. */ @Controller -public class StudentsController { +public class StudentsController extends UserPageController { private StudentRepository studentRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/TeachingAssistantsController.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/TeachingAssistantsController.java index 91cc428..c389097 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/TeachingAssistantsController.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/TeachingAssistantsController.java @@ -17,7 +17,7 @@ import java.util.Optional; * Controller for the list of teaching assistants in the system. */ @Controller -public class TeachingAssistantsController { +public class TeachingAssistantsController extends UserPageController { private TeachingAssistantRepository teachingAssistantRepository; private CourseRepository courseRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/UserPageController.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/UserPageController.java new file mode 100644 index 0000000..f0cb073 --- /dev/null +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/UserPageController.java @@ -0,0 +1,23 @@ +package nl.andrewlalis.teaching_assistant_assistant.controllers; + +import nl.andrewlalis.teaching_assistant_assistant.model.security.User; +import nl.andrewlalis.teaching_assistant_assistant.model.security.UserDetails; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.ModelAttribute; + +/** + * An abstract controller which simplifies the definition of controllers for pages that require a user to be signed in. + */ +public abstract class UserPageController { + + /** + * A shortcut to get the current authenticated user. + * @param auth The spring authentication. + * @return The user that's logged in. + */ + @ModelAttribute("user") + protected User getUser(Authentication auth) { + UserDetails userDetails = (UserDetails) auth.getPrincipal(); + return userDetails.getUser(); + } +} diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/CourseEntity.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/CourseEntity.java index a052060..1ca3837 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/CourseEntity.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/CourseEntity.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository; import org.springframework.stereotype.Controller; @@ -13,7 +14,7 @@ import java.util.Optional; * Controller for the course entity, that is, one individual course. */ @Controller -public class CourseEntity { +public class CourseEntity extends UserPageController { private CourseRepository courseRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/CreateCourse.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/CreateCourse.java index 7d8cd0d..1924056 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/CreateCourse.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/CreateCourse.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository; import org.springframework.stereotype.Controller; @@ -7,7 +8,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller -public class CreateCourse { +public class CreateCourse extends UserPageController { private CourseRepository courseRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/Generate.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/Generate.java index 2d5227b..0658a62 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/Generate.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/Generate.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository; import nl.andrewlalis.teaching_assistant_assistant.util.sample_data.CourseGenerator; @@ -10,7 +11,7 @@ import org.springframework.web.bind.annotation.GetMapping; import java.util.List; @Controller -public class Generate { +public class Generate extends UserPageController { private CourseRepository courseRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/ImportStudents.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/ImportStudents.java index 516efcc..94b085c 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/ImportStudents.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/ImportStudents.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses.entity; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository; @@ -22,7 +23,7 @@ import java.util.Optional; * Controller for importing students from a CSV sheet. */ @Controller -public class ImportStudents { +public class ImportStudents extends UserPageController { private CourseRepository courseRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/ExportStudentTeams.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/ExportStudentTeams.java index 7375204..d198cb2 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/ExportStudentTeams.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/ExportStudentTeams.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses.entity.student_teams; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.people.Student; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam; @@ -18,7 +19,7 @@ import java.util.Optional; * Controller for exporting team information into readable files. */ @Controller -public class ExportStudentTeams { +public class ExportStudentTeams extends UserPageController { private CourseRepository courseRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/GenerateRepositories.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/GenerateRepositories.java index 9d05182..0f242c9 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/GenerateRepositories.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/GenerateRepositories.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses.entity.student_teams; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository; @@ -15,7 +16,7 @@ import java.io.IOException; import java.util.Optional; @Controller -public class GenerateRepositories { +public class GenerateRepositories extends UserPageController { private CourseRepository courseRepository; private StudentTeamRepository studentTeamRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/MergeSingleTeams.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/MergeSingleTeams.java index 1d5ac35..c2655a2 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/MergeSingleTeams.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/MergeSingleTeams.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses.entity.student_teams; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository; @@ -20,7 +21,7 @@ import java.util.Optional; * TODO: Implement this functionality automatically. */ @Controller -public class MergeSingleTeams { +public class MergeSingleTeams extends UserPageController { private Logger logger = LogManager.getLogger(MergeSingleTeams.class); diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/StudentTeamEntity.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/StudentTeamEntity.java index 18cf28d..610f6a8 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/StudentTeamEntity.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/StudentTeamEntity.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses.entity.student_teams; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.people.Student; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam; @@ -20,7 +21,7 @@ import java.util.List; import java.util.Optional; @Controller -public class StudentTeamEntity { +public class StudentTeamEntity extends UserPageController { private StudentTeamRepository studentTeamRepository; private CourseRepository courseRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/UpdateBranchProtection.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/UpdateBranchProtection.java index 41636b0..bc60bcc 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/UpdateBranchProtection.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/student_teams/UpdateBranchProtection.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses.entity.student_teams; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository; @@ -15,7 +16,7 @@ import java.util.Optional; * Updates branch protection for all student repositories in a given course. */ @Controller -public class UpdateBranchProtection { +public class UpdateBranchProtection extends UserPageController { private CourseRepository courseRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/students/InviteAllToRepository.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/students/InviteAllToRepository.java index 1803284..c33d3bd 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/students/InviteAllToRepository.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/students/InviteAllToRepository.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses.entity.students; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.people.Student; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository; @@ -17,7 +18,7 @@ import java.util.List; import java.util.Optional; @Controller -public class InviteAllToRepository { +public class InviteAllToRepository extends UserPageController { private CourseRepository courseRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/teaching_assistant_teams/AssignToStudentTeams.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/teaching_assistant_teams/AssignToStudentTeams.java index e1e23f2..8bbc84e 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/teaching_assistant_teams/AssignToStudentTeams.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/teaching_assistant_teams/AssignToStudentTeams.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses.entity.teaching_assistant_teams; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.TeachingAssistantTeam; @@ -14,7 +15,7 @@ import org.springframework.web.bind.annotation.RequestParam; import java.util.*; @Controller -public class AssignToStudentTeams { +public class AssignToStudentTeams extends UserPageController { private CourseRepository courseRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/teaching_assistant_teams/CreateTeachingAssistantTeam.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/teaching_assistant_teams/CreateTeachingAssistantTeam.java index fef4843..d92e1c4 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/teaching_assistant_teams/CreateTeachingAssistantTeam.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/teaching_assistant_teams/CreateTeachingAssistantTeam.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses.entity.teaching_assistant_teams; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.people.TeachingAssistant; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.TeachingAssistantTeam; @@ -15,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestParam; import java.util.Optional; @Controller -public class CreateTeachingAssistantTeam { +public class CreateTeachingAssistantTeam extends UserPageController { private CourseRepository courseRepository; private TeachingAssistantRepository teachingAssistantRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/teaching_assistant_teams/TeachingAssistantTeamEntity.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/teaching_assistant_teams/TeachingAssistantTeamEntity.java index 5923980..a4d60c1 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/teaching_assistant_teams/TeachingAssistantTeamEntity.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/courses/entity/teaching_assistant_teams/TeachingAssistantTeamEntity.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses.entity.teaching_assistant_teams; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.TeachingAssistantTeam; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository; @@ -12,7 +13,7 @@ import org.springframework.web.bind.annotation.PathVariable; import java.util.Optional; @Controller -public class TeachingAssistantTeamEntity { +public class TeachingAssistantTeamEntity extends UserPageController { private CourseRepository courseRepository; private TeachingAssistantTeamRepository teachingAssistantTeamRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/students/StudentCreateController.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/students/StudentCreateController.java index ffce89b..2f59c83 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/students/StudentCreateController.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/students/StudentCreateController.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.students; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.people.Student; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository; @@ -17,7 +18,7 @@ import java.util.Optional; * Controller for creating a new student. */ @Controller -public class StudentCreateController { +public class StudentCreateController extends UserPageController { /** * A constant which defines what value is returned if the user says that the newly created student should not be diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/students/StudentEntityController.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/students/StudentEntityController.java index 2d2f8f5..c727408 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/students/StudentEntityController.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/students/StudentEntityController.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.students; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.people.Student; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.StudentRepository; import org.springframework.stereotype.Controller; @@ -13,7 +14,7 @@ import java.util.Optional; * Controller for a single student entity. */ @Controller -public class StudentEntityController { +public class StudentEntityController extends UserPageController { private StudentRepository studentRepository; diff --git a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/teaching_assistants/TeachingAssistantEntityController.java b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/teaching_assistants/TeachingAssistantEntityController.java index acf4c94..9572e61 100644 --- a/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/teaching_assistants/TeachingAssistantEntityController.java +++ b/src/main/java/nl/andrewlalis/teaching_assistant_assistant/controllers/teaching_assistants/TeachingAssistantEntityController.java @@ -1,5 +1,6 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.teaching_assistants; +import nl.andrewlalis.teaching_assistant_assistant.controllers.UserPageController; import nl.andrewlalis.teaching_assistant_assistant.model.people.TeachingAssistant; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.TeachingAssistantRepository; import org.springframework.stereotype.Controller; @@ -13,7 +14,7 @@ import java.util.Optional; * Controller for a single teaching assistant entity. */ @Controller -public class TeachingAssistantEntityController { +public class TeachingAssistantEntityController extends UserPageController { private TeachingAssistantRepository teachingAssistantRepository; diff --git a/src/main/resources/static/css/footer.css b/src/main/resources/static/css/footer.css index 6f8e752..48a62c8 100644 --- a/src/main/resources/static/css/footer.css +++ b/src/main/resources/static/css/footer.css @@ -1,17 +1,9 @@ -.footer_bar { - background-color: darkslategray; - color: whitesmoke; - height: 30px; - padding-top: 20px; - padding-bottom: 20px; - position: fixed; - width: 100%; - bottom: 0; - z-index: -1; /* Make this footer appear above all other things. */ +body { + padding-bottom: 110px; } -.third { - width: 33%; - display: inline-block; - text-align: center; +.footer { + background-color: darkslategray; + color: whitesmoke; + height: 100px; } \ No newline at end of file diff --git a/src/main/resources/static/css/header.css b/src/main/resources/static/css/header.css index 4f929d5..11c0071 100644 --- a/src/main/resources/static/css/header.css +++ b/src/main/resources/static/css/header.css @@ -1,45 +1,13 @@ -body { - padding: 0; - margin: 0; - background-color: whitesmoke; -} - -.header_bar { +.header { background-color: green; - width: 100%; color: whitesmoke; - padding-bottom: 20px; - padding-top: 20px; - height: 30px; } -.header_title { - margin-top: auto; - margin-bottom: auto; - width: 25%; - display: inline; - font-size: 30px; -} - -.header_link_list { - list-style-type: none; - margin: 0; - padding: 0; - width: 75%; - display: inline; -} - -.header_link_list li { - display: inline-block; -} - -.header_link_list a { +.header a { text-decoration: none; color: inherit; - background-color: darkgreen; - padding: 10px; } -.header_link_list a:hover { - background-color: darkgray; +.header a:hover { + color: lightgray; } \ No newline at end of file diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css index 1505eac..6f2cfb1 100644 --- a/src/main/resources/static/css/style.css +++ b/src/main/resources/static/css/style.css @@ -2,6 +2,7 @@ body { font-family: sans-serif; background-color: white; + padding-bottom: 70px; } .content_container { diff --git a/src/main/resources/static/images/favicon.ico b/src/main/resources/static/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8c497afcf008841843b8891e29391411021065a9 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/static/images/logo.png b/src/main/resources/static/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9281ddc57d42ee515700c86b0caead860fd7677d GIT binary patch literal 9526 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 -