flexdesk 0.6.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -0
- package/css/base.css +76 -0
- package/css/flexdesk.css +76 -0
- package/dist/charts.js +2 -2
- package/dist/{chunk-KH2GJTKR.js → chunk-CPYBQN3Q.js} +301 -3
- package/dist/chunk-CPYBQN3Q.js.map +7 -0
- package/dist/{chunk-CNXP3SIN.js → chunk-XYUZF5CD.js} +2 -2
- package/dist/flexdesk.css +76 -0
- package/dist/flow.js +1 -1
- package/dist/tiles.js +2 -2
- package/dist/widgets.js +88 -2
- package/dist/widgets.js.map +3 -3
- package/package.json +1 -1
- package/src/ui/components/data_table.js +375 -3
- package/src/ui/utils/scroll_lock.js +111 -0
- package/dist/chunk-KH2GJTKR.js.map +0 -7
- /package/dist/{chunk-CNXP3SIN.js.map → chunk-XYUZF5CD.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DataTable,
|
|
3
3
|
createRafResizeObserver
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-CPYBQN3Q.js";
|
|
5
5
|
import {
|
|
6
6
|
ManagedWindow
|
|
7
7
|
} from "./chunk-6JSOVNID.js";
|
|
@@ -2370,4 +2370,4 @@ export {
|
|
|
2370
2370
|
openPlotPopoutWindow,
|
|
2371
2371
|
openRawTracesWindow
|
|
2372
2372
|
};
|
|
2373
|
-
//# sourceMappingURL=chunk-
|
|
2373
|
+
//# sourceMappingURL=chunk-XYUZF5CD.js.map
|
package/dist/flexdesk.css
CHANGED
|
@@ -713,6 +713,39 @@ body.twm-dt-col-resizing {
|
|
|
713
713
|
color: var(--text-dim, #666);
|
|
714
714
|
font-style: italic;
|
|
715
715
|
}
|
|
716
|
+
/* 0.6.1 `diff` — one side of a comparison. A row that is NEW on this side is
|
|
717
|
+
* green, one that is GONE on this side red, a changed row carries an amber
|
|
718
|
+
* left edge and its changed cells an amber fill, and a GAP — the place a row
|
|
719
|
+
* holds on the other side — is hatched, so the eye reads it as "nothing here"
|
|
720
|
+
* rather than as an empty row. (0,3,2) and up, for `twm-dt-cell--null`'s
|
|
721
|
+
* reason above; a selected row keeps its own colour (`:not(.selected)`). */
|
|
722
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--added:not(.selected) > td {
|
|
723
|
+
background: color-mix(in srgb, var(--color-success, #3fb950) 16%, transparent);
|
|
724
|
+
}
|
|
725
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--removed:not(.selected) > td {
|
|
726
|
+
background: color-mix(in srgb, var(--color-danger, #c74e4e) 18%, transparent);
|
|
727
|
+
}
|
|
728
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--removed > td {
|
|
729
|
+
text-decoration: line-through;
|
|
730
|
+
text-decoration-color: color-mix(in srgb, var(--color-danger, #c74e4e) 70%, transparent);
|
|
731
|
+
}
|
|
732
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--added > td:first-child {
|
|
733
|
+
box-shadow: inset 3px 0 0 0 var(--color-success, #3fb950);
|
|
734
|
+
}
|
|
735
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--removed > td:first-child {
|
|
736
|
+
box-shadow: inset 3px 0 0 0 var(--color-danger, #c74e4e);
|
|
737
|
+
}
|
|
738
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--changed > td:first-child {
|
|
739
|
+
box-shadow: inset 3px 0 0 0 var(--color-warning, #ff9800);
|
|
740
|
+
}
|
|
741
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff:not(.selected) > td.twm-dt-diff__cell--changed {
|
|
742
|
+
background: color-mix(in srgb, var(--color-warning, #ff9800) 22%, transparent);
|
|
743
|
+
}
|
|
744
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--gap > td.twm-dt-diff__gap {
|
|
745
|
+
background: repeating-linear-gradient(135deg,
|
|
746
|
+
transparent 0 6px,
|
|
747
|
+
color-mix(in srgb, var(--text-muted, #888) 14%, transparent) 6px 7px);
|
|
748
|
+
}
|
|
716
749
|
/* `emptyState` and `setError` with no rows: the box's own words, which may
|
|
717
750
|
* wrap — muted for an empty state, red for a failure, in both densities. Quiet
|
|
718
751
|
* while loading — an empty table that is still loading is not empty. */
|
|
@@ -1713,6 +1746,49 @@ body.twm-window-maximized .twm-resize-handle {
|
|
|
1713
1746
|
opacity: 0.3;
|
|
1714
1747
|
cursor: not-allowed;
|
|
1715
1748
|
}
|
|
1749
|
+
/* `paging` — the strip UNDER a paged or scrolling DataTable's body: which rows
|
|
1750
|
+
* are held, the page buttons or Load all, why a large source is paged, and the
|
|
1751
|
+
* Pages / Scroll switch. */
|
|
1752
|
+
.twm-dt-paging {
|
|
1753
|
+
display: flex;
|
|
1754
|
+
align-items: center;
|
|
1755
|
+
gap: var(--space-md);
|
|
1756
|
+
flex: 0 0 auto;
|
|
1757
|
+
min-width: 0;
|
|
1758
|
+
padding: var(--space-xs) var(--space-md);
|
|
1759
|
+
border-top: 1px solid var(--border-subtle);
|
|
1760
|
+
font-size: var(--font-size-sm);
|
|
1761
|
+
color: var(--text-muted);
|
|
1762
|
+
white-space: nowrap;
|
|
1763
|
+
overflow: hidden;
|
|
1764
|
+
}
|
|
1765
|
+
.twm-dt-paging__info { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
1766
|
+
.twm-dt-paging__spacer { flex: 1 1 auto; }
|
|
1767
|
+
.twm-dt-paging__nav { display: inline-flex; align-items: center; gap: var(--space-xs); }
|
|
1768
|
+
.twm-dt-paging__page { min-width: 72px; text-align: center; }
|
|
1769
|
+
.twm-dt-paging .twm-pagination-btn { height: 20px; min-width: 22px; }
|
|
1770
|
+
.twm-dt-paging__note { color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; }
|
|
1771
|
+
.twm-dt-paging__all,
|
|
1772
|
+
.twm-dt-paging__mode {
|
|
1773
|
+
height: 20px;
|
|
1774
|
+
padding: 0 var(--space-md);
|
|
1775
|
+
background: transparent;
|
|
1776
|
+
border: 1px solid var(--border-default);
|
|
1777
|
+
border-radius: var(--radius-sm);
|
|
1778
|
+
color: var(--text-body);
|
|
1779
|
+
font: inherit;
|
|
1780
|
+
cursor: pointer;
|
|
1781
|
+
}
|
|
1782
|
+
.twm-dt-paging__all:hover:not(:disabled),
|
|
1783
|
+
.twm-dt-paging__mode:hover:not(:disabled) { border-color: var(--accent); color: var(--text-bright); }
|
|
1784
|
+
.twm-dt-paging__modes { display: inline-flex; }
|
|
1785
|
+
.twm-dt-paging__mode { border-radius: 0; }
|
|
1786
|
+
.twm-dt-paging__mode:first-child { border-radius: var(--radius-sm) 0 0 var(--radius-sm); }
|
|
1787
|
+
.twm-dt-paging__mode:last-child { border-radius: 0 var(--radius-sm) var(--radius-sm) 0; margin-left: -1px; }
|
|
1788
|
+
.twm-dt-paging__mode[aria-pressed="true"] { background: var(--accent); border-color: var(--accent); color: var(--text-bright); }
|
|
1789
|
+
.twm-dt-paging__all:disabled,
|
|
1790
|
+
.twm-dt-paging__mode:disabled { opacity: 0.45; cursor: not-allowed; }
|
|
1791
|
+
.twm-dt-paging__mode[aria-pressed="true"]:disabled { opacity: 1; cursor: default; }
|
|
1716
1792
|
/* Preview Table Styles - Essential for data view */
|
|
1717
1793
|
.twm-preview-table-wrap {
|
|
1718
1794
|
overflow: auto;
|
package/dist/flow.js
CHANGED
package/dist/tiles.js
CHANGED
|
@@ -16,8 +16,8 @@ import {
|
|
|
16
16
|
} from "./chunk-O5OHMWBB.js";
|
|
17
17
|
import {
|
|
18
18
|
openRawTracesWindow
|
|
19
|
-
} from "./chunk-
|
|
20
|
-
import "./chunk-
|
|
19
|
+
} from "./chunk-XYUZF5CD.js";
|
|
20
|
+
import "./chunk-CPYBQN3Q.js";
|
|
21
21
|
import "./chunk-6JSOVNID.js";
|
|
22
22
|
import "./chunk-FL5KFNQH.js";
|
|
23
23
|
import {
|
package/dist/widgets.js
CHANGED
|
@@ -24,6 +24,8 @@ import {
|
|
|
24
24
|
DataTable,
|
|
25
25
|
ISO_DATE,
|
|
26
26
|
ISO_DATETIME,
|
|
27
|
+
PAGING_HARD_LIMIT,
|
|
28
|
+
PAGING_SOFT_LIMIT,
|
|
27
29
|
createRafResizeObserver,
|
|
28
30
|
formatDate,
|
|
29
31
|
formatDuration,
|
|
@@ -31,8 +33,9 @@ import {
|
|
|
31
33
|
matchDurationFilter,
|
|
32
34
|
parseDatePeriod,
|
|
33
35
|
parseDateValue,
|
|
34
|
-
parseDuration
|
|
35
|
-
|
|
36
|
+
parseDuration,
|
|
37
|
+
resolvePaging
|
|
38
|
+
} from "./chunk-CPYBQN3Q.js";
|
|
36
39
|
import {
|
|
37
40
|
ManagedWindow,
|
|
38
41
|
ROW_CONTROL_SELECTOR,
|
|
@@ -5488,6 +5491,85 @@ function installTabsScrollbars(selectors = [".tabs"]) {
|
|
|
5488
5491
|
return () => observer.disconnect();
|
|
5489
5492
|
}
|
|
5490
5493
|
|
|
5494
|
+
// src/ui/utils/scroll_lock.js
|
|
5495
|
+
function createScrollLock({ axis = "y", enabled = true } = {}) {
|
|
5496
|
+
const doY = axis === "y" || axis === "both";
|
|
5497
|
+
const doX = axis === "x" || axis === "both";
|
|
5498
|
+
const members = /* @__PURE__ */ new Map();
|
|
5499
|
+
let last = { top: 0, left: 0 };
|
|
5500
|
+
let on = !!enabled;
|
|
5501
|
+
function copyFrom(source) {
|
|
5502
|
+
last = { top: source.scrollTop, left: source.scrollLeft };
|
|
5503
|
+
if (!on) return;
|
|
5504
|
+
for (const [el, state] of members) {
|
|
5505
|
+
if (el === source) continue;
|
|
5506
|
+
const top = doY ? last.top : el.scrollTop;
|
|
5507
|
+
const left = doX ? last.left : el.scrollLeft;
|
|
5508
|
+
if (el.scrollTop === top && el.scrollLeft === left) continue;
|
|
5509
|
+
state.wrote = { top, left };
|
|
5510
|
+
if (doY) el.scrollTop = top;
|
|
5511
|
+
if (doX) el.scrollLeft = left;
|
|
5512
|
+
}
|
|
5513
|
+
}
|
|
5514
|
+
function onScroll(event) {
|
|
5515
|
+
const el = event.currentTarget;
|
|
5516
|
+
const state = members.get(el);
|
|
5517
|
+
if (!state) return;
|
|
5518
|
+
const wrote = state.wrote;
|
|
5519
|
+
state.wrote = null;
|
|
5520
|
+
if (wrote && Math.abs(el.scrollTop - wrote.top) < 1 && Math.abs(el.scrollLeft - wrote.left) < 1) return;
|
|
5521
|
+
copyFrom(el);
|
|
5522
|
+
}
|
|
5523
|
+
const lock = {
|
|
5524
|
+
/** Join the group. Returns the function that leaves it. */
|
|
5525
|
+
attach(el) {
|
|
5526
|
+
if (!el || typeof el.addEventListener !== "function") return () => {
|
|
5527
|
+
};
|
|
5528
|
+
if (members.has(el)) return () => lock.detach(el);
|
|
5529
|
+
const state = { wrote: null };
|
|
5530
|
+
members.set(el, state);
|
|
5531
|
+
el.addEventListener("scroll", onScroll, { passive: true });
|
|
5532
|
+
if (on && (last.top || last.left)) {
|
|
5533
|
+
state.wrote = {
|
|
5534
|
+
top: doY ? last.top : el.scrollTop,
|
|
5535
|
+
left: doX ? last.left : el.scrollLeft
|
|
5536
|
+
};
|
|
5537
|
+
if (doY) el.scrollTop = last.top;
|
|
5538
|
+
if (doX) el.scrollLeft = last.left;
|
|
5539
|
+
}
|
|
5540
|
+
return () => lock.detach(el);
|
|
5541
|
+
},
|
|
5542
|
+
detach(el) {
|
|
5543
|
+
if (!members.has(el)) return;
|
|
5544
|
+
members.delete(el);
|
|
5545
|
+
el.removeEventListener("scroll", onScroll);
|
|
5546
|
+
},
|
|
5547
|
+
/** Lock (true) or let the members scroll freely (false). Locking again
|
|
5548
|
+
* brings every member level with the one scrolled last. */
|
|
5549
|
+
setEnabled(value) {
|
|
5550
|
+
const was = on;
|
|
5551
|
+
on = !!value;
|
|
5552
|
+
if (on && !was) {
|
|
5553
|
+
const source = [...members.keys()].find(
|
|
5554
|
+
(el) => el.scrollTop === last.top && el.scrollLeft === last.left
|
|
5555
|
+
) || members.keys().next().value;
|
|
5556
|
+
if (source) copyFrom(source);
|
|
5557
|
+
}
|
|
5558
|
+
},
|
|
5559
|
+
get enabled() {
|
|
5560
|
+
return on;
|
|
5561
|
+
},
|
|
5562
|
+
/** How many boxes are in the group (for a consumer's own checks). */
|
|
5563
|
+
get size() {
|
|
5564
|
+
return members.size;
|
|
5565
|
+
},
|
|
5566
|
+
dispose() {
|
|
5567
|
+
for (const el of [...members.keys()]) lock.detach(el);
|
|
5568
|
+
}
|
|
5569
|
+
};
|
|
5570
|
+
return lock;
|
|
5571
|
+
}
|
|
5572
|
+
|
|
5491
5573
|
// src/ui/utils/tooltip_service.js
|
|
5492
5574
|
var tooltipElement = null;
|
|
5493
5575
|
var currentTarget = null;
|
|
@@ -5751,6 +5833,8 @@ export {
|
|
|
5751
5833
|
ManagedWindow,
|
|
5752
5834
|
NotificationCenter,
|
|
5753
5835
|
NotificationHistory,
|
|
5836
|
+
PAGING_HARD_LIMIT,
|
|
5837
|
+
PAGING_SOFT_LIMIT,
|
|
5754
5838
|
PANEL_STATES,
|
|
5755
5839
|
PANEL_TRANSITIONS,
|
|
5756
5840
|
PageBase,
|
|
@@ -5767,6 +5851,7 @@ export {
|
|
|
5767
5851
|
attachInlineRenamer,
|
|
5768
5852
|
createDetailHeader,
|
|
5769
5853
|
createRafResizeObserver,
|
|
5854
|
+
createScrollLock,
|
|
5770
5855
|
createTableStateStore,
|
|
5771
5856
|
createTreeCategory,
|
|
5772
5857
|
createTreeItem,
|
|
@@ -5800,6 +5885,7 @@ export {
|
|
|
5800
5885
|
parseDuration,
|
|
5801
5886
|
refTypesFor,
|
|
5802
5887
|
reportBridgeError,
|
|
5888
|
+
resolvePaging,
|
|
5803
5889
|
selectItem,
|
|
5804
5890
|
setHelpProvider,
|
|
5805
5891
|
setModalHost,
|