@genspectrum/dashboard-components 1.8.2 → 1.9.0
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/custom-elements.json +2 -2
- package/dist/components.d.ts +18 -18
- package/dist/components.js +114 -28
- package/dist/components.js.map +1 -1
- package/dist/util.d.ts +18 -18
- package/package.json +1 -1
- package/src/preact/components/downshift-combobox.tsx +2 -1
- package/src/preact/components/portal-tooltip.tsx +129 -0
- package/src/preact/components/tooltip.tsx +32 -16
- package/src/preact/lineageFilter/lineage-filter.stories.tsx +57 -1
- package/src/preact/lineageFilter/lineage-filter.tsx +1 -1
- package/src/preact/locationFilter/location-filter.tsx +3 -1
- package/src/preact/mutationsOverTime/mutations-over-time-grid-tooltip.tsx +1 -1
- package/src/preact/mutationsOverTime/mutations-over-time-grid.tsx +13 -7
- package/src/preact/mutationsOverTime/mutations-over-time.tsx +13 -4
- package/src/preact/textFilter/text-filter.tsx +3 -1
- package/src/preact/wastewater/mutationsOverTime/wastewater-mutations-over-time.tsx +8 -4
- package/src/web-components/input/gs-lineage-filter.stories.ts +1 -1
- package/src/web-components/input/gs-text-filter.stories.ts +1 -1
- package/standalone-bundle/dashboard-components.js +4283 -4214
- package/standalone-bundle/dashboard-components.js.map +1 -1
package/custom-elements.json
CHANGED
|
@@ -638,7 +638,7 @@
|
|
|
638
638
|
"type": {
|
|
639
639
|
"text": "StoryObj<Required<LineageFilterProps>>"
|
|
640
640
|
},
|
|
641
|
-
"default": "{ ...LineageFilter, play: async ({ canvasElement, step }) => { const canvas = await withinShadowRoot(canvasElement, 'gs-lineage-filter'); const inputField = () => canvas.getByPlaceholderText('Enter a lineage'); const listenerMock = fn(); await step('Setup event listener mock', () => { canvasElement.addEventListener(gsEventNames.lineageFilterChanged, listenerMock); }); await step('wait until data is loaded', async () => { await waitFor(() => { return expect(inputField()).toBeEnabled(); }); }); await step('Enters an invalid lineage value', async () => { await userEvent.type(inputField(), 'notInList'); await expect(listenerMock).not.toHaveBeenCalled(); }); await step('Empty input', async () => { await userEvent.type(inputField(), '{backspace>9/}'); await userEvent.click(canvas.getByLabelText('toggle menu')); await waitFor(() => { return expect(listenerMock.mock.calls.at(-1)![0].detail).toStrictEqual({ pangoLineage: undefined, }); }); }); await step('Enter a valid lineage value', async () => { await userEvent.type(inputField(), 'B.1.1.7*'); await userEvent.click(canvas.getByRole('option', { name: 'B.1.1.7*(
|
|
641
|
+
"default": "{ ...LineageFilter, play: async ({ canvasElement, step }) => { const canvas = await withinShadowRoot(canvasElement, 'gs-lineage-filter'); const inputField = () => canvas.getByPlaceholderText('Enter a lineage'); const listenerMock = fn(); await step('Setup event listener mock', () => { canvasElement.addEventListener(gsEventNames.lineageFilterChanged, listenerMock); }); await step('wait until data is loaded', async () => { await waitFor(() => { return expect(inputField()).toBeEnabled(); }); }); await step('Enters an invalid lineage value', async () => { await userEvent.type(inputField(), 'notInList'); await expect(listenerMock).not.toHaveBeenCalled(); }); await step('Empty input', async () => { await userEvent.type(inputField(), '{backspace>9/}'); await userEvent.click(canvas.getByLabelText('toggle menu')); await waitFor(() => { return expect(listenerMock.mock.calls.at(-1)![0].detail).toStrictEqual({ pangoLineage: undefined, }); }); }); await step('Enter a valid lineage value', async () => { await userEvent.type(inputField(), 'B.1.1.7*'); await userEvent.click(canvas.getByRole('option', { name: 'B.1.1.7*(677,146)' })); await waitFor(() => { return expect(listenerMock.mock.calls.at(-1)![0].detail).toStrictEqual({ pangoLineage: 'B.1.1.7*', }); }); }); }, args: { ...LineageFilter.args, value: '', }, }"
|
|
642
642
|
}
|
|
643
643
|
],
|
|
644
644
|
"exports": [
|
|
@@ -1530,7 +1530,7 @@
|
|
|
1530
1530
|
"type": {
|
|
1531
1531
|
"text": "StoryObj<Required<TextFilterProps>>"
|
|
1532
1532
|
},
|
|
1533
|
-
"default": "{ ...Default, play: async ({ canvasElement, step }) => { const canvas = await withinShadowRoot(canvasElement, 'gs-text-filter'); const inputField = () => canvas.getByPlaceholderText('Enter host name'); const listenerMock = fn(); await step('Setup event listener mock', () => { canvasElement.addEventListener(gsEventNames.textFilterChanged, listenerMock); }); await step('wait until data is loaded', async () => { await waitFor(() => { return expect(inputField()).toBeEnabled(); }); }); await step('Enters an invalid host name', async () => { await userEvent.type(inputField(), 'notInList'); await expect(listenerMock).not.toHaveBeenCalled(); }); await step('Empty input', async () => { await userEvent.type(inputField(), '{backspace>9/}'); }); await step('Enter a valid host name', async () => { await userEvent.type(inputField(), 'Homo s'); const dropdownOption = await canvas.findByText('Homo sapiens'); await userEvent.click(dropdownOption); }); await step('Verify event is fired with correct detail', async () => { await waitFor(async () => { await expect(listenerMock).toHaveBeenCalledWith( expect.objectContaining({ detail: { host: 'Homo sapiens', }, }), ); }); }); await step('Remove initial value', async () => { await userEvent.click(canvas.getByRole('button', { name: 'clear selection' })); await expect(listenerMock).
|
|
1533
|
+
"default": "{ ...Default, play: async ({ canvasElement, step }) => { const canvas = await withinShadowRoot(canvasElement, 'gs-text-filter'); const inputField = () => canvas.getByPlaceholderText('Enter host name'); const listenerMock = fn(); await step('Setup event listener mock', () => { canvasElement.addEventListener(gsEventNames.textFilterChanged, listenerMock); }); await step('wait until data is loaded', async () => { await waitFor(() => { return expect(inputField()).toBeEnabled(); }); }); await step('Enters an invalid host name', async () => { await userEvent.type(inputField(), 'notInList'); await expect(listenerMock).not.toHaveBeenCalled(); }); await step('Empty input', async () => { await userEvent.type(inputField(), '{backspace>9/}'); }); await step('Enter a valid host name', async () => { await userEvent.type(inputField(), 'Homo s'); const dropdownOption = await canvas.findByText('Homo sapiens'); await userEvent.click(dropdownOption); }); await step('Verify event is fired with correct detail', async () => { await waitFor(async () => { await expect(listenerMock).toHaveBeenCalledWith( expect.objectContaining({ detail: { host: 'Homo sapiens', }, }), ); }); }); await step('Remove initial value', async () => { await userEvent.click(canvas.getByRole('button', { name: 'clear selection' })); await expect(listenerMock).toHaveBeenCalledWith( expect.objectContaining({ detail: { host: undefined, }, }), ); }); }, args: { ...Default.args, value: '', }, }"
|
|
1534
1534
|
}
|
|
1535
1535
|
],
|
|
1536
1536
|
"exports": [
|
package/dist/components.d.ts
CHANGED
|
@@ -1717,7 +1717,7 @@ declare global {
|
|
|
1717
1717
|
|
|
1718
1718
|
declare global {
|
|
1719
1719
|
interface HTMLElementTagNameMap {
|
|
1720
|
-
'gs-
|
|
1720
|
+
'gs-aggregate': AggregateComponent;
|
|
1721
1721
|
}
|
|
1722
1722
|
}
|
|
1723
1723
|
|
|
@@ -1725,7 +1725,7 @@ declare global {
|
|
|
1725
1725
|
declare global {
|
|
1726
1726
|
namespace JSX {
|
|
1727
1727
|
interface IntrinsicElements {
|
|
1728
|
-
'gs-
|
|
1728
|
+
'gs-aggregate': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
1729
1729
|
}
|
|
1730
1730
|
}
|
|
1731
1731
|
}
|
|
@@ -1733,7 +1733,7 @@ declare global {
|
|
|
1733
1733
|
|
|
1734
1734
|
declare global {
|
|
1735
1735
|
interface HTMLElementTagNameMap {
|
|
1736
|
-
'gs-
|
|
1736
|
+
'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;
|
|
1737
1737
|
}
|
|
1738
1738
|
}
|
|
1739
1739
|
|
|
@@ -1741,7 +1741,7 @@ declare global {
|
|
|
1741
1741
|
declare global {
|
|
1742
1742
|
namespace JSX {
|
|
1743
1743
|
interface IntrinsicElements {
|
|
1744
|
-
'gs-
|
|
1744
|
+
'gs-number-sequences-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
1745
1745
|
}
|
|
1746
1746
|
}
|
|
1747
1747
|
}
|
|
@@ -1749,7 +1749,7 @@ declare global {
|
|
|
1749
1749
|
|
|
1750
1750
|
declare global {
|
|
1751
1751
|
interface HTMLElementTagNameMap {
|
|
1752
|
-
'gs-
|
|
1752
|
+
'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;
|
|
1753
1753
|
}
|
|
1754
1754
|
}
|
|
1755
1755
|
|
|
@@ -1757,7 +1757,7 @@ declare global {
|
|
|
1757
1757
|
declare global {
|
|
1758
1758
|
namespace JSX {
|
|
1759
1759
|
interface IntrinsicElements {
|
|
1760
|
-
'gs-
|
|
1760
|
+
'gs-relative-growth-advantage': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
1761
1761
|
}
|
|
1762
1762
|
}
|
|
1763
1763
|
}
|
|
@@ -1765,7 +1765,7 @@ declare global {
|
|
|
1765
1765
|
|
|
1766
1766
|
declare global {
|
|
1767
1767
|
interface HTMLElementTagNameMap {
|
|
1768
|
-
'gs-
|
|
1768
|
+
'gs-sequences-by-location': SequencesByLocationComponent;
|
|
1769
1769
|
}
|
|
1770
1770
|
}
|
|
1771
1771
|
|
|
@@ -1773,7 +1773,7 @@ declare global {
|
|
|
1773
1773
|
declare global {
|
|
1774
1774
|
namespace JSX {
|
|
1775
1775
|
interface IntrinsicElements {
|
|
1776
|
-
'gs-
|
|
1776
|
+
'gs-sequences-by-location': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
1777
1777
|
}
|
|
1778
1778
|
}
|
|
1779
1779
|
}
|
|
@@ -1781,7 +1781,7 @@ declare global {
|
|
|
1781
1781
|
|
|
1782
1782
|
declare global {
|
|
1783
1783
|
interface HTMLElementTagNameMap {
|
|
1784
|
-
'gs-
|
|
1784
|
+
'gs-mutations-over-time': MutationsOverTimeComponent;
|
|
1785
1785
|
}
|
|
1786
1786
|
}
|
|
1787
1787
|
|
|
@@ -1789,7 +1789,7 @@ declare global {
|
|
|
1789
1789
|
declare global {
|
|
1790
1790
|
namespace JSX {
|
|
1791
1791
|
interface IntrinsicElements {
|
|
1792
|
-
'gs-
|
|
1792
|
+
'gs-mutations-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
1793
1793
|
}
|
|
1794
1794
|
}
|
|
1795
1795
|
}
|
|
@@ -1813,7 +1813,11 @@ declare global {
|
|
|
1813
1813
|
|
|
1814
1814
|
declare global {
|
|
1815
1815
|
interface HTMLElementTagNameMap {
|
|
1816
|
-
'gs-
|
|
1816
|
+
'gs-date-range-filter': DateRangeFilterComponent;
|
|
1817
|
+
}
|
|
1818
|
+
interface HTMLElementEventMap {
|
|
1819
|
+
[gsEventNames.dateRangeFilterChanged]: CustomEvent<Record<string, string>>;
|
|
1820
|
+
[gsEventNames.dateRangeOptionChanged]: DateRangeOptionChangedEvent;
|
|
1817
1821
|
}
|
|
1818
1822
|
}
|
|
1819
1823
|
|
|
@@ -1821,7 +1825,7 @@ declare global {
|
|
|
1821
1825
|
declare global {
|
|
1822
1826
|
namespace JSX {
|
|
1823
1827
|
interface IntrinsicElements {
|
|
1824
|
-
'gs-
|
|
1828
|
+
'gs-date-range-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
1825
1829
|
}
|
|
1826
1830
|
}
|
|
1827
1831
|
}
|
|
@@ -1829,11 +1833,7 @@ declare global {
|
|
|
1829
1833
|
|
|
1830
1834
|
declare global {
|
|
1831
1835
|
interface HTMLElementTagNameMap {
|
|
1832
|
-
'gs-
|
|
1833
|
-
}
|
|
1834
|
-
interface HTMLElementEventMap {
|
|
1835
|
-
[gsEventNames.dateRangeFilterChanged]: CustomEvent<Record<string, string>>;
|
|
1836
|
-
[gsEventNames.dateRangeOptionChanged]: DateRangeOptionChangedEvent;
|
|
1836
|
+
'gs-wastewater-mutations-over-time': WastewaterMutationsOverTimeComponent;
|
|
1837
1837
|
}
|
|
1838
1838
|
}
|
|
1839
1839
|
|
|
@@ -1841,7 +1841,7 @@ declare global {
|
|
|
1841
1841
|
declare global {
|
|
1842
1842
|
namespace JSX {
|
|
1843
1843
|
interface IntrinsicElements {
|
|
1844
|
-
'gs-
|
|
1844
|
+
'gs-wastewater-mutations-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
1845
1845
|
}
|
|
1846
1846
|
}
|
|
1847
1847
|
}
|
package/dist/components.js
CHANGED
|
@@ -1585,6 +1585,20 @@ const MinMaxRangeSlider = ({
|
|
|
1585
1585
|
function getGradientBoundary(x2, lowerBound, upperBound) {
|
|
1586
1586
|
return (x2 - lowerBound) / (upperBound - lowerBound) * 100;
|
|
1587
1587
|
}
|
|
1588
|
+
const TOOLTIP_BASE_STYLES = "z-10 w-max bg-white p-4 border border-gray-200 rounded-md";
|
|
1589
|
+
const Tooltip = ({ children, content, position = "bottom", tooltipStyle }) => {
|
|
1590
|
+
return /* @__PURE__ */ u$1("div", { className: `relative group`, children: [
|
|
1591
|
+
/* @__PURE__ */ u$1("div", { children }),
|
|
1592
|
+
/* @__PURE__ */ u$1(
|
|
1593
|
+
"div",
|
|
1594
|
+
{
|
|
1595
|
+
className: `absolute ${TOOLTIP_BASE_STYLES} invisible group-hover:visible ${getPositionCss(position)}`,
|
|
1596
|
+
style: tooltipStyle,
|
|
1597
|
+
children: content
|
|
1598
|
+
}
|
|
1599
|
+
)
|
|
1600
|
+
] });
|
|
1601
|
+
};
|
|
1588
1602
|
function getPositionCss(position) {
|
|
1589
1603
|
switch (position) {
|
|
1590
1604
|
case "top":
|
|
@@ -1607,19 +1621,6 @@ function getPositionCss(position) {
|
|
|
1607
1621
|
return "";
|
|
1608
1622
|
}
|
|
1609
1623
|
}
|
|
1610
|
-
const Tooltip = ({ children, content, position = "bottom", tooltipStyle }) => {
|
|
1611
|
-
return /* @__PURE__ */ u$1("div", { className: `relative group`, children: [
|
|
1612
|
-
/* @__PURE__ */ u$1("div", { children }),
|
|
1613
|
-
/* @__PURE__ */ u$1(
|
|
1614
|
-
"div",
|
|
1615
|
-
{
|
|
1616
|
-
className: `absolute z-10 w-max bg-white p-4 border border-gray-200 rounded-md invisible group-hover:visible ${getPositionCss(position)}`,
|
|
1617
|
-
style: tooltipStyle,
|
|
1618
|
-
children: content
|
|
1619
|
-
}
|
|
1620
|
-
)
|
|
1621
|
-
] });
|
|
1622
|
-
};
|
|
1623
1624
|
const ColorsRGB = {
|
|
1624
1625
|
indigo: [51, 34, 136],
|
|
1625
1626
|
green: [17, 119, 51],
|
|
@@ -7422,7 +7423,7 @@ const MutationsOverTimeGridTooltip = ({
|
|
|
7422
7423
|
value
|
|
7423
7424
|
}) => {
|
|
7424
7425
|
const dateClass = toTemporalClass(date);
|
|
7425
|
-
return /* @__PURE__ */ u$1("div", { children: [
|
|
7426
|
+
return /* @__PURE__ */ u$1("div", { className: "text-center", children: [
|
|
7426
7427
|
/* @__PURE__ */ u$1("p", { children: /* @__PURE__ */ u$1("span", { className: "font-bold", children: dateClass.englishName() }) }),
|
|
7427
7428
|
/* @__PURE__ */ u$1("p", { children: [
|
|
7428
7429
|
"(",
|
|
@@ -7549,6 +7550,79 @@ const getTextColorForScale = (value, colorScale) => {
|
|
|
7549
7550
|
const alpha = (value - colorScale.min) / colorRange;
|
|
7550
7551
|
return alpha <= 0.5 ? "black" : "white";
|
|
7551
7552
|
};
|
|
7553
|
+
const PortalTooltip = ({
|
|
7554
|
+
children,
|
|
7555
|
+
content,
|
|
7556
|
+
position = "bottom",
|
|
7557
|
+
tooltipStyle,
|
|
7558
|
+
portalTarget
|
|
7559
|
+
}) => {
|
|
7560
|
+
const [isHovered, setIsHovered] = d(false);
|
|
7561
|
+
const [tooltipPosition, setTooltipPosition] = d({ top: 0, left: 0 });
|
|
7562
|
+
const triggerRef = A$1(null);
|
|
7563
|
+
const tooltipRef = A$1(null);
|
|
7564
|
+
_(() => {
|
|
7565
|
+
if (isHovered && triggerRef.current !== null && tooltipRef.current !== null) {
|
|
7566
|
+
const triggerRect = triggerRef.current.getBoundingClientRect();
|
|
7567
|
+
const tooltipRect = tooltipRef.current.getBoundingClientRect();
|
|
7568
|
+
const newPosition = calculateTooltipPosition(triggerRect, tooltipRect, position);
|
|
7569
|
+
setTooltipPosition(newPosition);
|
|
7570
|
+
}
|
|
7571
|
+
}, [isHovered, position]);
|
|
7572
|
+
const tooltipContent = /* @__PURE__ */ u$1(
|
|
7573
|
+
"div",
|
|
7574
|
+
{
|
|
7575
|
+
ref: tooltipRef,
|
|
7576
|
+
className: `fixed ${TOOLTIP_BASE_STYLES} ${isHovered ? "visible" : "invisible"}`,
|
|
7577
|
+
style: Object.assign({}, tooltipStyle, { top: tooltipPosition.top, left: tooltipPosition.left }),
|
|
7578
|
+
children: content
|
|
7579
|
+
}
|
|
7580
|
+
);
|
|
7581
|
+
return /* @__PURE__ */ u$1(Fragment, { children: [
|
|
7582
|
+
/* @__PURE__ */ u$1("div", { ref: triggerRef, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), children }),
|
|
7583
|
+
portalTarget !== null && $(tooltipContent, portalTarget)
|
|
7584
|
+
] });
|
|
7585
|
+
};
|
|
7586
|
+
function calculateTooltipPosition(triggerRect, tooltipRect, position) {
|
|
7587
|
+
const gap = 4;
|
|
7588
|
+
let top;
|
|
7589
|
+
let left;
|
|
7590
|
+
switch (position) {
|
|
7591
|
+
case "top":
|
|
7592
|
+
top = triggerRect.top - tooltipRect.height - gap;
|
|
7593
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
|
|
7594
|
+
break;
|
|
7595
|
+
case "top-start":
|
|
7596
|
+
top = triggerRect.top - tooltipRect.height - gap;
|
|
7597
|
+
left = triggerRect.left;
|
|
7598
|
+
break;
|
|
7599
|
+
case "top-end":
|
|
7600
|
+
top = triggerRect.top - tooltipRect.height - gap;
|
|
7601
|
+
left = triggerRect.right - tooltipRect.width;
|
|
7602
|
+
break;
|
|
7603
|
+
case "bottom":
|
|
7604
|
+
top = triggerRect.bottom + gap;
|
|
7605
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
|
|
7606
|
+
break;
|
|
7607
|
+
case "bottom-start":
|
|
7608
|
+
top = triggerRect.bottom + gap;
|
|
7609
|
+
left = triggerRect.left;
|
|
7610
|
+
break;
|
|
7611
|
+
case "bottom-end":
|
|
7612
|
+
top = triggerRect.bottom + gap;
|
|
7613
|
+
left = triggerRect.right - tooltipRect.width;
|
|
7614
|
+
break;
|
|
7615
|
+
case "left":
|
|
7616
|
+
top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
|
|
7617
|
+
left = triggerRect.left - tooltipRect.width - gap;
|
|
7618
|
+
break;
|
|
7619
|
+
case "right":
|
|
7620
|
+
top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
|
|
7621
|
+
left = triggerRect.right + gap;
|
|
7622
|
+
break;
|
|
7623
|
+
}
|
|
7624
|
+
return { top, left };
|
|
7625
|
+
}
|
|
7552
7626
|
const pageSizeContext = createContext$1({
|
|
7553
7627
|
pageSize: -1,
|
|
7554
7628
|
setPageSize: () => {
|
|
@@ -7731,7 +7805,8 @@ const MutationsOverTimeGrid = ({
|
|
|
7731
7805
|
data,
|
|
7732
7806
|
colorScale,
|
|
7733
7807
|
sequenceType,
|
|
7734
|
-
pageSizes
|
|
7808
|
+
pageSizes,
|
|
7809
|
+
tooltipPortalTarget
|
|
7735
7810
|
}) => {
|
|
7736
7811
|
const tableData = T$1(() => {
|
|
7737
7812
|
const allMutations = data.getFirstAxisKeys();
|
|
@@ -7772,14 +7847,15 @@ const MutationsOverTimeGrid = ({
|
|
|
7772
7847
|
columnIndex,
|
|
7773
7848
|
numberOfColumns
|
|
7774
7849
|
),
|
|
7775
|
-
colorScale
|
|
7850
|
+
colorScale,
|
|
7851
|
+
tooltipPortalTarget
|
|
7776
7852
|
}
|
|
7777
7853
|
) });
|
|
7778
7854
|
}
|
|
7779
7855
|
});
|
|
7780
7856
|
});
|
|
7781
7857
|
return [mutationHeader, ...dateHeaders];
|
|
7782
|
-
}, [colorScale, data, sequenceType]);
|
|
7858
|
+
}, [colorScale, data, sequenceType, tooltipPortalTarget]);
|
|
7783
7859
|
const { pageSize } = usePageSizeContext();
|
|
7784
7860
|
const table = usePreactTable({
|
|
7785
7861
|
data: tableData,
|
|
@@ -7818,13 +7894,14 @@ function getTooltipPosition(rowIndex, rows, columnIndex, columns) {
|
|
|
7818
7894
|
const tooltipY = columnIndex < columns / 2 ? "start" : "end";
|
|
7819
7895
|
return `${tooltipX}-${tooltipY}`;
|
|
7820
7896
|
}
|
|
7821
|
-
const ProportionCell = ({ value, mutation, date, tooltipPosition, colorScale }) => {
|
|
7897
|
+
const ProportionCell = ({ value, mutation, date, tooltipPosition, colorScale, tooltipPortalTarget }) => {
|
|
7822
7898
|
const proportion = (value == null ? void 0 : value.type) === "belowThreshold" ? void 0 : value == null ? void 0 : value.proportion;
|
|
7823
7899
|
return /* @__PURE__ */ u$1("div", { className: "py-1 w-full h-full", children: /* @__PURE__ */ u$1(
|
|
7824
|
-
|
|
7900
|
+
PortalTooltip,
|
|
7825
7901
|
{
|
|
7826
7902
|
content: /* @__PURE__ */ u$1(MutationsOverTimeGridTooltip, { mutation, date, value }),
|
|
7827
7903
|
position: tooltipPosition,
|
|
7904
|
+
portalTarget: tooltipPortalTarget,
|
|
7828
7905
|
children: /* @__PURE__ */ u$1(
|
|
7829
7906
|
"div",
|
|
7830
7907
|
{
|
|
@@ -8053,6 +8130,11 @@ const MutationsOverTimeTabs$1 = ({
|
|
|
8053
8130
|
overallMutationData
|
|
8054
8131
|
}) => {
|
|
8055
8132
|
const tabsRef = useDispatchFinishedLoadingEvent();
|
|
8133
|
+
const tooltipPortalTargetRef = A$1(null);
|
|
8134
|
+
const [tooltipPortalTarget, setTooltipPortalTarget] = d(null);
|
|
8135
|
+
_(() => {
|
|
8136
|
+
setTooltipPortalTarget(tooltipPortalTargetRef.current);
|
|
8137
|
+
}, []);
|
|
8056
8138
|
const [mutationFilterValue, setMutationFilterValue] = d({
|
|
8057
8139
|
textFilter: "",
|
|
8058
8140
|
annotationNameFilter: /* @__PURE__ */ new Set()
|
|
@@ -8102,7 +8184,8 @@ const MutationsOverTimeTabs$1 = ({
|
|
|
8102
8184
|
data: filteredData,
|
|
8103
8185
|
colorScale,
|
|
8104
8186
|
sequenceType: originalComponentProps.sequenceType,
|
|
8105
|
-
pageSizes: originalComponentProps.pageSizes
|
|
8187
|
+
pageSizes: originalComponentProps.pageSizes,
|
|
8188
|
+
tooltipPortalTarget
|
|
8106
8189
|
}
|
|
8107
8190
|
)
|
|
8108
8191
|
};
|
|
@@ -8129,7 +8212,7 @@ const MutationsOverTimeTabs$1 = ({
|
|
|
8129
8212
|
mutationFilterValue
|
|
8130
8213
|
}
|
|
8131
8214
|
);
|
|
8132
|
-
return /* @__PURE__ */ u$1(PageSizeContextProvider, { pageSizes: originalComponentProps.pageSizes, children: /* @__PURE__ */ u$1(Tabs, { ref: tabsRef, tabs, toolbar }) });
|
|
8215
|
+
return /* @__PURE__ */ u$1("div", { ref: tooltipPortalTargetRef, children: /* @__PURE__ */ u$1(PageSizeContextProvider, { pageSizes: originalComponentProps.pageSizes, children: /* @__PURE__ */ u$1(Tabs, { ref: tabsRef, tabs, toolbar }) }) });
|
|
8133
8216
|
};
|
|
8134
8217
|
const Toolbar$2 = ({
|
|
8135
8218
|
activeTab,
|
|
@@ -9718,6 +9801,7 @@ const MutationsOverTimeTabs = ({
|
|
|
9718
9801
|
originalComponentProps
|
|
9719
9802
|
}) => {
|
|
9720
9803
|
const tabsRef = useDispatchFinishedLoadingEvent();
|
|
9804
|
+
const tooltipPortalTargetRef = A$1(null);
|
|
9721
9805
|
const [mutationFilterValue, setMutationFilterValue] = d({
|
|
9722
9806
|
textFilter: "",
|
|
9723
9807
|
annotationNameFilter: /* @__PURE__ */ new Set()
|
|
@@ -9740,7 +9824,8 @@ const MutationsOverTimeTabs = ({
|
|
|
9740
9824
|
}),
|
|
9741
9825
|
colorScale,
|
|
9742
9826
|
pageSizes: originalComponentProps.pageSizes,
|
|
9743
|
-
sequenceType: originalComponentProps.sequenceType
|
|
9827
|
+
sequenceType: originalComponentProps.sequenceType,
|
|
9828
|
+
tooltipPortalTarget: tooltipPortalTargetRef.current
|
|
9744
9829
|
}
|
|
9745
9830
|
)
|
|
9746
9831
|
})),
|
|
@@ -9767,7 +9852,7 @@ const MutationsOverTimeTabs = ({
|
|
|
9767
9852
|
mutationFilterValue
|
|
9768
9853
|
}
|
|
9769
9854
|
);
|
|
9770
|
-
return /* @__PURE__ */ u$1(PageSizeContextProvider, { pageSizes: originalComponentProps.pageSizes, children: /* @__PURE__ */ u$1(Tabs, { ref: tabsRef, tabs, toolbar }) });
|
|
9855
|
+
return /* @__PURE__ */ u$1("div", { ref: tooltipPortalTargetRef, children: /* @__PURE__ */ u$1(PageSizeContextProvider, { pageSizes: originalComponentProps.pageSizes, children: /* @__PURE__ */ u$1(Tabs, { ref: tabsRef, tabs, toolbar }) }) });
|
|
9771
9856
|
};
|
|
9772
9857
|
const Toolbar = ({
|
|
9773
9858
|
colorScale,
|
|
@@ -14106,7 +14191,8 @@ function DownshiftCombobox({
|
|
|
14106
14191
|
highlightedIndex,
|
|
14107
14192
|
getItemProps,
|
|
14108
14193
|
inputValue,
|
|
14109
|
-
closeMenu
|
|
14194
|
+
closeMenu,
|
|
14195
|
+
reset
|
|
14110
14196
|
} = useCombobox({
|
|
14111
14197
|
onInputValueChange({ inputValue: inputValue2 }) {
|
|
14112
14198
|
setInputIsInvalid(false);
|
|
@@ -14136,7 +14222,7 @@ function DownshiftCombobox({
|
|
|
14136
14222
|
setInputIsInvalid(true);
|
|
14137
14223
|
};
|
|
14138
14224
|
const clearInput = () => {
|
|
14139
|
-
|
|
14225
|
+
reset();
|
|
14140
14226
|
};
|
|
14141
14227
|
const buttonRef = A$1(null);
|
|
14142
14228
|
return /* @__PURE__ */ u$1("div", { ref: divRef, className: "relative w-full", children: [
|
|
@@ -14273,7 +14359,7 @@ const LocationSelector = ({
|
|
|
14273
14359
|
/* @__PURE__ */ u$1("span", { children: item.label }),
|
|
14274
14360
|
!hideCounts && /* @__PURE__ */ u$1("span", { className: "ml-2 text-gray-500", children: [
|
|
14275
14361
|
"(",
|
|
14276
|
-
item.count,
|
|
14362
|
+
item.count.toLocaleString("en-US"),
|
|
14277
14363
|
")"
|
|
14278
14364
|
] })
|
|
14279
14365
|
] }),
|
|
@@ -14445,7 +14531,7 @@ const TextSelector = ({
|
|
|
14445
14531
|
/* @__PURE__ */ u$1("span", { children: item.value }),
|
|
14446
14532
|
!hideCounts && /* @__PURE__ */ u$1("span", { className: "ml-2 text-gray-500", children: [
|
|
14447
14533
|
"(",
|
|
14448
|
-
item.count,
|
|
14534
|
+
item.count.toLocaleString("en-US"),
|
|
14449
14535
|
")"
|
|
14450
14536
|
] })
|
|
14451
14537
|
] });
|
|
@@ -15450,7 +15536,7 @@ const LineageSelector = ({
|
|
|
15450
15536
|
/* @__PURE__ */ u$1("span", { children: item.lineage }),
|
|
15451
15537
|
!hideCounts && /* @__PURE__ */ u$1("span", { className: "ml-2 text-gray-500", children: [
|
|
15452
15538
|
"(",
|
|
15453
|
-
item.count,
|
|
15539
|
+
item.count.toLocaleString("en-US"),
|
|
15454
15540
|
")"
|
|
15455
15541
|
] })
|
|
15456
15542
|
] })
|