From dbf8b3caf4ff2c89dd4e380238697911be9d81b6 Mon Sep 17 00:00:00 2001 From: XingY Date: Sun, 11 May 2025 22:07:39 -0700 Subject: [PATCH 01/10] Add detailed auditing of domain changes & comment ability --- packages/components/package-lock.json | 12 ++++----- packages/components/package.json | 4 +-- .../components/releaseNotes/components.md | 5 ++++ .../domainproperties/BaseDomainDesigner.tsx | 25 ++++++++++++++--- .../components/domainproperties/actions.ts | 2 ++ .../assay/AssayDesignerPanels.tsx | 9 ++++--- .../domainproperties/assay/actions.ts | 4 +-- .../domainproperties/assay/models.ts | 5 +++- .../dataclasses/DataClassDesigner.tsx | 19 ++++++++----- .../samples/SampleTypeDesigner.tsx | 27 ++++++++++++------- 10 files changed, 78 insertions(+), 34 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 475110c69a..df52da1401 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,16 +1,16 @@ { "name": "@labkey/components", - "version": "6.40.2", + "version": "6.41.0-fb-domainAudit.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.40.2", + "version": "6.41.0-fb-domainAudit.3", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.40.0", + "@labkey/api": "1.40.1-fb-domainAudit.2", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", @@ -3018,9 +3018,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.40.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.40.0.tgz", - "integrity": "sha512-ezCVNWtLkzbH5K/CoEb69gK5q6QSgQpG9FVJse3hPR1t5Bxpt6Mt0RbmKKdOfdJcNcA30IfpcbzEOc1gz7vhZQ==" + "version": "1.40.1-fb-domainAudit.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.40.1-fb-domainAudit.2.tgz", + "integrity": "sha512-3/bhUCpTq04SV9pvB6f/0EJPmlWaQTUEp34wdmxjz3H6sheUPAqhAcxiV2rHwJqI3z6vE6A/ZyvXmFiXNH1XdQ==" }, "node_modules/@labkey/build": { "version": "8.5.0", diff --git a/packages/components/package.json b/packages/components/package.json index 24f0dceb7a..7ec1e34fc3 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.40.2", + "version": "6.41.0-fb-domainAudit.3", "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.40.0", + "@labkey/api": "1.40.1-fb-domainAudit.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 ec9d554d75..27f48711d6 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -1,6 +1,11 @@ # @labkey/components Components, models, actions, and utility functions for LabKey applications and pages +### version 6.X +*Released*: X May 2025 +- Add detailed auditing of domain changes & comment ability + - TODO + ### version 6.40.2 *Released*: 6 May 2025 - Issue 52773: display warning for unresolved form lookup values diff --git a/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx b/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx index 03c2ad713c..cbe035eee6 100644 --- a/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx +++ b/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx @@ -1,4 +1,4 @@ -import React, { PureComponent, ComponentType, FC, memo, PropsWithChildren } from 'react'; +import React, { PureComponent, ComponentType, FC, memo, PropsWithChildren, useState, useCallback } from 'react'; import { List } from 'immutable'; import { getSubmitButtonClass, isApp } from '../../app/utils'; @@ -10,6 +10,8 @@ import { getDomainBottomErrorMessage, getDomainHeaderName, getUpdatedVisitedPane import { DOMAIN_ERROR_ID, SEVERITY_LEVEL_ERROR } from './constants'; import { DomainDesign } from './models'; +import { CommentTextArea } from '../forms/input/CommentTextArea'; +import { useDataChangeCommentsRequired } from '../forms/input/useDataChangeCommentsRequired'; export interface InjectedBaseDomainDesignerProps { currentPanelIndex: number; @@ -119,10 +121,11 @@ interface BaseDomainDesignerProps extends PropsWithChildren { hasValidProperties: boolean; name: string; onCancel: () => void; - onFinish: () => void; + onFinish: (reason?: string) => void; saveBtnText?: string; submitting: boolean; visitedPanels: List; + showUserComment?: boolean; } export const BaseDomainDesigner: FC = memo(props => { @@ -137,7 +140,10 @@ export const BaseDomainDesigner: FC = memo(props => { onCancel, hasValidProperties, saveBtnText = 'Save', + showUserComment } = props; + const [userComment, setUserComment] = useState(undefined); + const requiresUserComment = showUserComment ? useDataChangeCommentsRequired().requiresUserComment : false; // get a list of the domain names that have errors const errorDomains = domains @@ -147,6 +153,10 @@ export const BaseDomainDesigner: FC = memo(props => { const bottomErrorMsg = getDomainBottomErrorMessage(exception, errorDomains, hasValidProperties, visitedPanels); const submitClassname = `save-button btn btn-${getSubmitButtonClass()}`; + const onSave = useCallback(() => { + onFinish(userComment); + }, [userComment, onFinish]); + return (
{children} @@ -159,7 +169,16 @@ export const BaseDomainDesigner: FC = memo(props => { - diff --git a/packages/components/src/internal/components/domainproperties/actions.ts b/packages/components/src/internal/components/domainproperties/actions.ts index 4a39aa66c9..5771b75307 100644 --- a/packages/components/src/internal/components/domainproperties/actions.ts +++ b/packages/components/src/internal/components/domainproperties/actions.ts @@ -544,6 +544,7 @@ export interface SaveDomainOptions { options?: any; /** Original DomainDesign (before filtering out of locked/mapped fields), to be used for addRowIndexes = true */ originalDomain?: DomainDesign; + auditUserComment?: string; } export function saveDomain(options: SaveDomainOptions): Promise { @@ -576,6 +577,7 @@ export function saveDomain(options: SaveDomainOptions): Promise { domainDesign: DomainDesign.serialize(domain), includeWarnings, options: options.options, + auditUserComment: options.auditUserComment, success: successHandler, failure: failureHandler, }); diff --git a/packages/components/src/internal/components/domainproperties/assay/AssayDesignerPanels.tsx b/packages/components/src/internal/components/domainproperties/assay/AssayDesignerPanels.tsx index 1882f1e192..81af223700 100644 --- a/packages/components/src/internal/components/domainproperties/assay/AssayDesignerPanels.tsx +++ b/packages/components/src/internal/components/domainproperties/assay/AssayDesignerPanels.tsx @@ -232,14 +232,14 @@ export class AssayDesignerPanelsImpl extends React.PureComponent { ); } - onFinish = (): void => { + onFinish = (reasonForUpdate?: string): void => { const { setSubmitting } = this.props; const { protocolModel } = this.state; const appIsValidMsg = this.getAppIsValidMsg(); const textChoiceValidMsg = this.getTextChoiceUpdatesValidMsg(); const isValid = protocolModel.isValid() && textChoiceValidMsg === undefined && appIsValidMsg === undefined; - this.props.onFinish(isValid, this.saveDomain); + this.props.onFinish(isValid, () => this.saveDomain(reasonForUpdate)); if (!isValid) { const exception = @@ -258,13 +258,13 @@ export class AssayDesignerPanelsImpl extends React.PureComponent { } }; - saveDomain = (): void => { + saveDomain = (auditUserComment?: string): void => { const { beforeFinish, setSubmitting } = this.props; const { protocolModel } = this.state; beforeFinish?.(protocolModel); - saveAssayDesign(protocolModel) + saveAssayDesign(protocolModel, auditUserComment) .then(response => { this.setState(() => ({ protocolModel })); setSubmitting(false, () => { @@ -418,6 +418,7 @@ export class AssayDesignerPanelsImpl extends React.PureComponent { onCancel={onCancel} onFinish={this.onFinish} saveBtnText={saveBtnText} + showUserComment={!initModel.isNew() && appPropertiesOnly} > { +export function saveAssayDesign(model: AssayProtocolModel, auditUserComment?: string): Promise { return new Promise((resolve, reject) => { Ajax.request({ url: ActionURL.buildURL('assay', 'saveProtocol.api', model.container), - jsonData: AssayProtocolModel.serialize(model), + jsonData: AssayProtocolModel.serialize(model, auditUserComment), success: Utils.getCallbackWrapper(response => { resolve(AssayProtocolModel.create(response.data)); }), diff --git a/packages/components/src/internal/components/domainproperties/assay/models.ts b/packages/components/src/internal/components/domainproperties/assay/models.ts index 29c81ecfcc..a31ac6447d 100644 --- a/packages/components/src/internal/components/domainproperties/assay/models.ts +++ b/packages/components/src/internal/components/domainproperties/assay/models.ts @@ -135,7 +135,7 @@ export class AssayProtocolModel extends ImmutableRecord({ return new AssayProtocolModel({ ...raw, name, domains }); } - static serialize(model: AssayProtocolModel): any { + static serialize(model: AssayProtocolModel, auditUserComment?: string): any { // need to serialize the DomainDesign objects to remove the unrecognized fields const domains = model.domains.map(domain => { return DomainDesign.serialize(domain); @@ -143,6 +143,9 @@ export class AssayProtocolModel extends ImmutableRecord({ const json = model.merge({ domains }).toJS(); + if (auditUserComment) + json.auditUserComment = auditUserComment; + // only need to serialize the id and not the autoCopyTargetContainer object delete json.autoCopyTargetContainer; delete json.exception; diff --git a/packages/components/src/internal/components/domainproperties/dataclasses/DataClassDesigner.tsx b/packages/components/src/internal/components/domainproperties/dataclasses/DataClassDesigner.tsx index a6d2ba68d9..ec604dafec 100644 --- a/packages/components/src/internal/components/domainproperties/dataclasses/DataClassDesigner.tsx +++ b/packages/components/src/internal/components/domainproperties/dataclasses/DataClassDesigner.tsx @@ -60,7 +60,7 @@ interface Props { onChange?: (model: DataClassModel) => void; onComplete: (model: DataClassModel) => void; saveBtnText?: string; - showGenIdBanner?: boolean; + isUpdate?: boolean; validateNameExpressions?: boolean; } @@ -70,6 +70,7 @@ interface State { namePreviews: string[]; namePreviewsLoading: boolean; parentOptions: IParentOption[]; + auditUserComment?: string; } const NEW_DATA_CLASS_OPTION: IParentOption = { @@ -155,12 +156,12 @@ export class DataClassDesignerImpl extends PureComponent { + onFinish = (auditUserComment?: string): void => { const { defaultNameFieldConfig, setSubmitting, nounSingular } = this.props; const { model } = this.state; const isValid = model.isValid(defaultNameFieldConfig); - this.props.onFinish(isValid, this.saveDomain); + this.props.onFinish(isValid, () => this.saveDomain(false, auditUserComment)); if (!isValid) { let exception: string; @@ -206,7 +207,7 @@ export class DataClassDesignerImpl extends PureComponent => { + saveDomain = async (hasConfirmedNameExpression?: boolean, auditUserComment?: string): Promise => { const { api, beforeFinish, onComplete, setSubmitting, validateNameExpressions } = this.props; const { model } = this.state; const { name, domain } = model; @@ -238,6 +239,7 @@ export class DataClassDesignerImpl extends PureComponent { this.setState({ nameExpressionWarnings: undefined, + auditUserComment: undefined, }); }); }; @@ -348,7 +352,7 @@ export class DataClassDesignerImpl extends PureComponent ({ nameExpressionWarnings: undefined, }), - () => this.saveDomain(true) + () => this.saveDomain(true, this.state.auditUserComment) ); }; @@ -460,7 +464,7 @@ export class DataClassDesignerImpl extends PureComponent { @@ -338,7 +339,10 @@ export class SampleTypeDesignerImpl extends React.PureComponent { - this.setState({ nameExpressionWarnings: undefined }); + this.setState({ + nameExpressionWarnings: undefined, + auditUserComment: undefined + }); }); }; @@ -348,7 +352,7 @@ export class SampleTypeDesignerImpl extends React.PureComponent { + onFinish = (auditUserComment?: string): void => { const { defaultSampleFieldConfig, setSubmitting, metricUnitProps } = this.props; const { model, uniqueIdsConfirmed } = this.state; @@ -360,7 +364,7 @@ export class SampleTypeDesignerImpl extends React.PureComponent this.saveDomain(false, auditUserComment)); if (isValid) return; @@ -382,15 +386,18 @@ export class SampleTypeDesignerImpl extends React.PureComponent { - this.setState({ model: updatedModel }, () => { + this.setState({ + model: updatedModel, + auditUserComment: auditUserComment, + }, () => { scrollDomainErrorIntoView(); }); }); }; - saveDomain = async (hasConfirmedNameExpression?: boolean): Promise => { + saveDomain = async (hasConfirmedNameExpression?: boolean, comment?: string): Promise => { const { api, beforeFinish, setSubmitting } = this.props; - const { model } = this.state; + const { model, auditUserComment } = this.state; const { name, domain, description } = model; if (!hasConfirmedNameExpression) { beforeFinish?.(model); @@ -492,6 +499,7 @@ export class SampleTypeDesignerImpl extends React.PureComponent { this.props.onComplete(response); @@ -621,7 +629,7 @@ export class SampleTypeDesignerImpl extends React.PureComponent Date: Tue, 13 May 2025 23:40:47 -0700 Subject: [PATCH 02/10] fix required comment --- .../domainproperties/BaseDomainDesigner.tsx | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx b/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx index cbe035eee6..3b523bfc4c 100644 --- a/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx +++ b/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx @@ -1,4 +1,13 @@ -import React, { PureComponent, ComponentType, FC, memo, PropsWithChildren, useState, useCallback } from 'react'; +import React, { + PureComponent, + ComponentType, + FC, + memo, + PropsWithChildren, + useState, + useCallback, + useMemo +} from 'react'; import { List } from 'immutable'; import { getSubmitButtonClass, isApp } from '../../app/utils'; @@ -157,6 +166,12 @@ export const BaseDomainDesigner: FC = memo(props => { onFinish(userComment); }, [userComment, onFinish]); + const canSubmit = useMemo(() => { + if (submitting) + return false; + return !requiresUserComment || (userComment?.trim()?.length > 0) + }, [requiresUserComment, userComment, submitting]); + return (
{children} @@ -178,7 +193,7 @@ export const BaseDomainDesigner: FC = memo(props => { inline /> } - From 33fcd2cc58c789e82bcd32a19573bab76f05aabc Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 13 May 2025 23:46:07 -0700 Subject: [PATCH 03/10] Merge branch 'develop' into fb_domainAudit # Conflicts: # package-lock.json # package.json --- packages/components/package-lock.json | 12 ++++----- .../domainproperties/BaseDomainDesigner.tsx | 21 ++++++++-------- .../components/domainproperties/actions.ts | 4 +-- .../domainproperties/assay/models.ts | 3 +-- .../dataclasses/DataClassDesigner.tsx | 8 +++--- .../samples/SampleTypeDesigner.tsx | 25 +++++++++++-------- 6 files changed, 38 insertions(+), 35 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index faa208d846..e2e665b76b 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,16 +1,16 @@ { "name": "@labkey/components", - "version": "6.41.0", + "version": "6.41.1-fb-domainAudit.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.41.0", + "version": "6.41.1-fb-domainAudit.1", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.40.0", + "@labkey/api": "1.40.1-fb-domainAudit.2", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", @@ -3018,9 +3018,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.40.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.40.0.tgz", - "integrity": "sha512-ezCVNWtLkzbH5K/CoEb69gK5q6QSgQpG9FVJse3hPR1t5Bxpt6Mt0RbmKKdOfdJcNcA30IfpcbzEOc1gz7vhZQ==" + "version": "1.40.1-fb-domainAudit.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.40.1-fb-domainAudit.2.tgz", + "integrity": "sha512-3/bhUCpTq04SV9pvB6f/0EJPmlWaQTUEp34wdmxjz3H6sheUPAqhAcxiV2rHwJqI3z6vE6A/ZyvXmFiXNH1XdQ==" }, "node_modules/@labkey/build": { "version": "8.5.0", diff --git a/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx b/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx index 3b523bfc4c..34bd0a9d01 100644 --- a/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx +++ b/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx @@ -6,7 +6,7 @@ import React, { PropsWithChildren, useState, useCallback, - useMemo + useMemo, } from 'react'; import { List } from 'immutable'; @@ -15,12 +15,14 @@ import { FormButtons } from '../../FormButtons'; import { Alert } from '../base/Alert'; +import { CommentTextArea } from '../forms/input/CommentTextArea'; + +import { useDataChangeCommentsRequired } from '../forms/input/useDataChangeCommentsRequired'; + import { getDomainBottomErrorMessage, getDomainHeaderName, getUpdatedVisitedPanelsList } from './actions'; import { DOMAIN_ERROR_ID, SEVERITY_LEVEL_ERROR } from './constants'; import { DomainDesign } from './models'; -import { CommentTextArea } from '../forms/input/CommentTextArea'; -import { useDataChangeCommentsRequired } from '../forms/input/useDataChangeCommentsRequired'; export interface InjectedBaseDomainDesignerProps { currentPanelIndex: number; @@ -132,9 +134,9 @@ interface BaseDomainDesignerProps extends PropsWithChildren { onCancel: () => void; onFinish: (reason?: string) => void; saveBtnText?: string; + showUserComment?: boolean; submitting: boolean; visitedPanels: List; - showUserComment?: boolean; } export const BaseDomainDesigner: FC = memo(props => { @@ -149,7 +151,7 @@ export const BaseDomainDesigner: FC = memo(props => { onCancel, hasValidProperties, saveBtnText = 'Save', - showUserComment + showUserComment, } = props; const [userComment, setUserComment] = useState(undefined); const requiresUserComment = showUserComment ? useDataChangeCommentsRequired().requiresUserComment : false; @@ -167,9 +169,8 @@ export const BaseDomainDesigner: FC = memo(props => { }, [userComment, onFinish]); const canSubmit = useMemo(() => { - if (submitting) - return false; - return !requiresUserComment || (userComment?.trim()?.length > 0) + if (submitting) return false; + return !requiresUserComment || userComment?.trim()?.length > 0; }, [requiresUserComment, userComment, submitting]); return ( @@ -184,7 +185,7 @@ export const BaseDomainDesigner: FC = memo(props => { - {showUserComment && + {showUserComment && ( = memo(props => { requiresUserComment={requiresUserComment} inline /> - } + )} diff --git a/packages/components/src/internal/components/domainproperties/actions.ts b/packages/components/src/internal/components/domainproperties/actions.ts index 5771b75307..4bbde4f42a 100644 --- a/packages/components/src/internal/components/domainproperties/actions.ts +++ b/packages/components/src/internal/components/domainproperties/actions.ts @@ -530,6 +530,7 @@ export function _parseCalculatedColumn( export interface SaveDomainOptions { /** Boolean indicating if rowIndices should be added to the error message objects */ addRowIndexes?: boolean; + auditUserComment?: string; /** Container path where requests are made. Defaults to domain.container for updates. */ containerPath?: string; /** DomainDesign to save */ @@ -544,7 +545,6 @@ export interface SaveDomainOptions { options?: any; /** Original DomainDesign (before filtering out of locked/mapped fields), to be used for addRowIndexes = true */ originalDomain?: DomainDesign; - auditUserComment?: string; } export function saveDomain(options: SaveDomainOptions): Promise { @@ -904,7 +904,7 @@ export function updateDataType(field: DomainField, value: any): DomainField { }) as DomainField; } else { if (PropDescType.isUser(value)) { - field = field.merge({lookupValidator: LOOKUP_VALIDATOR}) as DomainField; + field = field.merge({ lookupValidator: LOOKUP_VALIDATOR }) as DomainField; } } } diff --git a/packages/components/src/internal/components/domainproperties/assay/models.ts b/packages/components/src/internal/components/domainproperties/assay/models.ts index a31ac6447d..1016c89669 100644 --- a/packages/components/src/internal/components/domainproperties/assay/models.ts +++ b/packages/components/src/internal/components/domainproperties/assay/models.ts @@ -143,8 +143,7 @@ export class AssayProtocolModel extends ImmutableRecord({ const json = model.merge({ domains }).toJS(); - if (auditUserComment) - json.auditUserComment = auditUserComment; + if (auditUserComment) json.auditUserComment = auditUserComment; // only need to serialize the id and not the autoCopyTargetContainer object delete json.autoCopyTargetContainer; diff --git a/packages/components/src/internal/components/domainproperties/dataclasses/DataClassDesigner.tsx b/packages/components/src/internal/components/domainproperties/dataclasses/DataClassDesigner.tsx index ec604dafec..59e2d4321c 100644 --- a/packages/components/src/internal/components/domainproperties/dataclasses/DataClassDesigner.tsx +++ b/packages/components/src/internal/components/domainproperties/dataclasses/DataClassDesigner.tsx @@ -47,6 +47,7 @@ interface Props { headerText?: string; helpTopic?: string; initModel?: DataClassModel; + isUpdate?: boolean; isValidParentOptionsFn?: (row: any, isDataClass: boolean) => boolean; // loadNameExpressionOptions is a prop for testing purposes only, see default implementation below loadNameExpressionOptions?: ( @@ -60,17 +61,16 @@ interface Props { onChange?: (model: DataClassModel) => void; onComplete: (model: DataClassModel) => void; saveBtnText?: string; - isUpdate?: boolean; validateNameExpressions?: boolean; } interface State { + auditUserComment?: string; model: DataClassModel; nameExpressionWarnings: string[]; namePreviews: string[]; namePreviewsLoading: boolean; parentOptions: IParentOption[]; - auditUserComment?: string; } const NEW_DATA_CLASS_OPTION: IParentOption = { @@ -239,7 +239,7 @@ export class DataClassDesignerImpl extends PureComponent boolean; metricUnitProps?: MetricUnitProps; nameExpressionInfoUrl?: string; @@ -113,11 +114,10 @@ interface Props { onCancel: () => void; onChange?: (model: SampleTypeModel) => void; onComplete: (response: DomainDesign) => void; - sampleAliasCaption?: string; sampleTypeCaption?: string; saveBtnText?: string; showAliquotOptions?: boolean; - isUpdate?: boolean; + sampleAliasCaption?: string; showLinkToStudy?: boolean; showParentLabelPrefix?: boolean; useSeparateDataClassesAliasMenu?: boolean; @@ -126,6 +126,7 @@ interface Props { } interface State { + auditUserComment?: string; error: React.ReactNode; model: SampleTypeModel; nameExpressionWarnings: string[]; @@ -134,7 +135,6 @@ interface State { parentOptions: IParentOption[]; showUniqueIdConfirmation: boolean; uniqueIdsConfirmed: boolean; - auditUserComment?: string; } // Exported for testing export class SampleTypeDesignerImpl extends React.PureComponent { @@ -341,7 +341,7 @@ export class SampleTypeDesignerImpl extends React.PureComponent { this.setState({ nameExpressionWarnings: undefined, - auditUserComment: undefined + auditUserComment: undefined, }); }); }; @@ -386,12 +386,15 @@ export class SampleTypeDesignerImpl extends React.PureComponent { - this.setState({ - model: updatedModel, - auditUserComment: auditUserComment, - }, () => { - scrollDomainErrorIntoView(); - }); + this.setState( + { + model: updatedModel, + auditUserComment, + }, + () => { + scrollDomainErrorIntoView(); + } + ); }); }; @@ -499,7 +502,7 @@ export class SampleTypeDesignerImpl extends React.PureComponent { this.props.onComplete(response); From d30a996ebf863aff079875030d5a06f7f6138282 Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 16 May 2025 16:03:09 -0700 Subject: [PATCH 04/10] update release note --- packages/components/releaseNotes/components.md | 3 ++- .../components/domainproperties/BaseDomainDesigner.tsx | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index 0b917ab8f8..3051357882 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -4,7 +4,8 @@ Components, models, actions, and utility functions for LabKey applications and p ### version 6.X *Released*: X May 2025 - Add detailed auditing of domain changes & comment ability - - TODO + - include `CommentTextArea` in `BaseDomainDesigner` for supplying user provided comment for domain updates + - wire up `auditUserComment` for `SampleTypeDesigner`, `DataClassDesigner` and `AssayDesignerPanels` ### version 6.42.0 *Released*: 14 May 2025 diff --git a/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx b/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx index 34bd0a9d01..53b5c94f9d 100644 --- a/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx +++ b/packages/components/src/internal/components/domainproperties/BaseDomainDesigner.tsx @@ -154,6 +154,7 @@ export const BaseDomainDesigner: FC = memo(props => { showUserComment, } = props; const [userComment, setUserComment] = useState(undefined); + // skip useDataChangeCommentsRequired hook for LKS pages with showUserComment=false const requiresUserComment = showUserComment ? useDataChangeCommentsRequired().requiresUserComment : false; // get a list of the domain names that have errors From a844533135f49573d7f30a8742afed969f986c63 Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 16 May 2025 16:04:39 -0700 Subject: [PATCH 05/10] publish --- packages/components/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 024c67e483..c868ce9a79 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,16 +1,16 @@ { "name": "@labkey/components", - "version": "6.42.0", + "version": "6.42.1-fb-domainAudit.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.42.0", + "version": "6.42.1-fb-domainAudit.1", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.40.0", + "@labkey/api": "1.40.1-fb-domainAudit.2", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", @@ -3018,9 +3018,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.40.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.40.0.tgz", - "integrity": "sha512-ezCVNWtLkzbH5K/CoEb69gK5q6QSgQpG9FVJse3hPR1t5Bxpt6Mt0RbmKKdOfdJcNcA30IfpcbzEOc1gz7vhZQ==" + "version": "1.40.1-fb-domainAudit.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.40.1-fb-domainAudit.2.tgz", + "integrity": "sha512-3/bhUCpTq04SV9pvB6f/0EJPmlWaQTUEp34wdmxjz3H6sheUPAqhAcxiV2rHwJqI3z6vE6A/ZyvXmFiXNH1XdQ==" }, "node_modules/@labkey/build": { "version": "8.5.0", From 0b5311f027f186ebc4d3ce0132b7b9b4fc9c5cf5 Mon Sep 17 00:00:00 2001 From: XingY Date: Wed, 21 May 2025 10:11:18 -0700 Subject: [PATCH 06/10] fix user comment after adding barcode --- .../domainproperties/samples/SampleTypeDesigner.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx index ea20b5a578..a42e3a2976 100644 --- a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx +++ b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx @@ -328,7 +328,11 @@ export class SampleTypeDesignerImpl extends React.PureComponent { - this.setState({ showUniqueIdConfirmation: false, uniqueIdsConfirmed: false }); + this.setState({ + showUniqueIdConfirmation: false, + uniqueIdsConfirmed: false, + auditUserComment: undefined, + }); }; onUniqueIdConfirm = (): void => { @@ -357,7 +361,10 @@ export class SampleTypeDesignerImpl extends React.PureComponent 0 && !uniqueIdsConfirmed) { - this.setState({ showUniqueIdConfirmation: true }); + this.setState({ + showUniqueIdConfirmation: true, + auditUserComment + }); return; } From 5dde9eb65900e70877b2ba5605a2deed05097f1b Mon Sep 17 00:00:00 2001 From: XingY Date: Wed, 21 May 2025 10:13:31 -0700 Subject: [PATCH 07/10] fix barcode audit --- 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 c868ce9a79..027c37d67c 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.42.1-fb-domainAudit.1", + "version": "6.42.1-fb-domainAudit.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.42.1-fb-domainAudit.1", + "version": "6.42.1-fb-domainAudit.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 34598d50a7..8dd4139c6d 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.42.1-fb-domainAudit.1", + "version": "6.42.1-fb-domainAudit.2", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 0e554b289c600b4ec1763c75a1654355779c9e54 Mon Sep 17 00:00:00 2001 From: XingY Date: Thu, 22 May 2025 22:22:10 -0700 Subject: [PATCH 08/10] Merge branch 'develop' into fb_domainAudit # Conflicts: # biologics/package-lock.json # biologics/package.json # inventory/package-lock.json # inventory/package.json # sampleManagement/package-lock.json # sampleManagement/package.json --- packages/components/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 2e5094b18a..debc36074a 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,16 +1,16 @@ { "name": "@labkey/components", - "version": "6.43.0", + "version": "6.43.1-fb-domainAudit.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.43.0", + "version": "6.43.1-fb-domainAudit.1", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.41.0", + "@labkey/api": "1.41.1", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", @@ -3018,9 +3018,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.41.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.41.0.tgz", - "integrity": "sha512-FWhELnNLkTVNNGXOnPHFoLb/CvPKVnibvVnINGETh1rBUmp8UdGrSV2OuhhPEkuGoi/SGp2zI3dkkSYjRR20Eg==" + "version": "1.41.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.41.1.tgz", + "integrity": "sha512-5CaGXA0Z2m/D7lDf8F8gZugQVxcWURpRsEdU+Xc/xn4Vz5ZdLjfgzyD87WsEtwNEi0Ed8Lw/BpsToFh80g+3IA==" }, "node_modules/@labkey/build": { "version": "8.5.0", From 86de186e64948d3f492f757ca46814bfbdaed41a Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 23 May 2025 13:07:55 -0700 Subject: [PATCH 09/10] Merge branch 'develop' into fb_domainAudit # Conflicts: # packages/components/package-lock.json # packages/components/package.json # packages/components/releaseNotes/components.md --- packages/components/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index b0d87d0393..02645b46f5 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,16 +1,16 @@ { "name": "@labkey/components", - "version": "6.43.1", + "version": "6.43.2-fb-domainAudit.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.43.1", + "version": "6.43.2-fb-domainAudit.1", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.41.0", + "@labkey/api": "1.41.1", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.3.0", @@ -3018,9 +3018,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.41.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.41.0.tgz", - "integrity": "sha512-FWhELnNLkTVNNGXOnPHFoLb/CvPKVnibvVnINGETh1rBUmp8UdGrSV2OuhhPEkuGoi/SGp2zI3dkkSYjRR20Eg==" + "version": "1.41.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.41.1.tgz", + "integrity": "sha512-5CaGXA0Z2m/D7lDf8F8gZugQVxcWURpRsEdU+Xc/xn4Vz5ZdLjfgzyD87WsEtwNEi0Ed8Lw/BpsToFh80g+3IA==" }, "node_modules/@labkey/build": { "version": "8.5.0", From e6466d9c790917a5307a4350811e5a2a0c193632 Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 23 May 2025 17:49:58 -0700 Subject: [PATCH 10/10] publish --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- packages/components/releaseNotes/components.md | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 02645b46f5..02704005b4 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.43.2-fb-domainAudit.1", + "version": "6.43.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.43.2-fb-domainAudit.1", + "version": "6.43.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 52af68978a..60bce62482 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.43.2-fb-domainAudit.1", + "version": "6.43.2", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index aeee2984fc..4c2ae20355 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -1,14 +1,14 @@ # @labkey/components Components, models, actions, and utility functions for LabKey applications and pages -### version 6.X -*Released*: X May 2025 +### version 6.43.2 +*Released*: 23 May 2025 - Add detailed auditing of domain changes & comment ability - include `CommentTextArea` in `BaseDomainDesigner` for supplying user provided comment for domain updates - wire up `auditUserComment` for `SampleTypeDesigner`, `DataClassDesigner` and `AssayDesignerPanels` ### version 6.43.1 -*Released*: 22 May 2025 +*Released*: 23 May 2025 - Issue 53055: Check for multiple values in single value column ### version 6.43.0