+
{showTicket && }
diff --git a/frontend/src/Components/index.ts b/frontend/src/Components/index.ts
index 1ffd6c92e..919b7cfb1 100644
--- a/frontend/src/Components/index.ts
+++ b/frontend/src/Components/index.ts
@@ -21,6 +21,7 @@ export { EventCardContainer } from './EventCardContainer';
export { EventQuery } from './EventQuery';
export { ExpandableHeader } from './ExpandableHeader';
export { ExpandableList } from './ExpandableList';
+export { EventCrudButtons } from './EventCrudButtons';
export { ExternalHostBox } from './ExternalHostBox';
export { Footer } from './Footer';
export { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, useFormField } from './Forms';
diff --git a/frontend/src/Pages/EventPage/EventPage.module.scss b/frontend/src/Pages/EventPage/EventPage.module.scss
index 7d3abf0d8..064283c89 100644
--- a/frontend/src/Pages/EventPage/EventPage.module.scss
+++ b/frontend/src/Pages/EventPage/EventPage.module.scss
@@ -21,7 +21,7 @@
.event_image {
height: 45vh;
margin: 0;
- object-fit:cover;
+ object-fit: cover;
border-bottom-right-radius: 0.10rem;
border-bottom-left-radius: 0.10rem;
}
@@ -66,7 +66,7 @@
max-width: 50em;
}
-.expandable_header{
+.expandable_header {
display: flex;
align-items: center;
justify-content: center;
@@ -74,4 +74,12 @@
padding: 0 0.15rem 0 0.25rem;
border: 1px solid $black;
border-radius: 2rem;
-}
\ No newline at end of file
+}
+
+.admin_panel {
+ display: flex;
+ flex-direction: row;
+ gap: 20px;
+ margin: 15px 0 10px 0;
+ color: white;
+}
diff --git a/frontend/src/Pages/EventPage/EventPage.tsx b/frontend/src/Pages/EventPage/EventPage.tsx
index b47e3f85b..fd979b5ca 100644
--- a/frontend/src/Pages/EventPage/EventPage.tsx
+++ b/frontend/src/Pages/EventPage/EventPage.tsx
@@ -2,14 +2,18 @@ import { useQuery } from '@tanstack/react-query';
import { useTranslation } from 'react-i18next';
import { useParams } from 'react-router';
import { ExpandableHeader, ExternalHostBox, H1, Image, Page } from '~/Components';
+import { EventCrudButtons } from '~/Components';
import { BuyEventTicket } from '~/Components/BuyEventTicket/BuyEventTicket';
import { SamfMarkdown } from '~/Components/SamfMarkdown';
import { getEvent } from '~/api';
import { BACKEND_DOMAIN } from '~/constants';
+import { useAuthContext } from '~/context/AuthContext';
import { useTitle } from '~/hooks';
import { KEY } from '~/i18n/constants';
+import { PERM } from '~/permissions';
import { eventKeys } from '~/queryKeys';
import { dbT } from '~/utils';
+import { hasPerm } from '~/utils';
import styles from './EventPage.module.scss';
import { EventInformation } from './components/EventInformation/EventInformation';
import { EventTable } from './components/EventTable';
@@ -17,6 +21,8 @@ import { EventTable } from './components/EventTable';
export function EventPage() {
const { t } = useTranslation();
const { id } = useParams();
+ const { user } = useAuthContext();
+ const canChangeEvent = hasPerm({ user: user, permission: PERM.SAMFUNDET_CHANGE_EVENT, obj: id });
const { data: event, isLoading } = useQuery({
queryKey: id ? eventKeys.detail(Number(id)) : ['events', 'no-id'],
@@ -31,6 +37,12 @@ export function EventPage() {
{event &&
}
{event &&
}
diff --git a/frontend/src/Pages/EventsPage/components/EventsList/EventsList.tsx b/frontend/src/Pages/EventsPage/components/EventsList/EventsList.tsx
index dc4062d0c..1f028d07b 100644
--- a/frontend/src/Pages/EventsPage/components/EventsList/EventsList.tsx
+++ b/frontend/src/Pages/EventsPage/components/EventsList/EventsList.tsx
@@ -1,7 +1,7 @@
import { Icon } from '@iconify/react';
import { type ReactNode, useState } from 'react';
import { useTranslation } from 'react-i18next';
-import { Button, IconButton, InputField, Link, TimeDisplay } from '~/Components';
+import { Button, EventCrudButtons, IconButton, InputField, Link, TimeDisplay } from '~/Components';
import { eventQuery } from '~/Components/EventQuery/utils';
import { ImageCard } from '~/Components/ImageCard';
import { Table, type TableRow } from '~/Components/Table';
@@ -34,6 +34,7 @@ export function EventsList({ events }: EventsListProps) {
{ content: t(KEY.category), sortable: true },
{ content: t(KEY.admin_organizer), sortable: true },
{ content: t(KEY.common_buy), sortable: true },
+ { content: t(KEY.common_edit), sortable: false },
];
// TODO debounce and move header/filtering stuff to a separate component
@@ -74,6 +75,13 @@ export function EventsList({ events }: EventsListProps) {
event.category,
event.host,
event.ticket_type,
+ {
+ content: (
+
+
+
+ ),
+ },
],
}));
}
@@ -86,11 +94,12 @@ export function EventsList({ events }: EventsListProps) {
diff --git a/frontend/src/Pages/HomePage/components/EventCarousel/EventCarousel.tsx b/frontend/src/Pages/HomePage/components/EventCarousel/EventCarousel.tsx
index 28bd7f3a8..5e934a395 100644
--- a/frontend/src/Pages/HomePage/components/EventCarousel/EventCarousel.tsx
+++ b/frontend/src/Pages/HomePage/components/EventCarousel/EventCarousel.tsx
@@ -1,13 +1,10 @@
-import { Carousel, IconButton, ImageCard } from '~/Components';
+import { Carousel, ImageCard } from '~/Components';
import { BuyEventTicket } from '~/Components/BuyEventTicket/BuyEventTicket';
import { BACKEND_DOMAIN } from '~/constants';
-import { useAuthContext } from '~/context/AuthContext';
import type { EventDto, HomePageElementDto } from '~/dto';
import { reverse } from '~/named-urls';
-import { PERM } from '~/permissions';
import { ROUTES } from '~/routes';
-import { COLORS } from '~/types';
-import { dbT, hasPerm } from '~/utils';
+import { dbT } from '~/utils';
import styles from './EventCarousel.module.scss';
type EventCarouselProps = {
@@ -18,8 +15,6 @@ type EventCarouselProps = {
const spacing = 1.5;
export function EventCarousel({ element, skeletonCount = 0 }: EventCarouselProps) {
- const { user } = useAuthContext();
- const isStaff = user?.is_staff;
const wrapperClass = styles.wrapper;
if (!element) {
@@ -37,12 +32,6 @@ export function EventCarousel({ element, skeletonCount = 0 }: EventCarouselProps
{element.events.map((event: EventDto) => {
const url = reverse({ pattern: ROUTES.frontend.event, urlParams: { id: event.id } });
- const editUrl = reverse({ pattern: ROUTES.frontend.admin_events_edit, urlParams: { id: event.id } });
- const detailurl = reverse({
- pattern: ROUTES.backend.admin__samfundet_event_change,
- urlParams: { objectId: event.id },
- });
- const canChangeEvent = hasPerm({ user: user, permission: PERM.SAMFUNDET_CHANGE_EVENT, obj: event.id });
const event_title = dbT(event, 'title') ?? '';
const event_short_dsc = dbT(event, 'description_short') ?? '';
@@ -50,6 +39,7 @@ export function EventCarousel({ element, skeletonCount = 0 }: EventCarouselProps
{event.billig && }
-
-
- {canChangeEvent && (
-
- )}
- {isStaff && canChangeEvent && (
-
- )}
-
);
})}
diff --git a/frontend/src/PagesAdmin/EventsAdminPage/EventsAdminPage.tsx b/frontend/src/PagesAdmin/EventsAdminPage/EventsAdminPage.tsx
index dbf74fab1..9aea7c3db 100644
--- a/frontend/src/PagesAdmin/EventsAdminPage/EventsAdminPage.tsx
+++ b/frontend/src/PagesAdmin/EventsAdminPage/EventsAdminPage.tsx
@@ -3,15 +3,13 @@ import { useEffect, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useNavigate } from 'react-router';
import { toast } from 'react-toastify';
-import { Button, EventQuery, TimeDisplay } from '~/Components';
-import { CrudButtons } from '~/Components/CrudButtons/CrudButtons';
+import { Button, EventCrudButtons, EventQuery, TimeDisplay } from '~/Components';
import { PagedPagination } from '~/Components/Pagination';
import { Table } from '~/Components/Table';
import { deleteEvent, getEventsUpcommingPaginated } from '~/api';
import type { EventDto } from '~/dto';
import { useTitle } from '~/hooks';
import { KEY } from '~/i18n/constants';
-import { reverse } from '~/named-urls';
import { eventKeys } from '~/queryKeys';
import { ROUTES } from '~/routes';
import type { EventCategoryValue } from '~/types';
@@ -124,32 +122,7 @@ export function EventsAdminPage() {
event.location,
t(getTicketTypeKey(event.ticket_type)),
{
- content: (
- {
- navigate(
- reverse({
- pattern: ROUTES.frontend.event,
- urlParams: { id: event.id },
- }),
- );
- }}
- onEdit={() => {
- navigate(
- reverse({
- pattern: ROUTES.frontend.admin_events_edit,
- urlParams: { id: event.id },
- }),
- );
- }}
- onDelete={() => {
- const msg = lowerCapitalize(`${t(KEY.form_confirm)} ${t(KEY.common_delete)}`);
- if (window.confirm(`${msg} ${dbT(event, 'title')}`)) {
- deleteSelectedEvent(event.id);
- }
- }}
- />
- ),
+ content: ,
},
],
}));
@@ -159,6 +132,7 @@ export function EventsAdminPage() {
const header = (
<>
>
diff --git a/frontend/src/routes/frontend.ts b/frontend/src/routes/frontend.ts
index a6256e880..e9c7f3a60 100644
--- a/frontend/src/routes/frontend.ts
+++ b/frontend/src/routes/frontend.ts
@@ -100,6 +100,7 @@ export const ROUTES_FRONTEND = {
admin_recruitment_room_create: '/control-panel/recruitment/:recruitmentId/room/create/',
admin_recruitment_room_edit: '/control-panel/recruitment/:recruitmentId/room/edit/:roomId/',
admin_recruitment_gang_position_applicants_overview: '/control-panel/recruitment/:recruitmentId/gang/:gangId/position/:positionId',
+
admin_recruitment_gang_position_applicants_interview_notes: '/control-panel/recruitment/:recruitmentId/gang/:gangId/position/:positionId/interview-notes/:interviewId',
admin_recruitment_gang_all_applications: '/control-panel/recruitment/:recruitmentId/:gangId/all-applications/',
admin_recruitment_gang_users_without_interview: '/control-panel/recruitment/:recruitmentId/:gangId/users-without-interviews/',