Reorganize into monorepo layout, move mitarbeiter-app to legacy reference
Consolidates the previously separate omsorgapp and omsorgCore repos (each had their own nested .git with GitHub history) plus the old root-level website/mitarbeiter-app into a single monorepo, matching the structure already documented in the root CLAUDE.md. Also moves the PHP employee app aside as omsorgWeb/mitarbeiter-app-legacy/ to serve as a template for a ground-up rewrite. Fixes .gitignore in the same pass: the config-secrets/uploads/data patterns were unanchored (relative to repo root, not depth-agnostic), so they silently stopped matching once the app moved under omsorgWeb/. Patterns are now **/-prefixed and cover both mitarbeiter-app and mitarbeiter-app-legacy, keeping DB/SMTP credentials and uploaded employee documents out of version control. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
8beb0fcf52
commit
b6c1389c55
@@ -0,0 +1,58 @@
|
||||
import {
|
||||
CheckCircle2,
|
||||
BriefcaseMedical,
|
||||
Palmtree,
|
||||
HeartPulse,
|
||||
Clock3,
|
||||
} from "lucide-react";
|
||||
|
||||
const badgeConfig = {
|
||||
aktiv: {
|
||||
label: "Aktiv",
|
||||
icon: CheckCircle2,
|
||||
className: "success",
|
||||
},
|
||||
|
||||
einsatz: {
|
||||
label: "Einsatz",
|
||||
icon: BriefcaseMedical,
|
||||
className: "info",
|
||||
},
|
||||
|
||||
urlaub: {
|
||||
label: "Urlaub",
|
||||
icon: Palmtree,
|
||||
className: "warning",
|
||||
},
|
||||
|
||||
krank: {
|
||||
label: "Krank",
|
||||
icon: HeartPulse,
|
||||
className: "danger",
|
||||
},
|
||||
|
||||
vertrag: {
|
||||
label: "Läuft aus",
|
||||
icon: Clock3,
|
||||
className: "neutral",
|
||||
},
|
||||
};
|
||||
|
||||
export default function OmsorgBadge({
|
||||
status = "aktiv",
|
||||
}) {
|
||||
|
||||
const config =
|
||||
badgeConfig[status] ?? badgeConfig.aktiv;
|
||||
|
||||
const Icon = config.icon;
|
||||
|
||||
return (
|
||||
<span
|
||||
className={`omsorg-badge omsorg-badge--${config.className}`}
|
||||
>
|
||||
<Icon size={14} />
|
||||
{config.label}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* ==========================================================
|
||||
* OMSORG BUSINESS CONTROLS PRO
|
||||
* Component: OmsorgButton
|
||||
* Sprint: 0.2.0
|
||||
* ==========================================================
|
||||
*/
|
||||
|
||||
export default function OmsorgButton({
|
||||
children,
|
||||
variant = "primary",
|
||||
icon: Icon,
|
||||
type = "button",
|
||||
disabled = false,
|
||||
onClick,
|
||||
}) {
|
||||
|
||||
const className =
|
||||
`omsorg-button omsorg-button--${variant}`;
|
||||
|
||||
return (
|
||||
|
||||
<button
|
||||
type={type}
|
||||
className={className}
|
||||
disabled={disabled}
|
||||
onClick={onClick}
|
||||
>
|
||||
|
||||
{Icon && <Icon size={18} />}
|
||||
|
||||
<span>
|
||||
|
||||
{children}
|
||||
|
||||
</span>
|
||||
|
||||
</button>
|
||||
|
||||
);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
import { ChevronLeft, ChevronRight } from "lucide-react";
|
||||
|
||||
import OmsorgButton from "./OmsorgButton";
|
||||
|
||||
export default function OmsorgPagination({ page, totalPages, onPageChange }) {
|
||||
return (
|
||||
<div className="omsorg-pagination">
|
||||
<OmsorgButton
|
||||
variant="secondary"
|
||||
icon={ChevronLeft}
|
||||
disabled={page <= 1}
|
||||
onClick={() => onPageChange(page - 1)}
|
||||
>
|
||||
Zurück
|
||||
</OmsorgButton>
|
||||
|
||||
<span className="omsorg-pagination-status">
|
||||
Seite {page} von {totalPages}
|
||||
</span>
|
||||
|
||||
<OmsorgButton
|
||||
variant="secondary"
|
||||
icon={ChevronRight}
|
||||
disabled={page >= totalPages}
|
||||
onClick={() => onPageChange(page + 1)}
|
||||
>
|
||||
Weiter
|
||||
</OmsorgButton>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
import {
|
||||
ArrowDownRight,
|
||||
ArrowUpRight,
|
||||
Minus,
|
||||
} from "lucide-react";
|
||||
|
||||
export default function OmsorgStatCard({
|
||||
title,
|
||||
value,
|
||||
subtitle,
|
||||
trend = "neutral",
|
||||
icon: Icon,
|
||||
}) {
|
||||
const TrendIcon =
|
||||
trend === "up"
|
||||
? ArrowUpRight
|
||||
: trend === "down"
|
||||
? ArrowDownRight
|
||||
: Minus;
|
||||
|
||||
return (
|
||||
<article className="omsorg-stat-card">
|
||||
<div className="omsorg-stat-card__top">
|
||||
<div>
|
||||
<p className="omsorg-stat-card__title">
|
||||
{title}
|
||||
</p>
|
||||
|
||||
<strong className="omsorg-stat-card__value">
|
||||
{value}
|
||||
</strong>
|
||||
</div>
|
||||
|
||||
{Icon && (
|
||||
<div className="omsorg-stat-card__icon">
|
||||
<Icon size={22} />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{subtitle && (
|
||||
<div
|
||||
className={`omsorg-stat-card__trend omsorg-stat-card__trend--${trend}`}
|
||||
>
|
||||
<TrendIcon size={16} />
|
||||
<span>{subtitle}</span>
|
||||
</div>
|
||||
)}
|
||||
</article>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user