Skip to content

Commit 04e4400

Browse files
committed
Merge branch 'develop' into fb_assayDesignerFixes258
# Conflicts: # packages/components/package-lock.json # packages/components/package.json # packages/components/releaseNotes/components.md
2 parents 224445c + 8da1070 commit 04e4400

13 files changed

Lines changed: 313 additions & 316 deletions

File tree

packages/components/package-lock.json

Lines changed: 6 additions & 6 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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@labkey/components",
3-
"version": "6.56.2-assayDesignerFixes258.0",
3+
"version": "6.56.3",
44
"description": "Components, models, actions, and utility functions for LabKey applications and pages",
55
"sideEffects": false,
66
"files": [
@@ -50,7 +50,7 @@
5050
"homepage": "https://github.com/LabKey/labkey-ui-components#readme",
5151
"dependencies": {
5252
"@hello-pangea/dnd": "18.0.1",
53-
"@labkey/api": "1.42.0",
53+
"@labkey/api": "1.42.1",
5454
"@testing-library/dom": "~10.4.0",
5555
"@testing-library/jest-dom": "~6.6.3",
5656
"@testing-library/react": "~16.3.0",

packages/components/releaseNotes/components.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ Components, models, actions, and utility functions for LabKey applications and p
66
- GitHub Issue 783: Hide domain designer field Advanced Settings that are not currently implemented in app
77
- GitHub Issue 788: Domain Designer better handling of invalid lookup query value for Sample data type
88

9+
### version 6.56.3
10+
*Released*: 24 July 2025
11+
- Address Issue 53366 by not putting `undefined` into `List<ValueDescriptor>`
12+
- Address Issue 53443 by fixing where we check for optional prop
13+
- Export `ValueDescriptor` for external usage
14+
- Update `NameIdSettings`, `BarTenderSettingsForm` and `ManageSampleStatusesPanel` to use app context for api
15+
916
### version 6.56.2
1017
*Released*: 21 July 2025
1118
- Issue 53451: JS error when deleting numeric filter values with Between operator

packages/components/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1889,6 +1889,7 @@ export type {
18891889
GridResponse,
18901890
UpdatedRow,
18911891
UpdatedRowValue,
1892+
ValueDescriptor,
18921893
} from './internal/components/editable/models';
18931894
export type { GetParentTypeDataForLineage } from './internal/components/entities/actions';
18941895
export type {

packages/components/src/internal/components/base/Grid.tsx

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ export class GridHeader extends PureComponent<GridHeaderProps, State> {
139139
}
140140
};
141141
handleDrop = (e): void => {
142-
var source = e.dataTransfer.getData('dragIndex');
142+
const source = e.dataTransfer.getData('dragIndex');
143143
const target = this.state.dragTarget;
144144
if (source && target && source !== target) {
145-
this.props?.onColumnDrop(source, target);
145+
this.props.onColumnDrop?.(source, target); // Issue 53443
146146
}
147147
};
148148

@@ -200,24 +200,24 @@ export class GridHeader extends PureComponent<GridHeaderProps, State> {
200200

201201
return (
202202
<th
203-
id={index}
204-
key={index}
205203
className={className}
206-
style={style}
207-
title={hideTooltip ? undefined : description}
204+
data-fieldkey={column.raw?.fieldKeyPath}
208205
draggable={draggable}
209-
onDragStart={this.handleDragStart}
206+
id={index}
207+
key={index}
208+
onClick={this.handleHeaderClick}
209+
onDragEnd={this.handleDragEnd}
210+
onDragEnter={this.handleDragEnter}
210211
onDragOver={this.handleDragOver}
212+
onDragStart={this.handleDragStart}
211213
onDrop={this.handleDrop}
212-
onDragEnter={this.handleDragEnter}
213-
onDragEnd={this.handleDragEnd}
214-
onClick={this.handleHeaderClick}
215-
data-fieldkey={column.raw?.fieldKeyPath}
214+
style={style}
215+
title={hideTooltip ? undefined : description}
216216
>
217217
{headerCell ? headerCell(column, i, columns.size) : title}
218218
{/* headerCell will render the helpTip, so only render here if not using headerCell() */}
219219
{!headerCell && column.helpTipRenderer && (
220-
<LabelHelpTip title={title} popoverClassName="label-help-arrow-top">
220+
<LabelHelpTip popoverClassName="label-help-arrow-top" title={title}>
221221
<HelpTipRenderer type={column.helpTipRenderer} />
222222
</LabelHelpTip>
223223
)}
@@ -242,7 +242,6 @@ const GridMessages: FC<GridMessagesProps> = memo(({ messages }) => (
242242
{messages
243243
.map((message: Map<string, string>, i) => {
244244
return (
245-
// eslint-disable-next-line react/no-array-index-key
246245
<div className={classNames('grid-message', message.get('type'))} key={i}>
247246
{message.get('content')}
248247
</div>
@@ -297,7 +296,7 @@ interface EmptyGridRowProps {
297296
}
298297

299298
const EmptyGridRow: FC<EmptyGridRowProps> = memo(({ colSpan, emptyText, isLoading, loadingText }) => (
300-
<tr key="grid-default-row" className={isLoading ? 'grid-loading' : 'grid-empty'}>
299+
<tr className={isLoading ? 'grid-loading' : 'grid-empty'} key="grid-default-row">
301300
<td colSpan={colSpan}>{isLoading ? loadingText : emptyText}</td>
302301
</tr>
303302
));
@@ -339,7 +338,7 @@ const GridBody: FC<GridBodyProps> = memo(props => {
339338
});
340339
GridBody.displayName = 'GridBody';
341340

342-
export type GridData = Array<Record<string, any>> | List<Map<string, any>>;
341+
export type GridData = List<Map<string, any>> | Record<string, any>[];
343342

344343
export interface GridProps {
345344
bordered?: boolean;

packages/components/src/internal/components/editable/actions.ts

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ interface MessageAndValue {
191191
valueDescriptor: ValueDescriptor;
192192
}
193193

194-
type MessageAndValueMap = { [colKey: string]: MessageAndValue[] };
194+
type MessageAndValueMap = Record<string, MessageAndValue[]>;
195195

196196
function resolveValueDescriptors(
197197
col: QueryColumn,
@@ -442,12 +442,12 @@ interface CellData {
442442
}
443443

444444
async function convertRowToEditorModelData(
445-
data: string | number | boolean,
445+
data: boolean | number | string,
446446
col: QueryColumn,
447447
containerPath: string
448448
): Promise<CellData> {
449449
let message: CellMessage;
450-
let valueDescriptors = List<ValueDescriptor>();
450+
const valueDescriptors: ValueDescriptor[] = [];
451451

452452
if (data && col?.isPublicLookup()) {
453453
// value had better be the rowId here, but it may be several in a comma-separated list.
@@ -456,18 +456,21 @@ async function convertRowToEditorModelData(
456456

457457
for (const val of values) {
458458
const messageAndValue = await getLookupDisplayValue(col, parseIntIfNumber(val), containerPath);
459-
valueDescriptors = valueDescriptors.push(messageAndValue.valueDescriptor);
460459
message = messageAndValue.message;
460+
461+
if (messageAndValue.valueDescriptor) {
462+
valueDescriptors.push(messageAndValue.valueDescriptor);
463+
}
461464
}
462465
} else {
463466
let display = data;
464467
if (col?.isTimeOrDateTimeColumn && typeof data === 'string') {
465468
display = getDateTimeDisplayValueFromStr(data, col);
466469
}
467-
valueDescriptors = valueDescriptors.push({ display, raw: data });
470+
valueDescriptors.push({ display, raw: data });
468471
}
469472

470-
return { message, valueDescriptors };
473+
return { message, valueDescriptors: List(valueDescriptors) };
471474
}
472475

473476
async function prepareInsertRowDataFromBulkForm(
@@ -510,7 +513,6 @@ async function addBulkRowsToEditorModel(
510513
const rowCount = editorModel.rowCount + numToAdd;
511514

512515
for (let rowIdx = editorModel.rowCount; rowIdx < rowCount; rowIdx++) {
513-
// eslint-disable-next-line no-loop-func
514516
rowData.forEach((value, colIdx) => {
515517
const fieldKey = editorModel.getFieldKeyByIndex(colIdx);
516518
const cellKey = genCellKey(fieldKey, rowIdx);
@@ -594,7 +596,6 @@ export function addColumns(
594596
let newCellValues = editorModel.cellValues;
595597

596598
for (let rowIdx = 0; rowIdx < editorModel.rowCount; rowIdx++) {
597-
// eslint-disable-next-line no-loop-func
598599
queryColumns.forEach((value: QueryColumn) => {
599600
newCellValues = newCellValues.set(genCellKey(value.fieldKey, rowIdx), List<ValueDescriptor>());
600601
});
@@ -745,7 +746,7 @@ export async function updateGridFromBulkForm(
745746
lockedOrReadonlyRows?: number[],
746747
isIncludedColumn?: (col: QueryColumn) => boolean,
747748
containerPath?: string,
748-
useEditorModelCols: boolean = false
749+
useEditorModelCols = false
749750
): Promise<Partial<EditorModel>> {
750751
let cellMessages = editorModel.cellMessages;
751752
let cellValues = editorModel.cellValues;
@@ -820,7 +821,7 @@ type PrefixAndNumber = [string | undefined, string | undefined];
820821
* number the number suffix is undefined. If the entire string is a number the prefix will be undefined. This method
821822
* intentionally does not parse the numbers.
822823
*/
823-
export function splitPrefixedNumber(value: string | number): PrefixAndNumber {
824+
export function splitPrefixedNumber(value: number | string): PrefixAndNumber {
824825
if (value === undefined || value === null || value === '') return [undefined, undefined];
825826
const text = value.toString();
826827
const matches = text?.toString().match(POSTFIX_REGEX);
@@ -871,7 +872,7 @@ interface SelectionIncrement {
871872
direction: IncrementDirection;
872873
increment?: number;
873874
incrementType: IncrementType;
874-
initialSelectionValues: Array<List<ValueDescriptor>>; // yes this is a very odd type, but we can clean it up when we rip out Immutable
875+
initialSelectionValues: List<ValueDescriptor>[]; // yes this is a very odd type, but we can clean it up when we rip out Immutable
875876
padLength?: number;
876877
prefix?: string;
877878
startingValue: number | string;
@@ -1041,7 +1042,7 @@ export function generateFillCellKeys(
10411042
export function parsePastedLookup(
10421043
column: QueryColumn,
10431044
descriptors: ValueDescriptor[],
1044-
value: string[] | string
1045+
value: string | string[]
10451046
): CellData {
10461047
const originalValues = List([{ display: value, raw: value }]);
10471048

@@ -1102,7 +1103,7 @@ async function getParsedLookup(
11021103
column: QueryColumn,
11031104
lookupValueCache: LookupValueCache,
11041105
display: any[],
1105-
value: string[] | string,
1106+
value: string | string[],
11061107
cellKey: string,
11071108
forUpdate: boolean,
11081109
targetContainerPath: string,

packages/components/src/internal/components/forms/model.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
import { fromJS, List, Map, OrderedMap, Record as ImmutableRecord } from 'immutable';
16+
import { fromJS, Record as ImmutableRecord, List, Map, OrderedMap } from 'immutable';
1717
import { Filter, Query } from '@labkey/api';
1818

1919
import { QueryInfo } from '../../../public/QueryInfo';

0 commit comments

Comments
 (0)