fix(transactions,editor,reports): v1 period column, one amount edge, unclipped report numbers, solid save, mobile headers

This commit is contained in:
hh committed 2026-10-16 04:26:07 +00:00
1 parent fa322d22e9
commit e279d3948a
8 files changed
+279 -134

No files matched your search

@@ -73,17 +73,17 @@
title="Account balances"
>
<div class="overflow-x-auto">
<table class="w-full border-collapse text-[13px]">
<table class="w-full min-w-[34rem] border-collapse text-[13px]">
<thead>
<tr class="text-[12px] text-cladd-fg-soft">
<th class="h-7 px-3 text-left font-medium">Name</th>
<th class="h-7 px-3 text-right font-medium">
<th class="h-7 w-full px-3 text-left font-medium">Name</th>
<th class="h-7 w-32 px-3 text-right font-medium">
Balance at start of period
</th>
<th class="h-7 px-3 text-right font-medium">
<th class="h-7 w-32 px-3 text-right font-medium">
Balance at end of period
</th>
<th class="h-7 px-3 text-right font-medium">Difference</th>
<th class="h-7 w-32 px-3 text-right font-medium">Difference</th>
</tr>
</thead>
<tbody>
@@ -95,7 +95,7 @@
? "bg-row-selected"
: ""}"
>
<td class="max-w-[16rem] px-3">
<td class="max-w-0 px-3">
<button
aria-pressed={active}
class="block max-w-full truncate text-left hover:text-brand dark:hover:text-[var(--ff-series-1)] hover:underline"
+50 -44
View File
@@ -1,6 +1,7 @@
<script lang="ts">
import ChevronLeft from "@lucide/svelte/icons/chevron-left";
import ChevronRight from "@lucide/svelte/icons/chevron-right";
import DateInput from "#lib/components/inputs/DateInput.svelte";
import { useKeys } from "#lib/keys.svelte.js";
import { recall, remember } from "#lib/reports/memory.js";
import { listOptions, listReady } from "#lib/reports/options.js";
@@ -25,7 +26,7 @@
let accountsOpen = $state(false);
let itemsOpen = $state(false);
let typeSelect = $state<HTMLSelectElement>();
let startInput = $state<HTMLInputElement>();
let startInput = $state<HTMLInputElement | null>(null);
const p = $derived(report.params);
const presets = rangePresets();
@@ -82,8 +83,9 @@
go({ items: defaultItems(type), type });
}
function setRange(start: string, end: string) {
if (start && end && start <= end) {
function setRange(a: string, b: string) {
const [start, end] = a <= b ? [a, b] : [b, a];
if (start && end && (start !== p.start || end !== p.end)) {
go({ end, start });
}
}
@@ -159,11 +161,13 @@
<div
class="cladd-surface cladd-outline z-20 mb-4 lg:sticky lg:top-14 flex flex-wrap items-end justify-between gap-x-4 gap-y-2 rounded-cladd-lg px-3 py-2"
>
<div class="flex min-w-0 flex-1 flex-wrap items-end gap-x-3 gap-y-2">
<label class="flex flex-col gap-0.5">
<div
class="flex min-w-0 flex-1 flex-wrap items-end gap-x-3 gap-y-2 max-sm:basis-full"
>
<label class="flex flex-col gap-0.5 max-sm:w-full">
<span class="text-[11px] text-cladd-fg-soft">Report type</span>
<select
class="cladd-cut cladd-focusable-input h-8 max-w-[14rem] rounded-cladd-sm px-2 text-[13px] text-cladd-fg"
class="cladd-cut cladd-focusable-input h-8 max-w-[14rem] rounded-cladd-sm px-2 text-[13px] text-cladd-fg max-sm:max-w-none"
onchange={(event) => setType(event.currentTarget.value as ReportType)}
value={p.type}
bind:this={typeSelect}
@@ -173,12 +177,12 @@
{/each}
</select>
</label>
<div class="flex min-w-0 flex-col gap-0.5">
<div class="flex min-w-0 flex-col gap-0.5 max-sm:w-full">
<label class="text-[11px] text-cladd-fg-soft" for="report-accounts"
>Accounts</label
>
<MultiSelect
class="w-48"
class="w-44 max-sm:w-full"
id="report-accounts"
label="Accounts"
loading={!report.accountsReady}
@@ -189,12 +193,12 @@
/>
</div>
{#if list}
<div class="flex min-w-0 flex-col gap-0.5">
<div class="flex min-w-0 flex-col gap-0.5 max-sm:w-full">
<label class="text-[11px] text-cladd-fg-soft" for="report-items"
>{LIST_LABELS[list].many}</label
>
<MultiSelect
class="w-48"
class="w-48 max-sm:w-full"
id="report-items"
label={LIST_LABELS[list].many}
loading={!listReady(list, sources)}
@@ -205,48 +209,50 @@
/>
</div>
{/if}
<div class="flex flex-col gap-0.5">
<div class="flex flex-col gap-0.5 max-sm:w-full">
<span class="text-[11px] text-cladd-fg-soft">Date range</span>
<div class="flex flex-wrap items-center gap-x-2 gap-y-1">
<div class="flex items-center gap-1">
<button
aria-label="Previous period"
class="grid size-8 place-items-center rounded-cladd-sm text-cladd-fg-soft hover:bg-row-hover hover:text-cladd-fg"
onclick={() => shift(-1)}
title="Previous period ["
type="button"
>
<ChevronLeft class="size-4" />
</button>
<input
<div class="flex flex-wrap items-center gap-x-1 gap-y-2 sm:gap-x-2">
<button
aria-label="Previous period"
class="grid size-8 place-items-center rounded-cladd-sm text-cladd-fg-soft hover:bg-row-hover hover:text-cladd-fg max-sm:order-2"
onclick={() => shift(-1)}
title="Previous period ["
type="button"
>
<ChevronLeft class="size-4" />
</button>
<div
class="flex items-center gap-2 max-sm:w-full max-sm:flex-col max-sm:items-stretch"
>
<DateInput
aria-label="Start date"
class="cladd-cut cladd-focusable-input num h-8 w-[7.4rem] rounded-cladd-sm px-1.5 text-[13px] sm:w-[8.2rem] sm:px-2 text-cladd-fg"
onchange={(event) => setRange(event.currentTarget.value, p.end)}
type="date"
class="w-[8.75rem] max-sm:w-full [&>input]:h-8"
compact
oncommit={(value) => setRange(value, p.end)}
value={p.start}
bind:this={startInput}
>
<span class="text-cladd-fg-soft">to</span>
<input
bind:ref={startInput}
/>
<span class="text-cladd-fg-soft max-sm:hidden">to</span>
<DateInput
aria-label="End date"
class="cladd-cut cladd-focusable-input num h-8 w-[7.4rem] rounded-cladd-sm px-1.5 text-[13px] sm:w-[8.2rem] sm:px-2 text-cladd-fg"
onchange={(event) => setRange(p.start, event.currentTarget.value)}
type="date"
class="w-[8.75rem] max-sm:w-full [&>input]:h-8"
compact
oncommit={(value) => setRange(p.start, value)}
value={p.end}
>
<button
aria-label="Next period"
class="grid size-8 place-items-center rounded-cladd-sm text-cladd-fg-soft hover:bg-row-hover hover:text-cladd-fg"
onclick={() => shift(1)}
title="Next period ]"
type="button"
>
<ChevronRight class="size-4" />
</button>
/>
</div>
<button
aria-label="Next period"
class="grid size-8 place-items-center rounded-cladd-sm text-cladd-fg-soft hover:bg-row-hover hover:text-cladd-fg max-sm:order-4"
onclick={() => shift(1)}
title="Next period ]"
type="button"
>
<ChevronRight class="size-4" />
</button>
<select
aria-label="Preset range"
class="cladd-cut cladd-focusable-input h-8 rounded-cladd-sm px-2 text-[13px] text-cladd-fg"
class="cladd-cut cladd-focusable-input h-8 rounded-cladd-sm px-2 text-[13px] text-cladd-fg max-sm:order-3 max-sm:flex-1"
onchange={(event) => {
const found = presets.find(
(x) => x.key === event.currentTarget.value