From e2bc02061a3e2d3ff0a01d2852e39e0314910809 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Tue, 24 Dec 2024 09:14:46 -0800 Subject: [PATCH 1/6] Support for multi-folder advanced setting in list designer --- packages/build/webpack/app.view.template.xml | 4 +- packages/components/package.json | 2 +- .../domainproperties/AdvancedSettings.tsx | 4 +- .../domainproperties/DomainForm.tsx | 1 + .../components/domainproperties/DomainRow.tsx | 3 ++ .../list/ListPropertiesAdvancedSettings.tsx | 38 +++++++++++++++++-- .../domainproperties/list/models.ts | 3 ++ .../components/domainproperties/models.tsx | 2 + 8 files changed, 50 insertions(+), 7 deletions(-) diff --git a/packages/build/webpack/app.view.template.xml b/packages/build/webpack/app.view.template.xml index ea50190236..02fa115e0f 100644 --- a/packages/build/webpack/app.view.template.xml +++ b/packages/build/webpack/app.view.template.xml @@ -15,11 +15,11 @@ <% } %> <% if (htmlWebpackPlugin.options.permissionClasses) { %> - + <% htmlWebpackPlugin.options.permissionClasses.forEach((permissionClass) => { %> <% }); %> - + <% } %> <% if (htmlWebpackPlugin.options.requiresLogin) { %> diff --git a/packages/components/package.json b/packages/components/package.json index 595eab12bd..59a435428d 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.8.1", + "version": "6.8.2-fb-multifolder.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ diff --git a/packages/components/src/internal/components/domainproperties/AdvancedSettings.tsx b/packages/components/src/internal/components/domainproperties/AdvancedSettings.tsx index 6de4dd032f..515bffa656 100644 --- a/packages/components/src/internal/components/domainproperties/AdvancedSettings.tsx +++ b/packages/components/src/internal/components/domainproperties/AdvancedSettings.tsx @@ -57,6 +57,7 @@ interface AdvancedSettingsProps { onApply: (any) => any; onHide: () => any; showDefaultValueSettings: boolean; + supportsPhiLevel: boolean; } interface AdvancedSettingsState { @@ -352,7 +353,7 @@ export class AdvancedSettings extends React.PureComponent { - const { index, field, domainIndex, domainFormDisplayOptions, allowUniqueConstraintProperties } = this.props; + const { index, field, domainIndex, domainFormDisplayOptions, allowUniqueConstraintProperties, supportsPhiLevel } = this.props; const { measure, dimension, @@ -365,6 +366,7 @@ export class AdvancedSettings extends React.PureComponent level.value === PHI) !== undefined; const disablePhiSelect = + !supportsPhiLevel || domainFormDisplayOptions.phiLevelDisabled || field.disablePhiLevel || (PHI !== undefined && !currentValueExists); diff --git a/packages/components/src/internal/components/domainproperties/DomainForm.tsx b/packages/components/src/internal/components/domainproperties/DomainForm.tsx index 14b1faa9d7..15567dba86 100644 --- a/packages/components/src/internal/components/domainproperties/DomainForm.tsx +++ b/packages/components/src/internal/components/domainproperties/DomainForm.tsx @@ -1288,6 +1288,7 @@ export class DomainFormImpl extends React.PureComponent domainContainerPath={domain.container} schemaName={schemaName ?? domain.schemaName} queryName={queryName ?? domain.queryName} + supportsPhiLevel={domain.supportsPhiLevel} /> ); }) diff --git a/packages/components/src/internal/components/domainproperties/DomainRow.tsx b/packages/components/src/internal/components/domainproperties/DomainRow.tsx index 2f85300ace..4c1f434231 100644 --- a/packages/components/src/internal/components/domainproperties/DomainRow.tsx +++ b/packages/components/src/internal/components/domainproperties/DomainRow.tsx @@ -99,6 +99,7 @@ export interface DomainRowProps { queryName?: string; schemaName?: string; showDefaultValueSettings: boolean; + supportsPhiLevel: boolean; } interface DomainRowState { @@ -380,6 +381,7 @@ export class DomainRow extends React.PureComponent )}
= ); }); +interface FolderSettingsProps { + multiFolder: boolean; + onCheckboxChange: (name, checked) => void; +} + +export const FolderSettings: FC = memo(({ multiFolder, onCheckboxChange }) => { + const onMultiFolderChange = useCallback( + (event: ChangeEvent): void => { + onCheckboxChange('multiFolder', event.target.checked); + }, + [onCheckboxChange] + ); + + return ( +
+ +
+ ); +}); + interface CollapsibleFieldsProps extends PropsWithChildren { checked: boolean; collapseFields: () => void; @@ -383,7 +408,7 @@ export const SearchIndexing: FC = memo(props => { }); interface SettingsContainerProps extends PropsWithChildren { - tipBody: string | JSX.Element; + tipBody?: string | JSX.Element; tipTitle?: string; title: string; } @@ -392,7 +417,7 @@ const SettingsContainer: FC = memo(({ children, title, t
{title} - {tipBody} + {tipBody && {tipBody}}
{children} @@ -445,6 +470,8 @@ export class AdvancedSettings extends React.PureComponent + + + + )} diff --git a/packages/components/src/internal/components/domainproperties/list/models.ts b/packages/components/src/internal/components/domainproperties/list/models.ts index 4921f82138..f932115106 100644 --- a/packages/components/src/internal/components/domainproperties/list/models.ts +++ b/packages/components/src/internal/components/domainproperties/list/models.ts @@ -40,6 +40,7 @@ export interface AdvancedSettingsForm extends EachItemSettings, EntireListSettin eachItemIndex: boolean; entireListIndex: boolean; fileAttachmentIndex: boolean; + multiFolder: boolean; titleColumn: string; } @@ -74,6 +75,7 @@ export class ListModel extends Record({ eachItemBodySetting: undefined, eachItemBodyTemplate: undefined, fileAttachmentIndex: undefined, + multiFolder: undefined, listId: undefined, discussionSettingEnum: undefined, containerPath: undefined, @@ -103,6 +105,7 @@ export class ListModel extends Record({ declare eachItemBodySetting: number; declare eachItemBodyTemplate: string; declare fileAttachmentIndex: false; + declare multiFolder: false; declare listId: number; declare discussionSettingEnum: string; declare containerPath: string; diff --git a/packages/components/src/internal/components/domainproperties/models.tsx b/packages/components/src/internal/components/domainproperties/models.tsx index c7030e6dff..487603ed45 100644 --- a/packages/components/src/internal/components/domainproperties/models.tsx +++ b/packages/components/src/internal/components/domainproperties/models.tsx @@ -167,6 +167,7 @@ interface IDomainDesign { queryName?: string; schemaName?: string; showDefaultValueSettings: boolean; + supportsPhiLevel: boolean; } export class DomainDesign @@ -230,6 +231,7 @@ export class DomainDesign declare schemaName: string; declare queryName: string; declare disabledSystemFields?: string[]; + declare supportsPhiLevel: boolean; static create(rawModel: any, exception?: any): DomainDesign { let fields = List(); From 134c8ecb52c747e4a992cdb76b4d183529e74503 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 6 Jan 2025 14:49:20 -0800 Subject: [PATCH 2/6] Reflect server-specified disabled state for PHI level drop-down and provide disabled reason --- .../AdvancedSettings.test.tsx | 2 ++ .../domainproperties/AdvancedSettings.tsx | 20 ++++++++++++------- .../domainproperties/DomainForm.tsx | 3 ++- .../domainproperties/DomainRow.test.tsx | 2 ++ .../components/domainproperties/DomainRow.tsx | 9 ++++++--- .../components/domainproperties/constants.ts | 1 + .../components/domainproperties/models.tsx | 9 ++++++--- 7 files changed, 32 insertions(+), 14 deletions(-) diff --git a/packages/components/src/internal/components/domainproperties/AdvancedSettings.test.tsx b/packages/components/src/internal/components/domainproperties/AdvancedSettings.test.tsx index 455e70f178..e5d961a36c 100644 --- a/packages/components/src/internal/components/domainproperties/AdvancedSettings.test.tsx +++ b/packages/components/src/internal/components/domainproperties/AdvancedSettings.test.tsx @@ -60,6 +60,8 @@ describe('AdvancedSettings', () => { field: field1, onHide: jest.fn(), onApply: jest.fn(), + phiLevelDisabled: false, + phiLevelDisabledReason: null, showDefaultValueSettings: true, allowUniqueConstraintProperties: true, defaultDefaultValueType: DOMAIN_EDITABLE_DEFAULT, diff --git a/packages/components/src/internal/components/domainproperties/AdvancedSettings.tsx b/packages/components/src/internal/components/domainproperties/AdvancedSettings.tsx index 515bffa656..1188736722 100644 --- a/packages/components/src/internal/components/domainproperties/AdvancedSettings.tsx +++ b/packages/components/src/internal/components/domainproperties/AdvancedSettings.tsx @@ -56,8 +56,9 @@ interface AdvancedSettingsProps { maxPhiLevel: string; onApply: (any) => any; onHide: () => any; + phiLevelDisabled: boolean; + phiLevelDisabledReason: string; showDefaultValueSettings: boolean; - supportsPhiLevel: boolean; } interface AdvancedSettingsState { @@ -353,7 +354,15 @@ export class AdvancedSettings extends React.PureComponent { - const { index, field, domainIndex, domainFormDisplayOptions, allowUniqueConstraintProperties, supportsPhiLevel } = this.props; + const { + index, + field, + domainIndex, + domainFormDisplayOptions, + allowUniqueConstraintProperties, + phiLevelDisabled, + phiLevelDisabledReason, + } = this.props; const { measure, dimension, @@ -366,10 +375,7 @@ export class AdvancedSettings extends React.PureComponent level.value === PHI) !== undefined; const disablePhiSelect = - !supportsPhiLevel || - domainFormDisplayOptions.phiLevelDisabled || - field.disablePhiLevel || - (PHI !== undefined && !currentValueExists); + phiLevelDisabled || field.disablePhiLevel || (PHI !== undefined && !currentValueExists); return ( <> @@ -377,7 +383,7 @@ export class AdvancedSettings extends React.PureComponent
- +
domainContainerPath={domain.container} schemaName={schemaName ?? domain.schemaName} queryName={queryName ?? domain.queryName} - phiLevelDisabled={domain.phiLevelDisabled} + phiLevelEnabled={domain.phiLevelEnabled} phiLevelDisabledReason={domain.phiLevelDisabledReason} /> ); diff --git a/packages/components/src/internal/components/domainproperties/DomainRow.test.tsx b/packages/components/src/internal/components/domainproperties/DomainRow.test.tsx index 40188c84eb..93020ff6cf 100644 --- a/packages/components/src/internal/components/domainproperties/DomainRow.test.tsx +++ b/packages/components/src/internal/components/domainproperties/DomainRow.test.tsx @@ -98,7 +98,7 @@ describe('DomainRow', () => { onChange: jest.fn(), onDelete: jest.fn(), onExpand: jest.fn(), - phiLevelDisabled: false, + phiLevelEnabled: true, phiLevelDisabledReason: null, showDefaultValueSettings: true, }; diff --git a/packages/components/src/internal/components/domainproperties/DomainRow.tsx b/packages/components/src/internal/components/domainproperties/DomainRow.tsx index baf2c1bd41..6dcf70a39e 100644 --- a/packages/components/src/internal/components/domainproperties/DomainRow.tsx +++ b/packages/components/src/internal/components/domainproperties/DomainRow.tsx @@ -96,7 +96,7 @@ export interface DomainRowProps { onChange: DomainOnChange; onDelete: (index?: number) => void; onExpand: (index?: number) => void; - phiLevelDisabled: boolean; + phiLevelEnabled: boolean; phiLevelDisabledReason?: string; queryName?: string; schemaName?: string; @@ -382,7 +382,7 @@ export class DomainRow extends React.PureComponent )} diff --git a/packages/components/src/internal/components/domainproperties/constants.ts b/packages/components/src/internal/components/domainproperties/constants.ts index bbe1ff5ab5..8b8b4c5938 100644 --- a/packages/components/src/internal/components/domainproperties/constants.ts +++ b/packages/components/src/internal/components/domainproperties/constants.ts @@ -209,7 +209,7 @@ export const DEFAULT_DOMAIN_FORM_DISPLAY_OPTIONS = { hideValidators: false, isDragDisabled: false, hideTextOptions: false, - phiLevelDisabled: false, + phiLevelEnabled: true, phiLevelDisabledReason: null, hideAddFieldsButton: false, disableMvEnabled: false, diff --git a/packages/components/src/internal/components/domainproperties/models.tsx b/packages/components/src/internal/components/domainproperties/models.tsx index c398c0318c..2f3d642879 100644 --- a/packages/components/src/internal/components/domainproperties/models.tsx +++ b/packages/components/src/internal/components/domainproperties/models.tsx @@ -164,7 +164,7 @@ interface IDomainDesign { name: string; // set of fields to initialize a manually created design newDesignFields?: List; - phiLevelDisabled: boolean; + phiLevelEnabled: boolean; phiLevelDisabledReason?: string; queryName?: string; schemaName?: string; @@ -201,7 +201,7 @@ export class DomainDesign schemaName: undefined, queryName: undefined, disabledSystemFields: undefined, - phiLevelDisabled: false, + phiLevelEnabled: true, phiLevelDisabledReason: undefined, }) implements IDomainDesign @@ -234,7 +234,7 @@ export class DomainDesign declare schemaName: string; declare queryName: string; declare disabledSystemFields?: string[]; - declare phiLevelDisabled: boolean; + declare phiLevelEnabled: boolean; declare phiLevelDisabledReason?: string; static create(rawModel: any, exception?: any): DomainDesign { From b762d1f184a858a33a0a8dfc63482932c6ac1f4b Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Tue, 7 Jan 2025 17:38:10 -0800 Subject: [PATCH 4/6] Unused --- .../src/internal/components/domainproperties/constants.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/components/src/internal/components/domainproperties/constants.ts b/packages/components/src/internal/components/domainproperties/constants.ts index 8b8b4c5938..b40afec542 100644 --- a/packages/components/src/internal/components/domainproperties/constants.ts +++ b/packages/components/src/internal/components/domainproperties/constants.ts @@ -209,8 +209,6 @@ export const DEFAULT_DOMAIN_FORM_DISPLAY_OPTIONS = { hideValidators: false, isDragDisabled: false, hideTextOptions: false, - phiLevelEnabled: true, - phiLevelDisabledReason: null, hideAddFieldsButton: false, disableMvEnabled: false, hideImportData: false, From b0a085c67ff430ccc614cd74c3aba6da41f0f308 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Wed, 8 Jan 2025 13:30:59 -0800 Subject: [PATCH 5/6] @labkey/components@.11.3-fb-multifolder.0 --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index b7c6a9b063..3ba76b23a2 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.11.2", + "version": "6.11.3-fb-multifolder.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.11.2", + "version": "6.11.3-fb-multifolder.0", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "17.0.0", diff --git a/packages/components/package.json b/packages/components/package.json index d3dd1f8922..88a376a1a3 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.11.2", + "version": "6.11.3-fb-multifolder.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From c00d0750a588b60648607c1ad2194e09ea5b76f8 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 13 Jan 2025 16:31:01 -0800 Subject: [PATCH 6/6] Allow resetting PHI Level to NotPHI when other values are forbidden --- packages/build/webpack/constants.js | 2 +- .../components/domainproperties/AdvancedSettings.tsx | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/build/webpack/constants.js b/packages/build/webpack/constants.js index e1e36a07dd..aeca160482 100644 --- a/packages/build/webpack/constants.js +++ b/packages/build/webpack/constants.js @@ -56,7 +56,7 @@ const watchPort = process.env.WATCH_PORT || 3001; // These minification options are a re-declaration of the default minification options // for the HtmlWebpackPlugin with the addition of `caseSensitive` because LabKey's -// view templates can contain case-sensitive elements (e.g. ``). +// view templates can contain case-sensitive elements (e.g. ``). // For more information see https://github.com/jantimon/html-webpack-plugin#minification. const minifyTemplateOptions = { caseSensitive: true, diff --git a/packages/components/src/internal/components/domainproperties/AdvancedSettings.tsx b/packages/components/src/internal/components/domainproperties/AdvancedSettings.tsx index a39474a03f..e932ff8122 100644 --- a/packages/components/src/internal/components/domainproperties/AdvancedSettings.tsx +++ b/packages/components/src/internal/components/domainproperties/AdvancedSettings.tsx @@ -383,16 +383,17 @@ export class AdvancedSettings extends React.PureComponent
- +
-
+
+ {!phiLevelEnabled && phiLevelDisabledReason && phiLevelDisabledReason + (PHI !== "NotPHI" ? ". Change this PHI Level to \"Not PHI\" before saving." : "")}