fix(frontend): stabilize department empty state layout

This commit is contained in:
lizerk 2026-04-13 23:51:21 +03:00
parent da44727280
commit 7a4a12673b
4 changed files with 51 additions and 16 deletions

View File

@ -8,6 +8,7 @@
"build": "next build",
"start": "next start",
"lint": "eslint",
"test": "node --experimental-strip-types --test src/**/*.test.ts",
"postinstall": "cp node_modules/pdfjs-dist/build/pdf.worker.min.mjs public/pdf.worker.min.mjs || true"
},
"dependencies": {

View File

@ -18,6 +18,10 @@ import {
} from "lucide-react";
import { AppShell } from "@/components/AppShell";
import {
DEPARTMENT_MEMBERS_EMPTY_STATE_CLASSNAME,
getDepartmentMembersListClassName,
} from "@/components/departments/layout";
import { RequestAvatar } from "@/components/requests/RequestAvatar";
import { SearchableSelectSingle } from "@/components/shared/SearchableSelect";
import { Modal } from "@/components/ui/Modal";
@ -367,6 +371,20 @@ function DepartmentEditorModal({
);
}
function DepartmentMembersEmptyState() {
return (
<div className={DEPARTMENT_MEMBERS_EMPTY_STATE_CLASSNAME}>
<Users size={24} className="app-text-muted mx-auto mb-3" />
<p className="text-sm font-medium text-[var(--foreground)]">
Участники не найдены
</p>
<p className="app-text-muted mt-2 text-sm">
Измени поисковый запрос.
</p>
</div>
);
}
function AddMemberModal({
isOpen,
items,
@ -707,13 +725,7 @@ export default function DepartmentDetailPage() {
) : null}
</div>
<div
className={
isManagementMode
? "space-y-3"
: "flex flex-wrap items-center gap-2"
}
>
<div className={getDepartmentMembersListClassName(isManagementMode)}>
{h.filteredMembers.length ? (
h.filteredMembers.map((member) => (
<DepartmentMemberRow
@ -736,15 +748,7 @@ export default function DepartmentDetailPage() {
/>
))
) : (
<div className="app-surface-muted rounded-xl p-8 text-center">
<Users size={24} className="app-text-muted mx-auto mb-3" />
<p className="text-sm font-medium text-[var(--foreground)]">
Участники не найдены
</p>
<p className="app-text-muted mt-2 text-sm">
Измени поисковый запрос.
</p>
</div>
<DepartmentMembersEmptyState />
)}
</div>

View File

@ -0,0 +1,22 @@
import test from "node:test";
import assert from "node:assert/strict";
import {
DEPARTMENT_MEMBERS_EMPTY_STATE_CLASSNAME,
getDepartmentMembersListClassName,
} from "./layout.ts";
test("showcase members layout keeps bubble flow", () => {
assert.equal(
getDepartmentMembersListClassName(false),
"flex flex-wrap items-center gap-2",
);
});
test("management members layout keeps stacked editing rows", () => {
assert.equal(getDepartmentMembersListClassName(true), "space-y-3");
});
test("department empty state spans full section width", () => {
assert.match(DEPARTMENT_MEMBERS_EMPTY_STATE_CLASSNAME, /\bw-full\b/);
});

View File

@ -0,0 +1,8 @@
export function getDepartmentMembersListClassName(isManagementMode: boolean) {
return isManagementMode
? "space-y-3"
: "flex flex-wrap items-center gap-2";
}
export const DEPARTMENT_MEMBERS_EMPTY_STATE_CLASSNAME =
"app-surface-muted w-full rounded-xl p-8 text-center";