From 720b1b22b8a80f1af64342b3700ff4f8c1e1c5e6 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 18 Nov 2025 08:35:54 -0800 Subject: [PATCH 1/4] Default to auditBehavior: DETAILED in api wrappers --- .../components/entities/EntityMoveModal.tsx | 3 -- .../internal/components/entities/actions.ts | 13 +++++- .../src/internal/components/forms/actions.ts | 10 +++-- .../internal/components/picklist/actions.ts | 8 +--- .../samples/ManageSampleStatusesPanel.tsx | 5 --- packages/components/src/internal/query/api.ts | 40 +++++++++++-------- .../public/QueryModel/EditableDetailPanel.tsx | 3 +- 7 files changed, 45 insertions(+), 37 deletions(-) diff --git a/packages/components/src/internal/components/entities/EntityMoveModal.tsx b/packages/components/src/internal/components/entities/EntityMoveModal.tsx index 5f029071a9..c012b00a87 100644 --- a/packages/components/src/internal/components/entities/EntityMoveModal.tsx +++ b/packages/components/src/internal/components/entities/EntityMoveModal.tsx @@ -1,5 +1,4 @@ import React, { FC, memo, ReactNode, useCallback, useEffect, useState } from 'react'; -import { AuditBehaviorTypes } from '@labkey/api'; import { Progress } from '../base/Progress'; import { Modal } from '../../Modal'; @@ -12,7 +11,6 @@ import { HelpLink, MOVE_SAMPLES_TOPIC } from '../../util/helpLinks'; import { isLoading, LoadingState } from '../../../public/LoadingState'; import { AppURL } from '../../url/AppURL'; import { ComponentsAPIWrapper, getDefaultAPIWrapper } from '../../APIWrapper'; -import { getPermissionRestrictionMessage } from '../../util/messaging'; import { EntityDataType, OperationConfirmationData } from './models'; import { getEntityNoun } from './utils'; import { EntityMoveConfirmationModal } from './EntityMoveConfirmationModal'; @@ -87,7 +85,6 @@ export const EntityMoveModal: FC = memo(props => { schemaName: schemaQuery.schemaName, queryName: schemaQuery.queryName, rowIds: confirmationData.getActionableIds(), - auditBehavior: AuditBehaviorTypes.DETAILED, auditUserComment, }); const updatedUrl = targetAppURL.setContainerPath(targetContainerPath); diff --git a/packages/components/src/internal/components/entities/actions.ts b/packages/components/src/internal/components/entities/actions.ts index c405759c3c..8ceac4137d 100644 --- a/packages/components/src/internal/components/entities/actions.ts +++ b/packages/components/src/internal/components/entities/actions.ts @@ -1,4 +1,14 @@ -import { ActionURL, Ajax, Filter, getServerContext, PermissionTypes, Query, Security, Utils } from '@labkey/api'; +import { + ActionURL, + Ajax, + AuditBehaviorTypes, + Filter, + getServerContext, + PermissionTypes, + Query, + Security, + Utils, +} from '@labkey/api'; import { List, Map, OrderedMap } from 'immutable'; import { getSelected, getSelectedDataDeprecated } from '../../actions'; @@ -981,6 +991,7 @@ export function moveEntities(options: MoveEntitiesOptions): Promise { diff --git a/packages/components/src/internal/components/forms/actions.ts b/packages/components/src/internal/components/forms/actions.ts index e374cc63ff..da05370945 100644 --- a/packages/components/src/internal/components/forms/actions.ts +++ b/packages/components/src/internal/components/forms/actions.ts @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { AuditBehaviorTypes, PermissionTypes, Security, User } from '@labkey/api'; +import { PermissionTypes, Security, User } from '@labkey/api'; import { useCallback, useEffect, useState } from 'react'; -import { updateRows } from '../../query/api'; +import { QueryCommandResponse, updateRows } from '../../query/api'; import { naturalSortByProperty } from '../../../public/sort'; @@ -117,7 +117,10 @@ export function useUsersWithPermissions( return { error, loadingState, users }; } -export function updateRowFieldValue(model: QueryModel, name: string, value: any): Promise { +/** + * @deprecated Use api.query.updateRows instead + */ +export function updateRowFieldValue(model: QueryModel, name: string, value: any): Promise { return updateRows({ schemaQuery: model.schemaQuery, rows: [ @@ -127,6 +130,5 @@ export function updateRowFieldValue(model: QueryModel, name: string, value: any) }, ], containerPath: model.containerPath, - auditBehavior: AuditBehaviorTypes.DETAILED, }); } diff --git a/packages/components/src/internal/components/picklist/actions.ts b/packages/components/src/internal/components/picklist/actions.ts index bf8cd6d09a..aff159fc8a 100644 --- a/packages/components/src/internal/components/picklist/actions.ts +++ b/packages/components/src/internal/components/picklist/actions.ts @@ -1,4 +1,4 @@ -import { AuditBehaviorTypes, Domain, Filter, Query } from '@labkey/api'; +import { Domain, Filter, Query } from '@labkey/api'; import { List } from 'immutable'; @@ -220,11 +220,7 @@ export async function addSamplesToPicklist(listName: string, sampleIds: number[] const schemaQuery = new SchemaQuery(SCHEMAS.PICKLIST_TABLES.SCHEMA, listName); if (rows.size > 0) { - return await insertRows({ - schemaQuery, - rows, - auditBehavior: AuditBehaviorTypes.DETAILED, - }); + return await insertRows({ rows, schemaQuery }); } return new QueryCommandResponse({ diff --git a/packages/components/src/internal/components/samples/ManageSampleStatusesPanel.tsx b/packages/components/src/internal/components/samples/ManageSampleStatusesPanel.tsx index 5b14be94b1..c429244a6b 100644 --- a/packages/components/src/internal/components/samples/ManageSampleStatusesPanel.tsx +++ b/packages/components/src/internal/components/samples/ManageSampleStatusesPanel.tsx @@ -1,8 +1,6 @@ import React, { FC, memo, useCallback, useEffect, useMemo, useState } from 'react'; import { List } from 'immutable'; -import { AuditBehaviorTypes } from '@labkey/api'; - import { LoadingSpinner } from '../base/LoadingSpinner'; import { Alert } from '../base/Alert'; import { LockIcon } from '../base/LockIcon'; @@ -159,7 +157,6 @@ export const SampleStatusDetail: FC = memo(props => { schemaQuery: SCHEMAS.CORE_TABLES.DATA_STATES, rows: [stateToSave], containerPath: container?.path, - auditBehavior: AuditBehaviorTypes.DETAILED, }) .then(() => { onActionComplete(stateToSave.label); @@ -174,7 +171,6 @@ export const SampleStatusDetail: FC = memo(props => { schemaQuery: SCHEMAS.CORE_TABLES.DATA_STATES, rows: List([stateToSave]), containerPath: container?.path, - auditBehavior: AuditBehaviorTypes.DETAILED, }) .then(() => { onActionComplete(stateToSave.label); @@ -196,7 +192,6 @@ export const SampleStatusDetail: FC = memo(props => { schemaQuery: SCHEMAS.CORE_TABLES.DATA_STATES, containerPath: container?.path, rows: [updatedState], - auditBehavior: AuditBehaviorTypes.DETAILED, }) .then(() => { onActionComplete(undefined, true); diff --git a/packages/components/src/internal/query/api.ts b/packages/components/src/internal/query/api.ts index 45a210c4e3..a684337b6e 100644 --- a/packages/components/src/internal/query/api.ts +++ b/packages/components/src/internal/query/api.ts @@ -789,12 +789,11 @@ export class QueryCommandResponse { } export function getRequestAuditDetail(editMethod?: EDIT_METHOD): Record { - const auditDetails = {}; - if (editMethod) { - auditDetails['editMethod'] = editMethod; - } + const auditDetails: Record = {}; + if (editMethod) auditDetails.editMethod = editMethod; + const requestLocation = window.location.hash; - if (requestLocation) auditDetails['requestSource'] = requestLocation; + if (requestLocation) auditDetails.requestSource = requestLocation; return auditDetails; } @@ -804,11 +803,11 @@ export function insertRows(options: InsertRowsOptions): Promise): Map { } export interface UpdateRowsOptions - extends Omit, + extends Omit, QueryRequestOptionsBase { schemaQuery: SchemaQuery; } @@ -891,10 +890,11 @@ export interface UpdateRowsOptions export function updateRows(options: UpdateRowsOptions): Promise { return new Promise((resolve, reject) => { const { schemaQuery, editMethod, ...updateRowOptions } = options; - updateRowOptions['auditDetails'] = getRequestAuditDetail(editMethod); Query.updateRows({ + auditBehavior: AuditBehaviorTypes.DETAILED, autoFormFileData: true, ...updateRowOptions, + auditDetails: getRequestAuditDetail(editMethod), queryName: schemaQuery.queryName, schemaName: schemaQuery.schemaName, skipReselectRows: @@ -939,7 +939,6 @@ export function updateRowsByContainer( if (containerPaths.length < 2) { return updateRows({ containerPath: containerPaths?.[0], - auditBehavior: AuditBehaviorTypes.DETAILED, auditUserComment, rows, schemaQuery, @@ -967,7 +966,7 @@ export function updateRowsByContainer( } export interface DeleteRowsOptions - extends Omit, + extends Omit, QueryRequestOptionsBase { schemaQuery: SchemaQuery; } @@ -975,10 +974,11 @@ export interface DeleteRowsOptions export function deleteRows(options: DeleteRowsOptions): Promise { return new Promise((resolve, reject) => { const { schemaQuery, editMethod, ...deleteRowsOptions } = options; - deleteRowsOptions['auditDetails'] = getRequestAuditDetail(editMethod); Query.deleteRows({ apiVersion: 13.2, + auditBehavior: AuditBehaviorTypes.DETAILED, ...deleteRowsOptions, + auditDetails: getRequestAuditDetail(editMethod), schemaName: schemaQuery.schemaName, queryName: schemaQuery.queryName, success: response => { @@ -1000,15 +1000,23 @@ export function deleteRows(options: DeleteRowsOptions): Promise, QueryRequestOptionsBase {} +export interface SaveRowsOptions + extends Omit, + QueryRequestOptionsBase {} export function saveRows(options: SaveRowsOptions): Promise { return new Promise((resolve, reject) => { - const { editMethod, ...saveOptions } = options; - saveOptions['auditDetails'] = getRequestAuditDetail(editMethod); + const { commands, editMethod, ...saveOptions } = options; + + for (const item of commands) { + item.auditBehavior = item.auditBehavior ?? AuditBehaviorTypes.DETAILED; + } + Query.saveRows({ apiVersion: 13.2, ...saveOptions, + auditDetails: getRequestAuditDetail(editMethod), + commands, success: response => { resolve(response); }, @@ -1166,7 +1174,7 @@ export function importData(config: IImportData): Promise { return new Promise((resolve, reject) => { const auditDetails = getRequestAuditDetail(); QueryDOM.importData( - Object.assign({auditDetails}, config, { + Object.assign({ auditDetails }, config, { success: response => { if (response && response.exception) { reject(response); diff --git a/packages/components/src/public/QueryModel/EditableDetailPanel.tsx b/packages/components/src/public/QueryModel/EditableDetailPanel.tsx index 205e48c126..a936c09781 100644 --- a/packages/components/src/public/QueryModel/EditableDetailPanel.tsx +++ b/packages/components/src/public/QueryModel/EditableDetailPanel.tsx @@ -1,6 +1,6 @@ import React, { FC, ReactNode, useCallback, useState } from 'react'; import { fromJS } from 'immutable'; -import { AuditBehaviorTypes, Query } from '@labkey/api'; +import { Query } from '@labkey/api'; import { Formsy } from '../../internal/components/forms/formsy'; import { DetailPanelHeader } from '../../internal/components/forms/detail/DetailPanelHeader'; @@ -140,7 +140,6 @@ export const EditableDetailPanel: FC = props => { await api.query.updateRows({ editMethod: EDIT_METHOD.DETAIL_EDIT, - auditBehavior: AuditBehaviorTypes.DETAILED, containerPath, rows: [updatedValues], schemaQuery: queryInfo.schemaQuery, From 0d5e1cfd7c4786527c92670bc0103c95d8e1c74e Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Thu, 20 Nov 2025 16:06:51 -0800 Subject: [PATCH 2/4] Prepare release notes --- packages/components/releaseNotes/components.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index dd8888c065..7dd5a3188d 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -1,6 +1,10 @@ # @labkey/components Components, models, actions, and utility functions for LabKey applications and pages +### version 6.72.0 +*Released*: 20 November 2025 +- Default to detailed audit behavior + ### version 6.71.1 *Released*: 20 November 2025 - Sample Amount/Units polish From 57da0254e0621aa14027c1b6932462c284d66de5 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Thu, 20 Nov 2025 16:07:24 -0800 Subject: [PATCH 3/4] lint --- packages/components/src/internal/query/api.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/components/src/internal/query/api.ts b/packages/components/src/internal/query/api.ts index a684337b6e..65aaaabf39 100644 --- a/packages/components/src/internal/query/api.ts +++ b/packages/components/src/internal/query/api.ts @@ -374,8 +374,7 @@ function applyViewColumns( export class Renderers { static _check(columnMetadata, rawColumn, field, metadata) { const columnValue = columnMetadata[field]; - if (columnValue) - return columnValue; + if (columnValue) return columnValue; if (columnMetadata.conceptURI || rawColumn.conceptURI) { const concept = metadata.getIn([ From 475c6dabd02c7fa81f2fa32b4fa6daa975bc02bc Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Thu, 20 Nov 2025 16:08:11 -0800 Subject: [PATCH 4/4] 6.72.0 --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index d83fb8e684..fb53dd702d 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.71.1", + "version": "6.72.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.71.1", + "version": "6.72.0", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/packages/components/package.json b/packages/components/package.json index a87b81e8c8..3f49f2ee15 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.71.1", + "version": "6.72.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [