polish(ui): יישור 5 פריטי קטגוריה-A למוקאפי X17 המאושרים
ליטושים שבהם הקוד פיגר אחרי מוקאפ-מאושר (אין צורך בסבב-עיצוב חדש): - 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:
@@ -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>
|
||||
|
||||
@@ -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)))}>
|
||||
|
||||
Reference in New Issue
Block a user