Skip to content

Commit 39c74fd

Browse files
authored
Fix various issues with selections (#1841)
- QueryModel.getSelectedIds: optimize when filterIds are not passed - EntityMoveModal: Don't use selectionKey, simplify props - Refactor PicklistEditModal, ChoosePicklistModal - Don't rely on selectionKey - Don't rely on QueryModel - Add usePicklistSelections to get rid of duplicate selection loading logic - Update AddToPicklistMenuItem, PicklistCreationMenuItem - BulkUpdateForm - Remove props: header, onSubmitForEdit, sortString - Rename props: pluralNoun, singularNoun -> nounPlural, nounSingular - Add props: aliquots, sampleOperation, editStatusData - Render errors - QueryAPIWrapper: remove getSelection - EntityServerAPIWrapper.getCrossFolderSelectionResult: remove useSnapshotSelection argument
1 parent 8dbac12 commit 39c74fd

29 files changed

Lines changed: 1576 additions & 1302 deletions

packages/components/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/components/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@labkey/components",
3-
"version": "6.60.1",
3+
"version": "6.61.0",
44
"description": "Components, models, actions, and utility functions for LabKey applications and pages",
55
"sideEffects": false,
66
"files": [

packages/components/releaseNotes/components.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,23 @@
11
# @labkey/components
22
Components, models, actions, and utility functions for LabKey applications and pages
33

4+
### version 6.61.0
5+
*Released*: 8 September 2025
6+
- QueryModel.getSelectedIds: optimize when filterIds are not passed
7+
- EntityMoveModal: Don't use selectionKey, simplify props, improve error messaging
8+
- Refactor PicklistEditModal, ChoosePicklistModal
9+
- Don't rely on selectionKey
10+
- Don't rely on QueryModel
11+
- Add usePicklistSelections to get rid of duplicate selection loading logic
12+
- Update AddToPicklistMenuItem, PicklistCreationMenuItem
13+
- BulkUpdateForm
14+
- Remove props: header, onSubmitForEdit, sortString
15+
- Rename props: pluralNoun, singularNoun -> nounPlural, nounSingular
16+
- Add props: aliquots, sampleOperation, editStatusData
17+
- Render errors
18+
- QueryAPIWrapper: remove getSelection
19+
- EntityServerAPIWrapper.getCrossFolderSelectionResult: remove useSnapshotSelection argument
20+
421
### version 6.60.1
522
*Released*: 3 September 2025
623
- Issue 53742: Sample Manager: Unable to perform actions from various pages on sample type with a '/'

packages/components/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1841,7 +1841,7 @@ export {
18411841
wrapDraggable,
18421842
};
18431843

1844-
export type { ClearSelectedOptions, ReplaceSelectedOptions, SelectionResponse } from './internal/actions';
1844+
export type { ClearSelectedOptions, ReplaceSelectedOptions } from './internal/actions';
18451845
export type { ThreadBlockProps } from './internal/announcements/ThreadBlock';
18461846
export type { ThreadEditorProps } from './internal/announcements/ThreadEditor';
18471847
export type { ComponentsAPIWrapper } from './internal/APIWrapper';
@@ -1985,7 +1985,7 @@ export type { QueryParamValue } from './internal/url/AppURL';
19851985
export type { AppRouteResolver } from './internal/url/models';
19861986
export type { URLMapper } from './internal/url/URLResolver';
19871987
export type { NavigateFn } from './internal/url/useAppNavigate';
1988-
export type { Loader } from './internal/useLoadableState';
1988+
export type { LoadableState, Loader } from './internal/useLoadableState';
19891989
export type { ContainerFormats, DateTimeSettingProp } from './internal/util/Date';
19901990
export type { MeasurementUnit } from './internal/util/measurement';
19911991
export type { UseRequestHandler } from './internal/util/RequestHandler';

packages/components/src/internal/actions.ts

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import {
3737
VIEW_NOT_FOUND_EXCEPTION_CLASS,
3838
} from './constants';
3939
import { DataViewInfo } from './DataViewInfo';
40-
import { getQueryParams } from './util/URL';
4140

4241
import { handleRequestFailure } from './request';
4342
import { resolveErrorMessage } from './util/messaging';
@@ -597,49 +596,6 @@ export function getSnapshotSelections(key: string, containerPath?: string): Prom
597596
});
598597
}
599598

600-
export interface SelectionResponse {
601-
resolved: boolean;
602-
schemaQuery?: SchemaQuery;
603-
selected: any[];
604-
}
605-
606-
// TODO: this method is only used by AssayImportPanels, and is needed in order to correctly get the filters needed when
607-
// fetching the selected samples. We should remove this method when we address Issue 53378. AssayImportDropdownSection,
608-
// and getImportItemsForAssayDefinitions, should be updated to create a snapshot selection key against exp.materials
609-
// before navigating to the assay import page, similar to what we do when creating workflow jobs.
610-
export async function getSelection(
611-
searchParams: URLSearchParams,
612-
schemaName?: string,
613-
queryName?: string
614-
): Promise<SelectionResponse> {
615-
const selectionKey = searchParams.get('selectionKey');
616-
if (selectionKey) {
617-
let { keys, schemaQuery } = SchemaQuery.parseSelectionKey(selectionKey);
618-
619-
if (keys !== undefined && keys !== '') {
620-
return { resolved: true, schemaQuery, selected: keys.split(';') };
621-
}
622-
623-
if (!schemaQuery && schemaName && queryName) {
624-
schemaQuery = new SchemaQuery(schemaName, queryName);
625-
}
626-
627-
if (!schemaQuery) {
628-
throw new Error(
629-
`No schema found for selection with selectionKey ${selectionKey} schemaName ${schemaName} queryName ${queryName}`
630-
);
631-
}
632-
633-
const params = getQueryParams(searchParams);
634-
const filters = Filter.getFiltersFromParameters(params);
635-
const response = await getSelected(selectionKey, false, schemaQuery, filters);
636-
637-
return { resolved: true, schemaQuery, selected: response.selected };
638-
}
639-
640-
return { resolved: false, selected: [] };
641-
}
642-
643599
export function fetchCharts(schemaQuery: SchemaQuery, containerPath?: string): Promise<DataViewInfo[]> {
644600
return new Promise((resolve, reject) => {
645601
Ajax.request({

packages/components/src/internal/components/entities/APIWrapper.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,7 @@ import {
4646

4747
export interface EntityAPIWrapper {
4848
getCrossFolderSelectionResult: (
49-
dataRegionSelectionKey: string,
5049
dataType: string, // 'samples' | 'exp.data' | 'assay',
51-
useSnapshotSelection?: boolean,
5250
rowIds?: string[] | number[],
5351
picklistName?: string
5452
) => Promise<CrossFolderSelectionResult>;

packages/components/src/internal/components/entities/EntityMoveConfirmationModal.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,23 +131,23 @@ export const EntityMoveConfirmationModal: FC<EntityMoveConfirmationModalProps> =
131131

132132
if (isLoading(loading)) {
133133
return (
134-
<Modal title={confirmModalProps.title} onCancel={confirmModalProps.onCancel}>
134+
<Modal onCancel={confirmModalProps.onCancel} title={confirmModalProps.title}>
135135
<LoadingSpinner msg="Loading target folders..." />
136136
</Modal>
137137
);
138138
}
139139

140140
if (error) {
141141
return (
142-
<Modal title={confirmModalProps.title} onCancel={confirmModalProps.onCancel} cancelText="Dismiss">
142+
<Modal cancelText="Dismiss" onCancel={confirmModalProps.onCancel} title={confirmModalProps.title}>
143143
<Alert>{error}</Alert>
144144
</Modal>
145145
);
146146
}
147147

148148
if (containerOptions?.length === 0) {
149149
return (
150-
<Modal title={confirmModalProps.title} onCancel={confirmModalProps.onCancel} cancelText="Dismiss">
150+
<Modal cancelText="Dismiss" onCancel={confirmModalProps.onCancel} title={confirmModalProps.title}>
151151
You do not have permission to move {nounPlural} to any of the available folders.
152152
</Modal>
153153
);
@@ -156,8 +156,8 @@ export const EntityMoveConfirmationModal: FC<EntityMoveConfirmationModalProps> =
156156
return (
157157
<Modal
158158
{...confirmModalProps}
159-
onConfirm={onConfirmCallback}
160159
canConfirm={!!selectedContainerOption && (!requiresUserComment || hasValidUserComment)}
160+
onConfirm={onConfirmCallback}
161161
>
162162
{children}
163163
<div className="top-padding">

0 commit comments

Comments
 (0)