mirror of
https://github.com/donpat1to/Schichtenplaner.git
synced 2025-11-30 22:45:46 +01:00
125 lines
4.8 KiB
TypeScript
125 lines
4.8 KiB
TypeScript
// frontend/src/pages/ShiftTemplates/components/ShiftDayEditor.tsx
|
|
import React from 'react';
|
|
import { TemplateShiftSlot } from '../../../types/shiftTemplate';
|
|
import styles from './ShiftDayEditor.module.css';
|
|
|
|
interface ShiftDayEditorProps {
|
|
day: { id: number; name: string };
|
|
shifts: TemplateShiftSlot[];
|
|
onAddShift: () => void;
|
|
onUpdateShift: (shiftId: string, updates: Partial<TemplateShiftSlot>) => void;
|
|
onRemoveShift: (shiftId: string) => void;
|
|
}
|
|
|
|
const ShiftDayEditor: React.FC<ShiftDayEditorProps> = ({
|
|
day,
|
|
shifts,
|
|
onAddShift,
|
|
onUpdateShift,
|
|
onRemoveShift
|
|
}) => {
|
|
return (
|
|
<div className={styles.dayEditor}>
|
|
<div className={styles.dayHeader}>
|
|
<h3 className={styles.dayName}>{day.name}</h3>
|
|
<button className={styles.addButton} onClick={onAddShift}>
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="16" height="16">
|
|
<path fillRule="evenodd" d="M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z" clipRule="evenodd" />
|
|
</svg>
|
|
Schicht hinzufügen
|
|
</button>
|
|
</div>
|
|
|
|
{shifts.length === 0 ? (
|
|
<div style={{ textAlign: 'center', padding: '20px', color: '#999', fontStyle: 'italic' }}>
|
|
Keine Schichten für {day.name}
|
|
</div>
|
|
) : (
|
|
<div className={styles.shiftsGrid}>
|
|
{shifts.map(shift => (
|
|
<div key={shift.id} className={styles.shiftCard}>
|
|
<div className={styles.shiftHeader}>
|
|
<h4 className={styles.shiftTitle}>Schicht bearbeiten</h4>
|
|
<button
|
|
className={styles.deleteButton}
|
|
onClick={() => onRemoveShift(shift.id)}
|
|
title="Schicht löschen"
|
|
>
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="16" height="16">
|
|
<path fillRule="evenodd" d="M9 2a1 1 0 00-.894.553L7.382 4H4a1 1 0 000 2v10a2 2 0 002 2h8a2 2 0 002-2V6a1 1 0 100-2h-3.382l-.724-1.447A1 1 0 0011 2H9zM7 8a1 1 0 012 0v6a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v6a1 1 0 102 0V8a1 1 0 00-1-1z" clipRule="evenodd" />
|
|
</svg>
|
|
Löschen
|
|
</button>
|
|
</div>
|
|
|
|
<div className={styles.formGroup}>
|
|
<input
|
|
type="text"
|
|
value={shift.timeSlot.name}
|
|
onChange={(e) => onUpdateShift(shift.id, { timeSlot: { ...shift.timeSlot, name: e.target.value } })}
|
|
placeholder="Schichtname"
|
|
/>
|
|
</div>
|
|
|
|
<div className={styles.timeInputs}>
|
|
<div className={styles.formGroup}>
|
|
<label>Start</label>
|
|
<input
|
|
type="time"
|
|
value={shift.timeSlot.startTime}
|
|
onChange={(e) => onUpdateShift(shift.id, { timeSlot: { ...shift.timeSlot, startTime: e.target.value } })}
|
|
/>
|
|
</div>
|
|
|
|
<div className={styles.formGroup}>
|
|
<label>Ende</label>
|
|
<input
|
|
type="time"
|
|
value={shift.timeSlot.endTime}
|
|
onChange={(e) => onUpdateShift(shift.id, { timeSlot: { ...shift.timeSlot, endTime: e.target.value } })}
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
<div className={styles.formGroup}>
|
|
<label>Benötigte Mitarbeiter</label>
|
|
<div className={styles.requiredEmployees}>
|
|
<button
|
|
onClick={() => onUpdateShift(shift.id, { requiredEmployees: Math.max(1, shift.requiredEmployees - 1) })}
|
|
>
|
|
-
|
|
</button>
|
|
<input
|
|
type="number"
|
|
min="1"
|
|
value={shift.requiredEmployees}
|
|
onChange={(e) => onUpdateShift(shift.id, { requiredEmployees: parseInt(e.target.value) || 1 })}
|
|
/>
|
|
<button
|
|
onClick={() => onUpdateShift(shift.id, { requiredEmployees: shift.requiredEmployees + 1 })}
|
|
>
|
|
+
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
{shift.color && (
|
|
<div className={styles.formGroup}>
|
|
<label>Farbe</label>
|
|
<input
|
|
type="color"
|
|
value={shift.color}
|
|
onChange={(e) => onUpdateShift(shift.id, { color: e.target.value })}
|
|
className={styles.colorPicker}
|
|
/>
|
|
</div>
|
|
)}
|
|
</div>
|
|
))}
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default ShiftDayEditor; |