From eea096f2c8f196259656d6b158c10328a18d52ee Mon Sep 17 00:00:00 2001 From: XingY Date: Wed, 22 Oct 2025 19:51:44 -0700 Subject: [PATCH 01/12] Add auditing of what method was used for data imports, updates, deletes --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- packages/components/src/index.ts | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 9f6382cb40..0b1fc210bf 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.65.2", + "version": "6.65.3-fb-transactionAuditDetails.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.65.2", + "version": "6.65.3-fb-transactionAuditDetails.1", "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 2e5513e213..6daf8ec6e2 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.65.2", + "version": "6.65.3-fb-transactionAuditDetails.1", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index d011265baf..8fd960614e 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -52,6 +52,7 @@ import { arrayEquals, blurActiveElement, capitalizeFirstChar, + camelCaseToTitleCase, caseInsensitive, debounce, devToolsActive, @@ -1191,6 +1192,7 @@ export { BulkUpdateForm, cancelEvent, capitalizeFirstChar, + camelCaseToTitleCase, Cards, caseInsensitive, changeColumn, From ebfb6becdb3d334ac241c1d866097a4684f4bc08 Mon Sep 17 00:00:00 2001 From: XingY Date: Thu, 23 Oct 2025 21:48:19 -0700 Subject: [PATCH 02/12] Add auditing of what method was used for data imports, updates, deletes --- packages/components/package-lock.json | 13 +++-- packages/components/package.json | 4 +- packages/components/src/index.ts | 6 ++- .../internal/components/entities/actions.ts | 4 ++ .../src/internal/components/forms/actions.ts | 12 ----- .../internal/components/samples/actions.ts | 1 + packages/components/src/internal/constants.ts | 10 ++++ .../src/internal/query/APIWrapper.ts | 6 +++ packages/components/src/internal/query/api.ts | 50 +++++++++++++++---- .../public/QueryModel/EditableDetailPanel.tsx | 2 + 10 files changed, 75 insertions(+), 33 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 0b1fc210bf..01211b4c66 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,16 +1,16 @@ { "name": "@labkey/components", - "version": "6.65.3-fb-transactionAuditDetails.1", + "version": "6.65.3-fb-transactionAuditDetails.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.65.3-fb-transactionAuditDetails.1", + "version": "6.65.3-fb-transactionAuditDetails.2", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.43.0", + "@labkey/api": "1.43.1-fb-transactionAuditDetails.1", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", @@ -3492,10 +3492,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.43.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.43.0.tgz", - "integrity": "sha512-4hOQz+pM/QaCey6ooJEmEbElnR9+TDEzWG+8caFfeIX1iAg1335NXW3+/Xzs6a+L9ysRKds8bNgFPu2sxjPzfg==", - "license": "Apache-2.0" + "version": "1.43.1-fb-transactionAuditDetails.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.43.1-fb-transactionAuditDetails.1.tgz", + "integrity": "sha512-hmAnuMfkdRjhrf5uVLEkbNPJy29AcuHdUBJLvydrdBgpligGBj7XOc3MGKpBQoOxsHFV1pWZEjO9SXkcfW2MPg==" }, "node_modules/@labkey/build": { "version": "8.6.0", diff --git a/packages/components/package.json b/packages/components/package.json index 6daf8ec6e2..5655f9a3d6 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.65.3-fb-transactionAuditDetails.1", + "version": "6.65.3-fb-transactionAuditDetails.2", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ @@ -50,7 +50,7 @@ "homepage": "https://github.com/LabKey/labkey-ui-components#readme", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.43.0", + "@labkey/api": "1.43.1-fb-transactionAuditDetails.1", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index 8fd960614e..615b87d366 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -232,6 +232,7 @@ import { selectDistinctRows, selectRowsDeprecated, updateRows, + saveRows, } from './internal/query/api'; import { processSchemas } from './internal/query/utils'; import { @@ -254,6 +255,7 @@ import { AssayUploadTabs, DataViewInfoTypes, EXPORT_TYPES, + EDIT_METHOD, GRID_CHECKBOX_OPTIONS, IMPORT_DATA_FORM_TYPES, MAX_EDITABLE_GRID_ROWS, @@ -337,7 +339,6 @@ import { getUsersWithPermissions, handleInputTab, handleTabKeyOnTextArea, - updateRowFieldValue, useUsersWithPermissions, } from './internal/components/forms/actions'; import { FormStep, FormTabs, withFormSteps } from './internal/components/forms/FormStep'; @@ -1307,6 +1308,7 @@ export { ExperimentRunResolver, ExpirationDateColumnRenderer, EXPORT_TYPES, + EDIT_METHOD, ExtendedMap, fetchContainerSecurityPolicy, fetchDataClass, @@ -1772,8 +1774,8 @@ export { updateCellValuesForSampleIds, updateGridFromBulkForm, updatePicklist, - updateRowFieldValue, updateRows, + saveRows, updateSampleStorageData, uploadWebDavFile, URL_MAPPERS, diff --git a/packages/components/src/internal/components/entities/actions.ts b/packages/components/src/internal/components/entities/actions.ts index 17a59a5d0f..6bf41afa89 100644 --- a/packages/components/src/internal/components/entities/actions.ts +++ b/packages/components/src/internal/components/entities/actions.ts @@ -980,8 +980,12 @@ export function moveEntities(options: MoveEntitiesOptions): Promise { if (response.success) { resolve(response); diff --git a/packages/components/src/internal/components/forms/actions.ts b/packages/components/src/internal/components/forms/actions.ts index c6c4498c2e..267289a6d0 100644 --- a/packages/components/src/internal/components/forms/actions.ts +++ b/packages/components/src/internal/components/forms/actions.ts @@ -117,15 +117,3 @@ export function useUsersWithPermissions( return { error, loadingState, users }; } -export function updateRowFieldValue(model: QueryModel, name: string, value: any): Promise { - return updateRows({ - schemaQuery: model.schemaQuery, - rows: [ - { - rowId: model.getRowValue('rowId'), - [name]: value, - }, - ], - containerPath: model.containerPath, - }); -} diff --git a/packages/components/src/internal/components/samples/actions.ts b/packages/components/src/internal/components/samples/actions.ts index e802a77613..2408368b75 100644 --- a/packages/components/src/internal/components/samples/actions.ts +++ b/packages/components/src/internal/components/samples/actions.ts @@ -568,6 +568,7 @@ export function updateSampleStorageData( jsonData: { sampleRows: sampleStorageData, [STORED_AMOUNT_FIELDS.AUDIT_COMMENT]: userComment, + requestSource: window.location.hash, isDiscard, }, success: Utils.getCallbackWrapper(response => { diff --git a/packages/components/src/internal/constants.ts b/packages/components/src/internal/constants.ts index 6602cdbe7f..686d4c13c1 100644 --- a/packages/components/src/internal/constants.ts +++ b/packages/components/src/internal/constants.ts @@ -49,6 +49,16 @@ export enum EXPORT_TYPES { LABEL_TEMPLATE, } +export enum EDIT_METHOD { + DETAIL_EDIT = 'DetailEdit', + FORM_INSERT = 'FormInsert', + GRID_EDIT = 'GridEdit', + GRID_INSERT = 'GridInsert', + BULK_EDIT = 'BulkEdit', + BULK_EDIT_LINEAGE = 'BulkEditLineage', + DETAIL_EDIT_LINEAGE = 'DetailEditLineage', +} + export enum KEYS { Backspace = 8, Tab = 9, diff --git a/packages/components/src/internal/query/APIWrapper.ts b/packages/components/src/internal/query/APIWrapper.ts index ccc54f785e..84c45c03e8 100644 --- a/packages/components/src/internal/query/APIWrapper.ts +++ b/packages/components/src/internal/query/APIWrapper.ts @@ -60,11 +60,13 @@ import { SelectDistinctOptions, selectDistinctRows, updateRows, + saveRows, updateRowsByContainer, UpdateRowsOptions, } from './api'; import { executeSql, ExecuteSqlOptions, ExecuteSqlResponse } from './executeSql'; import { selectRows, SelectRowsOptions, SelectRowsResponse } from './selectRows'; +import { EDIT_METHOD } from '../constants'; export interface QueryAPIWrapper { clearSelected: (options: ClearSelectedOptions) => Promise; @@ -125,6 +127,7 @@ export interface QueryAPIWrapper { inherit: boolean, shared: boolean ) => Promise; + saveRows: (options: SaveRowsOptions) => Promise; saveRowsByContainer: (options: SaveRowsOptions, containerField?: string) => Promise; saveSessionView: ( schemaQuery: SchemaQuery, @@ -159,6 +162,7 @@ export interface QueryAPIWrapper { rows: any[], containerPaths: string[], auditUserComment: string, + editMethod?: EDIT_METHOD, containerField?: string ) => Promise; } @@ -182,6 +186,7 @@ export class QueryServerAPIWrapper implements QueryAPIWrapper { incrementClientSideMetricCount = incrementClientSideMetricCount; incrementRowCountMetric = incrementRowCountMetric; insertRows = insertRows; + saveRows = saveRows; renameGridView = renameGridView; replaceSelected = replaceSelected; saveGridView = saveGridView; @@ -225,6 +230,7 @@ export function getQueryTestAPIWrapper( renameGridView: mockFn(), replaceSelected: mockFn(), saveGridView: mockFn(), + saveRows: mockFn(), saveRowsByContainer: mockFn(), saveSessionView: mockFn(), selectRows: mockFn(), diff --git a/packages/components/src/internal/query/api.ts b/packages/components/src/internal/query/api.ts index ee4606c7ef..6c933333fe 100644 --- a/packages/components/src/internal/query/api.ts +++ b/packages/components/src/internal/query/api.ts @@ -36,6 +36,7 @@ import { ViewInfo, ViewInfoJson } from '../ViewInfo'; import { URLResolver } from '../url/URLResolver'; import { ModuleContext } from '../components/base/ServerContext'; import { handleRequestFailure, RequestHandler } from '../request'; +import { EDIT_METHOD } from '../constants'; let queryDetailsCache: Record> = {}; @@ -741,8 +742,11 @@ export class InsertRowsErrorResponse extends ImmutableRecord({ } } +export interface QueryRequestOptionsBase { + editMethod?: EDIT_METHOD; +} export interface InsertRowsOptions - extends Omit { + extends Omit, QueryRequestOptionsBase { fillEmptyFields?: boolean; rows: List; // TODO: convert to Array> schemaQuery: SchemaQuery; @@ -779,11 +783,25 @@ export class QueryCommandResponse { } } +function getRequestAuditDetail(editMethod?: EDIT_METHOD): Record { + const auditDetails = {}; + if (editMethod) { + auditDetails['editMethod'] = editMethod; + } + const requestLocation = window.location.hash; + if (requestLocation) + auditDetails['requestSource'] = requestLocation; + + return auditDetails; +} + export function insertRows(options: InsertRowsOptions): Promise { return new Promise((resolve, reject) => { - const { fillEmptyFields, rows, schemaQuery, ...insertRowsOptions } = options; + const { fillEmptyFields, editMethod, rows, schemaQuery, ...insertRowsOptions } = options; const _rows = fillEmptyFields === true ? ensureAllFieldsInAllRows(rows) : rows; + insertRowsOptions['auditDetails'] = getRequestAuditDetail(editMethod); + Query.insertRows({ autoFormFileData: true, ...insertRowsOptions, @@ -860,13 +878,14 @@ function ensureNullForUndefined(row: Map): Map { return row.reduce((map, v, k) => map.set(k, v === undefined ? null : v), Map()); } -export interface UpdateRowsOptions extends Omit { +export interface UpdateRowsOptions extends Omit, QueryRequestOptionsBase { schemaQuery: SchemaQuery; } export function updateRows(options: UpdateRowsOptions): Promise { return new Promise((resolve, reject) => { - const { schemaQuery, ...updateRowOptions } = options; + const { schemaQuery, editMethod, ...updateRowOptions } = options; + updateRowOptions['auditDetails'] = getRequestAuditDetail(editMethod); Query.updateRows({ autoFormFileData: true, ...updateRowOptions, @@ -907,6 +926,7 @@ export function updateRowsByContainer( rows: any[], containerPaths: string[], auditUserComment: string, + editMethod: EDIT_METHOD, containerField = 'Folder' ): Promise { // if all rows are in the same container, we can use updateRows (which supports file/attachments) @@ -917,6 +937,7 @@ export function updateRowsByContainer( auditUserComment, rows, schemaQuery, + editMethod }); } else { const commands: Query.Command[] = []; @@ -929,17 +950,21 @@ export function updateRowsByContainer( auditUserComment, skipReselectRows: true, }); - return saveRowsByContainer({ commands }, containerField); + return saveRowsByContainer({ + commands, + editMethod + }, containerField); } } -export interface DeleteRowsOptions extends Omit { +export interface DeleteRowsOptions extends Omit, QueryRequestOptionsBase { schemaQuery: SchemaQuery; } export function deleteRows(options: DeleteRowsOptions): Promise { return new Promise((resolve, reject) => { - const { schemaQuery, ...deleteRowsOptions } = options; + const { schemaQuery, editMethod, ...deleteRowsOptions } = options; + deleteRowsOptions['auditDetails'] = getRequestAuditDetail(editMethod); Query.deleteRows({ apiVersion: 13.2, ...deleteRowsOptions, @@ -964,13 +989,15 @@ export function deleteRows(options: DeleteRowsOptions): Promise; +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); Query.saveRows({ apiVersion: 13.2, - ...options, + ...saveOptions, success: response => { resolve(response); }, @@ -1044,10 +1071,11 @@ export function deleteRowsByContainer( }); } + const { editMethod, ...deleteOptions } = options; Object.keys(containerRows).forEach(containerPath => { const rows = containerRows[containerPath]; commands.push({ - ...options, + ...deleteOptions, command: 'delete', schemaName: options.schemaQuery.schemaName, queryName: options.schemaQuery.queryName, @@ -1058,6 +1086,8 @@ export function deleteRowsByContainer( return new Promise((resolve, reject) => { saveRows({ + ...deleteOptions, + editMethod, commands, }) .then(response => { diff --git a/packages/components/src/public/QueryModel/EditableDetailPanel.tsx b/packages/components/src/public/QueryModel/EditableDetailPanel.tsx index 2fa3ca6875..209e89bd13 100644 --- a/packages/components/src/public/QueryModel/EditableDetailPanel.tsx +++ b/packages/components/src/public/QueryModel/EditableDetailPanel.tsx @@ -21,6 +21,7 @@ import { useAppContext } from '../../internal/AppContext'; import { QueryModel } from './QueryModel'; import { DetailPanel, DetailPanelWithModel } from './DetailPanel'; +import { EDIT_METHOD } from '../../internal/constants'; export interface EditableDetailPanelProps { appEditable?: boolean; @@ -139,6 +140,7 @@ export const EditableDetailPanel: FC = props => { onBeforeUpdate?.(updatedValues); await api.query.updateRows({ + editMethod: EDIT_METHOD.DETAIL_EDIT, auditBehavior: AuditBehaviorTypes.DETAILED, containerPath, rows: [updatedValues], From 44d4d0fb81ad9b1845a7d826d215176515027f18 Mon Sep 17 00:00:00 2001 From: XingY Date: Thu, 23 Oct 2025 21:50:59 -0700 Subject: [PATCH 03/12] lint --- packages/components/src/index.ts | 12 ++++---- .../internal/components/entities/actions.ts | 2 +- .../src/internal/components/forms/actions.ts | 1 - packages/components/src/internal/constants.ts | 6 ++-- .../src/internal/query/APIWrapper.ts | 2 +- packages/components/src/internal/query/api.ts | 29 ++++++++++++------- .../public/QueryModel/EditableDetailPanel.tsx | 14 ++++----- 7 files changed, 36 insertions(+), 30 deletions(-) diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index 615b87d366..508a505bc9 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -51,8 +51,8 @@ import { applyDevTools, arrayEquals, blurActiveElement, - capitalizeFirstChar, camelCaseToTitleCase, + capitalizeFirstChar, caseInsensitive, debounce, devToolsActive, @@ -229,10 +229,10 @@ import { loadQueries, loadQueriesFromTable, QueryCommandResponse, + saveRows, selectDistinctRows, selectRowsDeprecated, updateRows, - saveRows, } from './internal/query/api'; import { processSchemas } from './internal/query/utils'; import { @@ -254,8 +254,8 @@ import { flattenBrowseDataTreeResponse, loadReports } from './internal/query/rep import { AssayUploadTabs, DataViewInfoTypes, - EXPORT_TYPES, EDIT_METHOD, + EXPORT_TYPES, GRID_CHECKBOX_OPTIONS, IMPORT_DATA_FORM_TYPES, MAX_EDITABLE_GRID_ROWS, @@ -1191,9 +1191,9 @@ export { BreadcrumbCreate, buildURL, BulkUpdateForm, + camelCaseToTitleCase, cancelEvent, capitalizeFirstChar, - camelCaseToTitleCase, Cards, caseInsensitive, changeColumn, @@ -1285,6 +1285,7 @@ export { DropdownButton, DropdownMenu, DropdownSection, + EDIT_METHOD, EditableDetailPanel, EditableGrid, EditableGridEvent, @@ -1308,7 +1309,6 @@ export { ExperimentRunResolver, ExpirationDateColumnRenderer, EXPORT_TYPES, - EDIT_METHOD, ExtendedMap, fetchContainerSecurityPolicy, fetchDataClass, @@ -1705,6 +1705,7 @@ export { SampleTypeModel, saveDomain, SavedSettings, + saveRows, SchemaDetails, SchemaQuery, SCHEMAS, @@ -1775,7 +1776,6 @@ export { updateGridFromBulkForm, updatePicklist, updateRows, - saveRows, updateSampleStorageData, uploadWebDavFile, URL_MAPPERS, diff --git a/packages/components/src/internal/components/entities/actions.ts b/packages/components/src/internal/components/entities/actions.ts index 6bf41afa89..52a5d4d49a 100644 --- a/packages/components/src/internal/components/entities/actions.ts +++ b/packages/components/src/internal/components/entities/actions.ts @@ -981,7 +981,7 @@ export function moveEntities(options: MoveEntitiesOptions): Promise, QueryRequestOptionsBase { + extends Omit, + QueryRequestOptionsBase { fillEmptyFields?: boolean; rows: List; // TODO: convert to Array> schemaQuery: SchemaQuery; @@ -789,8 +790,7 @@ function getRequestAuditDetail(editMethod?: EDIT_METHOD): Record auditDetails['editMethod'] = editMethod; } const requestLocation = window.location.hash; - if (requestLocation) - auditDetails['requestSource'] = requestLocation; + if (requestLocation) auditDetails['requestSource'] = requestLocation; return auditDetails; } @@ -878,7 +878,9 @@ function ensureNullForUndefined(row: Map): Map { return row.reduce((map, v, k) => map.set(k, v === undefined ? null : v), Map()); } -export interface UpdateRowsOptions extends Omit, QueryRequestOptionsBase { +export interface UpdateRowsOptions + extends Omit, + QueryRequestOptionsBase { schemaQuery: SchemaQuery; } @@ -937,7 +939,7 @@ export function updateRowsByContainer( auditUserComment, rows, schemaQuery, - editMethod + editMethod, }); } else { const commands: Query.Command[] = []; @@ -950,14 +952,19 @@ export function updateRowsByContainer( auditUserComment, skipReselectRows: true, }); - return saveRowsByContainer({ - commands, - editMethod - }, containerField); + return saveRowsByContainer( + { + commands, + editMethod, + }, + containerField + ); } } -export interface DeleteRowsOptions extends Omit, QueryRequestOptionsBase { +export interface DeleteRowsOptions + extends Omit, + QueryRequestOptionsBase { schemaQuery: SchemaQuery; } @@ -989,7 +996,7 @@ export function deleteRows(options: DeleteRowsOptions): Promise, QueryRequestOptionsBase {}; +export interface SaveRowsOptions extends Omit, QueryRequestOptionsBase {} export function saveRows(options: SaveRowsOptions): Promise { return new Promise((resolve, reject) => { diff --git a/packages/components/src/public/QueryModel/EditableDetailPanel.tsx b/packages/components/src/public/QueryModel/EditableDetailPanel.tsx index 209e89bd13..1a60e1d7ac 100644 --- a/packages/components/src/public/QueryModel/EditableDetailPanel.tsx +++ b/packages/components/src/public/QueryModel/EditableDetailPanel.tsx @@ -164,10 +164,10 @@ export const EditableDetailPanel: FC = props => { const panel = (
@@ -218,27 +218,27 @@ export const EditableDetailPanel: FC = props => { return ( {panel} - From 37e150735f250af2d9e7f1027e762cf7faddd103 Mon Sep 17 00:00:00 2001 From: XingY Date: Sun, 26 Oct 2025 15:03:42 -0700 Subject: [PATCH 04/12] Add test --- packages/components/package-lock.json | 12 ++++++------ packages/components/package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index c363ddf7e9..5992c62f70 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,16 +1,16 @@ { "name": "@labkey/components", - "version": "6.66.1-fb-transactionAuditDetails.1", + "version": "6.66.1-fb-transactionAuditDetails.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.66.1-fb-transactionAuditDetails.1", + "version": "6.66.1-fb-transactionAuditDetails.2", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.43.1-fb-transactionAuditDetails.1", + "@labkey/api": "1.43.1-fb-transactionAuditDetails.2", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", @@ -3492,9 +3492,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.43.1-fb-transactionAuditDetails.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.43.1-fb-transactionAuditDetails.1.tgz", - "integrity": "sha512-hmAnuMfkdRjhrf5uVLEkbNPJy29AcuHdUBJLvydrdBgpligGBj7XOc3MGKpBQoOxsHFV1pWZEjO9SXkcfW2MPg==" + "version": "1.43.1-fb-transactionAuditDetails.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.43.1-fb-transactionAuditDetails.2.tgz", + "integrity": "sha512-E2d2zVXUT63254M9BHeC6Rx5WK5Dy5qPUuUoBzfct4yzM+HnpfcqokmOh3n9aN8seAzgAgRK7jNU5IrWtcYLlg==" }, "node_modules/@labkey/build": { "version": "8.6.0", diff --git a/packages/components/package.json b/packages/components/package.json index d8da424f74..9d5d1656f5 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.66.1-fb-transactionAuditDetails.1", + "version": "6.66.1-fb-transactionAuditDetails.2", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ @@ -50,7 +50,7 @@ "homepage": "https://github.com/LabKey/labkey-ui-components#readme", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.43.1-fb-transactionAuditDetails.1", + "@labkey/api": "1.43.1-fb-transactionAuditDetails.2", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", From c07c9c560cd4a7e6c9f4256e07d315df1030418c Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 27 Oct 2025 13:25:20 -0700 Subject: [PATCH 05/12] Storage view actions --- .../components/src/internal/components/samples/actions.ts | 5 ++++- packages/components/src/internal/constants.ts | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/components/src/internal/components/samples/actions.ts b/packages/components/src/internal/components/samples/actions.ts index 2408368b75..94617c5cbc 100644 --- a/packages/components/src/internal/components/samples/actions.ts +++ b/packages/components/src/internal/components/samples/actions.ts @@ -53,6 +53,7 @@ import { QueryInfo } from '../../../public/QueryInfo'; import { ALL_AMOUNT_AND_UNITS_COLUMNS_LC, SAMPLE_STORAGE_COLUMNS_LC, STORED_AMOUNT_FIELDS } from './constants'; import { FindField, GroupedSampleFields, SampleState, SampleStateType } from './models'; import { executeSql, ExecuteSqlResponseWithSession } from '../../query/executeSql'; +import { EDIT_METHOD } from '../../constants'; export async function getSampleSet(config: IEntityTypeDetails): Promise { const response = await request({ @@ -556,7 +557,8 @@ export function updateSampleStorageData( sampleStorageData: SampleStorageData[], containerPath?: string, userComment?: string, - isDiscard = false + isDiscard = false, + editMethod?: EDIT_METHOD ): Promise { if (sampleStorageData.length === 0) { return Promise.resolve(); @@ -569,6 +571,7 @@ export function updateSampleStorageData( sampleRows: sampleStorageData, [STORED_AMOUNT_FIELDS.AUDIT_COMMENT]: userComment, requestSource: window.location.hash, + editMethod: editMethod, isDiscard, }, success: Utils.getCallbackWrapper(response => { diff --git a/packages/components/src/internal/constants.ts b/packages/components/src/internal/constants.ts index d62d5657b3..808da4437d 100644 --- a/packages/components/src/internal/constants.ts +++ b/packages/components/src/internal/constants.ts @@ -57,6 +57,7 @@ export enum EDIT_METHOD { FORM_INSERT = 'FormInsert', GRID_EDIT = 'GridEdit', GRID_INSERT = 'GridInsert', + STORAGE_VIEW_ACTION = 'StorageViewAction' } export enum KEYS { From 4af2ca50739712d16933a9c56f9bf4f2ea7421bc Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 27 Oct 2025 13:33:31 -0700 Subject: [PATCH 06/12] Storage view actions --- packages/components/package-lock.json | 4 +- packages/components/package.json | 2 +- packages/components/src/internal/constants.ts | 182 +++++++++--------- .../public/QueryModel/EditableDetailPanel.tsx | 5 +- 4 files changed, 96 insertions(+), 97 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 5992c62f70..7f2207c23e 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.66.1-fb-transactionAuditDetails.2", + "version": "6.66.1-fb-transactionAuditDetails.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.66.1-fb-transactionAuditDetails.2", + "version": "6.66.1-fb-transactionAuditDetails.3", "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 9d5d1656f5..591a99131a 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.66.1-fb-transactionAuditDetails.2", + "version": "6.66.1-fb-transactionAuditDetails.3", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ diff --git a/packages/components/src/internal/constants.ts b/packages/components/src/internal/constants.ts index 808da4437d..d48a027366 100644 --- a/packages/components/src/internal/constants.ts +++ b/packages/components/src/internal/constants.ts @@ -34,8 +34,8 @@ export const MAX_EDITABLE_GRID_ROWS = MAX_SELECTION_ACTION_ROWS; export const LOOKUP_DEFAULT_SIZE = 25; export enum AssayUploadTabs { - Grid = 1, Files = 2, + Grid = 1, } export enum EXPORT_TYPES { @@ -57,88 +57,89 @@ export enum EDIT_METHOD { FORM_INSERT = 'FormInsert', GRID_EDIT = 'GridEdit', GRID_INSERT = 'GridInsert', - STORAGE_VIEW_ACTION = 'StorageViewAction' + STORAGE_VIEW_ACTION = 'StorageViewAction', } export enum KEYS { - Backspace = 8, - Tab = 9, - Enter = 13, - Shift = 16, - Ctrl = 17, + A = 65, + Add = 107, Alt = 18, - PauseBreak = 19, - CapsLock = 20, - Escape = 27, - Space = 32, - PageUp = 33, - PageDown = 34, - End = 35, - Home = 36, - - LeftArrow = 37, - UpArrow = 38, - RightArrow = 39, - DownArrow = 40, - - Insert = 45, - Delete = 46, - - Zero = 48, - ClosedParen = Zero, - One = 49, - ExclamationMark = One, - Two = 50, - AtSign = Two, - Three = 51, - PoundSign = Three, - Hash = PoundSign, - Four = 52, - DollarSign = Four, - Five = 53, - PercentSign = Five, - Six = 54, - Caret = Six, - Hat = Caret, Seven = 55, Ampersand = Seven, Eight = 56, Star = Eight, Asterik = Star, - Nine = 57, - OpenParen = Nine, - - A = 65, + Two = 50, + AtSign = Two, B = 66, + Backspace = 8, C = 67, + CapsLock = 20, + + Six = 54, + Caret = Six, + ClosedBracket = 221, + Zero = 48, + + ClosedParen = Zero, + Comma = 188, + + Ctrl = 17, D = 68, + Dash = 189, + DecimalPoint = 110, + Delete = 46, + Divide = 111, + Four = 52, + DollarSign = Four, + DownArrow = 40, E = 69, + End = 35, + Enter = 13, + Equals = 187, + Escape = 27, + One = 49, + ExclamationMark = One, F = 70, + F1 = 112, + F2 = 113, + F3 = 114, + F4 = 115, + F5 = 116, + F6 = 117, + + F7 = 118, + F8 = 119, + F9 = 120, + F10 = 121, + F11 = 122, + F12 = 123, + FFLeftMetaKey = 224, // Firefox + Five = 53, + ForwardSlash = 191, G = 71, + Tilde = 192, + GraveAccent = Tilde, H = 72, + Three = 51, + PoundSign = Three, + Hash = PoundSign, + Hat = Caret, + Home = 36, I = 73, + Insert = 45, J = 74, K = 75, L = 76, + LeftArrow = 37, + LeftMetaKey = 91, M = 77, - N = 78, - O = 79, - P = 80, - Q = 81, - R = 82, - S = 83, - T = 84, - U = 85, - V = 86, - W = 87, - X = 88, - Y = 89, - Z = 90, - LeftMetaKey = 91, - RightMetaKey = 92, - SelectKey = 93, + Multiply = 106, + N = 78, + Nine = 57, + NumLock = 144, Numpad0 = 96, Numpad1 = 97, Numpad2 = 98, @@ -148,46 +149,45 @@ export enum KEYS { Numpad6 = 102, Numpad7 = 103, Numpad8 = 104, - Numpad9 = 105, - Multiply = 106, - Add = 107, - Subtract = 109, - DecimalPoint = 110, - Divide = 111, + Numpad9 = 105, + O = 79, + OpenBracket = 219, + OpenParen = Nine, + P = 80, - F1 = 112, - F2 = 113, - F3 = 114, - F4 = 115, - F5 = 116, - F6 = 117, - F7 = 118, - F8 = 119, - F9 = 120, - F10 = 121, - F11 = 122, - F12 = 123, + PageDown = 34, + PageUp = 33, + PauseBreak = 19, + PercentSign = Five, + Period = 190, + PlusSign = Equals, + Q = 81, + Quote = 222, + R = 82, + RightArrow = 39, + RightMetaKey = 92, + S = 83, - NumLock = 144, ScrollLock = 145, + SelectKey = 93, SemiColon = 186, - Equals = 187, - Comma = 188, - Dash = 189, - Period = 190, + Shift = 16, + Space = 32, + Subtract = 109, + T = 84, + Tab = 9, + U = 85, UnderScore = Dash, - PlusSign = Equals, - ForwardSlash = 191, - Tilde = 192, - GraveAccent = Tilde, + UpArrow = 38, + V = 86, - OpenBracket = 219, - ClosedBracket = 221, - Quote = 222, + W = 87, + X = 88, + Y = 89, - FFLeftMetaKey = 224, // Firefox + Z = 90, } // This is used for filtering search results. Since we first check for search hits containing diff --git a/packages/components/src/public/QueryModel/EditableDetailPanel.tsx b/packages/components/src/public/QueryModel/EditableDetailPanel.tsx index 1a60e1d7ac..205e48c126 100644 --- a/packages/components/src/public/QueryModel/EditableDetailPanel.tsx +++ b/packages/components/src/public/QueryModel/EditableDetailPanel.tsx @@ -111,7 +111,6 @@ export const EditableDetailPanel: FC = props => { return ; }, []); - // eslint-disable-next-line @typescript-eslint/no-explicit-any const handleSubmit = useCallback( async (values: Record): Promise => { const { queryInfo } = model; @@ -149,8 +148,8 @@ export const EditableDetailPanel: FC = props => { }); setEditing(false); - onUpdate?.(); // eslint-disable-line no-unused-expressions - onEditToggle?.(false); // eslint-disable-line no-unused-expressions + onUpdate?.(); + onEditToggle?.(false); } catch (e) { setError(resolveErrorMessage(e, 'data', undefined, 'update')); setWarning(undefined); From d57c8f9ada9582a3b15e7c53f11b4465c984c746 Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 28 Oct 2025 21:32:45 -0700 Subject: [PATCH 07/12] code review --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- .../components/src/internal/components/samples/actions.ts | 2 +- packages/components/src/internal/query/api.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 7f2207c23e..420d0ceddc 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.66.1-fb-transactionAuditDetails.3", + "version": "6.66.1-fb-transactionAuditDetails.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.66.1-fb-transactionAuditDetails.3", + "version": "6.66.1-fb-transactionAuditDetails.4", "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 591a99131a..16c44e38d8 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.66.1-fb-transactionAuditDetails.3", + "version": "6.66.1-fb-transactionAuditDetails.4", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ diff --git a/packages/components/src/internal/components/samples/actions.ts b/packages/components/src/internal/components/samples/actions.ts index 94617c5cbc..856bf358f1 100644 --- a/packages/components/src/internal/components/samples/actions.ts +++ b/packages/components/src/internal/components/samples/actions.ts @@ -571,7 +571,7 @@ export function updateSampleStorageData( sampleRows: sampleStorageData, [STORED_AMOUNT_FIELDS.AUDIT_COMMENT]: userComment, requestSource: window.location.hash, - editMethod: editMethod, + editMethod, isDiscard, }, success: Utils.getCallbackWrapper(response => { diff --git a/packages/components/src/internal/query/api.ts b/packages/components/src/internal/query/api.ts index 5d919592ce..f91b22862e 100644 --- a/packages/components/src/internal/query/api.ts +++ b/packages/components/src/internal/query/api.ts @@ -928,7 +928,7 @@ export function updateRowsByContainer( rows: any[], containerPaths: string[], auditUserComment: string, - editMethod: EDIT_METHOD, + editMethod?: EDIT_METHOD, containerField = 'Folder' ): Promise { // if all rows are in the same container, we can use updateRows (which supports file/attachments) From 0293628fe9ff4a23c88b7a96a411a306dbf84372 Mon Sep 17 00:00:00 2001 From: XingY Date: Thu, 30 Oct 2025 17:40:13 -0700 Subject: [PATCH 08/12] Code review changes --- packages/components/package-lock.json | 4 +- packages/components/package.json | 2 +- packages/components/src/index.ts | 2 + .../internal/components/entities/actions.ts | 7 +- .../src/internal/components/forms/actions.ts | 13 ++ .../internal/components/samples/actions.ts | 4 +- packages/components/src/internal/constants.ts | 178 +++++++++--------- packages/components/src/internal/query/api.ts | 2 +- 8 files changed, 112 insertions(+), 100 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 3fc230f881..0e01057325 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.67.2-fb-transactionAuditDetails.1", + "version": "6.67.2-fb-transactionAuditDetails.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.67.2-fb-transactionAuditDetails.1", + "version": "6.67.2-fb-transactionAuditDetails.2", "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 8c7a6f7b59..6241e5e27f 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.67.2-fb-transactionAuditDetails.1", + "version": "6.67.2-fb-transactionAuditDetails.2", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index 508a505bc9..41eaf4a98c 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -339,6 +339,7 @@ import { getUsersWithPermissions, handleInputTab, handleTabKeyOnTextArea, + updateRowFieldValue, useUsersWithPermissions, } from './internal/components/forms/actions'; import { FormStep, FormTabs, withFormSteps } from './internal/components/forms/FormStep'; @@ -1775,6 +1776,7 @@ export { updateCellValuesForSampleIds, updateGridFromBulkForm, updatePicklist, + updateRowFieldValue, updateRows, updateSampleStorageData, uploadWebDavFile, diff --git a/packages/components/src/internal/components/entities/actions.ts b/packages/components/src/internal/components/entities/actions.ts index 2dadf92a66..8fca72d705 100644 --- a/packages/components/src/internal/components/entities/actions.ts +++ b/packages/components/src/internal/components/entities/actions.ts @@ -6,7 +6,7 @@ import { getSelected, getSelectedDataDeprecated } from '../../actions'; import { SampleOperation } from '../samples/constants'; import { SchemaQuery } from '../../../public/SchemaQuery'; import { getFilterForSampleOperation, isSamplesSchema } from '../samples/utils'; -import { importData, InsertOptions } from '../../query/api'; +import { getRequestAuditDetail, importData, InsertOptions } from '../../query/api'; import { caseInsensitive, generateId } from '../../util/utils'; import { request } from '../../request'; import { EntityCreationType } from '../samples/models'; @@ -980,12 +980,9 @@ export function moveEntities(options: MoveEntitiesOptions): Promise { if (response.success) { resolve(response); diff --git a/packages/components/src/internal/components/forms/actions.ts b/packages/components/src/internal/components/forms/actions.ts index 3f311c5f79..c6c4498c2e 100644 --- a/packages/components/src/internal/components/forms/actions.ts +++ b/packages/components/src/internal/components/forms/actions.ts @@ -116,3 +116,16 @@ export function useUsersWithPermissions( return { error, loadingState, users }; } + +export function updateRowFieldValue(model: QueryModel, name: string, value: any): Promise { + return updateRows({ + schemaQuery: model.schemaQuery, + rows: [ + { + rowId: model.getRowValue('rowId'), + [name]: value, + }, + ], + containerPath: model.containerPath, + }); +} diff --git a/packages/components/src/internal/components/samples/actions.ts b/packages/components/src/internal/components/samples/actions.ts index 856bf358f1..3b657e1f19 100644 --- a/packages/components/src/internal/components/samples/actions.ts +++ b/packages/components/src/internal/components/samples/actions.ts @@ -35,6 +35,7 @@ import { SCHEMAS } from '../../schemas'; import { getQueryDetails, + getRequestAuditDetail, invalidateFullQueryDetailsCache, ISelectRowsResult, selectDistinctRows, @@ -570,8 +571,7 @@ export function updateSampleStorageData( jsonData: { sampleRows: sampleStorageData, [STORED_AMOUNT_FIELDS.AUDIT_COMMENT]: userComment, - requestSource: window.location.hash, - editMethod, + ...getRequestAuditDetail(editMethod), isDiscard, }, success: Utils.getCallbackWrapper(response => { diff --git a/packages/components/src/internal/constants.ts b/packages/components/src/internal/constants.ts index d48a027366..7a0cbf2acc 100644 --- a/packages/components/src/internal/constants.ts +++ b/packages/components/src/internal/constants.ts @@ -61,85 +61,84 @@ export enum EDIT_METHOD { } export enum KEYS { - A = 65, - Add = 107, + Backspace = 8, + Tab = 9, + Enter = 13, + Shift = 16, + Ctrl = 17, Alt = 18, + PauseBreak = 19, + CapsLock = 20, + Escape = 27, + Space = 32, + PageUp = 33, + PageDown = 34, + End = 35, + Home = 36, + + LeftArrow = 37, + UpArrow = 38, + RightArrow = 39, + DownArrow = 40, + + Insert = 45, + Delete = 46, + + Zero = 48, + ClosedParen = Zero, + One = 49, + ExclamationMark = One, + Two = 50, + AtSign = Two, + Three = 51, + PoundSign = Three, + Hash = PoundSign, + Four = 52, + DollarSign = Four, + Five = 53, + PercentSign = Five, + Six = 54, + Caret = Six, + Hat = Caret, Seven = 55, Ampersand = Seven, Eight = 56, Star = Eight, Asterik = Star, - Two = 50, - AtSign = Two, + Nine = 57, + OpenParen = Nine, + + A = 65, B = 66, - Backspace = 8, C = 67, - CapsLock = 20, - - Six = 54, - Caret = Six, - ClosedBracket = 221, - Zero = 48, - - ClosedParen = Zero, - Comma = 188, - - Ctrl = 17, D = 68, - Dash = 189, - DecimalPoint = 110, - Delete = 46, - Divide = 111, - Four = 52, - DollarSign = Four, - DownArrow = 40, E = 69, - End = 35, - Enter = 13, - Equals = 187, - Escape = 27, - One = 49, - ExclamationMark = One, F = 70, - F1 = 112, - F2 = 113, - F3 = 114, - F4 = 115, - F5 = 116, - F6 = 117, - - F7 = 118, - F8 = 119, - F9 = 120, - F10 = 121, - F11 = 122, - F12 = 123, - FFLeftMetaKey = 224, // Firefox - Five = 53, - ForwardSlash = 191, G = 71, - Tilde = 192, - GraveAccent = Tilde, H = 72, - Three = 51, - PoundSign = Three, - Hash = PoundSign, - Hat = Caret, - Home = 36, I = 73, - Insert = 45, J = 74, K = 75, L = 76, - LeftArrow = 37, - LeftMetaKey = 91, M = 77, - - Multiply = 106, N = 78, - Nine = 57, + O = 79, + P = 80, + Q = 81, + R = 82, + S = 83, + T = 84, + U = 85, + V = 86, + W = 87, + X = 88, + Y = 89, + Z = 90, + + LeftMetaKey = 91, + RightMetaKey = 92, + SelectKey = 93, - NumLock = 144, Numpad0 = 96, Numpad1 = 97, Numpad2 = 98, @@ -149,45 +148,46 @@ export enum KEYS { Numpad6 = 102, Numpad7 = 103, Numpad8 = 104, - Numpad9 = 105, - O = 79, - OpenBracket = 219, - OpenParen = Nine, - P = 80, - PageDown = 34, - PageUp = 33, - PauseBreak = 19, - PercentSign = Five, - Period = 190, - PlusSign = Equals, - Q = 81, - Quote = 222, - R = 82, - RightArrow = 39, - RightMetaKey = 92, - S = 83, + Multiply = 106, + Add = 107, + Subtract = 109, + DecimalPoint = 110, + Divide = 111, + + F1 = 112, + F2 = 113, + F3 = 114, + F4 = 115, + F5 = 116, + F6 = 117, + F7 = 118, + F8 = 119, + F9 = 120, + F10 = 121, + F11 = 122, + F12 = 123, + NumLock = 144, ScrollLock = 145, - SelectKey = 93, SemiColon = 186, - Shift = 16, - Space = 32, - Subtract = 109, - T = 84, - Tab = 9, - U = 85, + Equals = 187, + Comma = 188, + Dash = 189, + Period = 190, UnderScore = Dash, - UpArrow = 38, - V = 86, + PlusSign = Equals, + ForwardSlash = 191, + Tilde = 192, + GraveAccent = Tilde, - W = 87, - X = 88, - Y = 89, + OpenBracket = 219, + ClosedBracket = 221, + Quote = 222, - Z = 90, + FFLeftMetaKey = 224, // Firefox } // This is used for filtering search results. Since we first check for search hits containing diff --git a/packages/components/src/internal/query/api.ts b/packages/components/src/internal/query/api.ts index f91b22862e..560f7d9099 100644 --- a/packages/components/src/internal/query/api.ts +++ b/packages/components/src/internal/query/api.ts @@ -784,7 +784,7 @@ export class QueryCommandResponse { } } -function getRequestAuditDetail(editMethod?: EDIT_METHOD): Record { +export function getRequestAuditDetail(editMethod?: EDIT_METHOD): Record { const auditDetails = {}; if (editMethod) { auditDetails['editMethod'] = editMethod; From 5c2d815b4fd4666c25eb04150c6b278da09633a1 Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 31 Oct 2025 11:45:27 -0700 Subject: [PATCH 09/12] Bug fixes --- packages/components/package-lock.json | 12 ++++++------ packages/components/package.json | 4 ++-- .../src/internal/components/assay/actions.ts | 10 ++++++++-- packages/components/src/internal/query/api.ts | 3 ++- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 0e01057325..ad7568a56c 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,16 +1,16 @@ { "name": "@labkey/components", - "version": "6.67.2-fb-transactionAuditDetails.2", + "version": "6.67.2-fb-transactionAuditDetails.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.67.2-fb-transactionAuditDetails.2", + "version": "6.67.2-fb-transactionAuditDetails.5", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.43.1-fb-transactionAuditDetails.2", + "@labkey/api": "1.43.1-fb-transactionAuditDetails.5", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", @@ -3492,9 +3492,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.43.1-fb-transactionAuditDetails.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.43.1-fb-transactionAuditDetails.2.tgz", - "integrity": "sha512-E2d2zVXUT63254M9BHeC6Rx5WK5Dy5qPUuUoBzfct4yzM+HnpfcqokmOh3n9aN8seAzgAgRK7jNU5IrWtcYLlg==" + "version": "1.43.1-fb-transactionAuditDetails.5", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.43.1-fb-transactionAuditDetails.5.tgz", + "integrity": "sha512-NLK+UKuanrxwzptxw2ZGcvggPuYWrxs281EUEHSdmVs4Hn3TRPTgiZ188tHtkKWvtqVQSLADs+WcQuTbU9bzEw==" }, "node_modules/@labkey/build": { "version": "8.6.0", diff --git a/packages/components/package.json b/packages/components/package.json index 6241e5e27f..d43438ca67 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.67.2-fb-transactionAuditDetails.2", + "version": "6.67.2-fb-transactionAuditDetails.5", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ @@ -50,7 +50,7 @@ "homepage": "https://github.com/LabKey/labkey-ui-components#readme", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.43.1-fb-transactionAuditDetails.2", + "@labkey/api": "1.43.1-fb-transactionAuditDetails.5", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", diff --git a/packages/components/src/internal/components/assay/actions.ts b/packages/components/src/internal/components/assay/actions.ts index d5fe2ef35f..3d18ad21e7 100644 --- a/packages/components/src/internal/components/assay/actions.ts +++ b/packages/components/src/internal/components/assay/actions.ts @@ -22,6 +22,8 @@ import { handleRequestFailure } from '../../request'; import { AssayProtocolModel } from '../domainproperties/assay/models'; import { AssayUploadResultModel } from './models'; +import { getRequestAuditDetail } from '../../query/api'; +import { EDIT_METHOD } from '../../constants'; let assayDefinitionCache: { [key: string]: Promise } = {}; let protocolCache: Record> = {}; @@ -94,12 +96,16 @@ export function getProtocol(options: GetProtocolOptions): Promise; +export interface ImportAssayRunOptions extends Omit { + editMethod?: EDIT_METHOD; +} export function importAssayRun(config: ImportAssayRunOptions): Promise { return new Promise((resolve, reject) => { + const { editMethod, ...importConfig } = config; + importConfig['auditDetails'] = getRequestAuditDetail(editMethod); AssayDOM.importRun({ - ...config, + ...importConfig, success: rawModel => { resolve(new AssayUploadResultModel(rawModel)); }, diff --git a/packages/components/src/internal/query/api.ts b/packages/components/src/internal/query/api.ts index 560f7d9099..47a8768d0a 100644 --- a/packages/components/src/internal/query/api.ts +++ b/packages/components/src/internal/query/api.ts @@ -1160,8 +1160,9 @@ export interface IImportData { export function importData(config: IImportData): Promise { return new Promise((resolve, reject) => { + const auditDetails = getRequestAuditDetail(); QueryDOM.importData( - Object.assign({}, config, { + Object.assign({auditDetails}, config, { success: response => { if (response && response.exception) { reject(response); From 233338462889a18328b7766ae0f3cf01b35deb74 Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 31 Oct 2025 12:14:15 -0700 Subject: [PATCH 10/12] fix junit tests --- packages/components/package-lock.json | 12 ++++++------ packages/components/package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index ad7568a56c..77cccb14e6 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,16 +1,16 @@ { "name": "@labkey/components", - "version": "6.67.2-fb-transactionAuditDetails.5", + "version": "6.67.2-fb-transactionAuditDetails.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.67.2-fb-transactionAuditDetails.5", + "version": "6.67.2-fb-transactionAuditDetails.6", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.43.1-fb-transactionAuditDetails.5", + "@labkey/api": "1.43.1-fb-transactionAuditDetails.6", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", @@ -3492,9 +3492,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.43.1-fb-transactionAuditDetails.5", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.43.1-fb-transactionAuditDetails.5.tgz", - "integrity": "sha512-NLK+UKuanrxwzptxw2ZGcvggPuYWrxs281EUEHSdmVs4Hn3TRPTgiZ188tHtkKWvtqVQSLADs+WcQuTbU9bzEw==" + "version": "1.43.1-fb-transactionAuditDetails.6", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.43.1-fb-transactionAuditDetails.6.tgz", + "integrity": "sha512-Z6gUTWdiyGcxHUeADE3nIRobpFL9OvGmgvB5pfSWWWOcRFHEp2KCK3S8Qwr+a6ZdVRdjPsC8oiNt9aQhRObrVA==" }, "node_modules/@labkey/build": { "version": "8.6.0", diff --git a/packages/components/package.json b/packages/components/package.json index d43438ca67..338a90476e 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.67.2-fb-transactionAuditDetails.5", + "version": "6.67.2-fb-transactionAuditDetails.6", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ @@ -50,7 +50,7 @@ "homepage": "https://github.com/LabKey/labkey-ui-components#readme", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.43.1-fb-transactionAuditDetails.5", + "@labkey/api": "1.43.1-fb-transactionAuditDetails.6", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", From da74e311297e3b358f7a422d4f66c6b89be3df91 Mon Sep 17 00:00:00 2001 From: XingY Date: Sat, 1 Nov 2025 20:22:17 -0700 Subject: [PATCH 11/12] wire up addSamples action --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- packages/components/src/index.ts | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 8d4be838f3..d0a0e40423 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.67.4-fb-transactionAuditDetails.1", + "version": "6.67.4-fb-transactionAuditDetails.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.67.4-fb-transactionAuditDetails.1", + "version": "6.67.4-fb-transactionAuditDetails.2", "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 4b993bcb2b..5d67289fc0 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.67.4-fb-transactionAuditDetails.1", + "version": "6.67.4-fb-transactionAuditDetails.2", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index 41eaf4a98c..f56ddd2092 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -219,6 +219,7 @@ import { getContainerFilterForFolder, getContainerFilterForLookups, getQueryDetails, + getRequestAuditDetail, getVerbForInsertOption, importData, InsertFormats, @@ -1425,6 +1426,7 @@ export { getQueryFormLabelFieldName, getQueryModelExportParams, getQueryParams, + getRequestAuditDetail, getRolesByUniqueName, getSampleDomainDefaultSystemFields, getSampleFinderLocalStorageKey, From 10a2fe9c6cfc5dcae8261072f099e5c3ce4e1fa5 Mon Sep 17 00:00:00 2001 From: XingY Date: Sun, 2 Nov 2025 07:13:38 -0800 Subject: [PATCH 12/12] publish --- packages/components/package-lock.json | 12 ++++++------ packages/components/package.json | 4 ++-- packages/components/releaseNotes/components.md | 11 ++++++++--- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index d0a0e40423..186355f862 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,16 +1,16 @@ { "name": "@labkey/components", - "version": "6.67.4-fb-transactionAuditDetails.2", + "version": "6.68.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.67.4-fb-transactionAuditDetails.2", + "version": "6.68.0", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.43.2-fb-transactionAuditDetails.1", + "@labkey/api": "1.43.2", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", @@ -3492,9 +3492,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.43.2-fb-transactionAuditDetails.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.43.2-fb-transactionAuditDetails.1.tgz", - "integrity": "sha512-o56N9HttFnkQnTkeYaQTn2QfAK6DH+dc6AKYZUlg1lw2GabyWvijKLsGWFFI2Jr8ksekjtOuHyqKZBaWmB5gQQ==" + "version": "1.43.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.43.2.tgz", + "integrity": "sha512-GYMwf/n6pycbjwTVshmVLUSiJ8ld/fTXlcVPCXsAANvRG0UYIE+LohNmnDOQQN0KVlAFyjSSWSV17wqvPgsVHA==" }, "node_modules/@labkey/build": { "version": "8.6.0", diff --git a/packages/components/package.json b/packages/components/package.json index 5d67289fc0..7869bedd9a 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.67.4-fb-transactionAuditDetails.2", + "version": "6.68.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ @@ -50,7 +50,7 @@ "homepage": "https://github.com/LabKey/labkey-ui-components#readme", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.43.2-fb-transactionAuditDetails.1", + "@labkey/api": "1.43.2", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index e50f83f44e..34b4cf0e96 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -1,12 +1,17 @@ # @labkey/components Components, models, actions, and utility functions for LabKey applications and pages +### version 6.68.0 +*Released* 2 November 2025 +- Add auditing of what method was used for CRUD + - Modified api.query.insertRows/updateRows/deleteRows/saveRows and moveEntities to accept and process editMethod parameter and record request hash in 'requestSource` + ### version 6.67.3 *Released*: 1 November 2025 - Issue 54160: Non US date parsing in the app - - Added `getAltNonUSParseFormats` date utility function to provide alternative parse formats for common non-US date/datetime formats - - Update DatePickerInput to use alternative parse formats when server date format is non-US - - Update parseDate utility function to use alternative non-US parse formats + - Added `getAltNonUSParseFormats` date utility function to provide alternative parse formats for common non-US date/datetime formats + - Update DatePickerInput to use alternative parse formats when server date format is non-US + - Update parseDate utility function to use alternative non-US parse formats ### version 6.67.2 *Released* 31 October 2025