From af45ab8c10e6b2c791bbf355ba18ec8ff9bc9fa8 Mon Sep 17 00:00:00 2001 From: Tom Tirapani Date: Thu, 2 Nov 2023 20:37:18 +0000 Subject: [PATCH 1/6] Add ZoneGrid component (#3512) --- CHANGELOG.md | 3 + cmp/grid/Grid.ts | 2 +- cmp/grid/GridModel.ts | 2 +- cmp/grid/renderers/MultiFieldRenderer.ts | 2 +- cmp/zoneGrid/Types.ts | 47 ++ cmp/zoneGrid/ZoneGrid.ts | 62 ++ cmp/zoneGrid/ZoneGridModel.ts | 666 ++++++++++++++++++ cmp/zoneGrid/impl/ZoneGridPersistenceModel.ts | 143 ++++ cmp/zoneGrid/impl/ZoneMapperModel.ts | 335 +++++++++ cmp/zoneGrid/index.ts | 3 + desktop/appcontainer/AppContainer.ts | 2 + desktop/cmp/button/ZoneMapperButton.ts | 90 +++ desktop/cmp/button/index.ts | 1 + .../cmp/grid/impl/colchooser/ColChooser.ts | 5 +- desktop/cmp/zoneGrid/impl/ZoneMapper.scss | 71 ++ desktop/cmp/zoneGrid/impl/ZoneMapper.ts | 232 ++++++ desktop/cmp/zoneGrid/impl/ZoneMapperDialog.ts | 35 + dynamics/desktop.ts | 2 + dynamics/mobile.ts | 2 + mobile/appcontainer/AppContainer.ts | 2 + mobile/cmp/button/ZoneMapperButton.ts | 41 ++ mobile/cmp/button/index.ts | 1 + mobile/cmp/input/Select.scss | 1 + mobile/cmp/input/Select.ts | 7 + mobile/cmp/panel/DialogPanel.scss | 24 +- mobile/cmp/panel/DialogPanel.ts | 4 +- mobile/cmp/zoneGrid/impl/ZoneMapper.scss | 67 ++ mobile/cmp/zoneGrid/impl/ZoneMapper.ts | 236 +++++++ styles/vars.scss | 6 +- utils/js/LangUtils.ts | 10 + 30 files changed, 2089 insertions(+), 15 deletions(-) create mode 100644 cmp/zoneGrid/Types.ts create mode 100644 cmp/zoneGrid/ZoneGrid.ts create mode 100644 cmp/zoneGrid/ZoneGridModel.ts create mode 100644 cmp/zoneGrid/impl/ZoneGridPersistenceModel.ts create mode 100644 cmp/zoneGrid/impl/ZoneMapperModel.ts create mode 100644 cmp/zoneGrid/index.ts create mode 100644 desktop/cmp/button/ZoneMapperButton.ts create mode 100644 desktop/cmp/zoneGrid/impl/ZoneMapper.scss create mode 100644 desktop/cmp/zoneGrid/impl/ZoneMapper.ts create mode 100644 desktop/cmp/zoneGrid/impl/ZoneMapperDialog.ts create mode 100644 mobile/cmp/button/ZoneMapperButton.ts create mode 100644 mobile/cmp/zoneGrid/impl/ZoneMapper.scss create mode 100644 mobile/cmp/zoneGrid/impl/ZoneMapper.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index b77737445b..44065f1a8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,9 @@ * Clicking on the right hand clear button in a `textInput` (desktop and mobile) now maintains focus on the `textInput`, allowing a user to quickly type something else into the field. This behaviour already existed on the `select` input. +* Added `ZoneGrid`, a specialized version of the Grid component that displays its data with + multi-line full-width rows. Each row is broken into four zones for top/bottom and left/right, + each of which can mapped to render one or more fields. ### 💥 Breaking Changes diff --git a/cmp/grid/Grid.ts b/cmp/grid/Grid.ts index 86c8b1d51d..5c8e5079e8 100644 --- a/cmp/grid/Grid.ts +++ b/cmp/grid/Grid.ts @@ -125,7 +125,7 @@ export const [Grid, grid] = hoistCmp.withFactory({ } }); -(Grid as any).MULTIFIELD_ROW_HEIGHT = 38; +(Grid as any).MULTIFIELD_ROW_HEIGHT = 42; //------------------------ // Implementation diff --git a/cmp/grid/GridModel.ts b/cmp/grid/GridModel.ts index 4eea0552df..f4be543bd8 100644 --- a/cmp/grid/GridModel.ts +++ b/cmp/grid/GridModel.ts @@ -132,7 +132,7 @@ export interface GridConfig { /** Config with which to create a GridFilterModel, or `true` to enable default. Desktop only.*/ filterModel?: GridFilterModelConfig | boolean; - /** Config with which to create aColChooserModel, or boolean `true` to enable default.*/ + /** Config with which to create a ColChooserModel, or boolean `true` to enable default.*/ colChooserModel?: ColChooserConfig | boolean; /** diff --git a/cmp/grid/renderers/MultiFieldRenderer.ts b/cmp/grid/renderers/MultiFieldRenderer.ts index fdf503f3aa..8ad3ca1c4a 100644 --- a/cmp/grid/renderers/MultiFieldRenderer.ts +++ b/cmp/grid/renderers/MultiFieldRenderer.ts @@ -98,7 +98,7 @@ function renderMainField(value, renderer, context) { function renderSubField({colId, label}, context) { const {record, gridModel} = context, - column = gridModel.findColumn(gridModel.columns, colId); + column = gridModel.getColumn(colId); throwIf(!column, `Subfield ${colId} not found`); diff --git a/cmp/zoneGrid/Types.ts b/cmp/zoneGrid/Types.ts new file mode 100644 index 0000000000..23b4cf679c --- /dev/null +++ b/cmp/zoneGrid/Types.ts @@ -0,0 +1,47 @@ +/* + * This file belongs to Hoist, an application development toolkit + * developed by Extremely Heavy Industries (www.xh.io | info@xh.io) + * + * Copyright © 2023 Extremely Heavy Industries Inc. + */ + +import {Column, ColumnRenderer, ColumnSortSpec} from '@xh/hoist/cmp/grid'; +import {PersistOptions} from '@xh/hoist/core'; + +export type Zone = 'tl' | 'tr' | 'bl' | 'br'; + +export interface ZoneMapping { + /** Field to display. Must match a Field found in the Store */ + field: string; + /** True to prefix the field value with its name */ + showLabel?: boolean; +} + +export interface ZoneLimit { + /** Min number of fields that should be mapped to the zone */ + min?: number; + /** Max number of fields that should be mapped to the zone */ + max?: number; + /** Array of allowed fields for the zone */ + only?: string[]; +} + +export interface ZoneField { + field: string; + displayName: string; + label: string; + renderer: ColumnRenderer; + column: Column; + chooserGroup: string; + sortable: boolean; + sortingOrder: ColumnSortSpec[]; +} + +export interface ZoneGridModelPersistOptions extends PersistOptions { + /** True to include mapping information (default true) */ + persistMapping?: boolean; + /** True to include grouping information (default true) */ + persistGrouping?: boolean; + /** True to include sorting information (default true) */ + persistSort?: boolean; +} diff --git a/cmp/zoneGrid/ZoneGrid.ts b/cmp/zoneGrid/ZoneGrid.ts new file mode 100644 index 0000000000..c1ef9a1395 --- /dev/null +++ b/cmp/zoneGrid/ZoneGrid.ts @@ -0,0 +1,62 @@ +/* + * This file belongs to Hoist, an application development toolkit + * developed by Extremely Heavy Industries (www.xh.io | info@xh.io) + * + * Copyright © 2023 Extremely Heavy Industries Inc. + */ +import {hoistCmp, HoistProps, LayoutProps, TestSupportProps, uses, XH} from '@xh/hoist/core'; +import {fragment} from '@xh/hoist/cmp/layout'; +import {GridOptions} from '@xh/hoist/kit/ag-grid'; +import {grid} from '@xh/hoist/cmp/grid'; +import {splitLayoutProps} from '@xh/hoist/utils/react'; +import {zoneMapper as desktopZoneMapper} from '@xh/hoist/dynamics/desktop'; +import {zoneMapper as mobileZoneMapper} from '@xh/hoist/dynamics/mobile'; +import {ZoneGridModel} from './ZoneGridModel'; + +export interface ZoneGridProps extends HoistProps, LayoutProps, TestSupportProps { + /** + * Options for ag-Grid's API. + * + * This constitutes an 'escape hatch' for applications that need to get to the underlying + * ag-Grid API. It should be used with care. Settings made here might be overwritten and/or + * interfere with the implementation of this component and its use of the ag-Grid API. + * + * Note that changes to these options after the component's initial render will be ignored. + */ + agOptions?: GridOptions; +} + +/** + * A ZoneGrid is a specialized version of the Grid component. + * + * It displays its data with multi-line full-width rows, each broken into four zones for + * top/bottom and left/right - (tl, tr, bl, br). Zone mappings determine which of the + * available fields should be extracted from the record and rendered into each zone. + */ +export const [ZoneGrid, zoneGrid] = hoistCmp.withFactory({ + displayName: 'ZoneGrid', + model: uses(ZoneGridModel), + className: 'xh-zone-grid', + + render({model, className, testId, ...props}, ref) { + const {gridModel, mapperModel} = model, + [layoutProps] = splitLayoutProps(props), + platformZoneMapper = XH.isMobileApp ? mobileZoneMapper : desktopZoneMapper; + + return fragment( + grid({ + ...layoutProps, + className, + testId, + ref, + model: gridModel, + agOptions: { + suppressRowGroupHidesColumns: true, + suppressMakeColumnVisibleAfterUnGroup: true, + ...props.agOptions + } + }), + mapperModel ? platformZoneMapper() : null + ); + } +}); diff --git a/cmp/zoneGrid/ZoneGridModel.ts b/cmp/zoneGrid/ZoneGridModel.ts new file mode 100644 index 0000000000..206474ddda --- /dev/null +++ b/cmp/zoneGrid/ZoneGridModel.ts @@ -0,0 +1,666 @@ +/* + * This file belongs to Hoist, an application development toolkit + * developed by Extremely Heavy Industries (www.xh.io | info@xh.io) + * + * Copyright © 2023 Extremely Heavy Industries Inc. + */ +import { + HoistModel, + LoadSpec, + PlainObject, + Some, + managed, + XH, + Awaitable, + VSide +} from '@xh/hoist/core'; +import {action, bindable, makeObservable, observable} from '@xh/hoist/mobx'; +import { + RecordAction, + Store, + StoreConfig, + StoreRecordOrId, + StoreSelectionConfig, + StoreSelectionModel, + StoreTransaction +} from '@xh/hoist/data'; +import { + Column, + ColumnSpec, + Grid, + GridConfig, + GridContextMenuSpec, + GridGroupSortFn, + GridModel, + GridSorter, + GridSorterLike, + GroupRowRenderer, + RowClassFn, + RowClassRuleFn, + TreeStyle, + multiFieldRenderer +} from '@xh/hoist/cmp/grid'; +import { + CellClickedEvent, + CellContextMenuEvent, + CellDoubleClickedEvent, + RowClickedEvent, + RowDoubleClickedEvent +} from '@ag-grid-community/core'; +import {Icon} from '@xh/hoist/icon'; +import {throwIf, withDefault} from '@xh/hoist/utils/js'; +import {castArray, forOwn, isEmpty, isFinite, isPlainObject, isString} from 'lodash'; +import {ReactNode} from 'react'; +import {ZoneMapperConfig, ZoneMapperModel} from './impl/ZoneMapperModel'; +import {ZoneGridPersistenceModel} from './impl/ZoneGridPersistenceModel'; +import {ZoneGridModelPersistOptions, Zone, ZoneLimit, ZoneMapping} from './Types'; + +export interface ZoneGridConfig { + /** + * Available columns for this grid. Note that the actual display of + * the zone columns is managed via `mappings` below. + */ + columns: Array; + + /** Mappings of columns to zones. */ + mappings: Record>; + + /** Optional configurations for zone constraints. */ + limits?: Partial>; + + /** + * Optional configs to apply to left column. Intended for use as an `escape hatch`, and should be used with care. + * Settings made here may interfere with the implementation of this component. + */ + leftColumnSpec?: Partial; + + /** + * Optional configs to apply to right column. Intended for use as an `escape hatch`, and should be used with care. + * Settings made here may interfere with the implementation of this component. + */ + rightColumnSpec?: Partial; + + /** String rendered between consecutive SubFields. */ + delimiter?: string; + + /** Config with which to create a ZoneMapperModel, or boolean `true` to enable default. */ + zoneMapperModel?: ZoneMapperConfig | boolean; + + /** + * A Store instance, or a config with which to create a Store. If not supplied, + * store fields will be inferred from columns config. + */ + store?: Store | StoreConfig; + + /** True if grid is a tree grid (default false). */ + treeMode?: boolean; + + /** Location for a docked summary row. Requires `store.SummaryRecord` to be populated. */ + showSummary?: boolean | VSide; + + /** Specification of selection behavior. Defaults to 'single' (desktop) and 'disabled' (mobile) */ + selModel?: StoreSelectionModel | StoreSelectionConfig | 'single' | 'multiple' | 'disabled'; + + /** + * Function to be called when the user triggers ZoneGridModel.restoreDefaultsAsync(). + * This function will be called after the built-in defaults have been restored, and can be + * used to restore application specific defaults. + */ + restoreDefaultsFn?: () => Awaitable; + + /** + * Confirmation warning to be presented to user before restoring default state. Set to + * null to skip user confirmation. + */ + restoreDefaultsWarning?: ReactNode; + + /** Options governing persistence. */ + persistWith?: ZoneGridModelPersistOptions; + + /** + * Text/element to display if grid has no records. Defaults to null, in which case no empty + * text will be shown. + */ + emptyText?: ReactNode; + + /** True (default) to hide empty text until after the Store has been loaded at least once. */ + hideEmptyTextBeforeLoad?: boolean; + + /** + * Initial sort to apply to grid data. + * Note that unlike GridModel, multi-sort is not supported. + */ + sortBy?: GridSorterLike; + + /** Column ID(s) by which to do full-width grouping. */ + groupBy?: Some; + + /** True (default) to show a count of group member rows within each full-width group row. */ + showGroupRowCounts?: boolean; + + /** True to highlight the currently hovered row. */ + showHover?: boolean; + + /** True to render row borders. */ + rowBorders?: boolean; + + /** Specify treeMode-specific styling. */ + treeStyle?: TreeStyle; + + /** True to use alternating backgrounds for rows. */ + stripeRows?: boolean; + + /** True to render cell borders. */ + cellBorders?: boolean; + + /** True to highlight the focused cell with a border. */ + showCellFocus?: boolean; + + /** True to suppress display of the grid's header row. */ + hideHeaders?: boolean; + + /** + * Closure to generate CSS class names for a row. + * NOTE that, once added, classes will *not* be removed if the data changes. + * Use `rowClassRules` instead if StoreRecord data can change across refreshes. + */ + rowClassFn?: RowClassFn; + + /** + * Object keying CSS class names to functions determining if they should be added or + * removed from the row. See Ag-Grid docs on "row styles" for details. + */ + rowClassRules?: Record; + + /** Height (in px) of a group row. Note that this will override `sizingMode` for group rows. */ + groupRowHeight?: number; + + /** Function used to render group rows. */ + groupRowRenderer?: GroupRowRenderer; + + /** + * Function to use to sort full-row groups. Called with two group values to compare + * in the form of a standard JS comparator. Default is an ascending string sort. + * Set to `null` to prevent sorting of groups. + */ + groupSortFn?: GridGroupSortFn; + + /** + * Callback when a key down event is detected on the grid. Note that the ag-Grid API provides + * limited ability to customize keyboard handling. This handler is designed to allow + * applications to work around this. + */ + onKeyDown?: (e: KeyboardEvent) => void; + + /** + * Callback when a row is clicked. (Note that the event received may be null - e.g. for + * clicks on full-width group rows.) + */ + onRowClicked?: (e: RowClickedEvent) => void; + + /** + * Callback when a row is double-clicked. (Note that the event received may be null - e.g. + * for clicks on full-width group rows.) + */ + onRowDoubleClicked?: (e: RowDoubleClickedEvent) => void; + + /** + * Callback when a cell is clicked. + */ + onCellClicked?: (e: CellClickedEvent) => void; + + /** + * Callback when a cell is double-clicked. + */ + onCellDoubleClicked?: (e: CellDoubleClickedEvent) => void; + + /** + * Callback when the context menu is opened. Note that the event received can also be + * triggered via a long press (aka tap and hold) on mobile devices. + */ + onCellContextMenu?: (e: CellContextMenuEvent) => void; + + /** + * Number of clicks required to expand / collapse a parent row in a tree grid. Defaults + * to 2 for desktop, 1 for mobile. Any other value prevents clicks on row body from + * expanding / collapsing (requires click on tree col affordance to expand/collapse). + */ + clicksToExpand?: number; + + /** + * Array of RecordActions, dividers, or token strings with which to create a context menu. + * May also be specified as a function returning same. + */ + contextMenu?: GridContextMenuSpec; + + /** + * Governs if the grid should reuse a limited set of DOM elements for columns visible in the + * scroll area (versus rendering all columns). Consider this performance optimization for + * grids with a very large number of columns obscured by horizontal scrolling. Note that + * setting this value to true may limit the ability of the grid to autosize offscreen columns + * effectively. Default false. + */ + useVirtualColumns?: boolean; + + /** + * Set to true to if application will be reloading data when the sortBy property changes on + * this model (either programmatically, or via user-click.) Useful for applications with large + * data sets that are performing external, or server-side sorting and filtering. Setting this + * flag means that the grid should not immediately respond to user or programmatic changes to + * the sortBy property, but will instead wait for the next load of data, which is assumed to be + * pre-sorted. Default false. + */ + externalSort?: boolean; + + /** + * Set to true to highlight a row on click. Intended to provide feedback to users in grids + * without selection. Note this setting overrides the styling used by Column.highlightOnChange, + * and is not recommended for use alongside that feature. Default true for mobiles, + * otherwise false. + */ + highlightRowOnClick?: boolean; + + /** + * Flags for experimental features. These features are designed for early client-access and + * testing, but are not yet part of the Hoist API. + */ + experimental?: PlainObject; + + /** Extra app-specific data for the GridModel. */ + appData?: PlainObject; + + /** @internal */ + xhImpl?: boolean; +} + +/** + * ZoneGridModel is a wrapper around GridModel, which shows date in a grid with multi-line + * full-width rows, each broken into four zones for top/bottom and left/right. + * + * This is the primary app entry-point for specifying ZoneGrid component options and behavior. + */ +export class ZoneGridModel extends HoistModel { + @managed + gridModel: GridModel; + + @managed + mapperModel: ZoneMapperModel; + + @observable.ref + mappings: Record; + + @bindable.ref + leftColumnSpec: Partial; + + @bindable.ref + rightColumnSpec: Partial; + + availableColumns: ColumnSpec[]; + limits: Partial>; + delimiter: string; + restoreDefaultsFn: () => Awaitable; + restoreDefaultsWarning: ReactNode; + + private _defaultState; // initial state provided to ctor - powers restoreDefaults(). + @managed persistenceModel: ZoneGridPersistenceModel; + + constructor(config: ZoneGridConfig) { + super(); + makeObservable(this); + + const { + columns, + limits, + mappings, + sortBy, + groupBy, + leftColumnSpec, + rightColumnSpec, + delimiter, + zoneMapperModel, + restoreDefaultsFn, + restoreDefaultsWarning, + persistWith, + ...rest + } = config; + + this.availableColumns = columns.map(it => ({...it, hidden: true})); + this.limits = limits; + this.mappings = this.parseMappings(mappings); + + this.leftColumnSpec = leftColumnSpec; + this.rightColumnSpec = rightColumnSpec; + this.delimiter = delimiter ?? ' • '; + this.restoreDefaultsFn = restoreDefaultsFn; + this.restoreDefaultsWarning = restoreDefaultsWarning; + + this._defaultState = { + mappings: this.mappings, + sortBy: sortBy, + groupBy: groupBy + }; + + this.gridModel = this.createGridModel(rest); + + this.setSortBy(sortBy); + this.setGroupBy(groupBy); + + this.mapperModel = this.parseMapperModel(zoneMapperModel); + this.persistenceModel = persistWith + ? new ZoneGridPersistenceModel(this, persistWith) + : null; + + this.addReaction({ + track: () => [this.leftColumnSpec, this.rightColumnSpec], + run: () => this.gridModel.setColumns(this.getColumns()) + }); + } + + /** + * Restore the mapping, sorting, and grouping configs as specified by the application at + * construction time. This is the state without any user changes applied. + * This method will clear the persistent grid state saved for this grid, if any. + * + * @returns true if defaults were restored + */ + async restoreDefaultsAsync(): Promise { + if (this.restoreDefaultsWarning) { + const confirmed = await XH.confirm({ + title: 'Please Confirm', + icon: Icon.warning(), + message: this.restoreDefaultsWarning, + confirmProps: { + text: 'Yes, restore defaults', + intent: 'primary' + } + }); + if (!confirmed) return false; + } + + const {mappings, sortBy, groupBy} = this._defaultState; + this.setMappings(mappings); + this.setSortBy(sortBy); + this.setGroupBy(groupBy); + + this.persistenceModel?.clear(); + + if (this.restoreDefaultsFn) { + await this.restoreDefaultsFn(); + } + + return true; + } + + showMapper() { + this.mapperModel.open(); + } + + @action + setMappings(mappings: Record>) { + this.mappings = this.parseMappings(mappings); + this.gridModel.setColumns(this.getColumns()); + } + + getDefaultContextMenu = () => [ + 'filter', + '-', + 'copy', + 'copyWithHeaders', + 'copyCell', + '-', + 'expandCollapseAll', + '-', + 'restoreDefaults', + '-', + new RecordAction({ + text: 'Customize Fields', + icon: Icon.gridLarge(), + hidden: !this?.mapperModel, + actionFn: () => (this?.mapperModel as any)?.open() + }) + ]; + + //----------------------- + // Getters and methods trampolined from GridModel. + //----------------------- + get sortBy(): GridSorter { + const ret = this.gridModel.sortBy?.[0]; + if (!ret) return null; + + // Normalize 'left_column' and 'right_column' to actual underlying fields + if (ret?.colId === 'left_column') { + const colId = this.mappings.tl[0]?.field; + return colId ? new GridSorter({...ret, colId}) : null; + } else if (ret?.colId === 'right_column') { + const colId = this.mappings.tr[0]?.field; + return colId ? new GridSorter({...ret, colId}) : null; + } + + return ret; + } + + setSortBy(cfg: GridSorterLike) { + // If the field is mapping to the primary field in a left/right column, set + // 'left_column'/'right_column' colId instead to display the arrows in the header. + const sorter = GridSorter.parse(cfg); + if (sorter?.colId === this.mappings.tl[0]?.field) { + return this.gridModel.setSortBy({...sorter, colId: 'left_column'}); + } + if (sorter?.colId === this.mappings.tr[0]?.field) { + return this.gridModel.setSortBy({...sorter, colId: 'right_column'}); + } + return this.gridModel.setSortBy(sorter); + } + + get store() { + return this.gridModel.store; + } + + get empty() { + return this.gridModel.empty; + } + + get selModel() { + return this.gridModel.selModel; + } + + get hasSelection() { + return this.gridModel.hasSelection; + } + + get selectedRecords() { + return this.gridModel.selectedRecords; + } + + get selectedRecord() { + return this.gridModel.selectedRecord; + } + + get selectedId() { + return this.gridModel.selectedId; + } + + get groupBy() { + return this.gridModel.groupBy; + } + + selectAsync( + records: Some, + opts: {ensureVisible?: boolean; clearSelection?: boolean} + ) { + return this.gridModel.selectAsync(records, opts); + } + + preSelectFirstAsync() { + return this.gridModel.preSelectFirstAsync(); + } + + selectFirstAsync(opts: {ensureVisible?: boolean} = {}) { + return this.gridModel.selectFirstAsync(opts); + } + + ensureSelectionVisibleAsync() { + return this.gridModel.ensureSelectionVisibleAsync(); + } + + override doLoadAsync(loadSpec: LoadSpec) { + return this.gridModel.doLoadAsync(loadSpec); + } + + loadData(rawData: any[], rawSummaryData?: PlainObject) { + return this.gridModel.loadData(rawData, rawSummaryData); + } + + updateData(rawData: PlainObject[] | StoreTransaction) { + return this.gridModel.updateData(rawData); + } + + clear() { + return this.gridModel.clear(); + } + + setGroupBy(colIds: Some) { + return this.gridModel.setGroupBy(colIds); + } + + //----------------------- + // Implementation + //----------------------- + private createGridModel(config: GridConfig): GridModel { + return new GridModel({ + ...config, + xhImpl: true, + contextMenu: withDefault(config.contextMenu, this.getDefaultContextMenu), + sizingMode: 'standard', + cellBorders: true, + rowBorders: true, + stripeRows: false, + autosizeOptions: {mode: 'disabled'}, + columns: this.getColumns() + }); + } + + private getColumns(): ColumnSpec[] { + return [ + this.buildZoneColumn(true), + this.buildZoneColumn(false), + // Ensure all available columns are provided as hidden columns for lookup by multifield renderer + ...this.availableColumns + ]; + } + + private buildZoneColumn(isLeft: boolean): ColumnSpec { + const topMappings = this.mappings[isLeft ? 'tl' : 'tr'], + bottomMappings = this.mappings[isLeft ? 'bl' : 'br']; + + throwIf( + isEmpty(topMappings), + `${isLeft ? 'Left' : 'Right'} column requires at least one top mapping` + ); + + // Extract the primary column from the top mappings + const primaryCol = new Column(this.findColumnSpec(topMappings[0]), this.gridModel); + + // Extract the sub-fields from the other mappings + const subFields = []; + topMappings.slice(1).forEach(it => { + subFields.push({colId: it.field, label: it.showLabel, position: 'top'}); + }); + bottomMappings.forEach(it => { + subFields.push({colId: it.field, label: it.showLabel, position: 'bottom'}); + }); + + return { + // Controlled properties + field: isLeft ? 'left_column' : 'right_column', + flex: isLeft ? 2 : 1, + align: isLeft ? 'left' : 'right', + renderer: multiFieldRenderer, + rowHeight: Grid['MULTIFIELD_ROW_HEIGHT'], + resizable: false, + movable: false, + hideable: false, + appData: { + multiFieldConfig: { + mainRenderer: primaryCol.renderer, + delimiter: this.delimiter, + subFields + } + }, + + // Properties inherited from primary column + headerName: primaryCol.headerName, + absSort: primaryCol.absSort, + sortingOrder: primaryCol.sortingOrder, + sortValue: primaryCol.sortValue, + sortToBottom: primaryCol.sortToBottom, + comparator: primaryCol.comparator, + sortable: primaryCol.sortable, + getValueFn: primaryCol.getValueFn, + + // Optional overrides + ...(isLeft ? this.leftColumnSpec : this.rightColumnSpec) + }; + } + + private findColumnSpec(mapping: ZoneMapping): ColumnSpec { + return this.availableColumns.find(it => { + const {field} = it; + return isString(field) ? field === mapping.field : field.name === mapping.field; + }); + } + + private parseMappings( + mappings: Record> + ): Record { + const ret = {} as Record; + forOwn(mappings, (rawMapping, zone) => { + // 1) Standardize mapping into an array of ZoneMappings + const mapping = []; + castArray(rawMapping).forEach(it => { + if (!it) return; + + const ret = isString(it) ? {field: it} : it, + col = this.findColumnSpec(ret); + + throwIf(!col, `Column not found for field ${ret.field}`); + return mapping.push(ret); + }); + + // 2) Ensure mapping respects configured limits + const limit = this.limits?.[zone]; + if (limit) { + throwIf( + isFinite(limit.min) && mapping.length < limit.min, + `Requires minimum ${limit.min} mappings in zone "${zone}"` + ); + throwIf( + isFinite(limit.max) && mapping.length > limit.max, + `Exceeds maximum ${limit.max} mappings in zone "${zone}"` + ); + + if (!isEmpty(limit.only)) { + mapping.forEach(it => { + throwIf( + !limit.only.includes(it.field), + `Field "${it.field}" not allowed in zone "${zone}"` + ); + }); + } + } + + ret[zone] = mapping; + }); + return ret; + } + + private parseMapperModel(mapperModel: ZoneMapperConfig | boolean): ZoneMapperModel { + if (isPlainObject(mapperModel)) { + return new ZoneMapperModel({ + ...(mapperModel as ZoneMapperConfig), + zoneGridModel: this + }); + } + return mapperModel ? new ZoneMapperModel({zoneGridModel: this}) : null; + } +} diff --git a/cmp/zoneGrid/impl/ZoneGridPersistenceModel.ts b/cmp/zoneGrid/impl/ZoneGridPersistenceModel.ts new file mode 100644 index 0000000000..24a8a7cd3e --- /dev/null +++ b/cmp/zoneGrid/impl/ZoneGridPersistenceModel.ts @@ -0,0 +1,143 @@ +/* + * This file belongs to Hoist, an application development toolkit + * developed by Extremely Heavy Industries (www.xh.io | info@xh.io) + * + * Copyright © 2023 Extremely Heavy Industries Inc. + */ +import {HoistModel, managed, PersistenceProvider, PlainObject} from '@xh/hoist/core'; +import {action, makeObservable, observable} from '@xh/hoist/mobx'; +import {isUndefined} from 'lodash'; +import {ZoneGridModel} from '../ZoneGridModel'; +import {ZoneGridModelPersistOptions} from '../Types'; + +/** + * Model to manage persisting state from ZoneGridModel. + * @internal + */ +export class ZoneGridPersistenceModel extends HoistModel { + override xhImpl = true; + + VERSION = 1; // Increment to abandon state. + + zoneGridModel: ZoneGridModel; + + @observable.ref + state: PlainObject; + + @managed + provider: PersistenceProvider; + + constructor(zoneGridModel: ZoneGridModel, config: ZoneGridModelPersistOptions) { + super(); + makeObservable(this); + + this.zoneGridModel = zoneGridModel; + + let { + persistMapping = true, + persistGrouping = true, + persistSort = true, + ...persistWith + } = config; + + persistWith = {path: 'zoneGrid', ...persistWith}; + + // 1) Read state from and attach to provider -- fail gently + try { + this.provider = PersistenceProvider.create(persistWith); + this.state = this.loadState() ?? {version: this.VERSION}; + this.addReaction({ + track: () => this.state, + run: state => this.provider.write(state) + }); + } catch (e) { + console.error(e); + this.state = {version: this.VERSION}; + } + + // 2) Bind self to grid, and populate grid. + if (persistMapping) { + this.updateGridMapping(); + this.addReaction(this.mappingReaction()); + } + + if (persistGrouping) { + this.updateGridGroupBy(); + this.addReaction(this.groupReaction()); + } + + if (persistSort) { + this.updateGridSort(); + this.addReaction(this.sortReaction()); + } + } + + @action + clear() { + this.state = {version: this.VERSION}; + } + + //-------------------------- + // Columns + //-------------------------- + mappingReaction() { + return { + track: () => this.zoneGridModel.mappings, + run: mappings => { + this.patchState({mappings}); + } + }; + } + + updateGridMapping() { + const {mappings} = this.state; + if (!isUndefined(mappings)) this.zoneGridModel.setMappings(mappings); + } + + //-------------------------- + // Sort + //-------------------------- + sortReaction() { + return { + track: () => this.zoneGridModel.sortBy, + run: sortBy => { + this.patchState({sortBy: sortBy?.toString()}); + } + }; + } + + updateGridSort() { + const {sortBy} = this.state; + if (!isUndefined(sortBy)) this.zoneGridModel.setSortBy(sortBy); + } + + //-------------------------- + // Grouping + //-------------------------- + groupReaction() { + return { + track: () => this.zoneGridModel.groupBy, + run: groupBy => { + this.patchState({groupBy}); + } + }; + } + + updateGridGroupBy() { + const {groupBy} = this.state; + if (!isUndefined(groupBy)) this.zoneGridModel.setGroupBy(groupBy); + } + + //-------------------------- + // Other Implementation + //-------------------------- + @action + patchState(updates) { + this.state = {...this.state, ...updates}; + } + + loadState() { + const ret = this.provider.read(); + return ret?.version === this.VERSION ? ret : null; + } +} diff --git a/cmp/zoneGrid/impl/ZoneMapperModel.ts b/cmp/zoneGrid/impl/ZoneMapperModel.ts new file mode 100644 index 0000000000..da39185d6a --- /dev/null +++ b/cmp/zoneGrid/impl/ZoneMapperModel.ts @@ -0,0 +1,335 @@ +/* + * This file belongs to Hoist, an application development toolkit + * developed by Extremely Heavy Industries (www.xh.io | info@xh.io) + * + * Copyright © 2023 Extremely Heavy Industries Inc. + */ +import {HoistModel, XH} from '@xh/hoist/core'; +import {span} from '@xh/hoist/cmp/layout'; +import {action, bindable, computed, makeObservable, observable} from '@xh/hoist/mobx'; +import {StoreRecord} from '@xh/hoist/data'; +import {GridSorter} from '@xh/hoist/cmp/grid'; +import {Icon} from '@xh/hoist/icon'; +import {cloneDeep, findIndex, isBoolean, isEmpty, isEqual, isFinite, isString} from 'lodash'; +import {ReactNode} from 'react'; +import {ZoneGridModel} from '../ZoneGridModel'; +import {ZoneField, Zone, ZoneLimit, ZoneMapping} from '../Types'; + +export interface ZoneMapperConfig { + /** The ZoneGridModel to be configured. */ + zoneGridModel: ZoneGridModel; + + /** True (default) to show Reset button to restore default configuration. */ + showRestoreDefaults?: boolean; + + /** True (default) to group columns by their chooserGroup */ + groupColumns?: boolean; +} + +/** + * State management for the ZoneMapper component. + * + * It is not necessary to manually create instances of this class within an application. + * + * @internal + */ +export class ZoneMapperModel extends HoistModel { + zoneGridModel: ZoneGridModel; + showRestoreDefaults: boolean; + groupColumns: boolean; + + // Show in dialog + @observable isOpen: boolean = false; + + // Show in popover (desktop only) + @observable isPopoverOpen = false; + + @bindable + selectedZone: Zone = 'tl'; + + @observable.ref + mappings: Record; + + @observable.ref + sortBy: GridSorter; + + fields: ZoneField[] = []; + sampleRecord: StoreRecord; + + @computed + get isDirty(): boolean { + const {mappings, sortBy} = this.zoneGridModel; + return !isEqual(this.mappings, mappings) || !isEqual(this.sortBy, sortBy); + } + + get leftFlex(): number { + const ret = this.zoneGridModel.leftColumnSpec?.flex; + return isBoolean(ret) ? 1 : ret ?? 2; + } + + get rightFlex(): number { + const ret = this.zoneGridModel.rightColumnSpec?.flex; + return isBoolean(ret) ? 1 : ret ?? 1; + } + + get limits(): Partial> { + return this.zoneGridModel.limits; + } + + get delimiter(): string { + return this.zoneGridModel.delimiter; + } + + get sortByColId() { + return this.sortBy?.colId; + } + + get sortByOptions() { + return this.fields + .filter(it => it.sortable) + .map(it => { + const {field, displayName} = it; + return {value: field, label: displayName}; + }); + } + + constructor(config: ZoneMapperConfig) { + super(); + makeObservable(this); + + const {zoneGridModel, showRestoreDefaults = true, groupColumns = true} = config; + + this.zoneGridModel = zoneGridModel; + this.showRestoreDefaults = showRestoreDefaults; + this.groupColumns = groupColumns; + this.fields = this.getFields(); + + this.addReaction({ + track: () => XH.routerState, + run: () => this.close() + }); + } + + async restoreDefaultsAsync() { + const restored = await this.zoneGridModel.restoreDefaultsAsync(); + if (restored) this.close(); + } + + @action + open() { + this.syncMapperData(); + this.isOpen = true; + } + + @action + openPopover() { + this.syncMapperData(); + this.isPopoverOpen = true; + } + + @action + close() { + this.isOpen = false; + this.isPopoverOpen = false; + } + + commit() { + this.zoneGridModel.setMappings(this.mappings); + this.zoneGridModel.setSortBy(this.sortBy); + } + + getSamplesForZone(zone: Zone): ReactNode[] { + return this.mappings[zone].map(mapping => { + return this.getSampleForMapping(mapping); + }); + } + + getSortLabel() { + const {sortBy} = this; + if (!sortBy) return null; + if (sortBy.abs) return 'Abs'; + return sortBy.sort === 'asc' ? 'Asc' : 'Desc'; + } + + getSortIcon() { + const {sortBy} = this; + if (!sortBy) return null; + const {abs, sort} = sortBy; + if (sort === 'asc') { + return abs ? Icon.sortAbsAsc() : Icon.sortAsc(); + } else if (sort === 'desc') { + return abs ? Icon.sortAbsDesc() : Icon.sortDesc(); + } + } + + //------------------------ + // Sorting + //------------------------ + @action + setSortByColId(colId: string) { + const {sortingOrder} = this.fields.find(it => it.field === colId); + + // Default direction|abs to first entry in sortingOrder + this.sortBy = GridSorter.parse({colId, ...sortingOrder[0]}); + } + + @action + setNextSortBy() { + const {colId, sort, abs} = this.sortBy, + {sortingOrder} = this.fields.find(it => it.field === colId), + currIdx = findIndex(sortingOrder, {sort, abs}), + nextIdx = isFinite(currIdx) ? (currIdx + 1) % sortingOrder.length : 0; + + this.sortBy = GridSorter.parse({colId, ...sortingOrder[nextIdx]}); + } + + //------------------------ + // Zone Mappings + //------------------------ + toggleShown(field: string) { + const {selectedZone} = this, + currMapping = this.getMappingForFieldAndZone(selectedZone, field); + + if (currMapping) { + this.removeZoneMapping(selectedZone, field); + } else { + this.addZoneMapping(selectedZone, field); + } + } + + toggleShowLabel(field: string) { + const {selectedZone} = this, + currMapping = this.getMappingForFieldAndZone(selectedZone, field); + + this.addOrAdjustZoneMapping(selectedZone, field, { + showLabel: !currMapping?.showLabel + }); + } + + @action + private syncMapperData() { + // Copy latest mappings and sortBy from grid + const {mappings, sortBy} = this.zoneGridModel; + this.mappings = cloneDeep(mappings); + this.sortBy = sortBy ? cloneDeep(sortBy) : null; + + // Take sample record from grid + this.sampleRecord = this.getSampleRecord(); + } + + private getFields(): ZoneField[] { + const {zoneGridModel} = this; + return zoneGridModel.availableColumns.map(it => { + const fieldName = isString(it.field) ? it.field : it.field.name, + column = zoneGridModel.gridModel.getColumn(fieldName), + displayName = column.displayName, + label = isString(it.headerName) ? it.headerName : displayName; + + return { + field: fieldName, + displayName: displayName, + label: label, + column: column, + renderer: column.renderer, + chooserGroup: column.chooserGroup, + sortable: column.sortable, + sortingOrder: column.sortingOrder + }; + }); + } + + private addOrAdjustZoneMapping(zone: Zone, field: string, adjustment: Partial) { + const currMapping = this.getMappingForFieldAndZone(zone, field); + if (currMapping) { + this.adjustZoneMapping(zone, field, adjustment); + } else { + this.addZoneMapping(zone, field, adjustment); + } + } + + @action + private adjustZoneMapping(zone: Zone, field: string, adjustment: Partial) { + const currMapping = this.getMappingForFieldAndZone(zone, field); + if (!currMapping) return; + + let mappings = cloneDeep(this.mappings); + mappings[zone] = mappings[zone].map(it => { + return it.field === field ? {...it, ...adjustment} : it; + }); + this.mappings = mappings; + } + + @action + private addZoneMapping(zone: Zone, field: string, config: Partial = {}) { + const allowedFields = this.limits?.[zone]?.only, + maxFields = this.limits?.[zone]?.max; + + if (!isEmpty(allowedFields) && !allowedFields.includes(field)) return; + + let mappings = cloneDeep(this.mappings); + + // Drop the last (right-most) value(s) as needed to ensure we don't overflow max + const zoneCount = mappings[zone].length; + if (maxFields && zoneCount >= maxFields) { + mappings[zone].splice(zoneCount - 1, zoneCount - maxFields + 1); + } + + // Add the new mapping + mappings[zone].push({...config, field}); + this.mappings = mappings; + } + + private removeZoneMapping(zone: Zone, field: string) { + let mappings = cloneDeep(this.mappings); + mappings[zone] = mappings[zone].filter(it => it.field !== field); + + const minFields = this.limits?.[zone]?.min; + if (!minFields || mappings[zone].length >= minFields) { + this.mappings = mappings; + } + } + + private getMappingForFieldAndZone(zone: Zone, field: string): ZoneMapping { + return this.mappings[zone].find(it => it.field === field); + } + + //------------------------ + // Sample Display + //------------------------ + getSampleForMapping(mapping: ZoneMapping): ReactNode { + const {fields, sampleRecord} = this, + field = fields.find(it => it.field === mapping.field); + + if (!field) return null; + + let value; + if (sampleRecord) { + value = sampleRecord.data[mapping.field]; + if (field.renderer) { + value = field.renderer(value, { + record: sampleRecord, + column: field.column, + gridModel: this.zoneGridModel.gridModel + }); + } + } + + // Display a placeholder if the sample record is missing a value for the field + if (isEmpty(value)) { + return span(`[${field.displayName}]`); + } + + // Render label if requested + const label = mapping.showLabel ? `${field.label}: ` : null; + return span(label, value); + } + + private getSampleRecord(): StoreRecord { + // Iterate down to a (likely more fully populated) leaf record. + let ret = this.zoneGridModel.store.records[0]; + while (ret && !isEmpty(ret.children)) { + ret = ret.children[0]; + } + return ret; + } +} diff --git a/cmp/zoneGrid/index.ts b/cmp/zoneGrid/index.ts new file mode 100644 index 0000000000..e47c3d0e53 --- /dev/null +++ b/cmp/zoneGrid/index.ts @@ -0,0 +1,3 @@ +export * from './Types'; +export * from './ZoneGrid'; +export * from './ZoneGridModel'; diff --git a/desktop/appcontainer/AppContainer.ts b/desktop/appcontainer/AppContainer.ts index ab31be8821..6c3491ffd2 100644 --- a/desktop/appcontainer/AppContainer.ts +++ b/desktop/appcontainer/AppContainer.ts @@ -13,6 +13,7 @@ import {suspendPanel} from '@xh/hoist/desktop/appcontainer/SuspendPanel'; import {dockContainerImpl} from '@xh/hoist/desktop/cmp/dock/impl/DockContainer'; import {colChooserDialog as colChooser} from '@xh/hoist/desktop/cmp/grid/impl/colchooser/ColChooserDialog'; import {ColChooserModel} from '@xh/hoist/desktop/cmp/grid/impl/colchooser/ColChooserModel'; +import {zoneMapperDialog as zoneMapper} from '@xh/hoist/desktop/cmp/zoneGrid/impl/ZoneMapperDialog'; import {columnHeaderFilter} from '@xh/hoist/desktop/cmp/grid/impl/filter/ColumnHeaderFilter'; import {ColumnHeaderFilterModel} from '@xh/hoist/desktop/cmp/grid/impl/filter/ColumnHeaderFilterModel'; import {gridFilterDialog} from '@xh/hoist/desktop/cmp/grid/impl/filter/GridFilterDialog'; @@ -48,6 +49,7 @@ installDesktopImpls({ storeFilterFieldImpl, pinPadImpl, colChooser, + zoneMapper, columnHeaderFilter, gridFilterDialog, ColChooserModel, diff --git a/desktop/cmp/button/ZoneMapperButton.ts b/desktop/cmp/button/ZoneMapperButton.ts new file mode 100644 index 0000000000..c3d4833fd4 --- /dev/null +++ b/desktop/cmp/button/ZoneMapperButton.ts @@ -0,0 +1,90 @@ +/* + * This file belongs to Hoist, an application development toolkit + * developed by Extremely Heavy Industries (www.xh.io | info@xh.io) + * + * Copyright © 2023 Extremely Heavy Industries Inc. + */ +import '@xh/hoist/desktop/register'; +import {hoistCmp, useContextModel} from '@xh/hoist/core'; +import {div, vbox} from '@xh/hoist/cmp/layout'; +import {ZoneGridModel} from '@xh/hoist/cmp/zoneGrid'; +import {ZoneMapperModel} from '@xh/hoist/cmp/zoneGrid/impl/ZoneMapperModel'; +import {zoneMapper} from '@xh/hoist/desktop/cmp/zoneGrid/impl/ZoneMapper'; +import {Icon} from '@xh/hoist/icon'; +import {popover, Position} from '@xh/hoist/kit/blueprint'; +import {stopPropagation, withDefault} from '@xh/hoist/utils/js'; +import {MENU_PORTAL_ID} from '@xh/hoist/desktop/cmp/input'; +import {button, ButtonProps} from './Button'; + +export interface ZoneMapperButtonProps extends ButtonProps { + /** ZoneGridModel of the grid for which this button should show a chooser. */ + zoneGridModel?: ZoneGridModel; + + /** Position for chooser popover, as per Blueprint docs. */ + popoverPosition?: Position; +} + +/** + * A convenience button to trigger the display of a ZoneMapper UI for ZoneGrid configuration. + * + * Requires a `ZoneGridModel.zoneMapperModel` config option, set to true for default implementation. + */ +export const [ZoneMapperButton, zoneMapperButton] = hoistCmp.withFactory({ + displayName: 'ZoneMapperButton', + model: false, + render({icon, title, zoneGridModel, popoverPosition, disabled, ...rest}, ref) { + zoneGridModel = withDefault(zoneGridModel, useContextModel(ZoneGridModel)); + + const mapperModel = zoneGridModel?.mapperModel as ZoneMapperModel; + + if (!zoneGridModel) { + console.error( + "No ZoneGridModel available to ZoneMapperButton. Provide via a 'zoneGridModel' prop, or context." + ); + disabled = true; + } + + if (!mapperModel) { + console.error( + 'No ZoneMapperModel available on bound ZoneGridModel - enable via ZoneGridModel.zoneMapperModel config.' + ); + disabled = true; + } + + const isOpen = mapperModel?.isPopoverOpen; + return popover({ + isOpen, + popoverClassName: 'xh-zone-mapper-popover xh-popup--framed', + position: withDefault(popoverPosition, 'auto'), + target: button({ + icon: withDefault(icon, Icon.gridLarge()), + title: withDefault(title, 'Customize fields...'), + disabled, + ...rest + }), + disabled, + content: vbox({ + onClick: stopPropagation, + onDoubleClick: stopPropagation, + items: [ + div({ref, className: 'xh-popup__title', item: 'Customize Fields'}), + zoneMapper({model: mapperModel}) + ] + }), + onInteraction: (willOpen, e?) => { + if (isOpen && !willOpen) { + // Prevent clicks with Select controls from closing popover + const selectPortal = document.getElementById(MENU_PORTAL_ID), + selectPortalClick = selectPortal?.contains(e?.target), + selectValueClick = e?.target?.classList.contains('xh-select__single-value'); + + if (!selectPortalClick && !selectValueClick) { + mapperModel.close(); + } + } else if (!isOpen && willOpen) { + mapperModel.openPopover(); + } + } + }); + } +}); diff --git a/desktop/cmp/button/index.ts b/desktop/cmp/button/index.ts index 8b0f2a3ffe..aaa726dd0d 100644 --- a/desktop/cmp/button/index.ts +++ b/desktop/cmp/button/index.ts @@ -14,3 +14,4 @@ export * from './OptionsButton'; export * from './RefreshButton'; export * from './RestoreDefaultsButton'; export * from './ThemeToggleButton'; +export * from './ZoneMapperButton'; diff --git a/desktop/cmp/grid/impl/colchooser/ColChooser.ts b/desktop/cmp/grid/impl/colchooser/ColChooser.ts index 386f361fa1..1e017118cf 100644 --- a/desktop/cmp/grid/impl/colchooser/ColChooser.ts +++ b/desktop/cmp/grid/impl/colchooser/ColChooser.ts @@ -43,7 +43,7 @@ export const colChooser = hoistCmp.factory({ filler(), button({ omit: !showRestoreDefaults, - text: 'Restore Grid Defaults', + text: 'Restore Defaults', icon: Icon.undo({className: 'xh-red'}), onClick: () => model.restoreDefaultsAsync() }), @@ -57,7 +57,8 @@ export const colChooser = hoistCmp.factory({ button({ omit: commitOnChange, text: 'Save', - icon: Icon.check({className: 'xh-green'}), + icon: Icon.check(), + intent: 'success', onClick: () => { model.commit(); model.close(); diff --git a/desktop/cmp/zoneGrid/impl/ZoneMapper.scss b/desktop/cmp/zoneGrid/impl/ZoneMapper.scss new file mode 100644 index 0000000000..215099045d --- /dev/null +++ b/desktop/cmp/zoneGrid/impl/ZoneMapper.scss @@ -0,0 +1,71 @@ +.xh-zone-mapper { + width: 350px; + height: 500px; + + &__zone-picker { + padding: var(--xh-pad-px); + background: var(--xh-bg-alt); + border-bottom: var(--xh-border-solid); + + &__zone-cell { + display: flex; + align-items: center; + overflow: hidden; + flex: 1; + min-height: 30px; + white-space: nowrap; + padding: var(--xh-pad-half-px); + background: var(--xh-bg); + border: var(--xh-border-solid); + cursor: pointer; + + & > span:not(:last-child) { + margin-right: 3px; + } + + &--selected { + box-shadow: var(--xh-form-field-focused-box-shadow); + background: var(--xh-grid-tree-group-bg); + } + + &.tl { + font-size: var(--xh-grid-multifield-top-font-size-px); + border-radius: var(--xh-border-radius-px) 0 0 0; + } + + &.tr { + justify-content: flex-end; + margin: 0 0 0 -1px; + font-size: var(--xh-grid-multifield-top-font-size-px); + border-radius: 0 var(--xh-border-radius-px) 0 0; + } + + &.bl { + margin: -1px 0 0 0; + font-size: var(--xh-grid-multifield-bottom-font-size-px); + border-radius: 0 0 0 var(--xh-border-radius-px); + } + + &.br { + justify-content: flex-end; + margin: -1px 0 0 -1px; + font-size: var(--xh-grid-multifield-bottom-font-size-px); + border-radius: 0 0 var(--xh-border-radius-px); + } + } + } + + &__sort-picker { + flex: none !important; + border-top: var(--xh-border-solid); + + .xh-panel__content .xh-hframe { + padding: var(--xh-pad-px); + align-items: center; + + & > *:not(:last-child) { + margin-right: var(--xh-pad-px); + } + } + } +} diff --git a/desktop/cmp/zoneGrid/impl/ZoneMapper.ts b/desktop/cmp/zoneGrid/impl/ZoneMapper.ts new file mode 100644 index 0000000000..0f1689a29a --- /dev/null +++ b/desktop/cmp/zoneGrid/impl/ZoneMapper.ts @@ -0,0 +1,232 @@ +/* + * This file belongs to Hoist, an application development toolkit + * developed by Extremely Heavy Industries (www.xh.io | info@xh.io) + * + * Copyright © 2023 Extremely Heavy Industries Inc. + */ +import '@xh/hoist/desktop/register'; +import {hoistCmp, HoistModel, lookup, managed, useLocalModel, uses} from '@xh/hoist/core'; +import {div, filler, hbox, hframe, span, vbox} from '@xh/hoist/cmp/layout'; +import {panel} from '@xh/hoist/desktop/cmp/panel'; +import {grid, GridModel} from '@xh/hoist/cmp/grid'; +import {checkbox} from '@xh/hoist/desktop/cmp/input'; +import {button} from '@xh/hoist/desktop/cmp/button'; +import {select} from '@xh/hoist/desktop/cmp/input'; +import {Icon} from '@xh/hoist/icon'; +import {intersperse} from '@xh/hoist/utils/js'; +import {isEmpty} from 'lodash'; +import classNames from 'classnames'; +import './ZoneMapper.scss'; +import {ZoneMapperModel} from '@xh/hoist/cmp/zoneGrid/impl/ZoneMapperModel'; + +/** + * Hoist UI for user selection and discovery of available ZoneGrid columns, enabled via the + * `ZoneGridModel.zoneMapperModel` config option. + * + * This component displays an example of each of the four zones, with the available columns for + * the currently selected zone displayed in a list below. Users can toggle column visibility + * and labels for each zone to construct a custom layout for the grid rows. + * + * It is not necessary to manually create instances of this component within an application. + * + * @internal + */ +export const [ZoneMapper, zoneMapper] = hoistCmp.withFactory({ + displayName: 'ZoneMapper', + model: uses(ZoneMapperModel), + className: 'xh-zone-mapper', + render({model, className}) { + const {showRestoreDefaults, isDirty} = model, + impl = useLocalModel(ZoneMapperLocalModel); + + return panel({ + className, + items: [zonePicker(), grid({model: impl.gridModel}), sortPicker()], + bbar: [ + button({ + omit: !showRestoreDefaults, + text: 'Restore Defaults', + icon: Icon.undo({className: 'xh-red'}), + onClick: () => model.restoreDefaultsAsync() + }), + filler(), + button({ + text: 'Cancel', + onClick: () => model.close() + }), + button({ + text: 'Save', + icon: Icon.check(), + intent: 'success', + disabled: !isDirty, + onClick: () => { + model.commit(); + model.close(); + } + }) + ] + }); + } +}); + +const zonePicker = hoistCmp.factory({ + render({model}) { + const {leftFlex, rightFlex} = model, + className = 'xh-zone-mapper__zone-picker'; + + return vbox({ + className, + items: [ + hbox({ + className: `${className}__top`, + items: [ + zoneCell({zone: 'tl', flex: leftFlex}), + zoneCell({zone: 'tr', flex: rightFlex}) + ] + }), + hbox({ + className: `${className}__bottom`, + items: [ + zoneCell({zone: 'bl', flex: leftFlex}), + zoneCell({zone: 'br', flex: rightFlex}) + ] + }) + ] + }); + } +}); + +const zoneCell = hoistCmp.factory({ + render({model, zone, flex}) { + const {selectedZone, delimiter} = model, + className = 'xh-zone-mapper__zone-picker__zone-cell', + samples = model.getSamplesForZone(zone); + + return div({ + className: classNames( + className, + zone, + selectedZone === zone ? `${className}--selected` : null + ), + style: {flex}, + onClick: () => (model.selectedZone = zone), + items: intersperse(samples, span(delimiter)) + }); + } +}); + +const sortPicker = hoistCmp.factory({ + render({model}) { + return panel({ + className: 'xh-zone-mapper__sort-picker', + title: 'Sorting', + icon: Icon.list(), + compactHeader: true, + items: hframe( + select({ + bind: 'sortByColId', + enableFilter: true, + flex: 1, + options: model.sortByOptions + }), + button({ + text: model.getSortLabel(), + icon: model.getSortIcon(), + width: 80, + minimal: false, + onClick: () => model.setNextSortBy() + }) + ) + }); + } +}); + +class ZoneMapperLocalModel extends HoistModel { + override xhImpl = true; + @lookup(ZoneMapperModel) model: ZoneMapperModel; + + @managed + gridModel: GridModel; + + override onLinked() { + super.onLinked(); + + this.gridModel = this.createGridModel(); + + this.addReaction({ + track: () => [ + this.model.isOpen, + this.model.isPopoverOpen, + this.model.mappings, + this.model.selectedZone + ], + run: () => this.syncGrid(), + fireImmediately: true + }); + } + + private createGridModel(): GridModel { + const {model} = this, + {groupColumns, fields} = model, + hasGrouping = groupColumns && fields.some(it => it.chooserGroup); + + return new GridModel({ + store: {idSpec: 'field'}, + groupBy: hasGrouping ? 'chooserGroup' : null, + colDefaults: {movable: false, resizable: false, sortable: false}, + selModel: 'disabled', + columns: [ + { + field: 'displayName', + headerName: 'Field', + flex: 1 + }, + { + field: 'show', + align: 'center', + renderer: (value, {record}) => { + const {field} = record.data; + return checkbox({value, onChange: () => model.toggleShown(field)}); + } + }, + { + field: 'showLabel', + headerName: 'Label', + align: 'center', + renderer: (value, {record}) => { + const {label, field} = record.data; + if (!label) return null; + return checkbox({value, onChange: () => model.toggleShowLabel(field)}); + } + }, + // Hidden + {field: 'field', hidden: true}, + {field: 'label', hidden: true}, + {field: 'chooserGroup', hidden: true} + ] + }); + } + + private syncGrid() { + const {fields, mappings, limits, selectedZone} = this.model, + mapping = mappings[selectedZone], + limit = limits?.[selectedZone], + data = []; + + // 1) Determine which fields are shown and labeled for the zone + const allowedFields = !isEmpty(limit?.only) + ? fields.filter(it => limit.only.includes(it.field)) + : fields; + + allowedFields.forEach(f => { + const fieldMapping = mapping.find(it => f.field === it.field), + show = !!fieldMapping, + showLabel = fieldMapping?.showLabel ?? false; + + data.push({...f, show, showLabel}); + }); + + // 2) Load into display grid + this.gridModel.loadData(data); + } +} diff --git a/desktop/cmp/zoneGrid/impl/ZoneMapperDialog.ts b/desktop/cmp/zoneGrid/impl/ZoneMapperDialog.ts new file mode 100644 index 0000000000..56aba74199 --- /dev/null +++ b/desktop/cmp/zoneGrid/impl/ZoneMapperDialog.ts @@ -0,0 +1,35 @@ +/* + * This file belongs to Hoist, an application development toolkit + * developed by Extremely Heavy Industries (www.xh.io | info@xh.io) + * + * Copyright © 2023 Extremely Heavy Industries Inc. + */ +import {hoistCmp, uses} from '@xh/hoist/core'; +import {Icon} from '@xh/hoist/icon'; +import {dialog} from '@xh/hoist/kit/blueprint'; +import {ZoneMapperModel} from '@xh/hoist/cmp/zoneGrid/impl/ZoneMapperModel'; +import {zoneMapper} from './ZoneMapper'; + +export const zoneMapperDialog = hoistCmp.factory({ + model: uses(ZoneMapperModel), + className: 'xh-zone-mapper-dialog', + + render({model, className}) { + const {isOpen} = model; + if (!isOpen) return null; + + return dialog({ + className, + icon: Icon.gridLarge(), + title: 'Customize Fields', + isOpen: true, + onClose: () => model.close(), + item: zoneMapper({model}), + // Size determined by inner component + style: { + width: 'unset', + height: 'unset' + } + }); + } +}); diff --git a/dynamics/desktop.ts b/dynamics/desktop.ts index bf215cda1f..6fe4c99a6d 100644 --- a/dynamics/desktop.ts +++ b/dynamics/desktop.ts @@ -19,6 +19,7 @@ export let ColChooserModel = null; export let ColumnHeaderFilterModel = null; export let ModalSupportModel = null; export let colChooser = null; +export let zoneMapper = null; export let columnHeaderFilter = null; export let dockContainerImpl = null; export let errorMessage = null; @@ -38,6 +39,7 @@ export function installDesktopImpls(impls) { ColumnHeaderFilterModel = impls.ColumnHeaderFilterModel; ModalSupportModel = impls.ModalSupportModel; colChooser = impls.colChooser; + zoneMapper = impls.zoneMapper; columnHeaderFilter = impls.columnHeaderFilter; dockContainerImpl = impls.dockContainerImpl; errorMessage = impls.errorMessage; diff --git a/dynamics/mobile.ts b/dynamics/mobile.ts index ce8047bed8..d9972fe7b9 100644 --- a/dynamics/mobile.ts +++ b/dynamics/mobile.ts @@ -17,6 +17,7 @@ */ export let ColChooserModel = null; export let colChooser = null; +export let zoneMapper = null; export let errorMessage = null; export let pinPadImpl = null; export let storeFilterFieldImpl = null; @@ -30,6 +31,7 @@ export let tabContainerImpl = null; export function installMobileImpls(impls) { ColChooserModel = impls.ColChooserModel; colChooser = impls.colChooser; + zoneMapper = impls.zoneMapper; errorMessage = impls.errorMessage; pinPadImpl = impls.pinPadImpl; storeFilterFieldImpl = impls.storeFilterFieldImpl; diff --git a/mobile/appcontainer/AppContainer.ts b/mobile/appcontainer/AppContainer.ts index bb376a240e..2ca32d64d5 100644 --- a/mobile/appcontainer/AppContainer.ts +++ b/mobile/appcontainer/AppContainer.ts @@ -11,6 +11,7 @@ import {createElement, hoistCmp, refreshContextView, uses, XH} from '@xh/hoist/c import {installMobileImpls} from '@xh/hoist/dynamics/mobile'; import {colChooser} from '@xh/hoist/mobile/cmp/grid/impl/ColChooser'; import {ColChooserModel} from '@xh/hoist/mobile/cmp/grid/impl/ColChooserModel'; +import {zoneMapper} from '@xh/hoist/mobile/cmp/zoneGrid/impl/ZoneMapper'; import {mask} from '@xh/hoist/mobile/cmp/mask'; import {storeFilterFieldImpl} from '@xh/hoist/mobile/cmp/store/impl/StoreFilterField'; import {tabContainerImpl} from '@xh/hoist/mobile/cmp/tab/impl/TabContainer'; @@ -38,6 +39,7 @@ installMobileImpls({ pinPadImpl, colChooser, ColChooserModel, + zoneMapper, errorMessage }); diff --git a/mobile/cmp/button/ZoneMapperButton.ts b/mobile/cmp/button/ZoneMapperButton.ts new file mode 100644 index 0000000000..1901fafcf9 --- /dev/null +++ b/mobile/cmp/button/ZoneMapperButton.ts @@ -0,0 +1,41 @@ +/* + * This file belongs to Hoist, an application development toolkit + * developed by Extremely Heavy Industries (www.xh.io | info@xh.io) + * + * Copyright © 2023 Extremely Heavy Industries Inc. + */ +import {hoistCmp, useContextModel} from '@xh/hoist/core'; +import {ZoneGridModel} from '../../../cmp/zoneGrid'; +import {button, ButtonProps} from '@xh/hoist/mobile/cmp/button'; +import {Icon} from '@xh/hoist/icon'; +import {withDefault} from '@xh/hoist/utils/js'; +import '@xh/hoist/mobile/register'; + +export interface ZoneMapperButtonProps extends ButtonProps { + /** ZoneGridModel of the grid for which this button should show a chooser. */ + zoneGridModel?: ZoneGridModel; +} + +/** + * A convenience button to trigger the display of a ZoneMapper UI for ZoneGrid configuration. + * + * Requires a `ZoneGridModel.zoneMapperModel` config option, set to true for default implementation. + */ +export const [ZoneMapperButton, zoneMapperButton] = hoistCmp.withFactory({ + displayName: 'ZoneMapperButton', + model: false, + render({zoneGridModel, icon = Icon.gridLarge(), onClick, ...props}) { + zoneGridModel = withDefault(zoneGridModel, useContextModel(ZoneGridModel)); + + if (!zoneGridModel) { + console.error( + "No ZoneGridModel available to ZoneMapperButton. Provide via a 'zoneGridModel' prop, or context." + ); + return button({icon, disabled: true, ...props}); + } + + onClick = onClick ?? (() => zoneGridModel.showMapper()); + + return button({icon, onClick, ...props}); + } +}); diff --git a/mobile/cmp/button/index.ts b/mobile/cmp/button/index.ts index 211c519469..7a8f6983fc 100644 --- a/mobile/cmp/button/index.ts +++ b/mobile/cmp/button/index.ts @@ -15,3 +15,4 @@ export * from './LogoutButton'; export * from './RefreshButton'; export * from './RestoreDefaultsButton'; export * from './NavigatorBackButton'; +export * from './ZoneMapperButton'; diff --git a/mobile/cmp/input/Select.scss b/mobile/cmp/input/Select.scss index 811221cd89..bdde39aa22 100644 --- a/mobile/cmp/input/Select.scss +++ b/mobile/cmp/input/Select.scss @@ -107,6 +107,7 @@ &__fullscreen-wrapper { position: absolute !important; + z-index: inherit; top: 0; left: 0; right: 0; diff --git a/mobile/cmp/input/Select.ts b/mobile/cmp/input/Select.ts index 5c67f5238f..1cd18dda9c 100644 --- a/mobile/cmp/input/Select.ts +++ b/mobile/cmp/input/Select.ts @@ -57,6 +57,12 @@ export interface SelectProps extends HoistProps, HoistInputProps, LayoutProps { */ enableFullscreen?: boolean; + /** + * Optional override for fullscreen z-index. Useful for enabling fullscreen from + * within components that have a higher z-index. + */ + fullScreenZIndex?: number; + /** * Function called to filter available options for a given query string input. * Used for filtering of options provided by `options` prop when `enableFilter` is true. @@ -531,6 +537,7 @@ class SelectInputModel extends HoistInputModel { portal.id = FULLSCREEN_PORTAL_ID; document.body.appendChild(portal); } + portal.style.zIndex = withDefault(this.componentProps.fullScreenZIndex, null); return portal; } diff --git a/mobile/cmp/panel/DialogPanel.scss b/mobile/cmp/panel/DialogPanel.scss index 43004c3d61..5db1ebe21c 100644 --- a/mobile/cmp/panel/DialogPanel.scss +++ b/mobile/cmp/panel/DialogPanel.scss @@ -1,10 +1,22 @@ -.xh-dialog-panel > .dialog { - width: 95%; - height: 95%; +.xh-dialog-panel { + border: var(--xh-border-solid); - .dialog-container, - .dialog-container > .xh-panel { + & > .dialog { + margin-top: var(--xh-pad-half-px); width: 100%; - height: 100%; + height: calc(100% - var(--xh-pad-px)); + max-height: calc(100% - var(--xh-pad-px)) !important; + + .dialog-container { + max-width: 100% !important; + height: 100%; + border-width: var(--xh-popup-border-width-px) 0 0 !important; + border-radius: 0; + + & > .xh-panel { + width: 100%; + height: 100%; + } + } } } diff --git a/mobile/cmp/panel/DialogPanel.ts b/mobile/cmp/panel/DialogPanel.ts index 97c120548a..fed6d48803 100644 --- a/mobile/cmp/panel/DialogPanel.ts +++ b/mobile/cmp/panel/DialogPanel.ts @@ -16,10 +16,12 @@ export interface DialogPanelProps extends PanelProps { } /** - * Wraps a Panel in a fullscreen Dialog. + * Wraps a Panel in a fullscreen floating Dialog. * * These views do not participate in navigation or routing, and are used for showing fullscreen * views outside of the Navigator / TabContainer context. + * + * @see FullscreenPanel for a true fullscreen, non-floating alternative. */ export const [DialogPanel, dialogPanel] = hoistCmp.withFactory({ displayName: 'DialogPanel', diff --git a/mobile/cmp/zoneGrid/impl/ZoneMapper.scss b/mobile/cmp/zoneGrid/impl/ZoneMapper.scss new file mode 100644 index 0000000000..5f33eac73b --- /dev/null +++ b/mobile/cmp/zoneGrid/impl/ZoneMapper.scss @@ -0,0 +1,67 @@ +.xh-zone-mapper { + &__zone-picker { + padding: var(--xh-pad-px); + background: var(--xh-bg-alt); + border-bottom: var(--xh-border-solid); + + &__zone-cell { + display: flex; + align-items: center; + overflow: hidden; + flex: 1; + min-height: 34px; + white-space: nowrap; + padding: var(--xh-pad-half-px); + background: var(--xh-bg); + border: var(--xh-border-solid); + + & > span:not(:last-child) { + margin-right: 3px; + } + + &--selected { + box-shadow: inset 0 0 1px 1px var(--xh-list-select-color); + background: var(--xh-grid-tree-group-bg); + } + + &.tl { + font-size: var(--xh-grid-multifield-top-font-size-px); + border-radius: var(--xh-border-radius-px) 0 0 0; + } + + &.tr { + justify-content: flex-end; + margin: 0 0 0 -1px; + font-size: var(--xh-grid-multifield-top-font-size-px); + border-radius: 0 var(--xh-border-radius-px) 0 0; + } + + &.bl { + margin: -1px 0 0 0; + font-size: var(--xh-grid-multifield-bottom-font-size-px); + border-radius: 0 0 0 var(--xh-border-radius-px); + } + + &.br { + justify-content: flex-end; + margin: -1px 0 0 -1px; + font-size: var(--xh-grid-multifield-bottom-font-size-px); + border-radius: 0 0 var(--xh-border-radius-px); + } + } + } + + &__sort-picker { + flex: none !important; + border-top: var(--xh-border-solid); + + .xh-panel__content .xh-hframe { + padding: var(--xh-pad-px); + align-items: center; + + & > *:not(:last-child) { + margin-right: var(--xh-pad-px); + } + } + } +} diff --git a/mobile/cmp/zoneGrid/impl/ZoneMapper.ts b/mobile/cmp/zoneGrid/impl/ZoneMapper.ts new file mode 100644 index 0000000000..1b3abe7147 --- /dev/null +++ b/mobile/cmp/zoneGrid/impl/ZoneMapper.ts @@ -0,0 +1,236 @@ +/* + * This file belongs to Hoist, an application development toolkit + * developed by Extremely Heavy Industries (www.xh.io | info@xh.io) + * + * Copyright © 2023 Extremely Heavy Industries Inc. + */ +import '@xh/hoist/mobile/register'; +import {hoistCmp, HoistModel, lookup, managed, useLocalModel, uses} from '@xh/hoist/core'; +import {div, filler, hbox, hframe, span, vbox} from '@xh/hoist/cmp/layout'; +import {dialogPanel, panel} from '@xh/hoist/mobile/cmp/panel'; +import {grid, GridModel} from '@xh/hoist/cmp/grid'; +import {checkbox} from '@xh/hoist/mobile/cmp/input'; +import {button} from '@xh/hoist/mobile/cmp/button'; +import {select} from '@xh/hoist/mobile/cmp/input'; +import {Icon} from '@xh/hoist/icon'; +import {wait} from '@xh/hoist/promise'; +import {intersperse} from '@xh/hoist/utils/js'; +import {isEmpty} from 'lodash'; +import classNames from 'classnames'; +import './ZoneMapper.scss'; +import {ZoneMapperModel} from '@xh/hoist/cmp/zoneGrid/impl/ZoneMapperModel'; + +/** + * Hoist UI for user selection and discovery of available ZoneGrid columns, enabled via the + * `ZoneGridModel.zoneMapperModel` config option. + * + * This component displays an example of each of the four zones, with the available columns for + * the currently selected zone displayed in a list below. Users can toggle column visibility + * and labels for each zone to construct a custom layout for the grid rows. + * + * It is not necessary to manually create instances of this component within an application. + * + * @internal + */ +export const [ZoneMapper, zoneMapper] = hoistCmp.withFactory({ + displayName: 'ZoneMapper', + model: uses(ZoneMapperModel), + className: 'xh-zone-mapper', + render({model, className}) { + const {isOpen, showRestoreDefaults, isDirty} = model, + impl = useLocalModel(ZoneMapperLocalModel); + + return dialogPanel({ + isOpen, + title: 'Customize Fields', + icon: Icon.gridLarge(), + className, + items: [zonePicker(), grid({model: impl.gridModel}), sortPicker()], + bbar: [ + button({ + omit: !showRestoreDefaults, + text: 'Reset', + minimal: true, + onClick: () => model.restoreDefaultsAsync() + }), + filler(), + button({ + text: 'Cancel', + minimal: true, + onClick: () => model.close() + }), + button({ + text: 'Save', + icon: Icon.check(), + disabled: !isDirty, + onClick: () => { + model.commit(); + model.close(); + } + }) + ] + }); + } +}); + +const zonePicker = hoistCmp.factory({ + render({model}) { + const {leftFlex, rightFlex} = model, + className = 'xh-zone-mapper__zone-picker'; + + return vbox({ + className, + items: [ + hbox({ + className: `${className}__top`, + items: [ + zoneCell({zone: 'tl', flex: leftFlex}), + zoneCell({zone: 'tr', flex: rightFlex}) + ] + }), + hbox({ + className: `${className}__bottom`, + items: [ + zoneCell({zone: 'bl', flex: leftFlex}), + zoneCell({zone: 'br', flex: rightFlex}) + ] + }) + ] + }); + } +}); + +const zoneCell = hoistCmp.factory({ + render({model, zone, flex}) { + const {selectedZone, delimiter} = model, + className = 'xh-zone-mapper__zone-picker__zone-cell', + samples = model.getSamplesForZone(zone); + + return div({ + className: classNames( + className, + zone, + selectedZone === zone ? `${className}--selected` : null + ), + style: {flex}, + onClick: () => (model.selectedZone = zone), + items: intersperse(samples, span(delimiter)) + }); + } +}); + +const sortPicker = hoistCmp.factory({ + render({model}) { + return panel({ + title: 'Sorting', + icon: Icon.list(), + className: 'xh-zone-mapper__sort-picker', + items: hframe( + select({ + bind: 'sortByColId', + enableFilter: true, + enableFullscreen: true, + title: 'Sorting', + fullScreenZIndex: 10002, + flex: 1, + options: model.sortByOptions + }), + button({ + text: model.getSortLabel(), + icon: model.getSortIcon(), + width: 80, + onClick: () => model.setNextSortBy() + }) + ) + }); + } +}); + +class ZoneMapperLocalModel extends HoistModel { + override xhImpl = true; + @lookup(ZoneMapperModel) model: ZoneMapperModel; + + @managed + gridModel: GridModel; + + override onLinked() { + super.onLinked(); + + this.gridModel = this.createGridModel(); + + this.addReaction({ + track: () => [this.model.isOpen, this.model.mappings, this.model.selectedZone], + run: () => this.syncGridAsync() + }); + } + + private createGridModel(): GridModel { + const {model} = this, + {groupColumns, fields} = model, + hasGrouping = groupColumns && fields.some(it => it.chooserGroup); + + return new GridModel({ + store: {idSpec: 'field'}, + groupBy: hasGrouping ? 'chooserGroup' : null, + colDefaults: {movable: false, resizable: false, sortable: false}, + columns: [ + { + field: 'displayName', + headerName: 'Field', + flex: 1 + }, + { + field: 'show', + align: 'center', + renderer: (value, {record}) => { + const {field} = record.data; + return checkbox({value, onChange: () => model.toggleShown(field)}); + } + }, + { + field: 'showLabel', + headerName: 'Label', + align: 'center', + renderer: (value, {record}) => { + const {label, field} = record.data; + if (!label) return null; + return checkbox({value, onChange: () => model.toggleShowLabel(field)}); + } + }, + // Hidden + {field: 'field', hidden: true}, + {field: 'label', hidden: true}, + {field: 'chooserGroup', hidden: true} + ] + }); + } + + private async syncGridAsync() { + const {fields, mappings, limits, selectedZone} = this.model, + mapping = mappings[selectedZone], + limit = limits?.[selectedZone], + data = []; + + // 1) Determine which fields are shown and labeled for the zone + const allowedFields = !isEmpty(limit?.only) + ? fields.filter(it => limit.only.includes(it.field)) + : fields; + + allowedFields.forEach(f => { + const fieldMapping = mapping.find(it => f.field === it.field), + show = !!fieldMapping, + showLabel = fieldMapping?.showLabel ?? false; + + data.push({...f, show, showLabel}); + }); + + // 2) Load into display grid + this.gridModel.loadData(data); + + // 3) Blur checkboxes. This is a workaround for an Onsen issue on mobile, where the checkbox + // will not re-render as long as it has focus. + await wait(1); + const checkboxes = document.querySelectorAll('ons-checkbox'); + checkboxes.forEach(it => it.blur()); + } +} diff --git a/styles/vars.scss b/styles/vars.scss index a7a85eb1d6..04e41c1c4d 100644 --- a/styles/vars.scss +++ b/styles/vars.scss @@ -495,11 +495,11 @@ body { --xh-grid-tiny-header-lr-pad-px: calc(var(--xh-grid-tiny-header-lr-pad) * 1px); // Multifield renderer - --xh-grid-multifield-top-font-size: var(--grid-multifield-top-font-size, 12); + --xh-grid-multifield-top-font-size: var(--grid-multifield-top-font-size, 14); --xh-grid-multifield-top-font-size-px: calc(var(--xh-grid-multifield-top-font-size) * 1px); - --xh-grid-multifield-bottom-font-size: var(--grid-multifield-bottom-font-size, 10); + --xh-grid-multifield-bottom-font-size: var(--grid-multifield-bottom-font-size, 11); --xh-grid-multifield-bottom-font-size-px: calc(var(--xh-grid-multifield-bottom-font-size) * 1px); - --xh-grid-multifield-line-height: var(--grid-multifield-line-height, 14); + --xh-grid-multifield-line-height: var(--grid-multifield-line-height, 16); --xh-grid-multifield-line-height-px: calc(var(--xh-grid-multifield-line-height) * 1px); // Grid column-header-based filter popover (desktop only) diff --git a/utils/js/LangUtils.ts b/utils/js/LangUtils.ts index 4f2e605afb..cac34539c2 100644 --- a/utils/js/LangUtils.ts +++ b/utils/js/LangUtils.ts @@ -6,6 +6,7 @@ */ import {Exception} from '@xh/hoist/core/exception/Exception'; import { + flatMap, forOwn, isArray, isEmpty, @@ -283,6 +284,15 @@ export function filterConsecutive( }; } +/** + * Intersperse a separator between each item in an array. + */ +export function intersperse(arr: T[], separator: T): T[] { + return flatMap(arr, (it, idx) => { + return idx > 0 ? [separator, it] : [it]; + }); +} + /** * Return value passed or the result of executing it, if it is a function. */ From d6ab183eac59711e3651466ac44364ce40e78825 Mon Sep 17 00:00:00 2001 From: Lee Wexler Date: Fri, 3 Nov 2023 10:14:36 -0400 Subject: [PATCH 2/6] Avoid spurious model lookup context changes (#3518) --- CHANGELOG.md | 5 +++++ core/HoistComponent.ts | 23 ++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44065f1a8a..5911e36b5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,11 @@ * The `XH.getActiveModels` method has been renamed to `XH.getModels` for clarity and consistency. This is not expected to impact applications. +### ⚙️ Technical + +* Performance improvement to `HoistComponent`: Prevent unnecessary re-renderings resulting from +spurious model lookup changes. + ## 59.2.0 - 2023-10-16 ### 🐞 Bug Fixes diff --git a/core/HoistComponent.ts b/core/HoistComponent.ts index c15c83a0f0..8a3899527e 100644 --- a/core/HoistComponent.ts +++ b/core/HoistComponent.ts @@ -299,16 +299,23 @@ function wrapWithModel(render: RenderFn, cfg: Config): RenderFn { ].join(' | '); }); - // 3) Create any new lookup context that needs to be established - // Avoid adding extra context if this model already in default context. - const newLookup = + // 3) insert any new lookup context that needs to be established. Avoid adding if default + // model not changing; cache object to avoid triggering re-renders in context children + const insertLookup = useRef(null); + if ( !publishNone && model && (!modelLookup || !fromContext || (publishDefault && modelLookup.lookupModel('*') !== model)) - ? new ModelLookup(model, modelLookup, publishMode) - : null; + ) { + const {current} = insertLookup; + if (current?.model != model || current?.parent != modelLookup) { + insertLookup.current = new ModelLookup(model, modelLookup, publishMode); + } + } else { + insertLookup.current = null; + } // 4) Get the rendering of the component with its model context // 4a) Create a generic render function, that can be called immediately, or in wrapped component. @@ -319,7 +326,7 @@ function wrapWithModel(render: RenderFn, cfg: Config): RenderFn { delete props.modelRef; delete props.modelConfig; ctx.props = props; - ctx.modelLookup = newLookup ?? modelLookup; + ctx.modelLookup = insertLookup.current ?? modelLookup; useOnMount(() => instanceManager.registerModelWithTestId(props.testId, model)); useOnUnmount(() => instanceManager.unregisterModelWithTestId(props.testId)); return render(props, ref); @@ -334,7 +341,9 @@ function wrapWithModel(render: RenderFn, cfg: Config): RenderFn { ? managedRender() : createElement(HostCmp, {managedRender, key: model?.xhId}); - return newLookup ? modelLookupContextProvider({value: newLookup, item: ret}) : ret; + return insertLookup.current + ? modelLookupContextProvider({value: insertLookup.current, item: ret}) + : ret; }; } From 651a2eadca448bc772daab15c17f6fea64855662 Mon Sep 17 00:00:00 2001 From: Anselm McClain Date: Fri, 3 Nov 2023 09:49:20 -0700 Subject: [PATCH 3/6] Run `yarn upgrade` + In particular, updated @types/react from 18.2.22 to 18.2.34 - fixes bug incorrectly reporting Element as not satisfying ReactNode ("Property children is missing in type Element but required in type ReactPortal") --- package.json | 4 +- yarn.lock | 1218 ++++++++++++++++++++++++++------------------------ 2 files changed, 641 insertions(+), 581 deletions(-) diff --git a/package.json b/package.json index 701b559859..eef7ce8885 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,7 @@ "@ag-grid-community/core": "30.x", "@ag-grid-community/react": "30.x", "@xh/hoist-dev-utils": "7.x", + "csstype": "3.x", "eslint": "8.x", "eslint-config-prettier": "9.x", "eslint-plugin-tsdoc": "0.x", @@ -102,8 +103,7 @@ "stylelint": "15.x", "stylelint-config-standard-scss": "11.x", "type-fest": "4.x", - "typescript": "~5.1.6", - "csstype": "3.x" + "typescript": "~5.1.6" }, "resolutions": { "core-js": "^3.0" diff --git a/yarn.lock b/yarn.lock index 57dca4c343..83c01b9a24 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,21 +8,21 @@ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@ag-grid-community/client-side-row-model@30.x": - version "30.1.0" - resolved "https://registry.yarnpkg.com/@ag-grid-community/client-side-row-model/-/client-side-row-model-30.1.0.tgz#87c439fc1899804ae4cc46241877a247f80d1db3" - integrity sha512-j6ao2nqxOn6ztyBuWBZNIsxdjj+lckmB3jfx2I2Y9vx9q3xX0ibzpp5hafRY+09/LXSXZHA/1KR31Zj4Mzikuw== + version "30.2.1" + resolved "https://registry.yarnpkg.com/@ag-grid-community/client-side-row-model/-/client-side-row-model-30.2.1.tgz#88c0b2d17555c16316c34f7ef22f4642f1f75d2a" + integrity sha512-LeFAsq2RuDXwjoUVLqlUgBYTHyCbyQozaQ4JY8SzBEABc8bOanIfsY3YONUckn+KWtRUrH5nGYA8bBeGrc20MQ== dependencies: - "@ag-grid-community/core" "~30.1.0" + "@ag-grid-community/core" "~30.2.1" -"@ag-grid-community/core@30.x", "@ag-grid-community/core@~30.1.0": - version "30.1.0" - resolved "https://registry.yarnpkg.com/@ag-grid-community/core/-/core-30.1.0.tgz#e91b1d64b8cab23abb0da7ce9d9308280360de24" - integrity sha512-UR/cqyV4r/fLi8w6x+okL9DGHMXtyxthQMgCFa5zBs4UzmRuJeg39NfcRsHoNg2LT2GPHWaE/8Qa+ae7pjXh4g== +"@ag-grid-community/core@30.x", "@ag-grid-community/core@~30.2.1": + version "30.2.1" + resolved "https://registry.yarnpkg.com/@ag-grid-community/core/-/core-30.2.1.tgz#9e4dcc4178ae2821ea3e4a637e5538a5455ae4d3" + integrity sha512-jGRBfRFsLwxch8GJGjbVI2FVbB+/fy1s4mm8//+kOkcPFlq4BbLFELvU4Kupwk1YkhduxUC50GTYyFzmF0rSIQ== "@ag-grid-community/react@30.x": - version "30.1.0" - resolved "https://registry.yarnpkg.com/@ag-grid-community/react/-/react-30.1.0.tgz#948f711e8d2e36e2dec21a2507bc459b5beca823" - integrity sha512-bhK9qUbFrZ6TXxt3EjDShL1/ccHIaGXWOl8LY5iQUw7sZzbCJk1d1w1qoyOedQMbVdV1KaN3I1rj2uWRM7xkXg== + version "30.2.1" + resolved "https://registry.yarnpkg.com/@ag-grid-community/react/-/react-30.2.1.tgz#32d641ad1e2b73fe1f409f0e32692c1f3b4fcd9e" + integrity sha512-bSrEh/zVI5oL0pf4cXRvZYiLuMjzWhyS0o5THzS4fqifmPczmH0HU3iTgQjH6QUNHAX3Ch4ZficVWdD005j/vw== dependencies: prop-types "^15.8.1" @@ -42,27 +42,27 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/compat-data@^7.22.20", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" - integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" + integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== "@babel/core@^7.22", "@babel/core@^7.22.1": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.20.tgz#e3d0eed84c049e2a2ae0a64d27b6a37edec385b7" - integrity sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" + integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.22.15" + "@babel/generator" "^7.23.0" "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.22.20" - "@babel/helpers" "^7.22.15" - "@babel/parser" "^7.22.16" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.0" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.22.20" - "@babel/types" "^7.22.19" - convert-source-map "^1.7.0" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" @@ -84,12 +84,12 @@ dependencies: eslint-rule-composer "^0.3.0" -"@babel/generator@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339" - integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -143,10 +143,10 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" - integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== +"@babel/helper-define-polyfill-provider@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" + integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -159,13 +159,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" @@ -175,11 +175,11 @@ "@babel/types" "^7.22.5" "@babel/helper-member-expression-to-functions@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz#b95a144896f6d491ca7863576f820f3628818621" - integrity sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": version "7.22.15" @@ -188,10 +188,10 @@ dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.20", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz#da9edc14794babbe7386df438f3768067132f59e" - integrity sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A== +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" @@ -211,7 +211,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": +"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== @@ -220,7 +220,7 @@ "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-wrap-function" "^7.22.20" -"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": +"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== @@ -255,7 +255,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.22.5": +"@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== @@ -274,14 +274,14 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.15.tgz#f09c3df31e86e3ea0b7ff7556d85cdebd47ea6f1" - integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== +"@babel/helpers@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" + integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== dependencies: "@babel/template" "^7.22.15" - "@babel/traverse" "^7.22.15" - "@babel/types" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" "@babel/highlight@^7.22.13": version "7.22.20" @@ -292,10 +292,10 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.22.15", "@babel/parser@^7.22.16": - version "7.22.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" - integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": version "7.22.15" @@ -314,13 +314,13 @@ "@babel/plugin-transform-optional-chaining" "^7.22.15" "@babel/plugin-proposal-decorators@^7.22.3": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.15.tgz#dc774eae73ab8c28a644d490b45aa47a85bb0bf5" - integrity sha512-kc0VvbbUyKelvzcKOSyQUSVVXS5pT3UhRB0e3c9An86MvLqs+gx0dN4asllrDluqSa3m9YyooXKGOFVomnyFkg== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz#0b345a5754f48309fa50b7cd99075ef0295b12c8" + integrity sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg== dependencies: "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-replace-supers" "^7.22.20" "@babel/helper-split-export-declaration" "^7.22.6" "@babel/plugin-syntax-decorators" "^7.22.10" @@ -484,14 +484,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" - integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== +"@babel/plugin-transform-async-generator-functions@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" + integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-transform-async-to-generator@^7.22.5": @@ -510,10 +510,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz#494eb82b87b5f8b1d8f6f28ea74078ec0a10a841" - integrity sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw== +"@babel/plugin-transform-block-scoping@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" + integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -557,10 +557,10 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz#e7404ea5bb3387073b9754be654eecb578324694" - integrity sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ== +"@babel/plugin-transform-destructuring@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" + integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -649,32 +649,32 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" - integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== +"@babel/plugin-transform-modules-amd@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" + integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== dependencies: - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz#b11810117ed4ee7691b29bd29fd9f3f98276034f" - integrity sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg== +"@babel/plugin-transform-modules-commonjs@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== dependencies: - "@babel/helper-module-transforms" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" - integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== +"@babel/plugin-transform-modules-systemjs@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" + integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== dependencies: "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/plugin-transform-modules-umd@^7.22.5": version "7.22.5" @@ -742,10 +742,10 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz#d7a5996c2f7ca4ad2ad16dbb74444e5c4385b1ba" - integrity sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A== +"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" + integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" @@ -909,11 +909,11 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.22.4": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.20.tgz#de9e9b57e1127ce0a2f580831717f7fb677ceedb" - integrity sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059" + integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ== dependencies: - "@babel/compat-data" "^7.22.20" + "@babel/compat-data" "^7.23.2" "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.15" @@ -939,15 +939,15 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.15" + "@babel/plugin-transform-async-generator-functions" "^7.23.2" "@babel/plugin-transform-async-to-generator" "^7.22.5" "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.22.15" + "@babel/plugin-transform-block-scoping" "^7.23.0" "@babel/plugin-transform-class-properties" "^7.22.5" "@babel/plugin-transform-class-static-block" "^7.22.11" "@babel/plugin-transform-classes" "^7.22.15" "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.15" + "@babel/plugin-transform-destructuring" "^7.23.0" "@babel/plugin-transform-dotall-regex" "^7.22.5" "@babel/plugin-transform-duplicate-keys" "^7.22.5" "@babel/plugin-transform-dynamic-import" "^7.22.11" @@ -959,9 +959,9 @@ "@babel/plugin-transform-literals" "^7.22.5" "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" "@babel/plugin-transform-member-expression-literals" "^7.22.5" - "@babel/plugin-transform-modules-amd" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.15" - "@babel/plugin-transform-modules-systemjs" "^7.22.11" + "@babel/plugin-transform-modules-amd" "^7.23.0" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" + "@babel/plugin-transform-modules-systemjs" "^7.23.0" "@babel/plugin-transform-modules-umd" "^7.22.5" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" "@babel/plugin-transform-new-target" "^7.22.5" @@ -970,7 +970,7 @@ "@babel/plugin-transform-object-rest-spread" "^7.22.15" "@babel/plugin-transform-object-super" "^7.22.5" "@babel/plugin-transform-optional-catch-binding" "^7.22.11" - "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-optional-chaining" "^7.23.0" "@babel/plugin-transform-parameters" "^7.22.15" "@babel/plugin-transform-private-methods" "^7.22.5" "@babel/plugin-transform-private-property-in-object" "^7.22.11" @@ -987,10 +987,10 @@ "@babel/plugin-transform-unicode-regex" "^7.22.5" "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" "@babel/preset-modules" "0.1.6-no-external-plugins" - "@babel/types" "^7.22.19" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" + "@babel/types" "^7.23.0" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" core-js-compat "^3.31.0" semver "^6.3.1" @@ -1016,14 +1016,14 @@ "@babel/plugin-transform-react-pure-annotations" "^7.22.5" "@babel/preset-typescript@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.15.tgz#43db30516fae1d417d748105a0bc95f637239d48" - integrity sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz#c8de488130b7081f7e1482936ad3de5b018beef4" + integrity sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.15" "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.15" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" "@babel/plugin-transform-typescript" "^7.22.15" "@babel/regjsgen@^0.8.0": @@ -1032,9 +1032,9 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" - integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== dependencies: regenerator-runtime "^0.14.0" @@ -1047,29 +1047,29 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.20.tgz#db572d9cb5c79e02d83e5618b82f6991c07584c9" - integrity sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw== +"@babel/traverse@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== dependencies: "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.22.15" + "@babel/generator" "^7.23.0" "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.22.5" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.16" - "@babel/types" "^7.22.19" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.4", "@babel/types@^7.4.4": - version "7.22.19" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684" - integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg== +"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4", "@babel/types@^7.4.4": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.19" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@blueprintjs/colors@^4.2.1": @@ -1126,19 +1126,19 @@ semver "^7.3.4" "@csstools/css-parser-algorithms@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.1.tgz#ec4fc764ba45d2bb7ee2774667e056aa95003f3a" - integrity sha512-xrvsmVUtefWMWQsGgFffqWSK03pZ1vfDki4IVIIUxxDKnGBzqNgv0A7SB1oXtVNEkcVO8xi1ZrTL29HhSu5kGA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz#1e0d581dbf4518cb3e939c3b863cb7180c8cedad" + integrity sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA== "@csstools/css-tokenizer@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.0.tgz#9d70e6dcbe94e44c7400a2929928db35c4de32b5" - integrity sha512-wErmsWCbsmig8sQKkM6pFhr/oPha1bHfvxsUY5CYSQxwyhA9Ulrs8EqCgClhg4Tgg2XapVstGqSVcz0xOYizZA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz#9dc431c9a5f61087af626e41ac2a79cce7bb253d" + integrity sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg== "@csstools/media-query-list-parser@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.4.tgz#0017f99945f6c16dd81a7aacf6821770933c3a5c" - integrity sha512-V/OUXYX91tAC1CDsiY+HotIcJR+vPtzrX8pCplCpT++i8ThZZsq5F5dzZh/bDM3WUOjrvC1ljed1oSJxMfjqhw== + version "2.1.5" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz#94bc8b3c3fd7112a40b7bf0b483e91eba0654a0f" + integrity sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ== "@csstools/selector-specificity@^3.0.0": version "3.0.0" @@ -1246,9 +1246,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.8.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.1.tgz#8c4bb756cc2aa7eaf13cfa5e69c83afb3260c20c" - integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== "@eslint/eslintrc@^2.1.2": version "2.1.2" @@ -1265,10 +1265,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.49.0": - version "8.49.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333" - integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w== +"@eslint/js@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.52.0.tgz#78fe5f117840f69dc4a353adf9b9cd926353378c" + integrity sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA== "@fortawesome/fontawesome-common-types@6.4.2": version "6.4.2" @@ -1322,12 +1322,12 @@ dependencies: prop-types "^15.8.1" -"@humanwhocodes/config-array@^0.11.11": - version "0.11.11" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" - integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" + "@humanwhocodes/object-schema" "^2.0.1" debug "^4.1.1" minimatch "^3.0.5" @@ -1336,10 +1336,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== "@hypnosphi/create-react-context@^0.3.1": version "0.3.1" @@ -1382,9 +1382,9 @@ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1463,72 +1463,72 @@ integrity sha512-izzOXQfeQLonzrIQb8u6LQ8dk+ymz3WXTIXjvOlTXHq6sbzROg3NWU+9TTAOpEoK9Bth24/6F/XrfHJ5yR5n6Q== "@types/body-parser@*": - version "1.19.3" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" - integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== + version "1.19.4" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.4.tgz#78ad68f1f79eb851aa3634db0c7f57f6f601b462" + integrity sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.11.tgz#fbaa46a1529ea5c5e46cde36e4be6a880db55b84" - integrity sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg== + version "3.5.12" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.12.tgz#49badafb988e6c433ca675a5fd769b93b7649fc8" + integrity sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg== dependencies: "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" - integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz#acf51e088b3bb6507f7b093bd2b0de20940179cc" + integrity sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.36" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" - integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== + version "3.4.37" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.37.tgz#c66a96689fd3127c8772eb3e9e5c6028ec1a9af5" + integrity sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q== dependencies: "@types/node" "*" "@types/debug@^4.0.0": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" - integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== + version "4.1.10" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.10.tgz#f23148a6eb771a34c466a4fc28379d8101e84494" + integrity sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA== dependencies: "@types/ms" "*" "@types/dom4@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/dom4/-/dom4-2.0.2.tgz#6495303f049689ce936ed328a3e5ede9c51408ee" - integrity sha512-Rt4IC1T7xkCWa0OG1oSsPa0iqnxlDeQqKXZAHrQGLb7wFGncWm85MaxKUjAGejOrUynOgWlFi4c6S6IyJwoK4g== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/dom4/-/dom4-2.0.3.tgz#bd084dbd4c15bee49442c5cd231acdcd14efbe90" + integrity sha512-xQT2XxtDGP1WFfTB/Lti629HpguNrfZ3dg84bWXASd6JUay6WgR73Wb6DG3kmr2/iGAWZ7NNLceGVWYWfgPX0g== "@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + version "3.7.6" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.6.tgz#585578b368ed170e67de8aae7b93f54a1b2fdc26" + integrity sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a" - integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== + version "8.44.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.6.tgz#60e564551966dd255f4c01c459f0b4fb87068603" + integrity sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.4.tgz#d9748f5742171b26218516cf1828b8eafaf8a9fa" + integrity sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.36" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz#baa9022119bdc05a4adfe740ffc97b5f9360e545" - integrity sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q== + version "4.17.39" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz#2107afc0a4b035e6cb00accac3bdf2d76ae408c8" + integrity sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ== dependencies: "@types/node" "*" "@types/qs" "*" @@ -1536,9 +1536,9 @@ "@types/send" "*" "@types/express@*", "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + version "4.17.20" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.20.tgz#e7c9b40276d29e38a4e3564d7a3d65911e2aa433" + integrity sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -1554,16 +1554,16 @@ "@types/node" "*" "@types/hast@^2.0.0": - version "2.3.6" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.6.tgz#bb8b05602112a26d22868acb70c4b20984ec7086" - integrity sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg== + version "2.3.7" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.7.tgz#5e9bd7ab4452d5313aeec9d38fbc193a70f8d810" + integrity sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw== dependencies: "@types/unist" "^2" "@types/hoist-non-react-statics@^3.3.0": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#dc1e9ded53375d37603c479cc12c693b0878aa2a" - integrity sha512-YIQtIg4PKr7ZyqNPZObpxfHsHEmuB8dXCxd6qVcGuQVDK2bpsF7bYNnBJ4Nn7giuACZg+WewExgrtAJ3XnA4Xw== + version "3.3.4" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.4.tgz#cc477ce0283bb9d19ea0cbfa2941fe2c8493a1be" + integrity sha512-ZchYkbieA+7tnxwX/SCBySx9WwvWR8TaP5tb2jRAzwvLb/rWchGw3v0w3pqUbUvj0GCwW2Xz/AVPSk6kUGctXQ== dependencies: "@types/react" "*" hoist-non-react-statics "^3.3.0" @@ -1574,43 +1574,43 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-errors@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" - integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.3.tgz#c54e61f79b3947d040f150abd58f71efb422ff62" + integrity sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA== "@types/http-proxy@^1.17.8": - version "1.17.12" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.12.tgz#86e849e9eeae0362548803c37a0a1afc616bd96b" - integrity sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw== + version "1.17.13" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.13.tgz#dd3a4da550580eb0557d4c7128a2ff1d1a38d465" + integrity sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw== dependencies: "@types/node" "*" "@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" - integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== + version "7.0.14" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" + integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== "@types/lodash@4.x": - version "4.14.198" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.198.tgz#4d27465257011aedc741a809f1269941fa2c5d4c" - integrity sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg== + version "4.14.200" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.200.tgz#435b6035c7eba9cdf1e039af8212c9e9281e7149" + integrity sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q== "@types/mdast@^3.0.0": - version "3.0.12" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.12.tgz#beeb511b977c875a5b0cc92eab6fcac2f0895514" - integrity sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg== + version "3.0.14" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.14.tgz#0735473a5b35be032b9f2685b7413cbab1b8a639" + integrity sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw== dependencies: "@types/unist" "^2" "@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.3.tgz#886674659ce55fe7c6c06ec5ca7c0eb276a08f91" + integrity sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ== "@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.4.tgz#a4ed836e069491414bab92c31fdea9e557aca0d9" + integrity sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw== "@types/minimatch@*": version "5.1.2" @@ -1618,63 +1618,72 @@ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimist@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.4.tgz#81f886786411c45bba3f33e781ab48bd56bfca2e" + integrity sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ== "@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + version "0.7.33" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.33.tgz#80bf1da64b15f21fd8c1dc387c31929317d99ee9" + integrity sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ== + +"@types/node-forge@^1.3.0": + version "1.3.8" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.8.tgz#044ad98354ff309a031a55a40ad122f3be1ac2bb" + integrity sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg== + dependencies: + "@types/node" "*" "@types/node@*": - version "20.6.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.2.tgz#a065925409f59657022e9063275cd0b9bd7e1b12" - integrity sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw== + version "20.8.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.10.tgz#a5448b895c753ae929c26ce85cab557c6d4a365e" + integrity sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w== + dependencies: + undici-types "~5.26.4" "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.3" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c" + integrity sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg== "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.1.tgz#27f7559836ad796cea31acb63163b203756a5b4e" + integrity sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng== "@types/prop-types@*", "@types/prop-types@^15.0.0": - version "15.7.6" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.6.tgz#bbf819813d6be21011b8f5801058498bec555572" - integrity sha512-RK/kBbYOQQHLYj9Z95eh7S6t7gq4Ojt/NT8HTk8bWVhA5DaF+5SMnxHKkP4gPNN3wAZkKP+VjAf0ebtYzf+fxg== + version "15.7.9" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.9.tgz#b6f785caa7ea1fe4414d9df42ee0ab67f23d8a6d" + integrity sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g== "@types/qs@*": - version "6.9.8" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" - integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== + version "6.9.9" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.9.tgz#66f7b26288f6799d279edf13da7ccd40d2fa9197" + integrity sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.6.tgz#7cb33992049fd7340d5b10c0098e104184dfcd2a" + integrity sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA== "@types/react-dom@*": - version "18.2.7" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" - integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== + version "18.2.14" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.14.tgz#c01ba40e5bb57fc1dc41569bb3ccdb19eab1c539" + integrity sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ== dependencies: "@types/react" "*" "@types/react-dom@^17.0.3": - version "17.0.20" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.20.tgz#e0c8901469d732b36d8473b40b679ad899da1b53" - integrity sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA== + version "17.0.22" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.22.tgz#34317e08be27b33fa9e7cdb56125b22538261bad" + integrity sha512-wHt4gkdSMb4jPp1vc30MLJxoWGsZs88URfmt3FRXoOEYrrqK3I8IuZLE/uFBb4UT6MRfI0wXFu4DS7LS0kUC7Q== dependencies: "@types/react" "^17" "@types/react-redux@^7.1.20": - version "7.1.26" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.26.tgz#84149f5614e40274bb70fcbe8f7cae6267d548b1" - integrity sha512-UKPo7Cm7rswYU6PH6CmTNCRv5NYF3HrgKuHEYTK8g/3czYLrUux50gQ2pkxc9c7ZpQZi+PNhgmI8oNIRoiVIxg== + version "7.1.28" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.28.tgz#30a44303c7daceb6ede9cfb4aaf72e64f1dde4de" + integrity sha512-EQr7cChVzVUuqbA+J8ArWK1H0hLAHKOs21SIMrskKZ3nHNeE+LFYA+IsoZGhVOT8Ktjn3M20v4rnZKN3fLbypw== dependencies: "@types/hoist-non-react-statics" "^3.3.0" "@types/react" "*" @@ -1692,32 +1701,32 @@ "@types/react-transition-group" "*" "@types/react-transition-group@*": - version "4.4.6" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e" - integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew== + version "4.4.8" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.8.tgz#46f87d80512959cac793ecc610a93d80ef241ccf" + integrity sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg== dependencies: "@types/react" "*" "@types/react-window@^1.8.2": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1" - integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw== + version "1.8.7" + resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.7.tgz#742a5e00b7aa45c9f0afc1be8c7b562a36950e8a" + integrity sha512-FpPHEhmGVOBKomuR4LD2nvua1Ajcw6PfnfbDysuCwwPae3JNulcq3+uZIpQNbDN2AI1z+Y4tKj2xQ4ELiQ4QDw== dependencies: "@types/react" "*" "@types/react@*", "@types/react@18.x": - version "18.2.22" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.22.tgz#abe778a1c95a07fa70df40a52d7300a40b949ccb" - integrity sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA== + version "18.2.34" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.34.tgz#aed20f19473721ba328feb99d1ec3307ebc1a8dd" + integrity sha512-U6eW/alrRk37FU/MS2RYMjx0Va2JGIVXELTODaTIYgvWGCV4Y4TfTUzG8DdmpDNIT0Xpj/R7GfyHOJJrDttcvg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/react@^17", "@types/react@^17.0.3": - version "17.0.65" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.65.tgz#95f6a2ab61145ffb69129d07982d047f9e0870cd" - integrity sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ== + version "17.0.69" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.69.tgz#245a0cf2f5b0fb1d645691d3083e3c7d4409b98f" + integrity sha512-klEeru//GhiQvXUBayz0Q4l3rKHWsBR/EUOhOeow6hK2jV7MlO44+8yEk6+OtPeOlRfnpUnrLXzGK+iGph5aeg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -1729,68 +1738,68 @@ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + version "0.16.5" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.5.tgz#4751153abbf8d6199babb345a52e1eb4167d64af" + integrity sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw== "@types/semver@^7.5.0": - version "7.5.2" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.2.tgz#31f6eec1ed7ec23f4f05608d3a2d381df041f564" - integrity sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw== + version "7.5.4" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.4.tgz#0a41252ad431c473158b22f9bfb9a63df7541cff" + integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ== "@types/send@*": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + version "0.17.3" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.3.tgz#81b2ea5a3a18aad357405af2d643ccbe5a09020b" + integrity sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + version "1.9.3" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.3.tgz#af9403916eb6fbf7d6ec6f47b2a4c46eb3222cc9" + integrity sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.2" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" - integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + version "1.15.4" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.4.tgz#44b5895a68ca637f06c229119e1c774ca88f81b2" + integrity sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw== dependencies: "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" "@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + version "0.3.35" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.35.tgz#f4a568c73d2a8071944bd6ffdca0d4e66810cd21" + integrity sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw== dependencies: "@types/node" "*" "@types/unist@^2", "@types/unist@^2.0.0": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" - integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== + version "2.0.9" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.9.tgz#72e164381659a49557b0a078b28308f2c6a3e1ce" + integrity sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ== "@types/ws@^8.5.5": - version "8.5.5" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" - integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== + version "8.5.8" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.8.tgz#13efec7bd439d0bdf2af93030804a94f163b1430" + integrity sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg== dependencies: "@types/node" "*" "@typescript-eslint/eslint-plugin@^6.1": - version "6.7.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz#f18cc75c9cceac8080a9dc2e7d166008c5207b9f" - integrity sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q== + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz#d8ce497dc0ed42066e195c8ecc40d45c7b1254f4" + integrity sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.7.2" - "@typescript-eslint/type-utils" "6.7.2" - "@typescript-eslint/utils" "6.7.2" - "@typescript-eslint/visitor-keys" "6.7.2" + "@typescript-eslint/scope-manager" "6.9.1" + "@typescript-eslint/type-utils" "6.9.1" + "@typescript-eslint/utils" "6.9.1" + "@typescript-eslint/visitor-keys" "6.9.1" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -1799,73 +1808,78 @@ ts-api-utils "^1.0.1" "@typescript-eslint/parser@^6.1": - version "6.7.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.7.2.tgz#e0ae93771441b9518e67d0660c79e3a105497af4" - integrity sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw== - dependencies: - "@typescript-eslint/scope-manager" "6.7.2" - "@typescript-eslint/types" "6.7.2" - "@typescript-eslint/typescript-estree" "6.7.2" - "@typescript-eslint/visitor-keys" "6.7.2" + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.9.1.tgz#4f685f672f8b9580beb38d5fb99d52fc3e34f7a3" + integrity sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg== + dependencies: + "@typescript-eslint/scope-manager" "6.9.1" + "@typescript-eslint/types" "6.9.1" + "@typescript-eslint/typescript-estree" "6.9.1" + "@typescript-eslint/visitor-keys" "6.9.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@6.7.2": - version "6.7.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz#cf59a2095d2f894770c94be489648ad1c78dc689" - integrity sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw== +"@typescript-eslint/scope-manager@6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz#e96afeb9a68ad1cd816dba233351f61e13956b75" + integrity sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg== dependencies: - "@typescript-eslint/types" "6.7.2" - "@typescript-eslint/visitor-keys" "6.7.2" + "@typescript-eslint/types" "6.9.1" + "@typescript-eslint/visitor-keys" "6.9.1" -"@typescript-eslint/type-utils@6.7.2": - version "6.7.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz#ed921c9db87d72fa2939fee242d700561454f367" - integrity sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ== +"@typescript-eslint/type-utils@6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz#efd5db20ed35a74d3c7d8fba51b830ecba09ce32" + integrity sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg== dependencies: - "@typescript-eslint/typescript-estree" "6.7.2" - "@typescript-eslint/utils" "6.7.2" + "@typescript-eslint/typescript-estree" "6.9.1" + "@typescript-eslint/utils" "6.9.1" debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/types@6.7.2": - version "6.7.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.7.2.tgz#75a615a6dbeca09cafd102fe7f465da1d8a3c066" - integrity sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg== +"@typescript-eslint/types@6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.9.1.tgz#a6cfc20db0fcedcb2f397ea728ef583e0ee72459" + integrity sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ== -"@typescript-eslint/typescript-estree@6.7.2": - version "6.7.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz#ce5883c23b581a5caf878af641e49dd0349238c7" - integrity sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ== +"@typescript-eslint/typescript-estree@6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz#8c77910a49a04f0607ba94d78772da07dab275ad" + integrity sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw== dependencies: - "@typescript-eslint/types" "6.7.2" - "@typescript-eslint/visitor-keys" "6.7.2" + "@typescript-eslint/types" "6.9.1" + "@typescript-eslint/visitor-keys" "6.9.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@6.7.2": - version "6.7.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.7.2.tgz#b9ef0da6f04932167a9222cb4ac59cb187165ebf" - integrity sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ== +"@typescript-eslint/utils@6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.9.1.tgz#763da41281ef0d16974517b5f0d02d85897a1c1e" + integrity sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.7.2" - "@typescript-eslint/types" "6.7.2" - "@typescript-eslint/typescript-estree" "6.7.2" + "@typescript-eslint/scope-manager" "6.9.1" + "@typescript-eslint/types" "6.9.1" + "@typescript-eslint/typescript-estree" "6.9.1" semver "^7.5.4" -"@typescript-eslint/visitor-keys@6.7.2": - version "6.7.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz#4cb2bd786f1f459731b0ad1584c9f73e1c7a4d5c" - integrity sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ== +"@typescript-eslint/visitor-keys@6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz#6753a9225a0ba00459b15d6456b9c2780b66707d" + integrity sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw== dependencies: - "@typescript-eslint/types" "6.7.2" + "@typescript-eslint/types" "6.9.1" eslint-visitor-keys "^3.4.1" +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" @@ -2089,14 +2103,14 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" + integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== airbnb-prop-types@^2.14.0, airbnb-prop-types@^2.15.0, airbnb-prop-types@^2.16.0: version "2.16.0" @@ -2329,13 +2343,13 @@ attr-accept@^2.0.0: integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== autoprefixer@~10.4.14: - version "10.4.15" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.15.tgz#a1230f4aeb3636b89120b34a1f513e2f6834d530" - integrity sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew== + version "10.4.16" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" + integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== dependencies: browserslist "^4.21.10" - caniuse-lite "^1.0.30001520" - fraction.js "^4.2.0" + caniuse-lite "^1.0.30001538" + fraction.js "^4.3.6" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" @@ -2362,29 +2376,29 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-polyfill-corejs2@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" - integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== +babel-plugin-polyfill-corejs2@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" + integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.4.3" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" - integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== +babel-plugin-polyfill-corejs3@^0.8.5: + version "0.8.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz#25c2d20002da91fe328ff89095c85a391d6856cf" + integrity sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" - core-js-compat "^3.31.0" + "@babel/helper-define-polyfill-provider" "^0.4.3" + core-js-compat "^3.33.1" -babel-plugin-polyfill-regenerator@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" - integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== +babel-plugin-polyfill-regenerator@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" + integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.4.3" babel-plugin-transform-imports@~2.0.0: version "2.0.0" @@ -2489,15 +2503,15 @@ brcast@^2.0.2: resolved "https://registry.yarnpkg.com/brcast/-/brcast-2.0.2.tgz#2db16de44140e418dc37fab10beec0369e78dcef" integrity sha512-Tfn5JSE7hrUlFcOoaLzVvkbgIemIorMIyoMr3TgvszWW7jFt2C9PdeMLtysYD9RU0MmU17b69+XJG1eRY2OBRg== -browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== +browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.9, browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" node-releases "^2.0.13" - update-browserslist-db "^1.0.11" + update-browserslist-db "^1.0.13" buffer-from@^1.0.0: version "1.1.2" @@ -2514,13 +2528,14 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" callsites@^3.0.0: version "3.1.0" @@ -2550,10 +2565,10 @@ camelcase@^6.3.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520: - version "1.0.30001535" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001535.tgz#908a5b7ef11172f51f0b88f3d850aef1c6a3cf7b" - integrity sha512-48jLyUkiWFfhm/afF7cQPqPjaUmSraEhK4j+FCTJpgnGGEZHqyLe3hmWH7lIooZdSzXL0ReMvHz0vKDoTBsrwg== +caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: + version "1.0.30001559" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz#95a982440d3d314c471db68d02664fb7536c5a30" + integrity sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA== capital-case@^1.0.4: version "1.0.4" @@ -2835,11 +2850,16 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.5.0, convert-source-map@^1.7.0: +convert-source-map@^1.5.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -2862,17 +2882,17 @@ copy-webpack-plugin@~11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.31.0: - version "3.32.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.2.tgz#8047d1a8b3ac4e639f0d4f66d4431aa3b16e004c" - integrity sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ== +core-js-compat@^3.31.0, core-js-compat@^3.33.1: + version "3.33.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.2.tgz#3ea4563bfd015ad4e4b52442865b02c62aba5085" + integrity sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw== dependencies: - browserslist "^4.21.10" + browserslist "^4.22.1" core-js@^3.0: - version "3.32.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.2.tgz#172fb5949ef468f93b4be7841af6ab1f21992db7" - integrity sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ== + version "3.33.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.2.tgz#312bbf6996a3a517c04c99b9909cdd27138d1ceb" + integrity sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ== core-util-is@~1.0.0: version "1.0.3" @@ -2916,10 +2936,10 @@ css-box-model@^1.2.0: dependencies: tiny-invariant "^1.0.6" -css-functions-list@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.0.tgz#8290b7d064bf483f48d6559c10e98dc4d1ad19ee" - integrity sha512-d/jBMPyYybkkLVypgtGv12R+pIFw4/f/IHtCTxWpZc8ofTYOPigIgmA6vu5rMHartZC+WuXhBUHfnyNUIQSYrg== +css-functions-list@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.1.tgz#2eb205d8ce9f9ce74c5c1d7490b66b77c45ce3ea" + integrity sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ== css-loader@~6.8.1: version "6.8.1" @@ -3042,10 +3062,10 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" -define-data-property@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" - integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: get-intrinsic "^1.2.1" gopd "^1.0.1" @@ -3195,9 +3215,9 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: domelementtype "^2.2.0" dompurify@~3.0.1: - version "3.0.5" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.5.tgz#eb3d9cfa10037b6e73f32c586682c4b2ab01fbed" - integrity sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A== + version "3.0.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.6.tgz#925ebd576d54a9531b5d76f0a5bef32548351dae" + integrity sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w== domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" @@ -3236,10 +3256,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.477: - version "1.4.523" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.523.tgz#f82f99243c827df05c26776d49712cb284972df6" - integrity sha512-9AreocSUWnzNtvLcbpng6N+GkXnCcBR80IQkxRC9Dfdyg4gaWNUPBujAHUpKkiUkoSoR9UlhA4zD/IgBklmhzg== +electron-to-chromium@^1.4.535: + version "1.4.575" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.575.tgz#7c0b87eb2c6214a993699792abd704de41255c39" + integrity sha512-kY2BGyvgAHiX899oF6xLXSIf99bAvvdPhDoJwG77nxCSyWYuRH6e9a9a3gpXBvCs6lj4dQZJkfnW2hdKWHEISg== emoji-regex@^8.0.0: version "8.0.0" @@ -3275,9 +3295,9 @@ entities@^2.0.0: integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== envinfo@^7.7.3: - version "7.10.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" - integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + version "7.11.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.0.tgz#c3793f44284a55ff8c82faf1ffd91bc6478ea01f" + integrity sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg== enzyme-shallow-equal@^1.0.0: version "1.0.5" @@ -3295,25 +3315,25 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.22.1: - version "1.22.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" - integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== dependencies: array-buffer-byte-length "^1.0.0" arraybuffer.prototype.slice "^1.0.2" available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + call-bind "^1.0.5" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" function.prototype.name "^1.1.6" - get-intrinsic "^1.2.1" + get-intrinsic "^1.2.2" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" has-property-descriptors "^1.0.0" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" internal-slot "^1.0.5" is-array-buffer "^3.0.2" is-callable "^1.2.7" @@ -3323,7 +3343,7 @@ es-abstract@^1.22.1: is-string "^1.0.7" is-typed-array "^1.1.12" is-weakref "^1.0.2" - object-inspect "^1.12.3" + object-inspect "^1.13.1" object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.5.1" @@ -3337,7 +3357,7 @@ es-abstract@^1.22.1: typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.11" + which-typed-array "^1.1.13" es-iterator-helpers@^1.0.12: version "1.0.15" @@ -3365,20 +3385,20 @@ es-module-lexer@^1.2.1: integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" + get-intrinsic "^1.2.2" has-tostringtag "^1.0.0" + hasown "^2.0.0" es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: - has "^1.0.3" + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -3486,17 +3506,18 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@8.x, eslint@^8.45: - version "8.49.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.49.0.tgz#09d80a89bdb4edee2efcf6964623af1054bf6d42" - integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ== + version "8.52.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.52.0.tgz#d0cd4a1fac06427a61ef9242b9353f36ea7062fc" + integrity sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.49.0" - "@humanwhocodes/config-array" "^0.11.11" + "@eslint/js" "8.52.0" + "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -3715,6 +3736,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-entry-cache@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-7.0.1.tgz#c71b3509badb040f362255a53e21f15a4e74fc0f" + integrity sha512-uLfFktPmRetVCbHe5UPuekWrQ6hENufnA46qEGbfACkK5drjTTdQYUragRgMjHldcbYG+nslUerqMPjbBSHXjQ== + dependencies: + flat-cache "^3.1.1" + file-loader@~6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" @@ -3792,24 +3820,29 @@ find-up@^6.3.0: locate-path "^7.1.0" path-exists "^5.0.0" -flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== +flat-cache@^3.0.4, flat-cache@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== dependencies: - flatted "^3.2.7" + flatted "^3.2.9" keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.2.7: +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: version "3.2.9" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== follow-redirects@^1.0.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== for-each@^0.3.3: version "0.3.3" @@ -3823,10 +3856,10 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.2.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" - integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== +fraction.js@^4.3.6: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fresh@0.5.2: version "0.5.2" @@ -3834,9 +3867,9 @@ fresh@0.5.2: integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-monkey@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" - integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs.realpath@^1.0.0: version "1.0.0" @@ -3848,10 +3881,10 @@ fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.2, function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" @@ -3873,15 +3906,15 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" @@ -3967,9 +4000,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.21.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== dependencies: type-fest "^0.20.2" @@ -4081,11 +4114,11 @@ has-flag@^4.0.0: integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== dependencies: - get-intrinsic "^1.1.1" + get-intrinsic "^1.2.2" has-proto@^1.0.1: version "1.0.1" @@ -4105,11 +4138,16 @@ has-tostringtag@^1.0.0: has-symbols "^1.0.2" has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== dependencies: - function-bind "^1.1.1" + function-bind "^1.1.2" hast-util-whitespace@^2.0.0: version "2.0.1" @@ -4364,12 +4402,12 @@ inter-ui@~3.19.3: integrity sha512-5FG9fjuYOXocIfjzcCBhICL5cpvwEetseL3FU6tP3d6Bn7g8wODhB+I9RNGRTizCT7CUG4GOK54OPxqq3msQgg== internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" + get-intrinsic "^1.2.2" + hasown "^2.0.0" side-channel "^1.0.4" interpret@^3.1.1: @@ -4448,12 +4486,12 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.1.0, is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.9.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== +is-core-module@^2.1.0, is-core-module@^2.13.0, is-core-module@^2.5.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - has "^1.0.3" + hasown "^2.0.0" is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" @@ -4726,9 +4764,9 @@ jest-worker@^27.4.5: supports-color "^8.0.0" jiti@^1.18.2: - version "1.20.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" - integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== jju@~1.4.0: version "1.4.0" @@ -4803,9 +4841,9 @@ json5@^2.1.2, json5@^2.2.3: object.values "^1.1.6" keyv@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -4824,13 +4862,18 @@ known-css-properties@^0.28.0: resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.28.0.tgz#8a8be010f368b3036fe6ab0ef4bbbed972bd6274" integrity sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ== +known-css-properties@^0.29.0: + version "0.29.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.29.0.tgz#e8ba024fb03886f23cb882e806929f32d814158f" + integrity sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ== + launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: picocolors "^1.0.0" - shell-quote "^1.7.3" + shell-quote "^1.8.1" levn@^0.4.1: version "0.4.1" @@ -5433,9 +5476,9 @@ minipass@^4.2.4: integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" - integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== mobx-react-lite@~3.4.3: version "3.4.3" @@ -5581,10 +5624,10 @@ object-assign@^4.0.1, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1, object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-is@^1.0.1, object-is@^1.1.2, object-is@^1.1.5: version "1.1.5" @@ -5997,10 +6040,10 @@ postcss-safe-parser@^6.0.0: resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== -postcss-scss@^4.0.7: - version "4.0.8" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.8.tgz#12a4991a902a782d4e9b86b1f217d5181c6c4f32" - integrity sha512-Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA== +postcss-scss@^4.0.9: + version "4.0.9" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685" + integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== postcss-selector-parser@^6.0.13, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.0.13" @@ -6015,10 +6058,10 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.x, postcss@^8.4.21, postcss@^8.4.27, postcss@~8.4.21: - version "8.4.29" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" - integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== +postcss@8.x, postcss@^8.4.21, postcss@^8.4.28, postcss@~8.4.21: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -6071,9 +6114,9 @@ prop-types@15.x, prop-types@^15.0.0, prop-types@^15.5.8, prop-types@^15.6.0, pro react-is "^16.13.1" property-information@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" - integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== + version "6.4.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" + integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== proxy-addr@~2.0.7: version "2.0.7" @@ -6084,9 +6127,9 @@ proxy-addr@~2.0.7: ipaddr.js "1.9.1" punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@6.11.0: version "6.11.0" @@ -6196,9 +6239,9 @@ react-dom@^18.2.0: scheduler "^0.23.0" react-draggable@^4.0.3, react-draggable@^4.4.5: - version "4.4.5" - resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.5.tgz#9e37fe7ce1a4cf843030f521a0a4cc41886d7e7c" - integrity sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g== + version "4.4.6" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.6.tgz#63343ee945770881ca1256a5b6fa5c9f5983fe1e" + integrity sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw== dependencies: clsx "^1.1.1" prop-types "^15.8.1" @@ -6218,9 +6261,9 @@ react-fast-compare@^3.0.1: integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== react-grid-layout@^1.3.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/react-grid-layout/-/react-grid-layout-1.4.1.tgz#656fcc07b1f2f57035d28bec251e8b9813b10d52" - integrity sha512-5cZAtZE6ahVhgCRex4wvL1ey9+UOHYAPKkxqGMy1p5jGQ5zaiPYKebvpmYJHQSJA2x/89aexza/PRY4c3iqHpA== + version "1.4.2" + resolved "https://registry.yarnpkg.com/react-grid-layout/-/react-grid-layout-1.4.2.tgz#ab3577455f519ae331405c6353cf222721c6a6b3" + integrity sha512-LLOZogtw5XNHbdCquKQRG/Dspjyfelk+kE9DKRbLUl3UArFRQu/IiH+aPcjh+wSkSHUjf+Rv32ueEYigbGzRLQ== dependencies: clsx "^2.0.0" fast-equals "^4.0.3" @@ -6654,20 +6697,20 @@ resolve-from@^5.0.0: integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0: - version "1.22.6" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" - integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -6856,10 +6899,11 @@ select-hose@^2.0.0: integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: + "@types/node-forge" "^1.3.0" node-forge "^1" semver@^6.3.1: @@ -6932,6 +6976,16 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + set-function-name@^2.0.0, set-function-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" @@ -6970,7 +7024,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3: +shell-quote@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== @@ -7097,9 +7151,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== spdy-transport@^3.0.0: version "3.0.0" @@ -7270,20 +7324,20 @@ style-search@^0.1.0: integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== style-to-object@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.2.tgz#a8247057111dea8bd3b8a1a66d2d0c9cf9218a54" - integrity sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA== + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== dependencies: inline-style-parser "0.1.1" -stylelint-config-recommended-scss@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-13.0.0.tgz#dd8c319e15a6412262cd8554e4aad9bfba1bbb11" - integrity sha512-7AmMIsHTsuwUQm7I+DD5BGeIgCvqYZ4BpeYJJpb1cUXQwrJAKjA+GBotFZgUEGP8lAM+wmd91ovzOi8xfAyWEw== +stylelint-config-recommended-scss@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-13.1.0.tgz#04e529ae0e9c1abb1e04de79258461c07811876f" + integrity sha512-8L5nDfd+YH6AOoBGKmhH8pLWF1dpfY816JtGMePcBqqSsLU+Ysawx44fQSlMOJ2xTfI9yTGpup5JU77c17w1Ww== dependencies: - postcss-scss "^4.0.7" + postcss-scss "^4.0.9" stylelint-config-recommended "^13.0.0" - stylelint-scss "^5.1.0" + stylelint-scss "^5.3.0" stylelint-config-recommended@^13.0.0: version "13.0.0" @@ -7291,11 +7345,11 @@ stylelint-config-recommended@^13.0.0: integrity sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ== stylelint-config-standard-scss@11.x: - version "11.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-11.0.0.tgz#98332b68a9c98b6fce54c7698741e103719942b5" - integrity sha512-fGE79NBOLg09a9afqGH/guJulRULCaQWWv4cv1v2bMX92B+fGb0y56WqIguwvFcliPmmUXiAhKrrnXilIeXoHA== + version "11.1.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-11.1.0.tgz#53c2fb9423ed89c0921aa83479892a912cc1ca15" + integrity sha512-5gnBgeNTgRVdchMwiFQPuBOtj9QefYtfXiddrOMJA2pI22zxt6ddI2s+e5Oh7/6QYl7QLJujGnaUR5YyGq72ow== dependencies: - stylelint-config-recommended-scss "^13.0.0" + stylelint-config-recommended-scss "^13.1.0" stylelint-config-standard "^34.0.0" stylelint-config-standard@^34.0.0: @@ -7305,10 +7359,10 @@ stylelint-config-standard@^34.0.0: dependencies: stylelint-config-recommended "^13.0.0" -stylelint-scss@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-5.2.1.tgz#810299e4141fa38852bd14536a90e4942c8f387f" - integrity sha512-ZoTJUM85/qqpQHfEppjW/St//8s6p9Qsg8deWlYlr56F9iUgC9vXeIDQvH4odkRRJLTLFQzYMALSOFCQ3MDkgw== +stylelint-scss@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-5.3.0.tgz#32fd2681f8934e87dfa90f5188646d07f08c59c9" + integrity sha512-Sc7S1uWqStMc99NREsHNxpxHHFRvjo2pWILNl/UCwWO8PxhODK8qbJH0GHWIALxl6BD5rwJL4cSm4jk36hi6fg== dependencies: known-css-properties "^0.28.0" postcss-media-query-parser "^0.2.3" @@ -7317,9 +7371,9 @@ stylelint-scss@^5.1.0: postcss-value-parser "^4.2.0" stylelint@15.x: - version "15.10.3" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-15.10.3.tgz#995e4512fdad450fb83e13f3472001f6edb6469c" - integrity sha512-aBQMMxYvFzJJwkmg+BUUg3YfPyeuCuKo2f+LOw7yYbU8AZMblibwzp9OV4srHVeQldxvSFdz0/Xu8blq2AesiA== + version "15.11.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-15.11.0.tgz#3ff8466f5f5c47362bc7c8c9d382741c58bc3292" + integrity sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw== dependencies: "@csstools/css-parser-algorithms" "^2.3.1" "@csstools/css-tokenizer" "^2.2.0" @@ -7328,12 +7382,12 @@ stylelint@15.x: balanced-match "^2.0.0" colord "^2.9.3" cosmiconfig "^8.2.0" - css-functions-list "^3.2.0" + css-functions-list "^3.2.1" css-tree "^2.3.1" debug "^4.3.4" fast-glob "^3.3.1" fastest-levenshtein "^1.0.16" - file-entry-cache "^6.0.1" + file-entry-cache "^7.0.0" global-modules "^2.0.0" globby "^11.1.0" globjoin "^0.1.4" @@ -7342,13 +7396,13 @@ stylelint@15.x: import-lazy "^4.0.0" imurmurhash "^0.1.4" is-plain-object "^5.0.0" - known-css-properties "^0.28.0" + known-css-properties "^0.29.0" mathml-tag-names "^2.1.3" meow "^10.1.5" micromatch "^4.0.5" normalize-path "^3.0.0" picocolors "^1.0.0" - postcss "^8.4.27" + postcss "^8.4.28" postcss-resolve-nested-selector "^0.1.1" postcss-safe-parser "^6.0.0" postcss-selector-parser "^6.0.13" @@ -7439,9 +7493,9 @@ terser-webpack-plugin@^5.3.7, terser-webpack-plugin@~5.3.7: terser "^5.16.8" terser@^5.10.0, terser@^5.16.8: - version "5.19.4" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.4.tgz#941426fa482bf9b40a0308ab2b3cd0cf7c775ebd" - integrity sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g== + version "5.24.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.24.0.tgz#4ae50302977bca4831ccc7b4fef63a3c04228364" + integrity sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -7523,9 +7577,9 @@ type-check@^0.4.0, type-check@~0.4.0: prelude-ls "^1.2.1" type-fest@4.x: - version "4.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.3.1.tgz#5cb58cdab5120f7ab0b40cfdc35073fb9adb651d" - integrity sha512-pphNW/msgOUSkJbH58x8sqpq8uQj6b0ZKGxEsLKMUnGorRcDjrUaLS+39+/ub41JNTwrrMyJcUB8+YZs3mbwqw== + version "4.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.6.0.tgz#9c575f7e20530defef4f9cdc5e2c85d6e4ea0fc9" + integrity sha512-rLjWJzQFOq4xw7MgJrCZ6T1jIOvvYElXT12r+y0CC6u67hegDHaxcPqb2fZHOGlqxugGQPNB1EnTezjBetkwkw== type-fest@^0.20.2: version "0.20.2" @@ -7600,9 +7654,9 @@ typescript@~5.1.6: integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== ua-parser-js@~1.0.2: - version "1.0.36" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.36.tgz#a9ab6b9bd3a8efb90bb0816674b412717b7c428c" - integrity sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw== + version "1.0.37" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" + integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== unbox-primitive@^1.0.2: version "1.0.2" @@ -7614,6 +7668,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -7698,10 +7757,10 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -7914,11 +7973,12 @@ webpack-dev-server@~4.15.0: ws "^8.13.0" webpack-merge@^5.7.3: - version "5.9.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" - integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" + flat "^5.0.2" wildcard "^2.0.0" webpack-sources@^3.2.3: @@ -8019,13 +8079,13 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" -which-typed-array@^1.1.11, which-typed-array@^1.1.9: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== +which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== dependencies: available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + call-bind "^1.0.4" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" @@ -8077,9 +8137,9 @@ ws@^7.3.1: integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.13.0: - version "8.14.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.1.tgz#4b9586b4f70f9e6534c7bb1d3dc0baa8b8cf01e0" - integrity sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A== + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== yallist@^3.0.2: version "3.1.1" From 00d39189fdd30f2f9100750e1422aaed08512e92 Mon Sep 17 00:00:00 2001 From: Colin Rudd Date: Fri, 3 Nov 2023 14:32:34 -0400 Subject: [PATCH 4/6] TS Fix: allow "string | number", not just "number" on StoreFilterField width prop, since underlying TextInput in desktop and mobile takes "string | number" for width. (#3520) --- cmp/store/StoreFilterField.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmp/store/StoreFilterField.ts b/cmp/store/StoreFilterField.ts index b8f1d1a88e..293b565dc2 100644 --- a/cmp/store/StoreFilterField.ts +++ b/cmp/store/StoreFilterField.ts @@ -75,8 +75,8 @@ export interface StoreFilterFieldProps extends DefaultHoistProps { */ store?: Store; - /** Width of the input in pixels. */ - width?: number; + /** Width of the input in pixels or string with unit. */ + width?: string | number; } /** From c59c43bff722c37ccb5f9f36c9e162d8e6802f0a Mon Sep 17 00:00:00 2001 From: TomTirapani Date: Mon, 6 Nov 2023 10:48:49 +0000 Subject: [PATCH 5/6] Cleanup CHANGELOG whitespace --- CHANGELOG.md | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5911e36b5b..c6656a4ea4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,23 +5,22 @@ ### 🎁 New Features * Built-in Hoist support for automated testing: - * Core Hoist components now support the `TestSupportProps` interface and accordingly take an - optional `testId` prop. If supplied by application, this prop will be rendered in - the DOM using the `data-testid` property and available for testing tools that are running - the application. - * When given a `testId`, certain composite components (e.g.`TabContainer`, `Form`,`GroupingChooser` - etc.) will create and render additional "sub-testIds" on its critical subcomponents. For example, - a `TabContainer` will create testIds for its switcher buttons, and a `Form` will create ids on - its contained `FormField`s and `HoistInput`s. - * This release represents the critical first step in our ongoing work to facilitate automated + * Core Hoist components now support the `TestSupportProps` interface and accordingly take an + optional `testId` prop. If supplied by application, this prop will be rendered in + the DOM using the `data-testid` property and available for testing tools that are running + the application. + * When given a `testId`, certain composite components (e.g.`TabContainer`, `Form`,`GroupingChooser` + etc.) will create and render additional "sub-testIds" on its critical subcomponents. For example, + a `TabContainer` will create testIds for its switcher buttons, and a `Form` will create ids on + its contained `FormField`s and `HoistInput`s. + * This release represents the critical first step in our ongoing work to facilitate automated end-to-end testing of Hoist applications. Additional hoist-specific utilities for writing tests in libraries such as cypress and playwright are coming soon. - - * Added `Column.sortToBottom` which supports always sorting specified values to the bottom, +* Added `Column.sortToBottom` which supports always sorting specified values to the bottom, regardless of sort direction. - * Clicking on the right hand clear button in a `textInput` (desktop and mobile) - now maintains focus on the `textInput`, allowing a user to quickly type something else into - the field. This behaviour already existed on the `select` input. +* Clicking on the right hand clear button in a `textInput` (desktop and mobile) + now maintains focus on the `textInput`, allowing a user to quickly type something else into + the field. This behaviour already existed on the `select` input. * Added `ZoneGrid`, a specialized version of the Grid component that displays its data with multi-line full-width rows. Each row is broken into four zones for top/bottom and left/right, each of which can mapped to render one or more fields. From c4a1eb24e8bfcfbb8e11bf976baf49d714c73051 Mon Sep 17 00:00:00 2001 From: Tom Tirapani Date: Mon, 6 Nov 2023 17:03:17 +0000 Subject: [PATCH 6/6] Prevent 'mousedown' events within Select from closing Popovers. (#3519) * Prvent 'mousedown' events within Select from closing Popovers. #3516 * Added CHANGELOG entry --- CHANGELOG.md | 6 ++++++ desktop/cmp/button/ZoneMapperButton.ts | 16 ++++------------ desktop/cmp/grouping/GroupingChooser.ts | 23 +++-------------------- desktop/cmp/input/Select.ts | 11 ++++++++++- utils/js/DomUtils.ts | 10 ++++++++++ 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6656a4ea4..3aab02e9d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,12 @@ multi-line full-width rows. Each row is broken into four zones for top/bottom and left/right, each of which can mapped to render one or more fields. +### 🐞 Bug Fixes + +* Fixed bug where interacting with a `Select` within a `Popover` can inadvertently cause the + popover to close. If your app already has special handling in place to prevent this, you should + be able to unwind it after upgrading. + ### 💥 Breaking Changes * The `XH.getActiveModels` method has been renamed to `XH.getModels` for clarity and consistency. diff --git a/desktop/cmp/button/ZoneMapperButton.ts b/desktop/cmp/button/ZoneMapperButton.ts index c3d4833fd4..d78df039f4 100644 --- a/desktop/cmp/button/ZoneMapperButton.ts +++ b/desktop/cmp/button/ZoneMapperButton.ts @@ -13,7 +13,6 @@ import {zoneMapper} from '@xh/hoist/desktop/cmp/zoneGrid/impl/ZoneMapper'; import {Icon} from '@xh/hoist/icon'; import {popover, Position} from '@xh/hoist/kit/blueprint'; import {stopPropagation, withDefault} from '@xh/hoist/utils/js'; -import {MENU_PORTAL_ID} from '@xh/hoist/desktop/cmp/input'; import {button, ButtonProps} from './Button'; export interface ZoneMapperButtonProps extends ButtonProps { @@ -71,18 +70,11 @@ export const [ZoneMapperButton, zoneMapperButton] = hoistCmp.withFactory { - if (isOpen && !willOpen) { - // Prevent clicks with Select controls from closing popover - const selectPortal = document.getElementById(MENU_PORTAL_ID), - selectPortalClick = selectPortal?.contains(e?.target), - selectValueClick = e?.target?.classList.contains('xh-select__single-value'); - - if (!selectPortalClick && !selectValueClick) { - mapperModel.close(); - } - } else if (!isOpen && willOpen) { + onInteraction: (nextOpenState, e) => { + if (nextOpenState) { mapperModel.openPopover(); + } else { + mapperModel.close(); } } }); diff --git a/desktop/cmp/grouping/GroupingChooser.ts b/desktop/cmp/grouping/GroupingChooser.ts index ce41c010b5..16ee5789bd 100644 --- a/desktop/cmp/grouping/GroupingChooser.ts +++ b/desktop/cmp/grouping/GroupingChooser.ts @@ -8,13 +8,13 @@ import {GroupingChooserModel} from '@xh/hoist/cmp/grouping'; import {box, div, filler, fragment, hbox, vbox} from '@xh/hoist/cmp/layout'; import {hoistCmp, uses} from '@xh/hoist/core'; import {button, ButtonProps} from '@xh/hoist/desktop/cmp/button'; -import {MENU_PORTAL_ID, select} from '@xh/hoist/desktop/cmp/input'; +import {select} from '@xh/hoist/desktop/cmp/input'; import {panel} from '@xh/hoist/desktop/cmp/panel'; import '@xh/hoist/desktop/register'; import {Icon} from '@xh/hoist/icon'; import {menu, menuDivider, menuItem, popover} from '@xh/hoist/kit/blueprint'; import {dragDropContext, draggable, droppable} from '@xh/hoist/kit/react-beautiful-dnd'; -import {getTestId, TEST_ID} from '@xh/hoist/utils/js'; +import {elemWithin, getTestId, TEST_ID} from '@xh/hoist/utils/js'; import {splitLayoutProps} from '@xh/hoist/utils/react'; import classNames from 'classnames'; import {compact, isEmpty, sortBy} from 'lodash'; @@ -117,7 +117,7 @@ export const [GroupingChooser, groupingChooser] = hoistCmp.withFactory(({model, className, ...props}, re e.stopPropagation(); } }, + onMouseDown: e => { + // Some internal elements, like the dropdown indicator and the rendered single value, + // fire 'mousedown' events. These can bubble and inadvertently close Popovers that + // contain Selects. + const target = e?.target as HTMLElement; + if (target && elemWithin(target, 'bp4-popover')) { + e.stopPropagation(); + } + }, testId: props.testId, ...layoutProps, width: withDefault(width, 200), diff --git a/utils/js/DomUtils.ts b/utils/js/DomUtils.ts index e8edb6d1f1..33cbaa139a 100644 --- a/utils/js/DomUtils.ts +++ b/utils/js/DomUtils.ts @@ -91,6 +91,16 @@ export function observeVisibleChange(fn: (visible: boolean) => any, node: Elemen return ret; } +/** + * Determines whether an element has an ancestor with a specific class name + */ +export function elemWithin(target: HTMLElement, className: string): boolean { + for (let elem = target; elem; elem = elem.parentElement) { + if (elem.classList.contains(className)) return true; + } + return false; +} + /** * A convenience handler that will call 'stopPropagation' * and 'preventDefault' on an event.