-
Notifications
You must be signed in to change notification settings - Fork 8.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Uptime] Add Settings Page #53550
[Uptime] Add Settings Page #53550
Changes from 92 commits
d408981
49665d4
3947cac
8247b21
7f5e8b6
a1bc3ff
0e5cf0a
4a04c71
b03253d
e6af3f9
ba99dd9
134018c
5150e14
29a26ca
90acfd0
4cd5daa
4c16ec3
be3d8dc
4d8830b
c96241c
cc4ab4b
d26d7a9
252dbbd
8879189
daa38be
54e303b
7a1d1c3
e38c263
dfb879c
b4ed4f0
d917bbd
88cf2b9
8940500
79541a3
ba99f79
fecd39b
0c5a4be
800fc39
2ea3da5
43b0180
c37beee
28bf3cd
f790060
f142580
d73c8fd
4c427fe
fe2bd0c
379ffff
44a9661
6366a7c
bd64489
b8570c8
409a3f0
2023b43
75acc74
69a1670
de99c50
0bc3b51
8b26a88
4df2f4b
61f7b42
56160c6
8507737
42d908c
2154b69
6fc4d1c
88a8270
9ff2c92
be5e839
16ac622
dbe68c1
838f9da
0b6785d
8332b5d
2ea058c
7f2d080
129b4b3
a9b3abf
c7bf15c
3d86dd9
b5e5ab9
b24a00c
27fda4c
87edaf8
6296c93
e4dcbfc
eada6da
4a8abb2
1ad5741
7fe5e49
b35ef72
1bc87ee
9ce1004
37d0545
12c3347
bcadf4c
b794065
474d1dd
e5c8298
c99d896
b93eb0f
8b75416
18a6cb6
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
/* | ||
* 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. | ||
*/ | ||
|
||
import * as t from 'io-ts'; | ||
|
||
export const DynamicSettingsType = t.type({ | ||
heartbeatIndices: t.string, | ||
}); | ||
|
||
export const DynamicSettingsSaveType = t.intersection([ | ||
t.type({ | ||
success: t.boolean, | ||
}), | ||
t.partial({ | ||
error: t.string, | ||
}), | ||
]); | ||
|
||
export type DynamicSettings = t.TypeOf<typeof DynamicSettingsType>; | ||
export type DynamicSettingsSaveResponse = t.TypeOf<typeof DynamicSettingsSaveType>; | ||
|
||
export const defaultDynamicSettings: DynamicSettings = { | ||
heartbeatIndices: 'heartbeat-8*', | ||
}; | ||
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
/* | ||
* 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. | ||
*/ | ||
|
||
import { ChromeBreadcrumb } from 'kibana/public'; | ||
import React from 'react'; | ||
import { Route } from 'react-router-dom'; | ||
import { mountWithRouter } from '../../lib'; | ||
import { OVERVIEW_ROUTE } from '../../../common/constants'; | ||
import { KibanaContextProvider } from '../../../../../../../src/plugins/kibana_react/public'; | ||
import { UptimeUrlParams, getSupportedUrlParams } from '../../lib/helper'; | ||
import { makeBaseBreadcrumb, useBreadcrumbs } from '../../hooks/use_breadcrumbs'; | ||
|
||
describe('useBreadcrumbs', () => { | ||
it('sets the given breadcrumbs', () => { | ||
const [getBreadcrumbs, core] = mockCore(); | ||
|
||
const expectedCrumbs: ChromeBreadcrumb[] = [ | ||
{ | ||
text: 'Crumb: ', | ||
href: 'http://href.example.net', | ||
}, | ||
{ | ||
text: 'Crumb II: Son of Crumb', | ||
href: 'http://href2.example.net', | ||
}, | ||
]; | ||
|
||
const Component = () => { | ||
useBreadcrumbs(expectedCrumbs); | ||
return <>Hello</>; | ||
}; | ||
|
||
mountWithRouter( | ||
<KibanaContextProvider services={{ ...core }}> | ||
<Route path={OVERVIEW_ROUTE}> | ||
<Component /> | ||
</Route> | ||
</KibanaContextProvider> | ||
); | ||
|
||
const urlParams: UptimeUrlParams = getSupportedUrlParams({}); | ||
expect(getBreadcrumbs()).toStrictEqual([makeBaseBreadcrumb(urlParams)].concat(expectedCrumbs)); | ||
}); | ||
}); | ||
|
||
const mockCore: () => [() => ChromeBreadcrumb[], any] = () => { | ||
let breadcrumbObj: ChromeBreadcrumb[] = []; | ||
const get = () => { | ||
return breadcrumbObj; | ||
}; | ||
const core = { | ||
chrome: { | ||
setBreadcrumbs: (newBreadcrumbs: ChromeBreadcrumb[]) => { | ||
breadcrumbObj = newBreadcrumbs; | ||
}, | ||
}, | ||
}; | ||
|
||
return [get, core]; | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/* | ||
* 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. | ||
*/ | ||
|
||
import { ChromeBreadcrumb } from 'kibana/public'; | ||
import { i18n } from '@kbn/i18n'; | ||
import { useEffect } from 'react'; | ||
import { UptimeUrlParams } from '../lib/helper'; | ||
import { stringifyUrlParams } from '../lib/helper/stringify_url_params'; | ||
import { useKibana } from '../../../../../../src/plugins/kibana_react/public'; | ||
import { useUrlParams } from '.'; | ||
|
||
export const makeBaseBreadcrumb = (params?: UptimeUrlParams): ChromeBreadcrumb => { | ||
let href = '#/'; | ||
if (params) { | ||
const crumbParams: Partial<UptimeUrlParams> = { ...params }; | ||
// We don't want to encode this values because they are often set to Date.now(), the relative | ||
// values in dateRangeStart are better for a URL. | ||
delete crumbParams.absoluteDateRangeStart; | ||
delete crumbParams.absoluteDateRangeEnd; | ||
href += stringifyUrlParams(crumbParams, true); | ||
} | ||
return { | ||
text: i18n.translate('xpack.uptime.breadcrumbs.overviewBreadcrumbText', { | ||
defaultMessage: 'Uptime', | ||
}), | ||
href, | ||
}; | ||
}; | ||
|
||
export const useBreadcrumbs = (extraCrumbs: ChromeBreadcrumb[]) => { | ||
const params = useUrlParams()[0](); | ||
const setBreadcrumbs = useKibana().services.chrome?.setBreadcrumbs; | ||
useEffect(() => { | ||
if (setBreadcrumbs) { | ||
setBreadcrumbs([makeBaseBreadcrumb(params)].concat(extraCrumbs)); | ||
} | ||
}); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. you can optimize it by passing effect depencies array, that way it will be only called when extracrumbs really changes, right now this will be called each time component renders. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done! |
||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't this be moved to constants?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would argue that not everything needs to be a constant, it's just an extra file. Mind if we try putting some stuff more inline? It is in the
common
folder and is near it's natural home IMHO, which is theDynamicSettings
type definition.