Submit
Path:
~
/
/
proc
/
thread-self
/
root
/
usr
/
share
/
grafana
/
public
/
app
/
features
/
datasources
/
components
/
File Content:
EditDataSource.tsx
import { AnyAction } from '@reduxjs/toolkit'; import { omit } from 'lodash'; import React, { useMemo } from 'react'; import { DataSourcePluginContextProvider, DataSourcePluginMeta, DataSourceSettings as DataSourceSettingsType, PluginExtensionPoints, PluginExtensionDataSourceConfigContext, DataSourceJsonData, DataSourceUpdatedSuccessfully, } from '@grafana/data'; import { getDataSourceSrv, getPluginComponentExtensions } from '@grafana/runtime'; import appEvents from 'app/core/app_events'; import PageLoader from 'app/core/components/PageLoader/PageLoader'; import { DataSourceSettingsState, useDispatch } from 'app/types'; import { dataSourceLoaded, setDataSourceName, setIsDefault, useDataSource, useDataSourceExploreUrl, useDataSourceMeta, useDataSourceRights, useDataSourceSettings, useDeleteLoadedDataSource, useInitDataSourceSettings, useTestDataSource, useUpdateDatasource, } from '../state'; import { trackDsConfigClicked, trackDsConfigUpdated } from '../tracking'; import { DataSourceRights } from '../types'; import { BasicSettings } from './BasicSettings'; import { ButtonRow } from './ButtonRow'; import { CloudInfoBox } from './CloudInfoBox'; import { DataSourceLoadError } from './DataSourceLoadError'; import { DataSourceMissingRightsMessage } from './DataSourceMissingRightsMessage'; import { DataSourcePluginConfigPage } from './DataSourcePluginConfigPage'; import { DataSourcePluginSettings } from './DataSourcePluginSettings'; import { DataSourcePluginState } from './DataSourcePluginState'; import { DataSourceReadOnlyMessage } from './DataSourceReadOnlyMessage'; import { DataSourceTestingStatus } from './DataSourceTestingStatus'; export type Props = { // The ID of the data source uid: string; // The ID of the custom datasource setting page pageId?: string | null; }; export function EditDataSource({ uid, pageId }: Props) { useInitDataSourceSettings(uid); const dispatch = useDispatch(); const dataSource = useDataSource(uid); const dataSourceMeta = useDataSourceMeta(dataSource.type); const dataSourceSettings = useDataSourceSettings(); const dataSourceRights = useDataSourceRights(uid); const exploreUrl = useDataSourceExploreUrl(uid); const onDelete = useDeleteLoadedDataSource(); const onTest = useTestDataSource(uid); const onUpdate = useUpdateDatasource(); const onDefaultChange = (value: boolean) => dispatch(setIsDefault(value)); const onNameChange = (name: string) => dispatch(setDataSourceName(name)); const onOptionsChange = (ds: DataSourceSettingsType) => dispatch(dataSourceLoaded(ds)); return ( <EditDataSourceView pageId={pageId} dataSource={dataSource} dataSourceMeta={dataSourceMeta} dataSourceSettings={dataSourceSettings} dataSourceRights={dataSourceRights} exploreUrl={exploreUrl} onDelete={onDelete} onDefaultChange={onDefaultChange} onNameChange={onNameChange} onOptionsChange={onOptionsChange} onTest={onTest} onUpdate={onUpdate} /> ); } export type ViewProps = { pageId?: string | null; dataSource: DataSourceSettingsType; dataSourceMeta: DataSourcePluginMeta; dataSourceSettings: DataSourceSettingsState; dataSourceRights: DataSourceRights; exploreUrl: string; onDelete: () => void; onDefaultChange: (isDefault: boolean) => AnyAction; onNameChange: (name: string) => AnyAction; onOptionsChange: (dataSource: DataSourceSettingsType) => AnyAction; onTest: () => void; onUpdate: (dataSource: DataSourceSettingsType) => Promise<DataSourceSettingsType>; }; export function EditDataSourceView({ pageId, dataSource, dataSourceMeta, dataSourceSettings, dataSourceRights, exploreUrl, onDelete, onDefaultChange, onNameChange, onOptionsChange, onTest, onUpdate, }: ViewProps) { const { plugin, loadError, testingStatus, loading } = dataSourceSettings; const { readOnly, hasWriteRights, hasDeleteRights } = dataSourceRights; const hasDataSource = dataSource.id > 0; const dsi = getDataSourceSrv()?.getInstanceSettings(dataSource.uid); const onSubmit = async (e: React.MouseEvent<HTMLButtonElement> | React.FormEvent<HTMLFormElement>) => { e.preventDefault(); trackDsConfigClicked('save_and_test'); try { await onUpdate({ ...dataSource }); trackDsConfigUpdated({ item: 'success' }); appEvents.publish(new DataSourceUpdatedSuccessfully()); } catch (error) { trackDsConfigUpdated({ item: 'fail' }); return; } onTest(); }; const extensions = useMemo(() => { const allowedPluginIds = ['grafana-pdc-app', 'grafana-auth-app']; const extensionPointId = PluginExtensionPoints.DataSourceConfig; const { extensions } = getPluginComponentExtensions({ extensionPointId }); return extensions.filter((e) => allowedPluginIds.includes(e.pluginId)); }, []); if (loadError) { return ( <DataSourceLoadError dataSourceRights={dataSourceRights} onDelete={() => { trackDsConfigClicked('delete'); onDelete(); }} /> ); } if (loading) { return <PageLoader />; } // TODO - is this needed? if (!hasDataSource || !dsi) { return null; } if (pageId) { return ( <DataSourcePluginContextProvider instanceSettings={dsi}> <DataSourcePluginConfigPage pageId={pageId} plugin={plugin} /> </DataSourcePluginContextProvider> ); } return ( <form onSubmit={onSubmit}> {!hasWriteRights && <DataSourceMissingRightsMessage />} {readOnly && <DataSourceReadOnlyMessage />} {dataSourceMeta.state && <DataSourcePluginState state={dataSourceMeta.state} />} <CloudInfoBox dataSource={dataSource} /> <BasicSettings dataSourceName={dataSource.name} isDefault={dataSource.isDefault} onDefaultChange={onDefaultChange} onNameChange={onNameChange} disabled={readOnly || !hasWriteRights} /> {plugin && ( <DataSourcePluginContextProvider instanceSettings={dsi}> <DataSourcePluginSettings plugin={plugin} dataSource={dataSource} dataSourceMeta={dataSourceMeta} onModelChange={onOptionsChange} /> </DataSourcePluginContextProvider> )} {/* Extension point */} {extensions.map((extension) => { const Component = extension.component as React.ComponentType<{ context: PluginExtensionDataSourceConfigContext<DataSourceJsonData>; }>; return ( <div key={extension.id}> <Component context={{ dataSource: omit(dataSource, ['secureJsonData']), dataSourceMeta: dataSourceMeta, testingStatus, setJsonData: (jsonData) => onOptionsChange({ ...dataSource, jsonData: { ...dataSource.jsonData, ...jsonData }, }), }} /> </div> ); })} <DataSourceTestingStatus testingStatus={testingStatus} exploreUrl={exploreUrl} dataSource={dataSource} /> <ButtonRow onSubmit={onSubmit} onDelete={() => { trackDsConfigClicked('delete'); onDelete(); }} onTest={() => { trackDsConfigClicked('test'); onTest(); }} canDelete={!readOnly && hasDeleteRights} canSave={!readOnly && hasWriteRights} /> </form> ); }
Submit
FILE
FOLDER
INFO
Name
Size
Permission
Action
picker
---
0755
BasicSettings.test.tsx
682 bytes
0644
BasicSettings.tsx
2358 bytes
0644
ButtonRow.test.tsx
876 bytes
0644
ButtonRow.tsx
1160 bytes
0644
CloudInfoBox.tsx
2179 bytes
0644
DashboardsTable.test.tsx
3372 bytes
0644
DashboardsTable.tsx
2137 bytes
0644
DataSourceAddButton.tsx
754 bytes
0644
DataSourceCategories.tsx
1379 bytes
0644
DataSourceDashboards.test.tsx
1476 bytes
0644
DataSourceDashboards.tsx
2417 bytes
0644
DataSourceLoadError.tsx
917 bytes
0644
DataSourceMissingRightsMessage.tsx
379 bytes
0644
DataSourcePluginConfigPage.tsx
576 bytes
0644
DataSourcePluginSettings.tsx
2480 bytes
0644
DataSourcePluginState.tsx
508 bytes
0644
DataSourceReadOnlyMessage.tsx
520 bytes
0644
DataSourceTabPage.tsx
1166 bytes
0644
DataSourceTestingStatus.test.tsx
3313 bytes
0644
DataSourceTestingStatus.tsx
4054 bytes
0644
DataSourceTitle.tsx
779 bytes
0644
DataSourceTypeCard.tsx
3209 bytes
0644
DataSourceTypeCardList.tsx
961 bytes
0644
DataSourcesList.test.tsx
1787 bytes
0644
DataSourcesList.tsx
3664 bytes
0644
DataSourcesListCard.tsx
3749 bytes
0644
DataSourcesListHeader.tsx
1672 bytes
0644
EditDataSource.test.tsx
10928 bytes
0644
EditDataSource.tsx
7557 bytes
0644
EditDataSourceActions.tsx
1717 bytes
0644
NewDataSource.tsx
3154 bytes
0644
useDataSourceInfo.tsx
691 bytes
0644
N4ST4R_ID | Naxtarrr