@carto/ps-react-ui 4.17.2 → 4.18.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.
Files changed (91) hide show
  1. package/dist/category-Ct2BzADB.js +753 -0
  2. package/dist/category-Ct2BzADB.js.map +1 -0
  3. package/dist/change-column-Bhcxmp-r.js +1148 -0
  4. package/dist/change-column-Bhcxmp-r.js.map +1 -0
  5. package/dist/echart-B10dhEaM.js +262 -0
  6. package/dist/echart-B10dhEaM.js.map +1 -0
  7. package/dist/legend/stores.js +1 -1
  8. package/dist/{legend-store-registry-Bo8U_qWM.js → legend-store-registry-p1tSwJXH.js} +151 -147
  9. package/dist/legend-store-registry-p1tSwJXH.js.map +1 -0
  10. package/dist/legend.js +473 -415
  11. package/dist/legend.js.map +1 -1
  12. package/dist/types/legend/components/legend-actions/legend-actions.d.ts +2 -2
  13. package/dist/types/legend/components/legend-group/styles.d.ts +31 -20
  14. package/dist/types/legend/components/legend-row/styles.d.ts +24 -4
  15. package/dist/types/legend/components/legend-sortable/styles.d.ts +4 -3
  16. package/dist/types/widgets-v2/actions/lock-selection/lock-selection.d.ts +15 -5
  17. package/dist/types/widgets-v2/category/components/category-legend.d.ts +18 -2
  18. package/dist/types/widgets-v2/category/components/category-row-stacked.d.ts +6 -1
  19. package/dist/types/widgets-v2/category/style.d.ts +8 -0
  20. package/dist/types/widgets-v2/echart/use-chart-selection.d.ts +10 -4
  21. package/dist/types/widgets-v2/histogram/index.d.ts +1 -1
  22. package/dist/types/widgets-v2/histogram/transforms.d.ts +11 -0
  23. package/dist/types/widgets-v2/histogram/types.d.ts +9 -0
  24. package/dist/types/widgets-v2/scatterplot/index.d.ts +1 -1
  25. package/dist/types/widgets-v2/scatterplot/transforms.d.ts +9 -0
  26. package/dist/types/widgets-v2/table/index.d.ts +1 -0
  27. package/dist/types/widgets-v2/table/transforms.d.ts +13 -0
  28. package/dist/types/widgets-v2/table/transforms.test.d.ts +1 -0
  29. package/dist/types/widgets-v2/timeseries/index.d.ts +1 -0
  30. package/dist/types/widgets-v2/timeseries/transforms.d.ts +10 -0
  31. package/dist/types/widgets-v2/timeseries/transforms.test.d.ts +1 -0
  32. package/dist/widgets-v2/actions.js +1 -1
  33. package/dist/widgets-v2/category.js +1 -1
  34. package/dist/widgets-v2/echart.js +1 -1
  35. package/dist/widgets-v2/echart.js.map +1 -1
  36. package/dist/widgets-v2/histogram.js +181 -158
  37. package/dist/widgets-v2/histogram.js.map +1 -1
  38. package/dist/widgets-v2/pie.js +155 -116
  39. package/dist/widgets-v2/pie.js.map +1 -1
  40. package/dist/widgets-v2/scatterplot.js +91 -85
  41. package/dist/widgets-v2/scatterplot.js.map +1 -1
  42. package/dist/widgets-v2/table.js +55 -45
  43. package/dist/widgets-v2/table.js.map +1 -1
  44. package/dist/widgets-v2/timeseries.js +96 -85
  45. package/dist/widgets-v2/timeseries.js.map +1 -1
  46. package/dist/widgets-v2.js +4 -4
  47. package/package.json +3 -3
  48. package/src/legend/components/legend-actions/legend-actions.tsx +2 -2
  49. package/src/legend/components/legend-group/styles.ts +59 -36
  50. package/src/legend/components/legend-row/legend-row.tsx +10 -7
  51. package/src/legend/components/legend-row/styles.ts +41 -10
  52. package/src/legend/components/legend-sortable/styles.ts +13 -4
  53. package/src/legend/stores/legend-store-registry.ts +28 -4
  54. package/src/legend/stores/legend-store.test.ts +23 -0
  55. package/src/widgets-v2/actions/lock-selection/lock-selection.test.tsx +62 -0
  56. package/src/widgets-v2/actions/lock-selection/lock-selection.tsx +45 -13
  57. package/src/widgets-v2/category/category-ui.test.tsx +55 -0
  58. package/src/widgets-v2/category/category-ui.tsx +65 -6
  59. package/src/widgets-v2/category/components/category-legend.test.tsx +53 -2
  60. package/src/widgets-v2/category/components/category-legend.tsx +55 -12
  61. package/src/widgets-v2/category/components/category-row-stacked.test.tsx +7 -3
  62. package/src/widgets-v2/category/components/category-row-stacked.tsx +8 -3
  63. package/src/widgets-v2/category/style.ts +10 -2
  64. package/src/widgets-v2/echart/echart-ui.test.tsx +25 -0
  65. package/src/widgets-v2/echart/echart-ui.tsx +20 -0
  66. package/src/widgets-v2/echart/use-chart-selection.test.tsx +3 -1
  67. package/src/widgets-v2/echart/use-chart-selection.ts +10 -4
  68. package/src/widgets-v2/histogram/index.ts +4 -1
  69. package/src/widgets-v2/histogram/options.test.ts +86 -0
  70. package/src/widgets-v2/histogram/options.ts +50 -0
  71. package/src/widgets-v2/histogram/transforms.test.ts +36 -1
  72. package/src/widgets-v2/histogram/transforms.ts +23 -0
  73. package/src/widgets-v2/histogram/types.ts +9 -0
  74. package/src/widgets-v2/pie/options.test.ts +262 -0
  75. package/src/widgets-v2/pie/options.ts +80 -5
  76. package/src/widgets-v2/scatterplot/index.ts +4 -1
  77. package/src/widgets-v2/scatterplot/transforms.test.ts +38 -1
  78. package/src/widgets-v2/scatterplot/transforms.ts +23 -0
  79. package/src/widgets-v2/table/index.ts +1 -0
  80. package/src/widgets-v2/table/transforms.test.ts +40 -0
  81. package/src/widgets-v2/table/transforms.ts +26 -0
  82. package/src/widgets-v2/timeseries/index.ts +1 -0
  83. package/src/widgets-v2/timeseries/transforms.test.ts +49 -0
  84. package/src/widgets-v2/timeseries/transforms.ts +31 -0
  85. package/dist/category-CGS_eHr4.js +0 -719
  86. package/dist/category-CGS_eHr4.js.map +0 -1
  87. package/dist/change-column-CiVAjOUB.js +0 -1143
  88. package/dist/change-column-CiVAjOUB.js.map +0 -1
  89. package/dist/echart-Bdvbfx9s.js +0 -250
  90. package/dist/echart-Bdvbfx9s.js.map +0 -1
  91. package/dist/legend-store-registry-Bo8U_qWM.js.map +0 -1
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `LockSelection` filter for Table. Data is a FLAT `TableRow[]` (unlike every
3
+ * other widget's `X[][]` series shape) and row identity comes from
4
+ * `row[keyColumn]` (default `'id'`), not `name` — so `filterByLockedItems`
5
+ * doesn't apply here (its outer `.map` treats each row as a "series", and a
6
+ * plain row object isn't an array, so it would silently pass everything
7
+ * through unfiltered). Falls back to the row's index when the identity
8
+ * column is nullish, mirroring `TableUI`'s own `resolveRowId`.
9
+ *
10
+ * `keyColumn` isn't part of `LockSelection`'s generic `filterFn` signature —
11
+ * close over it: `filterFn={(data, locked) => filterTableByLockedRows(data, locked, keyColumn)}`.
12
+ */
13
+ export function filterTableByLockedRows(
14
+ input: unknown,
15
+ lockedItems: readonly (string | number)[],
16
+ keyColumn = 'id',
17
+ ): unknown {
18
+ if (lockedItems.length === 0) return input
19
+ if (!Array.isArray(input)) return input
20
+ const locked = new Set<string | number>(lockedItems)
21
+ return input.filter((row: unknown, index: number): boolean => {
22
+ if (row == null || typeof row !== 'object') return false
23
+ const id = (row as Record<string, unknown>)[keyColumn] ?? index
24
+ return (typeof id === 'string' || typeof id === 'number') && locked.has(id)
25
+ })
26
+ }
@@ -1,6 +1,7 @@
1
1
  export { timeseriesOptions, createTimeseriesOptionFactory } from './options'
2
2
  export { TimeseriesSkeleton } from './skeleton'
3
3
  export { createTimeseriesDownloadConfig } from './download'
4
+ export { filterTimeseriesByLockedItems } from './transforms'
4
5
  export type {
5
6
  TimeseriesDatum,
6
7
  TimeseriesWidgetData,
@@ -0,0 +1,49 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { filterTimeseriesByLockedItems } from './transforms'
3
+
4
+ describe('filterTimeseriesByLockedItems', () => {
5
+ it('returns input unchanged when locked set is empty', () => {
6
+ const data = [[{ name: 1000, value: 10 }]]
7
+ expect(filterTimeseriesByLockedItems(data, [])).toBe(data)
8
+ })
9
+
10
+ it('keeps only items whose (numeric) name is in the locked set', () => {
11
+ const out = filterTimeseriesByLockedItems(
12
+ [
13
+ [
14
+ { name: 1000, value: 10 },
15
+ { name: 2000, value: 20 },
16
+ ],
17
+ ],
18
+ [2000],
19
+ )
20
+ expect(out).toEqual([[{ name: 2000, value: 20 }]])
21
+ })
22
+
23
+ it('normalizes Date names to ms-since-epoch before comparing', () => {
24
+ const d1 = new Date('2024-01-01T00:00:00.000Z')
25
+ const d2 = new Date('2024-01-02T00:00:00.000Z')
26
+ const out = filterTimeseriesByLockedItems(
27
+ [
28
+ [
29
+ { name: d1, value: 10 },
30
+ { name: d2, value: 20 },
31
+ ],
32
+ ],
33
+ [d2.getTime()],
34
+ )
35
+ expect(out).toEqual([[{ name: d2, value: 20 }]])
36
+ })
37
+
38
+ it('handles string names', () => {
39
+ const out = filterTimeseriesByLockedItems(
40
+ [[{ name: '2024-01-01', value: 10 }]],
41
+ ['2024-01-01'],
42
+ )
43
+ expect(out).toEqual([[{ name: '2024-01-01', value: 10 }]])
44
+ })
45
+
46
+ it('returns input unchanged when input is not array-shaped', () => {
47
+ expect(filterTimeseriesByLockedItems('nope', [1])).toBe('nope')
48
+ })
49
+ })
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `LockSelection` filter for Timeseries. Data is `{name, value}[][]` like
3
+ * Bar/Pie/Category, but `name` may arrive as `Date | number | string` (the
4
+ * time axis stores a `Date`). `lockedItems` is snapshotted from `selection`,
5
+ * whose keys are already normalized to `Date → ms` (see `options.ts`'s
6
+ * `normalizeName`) — so a raw `Date` name must be normalized the same way
7
+ * before the membership check, or every point would compare a `Date` object
8
+ * against a `number` and silently fail to match, filtering everything out.
9
+ */
10
+ export function filterTimeseriesByLockedItems(
11
+ input: unknown,
12
+ lockedItems: readonly (string | number)[],
13
+ ): unknown {
14
+ if (lockedItems.length === 0) return input
15
+ if (!Array.isArray(input)) return input
16
+ const locked = new Set<string | number>(lockedItems)
17
+ return input.map((series: unknown): unknown => {
18
+ if (!Array.isArray(series)) return series
19
+ return series.filter((item: unknown) => {
20
+ if (item == null || typeof item !== 'object' || !('name' in item)) {
21
+ return false
22
+ }
23
+ const raw = (item as { name: unknown }).name
24
+ const name = raw instanceof Date ? raw.getTime() : raw
25
+ return (
26
+ (typeof name === 'string' || typeof name === 'number') &&
27
+ locked.has(name)
28
+ )
29
+ })
30
+ })
31
+ }