polish(ui): יישור 5 פריטי קטגוריה-A למוקאפי X17 המאושרים
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 10s

ליטושים שבהם הקוד פיגר אחרי מוקאפ-מאושר (אין צורך בסבב-עיצוב חדש):
- methodology/golden-ratios: כותרות-טבלה לעברית (Section/Min/Max → בלוק/מינ׳/מקס׳),
  תיקון מחלקות directional (ml-→me-) ו-token שגוי (ink-faint→ink-muted).
- halacha PanelDeliberation: seedline "הכרעתך תיקלט כתווית-הזהב…" (מוקאפ 18).
- cases-table: תווית-זמן-יחסי ליד מועד-הדיון (היום/מחר/בעוד N ימים, מוקאפ 04b).
- operations BURST: הדגשת chip ברירת-המחדל "שבת 18:00 (ברירת-מחדל)" (מוקאפ 02b).
- archive: סלקטור-שנים (נגזר מ-archived_at) לצד סלקטור-הסוג (מוקאפ 05).

נדחו (לא pure-alignment): chips סינון-מקור בפסיקה-חסרה (דורש פרם-סינון
discovery_source ב-backend); סדר/שמות-טאבים באימון+מתודולוגיה (סיכון לדרוס
שמות שנבחרו בכוונה — הסוכן/שיחה).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-16 19:16:12 +00:00
parent 9fc00d6e7f
commit 251262ab67
5 changed files with 73 additions and 18 deletions

View File

@@ -168,9 +168,21 @@ export default function ArchivePage() {
]);
const [globalFilter, setGlobalFilter] = useState("");
const [typeFilter, setTypeFilter] = useState<string>("all");
const [yearFilter, setYearFilter] = useState<string>("all");
const rows = useMemo(() => data ?? [], [data]);
// years present in the archive (by archive date) — for the year filter (mockup 05)
const years = useMemo(() => {
const set = new Set<string>();
for (const c of rows) {
if (!c.archived_at) continue;
const y = new Date(c.archived_at).getFullYear();
if (!Number.isNaN(y)) set.add(String(y));
}
return [...set].sort((a, b) => Number(b) - Number(a));
}, [rows]);
const table = useReactTable({
data: rows,
columns,
@@ -192,10 +204,16 @@ export default function ArchivePage() {
// domain filter applied client-side (subtypeOf collapses בל"מ variants)
const filteredRows = useMemo(() => {
const all = table.getFilteredRowModel().rows;
if (typeFilter === "all") return all;
return all.filter((r) => subtypeOf(r.original) === typeFilter);
}, [table, typeFilter, globalFilter, sorting, rows]);
let all = table.getFilteredRowModel().rows;
if (typeFilter !== "all") all = all.filter((r) => subtypeOf(r.original) === typeFilter);
if (yearFilter !== "all") {
all = all.filter((r) => {
const iso = r.original.archived_at;
return iso != null && String(new Date(iso).getFullYear()) === yearFilter;
});
}
return all;
}, [table, typeFilter, yearFilter, globalFilter, sorting, rows]);
const total = rows.length;
const shown = filteredRows.length;
@@ -242,6 +260,18 @@ export default function ArchivePage() {
<option value="betterment_levy">היטל השבחה</option>
<option value="compensation_197">פיצויים (ס׳ 197)</option>
</select>
{years.length > 0 ? (
<select
value={yearFilter}
onChange={(e) => setYearFilter(e.target.value)}
className="cursor-pointer text-[0.84rem] text-ink-soft bg-surface border border-rule rounded-lg px-3.5 py-2"
>
<option value="all">כל השנים</option>
{years.map((y) => (
<option key={y} value={y}>{y}</option>
))}
</select>
) : null}
<span className="ms-auto text-[0.82rem] text-ink-muted tabular-nums">
מציג {shown} מתוך {total}
</span>
@@ -301,7 +331,7 @@ export default function ArchivePage() {
<div className="text-gold text-2xl mb-2" aria-hidden>
</div>
{globalFilter || typeFilter !== "all"
{globalFilter || typeFilter !== "all" || yearFilter !== "all"
? "אין תיקים תואמים לחיפוש"
: "אין תיקים בארכיון"}
</TableCell>

View File

@@ -264,9 +264,9 @@ function BurstControl({ s }: { s: OpsService }) {
onChange={(e) => setUntil(e.target.value)}
/>
<div className="flex flex-wrap gap-1.5 pt-1">
<button type="button" className="text-[0.72rem] text-gold-deep bg-gold-wash border border-rule rounded-full px-2.5 py-0.5 hover:border-gold"
<button type="button" className="text-[0.72rem] text-gold-deep bg-gold-wash border border-gold rounded-full px-2.5 py-0.5 font-semibold hover:border-gold-deep"
onClick={() => setUntil(toLocalInput(nextSaturday18()))}>
שבת 18:00
שבת 18:00 <span className="font-normal text-ink-muted">(ברירת-מחדל)</span>
</button>
<button type="button" className="text-[0.72rem] text-gold-deep bg-gold-wash border border-rule rounded-full px-2.5 py-0.5 hover:border-gold"
onClick={() => setUntil(toLocalInput(new Date(Date.now() + 5 * 3600 * 1000)))}>