mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* feat(dashboard): initial commit of general settings migration to react * fix(dashboardsettings): force update of general settings when selects change * feat(dashboardsettings): initial commit of delete dashboard button and modal * feat(dashboardsettings): introduce useDashboardDelete hook * feat(dashboardsettings): add tags and editable inputs * refactor(dashboardsettings): fix typescript error in general settings * refactor(dashboardsettings): use grafana-ui form components for general settings * refactor(dashboardsettings): use ConfirmModal and move provisioned modal to own component * refactor(dashboardsettings): revertDashboardModal uses ConfirmModal * test(autorefreshintervals): remove renderCount prop to fix test * test(dashboardsettings): put back aria-label for e2e tests * chore(dashboardsettings): remove redundant generl settings angular code * test: change references to now deleted SettingsCtrl to GeneralSettings * refactor(dashboardsettings): swap out switch for inlineswitch component * chore(timepickersettings): remove timePickerSettings angular directive definition * feat(dashboardsettings): add tooltips, fix description field name * refactor(dashboardsettings): remove redundant await Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com> * refactor(usedashboarddelete): clean up Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com>
123 lines
4.3 KiB
TypeScript
123 lines
4.3 KiB
TypeScript
import React, { useState } from 'react';
|
|
import { SelectableValue, TimeZone } from '@grafana/data';
|
|
import { Select, InlineSwitch, TagsInput, InlineField, Input } from '@grafana/ui';
|
|
import { selectors } from '@grafana/e2e-selectors';
|
|
import { FolderPicker } from 'app/core/components/Select/FolderPicker';
|
|
import { DashboardModel } from '../../state/DashboardModel';
|
|
import { DeleteDashboardButton } from '../DeleteDashboard/DeleteDashboardButton';
|
|
import { TimePickerSettings } from './TimePickerSettings';
|
|
|
|
interface Props {
|
|
dashboard: DashboardModel;
|
|
}
|
|
|
|
const GRAPH_TOOLTIP_OPTIONS = [
|
|
{ value: 0, label: 'Default' },
|
|
{ value: 1, label: 'Shared crosshair' },
|
|
{ value: 2, label: 'Shared Tooltip' },
|
|
];
|
|
|
|
export const GeneralSettings: React.FC<Props> = ({ dashboard }) => {
|
|
const [renderCounter, setRenderCounter] = useState(0);
|
|
|
|
const onFolderChange = (folder: { id: number; title: string }) => {
|
|
dashboard.meta.folderId = folder.id;
|
|
dashboard.meta.folderTitle = folder.title;
|
|
dashboard.meta.hasUnsavedFolderChange = true;
|
|
};
|
|
|
|
const onBlur = (event: React.FocusEvent<HTMLInputElement>) => {
|
|
dashboard[event.currentTarget.name as 'title' | 'description'] = event.currentTarget.value;
|
|
};
|
|
|
|
const onTooltipChange = (graphTooltip: SelectableValue<number>) => {
|
|
dashboard.graphTooltip = graphTooltip.value;
|
|
setRenderCounter(renderCounter + 1);
|
|
};
|
|
|
|
const onRefreshIntervalChange = (intervals: string[]) => {
|
|
dashboard.timepicker.refresh_intervals = intervals.filter((i) => i.trim() !== '');
|
|
};
|
|
|
|
const onNowDelayChange = (nowDelay: string) => {
|
|
dashboard.timepicker.nowDelay = nowDelay;
|
|
};
|
|
|
|
const onHideTimePickerChange = (hide: boolean) => {
|
|
dashboard.timepicker.hidden = hide;
|
|
setRenderCounter(renderCounter + 1);
|
|
};
|
|
|
|
const onTimeZoneChange = (timeZone: TimeZone) => {
|
|
dashboard.timezone = timeZone;
|
|
setRenderCounter(renderCounter + 1);
|
|
};
|
|
|
|
const onTagsChange = (tags: string[]) => {
|
|
dashboard.tags = tags;
|
|
};
|
|
|
|
const onEditableChange = (ev: React.FormEvent<HTMLInputElement>) => {
|
|
dashboard.editable = ev.currentTarget.checked;
|
|
setRenderCounter(renderCounter + 1);
|
|
};
|
|
|
|
return (
|
|
<>
|
|
<h3 className="dashboard-settings__header" aria-label={selectors.pages.Dashboard.Settings.General.title}>
|
|
General
|
|
</h3>
|
|
<div className="gf-form-group">
|
|
<InlineField label="Name" labelWidth={14}>
|
|
<Input name="title" onBlur={onBlur} defaultValue={dashboard.title} width={60} />
|
|
</InlineField>
|
|
<InlineField label="Description" labelWidth={14}>
|
|
<Input name="description" onBlur={onBlur} defaultValue={dashboard.description} width={60} />
|
|
</InlineField>
|
|
<InlineField label="Tags" tooltip="Press enter to add a tag" labelWidth={14}>
|
|
<TagsInput tags={dashboard.tags} onChange={onTagsChange} />
|
|
</InlineField>
|
|
<FolderPicker
|
|
initialTitle={dashboard.meta.folderTitle}
|
|
initialFolderId={dashboard.meta.folderId}
|
|
onChange={onFolderChange}
|
|
enableCreateNew={true}
|
|
dashboardId={dashboard.id}
|
|
/>
|
|
<InlineField
|
|
label="Editable"
|
|
tooltip="Uncheck, then save and reload to disable all dashboard editing"
|
|
labelWidth={14}
|
|
>
|
|
<InlineSwitch value={dashboard.editable} onChange={onEditableChange} />
|
|
</InlineField>
|
|
</div>
|
|
<TimePickerSettings
|
|
onTimeZoneChange={onTimeZoneChange}
|
|
onRefreshIntervalChange={onRefreshIntervalChange}
|
|
onNowDelayChange={onNowDelayChange}
|
|
onHideTimePickerChange={onHideTimePickerChange}
|
|
refreshIntervals={dashboard.timepicker.refresh_intervals}
|
|
timePickerHidden={dashboard.timepicker.hidden}
|
|
nowDelay={dashboard.timepicker.nowDelay}
|
|
timezone={dashboard.timezone}
|
|
/>
|
|
|
|
<h5 className="section-heading">Panel Options</h5>
|
|
<div className="gf-form">
|
|
<InlineField label="Graph Tooltip" labelWidth={14}>
|
|
<Select
|
|
onChange={onTooltipChange}
|
|
options={GRAPH_TOOLTIP_OPTIONS}
|
|
width={40}
|
|
value={dashboard.graphTooltip}
|
|
/>
|
|
</InlineField>
|
|
</div>
|
|
<div className="gf-form-button-row">
|
|
{dashboard.meta.canSave && <DeleteDashboardButton dashboard={dashboard} />}
|
|
</div>
|
|
</>
|
|
);
|
|
};
|