diff --git a/package.json b/package.json index 0797d97b..8a42cfd6 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,9 @@ "typescript": "^5.0.4" }, "dependencies": { - "@dhis2/app-runtime": "^3.9.4", + "@dhis2/app-runtime": "^3.9.3", + "@dhis2/ui": "^8.13.10", + "use-query-params": "^2.2.1", "react-router-dom": "^6.11.2", "zustand": "^4.3.8" } diff --git a/src/app/routes/Router.tsx b/src/app/routes/Router.tsx index 9f6c7f37..4d45fa7a 100644 --- a/src/app/routes/Router.tsx +++ b/src/app/routes/Router.tsx @@ -10,6 +10,8 @@ import { RouteObject, useParams, } from 'react-router-dom' +import { QueryParamProvider } from 'use-query-params' +import { ReactRouter6Adapter } from 'use-query-params/adapters/react-router-6' import { SECTIONS_MAP, SCHEMA_SECTIONS, @@ -24,7 +26,6 @@ import { CheckAuthorityForSection } from './CheckAuthorityForSection' import { DefaultErrorRoute } from './DefaultErrorRoute' import { LegacyAppRedirect } from './LegacyAppRedirect' import { getSectionPath, routePaths } from './routePaths' - // This loads all the overview routes in the same chunk since they resolve to the same promise // see https://reactrouter.com/en/main/route/lazy#multiple-routes-in-a-single-file // Overviews are small, and the AllOverview would load all the other overviews anyway, @@ -114,7 +115,14 @@ const schemaSectionRoutes = Object.values(SCHEMA_SECTIONS).map((section) => ( )) const routes = createRoutesFromElements( - } errorElement={}> + + + + } + errorElement={} + > } @@ -143,7 +151,6 @@ const routes = createRoutesFromElements( ) export const hashRouter = createHashRouter(routes) - export const ConfiguredRouter = () => { return } diff --git a/src/components/index.tsx b/src/components/index.tsx index c77169ac..f3f2873c 100644 --- a/src/components/index.tsx +++ b/src/components/index.tsx @@ -1,2 +1,3 @@ export { Loader } from './loading' export { HidePreventUnmount } from './HidePreventUnmount' +export * from './sectionList' diff --git a/src/components/loading/Loader.tsx b/src/components/loading/Loader.tsx index 825da934..8e80530e 100644 --- a/src/components/loading/Loader.tsx +++ b/src/components/loading/Loader.tsx @@ -1,8 +1,8 @@ import i18n from '@dhis2/d2-i18n' -import { CircularLoader, NoticeBox } from '@dhis2/ui' +import { NoticeBox } from '@dhis2/ui' import React from 'react' import { QueryResponse } from '../../types' -import styles from './Loader.module.css' +import { LoadingSpinner } from './LoadingSpinner' interface LoaderProps { children: React.ReactNode @@ -11,7 +11,7 @@ interface LoaderProps { } export const Loader = ({ children, queryResponse, label }: LoaderProps) => { if (queryResponse.loading) { - return + return } if (queryResponse.error) { const message = queryResponse.error?.message diff --git a/src/components/loading/LoadingSpinner.tsx b/src/components/loading/LoadingSpinner.tsx new file mode 100644 index 00000000..039655e0 --- /dev/null +++ b/src/components/loading/LoadingSpinner.tsx @@ -0,0 +1,16 @@ +import { CircularLoader } from '@dhis2/ui' +import cx from 'classnames' +import React from 'react' +import styles from './Loader.module.css' + +export const LoadingSpinner = ({ + centered = true, + ...rest +}: { + centered?: boolean +}) => ( + +) diff --git a/src/components/sectionList/SectionList.module.css b/src/components/sectionList/SectionList.module.css new file mode 100644 index 00000000..1bead8ec --- /dev/null +++ b/src/components/sectionList/SectionList.module.css @@ -0,0 +1,33 @@ +.listHeaderNormal { + background-color: #fff; + width: 100%; + height: 24px; + display: flex; + align-items: center; + height: 48px; + padding: var(--spacers-dp8); + margin-top: var(--spacers-dp8); + gap: var(--spacers-dp8); +} + +.listHeaderNormal a { + line-height: var(--spacers-dp16); +} + +.listRow td { + padding-top: var(--spacers-dp8); + padding-bottom: var(--spacers-dp8); +} + +.listActions { + display: flex; + gap: var(--spacers-dp8); +} + +.listActions button { + padding: 0 2px !important; +} + +.listEmpty { + text-align: center; +} diff --git a/src/components/sectionList/SectionList.tsx b/src/components/sectionList/SectionList.tsx new file mode 100644 index 00000000..2da39079 --- /dev/null +++ b/src/components/sectionList/SectionList.tsx @@ -0,0 +1,54 @@ +import i18n from '@dhis2/d2-i18n' +import { + DataTable, + DataTableColumnHeader, + DataTableRow, + TableBody, + TableHead, + Checkbox, +} from '@dhis2/ui' +import React, { PropsWithChildren } from 'react' +import { CheckBoxOnChangeObject } from '../../types' +import { IdentifiableObject } from '../../types/generated' +import { SelectedColumns } from './types' + +type SectionListProps = { + headerColumns: SelectedColumns + onSelectAll: (checked: boolean) => void + allSelected?: boolean +} + +export const SectionList = ({ + allSelected, + headerColumns, + children, + onSelectAll, +}: PropsWithChildren>) => { + return ( + + + + + + onSelectAll(checked) + } + /> + + {headerColumns.map((headerColumn) => ( + + {headerColumn.label} + + ))} + + {i18n.t('Actions')} + + + + {children} + + ) +} diff --git a/src/components/sectionList/SectionListLoader.tsx b/src/components/sectionList/SectionListLoader.tsx new file mode 100644 index 00000000..9839e46c --- /dev/null +++ b/src/components/sectionList/SectionListLoader.tsx @@ -0,0 +1,13 @@ +import { DataTableRow, DataTableCell } from '@dhis2/ui' +import React from 'react' +import { LoadingSpinner } from '../loading/LoadingSpinner' + +export const SectionListLoader = () => { + return ( + + + + + + ) +} diff --git a/src/components/sectionList/SectionListMessages.tsx b/src/components/sectionList/SectionListMessages.tsx new file mode 100644 index 00000000..e326cf76 --- /dev/null +++ b/src/components/sectionList/SectionListMessages.tsx @@ -0,0 +1,32 @@ +import i18n from '@dhis2/d2-i18n' +import { DataTableRow, DataTableCell, NoticeBox } from '@dhis2/ui' +import React, { PropsWithChildren } from 'react' +import css from './SectionList.module.css' + +export const SectionListMessage = ({ children }: PropsWithChildren) => { + return ( + + {children} + + ) +} + +export const SectionListEmpty = () => { + return ( + +

+ {i18n.t("There aren't any items that match your filter.")} +

+
+ ) +} + +export const SectionListError = () => { + return ( + + + {i18n.t('An error occurred while loading the items.')} + + + ) +} diff --git a/src/components/sectionList/SectionListPagination.tsx b/src/components/sectionList/SectionListPagination.tsx new file mode 100644 index 00000000..59a99ba3 --- /dev/null +++ b/src/components/sectionList/SectionListPagination.tsx @@ -0,0 +1,170 @@ +import { Pagination, DataTableRow, DataTableCell } from '@dhis2/ui' +import React, { useEffect, useCallback, useMemo } from 'react' +import { + useQueryParam, + NumericObjectParam, + withDefault, +} from 'use-query-params' +import { GistPaginator } from '../../lib/' +import { GistCollectionResponse } from '../../types/generated' + +type SectionListPaginationProps = { + data: GistCollectionResponse | undefined +} + +type PaginationQueryParams = { + page: number + pageSize: number +} + +const defaultPaginationQueryParams = { + page: 1, + pageSize: 20, +} + +const PAGE_SIZES = [5, 10, 20, 30, 40, 50, 75, 100] + +const paginationQueryParams = withDefault( + NumericObjectParam, + defaultPaginationQueryParams +) + +export const usePaginationQueryParams = () => { + const [params, setParams] = useQueryParam('pager', paginationQueryParams, { + removeDefaultsFromUrl: true, + }) + + return useMemo( + () => [validatePagerParams(params), setParams] as const, + [params, setParams] + ) +} + +const validatePagerParams = ( + params: typeof paginationQueryParams.default +): PaginationQueryParams => { + if (!params) { + return defaultPaginationQueryParams + } + const isValid = Object.values(params).every( + (value) => value && !isNaN(value) + ) + if (!isValid) { + return defaultPaginationQueryParams + } + + const pageSize = params.pageSize as number + const page = params.page as number + + // since pageSize can be changed in URL, find the closest valid pageSize + const validatedPageSize = PAGE_SIZES.reduce((prev, curr) => + Math.abs(curr - pageSize) < Math.abs(prev - pageSize) ? curr : prev + ) + + return { + page, + pageSize: validatedPageSize, + } +} + +function useUpdatePaginationParams( + data?: GistCollectionResponse +): GistPaginator { + const pager = data?.pager + const [, setParams] = usePaginationQueryParams() + + const getNextPage = useCallback(() => { + if (!pager?.nextPage) { + return false + } + setParams((prevPager) => ({ ...prevPager, page: pager.page + 1 })) + return true + }, [pager, setParams]) + + const getPrevPage = useCallback(() => { + if (!pager?.prevPage) { + return false + } + setParams((prevPager) => ({ ...prevPager, page: pager.page - 1 })) + return true + }, [pager, setParams]) + + const goToPage = useCallback( + (page: number) => { + if (!pager?.pageCount || page > pager.pageCount) { + return false + } + setParams((prevPager) => ({ ...prevPager, page })) + return true + }, + [pager, setParams] + ) + + const changePageSize = useCallback( + (pageSize: number) => { + setParams((prevPager) => ({ ...prevPager, pageSize: pageSize })) + return true + }, + [setParams] + ) + + return { + getNextPage, + getPrevPage, + goToPage, + changePageSize, + pager, + } +} + +/** clamps a number between min and max, + *resulting in a number between min and max (inclusive). + */ +const clamp = (value: number, min: number, max: number) => + Math.max(min, Math.min(value, max)) + +export const SectionListPagination = ({ data }: SectionListPaginationProps) => { + const [paginationParams] = usePaginationQueryParams() + const pagination = useUpdatePaginationParams(data) + + useEffect(() => { + // since page can be controlled by params + // do a refetch if page is out of bounds + const page = paginationParams.page + + const clamped = clamp(page, 1, pagination.pager?.pageCount || 1) + if (page !== clamped) { + pagination.goToPage(clamped) + } + }, [pagination, paginationParams.page]) + + if (!pagination.pager?.total) { + return null + } + + // Prevent out of bounds for page-selector + // note that this will make the UI-selector out of sync with the actual data + // but paginator throws error if page is out of bounds + // useEffect above will refetch last page - so this should only be for a very brief render + const page = clamp( + paginationParams.page, + 1, + pagination.pager?.pageCount || 1 + ) + + return ( + + + s.toString())} + page={page} + pageSize={paginationParams.pageSize} + pageCount={pagination.pager?.pageCount} + total={pagination.pager?.total} + onPageSizeChange={pagination.changePageSize} + onPageChange={pagination.goToPage} + /> + + + ) +} diff --git a/src/components/sectionList/SectionListRow.tsx b/src/components/sectionList/SectionListRow.tsx new file mode 100644 index 00000000..2e31f2d2 --- /dev/null +++ b/src/components/sectionList/SectionListRow.tsx @@ -0,0 +1,73 @@ +import { DataTableRow, DataTableCell, Checkbox, Button } from '@dhis2/ui' +import { IconEdit24, IconMore24 } from '@dhis2/ui-icons' +import React from 'react' +import { Link } from 'react-router-dom' +import { CheckBoxOnChangeObject } from '../../types' +import { IdentifiableObject, GistModel } from '../../types/models' +import css from './SectionList.module.css' +import { SelectedColumns } from './types' + +export type SectionListRowProps = { + modelData: Model | GistModel + selectedColumns: SelectedColumns + onSelect: (modelId: string, checked: boolean) => void + selected: boolean +} + +export function SectionListRow({ + selectedColumns, + modelData, + onSelect, + selected, +}: SectionListRowProps) { + return ( + + + { + onSelect(modelData.id, checked) + }} + /> + + {selectedColumns.map(({ modelPropertyName }) => ( + + {/* TODO: Handle constant translations and resolve displayvalues to components */} + {typeof modelData[modelPropertyName] === 'object' + ? modelPropertyName + : modelData[modelPropertyName]} + + ))} + + + + + ) +} + +const ListActions = ({ modelId }: { modelId: string }) => { + return ( +
+ + +
+ ) +} + +const ActionEdit = ({ modelId }: { modelId: string }) => { + return ( + + + + ) +} + +const ActionMore = () => { + return ( + + ) +} diff --git a/src/components/sectionList/SectionListWrapper.tsx b/src/components/sectionList/SectionListWrapper.tsx new file mode 100644 index 00000000..a56aeb40 --- /dev/null +++ b/src/components/sectionList/SectionListWrapper.tsx @@ -0,0 +1,99 @@ +import { FetchError } from '@dhis2/app-runtime' +import React, { useMemo, useState } from 'react' +import { IdentifiableObject, GistCollectionResponse } from '../../types/models' +import { FilterWrapper } from './filters/FilterWrapper' +import { SectionList } from './SectionList' +import { SectionListLoader } from './SectionListLoader' +import { SectionListEmpty, SectionListError } from './SectionListMessages' +import { SectionListPagination } from './SectionListPagination' +import { SectionListRow } from './SectionListRow' +import { SelectionListHeader } from './SelectionListHeaderNormal' +import { SelectedColumns } from './types' + +type SectionListWrapperProps = { + availableColumns?: SelectedColumns + defaultColumns: SelectedColumns + filterElement?: React.ReactElement + data: GistCollectionResponse | undefined + error: FetchError | undefined +} +export const SectionListWrapper = ({ + availableColumns, + defaultColumns, + filterElement, + data, + error, +}: SectionListWrapperProps) => { + const [selectedColumns, setSelectedColumns] = + useState>(defaultColumns) + const [selectedModels, setSelectedModels] = useState>(new Set()) + + const handleSelect = (id: string, checked: boolean) => { + if (checked) { + setSelectedModels(new Set(selectedModels).add(id)) + } else { + selectedModels.delete(id) + setSelectedModels(new Set(selectedModels)) + } + } + + const handleSelectAll = (checked: boolean) => { + if (checked) { + setSelectedModels( + new Set( + data?.result?.map((model) => { + return model.id + }) + ) + ) + } else { + setSelectedModels(new Set()) + } + } + + const allSelected = useMemo(() => { + return ( + data?.result.length !== 0 && + data?.result.length === selectedModels.size + ) + }, [data?.result, selectedModels.size]) + + const SectionListMessage = () => { + if (error) { + console.log(error.details || error) + return + } + if (!data?.result) { + return + } + if (data?.result?.length < 1) { + return + } + return null + } + + return ( +
+ {filterElement} + + + + {data?.result && + data?.result.map((model) => ( + + ))} + + +
+ ) +} diff --git a/src/components/sectionList/SelectionListHeaderNormal.tsx b/src/components/sectionList/SelectionListHeaderNormal.tsx new file mode 100644 index 00000000..4a0c26dc --- /dev/null +++ b/src/components/sectionList/SelectionListHeaderNormal.tsx @@ -0,0 +1,21 @@ +import i18n from '@dhis2/d2-i18n' +import { Button } from '@dhis2/ui' +import { IconAdd24 } from '@dhis2/ui-icons' +import React from 'react' +import { Link } from 'react-router-dom' +import { routePaths } from '../../app/routes/routePaths' +import css from './SectionList.module.css' + +export const SelectionListHeader = () => { + return ( +
+ + + + + +
+ ) +} diff --git a/src/components/sectionList/filters/ConstantFilters.tsx b/src/components/sectionList/filters/ConstantFilters.tsx new file mode 100644 index 00000000..4dacfef1 --- /dev/null +++ b/src/components/sectionList/filters/ConstantFilters.tsx @@ -0,0 +1,27 @@ +import React from 'react' +import { + DOMAIN_TYPE, + VALUE_TYPE, +} from '../../../constants/translatedModelConstants' +import { ConstantSelectionFilter } from './ConstantSelectionFilter' + +export const DomainTypeSelectionFilter = () => { + return ( + + ) +} + +export const ValueTypeSelectionFilter = () => { + return ( + + ) +} diff --git a/src/components/sectionList/filters/ConstantSelectionFilter.tsx b/src/components/sectionList/filters/ConstantSelectionFilter.tsx new file mode 100644 index 00000000..50b3bde1 --- /dev/null +++ b/src/components/sectionList/filters/ConstantSelectionFilter.tsx @@ -0,0 +1,41 @@ +import i18n from '@dhis2/d2-i18n' +import { SingleSelect, SingleSelectOption } from '@dhis2/ui' +import React from 'react' +import { SelectOnChangeObject } from '../../../types' +import css from './Filters.module.css' +import { useSectionListFilter } from './useSectionListFilter' + +type ConstantSelectionFilterProps = { + label: string + constants: Record + filterKey: string + filterable?: boolean +} + +export const ConstantSelectionFilter = ({ + constants, + filterKey, + label, + filterable, +}: ConstantSelectionFilterProps) => { + const [filter, setFilter] = useSectionListFilter(filterKey) + return ( + { + setFilter(selected) + }} + selected={filter} + placeholder={label} + dense + filterable={filterable} + filterPlaceholder={i18n.t('Type to filter options')} + noMatchText={i18n.t('No matches')} + > + + {Object.entries(constants).map(([key, label]) => ( + + ))} + + ) +} diff --git a/src/components/sectionList/filters/FilterWrapper.tsx b/src/components/sectionList/filters/FilterWrapper.tsx new file mode 100644 index 00000000..662ad197 --- /dev/null +++ b/src/components/sectionList/filters/FilterWrapper.tsx @@ -0,0 +1,26 @@ +import i18n from '@dhis2/d2-i18n' +import { Button } from '@dhis2/ui' +import React from 'react' +import css from './Filters.module.css' +import { IdentifiableFilter } from './IdentifiableFilter' +import { useSectionListFilters } from './useSectionListFilter' + +type FilterWrapperProps = React.PropsWithChildren + +export const FilterWrapper = ({ children }: FilterWrapperProps) => { + const [, setFilters] = useSectionListFilters() + + const handleClear = () => { + setFilters(undefined) + } + + return ( +
+ + {children} + +
+ ) +} diff --git a/src/components/sectionList/filters/Filters.module.css b/src/components/sectionList/filters/Filters.module.css new file mode 100644 index 00000000..6363b729 --- /dev/null +++ b/src/components/sectionList/filters/Filters.module.css @@ -0,0 +1,23 @@ +.selectionFilter { + min-width: 190px; +} + +.constantSelectionFilter { + composes: selectionFilter; +} + +/* make dense selection fields same height as text field*/ +.constantSelectionFilter [data-test='dhis2-uicore-select-input'] { + max-height: 32px; +} + +.identifiableSelectionFilter { + width: 320px; +} + +.filterWrapper { + display: flex; + flex-wrap: wrap; + gap: 4px; + align-items: center; +} diff --git a/src/components/sectionList/filters/IdentifiableFilter.tsx b/src/components/sectionList/filters/IdentifiableFilter.tsx new file mode 100644 index 00000000..f4aa0aad --- /dev/null +++ b/src/components/sectionList/filters/IdentifiableFilter.tsx @@ -0,0 +1,35 @@ +import i18n from '@dhis2/d2-i18n' +import { Input } from '@dhis2/ui' +import React, { useEffect, useState } from 'react' +import { useDebounce } from '../../../lib' +import { InputOnChangeObject } from '../../../types' +import css from './Filters.module.css' +import { IDENTIFIABLE_KEY, useSectionListFilter } from './useSectionListFilter' + +export const IdentifiableFilter = () => { + const [filter, setFilter] = useSectionListFilter(IDENTIFIABLE_KEY) + const [value, setValue] = useState(filter || '') + const debouncedValue = useDebounce(value, 200) + + useEffect(() => { + setFilter(debouncedValue || undefined) // convert empty string to undefined + }, [debouncedValue, setFilter]) + + useEffect(() => { + if (!filter) { + setValue('') + } + }, [filter]) + + return ( + <> + setValue(value.value)} + value={value} + dense + /> + + ) +} diff --git a/src/components/sectionList/filters/index.ts b/src/components/sectionList/filters/index.ts new file mode 100644 index 00000000..01def766 --- /dev/null +++ b/src/components/sectionList/filters/index.ts @@ -0,0 +1,4 @@ +export * from './useSectionListFilter' +export * from './ConstantSelectionFilter' +export * from './IdentifiableFilter' +export * from './ConstantFilters' diff --git a/src/components/sectionList/filters/useSectionListFilter.ts b/src/components/sectionList/filters/useSectionListFilter.ts new file mode 100644 index 00000000..535e9e98 --- /dev/null +++ b/src/components/sectionList/filters/useSectionListFilter.ts @@ -0,0 +1,153 @@ +import { useCallback, useMemo } from 'react' +import { useQueryParam, ObjectParam, UrlUpdateType } from 'use-query-params' +import { + Schema, + useSchemaFromHandle, + CustomObjectParam, + GistParams, +} from '../../../lib' +import { usePaginationQueryParams } from '../SectionListPagination' + +type ObjectParamType = typeof ObjectParam.default + +type Filters = Record + +// special key for handling search for identifiable objects +// eg. searches for name, code, id and shortname +// this would translate to "token" in the old API, but does not exist in GIST-API +export const IDENTIFIABLE_KEY = 'identifiable' + +const IDENTIFIABLE_FIELDS = { + name: { + operator: 'ilike', + }, + code: { + operator: 'ilike', + }, + shortName: { + operator: 'ilike', + }, + id: { + operator: 'eq', + }, +} + +const getVerifiedFiltersForSchema = ( + filters: ObjectParamType, + schema: Schema +): Filters => { + if (!filters) { + return {} + } + /* TODO: verify values for filters */ + const relevantFilters = Object.entries(filters).filter(([key]) => { + return key === IDENTIFIABLE_KEY || schema.properties[key] + }) + return Object.fromEntries(relevantFilters) +} + +const useFilterQueryParam = () => { + return useQueryParam('filter', CustomObjectParam) +} + +export const useSectionListFilters = () => { + const [filter, setFilterParam] = useFilterQueryParam() + const [, setPagingParam] = usePaginationQueryParams() + + const schema = useSchemaFromHandle() + + // override setFilter to be able to reset Page when filter changes + const setFilter = useCallback( + ( + filter: Parameters[0], + updateType?: UrlUpdateType + ) => { + setFilterParam(filter, updateType) + // set page to 1 when filter changes + // do this here instead of useEffect to prevent unnecessary refetches + setPagingParam((pagingParams) => ({ ...pagingParams, page: 1 })) + }, + [setFilterParam, setPagingParam] + ) + + return useMemo( + () => [getVerifiedFiltersForSchema(filter, schema), setFilter] as const, + [filter, schema, setFilter] + ) +} + +/** Helper-hook to select a single filter. + * eg. [domainType, setDomainType] = useSectionListFilter('domainType') + */ +export const useSectionListFilter = ( + filterKey: string +): [string | undefined, (value: string | undefined) => void] => { + const [filters, setFilters] = useSectionListFilters() + + const boundSetFilter = useCallback( + (value: string | undefined) => { + if (!value) { + setFilters((filters) => { + if (!filters) { + return undefined + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { [filterKey]: _, ...rest } = filters + return Object.keys(rest).length === 0 ? undefined : rest + }) + } else { + setFilters((filters) => ({ ...filters, [filterKey]: value })) + } + }, + [filterKey, setFilters] + ) + + return [filters?.[filterKey] ?? undefined, boundSetFilter] +} + +const parseToGistQueryFilter = (filters: Filters): string[] => { + const { [IDENTIFIABLE_KEY]: identifiableValue, ...restFilters } = filters + const queryFilters: string[] = [] + + // Groups are a powerful way to combine filters, + // here we use them for identifiable filters, to group them with "OR" and + // rest of the filters with "AND". + // see https://docs.dhis2.org/en/develop/using-the-api/dhis-core-version-239/metadata-gist.html#gist_parameters_filter + if (identifiableValue) { + const identifiableFilterGroup = `0:` + Object.entries(IDENTIFIABLE_FIELDS).forEach(([key, { operator }]) => { + queryFilters.push( + `${identifiableFilterGroup}${key}:${operator}:${identifiableValue}` + ) + }) + } + let restFilterGroup: number | undefined + if (identifiableValue) { + restFilterGroup = 1 + } + Object.entries(restFilters).forEach(([key, value]) => { + const group = restFilterGroup ? `${restFilterGroup++}:` : '' + queryFilters.push(`${group}${key}:eq:${value}`) + }) + return queryFilters +} + +export const useSectionListQueryFilter = () => { + const [filters] = useSectionListFilters() + + return useMemo(() => { + return parseToGistQueryFilter(filters) + }, [filters]) +} + +export const useQueryParamsForModelGist = (): GistParams => { + const [paginationParams] = usePaginationQueryParams() + const filterParams = useSectionListQueryFilter() + + return useMemo(() => { + return { + ...paginationParams, + filter: filterParams, + } + }, [paginationParams, filterParams]) +} diff --git a/src/components/sectionList/index.ts b/src/components/sectionList/index.ts new file mode 100644 index 00000000..74644164 --- /dev/null +++ b/src/components/sectionList/index.ts @@ -0,0 +1,7 @@ +export * from './SectionList' +export * from './SectionListRow' +export * from './SectionListWrapper' +export type * from './types' +export * from './filters' +export * from './SectionListPagination' +export * from './useSectionListParamsRefetch' diff --git a/src/components/sectionList/types.ts b/src/components/sectionList/types.ts new file mode 100644 index 00000000..d714f9b2 --- /dev/null +++ b/src/components/sectionList/types.ts @@ -0,0 +1,16 @@ +import { IdentifiableObject } from '../../types/generated' + +export type SelectedColumn = { + label: string + modelPropertyName: keyof Model +} + +export type SelectedColumns< + Model extends IdentifiableObject = IdentifiableObject +> = SelectedColumn[] + +export type CheckBoxOnChangeObject = { + checked: boolean + name?: string + value?: string +} diff --git a/src/components/sectionList/useSectionListParamsRefetch.tsx b/src/components/sectionList/useSectionListParamsRefetch.tsx new file mode 100644 index 00000000..77bd5e00 --- /dev/null +++ b/src/components/sectionList/useSectionListParamsRefetch.tsx @@ -0,0 +1,14 @@ +import { useEffect } from 'react' +import { QueryRefetchFunction } from '../../types' +import { useQueryParamsForModelGist } from './filters' + +/** Refetches when filter and pagination params change */ +export const useSectionListParamsRefetch = (refetch: QueryRefetchFunction) => { + const params = useQueryParamsForModelGist() + + useEffect(() => { + refetch({ + ...params, + }) + }, [refetch, params]) +} diff --git a/src/constants/translatedModelConstants.ts b/src/constants/translatedModelConstants.ts new file mode 100644 index 00000000..08dd790d --- /dev/null +++ b/src/constants/translatedModelConstants.ts @@ -0,0 +1,71 @@ +import i18n from '@dhis2/d2-i18n' + +// because of the way d2-i18n works, we cannot translate dynamic values +// so we have to list them manually +export const AGGREGATION_TYPE = { + SUM: i18n.t('Sum'), + AVERAGE: i18n.t('Average'), + AVERAGE_SUM_ORG_UNIT: i18n.t('Average (sum in org unit)'), + LAST: i18n.t('Last value (sum in org unit hierarchy)'), + LAST_AVERAGE_ORG_UNIT: i18n.t('Last value (average in org unit)'), + LAST_LAST_ORG_UNIT: i18n.t('Last value (last in org unit hierarchy)'), + LAST_IN_PERIOD: i18n.t('Last value in period (sum in org unit hierarchy)'), + LAST_IN_PERIOD_AVERAGE_ORG_UNIT: i18n.t('Lastinperiodaverageorgunit'), + FIRST: i18n.t('First value (sum in org unit hierarchy)'), + FIRST_AVERAGE_ORG_UNIT: i18n.t( + 'First value (average in org unit hierarchy)' + ), + FIRST_FIRST_ORG_UNIT: i18n.t('First value (first in org unit hierarchy)'), + COUNT: i18n.t('Count'), + STDDEV: i18n.t('Standard deviation'), + VARIANCE: i18n.t('Variance'), + MIN: i18n.t('Min'), + MAX: i18n.t('Max'), + MIN_SUM_ORG_UNIT: i18n.t('Min (sum in org unit)'), + MAX_SUM_ORG_UNIT: i18n.t('Max (sum in org unit)'), + NONE: i18n.t('None'), + CUSTOM: i18n.t('Custom'), + DEFAULT: i18n.t('Default'), +} + +export const DOMAIN_TYPE = { + AGGREGATE: i18n.t('Aggregate'), + TRACKER: i18n.t('Tracker'), +} + +export const VALUE_TYPE = { + TEXT: i18n.t('Text'), + LONG_TEXT: i18n.t('Long text'), + MULTI_TEXT: i18n.t('Text with multiple values'), + LETTER: i18n.t('Letter'), + PHONE_NUMBER: i18n.t('Phone number'), + EMAIL: i18n.t('Email'), + BOOLEAN: i18n.t('Yes/No'), + TRUE_ONLY: i18n.t('Yes only'), + DATE: i18n.t('Date'), + DATETIME: i18n.t('Date and time'), + TIME: i18n.t('Time'), + NUMBER: i18n.t('Number'), + UNIT_INTERVAL: i18n.t('Unit interval'), + PERCENTAGE: i18n.t('Percentage'), + INTEGER: i18n.t('Integer'), + INTEGER_POSITIVE: i18n.t('Positive integer'), + INTEGER_NEGATIVE: i18n.t('Negative integer'), + INTEGER_ZERO_OR_POSITIVE: i18n.t('Positive or Zero integer'), + TRACKER_ASSOCIATE: i18n.t('Tracker associate'), + USERNAME: i18n.t('Username'), + COORDINATE: i18n.t('Coordinate'), + ORGANISATION_UNIT: i18n.t('Organisation unit'), + REFERENCE: i18n.t('Reference'), + AGE: i18n.t('Age'), + URL: i18n.t('URL'), + FILE_RESOURCE: i18n.t('File'), + IMAGE: i18n.t('Image'), + GEOJSON: i18n.t('GeoJSON'), +} + +export const constantPropertyTranslations = { + aggregationType: AGGREGATION_TYPE, + domainType: DOMAIN_TYPE, + valueType: VALUE_TYPE, +} diff --git a/src/lib/index.ts b/src/lib/index.ts index ef513787..02caed71 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -4,5 +4,6 @@ export { useLoadApp } from './useLoadApp' export type { Schema } from './useLoadApp' export * from './errors' export * from './user' -export * from './useSectionHandle' export * from './sections' +export * from './useDebounce' +export * from './routeUtils' diff --git a/src/lib/models/index.ts b/src/lib/models/index.ts index f3c9fbe9..7578ef97 100644 --- a/src/lib/models/index.ts +++ b/src/lib/models/index.ts @@ -1 +1,8 @@ +export { useModelGist } from './useModelGist' +export type { + GistPaginator, + GistParams, + UseModelGistResultPaginated, + UseModelGistResult, +} from './useModelGist' export { isValidUid } from './uid' diff --git a/src/lib/models/useModelGist.ts b/src/lib/models/useModelGist.ts new file mode 100644 index 00000000..3916b264 --- /dev/null +++ b/src/lib/models/useModelGist.ts @@ -0,0 +1,186 @@ +import { useDataQuery } from '@dhis2/app-runtime' +import React, { useState, useCallback } from 'react' +import { + GistParams as BaseGistParams, + IdentifiableObject, + GistResponse, + GistPager, + GistCollectionResponse, + GistPagedResponse, + GistObjectResponse, +} from '../../types/models' +import { QueryResponse, Query } from '../../types/query' + +// these normally are just strings, but useQuery supports arrays +export type GistParams = Omit & { + fields?: string | string[] + filter?: string | string[] +} + +type GistResourceString = `${string}/gist` +type ResourceQuery = Query[number] +type GistResourceQuery = Omit & { + resource: GistResourceString +} + +// note that we do not support parallel queries +// this makes it significantly easier to implement +// and parallel use of gist queries shouldn't be a common use case +type GistQuery = { + result: GistResourceQuery +} + +type GistQueryResult = { + result: Response +} + +function createGistQuery( + resource: GistResourceString, + params?: GistParams +): GistQuery { + return { + result: { + resource: `${resource}`, + params: ({ ...dynamicParams }) => ({ + pageListName: 'result', + total: true, + order: 'name:ASC', + ...params, + ...dynamicParams, + }), + }, + } +} + +function usePagination( + refetch: QueryResponse['refetch'], + data?: unknown +): GistPaginator | null { + let pager: GistPager | undefined + + if (isDataCollection(data)) { + pager = data.pager + } + const getNextPage = useCallback(() => { + if (!pager?.nextPage) { + return false + } + refetch({ page: pager.page + 1 }) + return true + }, [refetch, pager]) + + const getPrevPage = useCallback(() => { + if (!pager?.prevPage) { + return false + } + refetch({ page: pager.page - 1 }) + return true + }, [refetch, pager]) + + const goToPage = useCallback( + (page: number) => { + if (!pager?.pageCount || page > pager.pageCount) { + return false + } + refetch({ page: page }) + return true + }, + [refetch, pager] + ) + + const changePageSize = useCallback( + (pageSize: number) => { + refetch({ pageSize: pageSize }) + return true + }, + [refetch] + ) + + return { + getNextPage, + getPrevPage, + goToPage, + changePageSize, + pager, + } +} + +export type GistPaginator = { + changePageSize: (pageSize: number) => boolean + getNextPage: () => boolean + getPrevPage: () => boolean + goToPage: (page: number) => boolean + pager?: GistPager +} + +type BaseUseModelGistResult = Pick< + QueryResponse, + 'loading' | 'error' | 'called' | 'refetch' +> & { + data?: Response +} + +export type UseModelGistResultPaginated = + BaseUseModelGistResult & { + pagination: GistPaginator + } +export type UseModelGistResult = + | BaseUseModelGistResult + | UseModelGistResultPaginated + +export const isDataCollection = ( + data: unknown +): data is GistCollectionResponse => { + // gist endpoints are always paged if they're collections + return (data as GistCollectionResponse)?.pager !== undefined +} + +type UseDataQueryOptions = Parameters[1] +export function useModelGist( + gistResource: GistResourceString, + params?: GistParams, + dataQueryOptions?: UseDataQueryOptions +): UseModelGistResultPaginated + +export function useModelGist( + gistResource: GistResourceString, + params?: GistParams, + dataQueryOptions?: UseDataQueryOptions +): UseModelGistResult + +export function useModelGist( + gistResource: GistResourceString, + params?: GistParams, + dataQueryOptions?: Parameters[1] +): UseModelGistResult { + const [gistQuery] = useState( + createGistQuery(gistResource, params) + ) + const queryResponse = useDataQuery>( + gistQuery, + dataQueryOptions + ) + + const pagination = usePagination( + queryResponse.refetch, + queryResponse.data?.result + ) + + return React.useMemo(() => { + const baseResult: UseModelGistResult = { + loading: queryResponse.loading, + called: queryResponse.called, + error: queryResponse.error, + data: queryResponse.data?.result, + refetch: queryResponse.refetch, + } + if (pagination) { + const result: UseModelGistResultPaginated = { + ...baseResult, + pagination, + } + return result + } + return baseResult + }, [queryResponse, pagination]) +} diff --git a/src/lib/routeUtils/CustomQueryParam.ts b/src/lib/routeUtils/CustomQueryParam.ts new file mode 100644 index 00000000..df64773a --- /dev/null +++ b/src/lib/routeUtils/CustomQueryParam.ts @@ -0,0 +1,9 @@ +import { encodeObject, decodeObject, ObjectParam } from 'use-query-params' + +const entrySeparator = '~' // default is "_" which breaks constants (delimited by _) + +export const CustomObjectParam: typeof ObjectParam = { + encode: (obj) => encodeObject(obj, undefined, entrySeparator), + + decode: (str) => decodeObject(str, undefined, entrySeparator), +} diff --git a/src/lib/routeUtils/index.ts b/src/lib/routeUtils/index.ts new file mode 100644 index 00000000..974d45db --- /dev/null +++ b/src/lib/routeUtils/index.ts @@ -0,0 +1,2 @@ +export * from './CustomQueryParam' +export * from './useSectionHandle' diff --git a/src/lib/routeUtils/useSectionHandle.ts b/src/lib/routeUtils/useSectionHandle.ts new file mode 100644 index 00000000..8d0f447b --- /dev/null +++ b/src/lib/routeUtils/useSectionHandle.ts @@ -0,0 +1,21 @@ +import { useMatches } from 'react-router-dom' +import { MatchRouteHandle } from '../../app/routes/types' +import { SchemaSection, Section } from '../../types' + +export const useSectionHandle = (): Section | undefined => { + const matches = useMatches() as MatchRouteHandle[] + const match = matches.find((routeMatch) => routeMatch.handle?.section) + + return match?.handle?.section +} + +export const useSchemaSectionHandleOrThrow = (): SchemaSection => { + const matches = useMatches() as MatchRouteHandle[] + const match = matches.find((routeMatch) => routeMatch.handle?.section) + + const section = match?.handle?.section + if (!section) { + throw new Error('Could not find schema section handle') + } + return section +} diff --git a/src/lib/schemas/index.tsx b/src/lib/schemas/index.tsx index f2b0c0cd..adb49860 100644 --- a/src/lib/schemas/index.tsx +++ b/src/lib/schemas/index.tsx @@ -1,2 +1,3 @@ export * from '../../types/schemaBase' export { useSchemas, useSchema, useSetSchemas } from './schemaStore' +export * from './useSchemaFromHandle' diff --git a/src/lib/schemas/useSchemaFromHandle.tsx b/src/lib/schemas/useSchemaFromHandle.tsx new file mode 100644 index 00000000..0010ba1b --- /dev/null +++ b/src/lib/schemas/useSchemaFromHandle.tsx @@ -0,0 +1,8 @@ +import { useSchemaSectionHandleOrThrow } from '../routeUtils' +import { useSchema } from './schemaStore' + +export const useSchemaFromHandle = () => { + const section = useSchemaSectionHandleOrThrow() + const schema = useSchema(section.name) + return schema +} diff --git a/src/lib/useDebounce.ts b/src/lib/useDebounce.ts new file mode 100644 index 00000000..d7fa2567 --- /dev/null +++ b/src/lib/useDebounce.ts @@ -0,0 +1,15 @@ +import { useEffect, useState } from 'react' + +export function useDebounce(value: T, delay?: number): T { + const [debouncedValue, setDebouncedValue] = useState(value) + + useEffect(() => { + const timer = setTimeout(() => setDebouncedValue(value), delay || 200) + + return () => { + clearTimeout(timer) + } + }, [value, delay]) + + return debouncedValue +} diff --git a/src/lib/useSectionHandle.ts b/src/lib/useSectionHandle.ts deleted file mode 100644 index 9d8d1059..00000000 --- a/src/lib/useSectionHandle.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { useMatches } from 'react-router-dom' -import { Section } from '../types' -import { MatchRouteHandle } from './../app/routes/types' - -export const useSectionHandle = (): Section | undefined => { - const matches = useMatches() as MatchRouteHandle[] - const match = matches.find((routeMatch) => routeMatch.handle?.section) - - return match?.handle?.section -} diff --git a/src/pages/dataElements/List.tsx b/src/pages/dataElements/List.tsx index d58967cd..4a70ac07 100644 --- a/src/pages/dataElements/List.tsx +++ b/src/pages/dataElements/List.tsx @@ -1,5 +1,69 @@ +import i18n from '@dhis2/d2-i18n' import React from 'react' +import { + SectionListWrapper, + SelectedColumns, + DomainTypeSelectionFilter, + ValueTypeSelectionFilter, + useQueryParamsForModelGist, + useSectionListParamsRefetch, +} from '../../components' +import { useModelGist } from '../../lib/' +import { DataElement, GistCollectionResponse } from '../../types/models' + +const filterFields = [ + 'access', + 'id', + 'name', + 'code', + 'domainType', + 'valueType', + 'lastUpdated', + 'sharing', +] as const + +type FilteredDataElement = Pick + +type DataElements = GistCollectionResponse + +const defaulHeaderColumns: SelectedColumns = [ + { + modelPropertyName: 'name', + label: i18n.t('Name'), + }, + { modelPropertyName: 'domainType', label: i18n.t('Domain') }, + { modelPropertyName: 'valueType', label: i18n.t('Value') }, + { modelPropertyName: 'lastUpdated', label: i18n.t('Last updated') }, + { modelPropertyName: 'sharing', label: i18n.t('Public access') }, +] export const Component = () => { - return
This is a list of Data Elements
+ const initialParams = useQueryParamsForModelGist() + const { refetch, error, data } = useModelGist( + 'dataElements/gist', + { + fields: filterFields.concat(), + ...initialParams, + }, + // refetched on mount by useSectionListParamsRefetch below + { lazy: true } + ) + + useSectionListParamsRefetch(refetch) + + return ( +
+ + + + + } + error={error} + data={data} + /> +
+ ) } diff --git a/src/types/generated/utility.ts b/src/types/generated/utility.ts index 30a9f2c4..76206d0b 100644 --- a/src/types/generated/utility.ts +++ b/src/types/generated/utility.ts @@ -5,7 +5,7 @@ import { IdentifiableObject, GistPager } from './' type ModelReferenceCollection = Array type ModelReference = IdentifiableObject | ModelReferenceCollection -type BaseGist = { +type BaseGist = IdentifiableObject & { apiEndpoints: GistApiEndpoints } export type GistApiEndpoints = { @@ -27,25 +27,29 @@ export type GistModel = BaseGist & { export type GistModelCollection = GistModel[] // a modelcollection with the keyprop -// need it's own type because the key is based on the resource +// need it's own type because the name of the list is based on resource or pagedListName query-param export type GistModelCollectionPart< T extends IdentifiableObject, - Resource extends string + PagedListName extends string = 'result' > = { - [K in Resource]: GistModel[] + [K in PagedListName]: GistModel[] } -export type GistCollectionResponse< - T extends IdentifiableObject, - Resource extends string -> = { +export type GistPagedResponse = { pager: GistPager -} & GistModelCollectionPart +} -export type GistObjectResponse = GistModel +export type GistCollectionResponse< + T extends IdentifiableObject = IdentifiableObject, + PagedListName extends string = 'result' +> = GistPagedResponse & GistModelCollectionPart + +export type GistObjectResponse< + T extends IdentifiableObject = IdentifiableObject +> = GistModel export type GistResponse< - T extends IdentifiableObject, + T extends IdentifiableObject = IdentifiableObject, R extends string = string > = GistCollectionResponse | GistObjectResponse @@ -99,6 +103,7 @@ export type GistParams = { order?: string page?: number pageSize?: number + pageListName?: string references?: boolean rootJunction?: 'AND' | 'OR' total?: boolean diff --git a/src/types/index.ts b/src/types/index.ts index 37428556..18fa41db 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -4,3 +4,4 @@ export * from './schemaBase' export * from './section' export type * from './query' +export * from './ui' diff --git a/src/types/query.ts b/src/types/query.ts index d4b9b55d..b4f9415f 100644 --- a/src/types/query.ts +++ b/src/types/query.ts @@ -3,3 +3,5 @@ import type { useDataQuery } from '@dhis2/app-runtime' export type QueryResponse = ReturnType export type Query = Parameters[0] + +export type QueryRefetchFunction = QueryResponse['refetch'] diff --git a/src/types/ui.ts b/src/types/ui.ts new file mode 100644 index 00000000..0d4c43cf --- /dev/null +++ b/src/types/ui.ts @@ -0,0 +1,22 @@ +// @dhis2/ui is not typed, so we need to create our own types for it. + +export type CheckBoxOnChangeObject = { + checked: boolean + name?: string + value?: string +} + +export type InputOnChangeObject = { + value: string + name: string | undefined +} + +export type InputOnChange = ( + value: InputOnChangeObject, + event: React.ChangeEvent +) => void + +export type SelectOnChangeObject = { + selected: string | undefined +} +export type SelectOnChange = (value: SelectOnChangeObject) => void diff --git a/yarn.lock b/yarn.lock index 758d49ed..4dca13af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1407,566 +1407,583 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@dhis2-ui/alert@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/alert/-/alert-8.7.7.tgz#a909c6182b3c7f6a421e70d8f356a8053ca67a01" - integrity sha512-kAqG+/q1E9ZxOs7D8nw58bq8Q0A9Lle/1Y03qIWLWzz+TDZt5m/YkVzWhEwUQv+uFynZXh6QPROIbH5/a9Yg2Q== +"@dhis2-ui/alert@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/alert/-/alert-8.13.10.tgz#c298180208f7bc4ecf29940796a43f502f98915b" + integrity sha512-3XB0ftudQUvaNPSuIQDyIWdFsxUnhiS7zoQBM5nArLjiW0JTwAuGB2W3UxpAZcaFQbjRZlaN9qEnDdLZ1YF4oQ== dependencies: - "@dhis2-ui/portal" "8.7.7" + "@dhis2-ui/portal" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/box@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/box/-/box-8.7.7.tgz#0ba4cb61fa087e80ef67fec8043cf509ef61f3c5" - integrity sha512-inS/ymN/xQH79rPlUGnFEslLiWmHXXicFy192imQD6TaGTmdvsxOU8kF4jzic9Qbwf8pYC8bwsxmvxBqVupJCg== +"@dhis2-ui/box@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/box/-/box-8.13.10.tgz#bde5b658a80170f2cd56e265083ae99a1130e191" + integrity sha512-aHzFERPRdG1L2NHRUE0qKNnn7DbRxdCxQ9IWRDSf8BTZDkm3ueiLfkLeGqkBxhjQpW3juGRSiXGZUfoFtqkrlw== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/button@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/button/-/button-8.7.7.tgz#7ddeb2b6e1d38ac5fe49f1cc688ea497e0c726d1" - integrity sha512-1BB+hFS2mdc0hc1F4FMgbH1Z8cQVT5193ibCNB1oaeT/lCtgGgpfplYAwKG7UriNI/WbDQMAmmW++QHan3+0Rg== +"@dhis2-ui/button@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/button/-/button-8.13.10.tgz#e230631bc4ede0afd7fee2696a5f0030710c9f2c" + integrity sha512-ZN36pQKc00HCqdCueT+uNf8kZNnm51YzusdiAbahIeX0OJMOK0YyxPfNamX7NoPYQ+6269wln37RmefSNBCVVw== dependencies: - "@dhis2-ui/layer" "8.7.7" - "@dhis2-ui/loader" "8.7.7" - "@dhis2-ui/popper" "8.7.7" + "@dhis2-ui/layer" "8.13.10" + "@dhis2-ui/loader" "8.13.10" + "@dhis2-ui/popper" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/card@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/card/-/card-8.7.7.tgz#cc0d953575aae4b0f8a669c2fe73ceaea5e6130e" - integrity sha512-mDDAhTqOIHy+pVNTp0NOyVR0nk2vE1oFaDWqacVZ+7mJFydjg7CMEQlZ4yZ5XmVl57D997pr8jSh/cnzyAATVQ== +"@dhis2-ui/calendar@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/calendar/-/calendar-8.13.10.tgz#aaa84dfa6f703cdd356c93a83588fa20e8a6a398" + integrity sha512-8nWYRpMFzrO/bfvNK6N50OgyQe6mrdLcILxhXi/NwGmPB5F+cU1qI/BSCAy5Qp6Jbb6Z/TVbTffWBdqW1HTRrA== + dependencies: + "@dhis2-ui/button" "8.13.10" + "@dhis2-ui/card" "8.13.10" + "@dhis2-ui/input" "8.13.10" + "@dhis2-ui/layer" "8.13.10" + "@dhis2-ui/popper" "8.13.10" + "@dhis2/multi-calendar-dates" "1.0.2" + "@dhis2/prop-types" "^3.1.2" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/card@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/card/-/card-8.13.10.tgz#938142f409460c2645cef0729b8290556171ba43" + integrity sha512-1LG8iSOGqlTlENP3O2Z8TKZ+TQfJhQZYrDED5z1zUDBbkxLSWLAD3cWbdvYtQTvgwKVhkNg1IVWF0+mB69a6LQ== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/center@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/center/-/center-8.7.7.tgz#f61ae07ef8a296922d91a35c04d39ce5deed0e00" - integrity sha512-3kPgCpmjO1kdexoooemM2e4jg98QPPFa6aypka+I4q+cQba5D/tYKVwIZAYN+QjzC15hCSbhf0k4yIZ9hs3M4A== +"@dhis2-ui/center@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/center/-/center-8.13.10.tgz#83a4f0e69e69185742e0ae960851df9efb199aac" + integrity sha512-kXijSnPd3ePZTKfnnPB9ufrdBH9Gxzl3Y4dThd4ZhZkKRlsEKvfgu/sN+cxlyojTnjJD/YiI5xAhyE5WhSvXHg== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/checkbox@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/checkbox/-/checkbox-8.7.7.tgz#ad333b7201c7bbf1ae554d571c6b03e5e3094484" - integrity sha512-Oc2fFH85Xcc7qqJIlBgUbeA7TTFLKvnSeMv2VcLZpv8ApQG2Onm8MtlVK86T72ZvXj529ejex6XRCjYWdbp+dQ== +"@dhis2-ui/checkbox@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/checkbox/-/checkbox-8.13.10.tgz#e994154cab4bb51e142080567c964fcda95bb61e" + integrity sha512-srcJ+FzxuAnzOl+mzh846++FcFqNzH7eBzctFwp2s6JhuekoRGAQh30pgdxlTXMO8aEKfPY+5q1vrw3VeR+YjA== dependencies: - "@dhis2-ui/field" "8.7.7" - "@dhis2-ui/required" "8.7.7" + "@dhis2-ui/field" "8.13.10" + "@dhis2-ui/required" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/chip@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/chip/-/chip-8.7.7.tgz#76ef229e8c452c2c8812666120be1128710f0614" - integrity sha512-fhfAg+y4gWKc7rntqGgNVD6Wth70sMybqrB11qykEhKLrZIPzqgYkfOTZmgS/ClV1ultnWXWOL+YZt3ak2FKqg== +"@dhis2-ui/chip@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/chip/-/chip-8.13.10.tgz#1a9aa5092950253cdaf2469b6036280b142ea698" + integrity sha512-If1odfD8dUHZ+s91H2auDTX6MaDqjW9DYhkczUYybDpZ3TVb7ohm5o5Anhlgv6mkwcgBKP7Xz9DtyjgkAZOwKw== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/cover@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/cover/-/cover-8.7.7.tgz#7d244c3505d98184504d9363add87b4a55d15a84" - integrity sha512-tibwsokBCVUufKdtpgTzD/+Kaw2o7/dwIQmfeF+gJ+18a7yxaXu3taXIqPegtKNz6xnQYkDixyTu1QJsolidHQ== +"@dhis2-ui/cover@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/cover/-/cover-8.13.10.tgz#33360b9b32897bed334d2fd8db4f5e3ddfe14a93" + integrity sha512-DNIfBz/RMIa7q4woLG2LtsKGYPjG7OaYsqIuckfNIsYNyLjQp9+WdoXONY+NXXfomoAN0PoOKudLMs177Ejg0Q== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/css@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/css/-/css-8.7.7.tgz#d014d7a5e2380b7d58e10eaf890a8867a8c8ed5e" - integrity sha512-lRjXrIaxvc6wCRJMcK14ksNR53s1wNej10DBtOZCJRANltXR4Uf2inwEJhNzWtR7m6Wufv4tKYZ67LtN3GMSjw== +"@dhis2-ui/css@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/css/-/css-8.13.10.tgz#bc2a2e0603a34557d9fb137abc3fe5d875f6822f" + integrity sha512-+SGTmTVR1wrdVhteTl1bPUJJMbcM2tFc040AGHR1yWSsqH8rxWx/GSZ7ezfHu32PCHKW8wXpS8jcV8/bqijF/w== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/divider@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/divider/-/divider-8.7.7.tgz#7f5c3f39fbda5a25d1b764bdb572ae642910a81d" - integrity sha512-DTAuBpnfsDZbvIIfPAfu/7oURL74ezNQQs+F09ad9EszJECKG24A49daKCXzdYr+ytsM7krl8WF2a0NoG/v8uA== +"@dhis2-ui/divider@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/divider/-/divider-8.13.10.tgz#69a20c2157b54439a3b7fac3d0474fbd7a23cf18" + integrity sha512-B+1d2uE3S7AwzUqHKr2PdsnTVqllIxxNTSgIdbd0BW7INEqh/Da1fVVXEX7Y5mdhlbPg0MoIDUGQgc0llqVAvQ== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/field@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/field/-/field-8.7.7.tgz#31363edac1715035d6fd1358f1f1c6bc819c0a0e" - integrity sha512-9TzJGzddbLqWBWTcHBZaXimPMAfSsa9c6kTMBZUJVtgZE3y1E8SsoiVEMY35e+ZAiij2cmJHjg2h0++DTLJvlA== +"@dhis2-ui/field@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/field/-/field-8.13.10.tgz#dc7e8148d846ce9d7c9d25e42068d219e0017e90" + integrity sha512-nQdyM+4iPNhIiSVbjQ8mVbl9QZa5hJToYBia3CXjuzYpVUzvs5574smpkcJ9HLu7s8I5SyMl0Bjcev7F6KJIhg== dependencies: - "@dhis2-ui/box" "8.7.7" - "@dhis2-ui/help" "8.7.7" - "@dhis2-ui/label" "8.7.7" + "@dhis2-ui/box" "8.13.10" + "@dhis2-ui/help" "8.13.10" + "@dhis2-ui/label" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/file-input@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/file-input/-/file-input-8.7.7.tgz#809983cc1b91bfc2488fcf2c287ae3d8ab50cffa" - integrity sha512-hgFS1UQbTM2EFPca/UluBoYdTqkIP1FNlsdCqDyI2OgiPsT5X0a0wgjfTLDPOy7HPHhalkOCz7xOxgyB9IbWOw== +"@dhis2-ui/file-input@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/file-input/-/file-input-8.13.10.tgz#3e052270c9abc932299931770fef49519f93ec18" + integrity sha512-pXwMcHxCkUh14Zidso+gRh1k1wJUVC62U43+cAM9B/CNkhDzcp704NgrtlTDvdN6n3WJ9vHTDPzUd+grOuwNag== dependencies: - "@dhis2-ui/button" "8.7.7" - "@dhis2-ui/field" "8.7.7" - "@dhis2-ui/label" "8.7.7" - "@dhis2-ui/loader" "8.7.7" - "@dhis2-ui/status-icon" "8.7.7" + "@dhis2-ui/button" "8.13.10" + "@dhis2-ui/field" "8.13.10" + "@dhis2-ui/label" "8.13.10" + "@dhis2-ui/loader" "8.13.10" + "@dhis2-ui/status-icon" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/header-bar@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/header-bar/-/header-bar-8.7.7.tgz#4850f9c1b760762ec9ba06fe165fc996f66de37a" - integrity sha512-S/Alqi4CCXIG49NorOCF3ItCGjZtHw6qS6J42yV7WNNMicDdz0y4bnQWZEibFrUSneVHbWLI/LE6afKKwZ+WHg== - dependencies: - "@dhis2-ui/box" "8.7.7" - "@dhis2-ui/button" "8.7.7" - "@dhis2-ui/card" "8.7.7" - "@dhis2-ui/center" "8.7.7" - "@dhis2-ui/divider" "8.7.7" - "@dhis2-ui/input" "8.7.7" - "@dhis2-ui/layer" "8.7.7" - "@dhis2-ui/loader" "8.7.7" - "@dhis2-ui/logo" "8.7.7" - "@dhis2-ui/menu" "8.7.7" - "@dhis2-ui/modal" "8.7.7" - "@dhis2-ui/user-avatar" "8.7.7" +"@dhis2-ui/header-bar@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/header-bar/-/header-bar-8.13.10.tgz#87981f1eff64d66b85b6f165e86ac9392134e4a0" + integrity sha512-QJ3740rxFd7ajYgphZ3tSnoQscCNtJdrNdpcQeZOQAkWprqA8Zb9smR3qlTRca6p/iLQ1jwWHwgGomD5WNn16Q== + dependencies: + "@dhis2-ui/box" "8.13.10" + "@dhis2-ui/button" "8.13.10" + "@dhis2-ui/card" "8.13.10" + "@dhis2-ui/center" "8.13.10" + "@dhis2-ui/divider" "8.13.10" + "@dhis2-ui/input" "8.13.10" + "@dhis2-ui/layer" "8.13.10" + "@dhis2-ui/loader" "8.13.10" + "@dhis2-ui/logo" "8.13.10" + "@dhis2-ui/menu" "8.13.10" + "@dhis2-ui/modal" "8.13.10" + "@dhis2-ui/user-avatar" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" moment "^2.29.1" prop-types "^15.7.2" -"@dhis2-ui/help@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/help/-/help-8.7.7.tgz#344e624c1fd42c2fdedac1271e7e9b1bc65ed465" - integrity sha512-r74kUbMdJbYviCJTpF56T2c1n+JohXEcd9886ArknSLQ2+zrtyzg2Imr32tHSHHyhjGRJN1oOZSghiWlfXu0Cw== +"@dhis2-ui/help@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/help/-/help-8.13.10.tgz#fab3d4980a8c92152755b753cd4a00c1bc10c2dd" + integrity sha512-mmZw0ON4krOzdDJKA31cLqWttCJgDn0oAQ1k7B5PqdeX/Gosc0TONjz0Rm/g5sZqkLC5l4IoWXW4Q+4LelbafA== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/input@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/input/-/input-8.7.7.tgz#e01e0407452d31fcb4df48c7ae74ef2e55c54d6f" - integrity sha512-AohkES9IEimDLKNyt/Ov2V0XUToW8QAmx1uPo0EucsStBeNvYb+4B7H5CKZrmRyKCd+BUh3ot2ZK/oaSnvUmEA== +"@dhis2-ui/input@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/input/-/input-8.13.10.tgz#2ad8f0d06d1d5f9e722bd9c308db18d2fa55b64e" + integrity sha512-PLBYdb/MislatP7gOjOjJc+YprzgnKW4mipMPJlQfIqk9qN9dd14yXl5wuSV60jdxe1Zra3HBw5NQtceN6v3gQ== dependencies: - "@dhis2-ui/box" "8.7.7" - "@dhis2-ui/field" "8.7.7" - "@dhis2-ui/input" "8.7.7" - "@dhis2-ui/loader" "8.7.7" - "@dhis2-ui/status-icon" "8.7.7" + "@dhis2-ui/box" "8.13.10" + "@dhis2-ui/field" "8.13.10" + "@dhis2-ui/input" "8.13.10" + "@dhis2-ui/loader" "8.13.10" + "@dhis2-ui/status-icon" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/intersection-detector@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/intersection-detector/-/intersection-detector-8.7.7.tgz#58f0a864c02e9abd0f6e8f0592c53e5b47f0ad0f" - integrity sha512-GvoGxVvmb/fsh4G+e42w4LZQ6qyMayRljDTwWfRUbgadwcK+3pTc4o2P3Oi39+fH9g5CDg44gjUEvb0d9wRj8g== +"@dhis2-ui/intersection-detector@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/intersection-detector/-/intersection-detector-8.13.10.tgz#e6dc60a9d305c772a53248decd23c296176be965" + integrity sha512-FcsZ8tNV4ufeVkLHzdH91dDPvAwK7VLcOwZRpnWkUNtboAox2wshAClPDfo6M+4u9P0ubWJRPnmvQu0WUrKV1w== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/label@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/label/-/label-8.7.7.tgz#d64ece6409e5091c0435b680fad360946a3b966b" - integrity sha512-H0UoiPeLy2eku74NQbbBQVc6ly1eXHUmP3JSPOb/utfPag4E2sVm4f8mMjbCvRJP37lOmVvoZP3nrkDJevWllw== +"@dhis2-ui/label@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/label/-/label-8.13.10.tgz#7d556513f6053e8d20ee5a3ca1a0174251b3c980" + integrity sha512-yQaK+53TZ12KJpztVTh7noLMwVgx4fWNfxGr5RwR1a2yfB7IfsaYdt+o9FElAK6Nbj6Yhzx3Fwj1uAfyQ7zCiA== dependencies: - "@dhis2-ui/required" "8.7.7" + "@dhis2-ui/required" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/layer@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/layer/-/layer-8.7.7.tgz#dd2c538885db52486a2da9c5cb1a35f4f91f1b04" - integrity sha512-hhZEL+iO1Tm6sdVuOUyjgXs20Bi8idpv4Grw8lMGUHVCTIAOzD0FoHReV7lmUYFK/aKWQHhr6s7wKOugv4wBng== +"@dhis2-ui/layer@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/layer/-/layer-8.13.10.tgz#ff1a462fb5b09f102b5999dbb96855b7efcefcf4" + integrity sha512-x6/HqcCJtBBSGdjkosIkC2mDxAlUq1/WxO7ze6jtL2Hxtuw3E1IKXf/+g+VxH8j/l9CJ6tVkZHhiunZ3AbpDoQ== dependencies: - "@dhis2-ui/portal" "8.7.7" + "@dhis2-ui/portal" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/legend@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/legend/-/legend-8.7.7.tgz#e66afa0d973e68c0d0166cc089e5258a333faf01" - integrity sha512-a2E+rdgGn6VNHXS0+OVu8V26kWaZ8HNnK7eo/o1swaKaEVQHC4jzQLPwWWBiZTDHxj6A5tevoMV1FduG1M2a6g== +"@dhis2-ui/legend@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/legend/-/legend-8.13.10.tgz#b8b0865f6485a26e6731cc9fa78d101e8b0fc834" + integrity sha512-FDQI4EwGe5nu8UXsgv/FEP7MqBPyn+iDXyHV8p5cWlg82vwg7VwivlmoavuhC+Xx7vp2Zb07Ipl6hZFhdRsmLA== dependencies: - "@dhis2-ui/required" "8.7.7" + "@dhis2-ui/required" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/loader@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/loader/-/loader-8.7.7.tgz#478b5290223e5b02669820ebb48301163313b45d" - integrity sha512-IA3AJMCkVj4G3mBIYvdzij1AsPYATI4ToMGhvOdwwTc0uGMbXU6yFs9GRXRB9DaR2qrSgsCO94f7cfRe31HR6g== +"@dhis2-ui/loader@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/loader/-/loader-8.13.10.tgz#4f0b29dc16bd417750ea78c3fd95544aa653f6d9" + integrity sha512-XUnwubWctfS/dym2bL5TgMLs/ReznSDfIyD1KRWTASU7bxToZeolkKOCDtpSsMBVCJwbpfpIRmN2b2xopj3+7A== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/logo@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/logo/-/logo-8.7.7.tgz#775850958b967111b7b9f6a2ac676fea7babe238" - integrity sha512-Dv3ui2Pcf2L9F42AyodgcFqEM/0P95WNEtJ3vnKSK1vaiNRIDyxPPLJQmmOMSS+fUx0WKoW+SzB5e4MYdK7k4g== +"@dhis2-ui/logo@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/logo/-/logo-8.13.10.tgz#f997fd5d695daf180f56f8389aa41366e739b38e" + integrity sha512-9JP9T5yaLTvnH8XblNPNVKnvVbDbomD3ah4jsKhk0Tok1KA/roMo5QTw7jcihucbPz6QTscjQbxxnWlTMDiCPg== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/menu@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/menu/-/menu-8.7.7.tgz#8d35e0d55e111842b3aec64d80043ce2841927f5" - integrity sha512-wQo4LfMpIs6c87O20ix2PVeCfHBexSGFq5KMcNNlG9IFMuOgkfinCA3+Irw6AZ4a3iBGmABdqdszuFWo622Rvw== +"@dhis2-ui/menu@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/menu/-/menu-8.13.10.tgz#ecbaec3267f6451297dd7e1779f8b0ed4d26aee3" + integrity sha512-67f7x1ibxSXLhSqsdEBFi8DIaMwLzIs7BtrIT83i6Tb7+PI2okXdH8ItWAwKYgdQGWuWF5MDJ6V1PyJiNIfnpQ== dependencies: - "@dhis2-ui/card" "8.7.7" - "@dhis2-ui/divider" "8.7.7" - "@dhis2-ui/layer" "8.7.7" - "@dhis2-ui/popper" "8.7.7" - "@dhis2-ui/portal" "8.7.7" + "@dhis2-ui/card" "8.13.10" + "@dhis2-ui/divider" "8.13.10" + "@dhis2-ui/layer" "8.13.10" + "@dhis2-ui/popper" "8.13.10" + "@dhis2-ui/portal" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/modal@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/modal/-/modal-8.7.7.tgz#06de96053d46d29417cf091dac7a6daf6fb9e4a0" - integrity sha512-yCVHLzNixz/o65BAs9hjEddk7WQUEFVhEj1FswY0x7P0Jfnmkxf4jFAZ09GS18h4l3Df60x03s/vu558f7gW2w== +"@dhis2-ui/modal@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/modal/-/modal-8.13.10.tgz#a581a0036a4a7c1f6ed9ffd3a77b357bb2cf7ecb" + integrity sha512-uPjLJc4nRDrjyJFcwLhqrW94SgypX2FbHID98H2OFdFHVjR38PWkf87w08pnjEsFLf4M288wEq6rv75m6vsfSg== dependencies: - "@dhis2-ui/card" "8.7.7" - "@dhis2-ui/center" "8.7.7" - "@dhis2-ui/layer" "8.7.7" - "@dhis2-ui/portal" "8.7.7" + "@dhis2-ui/card" "8.13.10" + "@dhis2-ui/center" "8.13.10" + "@dhis2-ui/layer" "8.13.10" + "@dhis2-ui/portal" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/node@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/node/-/node-8.7.7.tgz#398aa8d512310daa15b36ad1335e10121dd22bb4" - integrity sha512-RMidPD3ZqQ0e7Tm59Yhq7brylh9VdsqYZ7iv+NR+B+nCPJ6gylDb1HoiSekpCZjLlXFBHvS65l4HNAGsgmiNqA== +"@dhis2-ui/node@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/node/-/node-8.13.10.tgz#3f7e75c483eb63137b64c22d0fa2c23a51b741f7" + integrity sha512-63VdT8eQTuVJXI2ECVLayJcFH3qE1kD3EfrGdRI3+iSMJ6tJjtGm6ZpD1IeYm48FxrPkEJKoI1SYQpNLiYpR0Q== dependencies: - "@dhis2-ui/loader" "8.7.7" + "@dhis2-ui/loader" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/notice-box@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/notice-box/-/notice-box-8.7.7.tgz#86fc47914c068dfc53c28db0857b81a961d1e10f" - integrity sha512-H3X54BP7HzBXk/2DJvQMd3Sv4hG367WtGq6KTbx38puviYSWxcU8L3sbeaeGR1w6tQ5TK4szzehN7rsWKQB+Nw== +"@dhis2-ui/notice-box@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/notice-box/-/notice-box-8.13.10.tgz#1bf76c0da6c4bb70d1efbba56c65df3cd340da37" + integrity sha512-6h+oC5JA8vZuJNb7UB3vj6pL6UTAhC815AIjRyK0IvwYKb6Vke1p2fRk/reK3NJ7nz+3H1wkAPNAm8qf09oiEA== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/organisation-unit-tree@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/organisation-unit-tree/-/organisation-unit-tree-8.7.7.tgz#ad9cab66f7833bcc7c65e883539713c791d4a440" - integrity sha512-g84/VWnxaMMHNfrq80xBDp6/NVJqb/7MCtp+vfP3/cRzj6BW3/P6Ts0fM1gzr2Hvo4D8rGv9JPtECKa7Z0d5ow== +"@dhis2-ui/organisation-unit-tree@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/organisation-unit-tree/-/organisation-unit-tree-8.13.10.tgz#bd9e085641634e069b528633f37f12b5edbff385" + integrity sha512-tWfE3T+/ufDhsbQl2QnSmNq3aAn5a8OyWaYyQJRRjQ1kIhCgfeu2aNU8Lo/8o2u7iCiXzXoHXU1pNQSGMckLsQ== dependencies: - "@dhis2-ui/checkbox" "8.7.7" - "@dhis2-ui/loader" "8.7.7" - "@dhis2-ui/node" "8.7.7" + "@dhis2-ui/checkbox" "8.13.10" + "@dhis2-ui/loader" "8.13.10" + "@dhis2-ui/node" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/pagination@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/pagination/-/pagination-8.7.7.tgz#efa73285abfee67f21768be9175ffc4c44f88dd3" - integrity sha512-2jXs6XaatGR+Q77dNJWduguLytayYi2vmNdBkovTcfXMznuTQdIOY5uS5FIUWo2vb1nsr7LPcErNzo8r2Nf8Hw== +"@dhis2-ui/pagination@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/pagination/-/pagination-8.13.10.tgz#36e80072d96f0f9d528b738ad28aec598dfe2fb6" + integrity sha512-/EIbRjnWB8AwB/MpX93fV2zdF4YRSh0s8Mqr3CPDAh1A3iN7YXwbXvtMVXY6ll2snE1Iu4mTwrlDsuLxLncLog== dependencies: - "@dhis2-ui/button" "8.7.7" - "@dhis2-ui/select" "8.7.7" + "@dhis2-ui/button" "8.13.10" + "@dhis2-ui/select" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/popover@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/popover/-/popover-8.7.7.tgz#e31d24bd9b7ac68ed1ee51d4781e0a8142551224" - integrity sha512-aeLAQx9Jy7PxJzC98fQo4s0MPKYqqLnFInLDgy5gDT6hI6IxkA3K1LRYS/2fVD/Hy1NB+UYIbyVr+8hFZz1UtA== +"@dhis2-ui/popover@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/popover/-/popover-8.13.10.tgz#b87f69197a70aa8d3838e0044e9a9ba7c58256a8" + integrity sha512-nF0pBUKvOxbCX24vChuiqX+jG3pyPdGoTNGgHixud+mShG7WIIeav8v/jj/KkRjfBdlay3UKNYbI+wIhy6zDww== dependencies: - "@dhis2-ui/layer" "8.7.7" - "@dhis2-ui/popper" "8.7.7" + "@dhis2-ui/layer" "8.13.10" + "@dhis2-ui/popper" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/popper@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/popper/-/popper-8.7.7.tgz#9a31ab9509aee31988b568333c8c3c5ec0c5edde" - integrity sha512-FOJR7+SB6iOr28O/KDrm4cczv1IeQs7aX0NrbSH28vNzbjLMfT4YkkSSWV/dQbbu9FtMKaSLktOHfFTmB89ilw== +"@dhis2-ui/popper@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/popper/-/popper-8.13.10.tgz#b732808cc6dfa7e4874d5b36320a41e72a77c092" + integrity sha512-UsK9cl6S8KGkduDogVIB/ZK4BJn73ba0du3mQLKAejmNFvKdF88KQub4FZrU0acfFIdKwttQT34APVv80G98qA== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" "@popperjs/core" "^2.10.1" classnames "^2.3.1" prop-types "^15.7.2" react-popper "^2.2.5" resize-observer-polyfill "^1.5.1" -"@dhis2-ui/portal@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/portal/-/portal-8.7.7.tgz#0b25bbb39f4b63d4080bd77173b74e86d19af5c6" - integrity sha512-DAr62e5GLapTtftv6tkio8mDFDOmuNinkl72UuVJ75XIa2S+F2yIDN33bbABRZLN6Hi62h0Cei4oDxjQWpcdCw== +"@dhis2-ui/portal@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/portal/-/portal-8.13.10.tgz#05be783522f3f3e696804fa5dfb9d6d6bb77618f" + integrity sha512-DySgV5ADd0iacFckHwY20JTcCxVP7KgIkAfexcJGKTC2K8VDighguC8UxJNhVXUzNnapZeLupvpHW8m6x6seew== dependencies: classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/radio@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/radio/-/radio-8.7.7.tgz#6550048c17b52fbfabb01e737570bfa0c3788342" - integrity sha512-6/age99SmT9vi8Yg7fZFq6oKeEYMwZNrdLaTF/5fDZ7cuLOz+0YwR/H2rfn1WLqcCAmfJuOQVxFcFEHMDeRxAQ== +"@dhis2-ui/radio@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/radio/-/radio-8.13.10.tgz#04967451be5bbb45988305dcdd38f21adc7d7b50" + integrity sha512-wD04X+RBbfi3671g0j1PJ8n7GtSA66iAeKZrzWixgIEv4FdvuMAWQepELaVcs/Z38Rwj1UPh7DoXqfUienuezw== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/required@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/required/-/required-8.7.7.tgz#bdd810b4386e09df412f6d71e1434edb7ccbe985" - integrity sha512-Ro1UgXGqRZizRKrPnDSoXAOzzLOmR//905JBthRO7CtQV7Uqyn/Vh2+dKnJ3Z8g6ee8zt/zLMh3sUzILSFUzgg== +"@dhis2-ui/required@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/required/-/required-8.13.10.tgz#438e2a5913f827e38d4e550ce72cafd5b500990f" + integrity sha512-aVOJ4rKgKH4b0xoYB1zsUXShLcTV+Out3mmBFGrEMYyXe0hPYWPVKWelliQvPubgltlcBIEB0Ymcs4lR4WWWgQ== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/segmented-control@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/segmented-control/-/segmented-control-8.7.7.tgz#0a8607a08b6eea0277afb393f93301c427e976b1" - integrity sha512-gRnYKSKd2eAtuyIBLyQRtu7Y+A7L4k1wx63rNVDn5NQ5Kb6ObjAGKDpFC7zBq+WFOTavR0CH2t48Nyhhqlz/pQ== +"@dhis2-ui/segmented-control@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/segmented-control/-/segmented-control-8.13.10.tgz#675acc2a3812429a9a147e49b7c54c73bed7712d" + integrity sha512-jh6iqfKIcHcDIMiG8/IjqIujkDNEWZFz3emsipPb7qDWyL0UZBJ4W72b9ybfFh0svj37caX3deZGSnnXM5Pweg== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/select@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/select/-/select-8.7.7.tgz#3268624ea3f9bab29b3489143d615e31b1ce6d46" - integrity sha512-sP1xlhtUtlsbEZFV3BVipI6EDDEvIKbKB4LnXwfkhlI9aJM9n/f3gIpLVWENqdH4nh+tOSm2kBXLJIzfUDYoTw== - dependencies: - "@dhis2-ui/box" "8.7.7" - "@dhis2-ui/button" "8.7.7" - "@dhis2-ui/card" "8.7.7" - "@dhis2-ui/checkbox" "8.7.7" - "@dhis2-ui/chip" "8.7.7" - "@dhis2-ui/field" "8.7.7" - "@dhis2-ui/input" "8.7.7" - "@dhis2-ui/layer" "8.7.7" - "@dhis2-ui/loader" "8.7.7" - "@dhis2-ui/popper" "8.7.7" - "@dhis2-ui/status-icon" "8.7.7" +"@dhis2-ui/select@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/select/-/select-8.13.10.tgz#adbaf7c1c299b1b24c8f1e409a66962c806e7e29" + integrity sha512-Y5fDF2DBG3YMGhw7qSOFKWb41+f6SutQDP5cZckoNlNCBXTe/89O5PW96Yh/ruJ3bFg+l4HzafTa4f4Z2H7F/g== + dependencies: + "@dhis2-ui/box" "8.13.10" + "@dhis2-ui/button" "8.13.10" + "@dhis2-ui/card" "8.13.10" + "@dhis2-ui/checkbox" "8.13.10" + "@dhis2-ui/chip" "8.13.10" + "@dhis2-ui/field" "8.13.10" + "@dhis2-ui/input" "8.13.10" + "@dhis2-ui/layer" "8.13.10" + "@dhis2-ui/loader" "8.13.10" + "@dhis2-ui/popper" "8.13.10" + "@dhis2-ui/status-icon" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/selector-bar@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/selector-bar/-/selector-bar-8.7.7.tgz#f18466831742d3a97e11c38b378c8014f680295c" - integrity sha512-fSNyrl0xijrIzCRKFHbHM1X2d5VkoOOEX2FhsXE0V4KY+nXGUzdF3Nxm84mrOjfVUjwZk09ilDY+stQhBCmbeg== - dependencies: - "@dhis2-ui/button" "8.7.7" - "@dhis2-ui/card" "8.7.7" - "@dhis2-ui/layer" "8.7.7" - "@dhis2-ui/popper" "8.7.7" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" +"@dhis2-ui/selector-bar@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/selector-bar/-/selector-bar-8.13.10.tgz#5bfaa6f46397384c0161ba87603e2345e4852f96" + integrity sha512-Wa6vGpn4RfjgSC2+Fiw9xzi/rrNen3pUMhUg6KBRqtOtOUQkZzTa/5WEfWqw/IYUGiG1u9vD0BFzI9aiVsX1kA== + dependencies: + "@dhis2-ui/button" "8.13.10" + "@dhis2-ui/card" "8.13.10" + "@dhis2-ui/layer" "8.13.10" + "@dhis2-ui/popper" "8.13.10" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" "@testing-library/react" "^12.1.2" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/sharing-dialog@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/sharing-dialog/-/sharing-dialog-8.7.7.tgz#19ae6f15985ca002782030833ddb659bb210513b" - integrity sha512-pxmzKODQ/AYSks7gYDKjmAq+Sr4TJfsYJksPpGViHc4Qoa/ym7Yez4vTaYyC3FlBRUEs0tj9qATXcD+kAT8f4w== - dependencies: - "@dhis2-ui/box" "8.7.7" - "@dhis2-ui/button" "8.7.7" - "@dhis2-ui/card" "8.7.7" - "@dhis2-ui/divider" "8.7.7" - "@dhis2-ui/input" "8.7.7" - "@dhis2-ui/layer" "8.7.7" - "@dhis2-ui/menu" "8.7.7" - "@dhis2-ui/modal" "8.7.7" - "@dhis2-ui/notice-box" "8.7.7" - "@dhis2-ui/popper" "8.7.7" - "@dhis2-ui/select" "8.7.7" - "@dhis2-ui/tab" "8.7.7" - "@dhis2-ui/tooltip" "8.7.7" - "@dhis2-ui/user-avatar" "8.7.7" +"@dhis2-ui/sharing-dialog@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/sharing-dialog/-/sharing-dialog-8.13.10.tgz#5d2eb77bb17b31d247092a66106f1a5a92be30a7" + integrity sha512-Ne/e1n/dL3GKZYlaub9GZO/EoGXTvsCFy5wvHvbrfdG+zJ/nNqBDcr+yIGf+oMCOAaHFipCKphQPBDC9LYu5aw== + dependencies: + "@dhis2-ui/box" "8.13.10" + "@dhis2-ui/button" "8.13.10" + "@dhis2-ui/card" "8.13.10" + "@dhis2-ui/divider" "8.13.10" + "@dhis2-ui/input" "8.13.10" + "@dhis2-ui/layer" "8.13.10" + "@dhis2-ui/menu" "8.13.10" + "@dhis2-ui/modal" "8.13.10" + "@dhis2-ui/notice-box" "8.13.10" + "@dhis2-ui/popper" "8.13.10" + "@dhis2-ui/select" "8.13.10" + "@dhis2-ui/tab" "8.13.10" + "@dhis2-ui/tooltip" "8.13.10" + "@dhis2-ui/user-avatar" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" "@react-hook/size" "^2.1.2" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/status-icon@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/status-icon/-/status-icon-8.7.7.tgz#ab4f0094c6c5a287d54bed1a88416a2ca763c154" - integrity sha512-HMxry7oJWVnrgJsg7cCRkqy+46suRL1JlIGc7r4UNWCK5WMROsqrTAbbBJpI6r8fgGzKHVbLPjbP15WK7kMNIA== +"@dhis2-ui/status-icon@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/status-icon/-/status-icon-8.13.10.tgz#1260b0099bc70011c28fd81ff37bf54ef43f9743" + integrity sha512-W3+gPTTtlNkHoeWuSvVhOTuf+PtQBxWFBSDDuxN99AlJPk6O+XTbl6z/7CTcf6K2pKSAHbpc1sqbY6Eoiy/kog== dependencies: - "@dhis2-ui/loader" "8.7.7" + "@dhis2-ui/loader" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/switch@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/switch/-/switch-8.7.7.tgz#fadb692913aaeb1989696cbb439f44ddcac85a13" - integrity sha512-tb0J0XUusztt4vN8ZRs4EOyvuiAHwSLJvfRcZ0XUNAjfeJwhsZMGRL8hUM7rDE40LP5s2dF+SLeZ4oUv/ytF5Q== +"@dhis2-ui/switch@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/switch/-/switch-8.13.10.tgz#531eee0a74ad956004648b4508909889b59a2429" + integrity sha512-GatHs6xCor559JsVjfbEdmp7ZEdDUsN4my43kWBGYj611fgKgLqF3iqUOPom0eyn5acxRtd2gDAd6se1jJpMKQ== dependencies: - "@dhis2-ui/field" "8.7.7" - "@dhis2-ui/required" "8.7.7" + "@dhis2-ui/field" "8.13.10" + "@dhis2-ui/required" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/tab@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/tab/-/tab-8.7.7.tgz#91168ba3510d7932e01098a5b487ad16920a3267" - integrity sha512-R6UwJa87a1KByz9MY9XzIdiVYCDICwlRHdgSgu/iBq+LNhbFnKHq7oQuExI24SzDicYYJwcdBkB5fR07AKz5mQ== +"@dhis2-ui/tab@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/tab/-/tab-8.13.10.tgz#aceda14aea299bcfe7c2cabdbdc70c057e2d834f" + integrity sha512-qnVwDwlZAimGLEFarOlLUc3oS8oFrRR4niwZk/iPprrTZV5snthnmkZFrITE0CvWvmoOmd2KwiKEdq47xEuELw== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/table@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/table/-/table-8.7.7.tgz#77cab7d0357e92137c3dcc6ad38107ec5c3ee2a6" - integrity sha512-D9Le3DvsZd6D3P+rgmaom5pL1rhNKFH7iwhL/8k38ifsoI0xiTxrK9g9aD5W/0rxfSH0rjOcjb9U/fNg8rp10g== +"@dhis2-ui/table@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/table/-/table-8.13.10.tgz#853400e83eb166a1769a94c9035758663d31ebd1" + integrity sha512-q2zi4t3w+gkg7wnIAGXEE6C9SPt5kNFYqIcQ8nSeexU2c5i+MkzalH3WpEqS5rq6CF9gHkCQ2DZ5GI3Pi+AEFw== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/tag@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/tag/-/tag-8.7.7.tgz#8f6b81ef2f54ed8e6749552871f559d2870397df" - integrity sha512-B7oU/wvZ/4TSxXVQr5OQWx4bB9dZ+TrTrjZigLbTRLf7L4Kl4wdyciCMBIIPHvvLaJPKGUItuKCJSDk4y7IuEQ== +"@dhis2-ui/tag@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/tag/-/tag-8.13.10.tgz#3a7dee10785692c8031bd5a2af6b0f5356e11723" + integrity sha512-bxygOblNPIu97k6yICFgFvqavqRsimwEbCQTpKJfhgsNcm8egGjgmt6lv2uWSgq3s5ypp5kpz6nvlYBe/sOM1w== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/text-area@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/text-area/-/text-area-8.7.7.tgz#031da32c454cffaa590dcc75377fae58026ddd3f" - integrity sha512-Ux36zKW+w0fgk1WANrtWldqfolnqP8/065dvyp2HG+Uvvr30oGIvCGWd8eZq8wpmGEYR4tBbVQl9kLqRdr/gpA== +"@dhis2-ui/text-area@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/text-area/-/text-area-8.13.10.tgz#aedfc1ec6275570e1931c7a39aa1eac14f83ef6a" + integrity sha512-al7FSd2Mb6uZtwauY4PA+jrgPMIjMpXgavEkcfzANoBa9GKflCYJobFNq24ZmJDRxl9UgbF/CdCzCfmHkHlokw== dependencies: - "@dhis2-ui/box" "8.7.7" - "@dhis2-ui/field" "8.7.7" - "@dhis2-ui/loader" "8.7.7" - "@dhis2-ui/status-icon" "8.7.7" + "@dhis2-ui/box" "8.13.10" + "@dhis2-ui/field" "8.13.10" + "@dhis2-ui/loader" "8.13.10" + "@dhis2-ui/status-icon" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-icons" "8.7.7" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-icons" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/tooltip@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/tooltip/-/tooltip-8.7.7.tgz#25b62ddb4ccb465435f036b49f8b1ac239b5bab3" - integrity sha512-n5dmLI+boMXH8O569SaYcf/F337TDtR0SnCXCC4aIkpb9wtFpxTtx7FeHERxkwiiC3Z3QyRx5oott2tcmIaxVw== +"@dhis2-ui/tooltip@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/tooltip/-/tooltip-8.13.10.tgz#3372a031c2ffbcd2c54a6fc4509bfc55c50e7d51" + integrity sha512-KtZvCju4CXjZ9vQxUOskSKLVVYwkfGUa6vVa5c64pKdNK4xOnpcbWp7CZpbsRrxphKr16/WmjpJCH/7tu/tO5A== dependencies: - "@dhis2-ui/popper" "8.7.7" - "@dhis2-ui/portal" "8.7.7" + "@dhis2-ui/popper" "8.13.10" + "@dhis2-ui/portal" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/transfer@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/transfer/-/transfer-8.7.7.tgz#05bcd0a86121296dced7d76a0dcea634bc3600d1" - integrity sha512-vEYXG2innjdBUa3tD+Rab83ZxYt9mOwnYKw94dUbdSdGQkdeXaJI4Iw8ept4AvBrwLtZej3wWdWsGGXGiEOMIA== +"@dhis2-ui/transfer@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/transfer/-/transfer-8.13.10.tgz#369adb4394955a185994537ca44db551bfb7d18a" + integrity sha512-jiHqwbaiNXU6UHrvbpWSQF+RXEMOFoSamOWGImvCMy2NZr/98Kq5pAELOQaL9SgW6PAGgqDaIcCE76ehgGIAOw== dependencies: - "@dhis2-ui/button" "8.7.7" - "@dhis2-ui/field" "8.7.7" - "@dhis2-ui/input" "8.7.7" - "@dhis2-ui/intersection-detector" "8.7.7" - "@dhis2-ui/loader" "8.7.7" + "@dhis2-ui/button" "8.13.10" + "@dhis2-ui/field" "8.13.10" + "@dhis2-ui/input" "8.13.10" + "@dhis2-ui/intersection-detector" "8.13.10" + "@dhis2-ui/loader" "8.13.10" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/user-avatar@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2-ui/user-avatar/-/user-avatar-8.7.7.tgz#865e5d157b4292c70dd7d699c9f0bac7ee76c83f" - integrity sha512-NJM1gBMH2dh2HMmRkC0t4HKBjO5oyPW2GRRnae5VpSYxv+lKmak/0YF8Zw/1lgoJ+TN+dg3e4NFxJi2FzO4hlA== +"@dhis2-ui/user-avatar@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2-ui/user-avatar/-/user-avatar-8.13.10.tgz#25c20816fb333eca1229c63085f3f14a798cf142" + integrity sha512-IRWKDss24ntp1Pk6v1a26Mulo+bfv4Mtr1qpYJoDp9xyqmsUqguoA+F9yEN9yXGajGMoe2zTV7Kk2Taz8L1OcQ== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.7.7" + "@dhis2/ui-constants" "8.13.10" classnames "^2.3.1" prop-types "^15.7.2" @@ -1978,7 +1995,7 @@ "@dhis2/pwa" "10.2.0" moment "^2.24.0" -"@dhis2/app-runtime@^3.6.1", "@dhis2/app-runtime@^3.9.4": +"@dhis2/app-runtime@^3.6.1", "@dhis2/app-runtime@^3.9.3": version "3.9.4" resolved "https://registry.yarnpkg.com/@dhis2/app-runtime/-/app-runtime-3.9.4.tgz#88243dbb9a4a805be744a61cffd13a4c3d2d031d" integrity sha512-CBwMXer5/Kcxf6MgfwPgpEaUSXbDXzwItCkH3i0nsjmkD0KIaEOZ6Y1pQL+/5RYnziZ5glYCFWsCKn0eCJrdJg== @@ -2146,6 +2163,14 @@ i18next "^10.3" moment "^2.24.0" +"@dhis2/multi-calendar-dates@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@dhis2/multi-calendar-dates/-/multi-calendar-dates-1.0.2.tgz#e54dc85e512aba93fceef3004e67e199077f3ba8" + integrity sha512-oQZ7PFMwHFpt4ygDN9DmAeYO3g07L7AHJW6diZ37mzpkEF/DyMafhsZHnJWNlTH5HDp8nYuO3EjBiM7fZN6C0g== + dependencies: + "@js-temporal/polyfill" "^0.4.2" + classnames "^2.3.2" + "@dhis2/prop-types@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@dhis2/prop-types/-/prop-types-3.1.2.tgz#65b8ad2da8cd2f72bc8b951049a6c9d1b97af3e9" @@ -2162,90 +2187,91 @@ workbox-routing "^6.1.5" workbox-strategies "^6.1.5" -"@dhis2/ui-constants@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2/ui-constants/-/ui-constants-8.7.7.tgz#cbdc548ddc2dc0f98fe9d8541afe0efd247adf3e" - integrity sha512-SgvtBULPvu3/kZwrzKu55sLeWYnoWgLdiBLacScpXgGYXifHmsNtFVOB/31t2Gl01+JVO1MrQ1ANtGRNdzjF/w== +"@dhis2/ui-constants@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2/ui-constants/-/ui-constants-8.13.10.tgz#31ec927daa1638b130b523a27f1b3437e81538d4" + integrity sha512-b6pJd3jMkQo8lk87tvd/jlnfX3wa5ScVzo++HGTCO5hnGUizmcD5mOskZ6nYuFu2L2iJaywaTZMrz56SrerJcQ== dependencies: prop-types "^15.7.2" -"@dhis2/ui-forms@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2/ui-forms/-/ui-forms-8.7.7.tgz#b90c3253a69a169e1d5185c51783eb892f3ecb15" - integrity sha512-7ILC6CzKIM8F1bFdvUkBQ/GFwotA+f+jgoSRM68HPFYkPU5jVZUfZ/Dk9Z0WMy+E1t8cps7sLyjyFuhiR/T9Yw== - dependencies: - "@dhis2-ui/button" "8.7.7" - "@dhis2-ui/checkbox" "8.7.7" - "@dhis2-ui/field" "8.7.7" - "@dhis2-ui/file-input" "8.7.7" - "@dhis2-ui/input" "8.7.7" - "@dhis2-ui/radio" "8.7.7" - "@dhis2-ui/select" "8.7.7" - "@dhis2-ui/switch" "8.7.7" - "@dhis2-ui/text-area" "8.7.7" +"@dhis2/ui-forms@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2/ui-forms/-/ui-forms-8.13.10.tgz#d9c5bb472b12c4b1124669be6e03485d3a779bc1" + integrity sha512-bD5AV9XAdXg66axcON8ePqPpQ96DHzM0AbJ+kn8yW9KATiM8tC0RtO1KlKgdrYDO5mSHhNZQXBr2jtUJg7x1vg== + dependencies: + "@dhis2-ui/button" "8.13.10" + "@dhis2-ui/checkbox" "8.13.10" + "@dhis2-ui/field" "8.13.10" + "@dhis2-ui/file-input" "8.13.10" + "@dhis2-ui/input" "8.13.10" + "@dhis2-ui/radio" "8.13.10" + "@dhis2-ui/select" "8.13.10" + "@dhis2-ui/switch" "8.13.10" + "@dhis2-ui/text-area" "8.13.10" "@dhis2/prop-types" "^3.1.2" classnames "^2.3.1" final-form "^4.20.2" prop-types "^15.7.2" react-final-form "^6.5.3" -"@dhis2/ui-icons@8.7.7": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2/ui-icons/-/ui-icons-8.7.7.tgz#8138aebb46723cc82168663eb0f06a6659ab2a8c" - integrity sha512-appRE/9TmJ8oa0B+Zb4g2W5nD+KMmdmgIAktRDKa6zRwiUvEPHLRoydm92kn38oDIg7oS9wsAHGMN1eff67cNg== - -"@dhis2/ui@^8.6.2": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@dhis2/ui/-/ui-8.7.7.tgz#07c29bbbf83bdeacc27660e4dbd70b917b30a2d6" - integrity sha512-e5laICpQD0MU4aUZzkGCGAvAbuigpCuqzQg4o8gOzR/tv1K78QnY/eMyF/vv7FBKFX9b0AyfKge0YTXPxXYPUQ== - dependencies: - "@dhis2-ui/alert" "8.7.7" - "@dhis2-ui/box" "8.7.7" - "@dhis2-ui/button" "8.7.7" - "@dhis2-ui/card" "8.7.7" - "@dhis2-ui/center" "8.7.7" - "@dhis2-ui/checkbox" "8.7.7" - "@dhis2-ui/chip" "8.7.7" - "@dhis2-ui/cover" "8.7.7" - "@dhis2-ui/css" "8.7.7" - "@dhis2-ui/divider" "8.7.7" - "@dhis2-ui/field" "8.7.7" - "@dhis2-ui/file-input" "8.7.7" - "@dhis2-ui/header-bar" "8.7.7" - "@dhis2-ui/help" "8.7.7" - "@dhis2-ui/input" "8.7.7" - "@dhis2-ui/intersection-detector" "8.7.7" - "@dhis2-ui/label" "8.7.7" - "@dhis2-ui/layer" "8.7.7" - "@dhis2-ui/legend" "8.7.7" - "@dhis2-ui/loader" "8.7.7" - "@dhis2-ui/logo" "8.7.7" - "@dhis2-ui/menu" "8.7.7" - "@dhis2-ui/modal" "8.7.7" - "@dhis2-ui/node" "8.7.7" - "@dhis2-ui/notice-box" "8.7.7" - "@dhis2-ui/organisation-unit-tree" "8.7.7" - "@dhis2-ui/pagination" "8.7.7" - "@dhis2-ui/popover" "8.7.7" - "@dhis2-ui/popper" "8.7.7" - "@dhis2-ui/portal" "8.7.7" - "@dhis2-ui/radio" "8.7.7" - "@dhis2-ui/required" "8.7.7" - "@dhis2-ui/segmented-control" "8.7.7" - "@dhis2-ui/select" "8.7.7" - "@dhis2-ui/selector-bar" "8.7.7" - "@dhis2-ui/sharing-dialog" "8.7.7" - "@dhis2-ui/switch" "8.7.7" - "@dhis2-ui/tab" "8.7.7" - "@dhis2-ui/table" "8.7.7" - "@dhis2-ui/tag" "8.7.7" - "@dhis2-ui/text-area" "8.7.7" - "@dhis2-ui/tooltip" "8.7.7" - "@dhis2-ui/transfer" "8.7.7" - "@dhis2-ui/user-avatar" "8.7.7" - "@dhis2/ui-constants" "8.7.7" - "@dhis2/ui-forms" "8.7.7" - "@dhis2/ui-icons" "8.7.7" +"@dhis2/ui-icons@8.13.10": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2/ui-icons/-/ui-icons-8.13.10.tgz#802f678bc09b157f775c0826564e23f48f1a72c8" + integrity sha512-NA9gm/qbsJD6JhDjQszQxKDfsQtV5SNiJA668rfJjEK51JC5L0TXeidnOnX2T4Tg4vHMIdOuyjRCTkm1z+C1JQ== + +"@dhis2/ui@^8.13.10", "@dhis2/ui@^8.6.2": + version "8.13.10" + resolved "https://registry.yarnpkg.com/@dhis2/ui/-/ui-8.13.10.tgz#dc70be2b02333ffea5a10110bd33c8aa0136131b" + integrity sha512-0iN0qoFG6km54v9xHng9BVfoCDmTc6knOG1n7HU3bkn/nv28Lj8LecMtcXpqiB7sdFLQHArMRPOE7Z+RICRwLQ== + dependencies: + "@dhis2-ui/alert" "8.13.10" + "@dhis2-ui/box" "8.13.10" + "@dhis2-ui/button" "8.13.10" + "@dhis2-ui/calendar" "8.13.10" + "@dhis2-ui/card" "8.13.10" + "@dhis2-ui/center" "8.13.10" + "@dhis2-ui/checkbox" "8.13.10" + "@dhis2-ui/chip" "8.13.10" + "@dhis2-ui/cover" "8.13.10" + "@dhis2-ui/css" "8.13.10" + "@dhis2-ui/divider" "8.13.10" + "@dhis2-ui/field" "8.13.10" + "@dhis2-ui/file-input" "8.13.10" + "@dhis2-ui/header-bar" "8.13.10" + "@dhis2-ui/help" "8.13.10" + "@dhis2-ui/input" "8.13.10" + "@dhis2-ui/intersection-detector" "8.13.10" + "@dhis2-ui/label" "8.13.10" + "@dhis2-ui/layer" "8.13.10" + "@dhis2-ui/legend" "8.13.10" + "@dhis2-ui/loader" "8.13.10" + "@dhis2-ui/logo" "8.13.10" + "@dhis2-ui/menu" "8.13.10" + "@dhis2-ui/modal" "8.13.10" + "@dhis2-ui/node" "8.13.10" + "@dhis2-ui/notice-box" "8.13.10" + "@dhis2-ui/organisation-unit-tree" "8.13.10" + "@dhis2-ui/pagination" "8.13.10" + "@dhis2-ui/popover" "8.13.10" + "@dhis2-ui/popper" "8.13.10" + "@dhis2-ui/portal" "8.13.10" + "@dhis2-ui/radio" "8.13.10" + "@dhis2-ui/required" "8.13.10" + "@dhis2-ui/segmented-control" "8.13.10" + "@dhis2-ui/select" "8.13.10" + "@dhis2-ui/selector-bar" "8.13.10" + "@dhis2-ui/sharing-dialog" "8.13.10" + "@dhis2-ui/switch" "8.13.10" + "@dhis2-ui/tab" "8.13.10" + "@dhis2-ui/table" "8.13.10" + "@dhis2-ui/tag" "8.13.10" + "@dhis2-ui/text-area" "8.13.10" + "@dhis2-ui/tooltip" "8.13.10" + "@dhis2-ui/transfer" "8.13.10" + "@dhis2-ui/user-avatar" "8.13.10" + "@dhis2/ui-constants" "8.13.10" + "@dhis2/ui-forms" "8.13.10" + "@dhis2/ui-icons" "8.13.10" prop-types "^15.7.2" "@eslint-community/eslint-utils@^4.2.0": @@ -2610,6 +2636,14 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@js-temporal/polyfill@^0.4.2": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@js-temporal/polyfill/-/polyfill-0.4.4.tgz#4c26b4a1a68c19155808363f520204712cfc2558" + integrity sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg== + dependencies: + jsbi "^4.3.0" + tslib "^2.4.1" + "@juggle/resize-observer@^3.3.1": version "3.4.0" resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" @@ -4755,7 +4789,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.6, classnames@^2.3.1: +classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== @@ -8929,6 +8963,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbi@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-4.3.0.tgz#b54ee074fb6fcbc00619559305c8f7e912b04741" + integrity sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g== + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -11968,6 +12007,11 @@ serialize-javascript@^6.0.0: dependencies: randombytes "^2.1.0" +serialize-query-params@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/serialize-query-params/-/serialize-query-params-2.0.2.tgz#598a3fb9e13f4ea1c1992fbd20231aa16b31db81" + integrity sha512-1chMo1dST4pFA9RDXAtF0Rbjaut4is7bzFbI1Z26IuMub68pNCILku85aYmeFhvnY//BXUPUhoRMjYcsT93J/Q== + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -13006,7 +13050,7 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0: +tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.1: version "2.5.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== @@ -13307,6 +13351,13 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +use-query-params@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/use-query-params/-/use-query-params-2.2.1.tgz#c558ab70706f319112fbccabf6867b9f904e947d" + integrity sha512-i6alcyLB8w9i3ZK3caNftdb+UnbfBRNPDnc89CNQWkGRmDrm/gfydHvMBfVsQJRq3NoHOM2dt/ceBWG2397v1Q== + dependencies: + serialize-query-params "^2.0.2" + use-sync-external-store@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"