diff --git a/src/components/Dropdown/index.tsx b/src/components/Dropdown/index.tsx index 8c9cdaa57..0376eeccb 100644 --- a/src/components/Dropdown/index.tsx +++ b/src/components/Dropdown/index.tsx @@ -22,6 +22,7 @@ export interface DropdownProps { variant?: string; meta?: string; maxHeight?: string; + keepOpen?: boolean; } const KEYCODE_ESCAPE = 27; @@ -36,6 +37,7 @@ const Dropdown: React.FC = ({ variant, meta, maxHeight = '80vh', + keepOpen, }: DropdownProps): JSX.Element => { const [isOpen, setIsOpen] = useState(false); const containerRef = useRef(null); @@ -123,7 +125,9 @@ const Dropdown: React.FC = ({ {item} diff --git a/src/modules/Preservation/http/PreservationApiClient.ts b/src/modules/Preservation/http/PreservationApiClient.ts index 6c668fc06..6bfad265d 100644 --- a/src/modules/Preservation/http/PreservationApiClient.ts +++ b/src/modules/Preservation/http/PreservationApiClient.ts @@ -166,8 +166,8 @@ interface TagListFilter { journeyIds: string[]; modeIds: string[]; dueFilters: string[]; - preservationStatus: string | null; - actionStatus: string | null; + preservationStatus: string[]; + actionStatus: string[]; } interface SavedScopeFilterResponse { @@ -413,6 +413,7 @@ interface RequirementTypeFilterResponse { interface TagFunctionFilterResponse { code: string; + description: string; } interface TagFunctionResponse { diff --git a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/CheckboxFilter.style.ts b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/CheckboxFilter.style.ts index 6c3a18295..b10399ca5 100644 --- a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/CheckboxFilter.style.ts +++ b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/CheckboxFilter.style.ts @@ -1,5 +1,18 @@ +import { Checkbox } from '@equinor/eds-core-react'; import styled from 'styled-components'; export const ExpandedContainer = styled.div` padding-left: calc(var(--grid-unit) * 2); `; + +export const ScopeFilterCheckbox = styled(Checkbox).withConfig({ + displayName: 'scope-filter-item-', +})` + display: flex; + height: 40px; + & > span:last-child { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } +`; diff --git a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/CheckboxFilter.tsx b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/CheckboxFilter.tsx index 2b48f0afb..57f2b30cc 100644 --- a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/CheckboxFilter.tsx +++ b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/CheckboxFilter.tsx @@ -1,11 +1,9 @@ -import React, { useState } from 'react'; -import { Collapse, CollapseInfo } from './ScopeFilter.style'; -import { ExpandedContainer } from './CheckboxFilter.style'; -import { Typography } from '@equinor/eds-core-react'; -import Checkbox from '../../../../../components/Checkbox'; -import { CheckboxFilterValue, TagListFilterParamType } from './ScopeFilter'; -import EdsIcon from '@procosys/components/EdsIcon'; import { KeyboardArrowDown, KeyboardArrowUp } from '@mui/icons-material'; +import EdsIcon from '@procosys/components/EdsIcon'; +import React, { ChangeEvent, useState } from 'react'; +import { ExpandedContainer, ScopeFilterCheckbox } from './CheckboxFilter.style'; +import { CheckboxFilterValue, TagListFilterParamType } from './ScopeFilter'; +import { Collapse, CollapseInfo } from './ScopeFilter.style'; interface CheckboxFilterProps { title: string; @@ -46,25 +44,24 @@ const CheckboxFilter = ({ {filterValues.map((value) => { return ( - { return ( String(value.id) === String(elementId) ); })} - onChange={(checked: boolean): void => { + onChange={( + e: ChangeEvent + ): void => { onCheckboxFilterChange( tagListFilterParam, String(value.id), - checked + e.target.checked ); }} - > - - {value.title} - - + label={value.title} + > ); })} diff --git a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/MultiSelectFilter/MultiSelectFilter.style.ts b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/MultiSelectFilter/MultiSelectFilter.style.ts index c17f3d0c8..9fa3aade4 100644 --- a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/MultiSelectFilter/MultiSelectFilter.style.ts +++ b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/MultiSelectFilter/MultiSelectFilter.style.ts @@ -24,12 +24,6 @@ export const FilterContainer = styled.div` display: flex; flex-direction: column; margin: var(--grid-unit) calc(2 * var(--grid-unit)); - button { - background-color: ${tokens.colors.ui.background__light.rgba}; - color: ${tokens.colors.text.static_icons__tertiary.rgba}; - border-bottom: 1px solid - ${tokens.colors.text.static_icons__tertiary.rgba}; - } `; export const SelectedItem = styled.span` diff --git a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/MultiSelectFilter/MultiSelectFilter.tsx b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/MultiSelectFilter/MultiSelectFilter.tsx index b3e49e282..caf9d2bca 100644 --- a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/MultiSelectFilter/MultiSelectFilter.tsx +++ b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/MultiSelectFilter/MultiSelectFilter.tsx @@ -1,14 +1,14 @@ +import { Autocomplete } from '@equinor/eds-core-react'; +import { KeyboardArrowDown, KeyboardArrowUp } from '@mui/icons-material'; +import EdsIcon from '@procosys/components/EdsIcon'; import React, { useEffect, useState } from 'react'; -import Dropdown from '@procosys/components/Dropdown'; import { Collapse, CollapseInfo } from '../ScopeFilter.style'; import { - SelectedItemsContainer, + FilterContainer, Item, SelectedItem, - FilterContainer, + SelectedItemsContainer, } from './MultiSelectFilter.style'; -import EdsIcon from '@procosys/components/EdsIcon'; -import { KeyboardArrowUp, KeyboardArrowDown } from '@mui/icons-material'; interface Item { title: string; @@ -19,7 +19,7 @@ type MultiSelectProps = { items: Item[]; headerLabel: string; inputLabel: string; - inputPlaceholder: string; + inputPlaceholder?: string; selectedItems: string[] | null; onChange: (selectedItems: Item[]) => void; icon: JSX.Element; @@ -47,18 +47,6 @@ const MultiSelectFilter = ({ setSelectedItemsState(selected); }, [selectedItems, items]); - const onSelect = (item: Item): void => { - if ( - !selectedItemsState.find( - (selectedItem) => selectedItem.id === item.id - ) - ) { - const newSelectedItems = [...selectedItemsState, item]; - setSelectedItemsState(newSelectedItems); - onChange(newSelectedItems); - } - }; - const onDeselect = (item: Item): void => { const newSelectedItems = selectedItemsState.filter( (selectedItem) => selectedItem.id !== item.id @@ -67,27 +55,16 @@ const MultiSelectFilter = ({ onChange(newSelectedItems); }; - const selectableItems = items - .filter( - (itm) => - filter === '' || - itm.title.toLowerCase().includes(filter.toLowerCase()) - ) - .map((itm) => { - const isSelected = selectedItemsState.some( - (selectedItem) => selectedItem.id === itm.id - ); - return ( - onSelect(itm)}> - {isSelected ? ( - - ) : ( - - )} - {itm.title} - - ); - }); + const onSelectionChanged = ({ selectedItems }: any): void => { + setSelectedItemsState(selectedItems); + onChange(selectedItems); + }; + + const selectableItems = items.filter( + (itm) => + filter === '' || + itm.title.toLowerCase().includes(filter.toLowerCase()) + ); const selectedItemsComponents = selectedItemsState.map((item) => ( onDeselect(item)}> @@ -99,7 +76,7 @@ const MultiSelectFilter = ({ <> setIsExpanded(!isExpanded)} + onClick={(): void => setIsExpanded(!isExpanded)} data-testid="MultiSelectHeader" filterActive={selectedItemsState.length > 0} > @@ -109,13 +86,15 @@ const MultiSelectFilter = ({ {isExpanded && ( - - {selectableItems} - + options={selectableItems} + optionLabel={(option: Item): string => option.title} + selectedOptions={selectedItemsState} + onOptionsChange={onSelectionChanged} + placeholder={inputPlaceholder} + multiple + > {selectedItemsComponents} diff --git a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/RadioGroupFilter.tsx b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/RadioGroupFilter.tsx index 7ffde163d..9563417d3 100644 --- a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/RadioGroupFilter.tsx +++ b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/RadioGroupFilter.tsx @@ -1,5 +1,10 @@ import React, { useState, useEffect } from 'react'; -import { CollapseInfo, Collapse, ExpandedContainer } from './ScopeFilter.style'; +import { + CollapseInfo, + Collapse, + ExpandedContainer, + ScopeFilterRadio, +} from './ScopeFilter.style'; import EdsIcon from '@procosys/components/EdsIcon'; import { Radio } from '@equinor/eds-core-react'; import { KeyboardArrowUp, KeyboardArrowDown } from '@mui/icons-material'; @@ -66,7 +71,7 @@ const RadioGroupFilter = ({ {options.map((option) => (
  • - ` `; export const ExpandedContainer = styled.div` - padding-left: calc(var(--grid-unit) * 4); + padding-left: calc(var(--grid-unit) * 2); +`; + +export const ScopeFilterRadio = styled(Radio)` + height: 40px; `; diff --git a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/ScopeFilter.tsx b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/ScopeFilter.tsx index d29bc2017..494e98b0d 100644 --- a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/ScopeFilter.tsx +++ b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/ScopeFilter.tsx @@ -1,4 +1,6 @@ import { Button, TextField, Typography } from '@equinor/eds-core-react'; +import React, { useEffect, useRef, useState } from 'react'; +import { SavedTagListFilter, TagListFilter } from '../types'; import { Collapse, CollapseInfo, @@ -7,30 +9,25 @@ import { Link, Section, } from './ScopeFilter.style'; -import React, { useEffect, useRef, useState } from 'react'; -import { SavedTagListFilter, TagListFilter } from '../types'; -import AreaIcon from '@procosys/assets/icons/Area'; -import { Canceler } from 'axios'; -import CheckboxFilter from './CheckboxFilter'; -import EdsIcon from '@procosys/components/EdsIcon'; -import MultiSelectFilter from './MultiSelectFilter/MultiSelectFilter'; -import RadioGroupFilter from './RadioGroupFilter'; -import SavedFilters from './SavedFilters'; -import { showSnackbarNotification } from '../../../../../core/services/NotificationService'; -import { usePreservationContext } from '../../../context/PreservationContext'; import { BookmarksOutlined, Close, KeyboardArrowDown, KeyboardArrowUp, } from '@mui/icons-material'; -import { Popover } from '@mui/material'; +import { Popover, Tooltip } from '@mui/material'; +import AreaIcon from '@procosys/assets/icons/Area'; +import EdsIcon from '@procosys/components/EdsIcon'; +import { Canceler } from 'axios'; import OptionsDropdown from '../../../../../components/OptionsDropdown'; +import { showSnackbarNotification } from '../../../../../core/services/NotificationService'; +import { usePreservationContext } from '../../../context/PreservationContext'; import { DropdownItem } from '../ScopeOverview.style'; -import { Tooltip } from '@mui/material'; - -const ExcelIcon = ; +import CheckboxFilter from './CheckboxFilter'; +import MultiSelectFilter from './MultiSelectFilter/MultiSelectFilter'; +import RadioGroupFilter from './RadioGroupFilter'; +import SavedFilters from './SavedFilters'; interface ScopeFilterProps { onCloseRequest: () => void; @@ -61,7 +58,9 @@ export type TagListFilterParamType = | 'dueFilters' | 'requirementTypeIds' | 'tagFunctionCodes' - | 'disciplineCodes'; + | 'disciplineCodes' + | 'preservationStatus' + | 'actionStatus'; const dueDates: FilterInput[] = [ { @@ -87,46 +86,36 @@ const dueDates: FilterInput[] = [ ]; const PRESERVATION_STATUS = [ - { - title: 'All', - value: 'no-filter', - default: true, - }, { title: 'Not started', - value: 'NotStarted', + id: 'NotStarted', }, { title: 'Active', - value: 'Active', + id: 'Active', }, { title: 'Completed', - value: 'Completed', + id: 'Completed', }, { title: 'In service', - value: 'InService', + id: 'InService', }, ]; const ACTION_STATUS = [ - { - title: 'All', - value: 'no-filter', - default: true, - }, { title: 'Open actions', - value: 'HasOpen', + id: 'HasOpen', }, { title: 'Closed actions', - value: 'HasClosed', + id: 'HasClosed', }, { title: 'Overdue actions', - value: 'HasOverDue', + id: 'HasOverDue', }, ]; @@ -153,8 +142,8 @@ const clearTagListFilter: TagListFilter = { purchaseOrderNoStartsWith: null, callOffStartsWith: null, storageAreaStartsWith: null, - preservationStatus: null, - actionStatus: null, + preservationStatus: [], + actionStatus: [], voidedFilter: null, journeyIds: [], modeIds: [], @@ -314,7 +303,12 @@ const ScopeFilter = ({ ); const tagFunctions: CheckboxFilterValue[] = []; tagFunctionResp.map((item) => { - tagFunctions.push({ id: item.code, title: item.code }); + tagFunctions.push({ + id: item.code, + title: item.description + ? `${item.code}, ${item.description}` + : item.code, + }); }); setTagFunctions(tagFunctions); } catch (error) { @@ -392,20 +386,6 @@ const ScopeFilter = ({ setLocalTagListFilter(newTagListFilter); }; - const onPreservationStatusFilterChanged = (value: string): void => { - const filter = value === 'no-filter' ? null : value; - setLocalTagListFilter((old): TagListFilter => { - return { ...old, preservationStatus: filter }; - }); - }; - - const onActionStatusFilterChanged = (value: string): void => { - const filter = value === 'no-filter' ? null : value; - setLocalTagListFilter((old): TagListFilter => { - return { ...old, actionStatus: filter }; - }); - }; - const onVoidedFilterChanged = (value: string): void => { setLocalTagListFilter((old): TagListFilter => { return { ...old, voidedFilter: value }; @@ -729,18 +709,20 @@ const ScopeFilter = ({ )} - - } /> } /> diff --git a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/__tests__/MutliSelectFilter.test.jsx b/src/modules/Preservation/views/ScopeOverview/ScopeFilter/__tests__/MutliSelectFilter.test.jsx deleted file mode 100644 index 9b62b2883..000000000 --- a/src/modules/Preservation/views/ScopeOverview/ScopeFilter/__tests__/MutliSelectFilter.test.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import { render } from '@testing-library/react'; -import React from 'react'; -import MultiSelectFilter from '../MultiSelectFilter/MultiSelectFilter'; - -const filterValues = [ - { - id: '1', - title: 'Donald Duck', - }, - { - id: '2', - title: 'Onkel Skrue', - }, - { - id: '3', - title: 'Bestemor Duck', - }, -]; - -const testEdsIcon = 'edit'; - -describe('', () => { - it('Should render correct items', () => { - const { getByText } = render( - - ); - getByText('Header').click(); - getByText('Select').click(); - expect(getByText('Donald Duck')).toBeInTheDocument(); - expect(getByText('Onkel Skrue')).toBeInTheDocument(); - expect(getByText('Bestemor Duck')).toBeInTheDocument(); - }); - - it('Should trigger onChange when item is selected', () => { - const spyFunc = jest.fn(); - const { getByText } = render( - - ); - getByText('Header').click(); - getByText('Select').click(); - getByText(filterValues[1].title).click(); - expect(spyFunc).toHaveBeenCalledTimes(1); - expect(spyFunc).toHaveBeenLastCalledWith([filterValues[1]]); - }); - - it('Should trigger onChange with multiple items', async () => { - const spyFunc = jest.fn(); - const { getByText } = render( - - ); - getByText('Header').click(); - - getByText('Select').click(); - getByText(filterValues[1].title).click(); - expect(spyFunc).toHaveBeenCalledTimes(1); - expect(spyFunc).toHaveBeenLastCalledWith([ - filterValues[0], - filterValues[1], - ]); - }); -}); diff --git a/src/modules/Preservation/views/ScopeOverview/ScopeOverview.style.ts b/src/modules/Preservation/views/ScopeOverview/ScopeOverview.style.ts index b0c24300e..4b4b4ccd7 100644 --- a/src/modules/Preservation/views/ScopeOverview/ScopeOverview.style.ts +++ b/src/modules/Preservation/views/ScopeOverview/ScopeOverview.style.ts @@ -159,7 +159,7 @@ export const FilterContainer = styled.div<{ maxHeight: number }>` padding-right: calc(var(--grid-unit) * 2); overflow-y: auto; height: ${(props): number => props.maxHeight} px; - min-width: 300px; + width: 300px; `; export const TooltipText = styled.span` diff --git a/src/modules/Preservation/views/ScopeOverview/ScopeOverview.tsx b/src/modules/Preservation/views/ScopeOverview/ScopeOverview.tsx index 521a63de7..864d9a0c8 100644 --- a/src/modules/Preservation/views/ScopeOverview/ScopeOverview.tsx +++ b/src/modules/Preservation/views/ScopeOverview/ScopeOverview.tsx @@ -70,8 +70,8 @@ const emptyTagListFilter: TagListFilter = { purchaseOrderNoStartsWith: null, callOffStartsWith: null, storageAreaStartsWith: null, - preservationStatus: null, - actionStatus: null, + preservationStatus: [], + actionStatus: [], voidedFilter: null, journeyIds: [], modeIds: [], diff --git a/src/modules/Preservation/views/ScopeOverview/types.d.ts b/src/modules/Preservation/views/ScopeOverview/types.d.ts index 71876ba93..13b679559 100644 --- a/src/modules/Preservation/views/ScopeOverview/types.d.ts +++ b/src/modules/Preservation/views/ScopeOverview/types.d.ts @@ -60,8 +60,8 @@ export interface TagListFilter { requirementTypeIds: string[]; tagFunctionCodes: string[]; disciplineCodes: string[]; - preservationStatus: string | null; - actionStatus: string | null; + preservationStatus: string[]; + actionStatus: string[]; voidedFilter: string | null; responsibleIds: string[] | null; areaCodes: string[] | null; diff --git a/yarn.lock b/yarn.lock index e58db3542..87fd256dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4780,7 +4780,12 @@ ansi-html-community@0.0.8, ansi-html-community@^0.0.8: resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== -ansi-regex@^2.0.0, ansi-regex@^4.1.0, ansi-regex@^5.0.1, ansi-regex@^6.0.1: +ansi-regex@5.0.1, ansi-regex@^4.1.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== @@ -13038,7 +13043,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -13172,34 +13186,20 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^5.1.0: +strip-ansi@5.2.0, strip-ansi@^3.0.0, strip-ansi@^5.1.0, strip-ansi@^6.0.0, strip-ansi@^6.0.1, strip-ansi@^7.0.1: version "5.2.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" @@ -14450,8 +14450,7 @@ worker-rpc@^0.1.0: dependencies: microevent.ts "~0.1.1" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - name wrap-ansi-cjs +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -14469,6 +14468,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz"