mirror of
https://github.com/donpat1to/Schichtenplaner.git
synced 2025-11-30 22:45:46 +01:00
Compare commits
10 Commits
3a787875e6
...
v1.0.26
| Author | SHA1 | Date | |
|---|---|---|---|
| f6e19bc1ed | |||
| e66c0f9e28 | |||
| 822b170920 | |||
| c6dfa5b4c6 | |||
| d0be1b4a61 | |||
| b337fd0e0a | |||
| badccb4f55 | |||
| 9eb9afce1e | |||
| 17d68c2426 | |||
| cff2374f41 |
@@ -27,8 +27,7 @@
|
|||||||
"helmet": "8.1.0",
|
"helmet": "8.1.0",
|
||||||
"express-validator": "7.3.0",
|
"express-validator": "7.3.0",
|
||||||
"exceljs": "4.4.0",
|
"exceljs": "4.4.0",
|
||||||
"pdfkit": "0.12.3",
|
"playwright": "^1.37.0"
|
||||||
"@types/pdfkit": "^0.12.3"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/bcryptjs": "^2.4.2",
|
"@types/bcryptjs": "^2.4.2",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -19,6 +19,8 @@ export const designTokens = {
|
|||||||
9: '#cda8f0',
|
9: '#cda8f0',
|
||||||
10: '#ebd7fa',
|
10: '#ebd7fa',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
manager: '#CC0000',
|
||||||
|
|
||||||
// Semantic Colors
|
// Semantic Colors
|
||||||
primary: '#51258f',
|
primary: '#51258f',
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ const ShiftPlanCreate: React.FC = () => {
|
|||||||
const [searchParams] = useSearchParams();
|
const [searchParams] = useSearchParams();
|
||||||
const { showNotification } = useNotification();
|
const { showNotification } = useNotification();
|
||||||
const { executeWithValidation, isSubmitting } = useBackendValidation();
|
const { executeWithValidation, isSubmitting } = useBackendValidation();
|
||||||
|
|
||||||
const [planName, setPlanName] = useState('');
|
const [planName, setPlanName] = useState('');
|
||||||
const [startDate, setStartDate] = useState('');
|
const [startDate, setStartDate] = useState('');
|
||||||
const [endDate, setEndDate] = useState('');
|
const [endDate, setEndDate] = useState('');
|
||||||
@@ -35,9 +35,9 @@ const ShiftPlanCreate: React.FC = () => {
|
|||||||
console.log('🔄 Lade verfügbare Vorlagen-Presets...');
|
console.log('🔄 Lade verfügbare Vorlagen-Presets...');
|
||||||
const data = await shiftPlanService.getTemplatePresets();
|
const data = await shiftPlanService.getTemplatePresets();
|
||||||
console.log('✅ Presets geladen:', data);
|
console.log('✅ Presets geladen:', data);
|
||||||
|
|
||||||
setPresets(data);
|
setPresets(data);
|
||||||
|
|
||||||
// Setze das erste Preset als Standard, falls vorhanden
|
// Setze das erste Preset als Standard, falls vorhanden
|
||||||
if (data.length > 0) {
|
if (data.length > 0) {
|
||||||
setSelectedPreset(data[0].name);
|
setSelectedPreset(data[0].name);
|
||||||
@@ -75,7 +75,7 @@ const ShiftPlanCreate: React.FC = () => {
|
|||||||
if (!endDate) {
|
if (!endDate) {
|
||||||
showNotification({
|
showNotification({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
title: 'Fehlende Angaben',
|
title: 'Fehlende Angaben',
|
||||||
message: 'Bitte wählen Sie ein Enddatum'
|
message: 'Bitte wählen Sie ein Enddatum'
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
@@ -115,14 +115,14 @@ const ShiftPlanCreate: React.FC = () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
console.log('✅ Plan erstellt:', createdPlan);
|
console.log('✅ Plan erstellt:', createdPlan);
|
||||||
|
|
||||||
// Erfolgsmeldung und Weiterleitung
|
// Erfolgsmeldung und Weiterleitung
|
||||||
showNotification({
|
showNotification({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
title: 'Erfolg',
|
title: 'Erfolg',
|
||||||
message: 'Schichtplan erfolgreich erstellt!'
|
message: 'Schichtplan erfolgreich erstellt!'
|
||||||
});
|
});
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
navigate(`/shift-plans/${createdPlan.id}`);
|
navigate(`/shift-plans/${createdPlan.id}`);
|
||||||
}, 1500);
|
}, 1500);
|
||||||
@@ -146,20 +146,20 @@ const ShiftPlanCreate: React.FC = () => {
|
|||||||
<div className={styles.container}>
|
<div className={styles.container}>
|
||||||
<div className={styles.header}>
|
<div className={styles.header}>
|
||||||
<h1>Neuen Schichtplan erstellen</h1>
|
<h1>Neuen Schichtplan erstellen</h1>
|
||||||
<button
|
<button
|
||||||
onClick={() => navigate(-1)}
|
onClick={() => navigate(-1)}
|
||||||
className={styles.backButton}
|
className={styles.backButton}
|
||||||
disabled={isSubmitting}
|
disabled={isSubmitting}
|
||||||
>
|
>
|
||||||
Zurück
|
Zurück
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className={styles.form}>
|
<div className={styles.form}>
|
||||||
<div className={styles.formGroup}>
|
<div className={styles.formGroup}>
|
||||||
<label>Plan Name:</label>
|
<label>Plan Name:</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
value={planName}
|
value={planName}
|
||||||
onChange={(e) => setPlanName(e.target.value)}
|
onChange={(e) => setPlanName(e.target.value)}
|
||||||
placeholder="z.B. KW 42 2025"
|
placeholder="z.B. KW 42 2025"
|
||||||
@@ -171,8 +171,8 @@ const ShiftPlanCreate: React.FC = () => {
|
|||||||
<div className={styles.dateGroup}>
|
<div className={styles.dateGroup}>
|
||||||
<div className={styles.formGroup}>
|
<div className={styles.formGroup}>
|
||||||
<label>Von:</label>
|
<label>Von:</label>
|
||||||
<input
|
<input
|
||||||
type="date"
|
type="date"
|
||||||
value={startDate}
|
value={startDate}
|
||||||
onChange={(e) => setStartDate(e.target.value)}
|
onChange={(e) => setStartDate(e.target.value)}
|
||||||
className={styles.input}
|
className={styles.input}
|
||||||
@@ -182,8 +182,8 @@ const ShiftPlanCreate: React.FC = () => {
|
|||||||
|
|
||||||
<div className={styles.formGroup}>
|
<div className={styles.formGroup}>
|
||||||
<label>Bis:</label>
|
<label>Bis:</label>
|
||||||
<input
|
<input
|
||||||
type="date"
|
type="date"
|
||||||
value={endDate}
|
value={endDate}
|
||||||
onChange={(e) => setEndDate(e.target.value)}
|
onChange={(e) => setEndDate(e.target.value)}
|
||||||
className={styles.input}
|
className={styles.input}
|
||||||
@@ -194,8 +194,8 @@ const ShiftPlanCreate: React.FC = () => {
|
|||||||
|
|
||||||
<div className={styles.formGroup}>
|
<div className={styles.formGroup}>
|
||||||
<label>Vorlage verwenden:</label>
|
<label>Vorlage verwenden:</label>
|
||||||
<select
|
<select
|
||||||
value={selectedPreset}
|
value={selectedPreset}
|
||||||
onChange={(e) => setSelectedPreset(e.target.value)}
|
onChange={(e) => setSelectedPreset(e.target.value)}
|
||||||
className={`${styles.select} ${presets.length === 0 ? styles.empty : ''}`}
|
className={`${styles.select} ${presets.length === 0 ? styles.empty : ''}`}
|
||||||
disabled={isSubmitting}
|
disabled={isSubmitting}
|
||||||
@@ -207,7 +207,7 @@ const ShiftPlanCreate: React.FC = () => {
|
|||||||
</option>
|
</option>
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
{selectedPreset && (
|
{selectedPreset && (
|
||||||
<div className={styles.presetDescription}>
|
<div className={styles.presetDescription}>
|
||||||
{getSelectedPresetDescription()}
|
{getSelectedPresetDescription()}
|
||||||
@@ -222,9 +222,9 @@ const ShiftPlanCreate: React.FC = () => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className={styles.actions}>
|
<div className={styles.actions}>
|
||||||
<button
|
<button
|
||||||
onClick={handleCreate}
|
onClick={handleCreate}
|
||||||
className={styles.createButton}
|
className={styles.createButton}
|
||||||
disabled={isSubmitting || !selectedPreset || !planName.trim() || !startDate || !endDate}
|
disabled={isSubmitting || !selectedPreset || !planName.trim() || !startDate || !endDate}
|
||||||
>
|
>
|
||||||
{isSubmitting ? 'Wird erstellt...' : 'Schichtplan erstellen'}
|
{isSubmitting ? 'Wird erstellt...' : 'Schichtplan erstellen'}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user