synapse-react-client 4.0.15 → 4.0.17
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/dist/SWC.index.d.ts +1 -0
- package/dist/SWC.index.d.ts.map +1 -1
- package/dist/SWC.index.js +2 -1
- package/dist/SWC.index.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js +1 -0
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
- package/dist/components/EntityIcon.d.ts.map +1 -1
- package/dist/components/EntityIcon.js +2 -1
- package/dist/components/EntityIcon.js.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.d.ts +2 -0
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.d.ts.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.js.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts +2 -0
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +53 -51
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +1 -0
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +38 -23
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +1 -1
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +1 -0
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -1
- package/dist/components/widgets/Range.d.ts.map +1 -1
- package/dist/components/widgets/Range.js +51 -41
- package/dist/components/widgets/Range.js.map +1 -1
- package/dist/components/widgets/facet-nav/SelectionCriteriaPill.d.ts +3 -1
- package/dist/components/widgets/facet-nav/SelectionCriteriaPill.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/SelectionCriteriaPill.js +3 -3
- package/dist/components/widgets/facet-nav/SelectionCriteriaPill.js.map +1 -1
- package/dist/components/widgets/facet-nav/SelectionCriteriaPills.d.ts +1 -1
- package/dist/components/widgets/facet-nav/SelectionCriteriaPills.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js +11 -11
- package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
- package/dist/components/widgets/query-filter/RangeFacetFilterUI.d.ts +9 -2
- package/dist/components/widgets/query-filter/RangeFacetFilterUI.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/RangeFacetFilterUI.js +21 -14
- package/dist/components/widgets/query-filter/RangeFacetFilterUI.js.map +1 -1
- package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -1
- package/dist/features/curator/dashboard/components/CurationTaskCard.js +16 -10
- package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.css +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js.map +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.module.scss +5 -2
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +9 -0
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +1 -1
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -1
- package/dist/style/components/_total-query-results.scss +4 -0
- package/dist/style/main.css +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -1,26 +1,30 @@
|
|
|
1
1
|
import { useState as e } from "react";
|
|
2
2
|
import { Box as t, Button as n, TextField as r } from "@mui/material";
|
|
3
3
|
import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
4
|
-
import s from "
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
4
|
+
import s from "lodash-es/isEmpty";
|
|
5
|
+
import c from "dayjs";
|
|
6
|
+
import { AdapterDayjs as l } from "@mui/x-date-pickers/AdapterDayjs";
|
|
7
|
+
import { LocalizationProvider as u } from "@mui/x-date-pickers/LocalizationProvider";
|
|
8
|
+
import { DatePicker as d } from "@mui/x-date-pickers";
|
|
8
9
|
//#region src/components/widgets/Range.tsx
|
|
9
|
-
function
|
|
10
|
-
let [
|
|
11
|
-
min:
|
|
12
|
-
max:
|
|
10
|
+
function f(f) {
|
|
11
|
+
let [p, m] = e(!1), [h, g] = e(() => f.type === "number" && f.initialValues ? f.initialValues : f.initialValues && {
|
|
12
|
+
min: f.initialValues.min ? c(f.initialValues.min).format("YYYY-MM-DD") : void 0,
|
|
13
|
+
max: f.initialValues.max ? c(f.initialValues.max).format("YYYY-MM-DD") : void 0
|
|
13
14
|
} || {
|
|
14
15
|
min: void 0,
|
|
15
16
|
max: void 0
|
|
16
|
-
}),
|
|
17
|
-
if (e
|
|
17
|
+
}), _ = ({ min: e, max: t }, n = "number") => {
|
|
18
|
+
if (s(e) || s(t)) return m(!1), !0;
|
|
18
19
|
if (n === "number") {
|
|
19
|
-
if (Number(e) > Number(t)) return
|
|
20
|
-
} else if (Date.parse(e) > Date.parse(t)) return
|
|
21
|
-
return
|
|
22
|
-
},
|
|
23
|
-
|
|
20
|
+
if (Number(e) > Number(t)) return m(!0), !1;
|
|
21
|
+
} else if (Date.parse(e) > Date.parse(t)) return m(!0), !1;
|
|
22
|
+
return m(!1), !0;
|
|
23
|
+
}, v = (e, t, n = "number") => {
|
|
24
|
+
_(e, n) && t({
|
|
25
|
+
min: e.min === "" ? void 0 : e.min,
|
|
26
|
+
max: e.max === "" ? void 0 : e.max
|
|
27
|
+
});
|
|
24
28
|
};
|
|
25
29
|
return /* @__PURE__ */ o(t, {
|
|
26
30
|
sx: {
|
|
@@ -37,69 +41,75 @@ function d(d) {
|
|
|
37
41
|
}
|
|
38
42
|
},
|
|
39
43
|
children: [
|
|
40
|
-
|
|
41
|
-
dateAdapter:
|
|
42
|
-
children: /* @__PURE__ */ a(
|
|
44
|
+
f.type === "date" ? /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ a(t, { children: /* @__PURE__ */ a(u, {
|
|
45
|
+
dateAdapter: l,
|
|
46
|
+
children: /* @__PURE__ */ a(d, {
|
|
43
47
|
enableAccessibleFieldDOMStructure: !1,
|
|
44
48
|
label: "From",
|
|
45
49
|
slots: { textField: r },
|
|
46
|
-
slotProps: { textField: {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
slotProps: { textField: {
|
|
51
|
+
error: !1,
|
|
52
|
+
inputProps: { "aria-label": "min" }
|
|
53
|
+
} },
|
|
54
|
+
value: h.min ? c(h.min) : null,
|
|
55
|
+
onChange: (e) => g({
|
|
56
|
+
min: e ? c(e).format("YYYY-MM-DD") : void 0,
|
|
57
|
+
max: h.max
|
|
51
58
|
})
|
|
52
59
|
})
|
|
53
|
-
}) }, "range_min"), /* @__PURE__ */ a(t, { children: /* @__PURE__ */ a(
|
|
54
|
-
dateAdapter:
|
|
55
|
-
children: /* @__PURE__ */ a(
|
|
60
|
+
}) }, "range_min"), /* @__PURE__ */ a(t, { children: /* @__PURE__ */ a(u, {
|
|
61
|
+
dateAdapter: l,
|
|
62
|
+
children: /* @__PURE__ */ a(d, {
|
|
56
63
|
enableAccessibleFieldDOMStructure: !1,
|
|
57
64
|
label: "To",
|
|
58
65
|
slots: { textField: r },
|
|
59
|
-
slotProps: { textField: {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
66
|
+
slotProps: { textField: {
|
|
67
|
+
error: !1,
|
|
68
|
+
inputProps: { "aria-label": "max" }
|
|
69
|
+
} },
|
|
70
|
+
value: h.max ? c(h.max) : null,
|
|
71
|
+
onChange: (e) => g({
|
|
72
|
+
max: e ? c(e).format("YYYY-MM-DD") : void 0,
|
|
73
|
+
min: h.min
|
|
64
74
|
})
|
|
65
75
|
})
|
|
66
76
|
}) }, "range_max")] }) : /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ a(t, { children: /* @__PURE__ */ a(r, {
|
|
67
77
|
label: "From",
|
|
68
78
|
type: "number",
|
|
69
|
-
value:
|
|
70
|
-
onChange: (e) =>
|
|
79
|
+
value: h.min ?? "",
|
|
80
|
+
onChange: (e) => g({
|
|
71
81
|
min: e.target.value,
|
|
72
|
-
max:
|
|
82
|
+
max: h.max
|
|
73
83
|
}),
|
|
74
84
|
slotProps: { htmlInput: { "aria-label": "min" } }
|
|
75
85
|
}) }, "range_min"), /* @__PURE__ */ a(t, { children: /* @__PURE__ */ a(r, {
|
|
76
86
|
label: "To",
|
|
77
87
|
type: "number",
|
|
78
|
-
value:
|
|
79
|
-
onChange: (e) =>
|
|
88
|
+
value: h.max ?? "",
|
|
89
|
+
onChange: (e) => g({
|
|
80
90
|
max: e.target.value,
|
|
81
|
-
min:
|
|
91
|
+
min: h.min
|
|
82
92
|
}),
|
|
83
93
|
slotProps: { htmlInput: { "aria-label": "max" } }
|
|
84
94
|
}) }, "range_max")] }),
|
|
85
95
|
/* @__PURE__ */ a(n, {
|
|
86
96
|
size: "small",
|
|
87
97
|
variant: "outlined",
|
|
88
|
-
onClick: () =>
|
|
98
|
+
onClick: () => v(h, f.onApplyClicked, f.type),
|
|
89
99
|
sx: {
|
|
90
100
|
alignSelf: "flex-end",
|
|
91
101
|
fontSize: 16
|
|
92
102
|
},
|
|
93
103
|
children: "Apply"
|
|
94
104
|
}),
|
|
95
|
-
|
|
105
|
+
p && /* @__PURE__ */ a("div", {
|
|
96
106
|
className: "SRC-danger-color",
|
|
97
|
-
children:
|
|
107
|
+
children: f.errorText || "Min value should be less than max value"
|
|
98
108
|
})
|
|
99
109
|
]
|
|
100
110
|
});
|
|
101
111
|
}
|
|
102
112
|
//#endregion
|
|
103
|
-
export {
|
|
113
|
+
export { f as Range };
|
|
104
114
|
|
|
105
115
|
//# sourceMappingURL=Range.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Range.js","names":[],"sources":["../../../src/components/widgets/Range.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport dayjs from 'dayjs'\nimport { DatePicker } from '@mui/x-date-pickers'\nimport { Box, Button, TextField } from '@mui/material'\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\n\ntype ControlType = 'number' | 'date'\n\nexport type RangeValues<T = string | number> = {\n min?: T\n max?: T\n}\n\nexport type RangeProps = {\n type: ControlType\n initialValues?: RangeValues\n className?: string\n errorText?: string\n onApplyClicked: (newValues: RangeValues) => void\n}\n\nexport function Range(props: RangeProps): React.ReactNode {\n const errorText = 'Min value should be less than max value'\n const [error, setError] = useState(false)\n const [values, setValues] = useState(() =>\n props.type === 'number' && props.initialValues\n ? props.initialValues\n : (props.initialValues && {\n min: dayjs(props.initialValues.min).format('YYYY-MM-DD'),\n max: dayjs(props.initialValues.max).format('YYYY-MM-DD'),\n }) || {\n min: undefined,\n max: undefined,\n },\n )\n\n const isValid = (\n { min, max }: RangeValues,\n\n type: ControlType = 'number',\n ) => {\n
|
|
1
|
+
{"version":3,"file":"Range.js","names":[],"sources":["../../../src/components/widgets/Range.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport dayjs from 'dayjs'\nimport { DatePicker } from '@mui/x-date-pickers'\nimport { Box, Button, TextField } from '@mui/material'\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\nimport isEmpty from 'lodash-es/isEmpty'\n\ntype ControlType = 'number' | 'date'\n\nexport type RangeValues<T = string | number> = {\n min?: T\n max?: T\n}\n\nexport type RangeProps = {\n type: ControlType\n initialValues?: RangeValues\n className?: string\n errorText?: string\n onApplyClicked: (newValues: RangeValues) => void\n}\n\nexport function Range(props: RangeProps): React.ReactNode {\n const errorText = 'Min value should be less than max value'\n const [error, setError] = useState(false)\n const [values, setValues] = useState(() =>\n props.type === 'number' && props.initialValues\n ? props.initialValues\n : (props.initialValues && {\n min: props.initialValues.min\n ? dayjs(props.initialValues.min).format('YYYY-MM-DD')\n : undefined,\n max: props.initialValues.max\n ? dayjs(props.initialValues.max).format('YYYY-MM-DD')\n : undefined,\n }) || {\n min: undefined,\n max: undefined,\n },\n )\n\n const isValid = (\n { min, max }: RangeValues,\n\n type: ControlType = 'number',\n ) => {\n // Treat null, undefined, and empty string as \"no value\" — one-sided ranges are always valid\n if (isEmpty(min) || isEmpty(max)) {\n setError(false)\n return true\n }\n\n if (type === 'number') {\n if (Number(min) > Number(max)) {\n setError(true)\n return false\n }\n } else if (Date.parse(min as string) > Date.parse(max as string)) {\n setError(true)\n return false\n }\n setError(false)\n return true\n }\n\n const handleAppyChanges = (\n values: RangeValues,\n callBackFn: (newValues: RangeValues) => void,\n type: ControlType = 'number',\n ) => {\n if (isValid(values, type)) {\n // Normalize empty strings to undefined so downstream code receives clean absent values\n callBackFn({\n min: values.min === '' ? undefined : values.min,\n max: values.max === '' ? undefined : values.max,\n })\n }\n }\n\n return (\n <Box\n sx={{\n display: 'flex',\n flexWrap: 'wrap',\n flex: '1 0',\n marginRight: '10px',\n gap: '10px',\n '& .MuiInputBase-root': {\n minWidth: '150px',\n },\n '& .MuiInputBase-root,.MuiButton-root': {\n height: '38px',\n },\n '& .MuiInputLabel-root': {\n color: 'grey.700',\n fontWeight: 400,\n },\n }}\n >\n {props.type === 'date' ? (\n <>\n <Box key=\"range_min\">\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <DatePicker\n enableAccessibleFieldDOMStructure={false}\n label=\"From\"\n slots={{\n textField: TextField,\n }}\n slotProps={{\n textField: {\n error: false,\n inputProps: {\n 'aria-label': 'min',\n },\n },\n }}\n value={values.min ? dayjs(values.min) : null}\n onChange={date =>\n setValues({\n min: date ? dayjs(date).format('YYYY-MM-DD') : undefined,\n max: values.max,\n })\n }\n />\n </LocalizationProvider>\n </Box>\n <Box key=\"range_max\">\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <DatePicker\n enableAccessibleFieldDOMStructure={false}\n label=\"To\"\n slots={{\n textField: TextField,\n }}\n slotProps={{\n textField: {\n error: false,\n inputProps: {\n 'aria-label': 'max',\n },\n },\n }}\n value={values.max ? dayjs(values.max) : null}\n onChange={date =>\n setValues({\n max: date ? dayjs(date).format('YYYY-MM-DD') : undefined,\n min: values.min,\n })\n }\n />\n </LocalizationProvider>\n </Box>\n </>\n ) : (\n <>\n <Box key=\"range_min\">\n <TextField\n label=\"From\"\n type=\"number\"\n value={values.min ?? ''}\n onChange={e =>\n setValues({\n min: e.target.value,\n max: values.max,\n })\n }\n slotProps={{\n htmlInput: { 'aria-label': 'min' },\n }}\n />\n </Box>\n <Box key=\"range_max\">\n <TextField\n label=\"To\"\n type=\"number\"\n value={values.max ?? ''}\n onChange={e =>\n setValues({\n max: e.target.value,\n min: values.min,\n })\n }\n slotProps={{\n htmlInput: { 'aria-label': 'max' },\n }}\n />\n </Box>\n </>\n )}\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={() =>\n handleAppyChanges(values, props.onApplyClicked, props.type)\n }\n sx={{\n alignSelf: 'flex-end',\n fontSize: 16,\n }}\n >\n Apply\n </Button>\n {error && (\n <div className=\"SRC-danger-color\">{props.errorText || errorText}</div>\n )}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;;AAuBA,SAAgB,EAAM,GAAoC;CACxD,IACM,CAAC,GAAO,KAAY,EAAS,GAAM,EACnC,CAAC,GAAQ,KAAa,QAC1B,EAAM,SAAS,YAAY,EAAM,gBAC7B,EAAM,gBACL,EAAM,iBAAiB;EACtB,KAAK,EAAM,cAAc,MACrB,EAAM,EAAM,cAAc,IAAI,CAAC,OAAO,aAAa,GACnD,KAAA;EACJ,KAAK,EAAM,cAAc,MACrB,EAAM,EAAM,cAAc,IAAI,CAAC,OAAO,aAAa,GACnD,KAAA;EACL,IAAK;EACJ,KAAK,KAAA;EACL,KAAK,KAAA;EACN,CACN,EAEK,KACJ,EAAE,QAAK,UAEP,IAAoB,aACjB;AAEH,MAAI,EAAQ,EAAI,IAAI,EAAQ,EAAI,CAE9B,QADA,EAAS,GAAM,EACR;AAGT,MAAI,MAAS;OACP,OAAO,EAAI,GAAG,OAAO,EAAI,CAE3B,QADA,EAAS,GAAK,EACP;aAEA,KAAK,MAAM,EAAc,GAAG,KAAK,MAAM,EAAc,CAE9D,QADA,EAAS,GAAK,EACP;AAGT,SADA,EAAS,GAAM,EACR;IAGH,KACJ,GACA,GACA,IAAoB,aACjB;AACH,EAAI,EAAQ,GAAQ,EAAK,IAEvB,EAAW;GACT,KAAK,EAAO,QAAQ,KAAK,KAAA,IAAY,EAAO;GAC5C,KAAK,EAAO,QAAQ,KAAK,KAAA,IAAY,EAAO;GAC7C,CAAC;;AAIN,QACE,kBAAC,GAAD;EACE,IAAI;GACF,SAAS;GACT,UAAU;GACV,MAAM;GACN,aAAa;GACb,KAAK;GACL,wBAAwB,EACtB,UAAU,SACX;GACD,wCAAwC,EACtC,QAAQ,QACT;GACD,yBAAyB;IACvB,OAAO;IACP,YAAY;IACb;GACF;YAjBH;GAmBG,EAAM,SAAS,SACd,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAsB,aAAa;cACjC,kBAAC,GAAD;KACE,mCAAmC;KACnC,OAAM;KACN,OAAO,EACL,WAAW,GACZ;KACD,WAAW,EACT,WAAW;MACT,OAAO;MACP,YAAY,EACV,cAAc,OACf;MACF,EACF;KACD,OAAO,EAAO,MAAM,EAAM,EAAO,IAAI,GAAG;KACxC,WAAU,MACR,EAAU;MACR,KAAK,IAAO,EAAM,EAAK,CAAC,OAAO,aAAa,GAAG,KAAA;MAC/C,KAAK,EAAO;MACb,CAAC;KAEJ,CAAA;IACmB,CAAA,EACnB,EAzBG,YAyBH,EACN,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAsB,aAAa;cACjC,kBAAC,GAAD;KACE,mCAAmC;KACnC,OAAM;KACN,OAAO,EACL,WAAW,GACZ;KACD,WAAW,EACT,WAAW;MACT,OAAO;MACP,YAAY,EACV,cAAc,OACf;MACF,EACF;KACD,OAAO,EAAO,MAAM,EAAM,EAAO,IAAI,GAAG;KACxC,WAAU,MACR,EAAU;MACR,KAAK,IAAO,EAAM,EAAK,CAAC,OAAO,aAAa,GAAG,KAAA;MAC/C,KAAK,EAAO;MACb,CAAC;KAEJ,CAAA;IACmB,CAAA,EACnB,EAzBG,YAyBH,CACL,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IACE,OAAM;IACN,MAAK;IACL,OAAO,EAAO,OAAO;IACrB,WAAU,MACR,EAAU;KACR,KAAK,EAAE,OAAO;KACd,KAAK,EAAO;KACb,CAAC;IAEJ,WAAW,EACT,WAAW,EAAE,cAAc,OAAO,EACnC;IACD,CAAA,EACE,EAfG,YAeH,EACN,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IACE,OAAM;IACN,MAAK;IACL,OAAO,EAAO,OAAO;IACrB,WAAU,MACR,EAAU;KACR,KAAK,EAAE,OAAO;KACd,KAAK,EAAO;KACb,CAAC;IAEJ,WAAW,EACT,WAAW,EAAE,cAAc,OAAO,EACnC;IACD,CAAA,EACE,EAfG,YAeH,CACL,EAAA,CAAA;GAEL,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,eACE,EAAkB,GAAQ,EAAM,gBAAgB,EAAM,KAAK;IAE7D,IAAI;KACF,WAAW;KACX,UAAU;KACX;cACF;IAEQ,CAAA;GACR,KACC,kBAAC,OAAD;IAAK,WAAU;cAAoB,EAAM,aAAa;IAAgB,CAAA;GAEpE"}
|
|
@@ -2,7 +2,9 @@ export type SelectionCriteriaPillProps = {
|
|
|
2
2
|
readonly key: string;
|
|
3
3
|
readonly innerText: string;
|
|
4
4
|
readonly tooltipText: string;
|
|
5
|
-
readonly onRemoveFilter
|
|
5
|
+
readonly onRemoveFilter?: () => void;
|
|
6
|
+
/** When true, the pill is shown without a remove button */
|
|
7
|
+
readonly isLocked?: boolean;
|
|
6
8
|
};
|
|
7
9
|
/**
|
|
8
10
|
* Renders a pill or chicklet to represent a Synapse Table Query filter/selection criterion.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionCriteriaPill.d.ts","sourceRoot":"","sources":["../../../../src/components/widgets/facet-nav/SelectionCriteriaPill.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"SelectionCriteriaPill.d.ts","sourceRoot":"","sources":["../../../../src/components/widgets/facet-nav/SelectionCriteriaPill.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IACpC,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC5B,CAAA;AAED;;;;GAIG;AACH,iBAAS,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,2CAuB/D;AAED,eAAe,qBAAqB,CAAA"}
|
|
@@ -3,13 +3,13 @@ import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
|
3
3
|
import { Close as r } from "@mui/icons-material";
|
|
4
4
|
//#region src/components/widgets/facet-nav/SelectionCriteriaPill.tsx
|
|
5
5
|
function i(i) {
|
|
6
|
-
let { innerText: a, tooltipText: o, onRemoveFilter: s } = i;
|
|
6
|
+
let { innerText: a, tooltipText: o, onRemoveFilter: s, isLocked: c } = i;
|
|
7
7
|
return /* @__PURE__ */ t(e, {
|
|
8
8
|
title: o,
|
|
9
9
|
placement: "top",
|
|
10
10
|
children: /* @__PURE__ */ n("div", {
|
|
11
|
-
className: "SelectionCriteriaPill"
|
|
12
|
-
children: [/* @__PURE__ */ t("span", { children: a }), /* @__PURE__ */ t("button", {
|
|
11
|
+
className: `SelectionCriteriaPill${c ? " SelectionCriteriaPill--locked" : ""}`,
|
|
12
|
+
children: [/* @__PURE__ */ t("span", { children: a }), !c && s && /* @__PURE__ */ t("button", {
|
|
13
13
|
onClick: s,
|
|
14
14
|
className: "SelectionCriteriaPill__btnRemove",
|
|
15
15
|
title: "deselect",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionCriteriaPill.js","names":[],"sources":["../../../../src/components/widgets/facet-nav/SelectionCriteriaPill.tsx"],"sourcesContent":["import { Close } from '@mui/icons-material'\nimport { Tooltip } from '@mui/material'\n\nexport type SelectionCriteriaPillProps = {\n readonly key: string\n readonly innerText: string\n readonly tooltipText: string\n readonly onRemoveFilter
|
|
1
|
+
{"version":3,"file":"SelectionCriteriaPill.js","names":[],"sources":["../../../../src/components/widgets/facet-nav/SelectionCriteriaPill.tsx"],"sourcesContent":["import { Close } from '@mui/icons-material'\nimport { Tooltip } from '@mui/material'\n\nexport type SelectionCriteriaPillProps = {\n readonly key: string\n readonly innerText: string\n readonly tooltipText: string\n readonly onRemoveFilter?: () => void\n /** When true, the pill is shown without a remove button */\n readonly isLocked?: boolean\n}\n\n/**\n * Renders a pill or chicklet to represent a Synapse Table Query filter/selection criterion.\n * @param props\n * @constructor\n */\nfunction SelectionCriteriaPill(props: SelectionCriteriaPillProps) {\n const { innerText, tooltipText, onRemoveFilter, isLocked } = props\n\n return (\n <Tooltip title={tooltipText} placement={'top'}>\n <div\n className={`SelectionCriteriaPill${\n isLocked ? ' SelectionCriteriaPill--locked' : ''\n }`}\n >\n <span>{innerText}</span>\n {!isLocked && onRemoveFilter && (\n <button\n onClick={onRemoveFilter}\n className=\"SelectionCriteriaPill__btnRemove\"\n title=\"deselect\"\n >\n <Close />\n </button>\n )}\n </div>\n </Tooltip>\n )\n}\n\nexport default SelectionCriteriaPill\n"],"mappings":";;;;AAiBA,SAAS,EAAsB,GAAmC;CAChE,IAAM,EAAE,cAAW,gBAAa,mBAAgB,gBAAa;AAE7D,QACE,kBAAC,GAAD;EAAS,OAAO;EAAa,WAAW;YACtC,kBAAC,OAAD;GACE,WAAW,wBACT,IAAW,mCAAmC;aAFlD,CAKE,kBAAC,QAAD,EAAA,UAAO,GAAiB,CAAA,EACvB,CAAC,KAAY,KACZ,kBAAC,UAAD;IACE,SAAS;IACT,WAAU;IACV,OAAM;cAEN,kBAAC,GAAD,EAAS,CAAA;IACF,CAAA,CAEP;;EACE,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { TextMatchesQueryFilter } from '@sage-bionetworks/synapse-types';
|
|
2
2
|
import { QueryContextType } from '../../QueryContext';
|
|
3
3
|
import { SelectionCriteriaPillProps } from './SelectionCriteriaPill';
|
|
4
|
-
export declare function getPillPropsFromTextMatchesQueryFilter(queryFilter: TextMatchesQueryFilter, queryContext: QueryContextType): SelectionCriteriaPillProps;
|
|
4
|
+
export declare function getPillPropsFromTextMatchesQueryFilter(queryFilter: TextMatchesQueryFilter, queryContext: QueryContextType, isLocked?: boolean): SelectionCriteriaPillProps;
|
|
5
5
|
declare function SelectionCriteriaPills(): import("react/jsx-runtime").JSX.Element;
|
|
6
6
|
export default SelectionCriteriaPills;
|
|
7
7
|
//# sourceMappingURL=SelectionCriteriaPills.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionCriteriaPills.d.ts","sourceRoot":"","sources":["../../../../src/components/widgets/facet-nav/SelectionCriteriaPills.tsx"],"names":[],"mappings":"AASA,OAAO,EAOL,sBAAsB,EACvB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EAAE,gBAAgB,EAAmB,MAAM,oBAAoB,CAAA;AAMtE,OAA8B,EAC5B,0BAA0B,EAC3B,MAAM,yBAAyB,CAAA;AA8DhC,wBAAgB,sCAAsC,CACpD,WAAW,EAAE,sBAAsB,EACnC,YAAY,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"SelectionCriteriaPills.d.ts","sourceRoot":"","sources":["../../../../src/components/widgets/facet-nav/SelectionCriteriaPills.tsx"],"names":[],"mappings":"AASA,OAAO,EAOL,sBAAsB,EACvB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EAAE,gBAAgB,EAAmB,MAAM,oBAAoB,CAAA;AAMtE,OAA8B,EAC5B,0BAA0B,EAC3B,MAAM,yBAAyB,CAAA;AA8DhC,wBAAgB,sCAAsC,CACpD,WAAW,EAAE,sBAAsB,EACnC,YAAY,EAAE,gBAAgB,EAC9B,QAAQ,CAAC,EAAE,OAAO,GACjB,0BAA0B,CAoB5B;AAmLD,iBAAS,sBAAsB,4CAoC9B;AAED,eAAe,sBAAsB,CAAA"}
|
|
@@ -40,23 +40,23 @@ function g(e, t, n, r) {
|
|
|
40
40
|
};
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
|
-
function _(e, t) {
|
|
44
|
-
let
|
|
45
|
-
return e.searchMode == "BOOLEAN" && (
|
|
43
|
+
function _(e, t, n) {
|
|
44
|
+
let r = e.searchExpression;
|
|
45
|
+
return e.searchMode == "BOOLEAN" && (r = u(e.searchExpression)), {
|
|
46
46
|
key: `queryFilter-${e.concreteType}-${e.searchExpression}`,
|
|
47
|
-
innerText:
|
|
48
|
-
tooltipText: `Text matches: "${
|
|
49
|
-
onRemoveFilter: () => {
|
|
47
|
+
innerText: r,
|
|
48
|
+
tooltipText: `Text matches: "${r}"`,
|
|
49
|
+
...n ? { isLocked: !0 } : { onRemoveFilter: () => {
|
|
50
50
|
t.removeQueryFilter(e);
|
|
51
|
-
}
|
|
51
|
+
} }
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
-
function v(e, r, i, o, s) {
|
|
54
|
+
function v(e, r, i, o, s, c) {
|
|
55
55
|
return e.flatMap((e) => {
|
|
56
56
|
if (n(e) || t(e)) {
|
|
57
57
|
let t = i.find((t) => t.name === e.columnName);
|
|
58
58
|
return e.columnName.toLowerCase() === s?.columnName?.toLowerCase() ? [] : g(e, r, t, o);
|
|
59
|
-
} else if (a(e)) return [_(e, r)];
|
|
59
|
+
} else if (a(e)) return [_(e, r, c)];
|
|
60
60
|
else return console.log("Unknown query filter type", e), [];
|
|
61
61
|
});
|
|
62
62
|
}
|
|
@@ -119,8 +119,8 @@ function b(e, t, n, a, o) {
|
|
|
119
119
|
});
|
|
120
120
|
}
|
|
121
121
|
function x() {
|
|
122
|
-
let e = o(), t = e.lockedColumn, n = c(), {
|
|
123
|
-
return /* @__PURE__ */ p(f, { children: [...
|
|
122
|
+
let e = o(), t = e.lockedColumn, n = c(), { lockTextMatchesQueryFilterPill: r } = n, { currentQueryRequest: i } = e, { data: a } = s(), u = v(i.query?.additionalFilters ?? [], e, a?.columnModels || [], n, t, r), m = b(i.query.selectedFacets ?? [], e, a?.columnModels || [], n, t);
|
|
123
|
+
return /* @__PURE__ */ p(f, { children: [...u, ...m].map((e) => {
|
|
124
124
|
let t = encodeURIComponent(e.key);
|
|
125
125
|
return /* @__PURE__ */ d(l, {
|
|
126
126
|
...e,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionCriteriaPills.js","names":[],"sources":["../../../../src/components/widgets/facet-nav/SelectionCriteriaPills.tsx"],"sourcesContent":["import {\n isColumnMultiValueFunctionQueryFilter,\n isColumnSingleValueQueryFilter,\n isFacetColumnRangeRequest,\n isFacetColumnValuesRequest,\n isTextMatchesQueryFilter,\n LockedColumn,\n} from '@/utils'\nimport { FRIENDLY_VALUE_NOT_SET, VALUE_NOT_SET } from '@/utils/SynapseConstants'\nimport {\n ColumnModel,\n ColumnMultiValueFunctionQueryFilter,\n ColumnSingleValueQueryFilter,\n FacetColumnRangeRequest,\n FacetColumnRequest,\n QueryFilter,\n TextMatchesQueryFilter,\n} from '@sage-bionetworks/synapse-types'\nimport pluralize from 'pluralize'\nimport { ReadonlyDeep } from 'type-fest'\nimport { QueryContextType, useQueryContext } from '../../QueryContext'\nimport {\n QueryVisualizationContextType,\n useQueryVisualizationContext,\n} from '../../QueryVisualizationWrapper'\nimport { useGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport SelectionCriteriaPill, {\n SelectionCriteriaPillProps,\n} from './SelectionCriteriaPill'\nimport { getSearchTextFromBooleanModeSearchExpression } from '@/components/FullTextSearch/FullTextSearchUtils'\n\nconst MAX_VALUES_IN_FILTER_FOR_INDIVIDUAL_PILLS = 4\n\nfunction getPillPropsFromColumnQueryFilter(\n queryFilter:\n | ColumnSingleValueQueryFilter\n | ColumnMultiValueFunctionQueryFilter,\n queryContext: QueryContextType,\n columnModel: ColumnModel | undefined,\n queryVisualizationContext: QueryVisualizationContextType,\n): SelectionCriteriaPillProps[] {\n const { getColumnDisplayName } = queryVisualizationContext\n // ColumnSingleValueQueryFilter and ColumnMultiValueQueryFilter both allow for a list of values\n // If there are more than _n_ values, consolidate to one pill\n if (\n queryFilter.values.length > MAX_VALUES_IN_FILTER_FOR_INDIVIDUAL_PILLS ||\n !columnModel\n ) {\n const text = `${pluralize(\n getColumnDisplayName(queryFilter.columnName),\n )} (${queryFilter.values.length.toLocaleString()})`\n\n return [\n {\n key: `queryFilter-${queryFilter.concreteType}-${queryFilter.columnName}`,\n innerText: text,\n tooltipText: text,\n onRemoveFilter: () => {\n queryContext.removeQueryFilter(queryFilter)\n },\n },\n ]\n }\n\n // otherwise render one pill per value\n return queryFilter.values.map(value => {\n let filterValue = value\n\n if (value?.startsWith('%') && value?.endsWith('%')) {\n // strip '%' wildcard character when using a LIKE condition\n filterValue = filterValue.substring(1, filterValue.length - 1)\n }\n filterValue = queryVisualizationContext.getDisplayValue(\n filterValue,\n columnModel.columnType,\n )\n const text = `${getColumnDisplayName(\n queryFilter.columnName,\n )}: ${filterValue}`\n return {\n key: `queryFilter-${queryFilter.concreteType}-${queryFilter.columnName}-${value}`,\n innerText: text,\n tooltipText: text,\n onRemoveFilter: () => {\n queryContext.removeValueFromQueryFilter(queryFilter, value)\n },\n }\n })\n}\n\nexport function getPillPropsFromTextMatchesQueryFilter(\n queryFilter: TextMatchesQueryFilter,\n queryContext: QueryContextType,\n): SelectionCriteriaPillProps {\n let innerText = queryFilter.searchExpression\n if (queryFilter.searchMode == 'BOOLEAN') {\n innerText = getSearchTextFromBooleanModeSearchExpression(\n queryFilter.searchExpression,\n )\n }\n\n return {\n key: `queryFilter-${queryFilter.concreteType}-${queryFilter.searchExpression}`,\n innerText,\n tooltipText: `Text matches: \"${innerText}\"`,\n onRemoveFilter: () => {\n queryContext.removeQueryFilter(queryFilter)\n },\n }\n}\n\nfunction getPillPropsFromQueryFilters(\n queryFilters: ReadonlyDeep<QueryFilter[]>,\n queryContext: QueryContextType,\n columnModels: ColumnModel[],\n queryVisualizationContext: QueryVisualizationContextType,\n lockedColumn?: LockedColumn,\n): SelectionCriteriaPillProps[] {\n return queryFilters.flatMap(queryFilter => {\n if (\n isColumnSingleValueQueryFilter(queryFilter) ||\n isColumnMultiValueFunctionQueryFilter(queryFilter)\n ) {\n const columnModel = columnModels.find(\n cm => cm.name === queryFilter.columnName,\n )\n if (\n queryFilter.columnName.toLowerCase() ===\n lockedColumn?.columnName?.toLowerCase()\n ) {\n return []\n }\n return getPillPropsFromColumnQueryFilter(\n queryFilter,\n queryContext,\n columnModel,\n queryVisualizationContext,\n )\n } else if (isTextMatchesQueryFilter(queryFilter)) {\n return [getPillPropsFromTextMatchesQueryFilter(queryFilter, queryContext)]\n } else {\n console.log('Unknown query filter type', queryFilter)\n return []\n }\n })\n}\n\nfunction getRangeFacetInnerText(min?: string, max?: string) {\n if (min == undefined && max == undefined) {\n return 'Any value'\n } else if (min == undefined) {\n return `Up to ${max}`\n } else if (max == undefined) {\n return `${min} or greater`\n } else if (min === VALUE_NOT_SET && max === VALUE_NOT_SET) {\n return FRIENDLY_VALUE_NOT_SET\n } else {\n return `${min} - ${max}`\n }\n}\n\nfunction getPillPropsFromFacetFilters(\n selectedFacets: ReadonlyDeep<FacetColumnRequest[]>,\n queryContext: QueryContextType,\n columnModels: ColumnModel[],\n queryVisualizationContext: QueryVisualizationContextType,\n lockedColumn?: LockedColumn,\n): SelectionCriteriaPillProps[] {\n return selectedFacets.flatMap(selectedFacet => {\n if (\n selectedFacet.columnName.toLowerCase() ===\n lockedColumn?.columnName?.toLowerCase()\n ) {\n return []\n }\n const columnModel = columnModels.find(\n cm => cm.name === selectedFacet.columnName,\n )\n const { getColumnDisplayName, getDisplayValue } = queryVisualizationContext\n if (isFacetColumnValuesRequest(selectedFacet)) {\n // If there are more than _n_ values, consolidate to one pill\n if (\n selectedFacet.facetValues.length >\n MAX_VALUES_IN_FILTER_FOR_INDIVIDUAL_PILLS ||\n !columnModel\n ) {\n const text = `${pluralize(\n getColumnDisplayName(\n selectedFacet.columnName,\n selectedFacet.jsonPath,\n ),\n )} (${selectedFacet.facetValues.length.toLocaleString()})`\n return [\n {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}`,\n innerText: text,\n tooltipText: text,\n onRemoveFilter: () => {\n queryContext.removeSelectedFacet(selectedFacet)\n },\n },\n ]\n }\n\n // otherwise render one pill per value\n\n return selectedFacet.facetValues.map(facetValue => {\n const innerText = getDisplayValue(facetValue, columnModel.columnType)\n return {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}-${facetValue}`,\n innerText: innerText,\n tooltipText: `${getColumnDisplayName(\n selectedFacet.columnName,\n selectedFacet.jsonPath,\n )}: ${innerText}`,\n onRemoveFilter: () => {\n queryContext.removeValueFromSelectedFacet(selectedFacet, facetValue)\n },\n }\n })\n } else if (isFacetColumnRangeRequest(selectedFacet)) {\n // Include a single pill for both facet filters if a combined range facet filter config is defined\n const { combineRangeFacetConfig } = queryContext\n if (\n combineRangeFacetConfig &&\n (selectedFacet.columnName == combineRangeFacetConfig.minFacetColumn ||\n selectedFacet.columnName == combineRangeFacetConfig.maxFacetColumn)\n ) {\n if (\n selectedFacet.columnName == combineRangeFacetConfig.minFacetColumn\n ) {\n return []\n } else {\n // find the min facet also\n const maxFacet = selectedFacet\n const minFacet = selectedFacets.find(\n v => v.columnName == combineRangeFacetConfig.minFacetColumn,\n ) as FacetColumnRangeRequest\n const innerText = getRangeFacetInnerText(maxFacet.min, minFacet.max)\n return [\n {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}-${innerText}`,\n innerText: innerText,\n tooltipText: `${combineRangeFacetConfig.label}: ${innerText}`,\n onRemoveFilter: () => {\n // Remove both facets on pill click\n queryContext.removeSelectedFacet([minFacet, maxFacet])\n },\n },\n ]\n }\n }\n\n const innerText = getRangeFacetInnerText(\n selectedFacet.min,\n selectedFacet.max,\n )\n\n return [\n {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}-${selectedFacet.min}-${selectedFacet.max}`,\n innerText: innerText,\n tooltipText: `${getColumnDisplayName(\n selectedFacet.columnName,\n selectedFacet.jsonPath,\n )}: ${innerText}`,\n onRemoveFilter: () => {\n queryContext.removeSelectedFacet(selectedFacet)\n },\n },\n ]\n } else {\n console.log(\n 'Unknown facet type',\n (selectedFacet as unknown as FacetColumnRequest).concreteType,\n )\n return []\n }\n })\n}\n\nfunction SelectionCriteriaPills() {\n const queryContext = useQueryContext()\n const lockedColumn = queryContext.lockedColumn\n const queryVisualizationContext = useQueryVisualizationContext()\n const { currentQueryRequest } = queryContext\n const { data: queryMetadata } = useGetQueryMetadata()\n\n const queryFilterPillProps = getPillPropsFromQueryFilters(\n currentQueryRequest.query?.additionalFilters ?? [],\n queryContext,\n queryMetadata?.columnModels || [],\n queryVisualizationContext,\n lockedColumn,\n )\n\n const facetPillProps = getPillPropsFromFacetFilters(\n currentQueryRequest.query.selectedFacets ?? [],\n queryContext,\n queryMetadata?.columnModels || [],\n queryVisualizationContext,\n lockedColumn,\n )\n\n const allPills = [...queryFilterPillProps, ...facetPillProps]\n\n return (\n <>\n {allPills.map(pillProps => {\n // Encode the key because the facet may include an illegal character\n const key = encodeURIComponent(pillProps.key)\n return <SelectionCriteriaPill {...pillProps} key={key} />\n })}\n </>\n )\n}\n\nexport default SelectionCriteriaPills\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectionCriteriaPills.js","names":[],"sources":["../../../../src/components/widgets/facet-nav/SelectionCriteriaPills.tsx"],"sourcesContent":["import {\n isColumnMultiValueFunctionQueryFilter,\n isColumnSingleValueQueryFilter,\n isFacetColumnRangeRequest,\n isFacetColumnValuesRequest,\n isTextMatchesQueryFilter,\n LockedColumn,\n} from '@/utils'\nimport { FRIENDLY_VALUE_NOT_SET, VALUE_NOT_SET } from '@/utils/SynapseConstants'\nimport {\n ColumnModel,\n ColumnMultiValueFunctionQueryFilter,\n ColumnSingleValueQueryFilter,\n FacetColumnRangeRequest,\n FacetColumnRequest,\n QueryFilter,\n TextMatchesQueryFilter,\n} from '@sage-bionetworks/synapse-types'\nimport pluralize from 'pluralize'\nimport { ReadonlyDeep } from 'type-fest'\nimport { QueryContextType, useQueryContext } from '../../QueryContext'\nimport {\n QueryVisualizationContextType,\n useQueryVisualizationContext,\n} from '../../QueryVisualizationWrapper'\nimport { useGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport SelectionCriteriaPill, {\n SelectionCriteriaPillProps,\n} from './SelectionCriteriaPill'\nimport { getSearchTextFromBooleanModeSearchExpression } from '@/components/FullTextSearch/FullTextSearchUtils'\n\nconst MAX_VALUES_IN_FILTER_FOR_INDIVIDUAL_PILLS = 4\n\nfunction getPillPropsFromColumnQueryFilter(\n queryFilter:\n | ColumnSingleValueQueryFilter\n | ColumnMultiValueFunctionQueryFilter,\n queryContext: QueryContextType,\n columnModel: ColumnModel | undefined,\n queryVisualizationContext: QueryVisualizationContextType,\n): SelectionCriteriaPillProps[] {\n const { getColumnDisplayName } = queryVisualizationContext\n // ColumnSingleValueQueryFilter and ColumnMultiValueQueryFilter both allow for a list of values\n // If there are more than _n_ values, consolidate to one pill\n if (\n queryFilter.values.length > MAX_VALUES_IN_FILTER_FOR_INDIVIDUAL_PILLS ||\n !columnModel\n ) {\n const text = `${pluralize(\n getColumnDisplayName(queryFilter.columnName),\n )} (${queryFilter.values.length.toLocaleString()})`\n\n return [\n {\n key: `queryFilter-${queryFilter.concreteType}-${queryFilter.columnName}`,\n innerText: text,\n tooltipText: text,\n onRemoveFilter: () => {\n queryContext.removeQueryFilter(queryFilter)\n },\n },\n ]\n }\n\n // otherwise render one pill per value\n return queryFilter.values.map(value => {\n let filterValue = value\n\n if (value?.startsWith('%') && value?.endsWith('%')) {\n // strip '%' wildcard character when using a LIKE condition\n filterValue = filterValue.substring(1, filterValue.length - 1)\n }\n filterValue = queryVisualizationContext.getDisplayValue(\n filterValue,\n columnModel.columnType,\n )\n const text = `${getColumnDisplayName(\n queryFilter.columnName,\n )}: ${filterValue}`\n return {\n key: `queryFilter-${queryFilter.concreteType}-${queryFilter.columnName}-${value}`,\n innerText: text,\n tooltipText: text,\n onRemoveFilter: () => {\n queryContext.removeValueFromQueryFilter(queryFilter, value)\n },\n }\n })\n}\n\nexport function getPillPropsFromTextMatchesQueryFilter(\n queryFilter: TextMatchesQueryFilter,\n queryContext: QueryContextType,\n isLocked?: boolean,\n): SelectionCriteriaPillProps {\n let innerText = queryFilter.searchExpression\n if (queryFilter.searchMode == 'BOOLEAN') {\n innerText = getSearchTextFromBooleanModeSearchExpression(\n queryFilter.searchExpression,\n )\n }\n\n return {\n key: `queryFilter-${queryFilter.concreteType}-${queryFilter.searchExpression}`,\n innerText,\n tooltipText: `Text matches: \"${innerText}\"`,\n ...(isLocked\n ? { isLocked: true }\n : {\n onRemoveFilter: () => {\n queryContext.removeQueryFilter(queryFilter)\n },\n }),\n }\n}\n\nfunction getPillPropsFromQueryFilters(\n queryFilters: ReadonlyDeep<QueryFilter[]>,\n queryContext: QueryContextType,\n columnModels: ColumnModel[],\n queryVisualizationContext: QueryVisualizationContextType,\n lockedColumn?: LockedColumn,\n lockTextMatchesQueryFilterPill?: boolean,\n): SelectionCriteriaPillProps[] {\n return queryFilters.flatMap(queryFilter => {\n if (\n isColumnSingleValueQueryFilter(queryFilter) ||\n isColumnMultiValueFunctionQueryFilter(queryFilter)\n ) {\n const columnModel = columnModels.find(\n cm => cm.name === queryFilter.columnName,\n )\n if (\n queryFilter.columnName.toLowerCase() ===\n lockedColumn?.columnName?.toLowerCase()\n ) {\n return []\n }\n return getPillPropsFromColumnQueryFilter(\n queryFilter,\n queryContext,\n columnModel,\n queryVisualizationContext,\n )\n } else if (isTextMatchesQueryFilter(queryFilter)) {\n return [\n getPillPropsFromTextMatchesQueryFilter(\n queryFilter,\n queryContext,\n lockTextMatchesQueryFilterPill,\n ),\n ]\n } else {\n console.log('Unknown query filter type', queryFilter)\n return []\n }\n })\n}\n\nfunction getRangeFacetInnerText(min?: string, max?: string) {\n if (min == undefined && max == undefined) {\n return 'Any value'\n } else if (min == undefined) {\n return `Up to ${max}`\n } else if (max == undefined) {\n return `${min} or greater`\n } else if (min === VALUE_NOT_SET && max === VALUE_NOT_SET) {\n return FRIENDLY_VALUE_NOT_SET\n } else {\n return `${min} - ${max}`\n }\n}\n\nfunction getPillPropsFromFacetFilters(\n selectedFacets: ReadonlyDeep<FacetColumnRequest[]>,\n queryContext: QueryContextType,\n columnModels: ColumnModel[],\n queryVisualizationContext: QueryVisualizationContextType,\n lockedColumn?: LockedColumn,\n): SelectionCriteriaPillProps[] {\n return selectedFacets.flatMap(selectedFacet => {\n if (\n selectedFacet.columnName.toLowerCase() ===\n lockedColumn?.columnName?.toLowerCase()\n ) {\n return []\n }\n const columnModel = columnModels.find(\n cm => cm.name === selectedFacet.columnName,\n )\n const { getColumnDisplayName, getDisplayValue } = queryVisualizationContext\n if (isFacetColumnValuesRequest(selectedFacet)) {\n // If there are more than _n_ values, consolidate to one pill\n if (\n selectedFacet.facetValues.length >\n MAX_VALUES_IN_FILTER_FOR_INDIVIDUAL_PILLS ||\n !columnModel\n ) {\n const text = `${pluralize(\n getColumnDisplayName(\n selectedFacet.columnName,\n selectedFacet.jsonPath,\n ),\n )} (${selectedFacet.facetValues.length.toLocaleString()})`\n return [\n {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}`,\n innerText: text,\n tooltipText: text,\n onRemoveFilter: () => {\n queryContext.removeSelectedFacet(selectedFacet)\n },\n },\n ]\n }\n\n // otherwise render one pill per value\n\n return selectedFacet.facetValues.map(facetValue => {\n const innerText = getDisplayValue(facetValue, columnModel.columnType)\n return {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}-${facetValue}`,\n innerText: innerText,\n tooltipText: `${getColumnDisplayName(\n selectedFacet.columnName,\n selectedFacet.jsonPath,\n )}: ${innerText}`,\n onRemoveFilter: () => {\n queryContext.removeValueFromSelectedFacet(selectedFacet, facetValue)\n },\n }\n })\n } else if (isFacetColumnRangeRequest(selectedFacet)) {\n // Include a single pill for both facet filters if a combined range facet filter config is defined\n const { combineRangeFacetConfig } = queryContext\n if (\n combineRangeFacetConfig &&\n (selectedFacet.columnName == combineRangeFacetConfig.minFacetColumn ||\n selectedFacet.columnName == combineRangeFacetConfig.maxFacetColumn)\n ) {\n if (\n selectedFacet.columnName == combineRangeFacetConfig.minFacetColumn\n ) {\n return []\n } else {\n // find the min facet also\n const maxFacet = selectedFacet\n const minFacet = selectedFacets.find(\n v => v.columnName == combineRangeFacetConfig.minFacetColumn,\n ) as FacetColumnRangeRequest\n const innerText = getRangeFacetInnerText(maxFacet.min, minFacet.max)\n return [\n {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}-${innerText}`,\n innerText: innerText,\n tooltipText: `${combineRangeFacetConfig.label}: ${innerText}`,\n onRemoveFilter: () => {\n // Remove both facets on pill click\n queryContext.removeSelectedFacet([minFacet, maxFacet])\n },\n },\n ]\n }\n }\n\n const innerText = getRangeFacetInnerText(\n selectedFacet.min,\n selectedFacet.max,\n )\n\n return [\n {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}-${selectedFacet.min}-${selectedFacet.max}`,\n innerText: innerText,\n tooltipText: `${getColumnDisplayName(\n selectedFacet.columnName,\n selectedFacet.jsonPath,\n )}: ${innerText}`,\n onRemoveFilter: () => {\n queryContext.removeSelectedFacet(selectedFacet)\n },\n },\n ]\n } else {\n console.log(\n 'Unknown facet type',\n (selectedFacet as unknown as FacetColumnRequest).concreteType,\n )\n return []\n }\n })\n}\n\nfunction SelectionCriteriaPills() {\n const queryContext = useQueryContext()\n const lockedColumn = queryContext.lockedColumn\n const queryVisualizationContext = useQueryVisualizationContext()\n const { lockTextMatchesQueryFilterPill } = queryVisualizationContext\n const { currentQueryRequest } = queryContext\n const { data: queryMetadata } = useGetQueryMetadata()\n\n const queryFilterPillProps = getPillPropsFromQueryFilters(\n currentQueryRequest.query?.additionalFilters ?? [],\n queryContext,\n queryMetadata?.columnModels || [],\n queryVisualizationContext,\n lockedColumn,\n lockTextMatchesQueryFilterPill,\n )\n\n const facetPillProps = getPillPropsFromFacetFilters(\n currentQueryRequest.query.selectedFacets ?? [],\n queryContext,\n queryMetadata?.columnModels || [],\n queryVisualizationContext,\n lockedColumn,\n )\n\n const allPills = [...queryFilterPillProps, ...facetPillProps]\n\n return (\n <>\n {allPills.map(pillProps => {\n // Encode the key because the facet may include an illegal character\n const key = encodeURIComponent(pillProps.key)\n return <SelectionCriteriaPill {...pillProps} key={key} />\n })}\n </>\n )\n}\n\nexport default SelectionCriteriaPills\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ColumnType
|
|
1
|
+
import { ColumnType } from '@sage-bionetworks/synapse-types';
|
|
2
2
|
import { RangeValues } from '../Range';
|
|
3
3
|
export declare enum RadioValuesEnum {
|
|
4
4
|
NOT_SET = "org.sagebionetworks.UNDEFINED_NULL_NOTSET",
|
|
@@ -11,7 +11,14 @@ export declare const options: {
|
|
|
11
11
|
}[];
|
|
12
12
|
export type RangeFacetFilterProps = {
|
|
13
13
|
label: string;
|
|
14
|
-
facetResult:
|
|
14
|
+
facetResult: {
|
|
15
|
+
/** The smallest value in the column. May be absent when the server cannot supply stats (e.g. Search API). */
|
|
16
|
+
columnMin?: string;
|
|
17
|
+
/** The largest value in the column. May be absent when the server cannot supply stats (e.g. Search API). */
|
|
18
|
+
columnMax?: string;
|
|
19
|
+
selectedMin?: string;
|
|
20
|
+
selectedMax?: string;
|
|
21
|
+
};
|
|
15
22
|
columnType: ColumnType;
|
|
16
23
|
hideCollapsible?: boolean;
|
|
17
24
|
onRangeValueSelected: (values: RangeValues) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RangeFacetFilterUI.d.ts","sourceRoot":"","sources":["../../../../src/components/widgets/query-filter/RangeFacetFilterUI.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"RangeFacetFilterUI.d.ts","sourceRoot":"","sources":["../../../../src/components/widgets/query-filter/RangeFacetFilterUI.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAG5D,OAAO,EAAS,WAAW,EAAE,MAAM,UAAU,CAAA;AAI7C,oBAAY,eAAe;IACzB,OAAO,8CAA8C;IACrD,KAAK,UAAU;IACf,GAAG,KAAK;CACT;AACD,eAAO,MAAM,OAAO;;;GAInB,CAAA;AACD,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE;QACX,6GAA6G;QAC7G,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,4GAA4G;QAC5G,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oBAAoB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAA;IACnD,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,aAAa,EAAE,MAAM,IAAI,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,EAAE,YAAY,OAAO,oBAO7D,CAAA;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,2CAkJ9D"}
|
|
@@ -34,7 +34,7 @@ function g(e) {
|
|
|
34
34
|
b();
|
|
35
35
|
break;
|
|
36
36
|
}
|
|
37
|
-
}, [P, F] = i(h(A, k));
|
|
37
|
+
}, [P, F] = i(h(A ?? "", k));
|
|
38
38
|
return /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u(t, {
|
|
39
39
|
isCollapsed: C,
|
|
40
40
|
label: g,
|
|
@@ -50,30 +50,37 @@ function g(e) {
|
|
|
50
50
|
label: t,
|
|
51
51
|
value: e
|
|
52
52
|
}, e))
|
|
53
|
-
}), P === p.RANGE && (T === E ? /* @__PURE__ */ u("label", { children: E }) : /* @__PURE__ */ d(l, { children: [
|
|
54
|
-
y === "INTEGER" && /* @__PURE__ */ u(r, {
|
|
53
|
+
}), P === p.RANGE && (T && E && T === E ? /* @__PURE__ */ u("label", { children: E }) : /* @__PURE__ */ d(l, { children: [
|
|
54
|
+
y === "INTEGER" && (T && E ? /* @__PURE__ */ u(r, {
|
|
55
55
|
domain: [T, E],
|
|
56
56
|
initialValues: {
|
|
57
|
-
min: parseInt(A),
|
|
58
|
-
max: parseInt(j)
|
|
57
|
+
min: parseInt(A ?? T),
|
|
58
|
+
max: parseInt(j ?? E)
|
|
59
59
|
},
|
|
60
60
|
step: 1,
|
|
61
61
|
onApplyClicked: S,
|
|
62
62
|
children: ">"
|
|
63
|
-
}, "RangeSlider"),
|
|
63
|
+
}, "RangeSlider") : /* @__PURE__ */ u(n, {
|
|
64
|
+
type: "number",
|
|
65
|
+
initialValues: A || j ? {
|
|
66
|
+
min: A ? parseInt(A) : void 0,
|
|
67
|
+
max: j ? parseInt(j) : void 0
|
|
68
|
+
} : void 0,
|
|
69
|
+
onApplyClicked: S
|
|
70
|
+
}, "Range")),
|
|
64
71
|
y === "DATE" && /* @__PURE__ */ u(n, {
|
|
65
|
-
initialValues: {
|
|
66
|
-
min: D ?? f(parseInt(T)).toString(),
|
|
67
|
-
max: O ?? f(parseInt(E)).toString()
|
|
68
|
-
},
|
|
72
|
+
initialValues: D || O || T || E ? {
|
|
73
|
+
min: D ?? (T ? f(parseInt(T)).toString() : void 0),
|
|
74
|
+
max: O ?? (E ? f(parseInt(E)).toString() : void 0)
|
|
75
|
+
} : void 0,
|
|
69
76
|
type: M,
|
|
70
77
|
onApplyClicked: S
|
|
71
78
|
}, "Range"),
|
|
72
79
|
y === "DOUBLE" && /* @__PURE__ */ u(n, {
|
|
73
|
-
initialValues: {
|
|
74
|
-
min: parseFloat(A),
|
|
75
|
-
max: parseFloat(j)
|
|
76
|
-
},
|
|
80
|
+
initialValues: A || j ? {
|
|
81
|
+
min: A ? parseFloat(A) : void 0,
|
|
82
|
+
max: j ? parseFloat(j) : void 0
|
|
83
|
+
} : void 0,
|
|
77
84
|
type: M,
|
|
78
85
|
onApplyClicked: S
|
|
79
86
|
}, "Range")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RangeFacetFilterUI.js","names":[],"sources":["../../../../src/components/widgets/query-filter/RangeFacetFilterUI.tsx"],"sourcesContent":["import { FRIENDLY_VALUE_NOT_SET, VALUE_NOT_SET } from '@/utils/SynapseConstants'\nimport { Collapse, FormControlLabel, Radio, RadioGroup } from '@mui/material'\nimport {
|
|
1
|
+
{"version":3,"file":"RangeFacetFilterUI.js","names":[],"sources":["../../../../src/components/widgets/query-filter/RangeFacetFilterUI.tsx"],"sourcesContent":["import { FRIENDLY_VALUE_NOT_SET, VALUE_NOT_SET } from '@/utils/SynapseConstants'\nimport { Collapse, FormControlLabel, Radio, RadioGroup } from '@mui/material'\nimport { ColumnType } from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useState } from 'react'\nimport { Range, RangeValues } from '../Range'\nimport RangeSlider from '../RangeSlider/RangeSlider'\nimport { FacetFilterHeader } from './FacetFilterHeader'\n\nexport enum RadioValuesEnum {\n NOT_SET = 'org.sagebionetworks.UNDEFINED_NULL_NOTSET',\n RANGE = 'RANGE',\n ANY = '',\n}\nexport const options = [\n { label: FRIENDLY_VALUE_NOT_SET, value: RadioValuesEnum.NOT_SET },\n { label: 'Any', value: RadioValuesEnum.ANY },\n { label: 'Range', value: RadioValuesEnum.RANGE },\n]\nexport type RangeFacetFilterProps = {\n label: string\n facetResult: {\n /** The smallest value in the column. May be absent when the server cannot supply stats (e.g. Search API). */\n columnMin?: string\n /** The largest value in the column. May be absent when the server cannot supply stats (e.g. Search API). */\n columnMax?: string\n selectedMin?: string\n selectedMax?: string\n }\n columnType: ColumnType\n hideCollapsible?: boolean\n onRangeValueSelected: (values: RangeValues) => void\n onNotSetSelected: () => void\n onAnySelected: () => void\n}\n\nexport const getRadioValue = (min: string, isAnyValue: boolean) => {\n if (isAnyValue) {\n return RadioValuesEnum.ANY\n } else if (min === VALUE_NOT_SET) {\n return RadioValuesEnum.NOT_SET\n }\n return RadioValuesEnum.RANGE\n}\n\nexport function RangeFacetFilterUI(props: RangeFacetFilterProps) {\n const {\n label,\n facetResult,\n hideCollapsible = false,\n columnType,\n onAnySelected,\n onNotSetSelected,\n onRangeValueSelected,\n } = props\n\n const [isCollapsed, setIsCollapsed] = useState<boolean>(false)\n\n const { columnMin, columnMax, selectedMin, selectedMax } = facetResult // the upper bound of the selected range\n\n const hasAnyValue = !selectedMin && !selectedMax\n\n const currentMin = selectedMin || columnMin\n const currentMax = selectedMax || columnMax\n\n const rangeType = columnType === 'DOUBLE' ? 'number' : 'date'\n\n const handleRadioGroupChange = (radioValue: RadioValuesEnum) => {\n setRadioValue(radioValue)\n\n switch (radioValue) {\n case RadioValuesEnum.RANGE:\n // The range facet value will update when the user clicks the apply button\n break\n case RadioValuesEnum.NOT_SET:\n onNotSetSelected()\n break\n case RadioValuesEnum.ANY: {\n onAnySelected()\n break\n }\n }\n }\n\n const [radioValue, setRadioValue] = useState(\n getRadioValue(currentMin ?? '', hasAnyValue),\n )\n\n return (\n <div>\n <FacetFilterHeader\n isCollapsed={isCollapsed}\n label={label}\n onClick={(isCollapsed: boolean) => setIsCollapsed(isCollapsed)}\n hideCollapsible={hideCollapsible}\n />\n <Collapse in={!isCollapsed}>\n <RadioGroup\n value={radioValue}\n onChange={(_event, value) =>\n handleRadioGroupChange(value as RadioValuesEnum)\n }\n >\n {options.map(({ value, label }) => (\n <FormControlLabel\n key={value}\n control={<Radio />}\n label={label}\n value={value}\n />\n ))}\n </RadioGroup>\n {radioValue === RadioValuesEnum.RANGE &&\n (columnMin && columnMax && columnMin === columnMax ? (\n <label>{columnMax}</label>\n ) : (\n <>\n {columnType === 'INTEGER' &&\n (columnMin && columnMax ? (\n <RangeSlider\n key=\"RangeSlider\"\n domain={[columnMin, columnMax]}\n initialValues={{\n min: parseInt(currentMin ?? columnMin),\n max: parseInt(currentMax ?? columnMax),\n }}\n step={1}\n onApplyClicked={onRangeValueSelected}\n >\n {'>'}\n </RangeSlider>\n ) : (\n <Range\n key=\"Range\"\n type=\"number\"\n initialValues={\n currentMin || currentMax\n ? {\n min: currentMin ? parseInt(currentMin) : undefined,\n max: currentMax ? parseInt(currentMax) : undefined,\n }\n : undefined\n }\n onApplyClicked={onRangeValueSelected}\n />\n ))}\n\n {columnType === 'DATE' && (\n <Range\n key=\"Range\"\n initialValues={\n selectedMin || selectedMax || columnMin || columnMax\n ? {\n // From the backend, selectedMin is a formatted date (like \"2021-06-15\"), but columnMin is a unix timestamp in millis (like \"1624651794856\")\n min:\n selectedMin ??\n (columnMin\n ? dayjs(parseInt(columnMin)).toString()\n : undefined),\n max:\n selectedMax ??\n (columnMax\n ? dayjs(parseInt(columnMax)).toString()\n : undefined),\n }\n : undefined\n }\n type={rangeType}\n onApplyClicked={onRangeValueSelected}\n />\n )}\n {columnType === 'DOUBLE' && (\n <Range\n key=\"Range\"\n initialValues={\n currentMin || currentMax\n ? {\n min: currentMin ? parseFloat(currentMin) : undefined,\n max: currentMax ? parseFloat(currentMax) : undefined,\n }\n : undefined\n }\n type={rangeType}\n onApplyClicked={onRangeValueSelected}\n />\n )}\n </>\n ))}\n </Collapse>\n </div>\n )\n}\n"],"mappings":";;;;;;;;;AASA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,UAAU,6CACV,EAAA,QAAQ,SACR,EAAA,MAAM;KACP,EACY,IAAU;CACrB;EAAE,OAAO;EAAwB,OAAO,EAAgB;EAAS;CACjE;EAAE,OAAO;EAAO,OAAO,EAAgB;EAAK;CAC5C;EAAE,OAAO;EAAS,OAAO,EAAgB;EAAO;CACjD,EAkBY,KAAiB,GAAa,MACrC,IACK,EAAgB,MACd,MAAA,8CACF,EAAgB,UAElB,EAAgB;AAGzB,SAAgB,EAAmB,GAA8B;CAC/D,IAAM,EACJ,UACA,gBACA,qBAAkB,IAClB,eACA,kBACA,qBACA,4BACE,GAEE,CAAC,GAAa,KAAkB,EAAkB,GAAM,EAExD,EAAE,cAAW,cAAW,gBAAa,mBAAgB,GAErD,IAAc,CAAC,KAAe,CAAC,GAE/B,IAAa,KAAe,GAC5B,IAAa,KAAe,GAE5B,IAAY,MAAe,WAAW,WAAW,QAEjD,KAA0B,MAAgC;AAG9D,UAFA,EAAc,EAAW,EAEjB,GAAR;GACE,KAAK,EAAgB,MAEnB;GACF,KAAK,EAAgB;AACnB,OAAkB;AAClB;GACF,KAAK,EAAgB;AACnB,OAAe;AACf;;IAKA,CAAC,GAAY,KAAiB,EAClC,EAAc,KAAc,IAAI,EAAY,CAC7C;AAED,QACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EACe;EACN;EACP,UAAU,MAAyB,EAAe,EAAY;EAC7C;EACjB,CAAA,EACF,kBAAC,GAAD;EAAU,IAAI,CAAC;YAAf,CACE,kBAAC,GAAD;GACE,OAAO;GACP,WAAW,GAAQ,MACjB,EAAuB,EAAyB;aAGjD,EAAQ,KAAK,EAAE,UAAO,eACrB,kBAAC,GAAD;IAEE,SAAS,kBAAC,GAAD,EAAS,CAAA;IACX;IACA;IACP,EAJK,EAIL,CACF;GACS,CAAA,EACZ,MAAe,EAAgB,UAC7B,KAAa,KAAa,MAAc,IACvC,kBAAC,SAAD,EAAA,UAAQ,GAAkB,CAAA,GAE1B,kBAAA,GAAA,EAAA,UAAA;GACG,MAAe,cACb,KAAa,IACZ,kBAAC,GAAD;IAEE,QAAQ,CAAC,GAAW,EAAU;IAC9B,eAAe;KACb,KAAK,SAAS,KAAc,EAAU;KACtC,KAAK,SAAS,KAAc,EAAU;KACvC;IACD,MAAM;IACN,gBAAgB;cAEf;IACW,EAVR,cAUQ,GAEd,kBAAC,GAAD;IAEE,MAAK;IACL,eACE,KAAc,IACV;KACE,KAAK,IAAa,SAAS,EAAW,GAAG,KAAA;KACzC,KAAK,IAAa,SAAS,EAAW,GAAG,KAAA;KAC1C,GACD,KAAA;IAEN,gBAAgB;IAChB,EAXI,QAWJ;GAGL,MAAe,UACd,kBAAC,GAAD;IAEE,eACE,KAAe,KAAe,KAAa,IACvC;KAEE,KACE,MACC,IACG,EAAM,SAAS,EAAU,CAAC,CAAC,UAAU,GACrC,KAAA;KACN,KACE,MACC,IACG,EAAM,SAAS,EAAU,CAAC,CAAC,UAAU,GACrC,KAAA;KACP,GACD,KAAA;IAEN,MAAM;IACN,gBAAgB;IAChB,EApBI,QAoBJ;GAEH,MAAe,YACd,kBAAC,GAAD;IAEE,eACE,KAAc,IACV;KACE,KAAK,IAAa,WAAW,EAAW,GAAG,KAAA;KAC3C,KAAK,IAAa,WAAW,EAAW,GAAG,KAAA;KAC5C,GACD,KAAA;IAEN,MAAM;IACN,gBAAgB;IAChB,EAXI,QAWJ;GAEH,EAAA,CAAA,EAEE;IACP,EAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CurationTaskCard.d.ts","sourceRoot":"","sources":["../../../../../src/features/curator/dashboard/components/CurationTaskCard.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAO7D,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;
|
|
1
|
+
{"version":3,"file":"CurationTaskCard.d.ts","sourceRoot":"","sources":["../../../../../src/features/curator/dashboard/components/CurationTaskCard.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAO7D,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AA+DD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAuDpE"}
|
|
@@ -18,6 +18,7 @@ function m(t) {
|
|
|
18
18
|
case "org.sagebionetworks.repo.model.curation.metadata.RecordBasedMetadataTaskProperties": return {
|
|
19
19
|
title: t.task.dataType,
|
|
20
20
|
description: t.task.instructions ?? "",
|
|
21
|
+
taskId: t.task.taskId,
|
|
21
22
|
principalIds: t.task.assigneePrincipalId ? [t.task.assigneePrincipalId] : [],
|
|
22
23
|
buttonText: "Open Curator",
|
|
23
24
|
taskType: "Curate Data",
|
|
@@ -31,6 +32,7 @@ function m(t) {
|
|
|
31
32
|
return {
|
|
32
33
|
title: t.task.dataType,
|
|
33
34
|
description: t.task.instructions ?? "",
|
|
35
|
+
taskId: t.task.taskId,
|
|
34
36
|
principalIds: t.task.assigneePrincipalId ? [t.task.assigneePrincipalId] : [],
|
|
35
37
|
buttonText: "Continue",
|
|
36
38
|
taskType: "",
|
|
@@ -53,7 +55,7 @@ function h(e) {
|
|
|
53
55
|
});
|
|
54
56
|
}
|
|
55
57
|
function g(n) {
|
|
56
|
-
let { taskBundle: c } = n, { title: g, description: _,
|
|
58
|
+
let { taskBundle: c } = n, { title: g, description: _, taskId: v, taskType: y, principalIds: b, buttonText: x, onClickNextStep: S, hasPermission: C, isLoading: w, isPending: T } = m(c);
|
|
57
59
|
return /* @__PURE__ */ d(s, {
|
|
58
60
|
className: p(a.card, r.card),
|
|
59
61
|
children: /* @__PURE__ */ f("div", {
|
|
@@ -64,10 +66,14 @@ function g(n) {
|
|
|
64
66
|
children: [
|
|
65
67
|
/* @__PURE__ */ f("div", {
|
|
66
68
|
className: r.titleChipContainer,
|
|
67
|
-
children: [
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
children: [
|
|
70
|
+
/* @__PURE__ */ d(u, {
|
|
71
|
+
variant: "headline3",
|
|
72
|
+
children: g
|
|
73
|
+
}),
|
|
74
|
+
y && /* @__PURE__ */ d(h, { label: y }),
|
|
75
|
+
v && /* @__PURE__ */ d(h, { label: `TaskId ${v}` })
|
|
76
|
+
]
|
|
71
77
|
}),
|
|
72
78
|
/* @__PURE__ */ d(u, {
|
|
73
79
|
variant: "body1",
|
|
@@ -75,7 +81,7 @@ function g(n) {
|
|
|
75
81
|
}),
|
|
76
82
|
/* @__PURE__ */ d("div", {
|
|
77
83
|
className: r.userChipContainer,
|
|
78
|
-
children:
|
|
84
|
+
children: b.map((e) => /* @__PURE__ */ d(o, { principalId: e }, e))
|
|
79
85
|
})
|
|
80
86
|
]
|
|
81
87
|
}),
|
|
@@ -89,12 +95,12 @@ function g(n) {
|
|
|
89
95
|
}),
|
|
90
96
|
/* @__PURE__ */ d(i, {
|
|
91
97
|
className: r.cardButton,
|
|
92
|
-
buttonText:
|
|
93
|
-
onClick:
|
|
98
|
+
buttonText: x,
|
|
99
|
+
onClick: C ? S : () => {
|
|
94
100
|
e(t, "danger");
|
|
95
101
|
},
|
|
96
|
-
disabled:
|
|
97
|
-
loading:
|
|
102
|
+
disabled: w,
|
|
103
|
+
loading: T
|
|
98
104
|
})
|
|
99
105
|
]
|
|
100
106
|
})
|