Add Prettier for TypeScript formatting

- Install prettier
- Configure .prettierrc.json and .prettierignore
- Add npm scripts: format, format:check
- Add Makefile target: format-frontend
- Format all frontend files
This commit is contained in:
counterweight 2025-12-21 21:59:26 +01:00
parent 4b394b0698
commit 37de6f70e0
Signed by: counterweight
GPG key ID: 883EDBAA726BD96C
44 changed files with 906 additions and 856 deletions

View file

@ -8,7 +8,13 @@ import { Header } from "../../components/Header";
import { useRequireAuth } from "../../hooks/useRequireAuth";
import { components } from "../../generated/api";
import constants from "../../../../shared/constants.json";
import { formatDate, formatDisplayDate, getDateRange, formatTimeString, isWeekend } from "../../utils/date";
import {
formatDate,
formatDisplayDate,
getDateRange,
formatTimeString,
isWeekend,
} from "../../utils/date";
const { slotDurationMinutes, maxAdvanceDays, minAdvanceDays } = constants.booking;
@ -57,14 +63,14 @@ export default function AdminAvailabilityPage() {
const fetchAvailability = useCallback(async () => {
const dateRange = getDateRange(minAdvanceDays, maxAdvanceDays);
if (!dateRange.length) return;
try {
const fromDate = formatDate(dateRange[0]);
const toDate = formatDate(dateRange[dateRange.length - 1]);
const data = await api.get<AvailabilityResponse>(
`/api/admin/availability?from=${fromDate}&to=${toDate}`
);
const map = new Map<string, TimeSlot[]>();
for (const day of data.days) {
map.set(day.date, day.slots);
@ -118,21 +124,21 @@ export default function AdminAvailabilityPage() {
const saveAvailability = async () => {
if (!selectedDate) return;
setIsSaving(true);
setError(null);
try {
const slots = editSlots.map((s) => ({
start_time: s.start_time + ":00",
end_time: s.end_time + ":00",
}));
await api.put("/api/admin/availability", {
date: formatDate(selectedDate),
slots,
});
await fetchAvailability();
closeModal();
} catch (err) {
@ -144,16 +150,16 @@ export default function AdminAvailabilityPage() {
const clearAvailability = async () => {
if (!selectedDate) return;
setIsSaving(true);
setError(null);
try {
await api.put("/api/admin/availability", {
date: formatDate(selectedDate),
slots: [],
});
await fetchAvailability();
closeModal();
} catch (err) {
@ -186,16 +192,16 @@ export default function AdminAvailabilityPage() {
const executeCopy = async () => {
if (!copySource || copyTargets.size === 0) return;
setIsCopying(true);
setError(null);
try {
await api.post("/api/admin/availability/copy", {
source_date: copySource,
target_dates: Array.from(copyTargets),
});
await fetchAvailability();
cancelCopyMode();
} catch (err) {
@ -236,10 +242,12 @@ export default function AdminAvailabilityPage() {
</div>
{copySource && (
<div style={styles.copyActions}>
<span style={styles.copyHint}>
Select days to copy to, then click Copy
</span>
<button onClick={executeCopy} disabled={copyTargets.size === 0 || isCopying} style={styles.copyButton}>
<span style={styles.copyHint}>Select days to copy to, then click Copy</span>
<button
onClick={executeCopy}
disabled={copyTargets.size === 0 || isCopying}
style={styles.copyButton}
>
{isCopying ? "Copying..." : `Copy to ${copyTargets.size} day(s)`}
</button>
<button onClick={cancelCopyMode} style={styles.cancelButton}>
@ -249,9 +257,7 @@ export default function AdminAvailabilityPage() {
)}
</div>
{error && !selectedDate && (
<div style={styles.errorBanner}>{error}</div>
)}
{error && !selectedDate && <div style={styles.errorBanner}>{error}</div>}
<div style={styles.calendar}>
{dates.map((date) => {
@ -318,9 +324,7 @@ export default function AdminAvailabilityPage() {
{selectedDate && (
<div style={styles.modalOverlay} onClick={closeModal}>
<div style={styles.modal} onClick={(e) => e.stopPropagation()}>
<h2 style={styles.modalTitle}>
Edit Availability - {formatDisplayDate(selectedDate)}
</h2>
<h2 style={styles.modalTitle}>Edit Availability - {formatDisplayDate(selectedDate)}</h2>
{error && <div style={styles.modalError}>{error}</div>}
@ -333,7 +337,9 @@ export default function AdminAvailabilityPage() {
style={styles.timeSelect}
>
{TIME_OPTIONS.map((t) => (
<option key={t} value={t}>{t}</option>
<option key={t} value={t}>
{t}
</option>
))}
</select>
<span style={styles.slotDash}></span>
@ -343,7 +349,9 @@ export default function AdminAvailabilityPage() {
style={styles.timeSelect}
>
{TIME_OPTIONS.map((t) => (
<option key={t} value={t}>{t}</option>
<option key={t} value={t}>
{t}
</option>
))}
</select>
<button
@ -629,4 +637,3 @@ const pageStyles: Record<string, React.CSSProperties> = {
};
const styles = { ...sharedStyles, ...pageStyles };