diff --git a/.betterer.results b/.betterer.results index b11063eae47..e6c62adfd30 100644 --- a/.betterer.results +++ b/.betterer.results @@ -901,9 +901,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "4"], [0, 0, 0, "Unexpected any. Specify a different type.", "5"] ], - "public/app/core/components/LocalStorageValueProvider/index.tsx:5381": [ - [0, 0, 0, "Do not re-export imported variable (\`./LocalStorageValueProvider\`)", "0"] - ], "public/app/core/components/Login/LoginForm.tsx:5381": [ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"], [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"] @@ -978,11 +975,10 @@ exports[`better eslint`] = { [0, 0, 0, "Do not re-export imported variable (\`JsonExplorer\`)", "0"], [0, 0, 0, "Do not re-export imported variable (\`TimeSeries\`)", "1"], [0, 0, 0, "Do not re-export imported variable (\`appEvents\`)", "2"], - [0, 0, 0, "Do not re-export imported variable (\`assignModelProperties\`)", "3"], - [0, 0, 0, "Do not re-export imported variable (\`colors\`)", "4"], - [0, 0, 0, "Do not re-export imported variable (\`contextSrv\`)", "5"], - [0, 0, 0, "Do not re-export imported variable (\`profiler\`)", "6"], - [0, 0, 0, "Do not re-export imported variable (\`updateLegendValues\`)", "7"] + [0, 0, 0, "Do not re-export imported variable (\`colors\`)", "3"], + [0, 0, 0, "Do not re-export imported variable (\`contextSrv\`)", "4"], + [0, 0, 0, "Do not re-export imported variable (\`profiler\`)", "5"], + [0, 0, 0, "Do not re-export imported variable (\`updateLegendValues\`)", "6"] ], "public/app/core/navigation/types.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e667e9fe6e0..9e86707ac0c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -679,23 +679,143 @@ playwright.storybook.config.ts @grafana/grafana-frontend-platform # public folder /public/app/api/ @grafana/grafana-frontend-platform -/public/app/core/ @grafana/grafana-frontend-platform -/public/app/core/components/TimePicker/ @grafana/grafana-frontend-platform -/public/app/core/components/Layers/ @grafana/dataviz-squad -/public/app/core/components/GraphNG/ @grafana/dataviz-squad -/public/app/core/components/TimeSeries/ @grafana/dataviz-squad -/public/app/core/components/TimelineChart/ @grafana/dataviz-squad +/public/app/core/actions/ @grafana/grafana-frontend-platform +/public/app/core/app_events.ts @grafana/grafana-frontend-platform +/public/app/core/components/AccessControl/ @grafana/identity-access-team +/public/app/core/components/Animations/ @grafana/grafana-frontend-platform +/public/app/core/components/AppNotifications/ @grafana/grafana-search-navigate-organise +/public/app/core/components/AppChrome/ @grafana/grafana-search-navigate-organise +/public/app/core/components/Branding/ @grafana/grafana-frontend-platform +/public/app/core/components/Breadcrumbs/ @grafana/grafana-search-navigate-organise +/public/app/core/components/BouncingLoader/ @grafana/grafana-frontend-platform +/public/app/core/components/CardButton.tsx @grafana/dashboards-squad +/public/app/core/components/CloseButton/ @grafana/grafana-frontend-platform +/public/app/core/components/ColorScale/ @grafana/dataviz-squad +/public/app/core/components/DynamicImports/ @grafana/grafana-search-navigate-organise +/public/app/core/components/EmptyListCTA/ @grafana/grafana-frontend-platform +/public/app/core/components/FolderFilter/ @grafana/sharing-squad +/public/app/core/components/Footer/ @grafana/grafana-search-navigate-organise +/public/app/core/components/ForgottenPassword/ @grafana/grafana-search-navigate-organise /public/app/core/components/Form/ @grafana/grafana-frontend-platform +/public/app/core/components/FormPrompt/ @grafana/grafana-frontend-platform +/public/app/core/components/GraphNG/ @grafana/dataviz-squad +/public/app/core/components/help/ @grafana/grafana-search-navigate-organise +/public/app/core/components/Indent/ @grafana/grafana-search-navigate-organise +/public/app/core/components/InviteUserButton/ @grafana/sharing-squad +/public/app/core/components/Layers/ @grafana/dataviz-squad +/public/app/core/components/Login/ @grafana/grafana-search-navigate-organise +/public/app/core/components/NativeScrollbar.tsx @grafana/grafana-search-navigate-organise +/public/app/core/components/NavLandingPage/ @grafana/grafana-search-navigate-organise +/public/app/core/components/NestedFolderPicker/ @grafana/grafana-search-navigate-organise /public/app/core/components/OptionsUI/ @grafana/dashboards-squad @grafana/dataviz-squad +/public/app/core/components/Page/ @grafana/grafana-search-navigate-organise +/public/app/core/components/PageActionBar/ @grafana/grafana-search-navigate-organise +/public/app/core/components/PageInfo/ @grafana/grafana-search-navigate-organise +/public/app/core/components/PageLoader/ @grafana/grafana-search-navigate-organise +/public/app/core/components/PageNotFound/ @grafana/grafana-search-navigate-organise +/public/app/core/components/PanelTypeFilter/ @grafana/sharing-squad +/public/app/core/components/PasswordField/ @grafana/grafana-frontend-platform +/public/app/core/components/PluginHelp/ @grafana/plugins-platform-frontend +/public/app/core/components/QueryOperationRow/ @grafana/dashboards-squad +/public/app/core/components/RolePickerDrawer/ @grafana/identity-access-team +/public/app/core/components/Select/ @grafana/grafana-frontend-platform +/public/app/core/components/SharedPreferences/ @grafana/grafana-frontend-platform +/public/app/core/components/Signup/ @grafana/grafana-search-navigate-organise +/public/app/core/components/SplitPaneWrapper/ @grafana/observability-traces-and-profiling +/public/app/core/components/SVG/ @grafana/dataviz-squad +/public/app/core/components/TagFilter/ @grafana/grafana-frontend-platform +/public/app/core/components/Theme/ @grafana/grafana-frontend-platform +/public/app/core/components/ThemeSelector/ @grafana/grafana-frontend-platform +/public/app/core/components/TimelineChart/ @grafana/dataviz-squad +/public/app/core/components/TimePicker/ @grafana/grafana-frontend-platform +/public/app/core/components/TimeSeries/ @grafana/dataviz-squad +/public/app/core/components/Upgrade/ @grafana/grafana-operator-experience-squad +/public/app/core/components/ValidationLabels/ @grafana/grafana-search-navigate-organise +/public/app/core/components/VersionHistory/ @grafana/dashboards-squad +/public/app/core/config.ts @grafana/grafana-frontend-platform +/public/app/core/constants.ts @grafana/grafana-frontend-platform +/public/app/core/context/ @grafana/grafana-frontend-platform +/public/app/core/copy/appNotification.ts @grafana/grafana-search-navigate-organise +/public/app/core/core.ts @grafana/grafana-frontend-platform +/public/app/core/crash/ @grafana/observability-traces-and-profiling +/public/app/core/history/ @grafana/observability-traces-and-profiling +/public/app/core/hooks/useBusEvent.ts @grafana/grafana-frontend-platform +/public/app/core/hooks/useCleanup.ts @grafana/grafana-frontend-platform +/public/app/core/hooks/useMediaQueryMinWidth.ts @grafana/grafana-frontend-platform +/public/app/core/hooks/useNavModel.ts @grafana/grafana-search-navigate-organise +/public/app/core/hooks/useQueryParams.ts @grafana/grafana-frontend-platform +/public/app/core/icons/ @grafana/grafana-frontend-platform +/public/app/core/lifecycle-hooks.ts @grafana/grafana-frontend-platform +/public/app/core/log_events.ts @grafana/dashboards-squad +/public/app/core/monacoEnv.ts @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend +/public/app/core/navigation/ @grafana/grafana-search-navigate-organise +/public/app/core/profiler.ts @grafana/dashboards-squad +/public/app/core/reducers/ @grafana/grafana-frontend-platform +/public/app/core/selectors/ @grafana/grafana-frontend-platform +/public/app/core/services/__mocks__/backend_srv.ts @grafana/grafana-frontend-platform +/public/app/core/services/backend_srv.ts @grafana/grafana-frontend-platform +/public/app/core/services/context_srv.ts @grafana/grafana-frontend-platform +/public/app/core/services/CorrelationsService.ts @grafana/datapro +/public/app/core/services/echo/ @grafana/grafana-frontend-platform +/public/app/core/services/FetchQueue* @grafana/grafana-frontend-platform +/public/app/core/services/impression_srv.ts @grafana/grafana-frontend-platform +/public/app/core/services/KeybindingSet* @grafana/grafana-frontend-platform +/public/app/core/services/keybindingSrv.ts @grafana/grafana-frontend-platform +/public/app/core/services/mocks/subscribeTester.ts @grafana/grafana-frontend-platform +/public/app/core/services/mousetrap/ @grafana/grafana-frontend-platform +/public/app/core/services/NewFrontendAssetsChecker* @grafana/grafana-frontend-platform +/public/app/core/services/PreferencesService.ts @grafana/grafana-frontend-platform +/public/app/core/services/ResponseQueue* @grafana/grafana-frontend-platform +/public/app/core/services/StateManagerBase.ts @grafana/grafana-frontend-platform +/public/app/core/services/theme.ts @grafana/grafana-frontend-platform +/public/app/core/specs/backend_srv.test.ts @grafana/grafana-frontend-platform +/public/app/core/specs/factors.test.ts @grafana/dashboards-squad +/public/app/core/specs/flatten.test.ts @grafana/grafana-frontend-platform +/public/app/core/specs/impression_srv.test.ts @grafana/grafana-frontend-platform +/public/app/core/specs/rangeutil.test.ts @grafana/grafana-frontend-platform +/public/app/core/specs/store.test.ts @grafana/grafana-frontend-platform +/public/app/core/specs/TableModel.test.ts @grafana/partner-datasources +/public/app/core/specs/ticks.test.ts @grafana/plugins-platform-frontend +/public/app/core/specs/time_series.test.ts @grafana/dataviz-squad +/public/app/core/store.ts @grafana/grafana-frontend-platform +/public/app/core/TableModel.ts @grafana/partner-datasources +/public/app/core/time_series2.ts @grafana/dataviz-squad +/public/app/core/trustedTypePolicies.ts @grafana/grafana-frontend-platform +/public/app/core/utils/accessControl.ts @grafana/identity-access-team +/public/app/core/utils/applyStateChanges.ts @grafana/dashboards-squad +/public/app/core/utils/arrayMove.ts @grafana/grafana-frontend-platform +/public/app/core/utils/auth.ts @grafana/identity-access-team +/public/app/core/utils/browser* @grafana/grafana-frontend-platform +/public/app/core/utils/colors.ts @grafana/grafana-frontend-platform +/public/app/core/utils/ConfigProvider.tsx @grafana/grafana-frontend-platform +/public/app/core/utils/CorsSharedWorker.ts @grafana/grafana-frontend-platform +/public/app/core/utils/CorsWorker.ts @grafana/grafana-frontend-platform +/public/app/core/utils/connectWithReduxStore.tsx @grafana/grafana-frontend-platform +/public/app/core/utils/dag* @grafana/grafana-frontend-platform +/public/app/core/utils/deferred.ts @grafana/grafana-frontend-platform +/public/app/core/utils/docsLinks.ts @grafana/grafana-frontend-platform +/public/app/core/utils/errors* @grafana/grafana-frontend-platform +/public/app/core/utils/explore* @grafana/observability-traces-and-profiling +/public/app/core/utils/factors.ts @grafana/dashboards-squad +/public/app/core/utils/fetch* @grafana/grafana-frontend-platform +/public/app/core/utils/flatten.ts @grafana/grafana-frontend-platform +/public/app/core/utils/isShallowEqual.ts @grafana/grafana-frontend-platform +/public/app/core/utils/kbn* @grafana/grafana-frontend-platform +/public/app/core/utils/navBarItem-translations.ts @grafana/grafana-search-navigate-organise +/public/app/core/utils/object* @grafana/grafana-frontend-platform +/public/app/core/utils/query* @grafana/grafana-datasources-core-services +/public/app/core/utils/richHistory* @grafana/observability-traces-and-profiling +/public/app/core/utils/set.ts @grafana/grafana-frontend-platform +/public/app/core/utils/shortLinks* @grafana/sharing-squad +/public/app/core/utils/ticks.ts @grafana/plugins-platform-frontend +/public/app/core/utils/timePicker* @grafana/grafana-frontend-platform +/public/app/core/utils/timeRegions* @grafana/dataviz-squad +/public/app/core/utils/urlToken.ts @grafana/identity-access-team +/public/app/core/utils/version.ts @grafana/partner-datasources /public/app/dev-utils.ts @grafana/grafana-frontend-platform -/public/app/core/history/ @grafana/observability-traces-and-profiling -/public/app/features/admin/ @grafana/identity-access-team - -# Temp owners until Enterprise team takes over -/public/app/features/migrate-to-cloud @grafana/grafana-frontend-platform - /public/app/features/actions/ @grafana/dataviz-squad +/public/app/features/admin/ @grafana/identity-access-team /public/app/features/auth-config/ @grafana/identity-squad /public/app/features/annotations/ @grafana/dashboards-squad /public/app/features/canvas/ @grafana/dataviz-squad @@ -719,6 +839,7 @@ playwright.storybook.config.ts @grafana/grafana-frontend-platform /public/app/features/live/ @grafana/dashboards-squad /public/app/features/apiserver/ @grafana/grafana-app-platform-squad /public/app/features/manage-dashboards/ @grafana/dashboards-squad +/public/app/features/migrate-to-cloud @grafana/grafana-operator-experience-squad /public/app/features/notifications/ @grafana/grafana-search-navigate-organise /public/app/features/org/ @grafana/grafana-search-navigate-organise /public/app/features/panel/ @grafana/dashboards-squad diff --git a/public/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx b/public/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx deleted file mode 100644 index 6d6804d5bba..00000000000 --- a/public/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { useEffect, useState } from 'react'; -import * as React from 'react'; - -import store from '../../store'; - -export interface Props { - storageKey: string; - defaultValue: T; - children: (value: T, onSaveToStore: (value: T) => void, onDeleteFromStore: () => void) => React.ReactNode; -} - -export const LocalStorageValueProvider = (props: Props) => { - const { children, storageKey, defaultValue } = props; - - const [state, setState] = useState({ value: store.getObject(props.storageKey, props.defaultValue) }); - - useEffect(() => { - const onStorageUpdate = (v: StorageEvent) => { - if (v.key === storageKey) { - setState({ value: store.getObject(props.storageKey, props.defaultValue) }); - } - }; - - window.addEventListener('storage', onStorageUpdate); - - return () => { - window.removeEventListener('storage', onStorageUpdate); - }; - }); - - const onSaveToStore = (value: T) => { - try { - store.setObject(storageKey, value); - } catch (error) { - console.error(error); - } - setState({ value }); - }; - - const onDeleteFromStore = () => { - try { - store.delete(storageKey); - } catch (error) { - console.log(error); - } - setState({ value: defaultValue }); - }; - - return <>{children(state.value, onSaveToStore, onDeleteFromStore)}; -}; diff --git a/public/app/core/components/LocalStorageValueProvider/index.tsx b/public/app/core/components/LocalStorageValueProvider/index.tsx deleted file mode 100644 index e4bde7ccaea..00000000000 --- a/public/app/core/components/LocalStorageValueProvider/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { LocalStorageValueProvider } from './LocalStorageValueProvider'; diff --git a/public/app/core/components/TimePicker/TimePickerWithHistory.tsx b/public/app/core/components/TimePicker/TimePickerWithHistory.tsx index f866691ede0..54b9cedf608 100644 --- a/public/app/core/components/TimePicker/TimePickerWithHistory.tsx +++ b/public/app/core/components/TimePicker/TimePickerWithHistory.tsx @@ -1,12 +1,10 @@ import { uniqBy } from 'lodash'; -import { AppEvents, DateTime, TimeRange, isDateTime, rangeUtil } from '@grafana/data'; +import { AppEvents, DateTime, LocalStorageValueProvider, TimeRange, isDateTime, rangeUtil } from '@grafana/data'; import { t } from '@grafana/i18n'; import { TimeRangePickerProps, TimeRangePicker } from '@grafana/ui'; import appEvents from 'app/core/app_events'; -import { LocalStorageValueProvider } from '../LocalStorageValueProvider'; - const LOCAL_STORAGE_KEY = 'grafana.dashboard.timepicker.history'; const MAX_HISTORY_ITEMS = 4; diff --git a/public/app/core/components/WithFeatureToggle.tsx b/public/app/core/components/WithFeatureToggle.tsx deleted file mode 100644 index 9f24edb36f0..00000000000 --- a/public/app/core/components/WithFeatureToggle.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import * as React from 'react'; - -export interface Props { - featureToggle: boolean; -} - -export const WithFeatureToggle = ({ featureToggle, children }: React.PropsWithChildren) => { - if (featureToggle === true) { - return <>{children}; - } - - return null; -}; diff --git a/public/app/core/core.ts b/public/app/core/core.ts index 80421c5d2f3..7adfd4242b7 100644 --- a/public/app/core/core.ts +++ b/public/app/core/core.ts @@ -4,6 +4,5 @@ import appEvents from './app_events'; import { profiler } from './profiler'; import { contextSrv } from './services/context_srv'; import TimeSeries, { updateLegendValues } from './time_series2'; -import { assignModelProperties } from './utils/model_utils'; -export { profiler, appEvents, colors, assignModelProperties, contextSrv, JsonExplorer, TimeSeries, updateLegendValues }; +export { profiler, appEvents, colors, contextSrv, JsonExplorer, TimeSeries, updateLegendValues }; diff --git a/public/app/core/lodash_extended.ts b/public/app/core/lodash_extended.ts deleted file mode 100644 index f62be00e98c..00000000000 --- a/public/app/core/lodash_extended.ts +++ /dev/null @@ -1,12 +0,0 @@ -// eslint-disable-next-line lodash/import-scope -import _ from 'lodash'; - -/* - Mixins :) -*/ -_.mixin({ - move: (array, fromIndex, toIndex) => { - array.splice(toIndex, 0, array.splice(fromIndex, 1)[0]); - return array; - }, -}); diff --git a/public/app/core/services/mocks/search_srv.ts b/public/app/core/services/mocks/search_srv.ts deleted file mode 100644 index 491e53b69c4..00000000000 --- a/public/app/core/services/mocks/search_srv.ts +++ /dev/null @@ -1,22 +0,0 @@ -export const mockSearch = jest.fn(() => { - return Promise.resolve([]); -}); - -export const mockGetDashboardTags = jest.fn(async () => - Promise.resolve([ - { term: 'tag1', count: 2 }, - { term: 'tag2', count: 10 }, - ]) -); - -export const mockGetSortOptions = jest.fn(() => - Promise.resolve({ sortOptions: [{ name: 'test', displayName: 'Test' }] }) -); - -export const SearchSrv = jest.fn().mockImplementation(() => { - return { - search: mockSearch, - getDashboardTags: mockGetDashboardTags, - getSortOptions: mockGetSortOptions, - }; -}); diff --git a/public/app/core/utils/model_utils.ts b/public/app/core/utils/model_utils.ts deleted file mode 100644 index d0e5a40e479..00000000000 --- a/public/app/core/utils/model_utils.ts +++ /dev/null @@ -1,14 +0,0 @@ -export function assignModelProperties( - target: Record, - source: Record, - defaults: Record, - removeDefaults?: undefined -) { - for (const key in defaults) { - if (!defaults.hasOwnProperty(key)) { - continue; - } - - target[key] = source[key] === undefined ? defaults[key] : source[key]; - } -} diff --git a/public/app/features/dashboard/components/TransformationsEditor/TransformationPicker.tsx b/public/app/features/dashboard/components/TransformationsEditor/TransformationPicker.tsx index 23a94ffe8cb..6f2d0f03450 100644 --- a/public/app/features/dashboard/components/TransformationsEditor/TransformationPicker.tsx +++ b/public/app/features/dashboard/components/TransformationsEditor/TransformationPicker.tsx @@ -1,11 +1,10 @@ import { css } from '@emotion/css'; import { FormEventHandler, KeyboardEventHandler, ReactNode } from 'react'; -import { DocsId, GrafanaTheme2, TransformerRegistryItem } from '@grafana/data'; +import { DocsId, GrafanaTheme2, LocalStorageValueProvider, TransformerRegistryItem } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { Trans, t } from '@grafana/i18n'; import { Card, Container, VerticalGroup, Alert, Input, useStyles2 } from '@grafana/ui'; -import { LocalStorageValueProvider } from 'app/core/components/LocalStorageValueProvider'; import { getDocsLink } from 'app/core/utils/docsLinks'; import { PluginStateInfo } from 'app/features/plugins/components/PluginStateInfo'; diff --git a/public/app/features/datasources/components/CloudInfoBox.tsx b/public/app/features/datasources/components/CloudInfoBox.tsx index 10f1d3c2146..c274f91e121 100644 --- a/public/app/features/datasources/components/CloudInfoBox.tsx +++ b/public/app/features/datasources/components/CloudInfoBox.tsx @@ -1,8 +1,7 @@ -import { DataSourceSettings } from '@grafana/data'; +import { DataSourceSettings, LocalStorageValueProvider } from '@grafana/data'; import { GrafanaEdition } from '@grafana/data/internal'; import { Trans, t } from '@grafana/i18n'; import { Alert, TextLink } from '@grafana/ui'; -import { LocalStorageValueProvider } from 'app/core/components/LocalStorageValueProvider'; import { config } from 'app/core/config'; const LOCAL_STORAGE_KEY = 'datasources.settings.cloudInfoBox.isDismissed';