forked from fixin.me/fixin.me
Add wide view and inline editing to Measurements page
The Measurements page gains a compact/wide view toggle (persisted in localStorage). The wide view is a pivot table: rows = time points, columns = quantity names (alphabetical), cells = value + delete button. Clicking a value in either view opens an inline edit panel (Turbo Stream) without leaving the page. The panel shows the quantity name, value input, unit selector, taken_at picker, and Update/Cancel buttons. Changes: - MeasurementsController: add edit/update actions; order by taken_at desc - measurements/index: compact table + wide container, view-toggle buttons - measurements/_readout: data-* attributes for JS pivot builder; edit link - measurements/_edit_panel, _edit_form, _edit_form_close, edit.turbo_stream, update.turbo_stream: inline edit views - application.js: groupMeasurements, buildWideTable (alphabetical cols), getMeasurementsView / setMeasurementsView, editMeasurementWide, readoutUnitChanged, setDefaultUnit - application.css: compact/wide visibility rules, .wide-cell flex layout, button.link reset, .items-table .form td alignment - Pictograms: view-rows.svg, view-columns.svg (view-toggle icons) - Locale: view_compact/view_wide toggle labels, edit link, update.success - Tests: system tests for compact inline edit and wide view edit panel Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -36,6 +36,7 @@
|
||||
--color-blue: #009ade;
|
||||
--color-dark-red: #b21237;
|
||||
--color-red: #ff1f5b;
|
||||
--color-purple: #8b2be2;
|
||||
|
||||
--depth: 0;
|
||||
|
||||
@@ -231,6 +232,10 @@ textarea:invalid {
|
||||
text-decoration: underline 1px var(--color-border-gray);
|
||||
text-underline-offset: 0.25em;
|
||||
}
|
||||
button.link {
|
||||
border: none;
|
||||
padding: 0;
|
||||
}
|
||||
[name=cancel],
|
||||
.auxiliary {
|
||||
border-color: var(--color-border-gray);
|
||||
@@ -252,6 +257,13 @@ textarea:invalid {
|
||||
background-color: var(--color-red);
|
||||
border-color: var(--color-red);
|
||||
}
|
||||
tr:has(select[data-changed]) button[name="button"],
|
||||
.set-default-unit:not([disabled]) {
|
||||
background-color: var(--color-purple);
|
||||
border-color: var(--color-purple);
|
||||
color: white;
|
||||
fill: white;
|
||||
}
|
||||
.link:focus-visible {
|
||||
text-decoration-color: var(--color-gray);
|
||||
}
|
||||
@@ -361,7 +373,7 @@ header {
|
||||
pointer-events: auto;
|
||||
}
|
||||
.flash:before {
|
||||
filter: invert();
|
||||
filter: invert(100%);
|
||||
height: 1.4em;
|
||||
margin: 0 0.5em;
|
||||
width: 1.4em;
|
||||
@@ -513,7 +525,7 @@ header {
|
||||
cursor: grab;
|
||||
}
|
||||
.items-table .form td {
|
||||
vertical-align: top;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.items-table td:not(:first-child),
|
||||
.grayed {
|
||||
@@ -640,3 +652,42 @@ li::marker {
|
||||
min-width: 66%;
|
||||
width: max-content;
|
||||
}
|
||||
.measurements-section {
|
||||
overflow-x: auto;
|
||||
}
|
||||
body[data-measurements-view=wide] .measurements-compact,
|
||||
body[data-measurements-view=compact] .measurements-wide {
|
||||
display: none;
|
||||
}
|
||||
body[data-measurements-view=compact] .view-toggle[data-view=compact],
|
||||
body[data-measurements-view=wide] .view-toggle[data-view=wide] {
|
||||
background-color: var(--color-blue);
|
||||
border-color: var(--color-blue);
|
||||
color: white;
|
||||
fill: white;
|
||||
}
|
||||
#measurements tr.grouped td {
|
||||
border-top: none;
|
||||
}
|
||||
#measurements tr.grouped .taken-at,
|
||||
#measurements tr.grouped .created-at {
|
||||
visibility: hidden;
|
||||
}
|
||||
.measurements-wide td {
|
||||
vertical-align: middle;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.wide-cell {
|
||||
align-items: center;
|
||||
display: inline-flex;
|
||||
gap: 0.25em;
|
||||
}
|
||||
.wide-cell .button {
|
||||
border: none;
|
||||
font-size: inherit;
|
||||
height: auto;
|
||||
padding: 0;
|
||||
}
|
||||
.wide-cell button.link::after {
|
||||
content: none;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user