diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index d8cb7dee95..4693aa17b2 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,15 +1,15 @@ { "name": "@labkey/components", - "version": "2.399.0", + "version": "2.399.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "2.399.0", + "version": "2.399.1", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "@labkey/api": "1.27.0", + "@labkey/api": "1.28.0", "@testing-library/jest-dom": "~5.17.0", "@testing-library/react": "~12.1.5", "@testing-library/user-event": "~12.8.3", @@ -3336,9 +3336,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.27.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.27.0.tgz", - "integrity": "sha512-Hs1TahaNp1K3JrvdpGCB0m8as1JidJImxyRD6NG5UK897z90tK1L3o3PihjyoU3oJ11nV/iePXJbG31c4C44gQ==" + "version": "1.28.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.28.0.tgz", + "integrity": "sha512-C4Ffk78pRgrC1efAUGToXtTocumqs/E8PhomXLSlnytIzx6NMcBFFyjDW6tgsxBKAWJliPwgGxwopUtMFm4zpA==" }, "node_modules/@labkey/build": { "version": "6.16.1", @@ -20223,9 +20223,9 @@ } }, "@labkey/api": { - "version": "1.27.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.27.0.tgz", - "integrity": "sha512-Hs1TahaNp1K3JrvdpGCB0m8as1JidJImxyRD6NG5UK897z90tK1L3o3PihjyoU3oJ11nV/iePXJbG31c4C44gQ==" + "version": "1.28.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.28.0.tgz", + "integrity": "sha512-C4Ffk78pRgrC1efAUGToXtTocumqs/E8PhomXLSlnytIzx6NMcBFFyjDW6tgsxBKAWJliPwgGxwopUtMFm4zpA==" }, "@labkey/build": { "version": "6.16.1", diff --git a/packages/components/package.json b/packages/components/package.json index e9d3de104f..f78de0e2aa 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "2.399.0", + "version": "2.399.1", "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": { - "@labkey/api": "1.27.0", + "@labkey/api": "1.28.0", "@testing-library/jest-dom": "~5.17.0", "@testing-library/react": "~12.1.5", "@testing-library/user-event": "~12.8.3", diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index 7b2229795d..ab48198650 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 2.399.1 +*Released*: 19 December 2023 +- Update @labkey/api and use moveRows() function +- Include fix for Issue 49164: Datepicker in editable grid needs to account for the sticky footer when at the bottom of the grid + ### version 2.399.0 *Released*: 15 December 2023 - Consolidate move entities to MoveRowsAction in query controller diff --git a/packages/components/src/internal/components/chart/configs.test.ts b/packages/components/src/internal/components/chart/configs.test.ts index 5d12b664e5..9c649a6d1b 100644 --- a/packages/components/src/internal/components/chart/configs.test.ts +++ b/packages/components/src/internal/components/chart/configs.test.ts @@ -4,7 +4,7 @@ import { ChartData } from './types'; describe('CHART_GROUPS', () => { test('getAppURL', () => { let row = { x: 'x', xSub: 'xSub' } as ChartData; - expect(CHART_GROUPS.Assays.getAppURL(row).toHref()).toBe('#/assays/general/x/overview'); + expect(CHART_GROUPS.Assays.getAppURL(row).toHref()).toBe('#/assays/general/x/runs'); expect(CHART_GROUPS.Samples.getAppURL(row).toHref()).toBe('#/samples/x'); expect(CHART_GROUPS.SampleStatuses.getAppURL(row, { target: { tagName: 'title' } }).toHref()).toBe( '#/samples/xSub' diff --git a/packages/components/src/internal/components/chart/configs.ts b/packages/components/src/internal/components/chart/configs.ts index 65b79500c9..8a02aaf5f8 100644 --- a/packages/components/src/internal/components/chart/configs.ts +++ b/packages/components/src/internal/components/chart/configs.ts @@ -32,8 +32,8 @@ export const CHART_GROUPS: Record = { CHART_SELECTORS.Week, CHART_SELECTORS.Today, ], - // TODO: Use redirect AppURL.create('assays', row.id, 'overview') - getAppURL: row => AppURL.create(ASSAYS_KEY, 'general', row.x || row['label'], 'overview'), + // TODO: Use redirect AppURL.create('assays', row.id, 'runs') + getAppURL: row => AppURL.create(ASSAYS_KEY, 'general', row.x || row['label'], 'runs'), filterDataRegionName: 'Runs', itemCountSQ: SCHEMAS.ASSAY_TABLES.ASSAY_LIST, key: ASSAYS_KEY, diff --git a/packages/components/src/internal/components/entities/APIWrapper.ts b/packages/components/src/internal/components/entities/APIWrapper.ts index 368233c962..fbb9cb9a1e 100644 --- a/packages/components/src/internal/components/entities/APIWrapper.ts +++ b/packages/components/src/internal/components/entities/APIWrapper.ts @@ -1,4 +1,5 @@ import { List, Map } from 'immutable'; +import { Query } from '@labkey/api'; import { GetNameExpressionOptionsResponse, loadNameExpressionOptions } from '../settings/actions'; @@ -6,8 +7,6 @@ import { QueryInfo } from '../../../public/QueryInfo'; import { InsertOptions } from '../../query/api'; -import { Container } from '../base/models/Container'; - import { getDataOperationConfirmationData, getDeleteConfirmationData, @@ -17,6 +16,7 @@ import { handleEntityFileImport, moveEntities, initParentOptionsSelects, + MoveEntitiesOptions, } from './actions'; import { DataOperation } from './constants'; import { @@ -26,7 +26,6 @@ import { IEntityTypeOption, IParentAlias, IParentOption, - MoveEntitiesResult, OperationConfirmationData, } from './models'; @@ -90,17 +89,7 @@ export interface EntityAPIWrapper { parentOptions: IParentOption[]; }>; loadNameExpressionOptions: (containerPath?: string) => Promise; - moveEntities: ( - sourceContainer: Container, - targetContainer: string, - entityDataType: EntityDataType, - schemaName: string, - queryName: string, - rowIds?: number[], - selectionKey?: string, - useSnapshotSelection?: boolean, - auditUserComment?: string - ) => Promise; + moveEntities: (options: MoveEntitiesOptions) => Promise; } export class EntityServerAPIWrapper implements EntityAPIWrapper { diff --git a/packages/components/src/internal/components/entities/EntityMoveModal.tsx b/packages/components/src/internal/components/entities/EntityMoveModal.tsx index a6ac8e1168..e912e1471d 100644 --- a/packages/components/src/internal/components/entities/EntityMoveModal.tsx +++ b/packages/components/src/internal/components/entities/EntityMoveModal.tsx @@ -1,6 +1,6 @@ import React, { FC, memo, useCallback, useEffect, useState } from 'react'; -import { ActionURL } from '@labkey/api'; +import { ActionURL, AuditBehaviorTypes } from '@labkey/api'; import { Progress } from '../base/Progress'; import { ConfirmModal } from '../base/ConfirmModal'; @@ -117,17 +117,18 @@ export const EntityMoveModal: FC = memo(props => { const useSnapshotSelection = useSelected && movingAll && queryModel.filterArray.length > 0; try { - await api.entity.moveEntities( - currentContainer, + await api.entity.moveEntities({ + containerPath: currentContainer?.path, targetContainerPath, entityDataType, - queryModel.schemaName, - queryModel.queryName, - rowIds_, - selectionKey, + schemaName: queryModel.schemaName, + queryName: queryModel.queryName, + rowIds: rowIds_, + dataRegionSelectionKey: selectionKey, useSnapshotSelection, - auditUserComment - ); + auditBehavior: AuditBehaviorTypes.DETAILED, + auditUserComment, + }); let projectUrl = buildURL( getPrimaryAppProperties()?.productId, diff --git a/packages/components/src/internal/components/entities/actions.ts b/packages/components/src/internal/components/entities/actions.ts index 1759446d5e..3e53e191bb 100644 --- a/packages/components/src/internal/components/entities/actions.ts +++ b/packages/components/src/internal/components/entities/actions.ts @@ -1,4 +1,4 @@ -import { ActionURL, Ajax, AuditBehaviorTypes, Filter, getServerContext, Query, Utils } from '@labkey/api'; +import { ActionURL, Ajax, Filter, getServerContext, Query, Utils } from '@labkey/api'; import { List, Map } from 'immutable'; import { getSelectedData, getSelected, setSnapshotSelections } from '../../actions'; @@ -20,8 +20,6 @@ import { Row, selectRows, SelectRowsResponse } from '../../query/selectRows'; import { ViewInfo } from '../../ViewInfo'; -import { Container } from '../base/models/Container'; - import { getProjectDataExclusion, hasModule } from '../../app/utils'; import { resolveErrorMessage } from '../../util/messaging'; @@ -51,7 +49,6 @@ import { IEntityTypeOption, IParentAlias, IParentOption, - MoveEntitiesResult, OperationConfirmationData, ProjectConfigurableDataType, RemappedKeyValues, @@ -818,54 +815,36 @@ export function getMoveConfirmationData( ); } -export function moveEntities( - sourceContainer: Container, - targetContainer: string, - entityDataType: EntityDataType, - schemaName: string, - queryName: string, - rowIds?: number[], - selectionKey?: string, - useSnapshotSelection?: boolean, - userComment?: string -): Promise { +export interface MoveEntitiesOptions extends Omit { + entityDataType: EntityDataType; + rowIds?: number[]; +} + +export function moveEntities(options: MoveEntitiesOptions): Promise { return new Promise((resolve, reject) => { - const params = { - auditBehavior: AuditBehaviorTypes.DETAILED, - auditUserComment: userComment, - targetContainerPath: targetContainer, - schemaName, - queryName, - }; + const { entityDataType, rowIds, ...rest } = options; + const params = Object.assign({}, rest); if (rowIds) { params['rows'] = rowIds.reduce((prev, curr) => { prev.push({ rowId: curr }); return prev; }, []); } - if (selectionKey) { - params['dataRegionSelectionKey'] = selectionKey; - params['useSnapshotSelection'] = useSnapshotSelection; - } - return Ajax.request({ - url: buildURL('query', 'moveRows.api', undefined, { - container: sourceContainer?.path, - }), - method: 'POST', - jsonData: params, - success: Utils.getCallbackWrapper(response => { + Query.moveRows({ + ...params, + success: (response: Query.MoveRowsResponse) => { if (response.success) { resolve(response); } else { console.error('Error moving ' + entityDataType.nounPlural, response); reject(response?.error ?? 'Unknown error moving ' + entityDataType.nounPlural + '.'); } - }), - failure: Utils.getCallbackWrapper(response => { - console.error('Error moving ' + entityDataType.nounPlural, response); - reject(response?.exception ?? 'Unknown error moving ' + entityDataType.nounPlural + '.'); - }), + }, + failure: reason => { + console.error('Error moving ' + entityDataType.nounPlural, reason); + reject(reason?.exception ?? 'Unknown error moving ' + entityDataType.nounPlural + '.'); + }, }); }); } diff --git a/packages/components/src/internal/components/entities/models.ts b/packages/components/src/internal/components/entities/models.ts index 6f5969563c..770a815fa8 100644 --- a/packages/components/src/internal/components/entities/models.ts +++ b/packages/components/src/internal/components/entities/models.ts @@ -586,12 +586,6 @@ export interface IParentAlias { parentValue: IParentOption; } -export interface MoveEntitiesResult { - containerPath: string; - success: boolean; - updateCounts: Record; -} - export interface DataTypeEntity { description?: string; label: string; diff --git a/packages/components/src/theme/form.scss b/packages/components/src/theme/form.scss index 4c8f52e046..e309b5fd9a 100644 --- a/packages/components/src/theme/form.scss +++ b/packages/components/src/theme/form.scss @@ -195,7 +195,8 @@ div.react-datepicker__current-month { .react-datepicker-popper { // The default z-index is 1, but bootstrap sets the z-index for form inputs to 2, which means all form inputs render // on top of the date-picker by default, which makes it hard to use in some situations. - z-index: 10; + // Issue 49164: set z-index greater than the sticky footer (which is 10) + z-index: 11; } .add-control--error-message { padding-top: 5px; diff --git a/packages/themes/package-lock.json b/packages/themes/package-lock.json index c1332ade6e..8539bef335 100644 --- a/packages/themes/package-lock.json +++ b/packages/themes/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/themes", - "version": "1.3.2", + "version": "1.3.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@labkey/themes", - "version": "1.3.2", + "version": "1.3.3", "license": "SEE LICENSE IN LICENSE.txt", "devDependencies": { "bootstrap-sass": "3.4.3", diff --git a/packages/themes/package.json b/packages/themes/package.json index 4eb26d874e..b2244c7b6f 100644 --- a/packages/themes/package.json +++ b/packages/themes/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/themes", - "version": "1.3.2", + "version": "1.3.3", "description": "Themes that come bundled with LabKey Server", "files": [ "dist/" diff --git a/packages/themes/styles/js/navigation.js b/packages/themes/styles/js/navigation.js index 1514df6a1a..d23721b0db 100644 --- a/packages/themes/styles/js/navigation.js +++ b/packages/themes/styles/js/navigation.js @@ -201,7 +201,11 @@ // Show a better error to the user than just a generic Unauthorized dialog if (response.status === 401) { document.getElementById(id).innerHTML = '
You do not have permission to view this data. You have likely been logged out.' - + (this.loginUrl != null ? ' Please log in again.' : ' Please reload the page.') + "
"; + + (this.loginUrl != null ? ' Please log in again.' : ' Please reload the page.') + ""; + + document.getElementById(id + '-reload').addEventListener('click', function() { + location.reload(); + }); } else { if (window.console && window.console.log) { @@ -364,7 +368,7 @@ if (menu.length === 0) { return; } - + var offset = menu.offset(); var win = $(window); @@ -671,4 +675,4 @@ onScroll(); } }); -}(jQuery); \ No newline at end of file +}(jQuery);