diff --git a/ui/package.json b/ui/package.json
index eeb591172..2c8a54b12 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -15,6 +15,7 @@
"http-proxy-middleware": "^1.2.0",
"lodash": "^4.17.21",
"prop-types": "^15.7.2",
+ "query-string": "^7.0.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-infinite-scroll-component": "^6.1.0",
@@ -24,6 +25,7 @@
"reactstrap": "^8.9.0",
"sass": "^1.32.11",
"use-http": "^1.0.20",
+ "use-query-params": "^1.2.2",
"web-vitals": "^1.0.1"
},
"scripts": {
diff --git a/ui/src/app/App.js b/ui/src/app/App.js
index 2e53c4e3d..547f0a45b 100644
--- a/ui/src/app/App.js
+++ b/ui/src/app/App.js
@@ -5,6 +5,7 @@ import {
Redirect,
Route
} from "react-router-dom";
+import { QueryParamProvider } from 'use-query-params';
import { Provider as HttpProvider } from 'use-http';
import './App.scss';
@@ -12,7 +13,7 @@ import { I18nProvider } from './i18n/context/I18n.provider';
import Footer from './core/components/Footer';
import { get_cookie } from './core/utility/get_cookie';
-import Dashboard from './dashboard/container/Dashboard';
+import Dashboard from './dashboard/view/Dashboard';
import Header from './core/components/Header';
import { UserProvider } from './core/user/UserContext';
import { Metadata } from './metadata/Metadata';
@@ -38,18 +39,20 @@ function App() {
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/app/core/components/FormattedDate.js b/ui/src/app/core/components/FormattedDate.js
index ea01aa1e8..5e84ba7df 100644
--- a/ui/src/app/core/components/FormattedDate.js
+++ b/ui/src/app/core/components/FormattedDate.js
@@ -1,8 +1,8 @@
import React from 'react';
-import { format } from 'date-fns';
+import { format, parseISO } from 'date-fns';
export default function FormattedDate ({ date, time = false }) {
- const formatted = React.useMemo(() => format(new Date(date), `MMM Lo, Y${time ? ' HH:mm:ss' : ''}`), [date, time]);
+ const formatted = React.useMemo(() => format(parseISO(date), `MMM d, Y${time ? ' HH:mm:ss' : ''}`), [date, time]);
return (<>{ formatted }>);
}
\ No newline at end of file
diff --git a/ui/src/app/dashboard/container/ActionsTab.js b/ui/src/app/dashboard/container/ActionsTab.js
deleted file mode 100644
index 76d1ff592..000000000
--- a/ui/src/app/dashboard/container/ActionsTab.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import React from 'react';
-import { SourcesActions } from '../../admin/container/SourcesActions';
-import UserActions from '../../admin/container/UserActions';
-
-import Translate from '../../i18n/components/translate';
-
-export function ActionsTab({ sources, users, reloadSources, reloadUsers }) {
-
- return (
- <>
-
-
-
-
-
- Enable Metadata Sources
-
-
-
-
-
-
-
-
-
-
-
-
-
- User Access Request
-
-
-
-
-
-
- >
-
- );
-}
-
-export default ActionsTab;
\ No newline at end of file
diff --git a/ui/src/app/dashboard/container/AdminTab.js b/ui/src/app/dashboard/container/AdminTab.js
deleted file mode 100644
index a458c810a..000000000
--- a/ui/src/app/dashboard/container/AdminTab.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import React from 'react';
-import useFetch from 'use-http';
-import UserManagement from '../../admin/container/UserManagement';
-import UserMaintenance from '../../admin/component/UserMaintenance';
-import API_BASE_PATH from '../../App.constant';
-
-import Translate from '../../i18n/components/translate';
-
-export function AdminTab () {
-
- const [users, setUsers] = React.useState([]);
-
- const { get, response } = useFetch(`${API_BASE_PATH}/admin/users`, {
- cachePolicy: 'no-cache'
- }, []);
-
- async function loadUsers() {
- const users = await get('')
- if (response.ok) {
- setUsers(users);
- }
- }
-
- /*eslint-disable react-hooks/exhaustive-deps*/
- React.useEffect(() => {
- loadUsers();
- }, []);
-
-
- return (
-
-
-
-
-
- {(u, roles, onChangeUserRole, onDeleteUser) =>
- }
-
-
-
-
- );
-}
-
-export default AdminTab;
\ No newline at end of file
diff --git a/ui/src/app/dashboard/container/Dashboard.js b/ui/src/app/dashboard/container/Dashboard.js
deleted file mode 100644
index 97b070874..000000000
--- a/ui/src/app/dashboard/container/Dashboard.js
+++ /dev/null
@@ -1,108 +0,0 @@
-import React from 'react';
-
-import { Nav, NavItem } from 'reactstrap';
-import { Switch, Route, Redirect, useRouteMatch } from 'react-router-dom';
-import { NavLink } from 'react-router-dom';
-
-import Translate from '../../i18n/components/translate';
-import { AdminRoute } from '../../core/components/AdminRoute';
-
-import './Dashboard.scss';
-import { SourcesTab } from './SourcesTab';
-import { ProvidersTab } from './ProvidersTab';
-import { AdminTab } from './AdminTab';
-import { ActionsTab } from './ActionsTab';
-import { useIsAdmin } from '../../core/user/UserContext';
-import useFetch from 'use-http';
-import API_BASE_PATH from '../../App.constant';
-import { getMetadataPath } from '../../metadata/hooks/api';
-
-export function Dashboard () {
-
- const { path } = useRouteMatch();
-
- const isAdmin = useIsAdmin();
-
- const [actions, setActions] = React.useState(0);
- const [users, setUsers] = React.useState([]);
- const [sources, setSources] = React.useState([]);
-
- const { get, response } = useFetch(`${API_BASE_PATH}`, {
- cachePolicy: 'no-cache'
- });
-
- async function loadUsers() {
- const users = await get('/admin/users')
- if (response.ok) {
- setUsers(users.filter(u => u.role === 'ROLE_NONE'));
- }
- }
-
- async function loadSources() {
- const s = await get(`/${getMetadataPath('source')}/disabledNonAdmin`);
- if (response.ok) {
- setSources(s);
- }
- }
-
- /*eslint-disable react-hooks/exhaustive-deps*/
- React.useEffect(() => {
- loadSources();
- loadUsers();
- }, []);
-
- React.useEffect(() => {
- setActions(users.length + sources.length);
- }, [users, sources]);
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-/*
-
- & nbsp;
- {{ actionsRequired$ | async}}
-
- */
-export default Dashboard;
\ No newline at end of file
diff --git a/ui/src/app/dashboard/container/Dashboard.scss b/ui/src/app/dashboard/container/Dashboard.scss
deleted file mode 100644
index 74201a46e..000000000
--- a/ui/src/app/dashboard/container/Dashboard.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import '../../../theme/variables.scss';
-
diff --git a/ui/src/app/dashboard/container/ProvidersTab.js b/ui/src/app/dashboard/container/ProvidersTab.js
deleted file mode 100644
index f5a2d719b..000000000
--- a/ui/src/app/dashboard/container/ProvidersTab.js
+++ /dev/null
@@ -1,62 +0,0 @@
-import React from 'react';
-
-import { useMetadataEntities } from '../../metadata/hooks/api';
-import Translate from '../../i18n/components/translate';
-import ProviderList from '../../metadata/domain/provider/component/ProviderList';
-import {Search} from '../component/Search';
-import { Ordered } from '../component/Ordered';
-import { useIsAdmin } from '../../core/user/UserContext';
-import { Alert } from 'reactstrap';
-
-const searchProps = ['name', '@type', 'createdBy'];
-
-export function ProvidersTab () {
-
- const [providers, setProviders] = React.useState([]);
-
- const { get, response } = useMetadataEntities('provider');
-
- async function loadProviders() {
- const providers = await get('')
- if (response.ok) {
- setProviders(providers);
- }
- }
-
- /*eslint-disable react-hooks/exhaustive-deps*/
- React.useEffect(() => { loadProviders() }, []);
-
- const isAdmin = useIsAdmin();
-
- return (
-
-
- {isAdmin ?
- <>
-
-
- Current Metadata Providers
-
-
-
-
- {(ordered, first, last, onOrderUp, onOrderDown) =>
-
- {(searched) => }
-
- }
-
-
- >
- :
-
Access Denied}
-
-
- );
-}
\ No newline at end of file
diff --git a/ui/src/app/dashboard/container/SourcesTab.js b/ui/src/app/dashboard/container/SourcesTab.js
deleted file mode 100644
index 94305795b..000000000
--- a/ui/src/app/dashboard/container/SourcesTab.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import React from 'react';
-import Translate from '../../i18n/components/translate';
-
-import SourceList from '../../metadata/domain/source/component/SourceList';
-import { useMetadataEntities } from '../../metadata/hooks/api';
-import { Search } from '../component/Search';
-
-const searchProps = ['serviceProviderName', 'entityId', 'createdBy'];
-
-export function SourcesTab () {
-
- const [sources, setSources] = React.useState([]);
-
- const { get, response } = useMetadataEntities('source', {
- cachePolicy: 'no-cache'
- });
-
- async function loadSources() {
- const sources = await get('/');
- if (response.ok) {
- setSources(sources);
- }
- }
-
- const updateSources = () => loadSources();
-
- /*eslint-disable react-hooks/exhaustive-deps*/
- React.useEffect(() => { loadSources() }, []);
-
- return (
-
-
-
-
- Current Metadata Sources
-
-
-
-
- {(searched) => }
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/ui/src/app/metadata/Metadata.js b/ui/src/app/metadata/Metadata.js
index 33d1e7a73..70c72a587 100644
--- a/ui/src/app/metadata/Metadata.js
+++ b/ui/src/app/metadata/Metadata.js
@@ -1,13 +1,15 @@
import React from 'react';
import { Switch, Route, useRouteMatch } from 'react-router-dom';
-import { MetadataOptions } from './component/MetadataOptions';
+import { MetadataOptions } from './view/MetadataOptions';
import { MetadataDetail } from './component/MetadataDetail';
-import { MetadataHistory } from './component/MetadataHistory';
+import { MetadataHistory } from './view/MetadataHistory';
import { MetadataEditor } from './editor/MetadataEditor';
import { MetadataSelector } from './hoc/MetadataSelector';
import { MetadataSchema } from './hoc/MetadataSchema';
import { MetadataXmlLoader } from './hoc/MetadataXmlLoader';
-import { MetadataXml } from './component/MetadataXml';
+import { MetadataXml } from './view/MetadataXml';
+import { MetadataComparison } from './view/MetadataComparison';
+import { MetadataVersion } from './view/MetadataVersion';
export function Metadata () {
@@ -34,6 +36,16 @@ export function Metadata () {
} />
+
+
+
+
+ } />
+
+
+
+
+ } />
diff --git a/ui/src/app/metadata/component/MetadataConfiguration.js b/ui/src/app/metadata/component/MetadataConfiguration.js
index 1ccd73d73..4faff19af 100644
--- a/ui/src/app/metadata/component/MetadataConfiguration.js
+++ b/ui/src/app/metadata/component/MetadataConfiguration.js
@@ -13,24 +13,30 @@ export function MetadataConfiguration ({ configuration }) {
const columns = configuration.dates?.length || 1;
const width = usePropertyWidth(columns);
+ const editable = configuration.sections?.length <= 1;
+
return (
<>
{ configuration && configuration.sections.map((section, sidx) =>
-
-
- Option
- {configuration.dates.map((d, didx) =>
-
- {configuration.dates.length <= 1 ?
- Value
- :
-
- }
-
- )}
-
-
-
+ <>
+ {section?.properties?.length > 0 &&
+
+
+ Option
+ {configuration.dates.map((d, didx) =>
+
+ {configuration.dates.length <= 1 ?
+ Value
+ :
+
+ }
+
+ )}
+
+
+
+ }
+ >
) }
>
);
diff --git a/ui/src/app/metadata/component/MetadataHistory.js b/ui/src/app/metadata/component/MetadataHistory.js
deleted file mode 100644
index 42c882407..000000000
--- a/ui/src/app/metadata/component/MetadataHistory.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import React from 'react';
-import { useParams } from 'react-router';
-import { Link } from 'react-router-dom';
-import FormattedDate from '../../core/components/FormattedDate';
-
-import Translate from '../../i18n/components/translate';
-import { useMetadataHistory } from '../hooks/api';
-
-export function MetadataHistory () {
- const { type, id } = useParams();
-
- const { data, loading } = useMetadataHistory(type, id, {}, []);
-
- const toggleVersionSelected = () => {};
- const restore = () => {};
- const compare = () => {};
-
- const selected = [];
-
- return (
- <>
-
- version history
-
- {data && !loading &&
- <>
-
-
- >
-
}
- {loading &&
-
- Loading...
-
}
- >
- );
-}
\ No newline at end of file
diff --git a/ui/src/app/metadata/component/MetadataOptions.js b/ui/src/app/metadata/component/MetadataOptions.js
deleted file mode 100644
index d3f2994ff..000000000
--- a/ui/src/app/metadata/component/MetadataOptions.js
+++ /dev/null
@@ -1,109 +0,0 @@
-import React from 'react';
-import { faArrowDown, faArrowUp, faChevronUp, faCog, faHistory, faPlus, faTrash } from '@fortawesome/free-solid-svg-icons';
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { Link, useHistory, useParams } from 'react-router-dom';
-
-import { scroller } from 'react-scroll';
-
-import Translate from '../../i18n/components/translate';
-
-import { MetadataObjectContext } from '../hoc/MetadataSelector';
-import { MetadataHeader } from './MetadataHeader';
-import { MetadataConfiguration } from './MetadataConfiguration';
-import { MetadataDefinitionContext, MetadataSchemaContext } from '../hoc/MetadataSchema';
-
-import { useMetadataConfiguration } from '../hooks/configuration';
-import { MetadataViewToggle } from './MetadataViewToggle';
-import { DeleteSourceConfirmation } from '../domain/source/component/DeleteSourceConfirmation';
-import { MetadataFilters } from '../domain/filter/component/MetadataFilters';
-import { MetadataFilterConfigurationList } from '../domain/filter/component/MetadataFilterConfigurationList';
-import { MetadataFilterTypes } from '../domain/filter';
-
-export function MetadataOptions () {
-
- const metadata = React.useContext(MetadataObjectContext);
- const definition = React.useContext(MetadataDefinitionContext);
- const schema = React.useContext(MetadataSchemaContext);
- const history = useHistory();
-
- const { type, id } = useParams();
-
- const configuration = useMetadataConfiguration([metadata], schema, definition);
-
- const onScrollTo = (element, offset = 0) => {
- scroller.scrollTo(element, {
- duration: 500,
- smooth: true,
- offset
- });
- };
-
- const redirectOnDelete = () => history.push('/dashboard');
-
- return (
-
- {(onDeleteSource) =>
- <>
-
-
-
- {type === 'source' &&
-
- }
-
-
-
-
-
- Version History
-
- {type === 'provider' &&
-
- }
-
-
-
-
-
- {type === 'provider' &&
- <>
-
-
- Filters
-
-
-
-
- Add Filter
-
-
-
-
-
-
- >
- }
-
-
-
- >}
-
- );
-}
\ No newline at end of file
diff --git a/ui/src/app/metadata/component/MetadataXml.js b/ui/src/app/metadata/component/MetadataXml.js
deleted file mode 100644
index 10c740d8e..000000000
--- a/ui/src/app/metadata/component/MetadataXml.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { faSave } from '@fortawesome/free-solid-svg-icons';
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import React from 'react';
-
-import { useParams } from 'react-router';
-import Translate from '../../i18n/components/translate';
-import { MetadataObjectContext } from '../hoc/MetadataSelector';
-
-import { MetadataXmlContext } from '../hoc/MetadataXmlLoader';
-import { MetadataViewToggle } from './MetadataViewToggle';
-import { downloadAsXml } from '../../core/utility/download_as_xml';
-
-export function MetadataXml () {
- const xml = React.useContext(MetadataXmlContext);
- const entity = React.useContext(MetadataObjectContext);
- const { type } = useParams();
-
- const download = () => downloadAsXml(entity, xml);
-
- return (
- <>
-
- Source Configuration
-
-
-
-
-
-
-
- {xml}
-
- { xml }
-
-
-
-
-
-
- >
- );
-}
\ No newline at end of file
diff --git a/ui/src/app/metadata/component/properties/PropertyValue.js b/ui/src/app/metadata/component/properties/PropertyValue.js
index 566489d77..27ff7b5d1 100644
--- a/ui/src/app/metadata/component/properties/PropertyValue.js
+++ b/ui/src/app/metadata/component/properties/PropertyValue.js
@@ -25,7 +25,7 @@ export function PropertyValue ({ name, value, columns }) {
{value.toString()}
>
- : '-'}
+ : -}
>
);
}
\ No newline at end of file
diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationList.js b/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationList.js
index 86dae0368..2c5f1a7aa 100644
--- a/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationList.js
+++ b/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationList.js
@@ -6,10 +6,9 @@ import { MetadataFiltersContext } from './MetadataFilters';
import { MetadataFilterConfigurationListItem } from './MetadataFilterConfigurationListItem';
-export function MetadataFilterConfigurationList ({provider}) {
+export function MetadataFilterConfigurationList ({provider, editable = true}) {
const filters = React.useContext(MetadataFiltersContext);
const removeFilter = () => {}
- const editable = true;
return (
diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationListItem.js b/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationListItem.js
index fe6938902..de11d4205 100644
--- a/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationListItem.js
+++ b/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationListItem.js
@@ -37,11 +37,11 @@ export function MetadataFilterConfigurationListItem ({ filter, isLast, isFirst,
{editable &&
diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilters.js b/ui/src/app/metadata/domain/filter/component/MetadataFilters.js
index 6969dfcb7..b30e38436 100644
--- a/ui/src/app/metadata/domain/filter/component/MetadataFilters.js
+++ b/ui/src/app/metadata/domain/filter/component/MetadataFilters.js
@@ -3,21 +3,27 @@ import { useMetadataEntities } from '../../../hooks/api';
export const MetadataFiltersContext = React.createContext();
-export function MetadataFilters ({ providerId, types = [], children }) {
+export function MetadataFilters ({ providerId, types = [], filters, children }) {
const { get, response } = useMetadataEntities('provider');
- const [filters, setFilters] = React.useState([]);
+ const [filterData, setFilterData] = React.useState([]);
async function loadFilters(id) {
const list = await get(`/${id}/Filters`);
if (response.ok) {
- setFilters(list.filter(f => types.length > 1 ? types.indexOf(f['@type']) > -1 : true));
+ setFilterData(list.filter(f => types.length > 1 ? types.indexOf(f['@type']) > -1 : true));
}
}
/*eslint-disable react-hooks/exhaustive-deps*/
- React.useEffect(() => { loadFilters(providerId) }, [providerId]);
+ React.useEffect(() => {
+ if (!filters) {
+ loadFilters(providerId);
+ } else {
+ setFilterData(filters);
+ }
+ }, [providerId]);
return (
diff --git a/ui/src/app/metadata/domain/provider/component/ProviderList.js b/ui/src/app/metadata/domain/provider/component/ProviderList.js
index dc8171bc1..4193d5b3f 100644
--- a/ui/src/app/metadata/domain/provider/component/ProviderList.js
+++ b/ui/src/app/metadata/domain/provider/component/ProviderList.js
@@ -26,7 +26,7 @@ export default function ProviderList({ entities, reorder = true, first, last, on
{limited.map((provider, idx) =>
- |
+ |
{reorder ?
{idx + 1}
@@ -52,13 +52,13 @@ export default function ProviderList({ entities, reorder = true, first, last, on
|
-
+ |
{provider.name}
|
- { provider['@type'] } |
- { provider.createdBy } |
- |
-
+ | { provider['@type'] } |
+ { provider.createdBy } |
+ |
+
diff --git a/ui/src/app/metadata/hooks/configuration.js b/ui/src/app/metadata/hooks/configuration.js
index 6efd0ef38..4f02f61a6 100644
--- a/ui/src/app/metadata/hooks/configuration.js
+++ b/ui/src/app/metadata/hooks/configuration.js
@@ -1,13 +1,24 @@
-import { getConfigurationSections } from './schema';
+import { getConfigurationSections, getLimitedPropertiesFn } from './schema';
-export function useMetadataConfiguration(models, schema, definition) {
+export const getLimitedConfigurationsFn = (configurations, limited) => {
+ return configurations ? ({
+ ...configurations,
+ sections: !limited ? configurations.sections :
+ configurations.sections.map(s => ({
+ ...s,
+ properties: getLimitedPropertiesFn(s.properties),
+ }))
+ }) : configurations;
+};
+
+
+export function useMetadataConfiguration(models, schema, definition, limited = false) {
if (!models || !schema || !definition) {
return {};
}
- const processed = definition.schemaPreprocessor ?
- definition.schemaPreprocessor(schema) : schema;
+ const processed = definition.schemaPreprocessor ? definition.schemaPreprocessor(schema) : schema;
- return getConfigurationSections(models, definition, processed);
+ return getLimitedConfigurationsFn(getConfigurationSections(models, definition, processed), limited);
}
\ No newline at end of file
diff --git a/ui/yarn.lock b/ui/yarn.lock
index 06eb13aa0..43d217b52 100644
--- a/ui/yarn.lock
+++ b/ui/yarn.lock
@@ -4982,6 +4982,11 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
+filter-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b"
+ integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs=
+
finalhandler@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
@@ -8979,6 +8984,16 @@ query-string@^4.1.0:
object-assign "^4.1.0"
strict-uri-encode "^1.0.0"
+query-string@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.0.0.tgz#aaad2c8d5c6a6d0c6afada877fecbd56af79e609"
+ integrity sha512-Iy7moLybliR5ZgrK/1R3vjrXq03S13Vz4Rbm5Jg3EFq1LUmQppto0qtXz4vqZ386MSRjZgnTSZ9QC+NZOSd/XA==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ filter-obj "^1.1.0"
+ split-on-first "^1.0.0"
+ strict-uri-encode "^2.0.0"
+
querystring-es3@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
@@ -9894,6 +9909,11 @@ serialize-javascript@^5.0.1:
dependencies:
randombytes "^2.1.0"
+serialize-query-params@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/serialize-query-params/-/serialize-query-params-1.3.3.tgz#a4bf0fc0ab9e80c92b93cdf9d84ec521d769ecbe"
+ integrity sha512-rJIIETRuGUVbLekC73IiXV3738ylEHbHK1kxaXAbhxbxfio0yvVXaRMF+OyLZOBMwdgDHYLaj6EMBAEiSf8C/g==
+
serve-index@^1.9.1:
version "1.9.1"
resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
@@ -10193,6 +10213,11 @@ spdy@^4.0.2:
select-hose "^2.0.0"
spdy-transport "^3.0.0"
+split-on-first@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
+ integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
+
split-string@^3.0.1, split-string@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
@@ -10306,6 +10331,11 @@ strict-uri-encode@^1.0.0:
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+strict-uri-encode@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
+ integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
+
string-length@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1"
@@ -11033,6 +11063,13 @@ use-http@^1.0.20:
use-ssr "^1.0.24"
utility-types "^3.10.0"
+use-query-params@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/use-query-params/-/use-query-params-1.2.2.tgz#4c4b274133d699605301510b5aa01047f92b5ce0"
+ integrity sha512-Uyfe+/TECsNNzCSkgUM1MM24OEGxGE4aeWvZEf0a14iQFp/m43wiqI1HZ9oTlrRSZwD5yABeLc9rN+wtiB5B3Q==
+ dependencies:
+ serialize-query-params "^1.3.3"
+
use-ssr@^1.0.24:
version "1.0.24"
resolved "https://registry.yarnpkg.com/use-ssr/-/use-ssr-1.0.24.tgz#213a3df58f5ab9268e6fe1a57ad0a9de91e514d1"
|