synapse-react-client 4.0.37 → 4.0.40
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.js +1 -1
- package/dist/aridhia-queries/useAridhiaQuery.d.ts +6 -2
- package/dist/aridhia-queries/useAridhiaQuery.d.ts.map +1 -1
- package/dist/aridhia-queries/useAridhiaQuery.js +3 -0
- package/dist/aridhia-queries/useAridhiaQuery.js.map +1 -1
- package/dist/components/Aridhia/AridhiaAccessStatus.d.ts +2 -1
- package/dist/components/Aridhia/AridhiaAccessStatus.d.ts.map +1 -1
- package/dist/components/Aridhia/AridhiaAccessStatus.js +60 -37
- package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
- package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts +12 -0
- package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts.map +1 -0
- package/dist/components/Aridhia/AridhiaDarStatusPopover.js +56 -0
- package/dist/components/Aridhia/AridhiaDarStatusPopover.js.map +1 -0
- package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.d.ts.map +1 -1
- package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.js +38 -30
- package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.js.map +1 -1
- package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.js +15 -14
- package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.js.map +1 -1
- package/dist/components/Aridhia/RdcaDapEligibilityDialog.d.ts +11 -0
- package/dist/components/Aridhia/RdcaDapEligibilityDialog.d.ts.map +1 -0
- package/dist/components/Aridhia/RdcaDapEligibilityDialog.js +37 -0
- package/dist/components/Aridhia/RdcaDapEligibilityDialog.js.map +1 -0
- package/dist/components/Aridhia/aridhiaAccessStatusUtils.js +2 -2
- package/dist/components/Aridhia/aridhiaAccessStatusUtils.js.map +1 -1
- package/dist/components/Aridhia/aridhiaFairPortalUrls.d.ts +10 -0
- package/dist/components/Aridhia/aridhiaFairPortalUrls.d.ts.map +1 -0
- package/dist/components/Aridhia/aridhiaFairPortalUrls.js +11 -0
- package/dist/components/Aridhia/aridhiaFairPortalUrls.js.map +1 -0
- package/dist/components/Aridhia/rdcaDapConstants.d.ts +3 -0
- package/dist/components/Aridhia/rdcaDapConstants.d.ts.map +1 -0
- package/dist/components/Aridhia/rdcaDapConstants.js +6 -0
- package/dist/components/Aridhia/rdcaDapConstants.js.map +1 -0
- package/dist/components/DataExplorer/DataExplorer.css +1 -1
- package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -1
- package/dist/components/DataExplorer/DataExplorer.js +50 -50
- package/dist/components/DataExplorer/DataExplorer.js.map +1 -1
- package/dist/components/DataExplorer/DataExplorer.module.js +16 -16
- package/dist/components/DataExplorer/DataExplorer.module.js.map +1 -1
- package/dist/components/DataExplorer/DataExplorer.module.scss +29 -6
- package/dist/components/DataGrid/columns/DateTimeColumn.d.ts +16 -7
- package/dist/components/DataGrid/columns/DateTimeColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/DateTimeColumn.js +79 -57
- package/dist/components/DataGrid/columns/DateTimeColumn.js.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js +11 -8
- package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts +10 -0
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker/DatePicker.js +18 -0
- package/dist/components/DatePicker/DatePicker.js.map +1 -0
- package/dist/components/EntityCitation/EntityCitation.d.ts.map +1 -1
- package/dist/components/EntityCitation/EntityCitation.js +8 -5
- package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
- package/dist/components/HasAccess/AccessIcon.d.ts +3 -1
- package/dist/components/HasAccess/AccessIcon.d.ts.map +1 -1
- package/dist/components/HasAccess/AccessIcon.js +11 -1
- package/dist/components/HasAccess/AccessIcon.js.map +1 -1
- package/dist/components/PortalHomePageHeader/PortalHomePageHeader.d.ts +2 -1
- package/dist/components/PortalHomePageHeader/PortalHomePageHeader.d.ts.map +1 -1
- package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js +81 -53
- package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js.map +1 -1
- package/dist/components/ProjectInfo/ProjectInfo.d.ts.map +1 -1
- package/dist/components/ProjectInfo/ProjectInfo.js +3 -2
- package/dist/components/ProjectInfo/ProjectInfo.js.map +1 -1
- package/dist/components/QueryBuilder/FilterConditionRow.css +1 -0
- package/dist/components/QueryBuilder/FilterConditionRow.d.ts +6 -0
- package/dist/components/QueryBuilder/FilterConditionRow.d.ts.map +1 -0
- package/dist/components/QueryBuilder/FilterConditionRow.js +257 -0
- package/dist/components/QueryBuilder/FilterConditionRow.js.map +1 -0
- package/dist/components/QueryBuilder/FilterConditionRow.module.js +17 -0
- package/dist/components/QueryBuilder/FilterConditionRow.module.js.map +1 -0
- package/dist/components/QueryBuilder/FilterConditionRow.module.scss +106 -0
- package/dist/components/QueryBuilder/FilterGroupNode.css +1 -0
- package/dist/components/QueryBuilder/FilterGroupNode.d.ts +7 -0
- package/dist/components/QueryBuilder/FilterGroupNode.d.ts.map +1 -0
- package/dist/components/QueryBuilder/FilterGroupNode.js +100 -0
- package/dist/components/QueryBuilder/FilterGroupNode.js.map +1 -0
- package/dist/components/QueryBuilder/FilterGroupNode.module.js +15 -0
- package/dist/components/QueryBuilder/FilterGroupNode.module.js.map +1 -0
- package/dist/components/QueryBuilder/FilterGroupNode.module.scss +83 -0
- package/dist/components/QueryBuilder/QueryBuilderControls.css +1 -0
- package/dist/components/QueryBuilder/QueryBuilderControls.d.ts +21 -0
- package/dist/components/QueryBuilder/QueryBuilderControls.d.ts.map +1 -0
- package/dist/components/QueryBuilder/QueryBuilderControls.js +138 -0
- package/dist/components/QueryBuilder/QueryBuilderControls.js.map +1 -0
- package/dist/components/QueryBuilder/QueryBuilderControls.module.js +17 -0
- package/dist/components/QueryBuilder/QueryBuilderControls.module.js.map +1 -0
- package/dist/components/QueryBuilder/QueryBuilderControls.module.scss +79 -0
- package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts +39 -0
- package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts.map +1 -0
- package/dist/components/QueryBuilder/QueryBuilderInternalContext.js +19 -0
- package/dist/components/QueryBuilder/QueryBuilderInternalContext.js.map +1 -0
- package/dist/components/QueryBuilder/qbTreeToReadable.d.ts +14 -0
- package/dist/components/QueryBuilder/qbTreeToReadable.d.ts.map +1 -0
- package/dist/components/QueryBuilder/qbTreeToReadable.js +89 -0
- package/dist/components/QueryBuilder/qbTreeToReadable.js.map +1 -0
- package/dist/components/QueryBuilder/queryBuilderId.d.ts +2 -0
- package/dist/components/QueryBuilder/queryBuilderId.d.ts.map +1 -0
- package/dist/components/QueryBuilder/queryBuilderId.js +9 -0
- package/dist/components/QueryBuilder/queryBuilderId.js.map +1 -0
- package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts +24 -0
- package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts.map +1 -0
- package/dist/components/QueryBuilder/queryBuilderMetadata.js +91 -0
- package/dist/components/QueryBuilder/queryBuilderMetadata.js.map +1 -0
- package/dist/components/QueryBuilder/queryBuilderOperations.d.ts +58 -0
- package/dist/components/QueryBuilder/queryBuilderOperations.d.ts.map +1 -0
- package/dist/components/QueryBuilder/queryBuilderOperations.js +200 -0
- package/dist/components/QueryBuilder/queryBuilderOperations.js.map +1 -0
- package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts +3 -2
- package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts.map +1 -1
- package/dist/components/QueryBuilder/queryBuilderTranslation.js +82 -84
- package/dist/components/QueryBuilder/queryBuilderTranslation.js.map +1 -1
- package/dist/components/QueryBuilder/useQBCombinedSql.d.ts +11 -0
- package/dist/components/QueryBuilder/useQBCombinedSql.d.ts.map +1 -0
- package/dist/components/QueryBuilder/useQBCombinedSql.js +29 -0
- package/dist/components/QueryBuilder/useQBCombinedSql.js.map +1 -0
- package/dist/components/QueryBuilder/useQBFacetSourceMetadata.d.ts +18 -0
- package/dist/components/QueryBuilder/useQBFacetSourceMetadata.d.ts.map +1 -0
- package/dist/components/QueryBuilder/useQBFacetSourceMetadata.js +27 -0
- package/dist/components/QueryBuilder/useQBFacetSourceMetadata.js.map +1 -0
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +14 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +185 -120
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/RssFeedCards/RssFeedCards.d.ts +1 -0
- package/dist/components/RssFeedCards/RssFeedCards.d.ts.map +1 -1
- package/dist/components/RssFeedCards/RssFeedCards.js +11 -11
- package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.d.ts +7 -1
- package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.js +76 -71
- package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
- package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts +3 -1
- package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapsePortalChatDialog.js +24 -13
- package/dist/components/SynapseChat/SynapsePortalChatDialog.js.map +1 -1
- package/dist/components/SynapseChat/portalChatSessionStorage.d.ts +23 -0
- package/dist/components/SynapseChat/portalChatSessionStorage.d.ts.map +1 -0
- package/dist/components/SynapseChat/portalChatSessionStorage.js +29 -0
- package/dist/components/SynapseChat/portalChatSessionStorage.js.map +1 -0
- package/dist/components/SynapseHomepageV2/HotdropsAndNews.css +1 -1
- package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js +9 -9
- package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js.map +1 -1
- package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.scss +1 -0
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts +6 -0
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts.map +1 -1
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js +92 -79
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts +3 -4
- package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js +2 -2
- package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js.map +1 -1
- package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts.map +1 -1
- package/dist/components/entity/page/action_menu/EntityActionMenu.js +9 -2
- package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
- package/dist/components/entity/page/title_bar/EntityPageTitleBar.js +1 -1
- package/dist/components/entity/page/title_bar/EntityPageTitleBar.js.map +1 -1
- package/dist/components/menu/ComplexMenu.js +1 -1
- package/dist/components/menu/ComplexMenu.js.map +1 -1
- package/dist/components/menu/DropdownMenu.d.ts.map +1 -1
- package/dist/components/menu/DropdownMenu.js +4 -0
- package/dist/components/menu/DropdownMenu.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useMarkCurationTaskInProgress.d.ts +10 -0
- package/dist/features/entity/metadata-task/hooks/useMarkCurationTaskInProgress.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/hooks/useMarkCurationTaskInProgress.js +20 -0
- package/dist/features/entity/metadata-task/hooks/useMarkCurationTaskInProgress.js.map +1 -0
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +29 -20
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -1
- package/dist/mocks/accessRequirement/mockFormTemplates.d.ts +16 -0
- package/dist/mocks/accessRequirement/mockFormTemplates.d.ts.map +1 -0
- package/dist/mocks/accessRequirement/mockFormTemplates.js +70 -0
- package/dist/mocks/accessRequirement/mockFormTemplates.js.map +1 -0
- package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.d.ts +7 -0
- package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.d.ts.map +1 -0
- package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.js +47 -0
- package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.js.map +1 -0
- package/dist/mocks/accessRequirement/mockJsonSchemas.d.ts +24 -0
- package/dist/mocks/accessRequirement/mockJsonSchemas.d.ts.map +1 -0
- package/dist/mocks/accessRequirement/mockJsonSchemas.js +62 -0
- package/dist/mocks/accessRequirement/mockJsonSchemas.js.map +1 -0
- package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts +18 -1
- package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/aridhiaHandlers.js +39 -33
- package/dist/mocks/msw/handlers/aridhiaHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/formTemplateHandlers.d.ts +5 -0
- package/dist/mocks/msw/handlers/formTemplateHandlers.d.ts.map +1 -0
- package/dist/mocks/msw/handlers/formTemplateHandlers.js +65 -0
- package/dist/mocks/msw/handlers/formTemplateHandlers.js.map +1 -0
- package/dist/mocks/msw/handlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers.js +49 -47
- package/dist/mocks/msw/handlers.js.map +1 -1
- package/dist/style/abstracts/_cssVariables.scss +7 -0
- package/dist/style/components/_query-wrapper-plot-nav.scss +9 -0
- package/dist/style/main.css +1 -1
- package/dist/synapse-queries/KeyFactory.d.ts +6 -1
- package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
- package/dist/synapse-queries/KeyFactory.js +17 -2
- package/dist/synapse-queries/KeyFactory.js.map +1 -1
- package/dist/synapse-queries/chat/useChat.d.ts.map +1 -1
- package/dist/synapse-queries/chat/useChat.js +2 -4
- package/dist/synapse-queries/chat/useChat.js.map +1 -1
- package/dist/synapse-queries/dataaccess/index.d.ts +2 -0
- package/dist/synapse-queries/dataaccess/index.d.ts.map +1 -1
- package/dist/synapse-queries/dataaccess/index.js +5 -3
- package/dist/synapse-queries/dataaccess/useFormTemplate.d.ts +41 -0
- package/dist/synapse-queries/dataaccess/useFormTemplate.d.ts.map +1 -0
- package/dist/synapse-queries/dataaccess/useFormTemplate.js +63 -0
- package/dist/synapse-queries/dataaccess/useFormTemplate.js.map +1 -0
- package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.d.ts +21 -0
- package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.d.ts.map +1 -0
- package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.js +34 -0
- package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.js.map +1 -0
- package/dist/synapse-queries/index.js +190 -180
- package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/featureflag/FeatureFlags.d.ts +0 -1
- package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
- package/dist/utils/featureflag/FeatureFlags.js +1 -1
- package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
- package/dist/utils/jsonschema/getType.d.ts.map +1 -1
- package/dist/utils/jsonschema/getType.js +4 -1
- package/dist/utils/jsonschema/getType.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { splitAndTrim as e } from "../../utils/functions/StringUtils.js";
|
|
2
|
+
import { useQueryBuilderInternalContext as t } from "./QueryBuilderInternalContext.js";
|
|
3
|
+
import { availableOpsForKind as n, classifyColumn as r, labelForFacetValue as i, labelForOp as a } from "./queryBuilderMetadata.js";
|
|
4
|
+
import o from "./FilterConditionRow.module.js";
|
|
5
|
+
import { defaultOpForColumnType as s } from "./queryBuilderOperations.js";
|
|
6
|
+
import { useMemo as c, useState as l } from "react";
|
|
7
|
+
import { Autocomplete as u, IconButton as d, InputLabel as f, MenuItem as p, Select as m, TextField as h, ToggleButton as g, ToggleButtonGroup as _, Tooltip as v } from "@mui/material";
|
|
8
|
+
import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
|
|
9
|
+
import S from "@mui/icons-material/DeleteOutline";
|
|
10
|
+
import C from "@mui/icons-material/DragIndicator";
|
|
11
|
+
//#region src/components/QueryBuilder/FilterConditionRow.tsx
|
|
12
|
+
function w(e) {
|
|
13
|
+
let { condition: i } = e, { columnModels: l, facetResults: g, onlyFacetedColumns: _, getColumnDisplayName: w, updateConditionAt: E, removeConditionAt: D } = t(), A = c(() => new Set(g.filter((e) => e.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnResultValues").map((e) => e.columnName)), [g]), j = c(() => (_ ? l.filter((e) => A.has(e.name)) : l).map((e) => ({
|
|
14
|
+
name: e.name,
|
|
15
|
+
columnType: e.columnType,
|
|
16
|
+
label: w(e.name)
|
|
17
|
+
})), [
|
|
18
|
+
l,
|
|
19
|
+
A,
|
|
20
|
+
_,
|
|
21
|
+
w
|
|
22
|
+
]), M = j.find((e) => e.name === i.columnName) ?? null, N = i.columnName != null && A.has(i.columnName), P = r(i.columnType, N), F = n(P), I = `qb-op-label-${i.id}`;
|
|
23
|
+
return /* @__PURE__ */ x("div", {
|
|
24
|
+
className: o.row,
|
|
25
|
+
role: "group",
|
|
26
|
+
"aria-label": `Filter condition${i.columnName ? ` on ${i.columnName}` : ""}`,
|
|
27
|
+
"data-qb-node-id": i.id,
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ b(v, {
|
|
30
|
+
title: "Drag to reorder",
|
|
31
|
+
children: /* @__PURE__ */ b(d, {
|
|
32
|
+
size: "small",
|
|
33
|
+
className: o.dragHandle,
|
|
34
|
+
"aria-label": "Drag to reorder condition",
|
|
35
|
+
children: /* @__PURE__ */ b(C, { fontSize: "small" })
|
|
36
|
+
})
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ b(v, {
|
|
39
|
+
title: "Remove condition",
|
|
40
|
+
children: /* @__PURE__ */ b(d, {
|
|
41
|
+
size: "small",
|
|
42
|
+
className: o.remove,
|
|
43
|
+
"aria-label": "Remove condition",
|
|
44
|
+
onClick: () => D(i.id),
|
|
45
|
+
children: /* @__PURE__ */ b(S, { fontSize: "small" })
|
|
46
|
+
})
|
|
47
|
+
}),
|
|
48
|
+
/* @__PURE__ */ b(u, {
|
|
49
|
+
className: o.propertyPicker,
|
|
50
|
+
size: "small",
|
|
51
|
+
options: j,
|
|
52
|
+
getOptionLabel: (e) => e.label,
|
|
53
|
+
isOptionEqualToValue: (e, t) => e.name === t.name,
|
|
54
|
+
value: M,
|
|
55
|
+
renderInput: (e) => /* @__PURE__ */ b(h, {
|
|
56
|
+
...e,
|
|
57
|
+
variant: "outlined",
|
|
58
|
+
placeholder: "Select property…",
|
|
59
|
+
inputProps: {
|
|
60
|
+
...e.inputProps,
|
|
61
|
+
"aria-label": "Property"
|
|
62
|
+
}
|
|
63
|
+
}),
|
|
64
|
+
onChange: (e, t) => {
|
|
65
|
+
if (t == null) return;
|
|
66
|
+
let a = n(r(t.columnType, k(g, t.name))), o = a.length > 0 ? a[0] : s(t.columnType);
|
|
67
|
+
E(i.id, {
|
|
68
|
+
columnName: t.name,
|
|
69
|
+
columnType: t.columnType,
|
|
70
|
+
op: o,
|
|
71
|
+
values: [],
|
|
72
|
+
rangeMin: null,
|
|
73
|
+
rangeMax: null,
|
|
74
|
+
text: null
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}),
|
|
78
|
+
F.length > 0 && /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b(f, {
|
|
79
|
+
id: I,
|
|
80
|
+
sx: { display: "none" },
|
|
81
|
+
children: "Operator"
|
|
82
|
+
}), /* @__PURE__ */ b(m, {
|
|
83
|
+
className: o.operatorPicker,
|
|
84
|
+
size: "small",
|
|
85
|
+
labelId: I,
|
|
86
|
+
variant: "outlined",
|
|
87
|
+
value: F.includes(i.op) ? i.op : F[0],
|
|
88
|
+
onChange: (e) => {
|
|
89
|
+
let t = e.target.value;
|
|
90
|
+
E(i.id, { op: t });
|
|
91
|
+
},
|
|
92
|
+
"aria-label": "Operator",
|
|
93
|
+
children: F.map((e) => /* @__PURE__ */ b(p, {
|
|
94
|
+
value: e,
|
|
95
|
+
children: a(e)
|
|
96
|
+
}, e))
|
|
97
|
+
})] }),
|
|
98
|
+
/* @__PURE__ */ b(T, {
|
|
99
|
+
condition: i,
|
|
100
|
+
columnKind: P,
|
|
101
|
+
hasFacet: N,
|
|
102
|
+
columnModels: l,
|
|
103
|
+
facetValues: N && i.columnName != null ? O(g, i.columnName) : [],
|
|
104
|
+
onChange: (e) => E(i.id, e)
|
|
105
|
+
})
|
|
106
|
+
]
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function T(t) {
|
|
110
|
+
let { condition: n, columnKind: r, hasFacet: i, facetValues: a, onChange: s } = t, { op: c } = n;
|
|
111
|
+
if (c === "has_value" || c === "no_value") return null;
|
|
112
|
+
switch (c) {
|
|
113
|
+
case "is_any_of":
|
|
114
|
+
case "is_all_of": return (r === "enum" || r === "list") && i ? /* @__PURE__ */ b(D, {
|
|
115
|
+
facetValues: a,
|
|
116
|
+
selectedValues: n.values,
|
|
117
|
+
onChange: (e) => s({ values: e })
|
|
118
|
+
}) : /* @__PURE__ */ b(h, {
|
|
119
|
+
className: o.textInput,
|
|
120
|
+
size: "small",
|
|
121
|
+
variant: "outlined",
|
|
122
|
+
placeholder: "Comma-separated values",
|
|
123
|
+
value: n.values.join(", "),
|
|
124
|
+
slotProps: { htmlInput: { "aria-label": "Values" } },
|
|
125
|
+
onChange: (t) => s({ values: e(t.target.value) })
|
|
126
|
+
});
|
|
127
|
+
case "between": return /* @__PURE__ */ x(y, { children: [
|
|
128
|
+
/* @__PURE__ */ b(h, {
|
|
129
|
+
className: o.rangeInput,
|
|
130
|
+
size: "small",
|
|
131
|
+
variant: "outlined",
|
|
132
|
+
type: "text",
|
|
133
|
+
placeholder: "Min",
|
|
134
|
+
value: n.rangeMin ?? "",
|
|
135
|
+
slotProps: { htmlInput: { "aria-label": "Minimum" } },
|
|
136
|
+
onChange: (e) => s({ rangeMin: e.target.value })
|
|
137
|
+
}),
|
|
138
|
+
/* @__PURE__ */ b("span", {
|
|
139
|
+
"aria-hidden": "true",
|
|
140
|
+
children: "to"
|
|
141
|
+
}),
|
|
142
|
+
/* @__PURE__ */ b(h, {
|
|
143
|
+
className: o.rangeInput,
|
|
144
|
+
size: "small",
|
|
145
|
+
variant: "outlined",
|
|
146
|
+
type: "text",
|
|
147
|
+
placeholder: "Max",
|
|
148
|
+
value: n.rangeMax ?? "",
|
|
149
|
+
slotProps: { htmlInput: { "aria-label": "Maximum" } },
|
|
150
|
+
onChange: (e) => s({ rangeMax: e.target.value })
|
|
151
|
+
})
|
|
152
|
+
] });
|
|
153
|
+
case "gt":
|
|
154
|
+
case "gte": return /* @__PURE__ */ b(h, {
|
|
155
|
+
className: o.rangeInput,
|
|
156
|
+
size: "small",
|
|
157
|
+
variant: "outlined",
|
|
158
|
+
type: "text",
|
|
159
|
+
value: n.rangeMin ?? "",
|
|
160
|
+
slotProps: { htmlInput: { "aria-label": "Value" } },
|
|
161
|
+
onChange: (e) => s({ rangeMin: e.target.value })
|
|
162
|
+
});
|
|
163
|
+
case "lt":
|
|
164
|
+
case "lte": return /* @__PURE__ */ b(h, {
|
|
165
|
+
className: o.rangeInput,
|
|
166
|
+
size: "small",
|
|
167
|
+
variant: "outlined",
|
|
168
|
+
type: "text",
|
|
169
|
+
value: n.rangeMax ?? "",
|
|
170
|
+
slotProps: { htmlInput: { "aria-label": "Value" } },
|
|
171
|
+
onChange: (e) => s({ rangeMax: e.target.value })
|
|
172
|
+
});
|
|
173
|
+
case "equal":
|
|
174
|
+
case "not_equal": return r === "boolean" ? /* @__PURE__ */ x(_, {
|
|
175
|
+
className: o.pillGroup,
|
|
176
|
+
exclusive: !0,
|
|
177
|
+
value: n.values[0] ?? null,
|
|
178
|
+
onChange: (e, t) => {
|
|
179
|
+
s({ values: t == null ? [] : [t] });
|
|
180
|
+
},
|
|
181
|
+
"aria-label": "Boolean value",
|
|
182
|
+
children: [/* @__PURE__ */ b(g, {
|
|
183
|
+
value: "true",
|
|
184
|
+
children: "Yes"
|
|
185
|
+
}), /* @__PURE__ */ b(g, {
|
|
186
|
+
value: "false",
|
|
187
|
+
children: "No"
|
|
188
|
+
})]
|
|
189
|
+
}) : /* @__PURE__ */ b(h, {
|
|
190
|
+
className: o.textInput,
|
|
191
|
+
size: "small",
|
|
192
|
+
variant: "outlined",
|
|
193
|
+
value: n.values[0] ?? "",
|
|
194
|
+
slotProps: { htmlInput: { "aria-label": "Value" } },
|
|
195
|
+
onChange: (e) => s({ values: [e.target.value] })
|
|
196
|
+
});
|
|
197
|
+
case "contains":
|
|
198
|
+
case "starts_with":
|
|
199
|
+
case "ends_with":
|
|
200
|
+
case "is_exactly": return /* @__PURE__ */ b(h, {
|
|
201
|
+
className: o.textInput,
|
|
202
|
+
size: "small",
|
|
203
|
+
variant: "outlined",
|
|
204
|
+
value: n.text ?? "",
|
|
205
|
+
slotProps: { htmlInput: { "aria-label": "Value" } },
|
|
206
|
+
onChange: (e) => s({ text: e.target.value })
|
|
207
|
+
});
|
|
208
|
+
default: return null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
var E = 40;
|
|
212
|
+
function D(e) {
|
|
213
|
+
let { facetValues: t, selectedValues: n, onChange: r } = e, [a, s] = l(""), u = t.length > E, d = c(() => [...t].sort((e, t) => i(e).localeCompare(i(t), void 0, { sensitivity: "base" })), [t]), f = c(() => {
|
|
214
|
+
if (!u || a.trim() === "") return d;
|
|
215
|
+
let e = a.trim().toLowerCase();
|
|
216
|
+
return d.filter((t) => i(t).toLowerCase().includes(e));
|
|
217
|
+
}, [
|
|
218
|
+
d,
|
|
219
|
+
a,
|
|
220
|
+
u
|
|
221
|
+
]);
|
|
222
|
+
return /* @__PURE__ */ x("div", {
|
|
223
|
+
className: o.pillGroupContainer,
|
|
224
|
+
children: [u && /* @__PURE__ */ b(h, {
|
|
225
|
+
className: o.pillFilter,
|
|
226
|
+
size: "small",
|
|
227
|
+
variant: "outlined",
|
|
228
|
+
placeholder: `Filter ${t.length} values…`,
|
|
229
|
+
value: a,
|
|
230
|
+
onChange: (e) => s(e.target.value),
|
|
231
|
+
slotProps: { htmlInput: { "aria-label": "Filter values" } }
|
|
232
|
+
}), /* @__PURE__ */ b("div", {
|
|
233
|
+
className: o.pillGroupScroll,
|
|
234
|
+
children: /* @__PURE__ */ b(_, {
|
|
235
|
+
className: o.pillGroup,
|
|
236
|
+
value: n,
|
|
237
|
+
onChange: (e, t) => r(t),
|
|
238
|
+
"aria-label": "Selected values",
|
|
239
|
+
children: f.map((e) => /* @__PURE__ */ b(g, {
|
|
240
|
+
value: e,
|
|
241
|
+
children: i(e)
|
|
242
|
+
}, e))
|
|
243
|
+
})
|
|
244
|
+
})]
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
function O(e, t) {
|
|
248
|
+
let n = e.find((e) => e.columnName === t);
|
|
249
|
+
return n == null ? [] : n.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnResultValues" ? n.facetValues.map((e) => e.value) : [];
|
|
250
|
+
}
|
|
251
|
+
function k(e, t) {
|
|
252
|
+
return e.some((e) => e.columnName === t && e.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnResultValues");
|
|
253
|
+
}
|
|
254
|
+
//#endregion
|
|
255
|
+
export { w as FilterConditionRow };
|
|
256
|
+
|
|
257
|
+
//# sourceMappingURL=FilterConditionRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterConditionRow.js","names":[],"sources":["../../../src/components/QueryBuilder/FilterConditionRow.tsx"],"sourcesContent":["import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'\nimport DragIndicatorIcon from '@mui/icons-material/DragIndicator'\nimport {\n Autocomplete,\n IconButton,\n InputLabel,\n MenuItem,\n Select,\n TextField,\n ToggleButton,\n ToggleButtonGroup,\n Tooltip,\n} from '@mui/material'\nimport { ColumnModel } from '@sage-bionetworks/synapse-types'\nimport { useMemo, useState } from 'react'\nimport { splitAndTrim } from '../../utils/functions/StringUtils'\nimport { useQueryBuilderInternalContext } from './QueryBuilderInternalContext'\nimport {\n availableOpsForKind,\n classifyColumn,\n labelForFacetValue,\n labelForOp,\n QBColumnKind,\n} from './queryBuilderMetadata'\nimport styles from './FilterConditionRow.module.scss'\nimport { defaultOpForColumnType } from './queryBuilderOperations'\nimport { QBCondition, QBConditionOp } from './QueryBuilderTypes'\n\nexport type FilterConditionRowProps = {\n condition: QBCondition\n}\n\nexport function FilterConditionRow(props: FilterConditionRowProps) {\n const { condition } = props\n const {\n columnModels,\n facetResults,\n onlyFacetedColumns,\n getColumnDisplayName,\n updateConditionAt,\n removeConditionAt,\n } = useQueryBuilderInternalContext()\n\n const facetColumnNames = useMemo(\n () =>\n new Set(\n facetResults\n .filter(\n f =>\n f.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnResultValues',\n )\n .map(f => f.columnName),\n ),\n [facetResults],\n )\n\n const propertyOptions = useMemo(() => {\n const source = onlyFacetedColumns\n ? columnModels.filter(cm => facetColumnNames.has(cm.name))\n : columnModels\n return source.map(cm => ({\n name: cm.name,\n columnType: cm.columnType as string,\n label: getColumnDisplayName(cm.name),\n }))\n }, [columnModels, facetColumnNames, onlyFacetedColumns, getColumnDisplayName])\n\n const selectedOption =\n propertyOptions.find(opt => opt.name === condition.columnName) ?? null\n\n const hasFacet =\n condition.columnName != null && facetColumnNames.has(condition.columnName)\n const columnKind = classifyColumn(condition.columnType, hasFacet)\n const availableOps = availableOpsForKind(columnKind)\n\n const operatorLabelId = `qb-op-label-${condition.id}`\n\n return (\n <div\n className={styles.row}\n role=\"group\"\n aria-label={`Filter condition${condition.columnName ? ` on ${condition.columnName}` : ''}`}\n data-qb-node-id={condition.id}\n >\n <Tooltip title=\"Drag to reorder\">\n <IconButton\n size=\"small\"\n className={styles.dragHandle}\n aria-label=\"Drag to reorder condition\"\n >\n <DragIndicatorIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n\n <Tooltip title=\"Remove condition\">\n <IconButton\n size=\"small\"\n className={styles.remove}\n aria-label=\"Remove condition\"\n onClick={() => removeConditionAt(condition.id)}\n >\n <DeleteOutlineIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n\n <Autocomplete\n className={styles.propertyPicker}\n size=\"small\"\n options={propertyOptions}\n getOptionLabel={opt => opt.label}\n isOptionEqualToValue={(a, b) => a.name === b.name}\n value={selectedOption}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n placeholder=\"Select property…\"\n inputProps={{ ...params.inputProps, 'aria-label': 'Property' }}\n />\n )}\n onChange={(_event, value) => {\n if (value == null) return\n // Pick a default op that matches the new column's kind (so a\n // faceted column shifts the row into pill-picker mode, a numeric\n // column into range mode, etc.). Fall back to the raw columnType\n // default if the kind has no ops.\n const nextKind = classifyColumn(\n value.columnType,\n hasFacetForColumnName(facetResults, value.name),\n )\n const opsForKind = availableOpsForKind(nextKind)\n const nextOp =\n opsForKind.length > 0\n ? opsForKind[0]\n : defaultOpForColumnType(value.columnType)\n updateConditionAt(condition.id, {\n columnName: value.name,\n columnType: value.columnType,\n op: nextOp,\n values: [],\n rangeMin: null,\n rangeMax: null,\n text: null,\n })\n }}\n />\n\n {availableOps.length > 0 && (\n <>\n <InputLabel id={operatorLabelId} sx={{ display: 'none' }}>\n Operator\n </InputLabel>\n <Select\n className={styles.operatorPicker}\n size=\"small\"\n labelId={operatorLabelId}\n variant=\"outlined\"\n value={\n availableOps.includes(condition.op)\n ? condition.op\n : availableOps[0]\n }\n onChange={event => {\n const nextOp = event.target.value as QBConditionOp\n updateConditionAt(condition.id, { op: nextOp })\n }}\n aria-label=\"Operator\"\n >\n {availableOps.map(op => (\n <MenuItem key={op} value={op}>\n {labelForOp(op)}\n </MenuItem>\n ))}\n </Select>\n </>\n )}\n\n <ValueInput\n condition={condition}\n columnKind={columnKind}\n hasFacet={hasFacet}\n columnModels={columnModels}\n facetValues={\n hasFacet && condition.columnName != null\n ? findFacetValues(facetResults, condition.columnName)\n : []\n }\n onChange={patch => updateConditionAt(condition.id, patch)}\n />\n </div>\n )\n}\n\ntype ValueInputProps = {\n condition: QBCondition\n columnKind: QBColumnKind\n hasFacet: boolean\n columnModels: ColumnModel[]\n facetValues: string[]\n onChange: (patch: Partial<Omit<QBCondition, 'kind' | 'id'>>) => void\n}\n\nfunction ValueInput(props: ValueInputProps) {\n const { condition, columnKind, hasFacet, facetValues, onChange } = props\n const { op } = condition\n\n // Presence operators have no input at all.\n if (op === 'has_value' || op === 'no_value') return null\n\n switch (op) {\n case 'is_any_of':\n case 'is_all_of':\n if ((columnKind === 'enum' || columnKind === 'list') && hasFacet) {\n return (\n <FacetPillGroup\n facetValues={facetValues}\n selectedValues={condition.values}\n onChange={next => onChange({ values: next })}\n />\n )\n }\n return (\n <TextField\n className={styles.textInput}\n size=\"small\"\n variant=\"outlined\"\n placeholder=\"Comma-separated values\"\n value={condition.values.join(', ')}\n slotProps={{ htmlInput: { 'aria-label': 'Values' } }}\n onChange={event =>\n onChange({ values: splitAndTrim(event.target.value) })\n }\n />\n )\n case 'between':\n return (\n <>\n <TextField\n className={styles.rangeInput}\n size=\"small\"\n variant=\"outlined\"\n type=\"text\"\n placeholder=\"Min\"\n value={condition.rangeMin ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Minimum' } }}\n onChange={event => onChange({ rangeMin: event.target.value })}\n />\n <span aria-hidden=\"true\">to</span>\n <TextField\n className={styles.rangeInput}\n size=\"small\"\n variant=\"outlined\"\n type=\"text\"\n placeholder=\"Max\"\n value={condition.rangeMax ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Maximum' } }}\n onChange={event => onChange({ rangeMax: event.target.value })}\n />\n </>\n )\n case 'gt':\n case 'gte':\n return (\n <TextField\n className={styles.rangeInput}\n size=\"small\"\n variant=\"outlined\"\n type=\"text\"\n value={condition.rangeMin ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Value' } }}\n onChange={event => onChange({ rangeMin: event.target.value })}\n />\n )\n case 'lt':\n case 'lte':\n return (\n <TextField\n className={styles.rangeInput}\n size=\"small\"\n variant=\"outlined\"\n type=\"text\"\n value={condition.rangeMax ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Value' } }}\n onChange={event => onChange({ rangeMax: event.target.value })}\n />\n )\n case 'equal':\n case 'not_equal':\n if (columnKind === 'boolean') {\n return (\n <ToggleButtonGroup\n className={styles.pillGroup}\n exclusive\n value={condition.values[0] ?? null}\n onChange={(_event, next: string | null) => {\n onChange({ values: next == null ? [] : [next] })\n }}\n aria-label=\"Boolean value\"\n >\n <ToggleButton value=\"true\">Yes</ToggleButton>\n <ToggleButton value=\"false\">No</ToggleButton>\n </ToggleButtonGroup>\n )\n }\n return (\n <TextField\n className={styles.textInput}\n size=\"small\"\n variant=\"outlined\"\n value={condition.values[0] ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Value' } }}\n onChange={event => onChange({ values: [event.target.value] })}\n />\n )\n case 'contains':\n case 'starts_with':\n case 'ends_with':\n case 'is_exactly':\n return (\n <TextField\n className={styles.textInput}\n size=\"small\"\n variant=\"outlined\"\n value={condition.text ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Value' } }}\n onChange={event => onChange({ text: event.target.value })}\n />\n )\n default:\n op satisfies never\n return null\n }\n}\n\ntype FacetPillGroupProps = {\n facetValues: string[]\n selectedValues: string[]\n onChange: (next: string[]) => void\n}\n\n// Above this many pills we show a text filter above the group.\nconst PILL_FILTER_THRESHOLD = 40\n\nfunction FacetPillGroup(props: FacetPillGroupProps) {\n const { facetValues, selectedValues, onChange } = props\n const [filter, setFilter] = useState('')\n const showFilter = facetValues.length > PILL_FILTER_THRESHOLD\n\n // Sort alphabetically by the user-facing label so the pill order is\n // predictable regardless of the backend's facet-result ordering.\n const sortedValues = useMemo(() => {\n return [...facetValues].sort((a, b) =>\n labelForFacetValue(a).localeCompare(labelForFacetValue(b), undefined, {\n sensitivity: 'base',\n }),\n )\n }, [facetValues])\n\n const visibleValues = useMemo(() => {\n if (!showFilter || filter.trim() === '') return sortedValues\n const q = filter.trim().toLowerCase()\n return sortedValues.filter(v =>\n labelForFacetValue(v).toLowerCase().includes(q),\n )\n }, [sortedValues, filter, showFilter])\n\n return (\n <div className={styles.pillGroupContainer}>\n {showFilter && (\n <TextField\n className={styles.pillFilter}\n size=\"small\"\n variant=\"outlined\"\n placeholder={`Filter ${facetValues.length} values…`}\n value={filter}\n onChange={event => setFilter(event.target.value)}\n slotProps={{ htmlInput: { 'aria-label': 'Filter values' } }}\n />\n )}\n <div className={styles.pillGroupScroll}>\n <ToggleButtonGroup\n className={styles.pillGroup}\n value={selectedValues}\n onChange={(_event, next: string[]) => onChange(next)}\n aria-label=\"Selected values\"\n >\n {visibleValues.map(value => (\n <ToggleButton key={value} value={value}>\n {labelForFacetValue(value)}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n </div>\n </div>\n )\n}\n\nfunction findFacetValues(\n facetResults: readonly ReturnType<\n typeof useQueryBuilderInternalContext\n >['facetResults'][number][],\n columnName: string,\n): string[] {\n const match = facetResults.find(f => f.columnName === columnName)\n if (match == null) return []\n if (\n match.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnResultValues'\n ) {\n return match.facetValues.map(v => v.value)\n }\n return []\n}\n\nfunction hasFacetForColumnName(\n facetResults: readonly ReturnType<\n typeof useQueryBuilderInternalContext\n >['facetResults'][number][],\n columnName: string,\n): boolean {\n return facetResults.some(\n f =>\n f.columnName === columnName &&\n f.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnResultValues',\n )\n}\n"],"mappings":";;;;;;;;;;;AAgCA,SAAgB,EAAmB,GAAgC;CACjE,IAAM,EAAE,iBAAc,GAChB,EACJ,iBACA,iBACA,uBACA,yBACA,sBACA,yBACE,EAA+B,GAE7B,IAAmB,QAErB,IAAI,IACF,EACG,QACC,MACE,EAAE,iBACF,8DACJ,EACC,KAAI,MAAK,EAAE,UAAU,CAC1B,GACF,CAAC,CAAY,CACf,GAEM,IAAkB,SACP,IACX,EAAa,QAAO,MAAM,EAAiB,IAAI,EAAG,IAAI,CAAC,IACvD,GACU,KAAI,OAAO;EACvB,MAAM,EAAG;EACT,YAAY,EAAG;EACf,OAAO,EAAqB,EAAG,IAAI;CACrC,EAAE,GACD;EAAC;EAAc;EAAkB;EAAoB;CAAoB,CAAC,GAEvE,IACJ,EAAgB,MAAK,MAAO,EAAI,SAAS,EAAU,UAAU,KAAK,MAE9D,IACJ,EAAU,cAAc,QAAQ,EAAiB,IAAI,EAAU,UAAU,GACrE,IAAa,EAAe,EAAU,YAAY,CAAQ,GAC1D,IAAe,EAAoB,CAAU,GAE7C,IAAkB,eAAe,EAAU;CAEjD,OACE,kBAAC,OAAD;EACE,WAAW,EAAO;EAClB,MAAK;EACL,cAAY,mBAAmB,EAAU,aAAa,OAAO,EAAU,eAAe;EACtF,mBAAiB,EAAU;YAJ7B;GAME,kBAAC,GAAD;IAAS,OAAM;cACb,kBAAC,GAAD;KACE,MAAK;KACL,WAAW,EAAO;KAClB,cAAW;eAEX,kBAAC,GAAD,EAAmB,UAAS,QAAS,CAAA;IAC3B,CAAA;GACL,CAAA;GAET,kBAAC,GAAD;IAAS,OAAM;cACb,kBAAC,GAAD;KACE,MAAK;KACL,WAAW,EAAO;KAClB,cAAW;KACX,eAAe,EAAkB,EAAU,EAAE;eAE7C,kBAAC,GAAD,EAAmB,UAAS,QAAS,CAAA;IAC3B,CAAA;GACL,CAAA;GAET,kBAAC,GAAD;IACE,WAAW,EAAO;IAClB,MAAK;IACL,SAAS;IACT,iBAAgB,MAAO,EAAI;IAC3B,uBAAuB,GAAG,MAAM,EAAE,SAAS,EAAE;IAC7C,OAAO;IACP,cAAa,MACX,kBAAC,GAAD;KACE,GAAI;KACJ,SAAQ;KACR,aAAY;KACZ,YAAY;MAAE,GAAG,EAAO;MAAY,cAAc;KAAW;IAC9D,CAAA;IAEH,WAAW,GAAQ,MAAU;KAC3B,IAAI,KAAS,MAAM;KASnB,IAAM,IAAa,EAJF,EACf,EAAM,YACN,EAAsB,GAAc,EAAM,IAAI,CAET,CAAQ,GACzC,IACJ,EAAW,SAAS,IAChB,EAAW,KACX,EAAuB,EAAM,UAAU;KAC7C,EAAkB,EAAU,IAAI;MAC9B,YAAY,EAAM;MAClB,YAAY,EAAM;MAClB,IAAI;MACJ,QAAQ,CAAC;MACT,UAAU;MACV,UAAU;MACV,MAAM;KACR,CAAC;IACH;GACD,CAAA;GAEA,EAAa,SAAS,KACrB,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;IAAY,IAAI;IAAiB,IAAI,EAAE,SAAS,OAAO;cAAG;GAE9C,CAAA,GACZ,kBAAC,GAAD;IACE,WAAW,EAAO;IAClB,MAAK;IACL,SAAS;IACT,SAAQ;IACR,OACE,EAAa,SAAS,EAAU,EAAE,IAC9B,EAAU,KACV,EAAa;IAEnB,WAAU,MAAS;KACjB,IAAM,IAAS,EAAM,OAAO;KAC5B,EAAkB,EAAU,IAAI,EAAE,IAAI,EAAO,CAAC;IAChD;IACA,cAAW;cAEV,EAAa,KAAI,MAChB,kBAAC,GAAD;KAAmB,OAAO;eACvB,EAAW,CAAE;IACN,GAFK,CAEL,CACX;GACK,CAAA,CACR,EAAA,CAAA;GAGJ,kBAAC,GAAD;IACa;IACC;IACF;IACI;IACd,aACE,KAAY,EAAU,cAAc,OAChC,EAAgB,GAAc,EAAU,UAAU,IAClD,CAAC;IAEP,WAAU,MAAS,EAAkB,EAAU,IAAI,CAAK;GACzD,CAAA;EACE;;AAET;AAWA,SAAS,EAAW,GAAwB;CAC1C,IAAM,EAAE,cAAW,eAAY,aAAU,gBAAa,gBAAa,GAC7D,EAAE,UAAO;CAGf,IAAI,MAAO,eAAe,MAAO,YAAY,OAAO;CAEpD,QAAQ,GAAR;EACE,KAAK;EACL,KAAK,aAUH,QATK,MAAe,UAAU,MAAe,WAAW,IAEpD,kBAAC,GAAD;GACe;GACb,gBAAgB,EAAU;GAC1B,WAAU,MAAQ,EAAS,EAAE,QAAQ,EAAK,CAAC;EAC5C,CAAA,IAIH,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,MAAK;GACL,SAAQ;GACR,aAAY;GACZ,OAAO,EAAU,OAAO,KAAK,IAAI;GACjC,WAAW,EAAE,WAAW,EAAE,cAAc,SAAS,EAAE;GACnD,WAAU,MACR,EAAS,EAAE,QAAQ,EAAa,EAAM,OAAO,KAAK,EAAE,CAAC;EAExD,CAAA;EAEL,KAAK,WACH,OACE,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD;IACE,WAAW,EAAO;IAClB,MAAK;IACL,SAAQ;IACR,MAAK;IACL,aAAY;IACZ,OAAO,EAAU,YAAY;IAC7B,WAAW,EAAE,WAAW,EAAE,cAAc,UAAU,EAAE;IACpD,WAAU,MAAS,EAAS,EAAE,UAAU,EAAM,OAAO,MAAM,CAAC;GAC7D,CAAA;GACD,kBAAC,QAAD;IAAM,eAAY;cAAO;GAAQ,CAAA;GACjC,kBAAC,GAAD;IACE,WAAW,EAAO;IAClB,MAAK;IACL,SAAQ;IACR,MAAK;IACL,aAAY;IACZ,OAAO,EAAU,YAAY;IAC7B,WAAW,EAAE,WAAW,EAAE,cAAc,UAAU,EAAE;IACpD,WAAU,MAAS,EAAS,EAAE,UAAU,EAAM,OAAO,MAAM,CAAC;GAC7D,CAAA;EACD,EAAA,CAAA;EAEN,KAAK;EACL,KAAK,OACH,OACE,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,MAAK;GACL,SAAQ;GACR,MAAK;GACL,OAAO,EAAU,YAAY;GAC7B,WAAW,EAAE,WAAW,EAAE,cAAc,QAAQ,EAAE;GAClD,WAAU,MAAS,EAAS,EAAE,UAAU,EAAM,OAAO,MAAM,CAAC;EAC7D,CAAA;EAEL,KAAK;EACL,KAAK,OACH,OACE,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,MAAK;GACL,SAAQ;GACR,MAAK;GACL,OAAO,EAAU,YAAY;GAC7B,WAAW,EAAE,WAAW,EAAE,cAAc,QAAQ,EAAE;GAClD,WAAU,MAAS,EAAS,EAAE,UAAU,EAAM,OAAO,MAAM,CAAC;EAC7D,CAAA;EAEL,KAAK;EACL,KAAK,aAiBH,OAhBI,MAAe,YAEf,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,WAAA;GACA,OAAO,EAAU,OAAO,MAAM;GAC9B,WAAW,GAAQ,MAAwB;IACzC,EAAS,EAAE,QAAQ,KAAQ,OAAO,CAAC,IAAI,CAAC,CAAI,EAAE,CAAC;GACjD;GACA,cAAW;aAPb,CASE,kBAAC,GAAD;IAAc,OAAM;cAAO;GAAiB,CAAA,GAC5C,kBAAC,GAAD;IAAc,OAAM;cAAQ;GAAgB,CAAA,CAC3B;OAIrB,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,MAAK;GACL,SAAQ;GACR,OAAO,EAAU,OAAO,MAAM;GAC9B,WAAW,EAAE,WAAW,EAAE,cAAc,QAAQ,EAAE;GAClD,WAAU,MAAS,EAAS,EAAE,QAAQ,CAAC,EAAM,OAAO,KAAK,EAAE,CAAC;EAC7D,CAAA;EAEL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,cACH,OACE,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,MAAK;GACL,SAAQ;GACR,OAAO,EAAU,QAAQ;GACzB,WAAW,EAAE,WAAW,EAAE,cAAc,QAAQ,EAAE;GAClD,WAAU,MAAS,EAAS,EAAE,MAAM,EAAM,OAAO,MAAM,CAAC;EACzD,CAAA;EAEL,SAEE,OAAO;CACX;AACF;AASA,IAAM,IAAwB;AAE9B,SAAS,EAAe,GAA4B;CAClD,IAAM,EAAE,gBAAa,mBAAgB,gBAAa,GAC5C,CAAC,GAAQ,KAAa,EAAS,EAAE,GACjC,IAAa,EAAY,SAAS,GAIlC,IAAe,QACZ,CAAC,GAAG,CAAW,EAAE,MAAM,GAAG,MAC/B,EAAmB,CAAC,EAAE,cAAc,EAAmB,CAAC,GAAG,KAAA,GAAW,EACpE,aAAa,OACf,CAAC,CACH,GACC,CAAC,CAAW,CAAC,GAEV,IAAgB,QAAc;EAClC,IAAI,CAAC,KAAc,EAAO,KAAK,MAAM,IAAI,OAAO;EAChD,IAAM,IAAI,EAAO,KAAK,EAAE,YAAY;EACpC,OAAO,EAAa,QAAO,MACzB,EAAmB,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,CAChD;CACF,GAAG;EAAC;EAAc;EAAQ;CAAU,CAAC;CAErC,OACE,kBAAC,OAAD;EAAK,WAAW,EAAO;YAAvB,CACG,KACC,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,MAAK;GACL,SAAQ;GACR,aAAa,UAAU,EAAY,OAAO;GAC1C,OAAO;GACP,WAAU,MAAS,EAAU,EAAM,OAAO,KAAK;GAC/C,WAAW,EAAE,WAAW,EAAE,cAAc,gBAAgB,EAAE;EAC3D,CAAA,GAEH,kBAAC,OAAD;GAAK,WAAW,EAAO;aACrB,kBAAC,GAAD;IACE,WAAW,EAAO;IAClB,OAAO;IACP,WAAW,GAAQ,MAAmB,EAAS,CAAI;IACnD,cAAW;cAEV,EAAc,KAAI,MACjB,kBAAC,GAAD;KAAiC;eAC9B,EAAmB,CAAK;IACb,GAFK,CAEL,CACf;GACgB,CAAA;EAChB,CAAA,CACF;;AAET;AAEA,SAAS,EACP,GAGA,GACU;CACV,IAAM,IAAQ,EAAa,MAAK,MAAK,EAAE,eAAe,CAAU;CAQhE,OAPI,KAAS,OAAa,CAAC,IAEzB,EAAM,iBACN,iEAEO,EAAM,YAAY,KAAI,MAAK,EAAE,KAAK,IAEpC,CAAC;AACV;AAEA,SAAS,EACP,GAGA,GACS;CACT,OAAO,EAAa,MAClB,MACE,EAAE,eAAe,KACjB,EAAE,iBACA,8DACN;AACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import './FilterConditionRow.css';var e = {
|
|
2
|
+
row: "_row_t1xbt_1",
|
|
3
|
+
dragHandle: "_dragHandle_t1xbt_10",
|
|
4
|
+
remove: "_remove_t1xbt_15",
|
|
5
|
+
propertyPicker: "_propertyPicker_t1xbt_27",
|
|
6
|
+
operatorPicker: "_operatorPicker_t1xbt_28",
|
|
7
|
+
rangeInput: "_rangeInput_t1xbt_29",
|
|
8
|
+
textInput: "_textInput_t1xbt_30",
|
|
9
|
+
pillGroupContainer: "_pillGroupContainer_t1xbt_51",
|
|
10
|
+
pillFilter: "_pillFilter_t1xbt_59",
|
|
11
|
+
pillGroupScroll: "_pillGroupScroll_t1xbt_63",
|
|
12
|
+
pillGroup: "_pillGroup_t1xbt_51"
|
|
13
|
+
};
|
|
14
|
+
//#endregion
|
|
15
|
+
export { e as default };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=FilterConditionRow.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterConditionRow.module.js","names":[],"sources":["../../../src/components/QueryBuilder/FilterConditionRow.module.scss"],"sourcesContent":[".row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n min-height: 30px;\n\n // Value pills adopt the parent group's accent — parent sets `--qb-pill-color`\n // as inline style on its wrapper (see FilterGroupNode).\n --qb-pill-color: var(--synapse-primary-action-color);\n}\n\n.dragHandle {\n cursor: grab;\n color: var(--synapse-gray-deemphasized);\n}\n\n.remove {\n color: var(--synapse-gray-600) !important;\n border: 1px solid var(--synapse-border-color-gray);\n border-radius: 4px !important;\n padding: 4px !important;\n\n &:hover {\n color: var(--synapse-error);\n border-color: var(--synapse-error);\n background-color: transparent !important;\n }\n}\n\n// Match the field heights across the row so Property, Operator, and value\n// inputs all sit on the same baseline. Outlined inputs get consistent\n// padding via MUI defaults; we just fix the height and widths.\n.propertyPicker,\n.operatorPicker,\n.rangeInput,\n.textInput {\n :global(.MuiOutlinedInput-root) {\n height: 36px;\n font-size: 14px;\n }\n}\n\n.propertyPicker {\n min-width: 200px;\n}\n\n.operatorPicker {\n min-width: 120px;\n}\n\n.rangeInput {\n width: 120px;\n}\n\n.textInput {\n min-width: 200px;\n}\n\n.pillGroupContainer {\n display: flex;\n flex-direction: column;\n gap: 6px;\n flex: 1;\n min-width: 0;\n}\n\n.pillFilter {\n max-width: 260px;\n}\n\n.pillGroupScroll {\n max-height: 120px;\n overflow-y: auto;\n}\n\n.pillGroup {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n\n // MUI's ToggleButtonGroup uses `:not(:first-of-type)` rules to collapse\n // grouped buttons into an attached pill bar. `!important` is the pragmatic\n // way to undo that; otherwise our pills have flat left edges and negative\n // margins.\n :global(.MuiToggleButton-root),\n :global(.MuiToggleButtonGroup-grouped) {\n text-transform: none;\n padding: 2px 12px;\n border-radius: 999px !important;\n border: 1px solid var(--synapse-gray-dark) !important;\n margin: 0 !important;\n font-size: 13px;\n line-height: 1.4;\n }\n\n :global(.MuiToggleButton-root.Mui-selected) {\n background-color: var(--qb-pill-color);\n color: white;\n border-color: var(--qb-pill-color);\n }\n\n :global(.MuiToggleButton-root.Mui-selected:hover) {\n background-color: var(--qb-pill-color);\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
.row {
|
|
2
|
+
display: flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
gap: 8px;
|
|
5
|
+
padding: 4px 0;
|
|
6
|
+
min-height: 30px;
|
|
7
|
+
|
|
8
|
+
// Value pills adopt the parent group's accent — parent sets `--qb-pill-color`
|
|
9
|
+
// as inline style on its wrapper (see FilterGroupNode).
|
|
10
|
+
--qb-pill-color: var(--synapse-primary-action-color);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.dragHandle {
|
|
14
|
+
cursor: grab;
|
|
15
|
+
color: var(--synapse-gray-deemphasized);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.remove {
|
|
19
|
+
color: var(--synapse-gray-600) !important;
|
|
20
|
+
border: 1px solid var(--synapse-border-color-gray);
|
|
21
|
+
border-radius: 4px !important;
|
|
22
|
+
padding: 4px !important;
|
|
23
|
+
|
|
24
|
+
&:hover {
|
|
25
|
+
color: var(--synapse-error);
|
|
26
|
+
border-color: var(--synapse-error);
|
|
27
|
+
background-color: transparent !important;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Match the field heights across the row so Property, Operator, and value
|
|
32
|
+
// inputs all sit on the same baseline. Outlined inputs get consistent
|
|
33
|
+
// padding via MUI defaults; we just fix the height and widths.
|
|
34
|
+
.propertyPicker,
|
|
35
|
+
.operatorPicker,
|
|
36
|
+
.rangeInput,
|
|
37
|
+
.textInput {
|
|
38
|
+
:global(.MuiOutlinedInput-root) {
|
|
39
|
+
height: 36px;
|
|
40
|
+
font-size: 14px;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.propertyPicker {
|
|
45
|
+
min-width: 200px;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.operatorPicker {
|
|
49
|
+
min-width: 120px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.rangeInput {
|
|
53
|
+
width: 120px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.textInput {
|
|
57
|
+
min-width: 200px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.pillGroupContainer {
|
|
61
|
+
display: flex;
|
|
62
|
+
flex-direction: column;
|
|
63
|
+
gap: 6px;
|
|
64
|
+
flex: 1;
|
|
65
|
+
min-width: 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.pillFilter {
|
|
69
|
+
max-width: 260px;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.pillGroupScroll {
|
|
73
|
+
max-height: 120px;
|
|
74
|
+
overflow-y: auto;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.pillGroup {
|
|
78
|
+
display: flex;
|
|
79
|
+
flex-wrap: wrap;
|
|
80
|
+
gap: 6px;
|
|
81
|
+
|
|
82
|
+
// MUI's ToggleButtonGroup uses `:not(:first-of-type)` rules to collapse
|
|
83
|
+
// grouped buttons into an attached pill bar. `!important` is the pragmatic
|
|
84
|
+
// way to undo that; otherwise our pills have flat left edges and negative
|
|
85
|
+
// margins.
|
|
86
|
+
:global(.MuiToggleButton-root),
|
|
87
|
+
:global(.MuiToggleButtonGroup-grouped) {
|
|
88
|
+
text-transform: none;
|
|
89
|
+
padding: 2px 12px;
|
|
90
|
+
border-radius: 999px !important;
|
|
91
|
+
border: 1px solid var(--synapse-gray-dark) !important;
|
|
92
|
+
margin: 0 !important;
|
|
93
|
+
font-size: 13px;
|
|
94
|
+
line-height: 1.4;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
:global(.MuiToggleButton-root.Mui-selected) {
|
|
98
|
+
background-color: var(--qb-pill-color);
|
|
99
|
+
color: white;
|
|
100
|
+
border-color: var(--qb-pill-color);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
:global(.MuiToggleButton-root.Mui-selected:hover) {
|
|
104
|
+
background-color: var(--qb-pill-color);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._group_7cqi2_1{border-left:2px solid var(--qb-accent-color,var(--synapse-primary-action-color));border-radius:2px 0 0 2px;padding:8px 0 8px 16px;position:relative}._group_7cqi2_1._nested_7cqi2_7{margin-top:4px;margin-bottom:4px}._header_7cqi2_12{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:4px;display:flex}._combinator_7cqi2_20 .MuiToggleButton-root{text-transform:none;border-color:var(--synapse-gray-dark);min-width:44px;color:var(--synapse-gray-regular);padding:2px 12px;font-weight:700}._combinator_7cqi2_20 .MuiToggleButton-root.Mui-selected{background-color:var(--qb-accent-color,var(--synapse-primary-action-color));color:#fff;border-color:var(--qb-accent-color,var(--synapse-primary-action-color))}._combinator_7cqi2_20 .MuiToggleButton-root.Mui-selected:hover{background-color:var(--qb-accent-color,var(--synapse-primary-action-color))}._notToggle_7cqi2_39{text-transform:none;border-color:var(--synapse-gray-dark);color:var(--synapse-gray-regular);padding:2px 12px;font-size:13px;font-weight:600}._notToggle_7cqi2_39.Mui-selected,._notToggle_7cqi2_39.Mui-selected:hover{background-color:var(--synapse-error);color:#fff;border-color:var(--synapse-error)}._actions_7cqi2_53{align-items:center;gap:4px;margin-left:auto;display:flex}._actionButton_7cqi2_60{text-transform:none;min-width:0;color:var(--synapse-primary-action-color);padding:2px 8px;font-weight:500}._children_7cqi2_68{flex-direction:column;gap:2px;display:flex}._emptyState_7cqi2_74{color:var(--synapse-gray-deemphasized);padding:8px 4px;font-size:13px;font-style:italic}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { QBGroup } from './QueryBuilderTypes';
|
|
2
|
+
export type FilterGroupNodeProps = {
|
|
3
|
+
group: QBGroup;
|
|
4
|
+
isRoot?: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function FilterGroupNode(props: FilterGroupNodeProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=FilterGroupNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterGroupNode.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/FilterGroupNode.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAa,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAExD,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CA0G1D"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { useQueryBuilderInternalContext as e } from "./QueryBuilderInternalContext.js";
|
|
2
|
+
import { isQBGroup as t } from "./QueryBuilderTypes.js";
|
|
3
|
+
import { FilterConditionRow as n } from "./FilterConditionRow.js";
|
|
4
|
+
import r from "./FilterGroupNode.module.js";
|
|
5
|
+
import { Button as i, ToggleButton as a, ToggleButtonGroup as o } from "@mui/material";
|
|
6
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
7
|
+
//#region src/components/QueryBuilder/FilterGroupNode.tsx
|
|
8
|
+
function l(f) {
|
|
9
|
+
let { group: p, isRoot: m = !1 } = f, { addConditionAt: h, addChildGroupAt: g, clearGroupAt: _, updateGroupAt: v, removeGroupAt: y } = e(), b = {
|
|
10
|
+
"--qb-accent-color": u(p),
|
|
11
|
+
"--qb-pill-color": u(p)
|
|
12
|
+
};
|
|
13
|
+
return /* @__PURE__ */ c("div", {
|
|
14
|
+
className: `${r.group} ${m ? "" : r.nested}`,
|
|
15
|
+
style: b,
|
|
16
|
+
role: "group",
|
|
17
|
+
"aria-label": d(p),
|
|
18
|
+
"data-qb-node-id": p.id,
|
|
19
|
+
children: [/* @__PURE__ */ c("div", {
|
|
20
|
+
className: r.header,
|
|
21
|
+
children: [
|
|
22
|
+
/* @__PURE__ */ c(o, {
|
|
23
|
+
size: "small",
|
|
24
|
+
className: r.combinator,
|
|
25
|
+
exclusive: !0,
|
|
26
|
+
value: p.combinator,
|
|
27
|
+
"aria-label": "Boolean combinator",
|
|
28
|
+
onChange: (e, t) => {
|
|
29
|
+
t != null && v(p.id, { combinator: t });
|
|
30
|
+
},
|
|
31
|
+
children: [/* @__PURE__ */ s(a, {
|
|
32
|
+
value: "AND",
|
|
33
|
+
"aria-label": "AND",
|
|
34
|
+
children: "AND"
|
|
35
|
+
}), /* @__PURE__ */ s(a, {
|
|
36
|
+
value: "OR",
|
|
37
|
+
"aria-label": "OR",
|
|
38
|
+
children: "OR"
|
|
39
|
+
})]
|
|
40
|
+
}),
|
|
41
|
+
/* @__PURE__ */ s(a, {
|
|
42
|
+
size: "small",
|
|
43
|
+
value: "not",
|
|
44
|
+
selected: p.not,
|
|
45
|
+
className: r.notToggle,
|
|
46
|
+
"aria-label": "Negate this group",
|
|
47
|
+
"aria-pressed": p.not,
|
|
48
|
+
onChange: () => v(p.id, { not: !p.not }),
|
|
49
|
+
children: "Exclude (NOT)"
|
|
50
|
+
}),
|
|
51
|
+
/* @__PURE__ */ c("div", {
|
|
52
|
+
className: r.actions,
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ s(i, {
|
|
55
|
+
className: r.actionButton,
|
|
56
|
+
size: "small",
|
|
57
|
+
onClick: () => h(p.id),
|
|
58
|
+
children: "+ Condition"
|
|
59
|
+
}),
|
|
60
|
+
/* @__PURE__ */ s(i, {
|
|
61
|
+
className: r.actionButton,
|
|
62
|
+
size: "small",
|
|
63
|
+
onClick: () => g(p.id),
|
|
64
|
+
children: "+ Condition Group"
|
|
65
|
+
}),
|
|
66
|
+
/* @__PURE__ */ s(i, {
|
|
67
|
+
className: r.actionButton,
|
|
68
|
+
size: "small",
|
|
69
|
+
onClick: () => _(p.id),
|
|
70
|
+
disabled: p.children.length === 0,
|
|
71
|
+
children: "Clear"
|
|
72
|
+
}),
|
|
73
|
+
!m && /* @__PURE__ */ s(i, {
|
|
74
|
+
className: r.actionButton,
|
|
75
|
+
size: "small",
|
|
76
|
+
onClick: () => y(p.id),
|
|
77
|
+
children: "Delete Condition Group"
|
|
78
|
+
})
|
|
79
|
+
]
|
|
80
|
+
})
|
|
81
|
+
]
|
|
82
|
+
}), /* @__PURE__ */ s("div", {
|
|
83
|
+
className: r.children,
|
|
84
|
+
children: p.children.length === 0 ? /* @__PURE__ */ s("div", {
|
|
85
|
+
className: r.emptyState,
|
|
86
|
+
children: "No conditions yet, add one above"
|
|
87
|
+
}) : p.children.map((e) => t(e) ? /* @__PURE__ */ s(l, { group: e }, e.id) : /* @__PURE__ */ s(n, { condition: e }, e.id))
|
|
88
|
+
})]
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function u(e) {
|
|
92
|
+
return e.not ? "var(--synapse-error)" : e.combinator === "OR" ? "var(--synapse-warning)" : "var(--synapse-primary-action-color)";
|
|
93
|
+
}
|
|
94
|
+
function d(e) {
|
|
95
|
+
return `${e.not ? "excluded " : ""}${e.combinator} filter group`;
|
|
96
|
+
}
|
|
97
|
+
//#endregion
|
|
98
|
+
export { l as FilterGroupNode };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=FilterGroupNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterGroupNode.js","names":[],"sources":["../../../src/components/QueryBuilder/FilterGroupNode.tsx"],"sourcesContent":["import { Button, ToggleButton, ToggleButtonGroup } from '@mui/material'\nimport { CSSProperties } from 'react'\nimport { FilterConditionRow } from './FilterConditionRow'\nimport styles from './FilterGroupNode.module.scss'\nimport { useQueryBuilderInternalContext } from './QueryBuilderInternalContext'\nimport { isQBGroup, QBGroup } from './QueryBuilderTypes'\n\nexport type FilterGroupNodeProps = {\n group: QBGroup\n isRoot?: boolean\n}\n\nexport function FilterGroupNode(props: FilterGroupNodeProps) {\n const { group, isRoot = false } = props\n const {\n addConditionAt,\n addChildGroupAt,\n clearGroupAt,\n updateGroupAt,\n removeGroupAt,\n } = useQueryBuilderInternalContext()\n\n const style: CSSProperties = {\n ['--qb-accent-color' as string]: accentColorFor(group),\n ['--qb-pill-color' as string]: accentColorFor(group),\n }\n\n return (\n <div\n className={`${styles.group} ${isRoot ? '' : styles.nested}`}\n style={style}\n role=\"group\"\n aria-label={groupAriaLabel(group)}\n data-qb-node-id={group.id}\n >\n <div className={styles.header}>\n <ToggleButtonGroup\n size=\"small\"\n className={styles.combinator}\n exclusive\n value={group.combinator}\n aria-label=\"Boolean combinator\"\n onChange={(_event, next) => {\n if (next == null) return\n updateGroupAt(group.id, { combinator: next })\n }}\n >\n <ToggleButton value=\"AND\" aria-label=\"AND\">\n AND\n </ToggleButton>\n <ToggleButton value=\"OR\" aria-label=\"OR\">\n OR\n </ToggleButton>\n </ToggleButtonGroup>\n\n <ToggleButton\n size=\"small\"\n value=\"not\"\n selected={group.not}\n className={styles.notToggle}\n aria-label=\"Negate this group\"\n aria-pressed={group.not}\n onChange={() => updateGroupAt(group.id, { not: !group.not })}\n >\n Exclude (NOT)\n </ToggleButton>\n\n <div className={styles.actions}>\n <Button\n className={styles.actionButton}\n size=\"small\"\n onClick={() => addConditionAt(group.id)}\n >\n + Condition\n </Button>\n <Button\n className={styles.actionButton}\n size=\"small\"\n onClick={() => addChildGroupAt(group.id)}\n >\n + Condition Group\n </Button>\n <Button\n className={styles.actionButton}\n size=\"small\"\n onClick={() => clearGroupAt(group.id)}\n disabled={group.children.length === 0}\n >\n Clear\n </Button>\n {!isRoot && (\n <Button\n className={styles.actionButton}\n size=\"small\"\n onClick={() => removeGroupAt(group.id)}\n >\n Delete Condition Group\n </Button>\n )}\n </div>\n </div>\n\n <div className={styles.children}>\n {group.children.length === 0 ? (\n <div className={styles.emptyState}>\n No conditions yet, add one above\n </div>\n ) : (\n group.children.map(child => {\n if (isQBGroup(child)) {\n return <FilterGroupNode key={child.id} group={child} />\n }\n return <FilterConditionRow key={child.id} condition={child} />\n })\n )}\n </div>\n </div>\n )\n}\n\nfunction accentColorFor(group: QBGroup): string {\n if (group.not) return 'var(--synapse-error)'\n if (group.combinator === 'OR') return 'var(--synapse-warning)'\n return 'var(--synapse-primary-action-color)'\n}\n\nfunction groupAriaLabel(group: QBGroup): string {\n const modifier = group.not ? 'excluded ' : ''\n return `${modifier}${group.combinator} filter group`\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,EAAgB,GAA6B;CAC3D,IAAM,EAAE,UAAO,YAAS,OAAU,GAC5B,EACJ,mBACA,oBACA,iBACA,kBACA,qBACE,EAA+B,GAE7B,IAAuB;EAC1B,qBAAgC,EAAe,CAAK;EACpD,mBAA8B,EAAe,CAAK;CACrD;CAEA,OACE,kBAAC,OAAD;EACE,WAAW,GAAG,EAAO,MAAM,GAAG,IAAS,KAAK,EAAO;EAC5C;EACP,MAAK;EACL,cAAY,EAAe,CAAK;EAChC,mBAAiB,EAAM;YALzB,CAOE,kBAAC,OAAD;GAAK,WAAW,EAAO;aAAvB;IACE,kBAAC,GAAD;KACE,MAAK;KACL,WAAW,EAAO;KAClB,WAAA;KACA,OAAO,EAAM;KACb,cAAW;KACX,WAAW,GAAQ,MAAS;MACtB,KAAQ,QACZ,EAAc,EAAM,IAAI,EAAE,YAAY,EAAK,CAAC;KAC9C;eATF,CAWE,kBAAC,GAAD;MAAc,OAAM;MAAM,cAAW;gBAAM;KAE7B,CAAA,GACd,kBAAC,GAAD;MAAc,OAAM;MAAK,cAAW;gBAAK;KAE3B,CAAA,CACG;;IAEnB,kBAAC,GAAD;KACE,MAAK;KACL,OAAM;KACN,UAAU,EAAM;KAChB,WAAW,EAAO;KAClB,cAAW;KACX,gBAAc,EAAM;KACpB,gBAAgB,EAAc,EAAM,IAAI,EAAE,KAAK,CAAC,EAAM,IAAI,CAAC;eAC5D;IAEa,CAAA;IAEd,kBAAC,OAAD;KAAK,WAAW,EAAO;eAAvB;MACE,kBAAC,GAAD;OACE,WAAW,EAAO;OAClB,MAAK;OACL,eAAe,EAAe,EAAM,EAAE;iBACvC;MAEO,CAAA;MACR,kBAAC,GAAD;OACE,WAAW,EAAO;OAClB,MAAK;OACL,eAAe,EAAgB,EAAM,EAAE;iBACxC;MAEO,CAAA;MACR,kBAAC,GAAD;OACE,WAAW,EAAO;OAClB,MAAK;OACL,eAAe,EAAa,EAAM,EAAE;OACpC,UAAU,EAAM,SAAS,WAAW;iBACrC;MAEO,CAAA;MACP,CAAC,KACA,kBAAC,GAAD;OACE,WAAW,EAAO;OAClB,MAAK;OACL,eAAe,EAAc,EAAM,EAAE;iBACtC;MAEO,CAAA;KAEP;;GACF;MAEL,kBAAC,OAAD;GAAK,WAAW,EAAO;aACpB,EAAM,SAAS,WAAW,IACzB,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAY;GAE9B,CAAA,IAEL,EAAM,SAAS,KAAI,MACb,EAAU,CAAK,IACV,kBAAC,GAAD,EAAgC,OAAO,EAAQ,GAAzB,EAAM,EAAmB,IAEjD,kBAAC,GAAD,EAAmC,WAAW,EAAQ,GAA7B,EAAM,EAAuB,CAC9D;EAEA,CAAA,CACF;;AAET;AAEA,SAAS,EAAe,GAAwB;CAG9C,OAFI,EAAM,MAAY,yBAClB,EAAM,eAAe,OAAa,2BAC/B;AACT;AAEA,SAAS,EAAe,GAAwB;CAE9C,OAAO,GADU,EAAM,MAAM,cAAc,KACtB,EAAM,WAAW;AACxC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import './FilterGroupNode.css';var e = {
|
|
2
|
+
group: "_group_7cqi2_1",
|
|
3
|
+
nested: "_nested_7cqi2_7",
|
|
4
|
+
header: "_header_7cqi2_12",
|
|
5
|
+
combinator: "_combinator_7cqi2_20",
|
|
6
|
+
notToggle: "_notToggle_7cqi2_39",
|
|
7
|
+
actions: "_actions_7cqi2_53",
|
|
8
|
+
actionButton: "_actionButton_7cqi2_60",
|
|
9
|
+
children: "_children_7cqi2_68",
|
|
10
|
+
emptyState: "_emptyState_7cqi2_74"
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { e as default };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=FilterGroupNode.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterGroupNode.module.js","names":[],"sources":["../../../src/components/QueryBuilder/FilterGroupNode.module.scss"],"sourcesContent":[".group {\n position: relative;\n padding: 8px 0 8px 16px;\n border-left: 2px solid\n var(--qb-accent-color, var(--synapse-primary-action-color));\n border-radius: 2px 0 0 2px;\n\n &.nested {\n margin-top: 4px;\n margin-bottom: 4px;\n }\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n margin-bottom: 4px;\n}\n\n.combinator :global(.MuiToggleButton-root) {\n text-transform: none;\n padding: 2px 12px;\n min-width: 44px;\n font-weight: 700;\n border-color: var(--synapse-gray-dark);\n color: var(--synapse-gray-regular);\n}\n\n.combinator :global(.MuiToggleButton-root.Mui-selected) {\n background-color: var(--qb-accent-color, var(--synapse-primary-action-color));\n color: white;\n border-color: var(--qb-accent-color, var(--synapse-primary-action-color));\n}\n\n.combinator :global(.MuiToggleButton-root.Mui-selected:hover) {\n background-color: var(--qb-accent-color, var(--synapse-primary-action-color));\n}\n\n.notToggle {\n text-transform: none;\n padding: 2px 12px;\n border-color: var(--synapse-gray-dark);\n color: var(--synapse-gray-regular);\n font-weight: 600;\n font-size: 13px;\n\n &:global(.Mui-selected),\n &:global(.Mui-selected:hover) {\n background-color: var(--synapse-error);\n color: white;\n border-color: var(--synapse-error);\n }\n}\n\n.actions {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: auto;\n}\n\n.actionButton {\n text-transform: none;\n padding: 2px 8px;\n min-width: 0;\n font-weight: 500;\n color: var(--synapse-primary-action-color);\n}\n\n.children {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.emptyState {\n padding: 8px 4px;\n color: var(--synapse-gray-deemphasized);\n font-style: italic;\n font-size: 13px;\n}\n"],"mappings":""}
|