diff --git a/src/plugins/es_ui_shared/public/index.ts b/src/plugins/es_ui_shared/public/index.ts index 67c1ee3c7d677..d472b7e462057 100644 --- a/src/plugins/es_ui_shared/public/index.ts +++ b/src/plugins/es_ui_shared/public/index.ts @@ -68,6 +68,8 @@ export { export { Monaco, Forms }; +export { extractQueryParams } from './url'; + /** dummy plugin, we just want esUiShared to have its own bundle */ export function plugin() { return new (class EsUiSharedPlugin { diff --git a/src/plugins/es_ui_shared/public/url/extract_query_params.ts b/src/plugins/es_ui_shared/public/url/extract_query_params.ts new file mode 100644 index 0000000000000..09789e0f32bf2 --- /dev/null +++ b/src/plugins/es_ui_shared/public/url/extract_query_params.ts @@ -0,0 +1,29 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { parse, ParsedQuery } from 'query-string'; + +export function extractQueryParams(queryString: string = ''): ParsedQuery { + const hrefSplit = queryString.split('?'); + if (!hrefSplit.length) { + return {}; + } + + return parse(hrefSplit[1], { sort: false }); +} diff --git a/src/plugins/es_ui_shared/public/url/index.ts b/src/plugins/es_ui_shared/public/url/index.ts new file mode 100644 index 0000000000000..692e094f9eda4 --- /dev/null +++ b/src/plugins/es_ui_shared/public/url/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { extractQueryParams } from './extract_query_params'; diff --git a/x-pack/plugins/cross_cluster_replication/public/app/components/auto_follow_pattern_form.js b/x-pack/plugins/cross_cluster_replication/public/app/components/auto_follow_pattern_form.js index 7874f6ac649eb..74894b0cb8744 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/components/auto_follow_pattern_form.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/components/auto_follow_pattern_form.js @@ -29,11 +29,10 @@ import { EuiTitle, } from '@elastic/eui'; -import { indices } from '../../../../../../src/plugins/es_ui_shared/public'; import { indexPatterns } from '../../../../../../src/plugins/data/public'; +import { extractQueryParams, indices } from '../../shared_imports'; import { routing } from '../services/routing'; -import { extractQueryParams } from '../services/query_params'; import { getRemoteClusterName } from '../services/get_remote_cluster_name'; import { API_STATUS } from '../constants'; import { SectionError } from './section_error'; diff --git a/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_form/follower_index_form.js b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_form/follower_index_form.js index 28673c55fd031..a545aec63e222 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_form/follower_index_form.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_form/follower_index_form.js @@ -28,12 +28,14 @@ import { EuiTitle, } from '@elastic/eui'; -import { indices } from '../../../../../../../src/plugins/es_ui_shared/public'; +import { extractQueryParams, indices } from '../../../shared_imports'; import { indexNameValidator, leaderIndexValidator } from '../../services/input_validation'; import { routing } from '../../services/routing'; import { getFatalErrors } from '../../services/notifications'; import { loadIndices } from '../../services/api'; import { API_STATUS } from '../../constants'; +import { getRemoteClusterName } from '../../services/get_remote_cluster_name'; +import { RemoteClustersFormField } from '../remote_clusters_form_field'; import { SectionError } from '../section_error'; import { FormEntryRow } from '../form_entry_row'; import { @@ -41,9 +43,6 @@ import { emptyAdvancedSettings, areAdvancedSettingsEdited, } from './advanced_settings_fields'; -import { extractQueryParams } from '../../services/query_params'; -import { getRemoteClusterName } from '../../services/get_remote_cluster_name'; -import { RemoteClustersFormField } from '../remote_clusters_form_field'; import { FollowerIndexRequestFlyout } from './follower_index_request_flyout'; diff --git a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js index 5ef78b9ba6bb5..33d01bbe38a7f 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js @@ -18,7 +18,7 @@ import { } from '@elastic/eui'; import { reactRouterNavigate } from '../../../../../../../../src/plugins/kibana_react/public'; -import { extractQueryParams } from '../../../services/query_params'; +import { extractQueryParams } from '../../../../shared_imports'; import { trackUiMetric, METRIC_TYPE } from '../../../services/track_ui_metric'; import { API_STATUS, UIM_AUTO_FOLLOW_PATTERN_LIST_LOAD } from '../../../constants'; import { SectionLoading, SectionError, SectionUnauthorized } from '../../../components'; diff --git a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.js index 4d4cbbf6825ec..2ceb410e61ccc 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.js @@ -18,7 +18,7 @@ import { } from '@elastic/eui'; import { reactRouterNavigate } from '../../../../../../../../src/plugins/kibana_react/public'; -import { extractQueryParams } from '../../../services/query_params'; +import { extractQueryParams } from '../../../../shared_imports'; import { trackUiMetric, METRIC_TYPE } from '../../../services/track_ui_metric'; import { API_STATUS, UIM_FOLLOWER_INDEX_LIST_LOAD } from '../../../constants'; import { SectionLoading, SectionError, SectionUnauthorized } from '../../../components'; diff --git a/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.js b/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.js index 39d40389daa17..621d299b7f151 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.js @@ -8,8 +8,8 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { indices } from '../../../../../../src/plugins/es_ui_shared/public'; import { indexPatterns } from '../../../../../../src/plugins/data/public'; +import { indices } from '../../shared_imports'; const { indexNameBeginsWithPeriod, diff --git a/x-pack/plugins/cross_cluster_replication/public/app/services/input_validation.js b/x-pack/plugins/cross_cluster_replication/public/app/services/input_validation.js index e702a47e91155..0feccbeafefbd 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/services/input_validation.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/input_validation.js @@ -6,7 +6,8 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { indices } from '../../../../../../src/plugins/es_ui_shared/public'; + +import { indices } from '../../shared_imports'; const isEmpty = (value) => { return !value || !value.trim().length; diff --git a/x-pack/plugins/cross_cluster_replication/public/app/services/query_params.js b/x-pack/plugins/cross_cluster_replication/public/shared_imports.ts similarity index 51% rename from x-pack/plugins/cross_cluster_replication/public/app/services/query_params.js rename to x-pack/plugins/cross_cluster_replication/public/shared_imports.ts index af462bfeffcf5..2ff4bd988798a 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/services/query_params.js +++ b/x-pack/plugins/cross_cluster_replication/public/shared_imports.ts @@ -4,13 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { parse } from 'query-string'; - -export function extractQueryParams(queryString) { - const hrefSplit = queryString.split('?'); - if (!hrefSplit.length) { - return {}; - } - - return parse(hrefSplit[1], { sort: false }); -} +export { extractQueryParams, indices } from '../../../../src/plugins/es_ui_shared/public'; diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx index bad008b665cfb..adfaa7820aff3 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx @@ -11,7 +11,7 @@ import { i18n } from '@kbn/i18n'; import { EuiTitle, EuiText, EuiSpacer, EuiEmptyPrompt, EuiLink } from '@elastic/eui'; import { ScopedHistory } from 'kibana/public'; -import { reactRouterNavigate } from '../../../../shared_imports'; +import { reactRouterNavigate, extractQueryParams } from '../../../../shared_imports'; import { useAppContext } from '../../../app_context'; import { SectionError, SectionLoading, Error } from '../../../components'; import { useLoadDataStreams } from '../../../services/api'; @@ -28,8 +28,11 @@ export const DataStreamList: React.FunctionComponent { + const { isDeepLink } = extractQueryParams(search); + const { core: { getUrlForApp }, plugins: { ingestManager }, @@ -144,7 +147,9 @@ export const DataStreamList: React.FunctionComponent {value} diff --git a/x-pack/plugins/index_management/public/shared_imports.ts b/x-pack/plugins/index_management/public/shared_imports.ts index ad221ae73fecf..5bf1a31d0902b 100644 --- a/x-pack/plugins/index_management/public/shared_imports.ts +++ b/x-pack/plugins/index_management/public/shared_imports.ts @@ -11,6 +11,7 @@ export { sendRequest, useRequest, Forms, + extractQueryParams, } from '../../../../src/plugins/es_ui_shared/public/'; export { diff --git a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_add/remote_cluster_add.js b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_add/remote_cluster_add.js index b13e833f60b18..cc0e5ba93011a 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_add/remote_cluster_add.js +++ b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_add/remote_cluster_add.js @@ -10,7 +10,8 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { EuiPageContent } from '@elastic/eui'; -import { getRouter, redirect, extractQueryParams } from '../../services'; +import { extractQueryParams } from '../../../shared_imports'; +import { getRouter, redirect } from '../../services'; import { setBreadcrumbs } from '../../services/breadcrumb'; import { RemoteClusterPageTitle, RemoteClusterForm } from '../components'; diff --git a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_edit/remote_cluster_edit.js b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_edit/remote_cluster_edit.js index 9018647600b8d..34622055b1eaa 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_edit/remote_cluster_edit.js +++ b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_edit/remote_cluster_edit.js @@ -21,7 +21,8 @@ import { } from '@elastic/eui'; import { reactRouterNavigate } from '../../../../../../../src/plugins/kibana_react/public'; -import { extractQueryParams, getRouter, redirect } from '../../services'; +import { extractQueryParams } from '../../../shared_imports'; +import { getRouter, redirect } from '../../services'; import { setBreadcrumbs } from '../../services/breadcrumb'; import { RemoteClusterPageTitle, RemoteClusterForm, ConfiguredByNodeWarning } from '../components'; diff --git a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/remote_cluster_list.js b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/remote_cluster_list.js index 6d40cbbeb82ae..c8fdd94b881bc 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/remote_cluster_list.js +++ b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/remote_cluster_list.js @@ -29,7 +29,7 @@ import { } from '@elastic/eui'; import { reactRouterNavigate } from '../../../../../../../src/plugins/kibana_react/public'; -import { extractQueryParams } from '../../services'; +import { extractQueryParams } from '../../../shared_imports'; import { setBreadcrumbs } from '../../services/breadcrumb'; import { RemoteClusterTable } from './remote_cluster_table'; diff --git a/x-pack/plugins/remote_clusters/public/application/services/index.js b/x-pack/plugins/remote_clusters/public/application/services/index.js index ce8d06b6e2278..68edec7904205 100644 --- a/x-pack/plugins/remote_clusters/public/application/services/index.js +++ b/x-pack/plugins/remote_clusters/public/application/services/index.js @@ -12,8 +12,6 @@ export { initRedirect, redirect } from './redirect'; export { isAddressValid, isPortValid } from './validate_address'; -export { extractQueryParams } from './query_params'; - export { setUserHasLeftApp, getUserHasLeftApp, registerRouter, getRouter } from './routing'; export { trackUiMetric, METRIC_TYPE } from './ui_metric'; diff --git a/x-pack/plugins/remote_clusters/public/application/store/actions/add_cluster.js b/x-pack/plugins/remote_clusters/public/application/store/actions/add_cluster.js index d57fd37e791a1..9650aaacf4bec 100644 --- a/x-pack/plugins/remote_clusters/public/application/store/actions/add_cluster.js +++ b/x-pack/plugins/remote_clusters/public/application/store/actions/add_cluster.js @@ -6,12 +6,8 @@ import { i18n } from '@kbn/i18n'; -import { - addCluster as sendAddClusterRequest, - getRouter, - extractQueryParams, - redirect, -} from '../../services'; +import { extractQueryParams } from '../../../shared_imports'; +import { addCluster as sendAddClusterRequest, getRouter, redirect } from '../../services'; import { fatalError, toasts } from '../../services/notification'; import { diff --git a/x-pack/plugins/remote_clusters/public/application/store/actions/detail_panel.js b/x-pack/plugins/remote_clusters/public/application/store/actions/detail_panel.js index 57e8876faca2b..a5b023166da7c 100644 --- a/x-pack/plugins/remote_clusters/public/application/store/actions/detail_panel.js +++ b/x-pack/plugins/remote_clusters/public/application/store/actions/detail_panel.js @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { extractQueryParams, getRouter } from '../../services'; +import { extractQueryParams } from '../../../shared_imports'; +import { getRouter } from '../../services'; import { OPEN_DETAIL_PANEL, CLOSE_DETAIL_PANEL } from '../action_types'; export const openDetailPanel = ({ name }) => (dispatch) => { diff --git a/x-pack/plugins/remote_clusters/public/application/store/actions/edit_cluster.js b/x-pack/plugins/remote_clusters/public/application/store/actions/edit_cluster.js index 4fd8faeb7021e..0e18dd8a5136c 100644 --- a/x-pack/plugins/remote_clusters/public/application/store/actions/edit_cluster.js +++ b/x-pack/plugins/remote_clusters/public/application/store/actions/edit_cluster.js @@ -9,12 +9,8 @@ import { i18n } from '@kbn/i18n'; import { toasts, fatalError } from '../../services/notification'; import { loadClusters } from './load_clusters'; -import { - editCluster as sendEditClusterRequest, - extractQueryParams, - getRouter, - redirect, -} from '../../services'; +import { extractQueryParams } from '../../../shared_imports'; +import { editCluster as sendEditClusterRequest, getRouter, redirect } from '../../services'; import { EDIT_CLUSTER_START, diff --git a/x-pack/plugins/remote_clusters/public/application/services/query_params.js b/x-pack/plugins/remote_clusters/public/shared_imports.ts similarity index 51% rename from x-pack/plugins/remote_clusters/public/application/services/query_params.js rename to x-pack/plugins/remote_clusters/public/shared_imports.ts index af462bfeffcf5..2ff4bd988798a 100644 --- a/x-pack/plugins/remote_clusters/public/application/services/query_params.js +++ b/x-pack/plugins/remote_clusters/public/shared_imports.ts @@ -4,13 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { parse } from 'query-string'; - -export function extractQueryParams(queryString) { - const hrefSplit = queryString.split('?'); - if (!hrefSplit.length) { - return {}; - } - - return parse(hrefSplit[1], { sort: false }); -} +export { extractQueryParams, indices } from '../../../../src/plugins/es_ui_shared/public'; diff --git a/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_list.js b/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_list.js index 85cd6e742d27f..4c1f928197ad0 100644 --- a/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_list.js +++ b/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_list.js @@ -27,10 +27,9 @@ import { import { withKibana } from '../../../../../../../src/plugins/kibana_react/public'; -import { getRouterLinkProps, extractQueryParams, listBreadcrumb } from '../../services'; - +import { extractQueryParams } from '../../../shared_imports'; +import { getRouterLinkProps, listBreadcrumb } from '../../services'; import { JobTable } from './job_table'; - import { DetailPanel } from './detail_panel'; const REFRESH_RATE_MS = 30000; diff --git a/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_table/job_table.js b/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_table/job_table.js index 6337e6812ca4b..66ecb37d68439 100644 --- a/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_table/job_table.js +++ b/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_table/job_table.js @@ -265,7 +265,7 @@ export class JobTable extends Component { { trackUiMetric(METRIC_TYPE.CLICK, UIM_SHOW_DETAILS_CLICK); - openDetailPanel(job.id); + openDetailPanel(encodeURIComponent(job.id)); }} > {value} diff --git a/x-pack/plugins/rollup/public/crud_app/services/index.js b/x-pack/plugins/rollup/public/crud_app/services/index.js index 0b45b1bdb6b5f..6593c0dbcbfa4 100644 --- a/x-pack/plugins/rollup/public/crud_app/services/index.js +++ b/x-pack/plugins/rollup/public/crud_app/services/index.js @@ -33,8 +33,6 @@ export { serializeJob, deserializeJob, deserializeJobs } from './jobs'; export { createNoticeableDelay } from './noticeable_delay'; -export { extractQueryParams } from './query_params'; - export { setUserHasLeftApp, getUserHasLeftApp, diff --git a/x-pack/plugins/rollup/public/crud_app/services/query_params.js b/x-pack/plugins/rollup/public/crud_app/services/query_params.js deleted file mode 100644 index bdb5f5bed5c63..0000000000000 --- a/x-pack/plugins/rollup/public/crud_app/services/query_params.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export function extractQueryParams(queryString) { - if (!queryString || queryString.trim().length === 0) { - return {}; - } - - const extractedQueryParams = {}; - const queryParamPairs = queryString - .split('?')[1] - .split('&') - .map((paramString) => paramString.split('=')); - - queryParamPairs.forEach(([key, value]) => { - extractedQueryParams[key] = decodeURIComponent(value); - }); - - return extractedQueryParams; -} diff --git a/x-pack/plugins/rollup/public/crud_app/store/actions/create_job.js b/x-pack/plugins/rollup/public/crud_app/store/actions/create_job.js index c404471f803f3..6b6a0e732eb85 100644 --- a/x-pack/plugins/rollup/public/crud_app/store/actions/create_job.js +++ b/x-pack/plugins/rollup/public/crud_app/store/actions/create_job.js @@ -102,7 +102,7 @@ export const createJob = (jobConfig) => async (dispatch) => { // here, because it would partially obscure the detail panel. getRouter().history.push({ pathname: `/job_list`, - search: `?job=${jobConfig.id}`, + search: `?job=${encodeURIComponent(jobConfig.id)}`, }); }; diff --git a/x-pack/plugins/rollup/public/crud_app/store/actions/detail_panel.js b/x-pack/plugins/rollup/public/crud_app/store/actions/detail_panel.js index d01bc6b49c94c..1178cc3e79df8 100644 --- a/x-pack/plugins/rollup/public/crud_app/store/actions/detail_panel.js +++ b/x-pack/plugins/rollup/public/crud_app/store/actions/detail_panel.js @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { extractQueryParams, getRouter } from '../../services'; +import { extractQueryParams } from '../../../shared_imports'; +import { getRouter } from '../../services'; import { OPEN_DETAIL_PANEL, CLOSE_DETAIL_PANEL } from '../action_types'; export const openDetailPanel = ({ panelType, jobId }) => (dispatch) => { diff --git a/x-pack/plugins/rollup/public/shared_imports.ts b/x-pack/plugins/rollup/public/shared_imports.ts index 1ac25a1a0e5f8..2ff4bd988798a 100644 --- a/x-pack/plugins/rollup/public/shared_imports.ts +++ b/x-pack/plugins/rollup/public/shared_imports.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { indices } from '../../../../src/plugins/es_ui_shared/public'; +export { extractQueryParams, indices } from '../../../../src/plugins/es_ui_shared/public';