Skip to content
Open
Show file tree
Hide file tree
Changes from 52 commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
575a499
Add darkmode to storybook
eilifhl Sep 23, 2025
fa443e5
Remove bg color
eilifhl Sep 23, 2025
f14c2a2
Revise Venue Opening Dto
eilifhl Sep 23, 2025
a1d65d0
Change route naming
eilifhl Sep 25, 2025
9d3231f
Change request from patch to get
eilifhl Sep 25, 2025
cb63071
Create open_venues function in VenueView
eilifhl Sep 25, 2025
532c81b
Generate routes
eilifhl Sep 25, 2025
1bd43d8
Remove irrelevant routes changes
eilifhl Sep 30, 2025
9d3188e
Merge branch 'master' into Eilif/1942-get-opening-hours-for-homepage-…
eilifhl Sep 30, 2025
9781938
Refactor api call to deliver venue list instead of new datatype
eilifhl Sep 30, 2025
697e60e
Merge branch 'master' into Eilif/1942-get-opening-hours-for-homepage-…
eilifhl Sep 30, 2025
567abe2
Create container component
eilifhl Sep 30, 2025
c8e02d5
Merge branch 'Eilif/1942-get-opening-hours-for-homepage-backend' of g…
eilifhl Sep 30, 2025
e01573d
Refactor so all logic is in OpeningHours.tsx
eilifhl Sep 30, 2025
fcb4de4
Remove OpeningHoursContainer from HomePage
eilifhl Oct 2, 2025
dc90eb2
BIOMEEEEEE
eilifhl Oct 2, 2025
2880626
STYLELIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIINTTTTTT
eilifhl Oct 2, 2025
4df319a
Add correct storybook data
eilifhl Oct 2, 2025
388bed0
Fix styling of tableCell border
eilifhl Oct 7, 2025
330f699
Venues with midnight opening, closing are closed
eilifhl Oct 7, 2025
1b21620
Opening hours now display a descriptiv message when samf is in a clos…
0xSpecter Oct 16, 2025
1452dcf
changed text used from description to message
0xSpecter Oct 16, 2025
9da6fd7
work in progress
0xSpecter Oct 21, 2025
fd87ed6
...
0xSpecter Oct 21, 2025
72f41de
e
0xSpecter Oct 21, 2025
5b2cf30
renamed message_nb to message_no for consistancy. removed desvription…
0xSpecter Oct 21, 2025
ab0969b
begynnelse av data sjekk
0xSpecter Oct 21, 2025
0f257d0
You can now safely post closedPeriods in the admin panal, aswell as i…
0xSpecter Oct 28, 2025
4509f48
added a checkbox for making samf closed, needs to be implemented in m…
0xSpecter Oct 28, 2025
d162b0a
should be fixed now
0xSpecter Oct 30, 2025
b54fbef
ok now its good
0xSpecter Oct 30, 2025
5aa8e0c
changed closedPeriodadmin to match
0xSpecter Oct 30, 2025
b0edf96
added radio buttons for choosing default, forced open or forced close…
0xSpecter Oct 30, 2025
833e732
biome fix
0xSpecter Nov 4, 2025
5a09679
ruff reformat
0xSpecter Nov 4, 2025
5f5b7af
make migration problems that now should be fixed
0xSpecter Nov 4, 2025
b73730b
removed the shamefull file named: ' its a real disgrace
0xSpecter Nov 4, 2025
ba32566
Merge branch 'master' into sigurd/web-73-closed-periods-admin-page
0xSpecter Nov 11, 2025
a68b469
changed radio buttons to dropdown and imporved styling
0xSpecter Nov 13, 2025
b1a3620
Merge branch 'sigurd/web-73-closed-periods-admin-page' of https://git…
0xSpecter Nov 13, 2025
9590092
usikker når dette ble ferdig men det er gjort og det funker (tror jeg)
0xSpecter Jan 20, 2026
ef6393b
stylelint fix
0xSpecter Jan 20, 2026
8505272
Merge branch 'master' into sigurd/web-74-events-page-heading-not-stre…
0xSpecter Jan 20, 2026
c926775
resolved reviews
0xSpecter Jan 20, 2026
21b0add
migrations
0xSpecter Jan 20, 2026
3e56bbb
Merge remote-tracking branch 'refs/remotes/origin/sigurd/web-74-event…
0xSpecter Jan 20, 2026
10c2b35
migrations and biome
0xSpecter Jan 20, 2026
2526fb8
Merge branch 'master' into sigurd/web-73-closed-periods-admin-page
0xSpecter Feb 3, 2026
85f9d1e
Merge branch 'master' into sigurd/web-74-events-page-heading-not-stre…
0xSpecter Feb 3, 2026
b92b965
Merge branch 'sigurd/web-73-closed-periods-admin-page' into sigurd/we…
0xSpecter Feb 3, 2026
98d099b
touchups and removals of non relevant code
0xSpecter Feb 3, 2026
e86fcce
removed usless import
0xSpecter Feb 3, 2026
78f7bf9
Update frontend/src/PagesAdmin/ClosedPeriodAdminPage/ClosedPeriodAdmi…
0xSpecter Feb 10, 2026
5987fad
using react query instead
0xSpecter Feb 10, 2026
5c47d10
Merge branch 'master' into sigurd/web-74-events-page-heading-not-stre…
0xSpecter Feb 10, 2026
8b4f457
biome
0xSpecter Feb 10, 2026
5806082
Merge branch 'sigurd/web-74-events-page-heading-not-stretched-to-edge…
0xSpecter Feb 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions backend/samfundet/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by Django 5.1.9 on 2025-08-09 16:11
# Generated by Django 5.2.10 on 2026-01-20 20:45

import datetime
import django.contrib.auth.models
Expand Down Expand Up @@ -138,8 +138,6 @@ class Migration(migrations.Migration):
('updated_at', models.DateTimeField(blank=True, editable=False, null=True)),
('message_nb', models.TextField(blank=True, null=True, verbose_name='Melding (norsk)')),
('message_en', models.TextField(blank=True, null=True, verbose_name='Melding (engelsk)')),
('description_nb', models.TextField(blank=True, null=True, verbose_name='Beskrivelse (norsk)')),
('description_en', models.TextField(blank=True, null=True, verbose_name='Beskrivelse (engelsk)')),
('start_dt', models.DateField(blank=True, verbose_name='Start dato')),
('end_dt', models.DateField(blank=True, verbose_name='Slutt dato')),
('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
Expand Down
3 changes: 0 additions & 3 deletions backend/samfundet/models/general.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,9 +258,6 @@ class ClosedPeriod(CustomBaseModel):
message_nb = models.TextField(blank=True, null=True, verbose_name='Melding (norsk)')
message_en = models.TextField(blank=True, null=True, verbose_name='Melding (engelsk)')

description_nb = models.TextField(blank=True, null=True, verbose_name='Beskrivelse (norsk)')
description_en = models.TextField(blank=True, null=True, verbose_name='Beskrivelse (engelsk)')

start_dt = models.DateField(blank=True, null=False, verbose_name='Start dato')
end_dt = models.DateField(blank=True, null=False, verbose_name='Slutt dato')

Expand Down
11 changes: 9 additions & 2 deletions frontend/src/Components/OpeningHours/OpeningHours.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
align-items: center;

@include theme-dark {
background-color: $black-2;
color: $white;
background-color: $theme-dark-bg;
color: $theme-dark-color;
}
}

Expand All @@ -26,3 +26,10 @@
margin: 0 0.2em;
}

.closedBox {
border: 2px $red_samf solid;
border-radius: 10px;
padding: 20px;
margin-bottom: 2rem;
margin-top: 1rem;
}
76 changes: 53 additions & 23 deletions frontend/src/Components/OpeningHours/OpeningHours.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { TimeDuration } from '~/Components';
import { Link } from '~/Components/Link/Link';
import { Text } from '~/Components/Text/Text';
import { getClosedPeriods } from '~/api';
import { useGlobalContext } from '~/context/GlobalContextProvider';
import type { VenueDto } from '~/dto';
import { KEY } from '~/i18n/constants';
import { dbT } from '~/utils';
import styles from './OpeningHours.module.scss';

type OpeningHoursProps = {
Expand All @@ -14,6 +18,29 @@ type OpeningHoursProps = {

export function OpeningHours({ venues, isLoading, isError }: OpeningHoursProps) {
const { t } = useTranslation();
const [isClosed, setIsClosed] = useState<boolean>(false);
const [closedText, setClosedText] = useState<string | undefined>('Samf is closed');
const globalContext = useGlobalContext();

useEffect(() => {
if (globalContext.isClosed !== 'default') {
if (globalContext.isClosed === 'closed') {
setIsClosed(true);
setClosedText(t(KEY.admin_closed_message));
}
return;
}
getClosedPeriods().then((periods) => {
const now = new Date();
for (const period of periods) {
if (new Date(period.start_dt) < now && now < new Date(period.end_dt)) {
setIsClosed(true);
setClosedText(dbT(period, 'message'));
return;
}
}
});
});

if (isLoading) {
return <Text>{t(KEY.common_loading)}</Text>;
Expand All @@ -25,34 +52,37 @@ export function OpeningHours({ venues, isLoading, isError }: OpeningHoursProps)

const today = new Date().toISOString().split('T')[0];
const day = new Date().toLocaleDateString('en-US', { weekday: 'long' }).toLowerCase();

return (
<div className={styles.container}>
<Text size="l" as="strong">
{t(KEY.common_opening_hours)}
</Text>
<table className={styles.timeTable}>
{venues.map((venue) => {
const openingTime = venue[`opening_${day}` as keyof VenueDto] as string;
const closingTime = venue[`closing_${day}` as keyof VenueDto] as string;
return (
<tr key={venue.name} className={styles.openingRow}>
<td className={styles.tableCell}>
<Link url={`information/${venue.name}`}>
<p className={styles.openingHoursText}>{venue.name}</p>
</Link>
</td>
<td className={styles.tableCell}>
<TimeDuration
className={styles.openingHoursText}
start={`${today}T${openingTime}`}
end={`${today}T${closingTime}`}
/>
</td>
</tr>
);
})}
</table>
{isClosed ? (
<div className={styles.closedBox}>{closedText}</div>
) : (
<table className={styles.timeTable}>
{venues.map((venue) => {
const openingTime = venue[`opening_${day}` as keyof VenueDto] as string;
const closingTime = venue[`closing_${day}` as keyof VenueDto] as string;
return (
<tr key={venue.name} className={styles.openingRow}>
<td className={styles.tableCell}>
<Link url={`information/${venue.name}`}>
<p className={styles.openingHoursText}>{venue.name}</p>
</Link>
</td>
<td className={styles.tableCell}>
<TimeDuration
className={styles.openingHoursText}
start={`${today}T${openingTime}`}
end={`${today}T${closingTime}`}
/>
</td>
</tr>
);
})}
</table>
)}
</div>
);
}
1 change: 1 addition & 0 deletions frontend/src/Components/OpeningHours/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export { OpeningHours } from './OpeningHours';
export { OpeningHoursContainer } from './OpeningHoursContainer';
2 changes: 0 additions & 2 deletions frontend/src/Components/Page/Page.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ $side-padding: 1em;

// Limit max content size for large screens.
max-width: $content-max-size;

// Center all content.
margin: auto;

@include for-mobile-only {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/Components/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export { Navbar } from './Navbar';
export { NotificationBadge } from './NotificationBadge';
export { NumberInput } from './NumberInput';
export { OccupiedForm, OccupiedFormModal } from './OccupiedForm';
export { OpeningHours } from './OpeningHours';
export { OpeningHours, OpeningHoursContainer } from './OpeningHours';
export { Page } from './Page';
export { PagedPagination } from './Pagination';
export { PermissionRoute } from './PermissionRoute';
Expand Down
2 changes: 2 additions & 0 deletions frontend/src/Pages/HomePage/HomePage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { type ReactNode, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { toast } from 'react-toastify';
import { OpeningHoursContainer } from '~/Components';
import { EventCarousel, LargeCard } from '~/Pages/HomePage/components';
import { getHomeData } from '~/api';
import type { HomePageDto, HomePageElementDto } from '~/dto';
Expand Down Expand Up @@ -50,6 +51,7 @@ export function HomePage() {
return (
<>
<Splash events={homePage?.splash} showInfo={true} />
<OpeningHoursContainer />
<div className={styles.content}>
{/*<SplashHeaderBox />*/}
{isLoading && skeleton}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ $header-bg-dark: #111111;
flex-direction: row;
padding-bottom: 1.5em;
gap: 1em;
align-items: center;
}

.spinner_container {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
@use 'src/mixins' as *;

@use 'src/constants' as *;

.admin_closed_override_container {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}

.admin_closed_radio {
margin-top: 10px;
}

.edit_buttons {
display: flex;
flex-direction: column;
gap: 5px;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,24 @@ import { useCallback, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { toast } from 'react-toastify';
import { Button, TimeDisplay } from '~/Components';
import { Dropdown } from '~/Components';
import { Table } from '~/Components/Table';
import { deleteClosedPeriod, getClosedPeriods } from '~/api';
import { useGlobalContext } from '~/context/GlobalContextProvider';
import type { ClosedPeriodDto } from '~/dto';
import { useTitle } from '~/hooks';
import { KEY } from '~/i18n/constants';
import { reverse } from '~/named-urls';
import { ROUTES } from '~/routes';
import { dbT } from '~/utils';
import { AdminPageLayout } from '../AdminPageLayout/AdminPageLayout';
import styles from './ClosedPeriodAdminPage.module.scss';

export function ClosedPeriodAdminPage() {
const [closedPeriods, setClosedPeriods] = useState<ClosedPeriodDto[]>([]);
const [showSpinner, setShowSpinner] = useState<boolean>(true);
const { t } = useTranslation();
const globalContext = useGlobalContext();
useTitle(t(KEY.command_menu_shortcut_closed));

const getAllClosedPeriods = useCallback(() => {
Expand Down Expand Up @@ -51,9 +55,30 @@ export function ClosedPeriodAdminPage() {
}

const header = (
<Button theme="success" rounded={true} link={ROUTES.frontend.admin_closed_create}>
{t(KEY.admin_closed_period_new_period)}
</Button>
<>
<Button theme="success" rounded={true} link={ROUTES.frontend.admin_closed_create}>
{t(KEY.admin_closed_period_new_period)}
</Button>
<span style={{ marginRight: 10 }}>{dbT({ text_nb: 'Stenging status', text_en: 'Closing status' }, 'text')}</span>
<Dropdown
options={[
{
label: 'default',
value: 'default',
},
{
label: 'open',
value: 'open',
},
{
label: 'closed',
value: 'closed',
},
]}
value={globalContext.isClosed}
onChange={(value) => globalContext.setIsClosed(value)}
/>
</>
);
const backendUrl = ROUTES.backend.admin__samfundet_closedperiod_changelist;

Expand All @@ -67,21 +92,21 @@ export function ClosedPeriodAdminPage() {
<div className={styles.tableContainer}>
<Table
columns={[
t(KEY.common_message) ?? '',
`Event ${t(KEY.common_message)}`,
`${t(KEY.common_message)} ${t(KEY.common_norwegian)}`,
`${t(KEY.common_message)} ${t(KEY.common_english)}`,
t(KEY.start_time) ?? '',
t(KEY.end_time) ?? '',
'',
t(KEY.common_edit) ?? '',
]}
data={closedPeriods.map((element) => ({
cells: [
element.message_no,
element.description_no,
element.message_nb,
element.message_en,
{ content: <TimeDisplay displayType="date" timestamp={element.start_dt} /> },
{ content: <TimeDisplay displayType="date" timestamp={element.end_dt} /> },
{
content: (
<div>
<div className={styles.edit_buttons}>
<Button
theme="blue"
display="block"
Expand All @@ -98,7 +123,8 @@ export function ClosedPeriodAdminPage() {
display="block"
className={styles.smallButtons}
onClick={() => {
if (window.confirm(`${t(KEY.form_confirm)} ${t(KEY.common_delete)} ${element.message_no}`)) {
// :TODO: window.comfirm should be replaced with a non-browser implementation (not built-in popup)
if (window.confirm(`${t(KEY.form_confirm)} ${t(KEY.common_delete)} ${element.message_nb}`)) {
deleteSelectedEvent(element.id);
}
}}
Expand Down
Loading