Commit 0af5fc1
feat(ui): working read-only Views on every page + toolbar, filter, date, theme and selector fixes (#9975)
* feat(ui): finish the record View — every remaining placeholder button now shows a real read-only view
The audit found 13 surfaces whose View button still opened the
"we are working hard on this feature" placeholder (or did nothing at
all). Each now opens the shared read-only surface introduced with
ngx-record-view: Users, Organizations, Tasks (all three task pages via
their shared component), Employee and Organization recurring expenses,
Goal Settings (KPI + Time Frames), Inventory Merchants, Proposal
Templates, Jobs Employees and Zapier Triggers/Actions get the
right-side drawer; Sales Proposals routes to its existing read-only
details page (whose duplicate Details button folds into View).
Rules carried from the first wave: each View is gated by the record's
own view permission (moved OUT of the *_EDIT blocks it used to hide
in), drawers close when their list reloads, field descriptors mirror
the grid columns and reuse existing i18n keys only.
Also in the same directories:
- Proposals statistics strip becomes three theme-token stat cards.
- Jobs Employees "Actions" column: the bare green dot was a dead
Nebular icon-font class; replaced with FontAwesome icons carrying
translated titles, and the column header is translatable now.
- Tasks grid: the ID column holds #GAU-7777 on one line and the Title
column gets real width.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(ui): idle action toolbars no longer hold their hidden buttons' width
The selection-action strip hid itself with translateX + overflow
hidden, which removed it from VIEW but not from LAYOUT: the block kept
the full strip's width (437px on Organizations, ~900px on Goals), so on
button-heavy pages it could never fit beside the page title — the row
wrapped, and the one visible "+ Add" button was left stranded mid-page,
at a position that depended on the width of buttons nobody could see.
The strip now collapses to zero layout width while disabled (animated
max-width + opacity clip), so the toolbar fits on the title line on
every page. Two supporting rules in the shared header layout:
- the title block's flex basis goes to 0% so a wide title payload (the
relocated breadcrumb trail, a secondary header button as on the
proposals page) can never push the actions off the line — the title
wraps inside its own block instead;
- the actions block pins to the END of a wrapped line
(margin-inline-start: auto) so on narrow viewports an expanded strip
right-aligns instead of jumping to the left edge.
Verified live on Organizations, Goals and Proposals: closed and open
states both sit on the title/breadcrumb band, flush right.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(ui): smart-table filter rows collapse behind a funnel toggle, with sort affordances
Every list page carried a permanent row of filter inputs under the
table header — a band of vertical space most visits never touch, built
from widgets that did not even share a height. Three changes at the
shared seam (no page template was touched; the directive attaches by
element selector through SmartDataViewLayoutModule, the same route the
settling skeleton took):
- SmartTableFilterToggleDirective hides the filter row by default and
injects a funnel button into the title row's last header cell. One
app-wide preference persists the user's choice; a row with an ACTIVE
filter is never hidden on load, and while filters are active the
funnel carries an indicator dot so a hidden filter can never silently
constrain the data. The stored preference is applied before first
render — deciding it later flips a host binding mid-pass and throws
NG0100 in dev mode.
- The filter widgets get one compact metric (13px, 1.875rem controls)
so inputs, nb-selects and ng-selects finally line up.
- Sortable-but-unsorted column headers show a dimmed two-way arrow;
the library only ever marked the active sort direction, so nothing
told the user the other columns were sortable.
e2e: the shared Playwright fixtures (plain + BDD) opt into
always-open filters via the directive's stored preference, since
several page objects type straight into the filter row. The static
dev server now sends Cache-Control: no-store — dev bundles have
unhashed chunk names, and the browser's heuristic cache kept serving a
prior build's chunks after rebuilds.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(ui): table date cells show a short date; the full date moves to a tooltip
CreatedAtComponent rendered the organization's long date format plus
hh:mm:ss — "Wednesday, august 12, 2026 05:08:08 am" in every row — and
DateViewComponent did the same without the time. Together they were
the single biggest cause of horizontal scrolling on the task, payment
and invoice grids.
Both cells now render the locale-aware short form (moment 'll', e.g.
"Aug 12, 2026") with the full org-format value on hover: created-at
keeps date+time in its tooltip, date-view keeps the org's long date.
The recurring-expense sync icon on date-view is untouched.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(theme): material themes join the shared gauzy token system
The "Cosmic looks insane" report was actually Material Dark: its
Nebular Material map paints header AND footer with color-primary
(#e91d63 — Material pink) and, worse, neither material theme carried a
single gauzy-* token, so every modern surface (cards, stat tiles,
skeletons, table metrics, hover tints) rendered on EMPTY custom
properties.
The shared maps ($gauzy-density, action accents, action buttons) move
out of themes.scss into _gauzy-theme-maps.scss — the material theme
files register their themes before themes.scss's declarations run, so
they could never merge maps that lived there. themes.scss forwards the
partial, keeping every existing consumer working. Both material themes
now merge the shared maps plus a canvas token set (the hand-tuned
dark/corporate surface values), and their header/footer go
surface-colored like every other registered theme — Material's pink
and violet stay as ACCENTS.
Verified live: under material-dark, --gauzy-card-2 resolves, the
header paints #1f1f1f, and the pink survives only on primary controls.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(ui): language selectors show a flag and the language name
"AR (Arabic)" / "BG (Bulgarian)" becomes a small flag beside the plain
language name, in both the shared ngx-language-selector and the Quick
Settings selector (options and the closed trigger). Windows renders no
emoji flags, so 13 tiny hand-written SVGs are vendored under
assets/images/flags — one per LanguagesEnum language — resolved through
one code→country map in @gauzy/ui-core/shared; a flag that fails to
load hides itself, leaving the plain name.
e2e follows the format change: language options no longer carry a
locale-invariant "EN (" prefix, so the page objects now match options
by the flag asset in their <img src>, and the trigger-caption
assertions expect the native language names.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(ui): invoice line-item row actions render real icons, not bare dots
The add/edit invoice tables injected '<i class="nb-plus/nb-checkmark/
nb-close/nb-edit/nb-trash">' into the smart-table action buttons —
Nebular's icon font is long gone, so all five actions rendered as empty
colored dots. Same fix as the job-employee grid: FontAwesome glyphs
(loaded globally) with translated native titles, since these strings go
through [innerHTML] where directives never bind.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* chore: teach cspell the three new words from this wave
animatable, macrotask and unhashed — all in code comments introduced
by the record-View wave.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(ui): apply the PR review round — contrast, permissions, a11y and drawer hygiene
CodeRabbit findings on #9975, all verified against a local build:
- material-light: the header/footer band went surface-white but kept
text tokens written for the old color-primary band — white on white.
Both now read text-basic-color.
- Users: the SUPER_ADMIN row gate was inverted twice over (a
SUPER_ADMIN_EDIT holder got a DISABLED toolbar; a non-holder kept
enabled buttons that silently no-op'ed on a cleared selection). A
dedicated restrictedRow flag now gates the mutation buttons only, so
the read-only View works under ORG_USERS_VIEW as intended.
- Filter toggle directive: the delegated-listener marker is forgotten
on teardown (a re-rendered row re-registers, keeping the indicator
dot honest); nb-select values are detected via
.select-button:not(.placeholder) (the host never carries the class);
the funnel's aria-label/title re-translate on language change.
- Action toolbar: an empty visible slot no longer paints a blank pill
(:empty, with the slot content kept on one template line so no
whitespace text node defeats it), and a fully open strip WRAPS on a
viewport too narrow for it instead of clipping buttons out of reach.
- Zapier drawers: dropped the raw-UUID row and its borrowed task-page
label; the slug is the endpoint's real identifier.
- Proposals stat cards: computed over the whole filtered set (same
org/employee/date-range window as the table) instead of whichever
page was loaded.
- Invoice + job-employee smart-table actions: translated sr-only text
inside the [innerHTML] strings names the links for screen readers.
- Every drawer page closes its View when the table selection changes,
so the drawer can never keep showing record A beside selected B.
- type="button" on the three View buttons that could submit a form.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* chore: reword two directive comments cspell dislikes
Comment-only; no behavior change.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(ui): apply the second review round (cubic + greptile + CodeRabbit follow-ups)
- Filter toggle: the accept/deny toggle filter is now DETECTED (its
active choice button carries `.on`) and TRACKED (button widgets fire
neither input nor change, so the delegated listeners gain click);
row-scoped listener teardowns dispose per thead rebuild instead of
accumulating for the directive's lifetime.
- Action strip: the collapsed state is `visibility: hidden` (delayed
through the closing animation), so keyboard users can no longer tab
into clipped, aria-hidden buttons.
- Tasks drawer badges: standard statuses de-slug ('in-progress' ->
'in progress') and the default badge class is `basic`, matching the
grid renderer for OPEN and unlisted statuses.
- Proposals stat cards: the aggregate query now applies the SAME
column filters as the table, and a monotonic request guard stops an
older response from overwriting a newer one; the card row wraps on
narrow pages instead of overflowing the header.
- Users: `restrictedRow` re-derives when role permissions change
mid-session, not only on selection.
- Recurring expenses (both pages): a reload drops the selection along
with the drawer, so the toolbar cannot reopen a detached record.
- e2e: the language page-data keys are named for what they now hold
(flagEnglish: 'flags/gb.svg', ...).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(docs-ui): type-safe key-repeat check in the drop strip template
Surfaced by a cold-cache build of this branch: 'repeat' does not exist
on the template's Event typing for (keydown.space). Cast through
$any(), same behavior.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>1 parent 066de81 commit 0af5fc1
83 files changed
Lines changed: 2458 additions & 542 deletions
File tree
- apps
- gauzy-e2e
- src/support/Base/pagedata
- tests
- bdd/steps
- support
- pages
- tools
- gauzy/src
- app/pages
- expense-recurring
- goal-settings
- inventory/components/manage-merchants
- merchant-table
- invoices
- invoice-add
- invoice-edit
- organizations
- recurring-expense-employee
- tasks
- components/task
- users
- assets/images/flags
- packages
- plugins
- integration-zapier-ui/src/lib
- components
- zapier-actions
- zapier-triggers
- job-employee-ui/src/lib
- components/job-employee
- job-proposal-ui/src/lib
- proposal-template
- components/proposal-template-list
- proposal/components/proposal
- ui-core
- static/styles
- gauzy
- material
- theme/src/lib/components/theme-sidebar/theme-settings/components/theme-language-selector
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
545 | 545 | | |
546 | 546 | | |
547 | 547 | | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
548 | 551 | | |
549 | 552 | | |
550 | 553 | | |
| |||
Lines changed: 8 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
18 | 19 | | |
Lines changed: 13 additions & 11 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
6 | | - | |
7 | | - | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
16 | 18 | | |
17 | 19 | | |
18 | 20 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | | - | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
19 | 28 | | |
20 | 29 | | |
21 | 30 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
16 | 27 | | |
17 | 28 | | |
18 | 29 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
54 | | - | |
| 54 | + | |
55 | 55 | | |
56 | | - | |
57 | | - | |
58 | | - | |
59 | | - | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
60 | 60 | | |
61 | | - | |
62 | | - | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
63 | 66 | | |
64 | 67 | | |
65 | 68 | | |
| |||
89 | 92 | | |
90 | 93 | | |
91 | 94 | | |
92 | | - | |
| 95 | + | |
93 | 96 | | |
94 | 97 | | |
95 | 98 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
44 | 56 | | |
45 | 57 | | |
46 | | - | |
47 | | - | |
48 | | - | |
| 58 | + | |
49 | 59 | | |
50 | 60 | | |
51 | 61 | | |
52 | | - | |
53 | | - | |
54 | | - | |
55 | | - | |
56 | | - | |
| 62 | + | |
57 | 63 | | |
58 | 64 | | |
59 | 65 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
26 | | - | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
27 | 29 | | |
28 | 30 | | |
29 | 31 | | |
| |||
33 | 35 | | |
34 | 36 | | |
35 | 37 | | |
36 | | - | |
| 38 | + | |
| 39 | + | |
37 | 40 | | |
38 | 41 | | |
39 | | - | |
| 42 | + | |
40 | 43 | | |
41 | 44 | | |
42 | 45 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
46 | 46 | | |
47 | 47 | | |
48 | 48 | | |
49 | | - | |
| 49 | + | |
50 | 50 | | |
51 | 51 | | |
52 | 52 | | |
| |||
70 | 70 | | |
71 | 71 | | |
72 | 72 | | |
73 | | - | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
74 | 76 | | |
75 | 77 | | |
76 | 78 | | |
| |||
0 commit comments