synapse-react-client 4.0.38 → 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/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,91 @@
|
|
|
1
|
+
import { FRIENDLY_VALUE_NOT_SET as e } from "../../utils/SynapseConstants.js";
|
|
2
|
+
//#region src/components/QueryBuilder/queryBuilderMetadata.ts
|
|
3
|
+
function t(e, t) {
|
|
4
|
+
if (e?.endsWith("_LIST")) return "list";
|
|
5
|
+
if (t) return "enum";
|
|
6
|
+
if (e == null) return "unknown";
|
|
7
|
+
switch (e) {
|
|
8
|
+
case "BOOLEAN": return "boolean";
|
|
9
|
+
case "INTEGER":
|
|
10
|
+
case "DOUBLE":
|
|
11
|
+
case "DATE":
|
|
12
|
+
case "DATE_TIME": return "range";
|
|
13
|
+
case "STRING":
|
|
14
|
+
case "LARGETEXT":
|
|
15
|
+
case "LINK":
|
|
16
|
+
case "MEDIUMTEXT":
|
|
17
|
+
case "USERID":
|
|
18
|
+
case "ENTITYID":
|
|
19
|
+
case "EVALUATIONID":
|
|
20
|
+
case "SUBMISSIONID": return "text";
|
|
21
|
+
default: return "text";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function n(e) {
|
|
25
|
+
switch (e) {
|
|
26
|
+
case "enum": return [
|
|
27
|
+
"is_any_of",
|
|
28
|
+
"has_value",
|
|
29
|
+
"no_value"
|
|
30
|
+
];
|
|
31
|
+
case "list": return [
|
|
32
|
+
"is_any_of",
|
|
33
|
+
"is_all_of",
|
|
34
|
+
"has_value",
|
|
35
|
+
"no_value"
|
|
36
|
+
];
|
|
37
|
+
case "range": return [
|
|
38
|
+
"between",
|
|
39
|
+
"gt",
|
|
40
|
+
"gte",
|
|
41
|
+
"lt",
|
|
42
|
+
"lte",
|
|
43
|
+
"equal",
|
|
44
|
+
"not_equal",
|
|
45
|
+
"has_value",
|
|
46
|
+
"no_value"
|
|
47
|
+
];
|
|
48
|
+
case "boolean": return [
|
|
49
|
+
"equal",
|
|
50
|
+
"has_value",
|
|
51
|
+
"no_value"
|
|
52
|
+
];
|
|
53
|
+
case "text": return [
|
|
54
|
+
"contains",
|
|
55
|
+
"starts_with",
|
|
56
|
+
"ends_with",
|
|
57
|
+
"is_exactly",
|
|
58
|
+
"has_value",
|
|
59
|
+
"no_value"
|
|
60
|
+
];
|
|
61
|
+
case "unknown": return [];
|
|
62
|
+
default: return [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function r(e) {
|
|
66
|
+
switch (e) {
|
|
67
|
+
case "is_any_of": return "is any of";
|
|
68
|
+
case "is_all_of": return "is all of";
|
|
69
|
+
case "between": return "between";
|
|
70
|
+
case "gt": return ">";
|
|
71
|
+
case "gte": return "≥";
|
|
72
|
+
case "lt": return "<";
|
|
73
|
+
case "lte": return "≤";
|
|
74
|
+
case "equal": return "equals";
|
|
75
|
+
case "not_equal": return "does not equal";
|
|
76
|
+
case "has_value": return "has value";
|
|
77
|
+
case "no_value": return "has no value";
|
|
78
|
+
case "contains": return "contains";
|
|
79
|
+
case "starts_with": return "starts with";
|
|
80
|
+
case "ends_with": return "ends with";
|
|
81
|
+
case "is_exactly": return "is exactly";
|
|
82
|
+
default: return e;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function i(t) {
|
|
86
|
+
return t === "org.sagebionetworks.UNDEFINED_NULL_NOTSET" ? e : t;
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
export { n as availableOpsForKind, t as classifyColumn, i as labelForFacetValue, r as labelForOp };
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=queryBuilderMetadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryBuilderMetadata.js","names":[],"sources":["../../../src/components/QueryBuilder/queryBuilderMetadata.ts"],"sourcesContent":["/**\n * Column-kind classification and operator availability per kind. The QB uses\n * this both to populate the operator picker dropdown and to decide what shape\n * of value input to render.\n */\nimport {\n FRIENDLY_VALUE_NOT_SET,\n VALUE_NOT_SET,\n} from '../../utils/SynapseConstants'\nimport { QBConditionOp } from './QueryBuilderTypes'\n\n/** Categorization of columns for the QB UI. Not a synapse-types concept. */\nexport type QBColumnKind =\n | 'enum'\n | 'list'\n | 'range'\n | 'boolean'\n | 'text'\n | 'unknown'\n\n/**\n * Classify a column into a QB kind based on its `ColumnTypeEnum` string and\n * whether the column has a facet in the query result. `hasFacet` distinguishes\n * a faceted single-value column (`enum`) from a plain single-value column\n * (`text`).\n */\nexport function classifyColumn(\n columnType: string | null,\n hasFacet: boolean,\n): QBColumnKind {\n // `_LIST` columns keep the `list` kind so `is_all_of` remains available.\n if (columnType?.endsWith('_LIST')) return 'list'\n // Any faceted column becomes an enum picker regardless of the raw column\n // type (even when the type is unknown, e.g. when the QB tree was hydrated\n // from `selectedFacets` without column-model context).\n if (hasFacet) return 'enum'\n if (columnType == null) return 'unknown'\n switch (columnType) {\n case 'BOOLEAN':\n return 'boolean'\n case 'INTEGER':\n case 'DOUBLE':\n case 'DATE':\n case 'DATE_TIME':\n return 'range'\n case 'STRING':\n case 'LARGETEXT':\n case 'LINK':\n case 'MEDIUMTEXT':\n case 'USERID':\n case 'ENTITYID':\n case 'EVALUATIONID':\n case 'SUBMISSIONID':\n return 'text'\n default:\n return 'text'\n }\n}\n\n/**\n * Ordered list of operators offered for a given column kind. Order controls\n * the operator picker dropdown ordering.\n */\nexport function availableOpsForKind(kind: QBColumnKind): QBConditionOp[] {\n switch (kind) {\n case 'enum':\n return ['is_any_of', 'has_value', 'no_value']\n case 'list':\n return ['is_any_of', 'is_all_of', 'has_value', 'no_value']\n case 'range':\n return [\n 'between',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'equal',\n 'not_equal',\n 'has_value',\n 'no_value',\n ]\n case 'boolean':\n return ['equal', 'has_value', 'no_value']\n case 'text':\n return [\n 'contains',\n 'starts_with',\n 'ends_with',\n 'is_exactly',\n 'has_value',\n 'no_value',\n ]\n case 'unknown':\n // No column picked yet; offer nothing until one is selected.\n return []\n default:\n kind satisfies never\n return []\n }\n}\n\n/** Human-readable label for an operator, shown in the operator picker. */\nexport function labelForOp(op: QBConditionOp): string {\n switch (op) {\n case 'is_any_of':\n return 'is any of'\n case 'is_all_of':\n return 'is all of'\n case 'between':\n return 'between'\n case 'gt':\n return '>'\n case 'gte':\n return '≥'\n case 'lt':\n return '<'\n case 'lte':\n return '≤'\n case 'equal':\n return 'equals'\n case 'not_equal':\n return 'does not equal'\n case 'has_value':\n return 'has value'\n case 'no_value':\n return 'has no value'\n case 'contains':\n return 'contains'\n case 'starts_with':\n return 'starts with'\n case 'ends_with':\n return 'ends with'\n case 'is_exactly':\n return 'is exactly'\n default:\n op satisfies never\n return op\n }\n}\n\n/**\n * Returns the user-facing label for a raw facet value. Backend sentinels like\n * `VALUE_NOT_SET` display as `Not Assigned`; every other value renders as-is.\n * The underlying value stored on the QB condition is unchanged.\n */\nexport function labelForFacetValue(value: string): string {\n return value === VALUE_NOT_SET ? FRIENDLY_VALUE_NOT_SET : value\n}\n"],"mappings":";;AA0BA,SAAgB,EACd,GACA,GACc;CAEd,IAAI,GAAY,SAAS,OAAO,GAAG,OAAO;CAI1C,IAAI,GAAU,OAAO;CACrB,IAAI,KAAc,MAAM,OAAO;CAC/B,QAAQ,GAAR;EACE,KAAK,WACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,aACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,gBACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAMA,SAAgB,EAAoB,GAAqC;CACvE,QAAQ,GAAR;EACE,KAAK,QACH,OAAO;GAAC;GAAa;GAAa;EAAU;EAC9C,KAAK,QACH,OAAO;GAAC;GAAa;GAAa;GAAa;EAAU;EAC3D,KAAK,SACH,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACF,KAAK,WACH,OAAO;GAAC;GAAS;GAAa;EAAU;EAC1C,KAAK,QACH,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;EACF;EACF,KAAK,WAEH,OAAO,CAAC;EACV,SAEE,OAAO,CAAC;CACZ;AACF;AAGA,SAAgB,EAAW,GAA2B;CACpD,QAAQ,GAAR;EACE,KAAK,aACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,eACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,SAEE,OAAO;CACX;AACF;AAOA,SAAgB,EAAmB,GAAuB;CACxD,OAAO,MAAA,8CAA0B,IAAyB;AAC5D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { QBCombinator, QBCondition, QBConditionOp, QBGroup, QBNode } from './QueryBuilderTypes';
|
|
2
|
+
/**
|
|
3
|
+
* The initial `op` for a brand-new condition. When the user hasn't picked a
|
|
4
|
+
* column yet the choice is arbitrary — the row's operator picker replaces it
|
|
5
|
+
* as soon as the column is chosen — but we still need a valid discriminant
|
|
6
|
+
* so the UI can render. `is_any_of` renders as a pill-based value input, which
|
|
7
|
+
* degrades gracefully for a blank row.
|
|
8
|
+
*/
|
|
9
|
+
export declare function defaultOpForColumnType(columnType: string | null): QBConditionOp;
|
|
10
|
+
export declare function newBlankCondition(columnName: string | null, columnType: string | null): QBCondition;
|
|
11
|
+
export declare function newEmptyGroup(combinator?: QBCombinator): QBGroup;
|
|
12
|
+
/** Root group with a single blank condition — the QB's default startup state. */
|
|
13
|
+
export declare function defaultQBGroup(): QBGroup;
|
|
14
|
+
export declare function addConditionToGroup(root: QBGroup, targetGroupId: string, columnName: string | null, columnType: string | null): QBGroup;
|
|
15
|
+
export declare function addChildGroup(root: QBGroup, targetGroupId: string): QBGroup;
|
|
16
|
+
/**
|
|
17
|
+
* Insert `node` into the group identified by `targetGroupId` at
|
|
18
|
+
* `targetIndex`. Semantics match `Array.prototype.splice(targetIndex, 0, node)`.
|
|
19
|
+
* If the group can't be found, returns the tree unchanged.
|
|
20
|
+
*/
|
|
21
|
+
export declare function insertNodeAt(root: QBGroup, targetGroupId: string, targetIndex: number, node: QBNode): QBGroup;
|
|
22
|
+
/**
|
|
23
|
+
* Empty the children of the group identified by `nodeId`. If the id doesn't
|
|
24
|
+
* match any group, returns the tree unchanged.
|
|
25
|
+
*/
|
|
26
|
+
export declare function clearGroup(root: QBGroup, nodeId: string): QBGroup;
|
|
27
|
+
export declare function updateCondition(root: QBGroup, nodeId: string, patch: Partial<Omit<QBCondition, 'kind' | 'id'>>): QBGroup;
|
|
28
|
+
export declare function updateGroup(root: QBGroup, nodeId: string, patch: Partial<Omit<QBGroup, 'kind' | 'id' | 'children'>>): QBGroup;
|
|
29
|
+
/**
|
|
30
|
+
* Remove the node identified by `nodeId` from the tree. The root cannot be
|
|
31
|
+
* removed — a request to remove the root returns the tree unchanged.
|
|
32
|
+
*/
|
|
33
|
+
export declare function removeNode(root: QBGroup, nodeId: string): QBGroup;
|
|
34
|
+
/**
|
|
35
|
+
* Move the node identified by `nodeId` to `targetIndex` of the group
|
|
36
|
+
* identified by `targetGroupId`. `targetIndex` is the insertion index in the
|
|
37
|
+
* target group's children *after* the node has been removed from its current
|
|
38
|
+
* position — same semantics as `Array.prototype.splice(targetIndex, 0, node)`.
|
|
39
|
+
*
|
|
40
|
+
* Returns the tree unchanged if any of the following invariants would be
|
|
41
|
+
* violated:
|
|
42
|
+
* - `nodeId` is the root (root cannot be moved).
|
|
43
|
+
* - `targetGroupId` is `nodeId` (a node can't be dropped into itself).
|
|
44
|
+
* - `targetGroupId` is a descendant of `nodeId` (would create a cycle).
|
|
45
|
+
* - The move is a no-op (target group + index equals current group + index).
|
|
46
|
+
*/
|
|
47
|
+
export declare function moveNode(root: QBGroup, nodeId: string, targetGroupId: string, targetIndex: number): QBGroup;
|
|
48
|
+
/**
|
|
49
|
+
* Find every node in the tree matching a predicate. Root is included.
|
|
50
|
+
*/
|
|
51
|
+
export declare function findNodes(root: QBGroup, predicate: (node: QBNode) => boolean): QBNode[];
|
|
52
|
+
/**
|
|
53
|
+
* Whether `root` (or any descendant) contains a condition with a resolvable,
|
|
54
|
+
* complete filter — matches the design's "at least one complete condition"
|
|
55
|
+
* requirement for `hasResettableFilters`.
|
|
56
|
+
*/
|
|
57
|
+
export declare function hasCompleteCondition(root: QBGroup): boolean;
|
|
58
|
+
//# sourceMappingURL=queryBuilderOperations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryBuilderOperations.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/queryBuilderOperations.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,OAAO,EACP,MAAM,EACP,MAAM,qBAAqB,CAAA;AAM5B;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,aAAa,CAgBf;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,WAAW,CAYb;AAED,wBAAgB,aAAa,CAAC,UAAU,GAAE,YAAoB,GAAG,OAAO,CAQvE;AAED,iFAAiF;AACjF,wBAAgB,cAAc,IAAI,OAAO,CAGxC;AAMD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAGT;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAUT;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEjE;AAMD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,GAC/C,OAAO,CAIT;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,GACxD,OAAO,CAET;AAMD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQjE;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAiCT;AAMD;;GAEG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACnC,MAAM,EAAE,CAQV;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAI3D"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { newQBNodeId as e } from "./queryBuilderId.js";
|
|
2
|
+
import { isQBGroup as t } from "./QueryBuilderTypes.js";
|
|
3
|
+
//#region src/components/QueryBuilder/queryBuilderOperations.ts
|
|
4
|
+
function n(e) {
|
|
5
|
+
if (e == null || e.endsWith("_LIST")) return "is_any_of";
|
|
6
|
+
switch (e) {
|
|
7
|
+
case "INTEGER":
|
|
8
|
+
case "DOUBLE":
|
|
9
|
+
case "DATE":
|
|
10
|
+
case "DATE_TIME": return "between";
|
|
11
|
+
case "BOOLEAN": return "equal";
|
|
12
|
+
case "STRING": return "contains";
|
|
13
|
+
default: return "is_any_of";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function r(t, r) {
|
|
17
|
+
return {
|
|
18
|
+
kind: "condition",
|
|
19
|
+
id: e(),
|
|
20
|
+
columnName: t,
|
|
21
|
+
columnType: r,
|
|
22
|
+
op: n(r),
|
|
23
|
+
values: [],
|
|
24
|
+
rangeMin: null,
|
|
25
|
+
rangeMax: null,
|
|
26
|
+
text: null
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function i(t = "AND") {
|
|
30
|
+
return {
|
|
31
|
+
kind: "group",
|
|
32
|
+
id: e(),
|
|
33
|
+
combinator: t,
|
|
34
|
+
not: !1,
|
|
35
|
+
children: []
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function a() {
|
|
39
|
+
return {
|
|
40
|
+
...i(),
|
|
41
|
+
children: [r(null, null)]
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function o(e, t, n, i) {
|
|
45
|
+
return v(e, t, r(n, i));
|
|
46
|
+
}
|
|
47
|
+
function s(e, t) {
|
|
48
|
+
return v(e, t, i());
|
|
49
|
+
}
|
|
50
|
+
function c(e, t, n, r) {
|
|
51
|
+
return y(e, t, (e) => {
|
|
52
|
+
let t = w(e.children.length, n), i = [
|
|
53
|
+
...e.children.slice(0, t),
|
|
54
|
+
r,
|
|
55
|
+
...e.children.slice(t)
|
|
56
|
+
];
|
|
57
|
+
return {
|
|
58
|
+
...e,
|
|
59
|
+
children: i
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function l(e, t) {
|
|
64
|
+
return y(e, t, (e) => ({
|
|
65
|
+
...e,
|
|
66
|
+
children: []
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
function u(e, t, n) {
|
|
70
|
+
return b(e, t, (e) => e.kind === "condition" ? {
|
|
71
|
+
...e,
|
|
72
|
+
...n
|
|
73
|
+
} : e);
|
|
74
|
+
}
|
|
75
|
+
function d(e, t, n) {
|
|
76
|
+
return y(e, t, (e) => ({
|
|
77
|
+
...e,
|
|
78
|
+
...n
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
function f(e, t) {
|
|
82
|
+
if (e.id === t) return e;
|
|
83
|
+
let n = x(e, t);
|
|
84
|
+
return n == null ? e : y(e, n.parentId, (e) => ({
|
|
85
|
+
...e,
|
|
86
|
+
children: e.children.filter((e) => e.id !== t)
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
function p(e, t, n, r) {
|
|
90
|
+
if (t === e.id || t === n) return e;
|
|
91
|
+
let i = x(e, t);
|
|
92
|
+
if (i == null) return e;
|
|
93
|
+
let a = S(e, n);
|
|
94
|
+
if (a == null || i.node.kind === "group" && C(i.node, n)) return e;
|
|
95
|
+
let o = i.parentId === n, s = w(o ? a.children.length - 1 : a.children.length, r);
|
|
96
|
+
return o && s === i.index ? e : c(y(e, i.parentId, (e) => ({
|
|
97
|
+
...e,
|
|
98
|
+
children: e.children.filter((e) => e.id !== t)
|
|
99
|
+
})), n, s, i.node);
|
|
100
|
+
}
|
|
101
|
+
function m(e, n) {
|
|
102
|
+
let r = [], i = (e) => {
|
|
103
|
+
n(e) && r.push(e), t(e) && e.children.forEach(i);
|
|
104
|
+
};
|
|
105
|
+
return i(e), r;
|
|
106
|
+
}
|
|
107
|
+
function h(e) {
|
|
108
|
+
return m(e, (e) => e.kind === "condition").some((e) => g(e));
|
|
109
|
+
}
|
|
110
|
+
function g(e) {
|
|
111
|
+
if (e.columnName == null) return !1;
|
|
112
|
+
switch (e.op) {
|
|
113
|
+
case "has_value":
|
|
114
|
+
case "no_value": return !0;
|
|
115
|
+
case "is_any_of":
|
|
116
|
+
case "is_all_of":
|
|
117
|
+
case "equal":
|
|
118
|
+
case "not_equal": return e.values.length > 0;
|
|
119
|
+
case "between": return !_(e.rangeMin) && !_(e.rangeMax);
|
|
120
|
+
case "gt":
|
|
121
|
+
case "gte": return !_(e.rangeMin);
|
|
122
|
+
case "lt":
|
|
123
|
+
case "lte": return !_(e.rangeMax);
|
|
124
|
+
case "contains":
|
|
125
|
+
case "starts_with":
|
|
126
|
+
case "ends_with":
|
|
127
|
+
case "is_exactly": return !_(e.text);
|
|
128
|
+
default: return e.op, !1;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function _(e) {
|
|
132
|
+
return e == null || e === "";
|
|
133
|
+
}
|
|
134
|
+
function v(e, t, n) {
|
|
135
|
+
return y(e, t, (e) => ({
|
|
136
|
+
...e,
|
|
137
|
+
children: [n, ...e.children]
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
function y(e, t, n) {
|
|
141
|
+
return b(e, t, (e) => e.kind === "group" ? n(e) : e);
|
|
142
|
+
}
|
|
143
|
+
function b(e, n, r) {
|
|
144
|
+
if (e.id === n) {
|
|
145
|
+
let n = r(e);
|
|
146
|
+
return t(n) ? n : e;
|
|
147
|
+
}
|
|
148
|
+
let i = !1, a = e.children.map((e) => {
|
|
149
|
+
if (e.id === n) {
|
|
150
|
+
let t = r(e);
|
|
151
|
+
return t !== e && (i = !0), t;
|
|
152
|
+
}
|
|
153
|
+
if (t(e)) {
|
|
154
|
+
let t = b(e, n, r);
|
|
155
|
+
return t !== e && (i = !0), t;
|
|
156
|
+
}
|
|
157
|
+
return e;
|
|
158
|
+
});
|
|
159
|
+
return i ? {
|
|
160
|
+
...e,
|
|
161
|
+
children: a
|
|
162
|
+
} : e;
|
|
163
|
+
}
|
|
164
|
+
function x(e, n) {
|
|
165
|
+
let r = (e) => {
|
|
166
|
+
for (let i = 0; i < e.children.length; i++) {
|
|
167
|
+
let a = e.children[i];
|
|
168
|
+
if (a.id === n) return {
|
|
169
|
+
node: a,
|
|
170
|
+
parentId: e.id,
|
|
171
|
+
index: i
|
|
172
|
+
};
|
|
173
|
+
if (t(a)) {
|
|
174
|
+
let e = r(a);
|
|
175
|
+
if (e) return e;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return null;
|
|
179
|
+
};
|
|
180
|
+
return r(e);
|
|
181
|
+
}
|
|
182
|
+
function S(e, n) {
|
|
183
|
+
if (e.id === n) return e;
|
|
184
|
+
for (let r of e.children) if (t(r)) {
|
|
185
|
+
let e = S(r, n);
|
|
186
|
+
if (e) return e;
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
function C(e, n) {
|
|
191
|
+
for (let r of e.children) if (r.id === n || t(r) && C(r, n)) return !0;
|
|
192
|
+
return !1;
|
|
193
|
+
}
|
|
194
|
+
function w(e, t) {
|
|
195
|
+
return !Number.isFinite(t) || t < 0 ? 0 : Math.min(e, Math.trunc(t));
|
|
196
|
+
}
|
|
197
|
+
//#endregion
|
|
198
|
+
export { s as addChildGroup, o as addConditionToGroup, l as clearGroup, n as defaultOpForColumnType, a as defaultQBGroup, m as findNodes, h as hasCompleteCondition, c as insertNodeAt, p as moveNode, r as newBlankCondition, i as newEmptyGroup, f as removeNode, u as updateCondition, d as updateGroup };
|
|
199
|
+
|
|
200
|
+
//# sourceMappingURL=queryBuilderOperations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryBuilderOperations.js","names":[],"sources":["../../../src/components/QueryBuilder/queryBuilderOperations.ts"],"sourcesContent":["import { newQBNodeId } from './queryBuilderId'\nimport {\n isQBGroup,\n QBCombinator,\n QBCondition,\n QBConditionOp,\n QBGroup,\n QBNode,\n} from './QueryBuilderTypes'\n\n// -----------------------------------------------------------------------------\n// Factories\n// -----------------------------------------------------------------------------\n\n/**\n * The initial `op` for a brand-new condition. When the user hasn't picked a\n * column yet the choice is arbitrary — the row's operator picker replaces it\n * as soon as the column is chosen — but we still need a valid discriminant\n * so the UI can render. `is_any_of` renders as a pill-based value input, which\n * degrades gracefully for a blank row.\n */\nexport function defaultOpForColumnType(\n columnType: string | null,\n): QBConditionOp {\n if (columnType == null) return 'is_any_of'\n if (columnType.endsWith('_LIST')) return 'is_any_of'\n switch (columnType) {\n case 'INTEGER':\n case 'DOUBLE':\n case 'DATE':\n case 'DATE_TIME':\n return 'between'\n case 'BOOLEAN':\n return 'equal'\n case 'STRING':\n return 'contains'\n default:\n return 'is_any_of'\n }\n}\n\nexport function newBlankCondition(\n columnName: string | null,\n columnType: string | null,\n): QBCondition {\n return {\n kind: 'condition',\n id: newQBNodeId(),\n columnName,\n columnType,\n op: defaultOpForColumnType(columnType),\n values: [],\n rangeMin: null,\n rangeMax: null,\n text: null,\n }\n}\n\nexport function newEmptyGroup(combinator: QBCombinator = 'AND'): QBGroup {\n return {\n kind: 'group',\n id: newQBNodeId(),\n combinator,\n not: false,\n children: [],\n }\n}\n\n/** Root group with a single blank condition — the QB's default startup state. */\nexport function defaultQBGroup(): QBGroup {\n const root = newEmptyGroup()\n return { ...root, children: [newBlankCondition(null, null)] }\n}\n\n// -----------------------------------------------------------------------------\n// Add / clear\n// -----------------------------------------------------------------------------\n\nexport function addConditionToGroup(\n root: QBGroup,\n targetGroupId: string,\n columnName: string | null,\n columnType: string | null,\n): QBGroup {\n const condition = newBlankCondition(columnName, columnType)\n return prependChild(root, targetGroupId, condition)\n}\n\nexport function addChildGroup(root: QBGroup, targetGroupId: string): QBGroup {\n return prependChild(root, targetGroupId, newEmptyGroup())\n}\n\n/**\n * Insert `node` into the group identified by `targetGroupId` at\n * `targetIndex`. Semantics match `Array.prototype.splice(targetIndex, 0, node)`.\n * If the group can't be found, returns the tree unchanged.\n */\nexport function insertNodeAt(\n root: QBGroup,\n targetGroupId: string,\n targetIndex: number,\n node: QBNode,\n): QBGroup {\n return mapGroup(root, targetGroupId, group => {\n const clamped = clampInsertionIndex(group.children.length, targetIndex)\n const nextChildren = [\n ...group.children.slice(0, clamped),\n node,\n ...group.children.slice(clamped),\n ]\n return { ...group, children: nextChildren }\n })\n}\n\n/**\n * Empty the children of the group identified by `nodeId`. If the id doesn't\n * match any group, returns the tree unchanged.\n */\nexport function clearGroup(root: QBGroup, nodeId: string): QBGroup {\n return mapGroup(root, nodeId, group => ({ ...group, children: [] }))\n}\n\n// -----------------------------------------------------------------------------\n// Update\n// -----------------------------------------------------------------------------\n\nexport function updateCondition(\n root: QBGroup,\n nodeId: string,\n patch: Partial<Omit<QBCondition, 'kind' | 'id'>>,\n): QBGroup {\n return mapNode(root, nodeId, node =>\n node.kind === 'condition' ? { ...node, ...patch } : node,\n )\n}\n\nexport function updateGroup(\n root: QBGroup,\n nodeId: string,\n patch: Partial<Omit<QBGroup, 'kind' | 'id' | 'children'>>,\n): QBGroup {\n return mapGroup(root, nodeId, group => ({ ...group, ...patch }))\n}\n\n// -----------------------------------------------------------------------------\n// Remove\n// -----------------------------------------------------------------------------\n\n/**\n * Remove the node identified by `nodeId` from the tree. The root cannot be\n * removed — a request to remove the root returns the tree unchanged.\n */\nexport function removeNode(root: QBGroup, nodeId: string): QBGroup {\n if (root.id === nodeId) return root\n const location = findLocation(root, nodeId)\n if (location == null) return root\n return mapGroup(root, location.parentId, group => ({\n ...group,\n children: group.children.filter(child => child.id !== nodeId),\n }))\n}\n\n// -----------------------------------------------------------------------------\n// Move (DnD)\n// -----------------------------------------------------------------------------\n\n/**\n * Move the node identified by `nodeId` to `targetIndex` of the group\n * identified by `targetGroupId`. `targetIndex` is the insertion index in the\n * target group's children *after* the node has been removed from its current\n * position — same semantics as `Array.prototype.splice(targetIndex, 0, node)`.\n *\n * Returns the tree unchanged if any of the following invariants would be\n * violated:\n * - `nodeId` is the root (root cannot be moved).\n * - `targetGroupId` is `nodeId` (a node can't be dropped into itself).\n * - `targetGroupId` is a descendant of `nodeId` (would create a cycle).\n * - The move is a no-op (target group + index equals current group + index).\n */\nexport function moveNode(\n root: QBGroup,\n nodeId: string,\n targetGroupId: string,\n targetIndex: number,\n): QBGroup {\n if (nodeId === root.id) return root\n if (nodeId === targetGroupId) return root\n\n const source = findLocation(root, nodeId)\n if (source == null) return root\n\n const targetGroup = findGroup(root, targetGroupId)\n if (targetGroup == null) return root\n\n if (\n source.node.kind === 'group' &&\n containsDescendant(source.node, targetGroupId)\n ) {\n return root\n }\n\n const isSameParent = source.parentId === targetGroupId\n const clampedTarget = clampInsertionIndex(\n // When moving within the same parent, the effective target-array length\n // after the node is removed is one shorter.\n isSameParent\n ? targetGroup.children.length - 1\n : targetGroup.children.length,\n targetIndex,\n )\n if (isSameParent && clampedTarget === source.index) return root\n\n const withoutSource = mapGroup(root, source.parentId, group => ({\n ...group,\n children: group.children.filter(child => child.id !== nodeId),\n }))\n return insertNodeAt(withoutSource, targetGroupId, clampedTarget, source.node)\n}\n\n// -----------------------------------------------------------------------------\n// Query helpers\n// -----------------------------------------------------------------------------\n\n/**\n * Find every node in the tree matching a predicate. Root is included.\n */\nexport function findNodes(\n root: QBGroup,\n predicate: (node: QBNode) => boolean,\n): QBNode[] {\n const acc: QBNode[] = []\n const visit = (node: QBNode) => {\n if (predicate(node)) acc.push(node)\n if (isQBGroup(node)) node.children.forEach(visit)\n }\n visit(root)\n return acc\n}\n\n/**\n * Whether `root` (or any descendant) contains a condition with a resolvable,\n * complete filter — matches the design's \"at least one complete condition\"\n * requirement for `hasResettableFilters`.\n */\nexport function hasCompleteCondition(root: QBGroup): boolean {\n return findNodes(root, node => node.kind === 'condition').some(condition =>\n isConditionComplete(condition as QBCondition),\n )\n}\n\nfunction isConditionComplete(condition: QBCondition): boolean {\n if (condition.columnName == null) return false\n switch (condition.op) {\n case 'has_value':\n case 'no_value':\n return true\n case 'is_any_of':\n case 'is_all_of':\n case 'equal':\n case 'not_equal':\n return condition.values.length > 0\n case 'between':\n return !isBlank(condition.rangeMin) && !isBlank(condition.rangeMax)\n case 'gt':\n case 'gte':\n return !isBlank(condition.rangeMin)\n case 'lt':\n case 'lte':\n return !isBlank(condition.rangeMax)\n case 'contains':\n case 'starts_with':\n case 'ends_with':\n case 'is_exactly':\n return !isBlank(condition.text)\n default:\n condition.op satisfies never\n return false\n }\n}\n\nfunction isBlank(value: string | null | undefined): boolean {\n return value == null || value === ''\n}\n\n// -----------------------------------------------------------------------------\n// Internal traversal helpers\n// -----------------------------------------------------------------------------\n\nfunction prependChild(root: QBGroup, groupId: string, node: QBNode): QBGroup {\n return mapGroup(root, groupId, group => ({\n ...group,\n children: [node, ...group.children],\n }))\n}\n\n/**\n * Replace the group identified by `targetId` with `transform(group)`. If the\n * id is not found, returns the tree unchanged (by reference).\n */\nfunction mapGroup(\n root: QBGroup,\n targetId: string,\n transform: (group: QBGroup) => QBGroup,\n): QBGroup {\n return mapNode(root, targetId, node =>\n node.kind === 'group' ? transform(node) : node,\n )\n}\n\n/**\n * Replace the node identified by `targetId` with `transform(node)`. If the id\n * matches root, the transformed root is returned. Structural sharing: only\n * the ancestor chain of the changed node is rebuilt; unaffected subtrees are\n * kept by reference.\n */\nfunction mapNode(\n root: QBGroup,\n targetId: string,\n transform: (node: QBNode) => QBNode,\n): QBGroup {\n if (root.id === targetId) {\n const next = transform(root)\n return isQBGroup(next) ? next : root\n }\n let changed = false\n const nextChildren = root.children.map(child => {\n if (child.id === targetId) {\n const replaced = transform(child)\n if (replaced !== child) changed = true\n return replaced\n }\n if (isQBGroup(child)) {\n const replaced = mapNode(child, targetId, transform)\n if (replaced !== child) changed = true\n return replaced\n }\n return child\n })\n return changed ? { ...root, children: nextChildren } : root\n}\n\ntype QBNodeLocation = {\n node: QBNode\n parentId: string\n index: number\n}\n\nfunction findLocation(root: QBGroup, targetId: string): QBNodeLocation | null {\n const visit = (group: QBGroup): QBNodeLocation | null => {\n for (let index = 0; index < group.children.length; index++) {\n const child = group.children[index]\n if (child.id === targetId) {\n return { node: child, parentId: group.id, index }\n }\n if (isQBGroup(child)) {\n const nested = visit(child)\n if (nested) return nested\n }\n }\n return null\n }\n return visit(root)\n}\n\nfunction findGroup(root: QBGroup, targetId: string): QBGroup | null {\n if (root.id === targetId) return root\n for (const child of root.children) {\n if (isQBGroup(child)) {\n const nested = findGroup(child, targetId)\n if (nested) return nested\n }\n }\n return null\n}\n\nfunction containsDescendant(group: QBGroup, targetId: string): boolean {\n for (const child of group.children) {\n if (child.id === targetId) return true\n if (isQBGroup(child) && containsDescendant(child, targetId)) return true\n }\n return false\n}\n\nfunction clampInsertionIndex(length: number, index: number): number {\n if (!Number.isFinite(index) || index < 0) return 0\n return Math.min(length, Math.trunc(index))\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { FacetColumnRequest, QueryFilter } from '@sage-bionetworks/synapse-types';
|
|
1
|
+
import { ColumnModel, FacetColumnRequest, QueryFilter } from '@sage-bionetworks/synapse-types';
|
|
2
|
+
import { ReadonlyDeep } from 'type-fest';
|
|
2
3
|
import { QBGroup, QBNode } from './QueryBuilderTypes';
|
|
3
4
|
/** A multi-value list column is one whose column type ends in `_LIST`. */
|
|
4
5
|
export declare function isListColumn(columnType: string | null): boolean;
|
|
@@ -44,5 +45,5 @@ export declare function apiFilterToQBNode(filter: QueryFilter): QBNode | null;
|
|
|
44
45
|
* (as an AND-combined, non-negated group). The reverse direction is not
|
|
45
46
|
* generally possible; a QB → facets switch clears the tree.
|
|
46
47
|
*/
|
|
47
|
-
export declare function selectedFacetsToQBGroup(selectedFacets: FacetColumnRequest[]): QBGroup;
|
|
48
|
+
export declare function selectedFacetsToQBGroup(selectedFacets: ReadonlyDeep<FacetColumnRequest[]>, columnModels?: ReadonlyDeep<ColumnModel[]>): QBGroup;
|
|
48
49
|
//# sourceMappingURL=queryBuilderTranslation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryBuilderTranslation.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/queryBuilderTranslation.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"queryBuilderTranslation.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/queryBuilderTranslation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAKX,kBAAkB,EAGlB,WAAW,EACZ,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAQxC,OAAO,EAA0B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAY7E,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAE/D;AAMD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG;IACpD,EAAE,EAAE,UAAU,GAAG,aAAa,GAAG,WAAW,GAAG,YAAY,CAAA;IAC3D,IAAI,EAAE,MAAM,CAAA;CACb,CAUA;AAMD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAelE;AAwLD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAgCpE;AA8DD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,YAAY,CAAC,kBAAkB,EAAE,CAAC,EAClD,YAAY,CAAC,EAAE,YAAY,CAAC,WAAW,EAAE,CAAC,GACzC,OAAO,CAkBT"}
|