mirror of https://github.com/grafana/grafana
Storage: add `delete` / `deleteFolder` / `createFolder` (#51887)
* delete / delete folder / create folder * add backend tests * implement force delete * fix merge * lint fix * fix delete root folder * fix folder name validation * fix mysql path_hash issue * Fix returning erroradd-recover-to-index-rebuild
parent
e51187a474
commit
1d2aa7c69b
@ -0,0 +1,130 @@ |
||||
// Code generated by mockery v2.10.6. DO NOT EDIT.
|
||||
|
||||
package filestorage |
||||
|
||||
import ( |
||||
context "context" |
||||
|
||||
mock "github.com/stretchr/testify/mock" |
||||
) |
||||
|
||||
// MockFileStorage is an autogenerated mock type for the FileStorage type
|
||||
type MockFileStorage struct { |
||||
mock.Mock |
||||
} |
||||
|
||||
// CreateFolder provides a mock function with given fields: ctx, path
|
||||
func (_m *MockFileStorage) CreateFolder(ctx context.Context, path string) error { |
||||
ret := _m.Called(ctx, path) |
||||
|
||||
var r0 error |
||||
if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { |
||||
r0 = rf(ctx, path) |
||||
} else { |
||||
r0 = ret.Error(0) |
||||
} |
||||
|
||||
return r0 |
||||
} |
||||
|
||||
// Delete provides a mock function with given fields: ctx, path
|
||||
func (_m *MockFileStorage) Delete(ctx context.Context, path string) error { |
||||
ret := _m.Called(ctx, path) |
||||
|
||||
var r0 error |
||||
if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { |
||||
r0 = rf(ctx, path) |
||||
} else { |
||||
r0 = ret.Error(0) |
||||
} |
||||
|
||||
return r0 |
||||
} |
||||
|
||||
// DeleteFolder provides a mock function with given fields: ctx, path, options
|
||||
func (_m *MockFileStorage) DeleteFolder(ctx context.Context, path string, options *DeleteFolderOptions) error { |
||||
ret := _m.Called(ctx, path, options) |
||||
|
||||
var r0 error |
||||
if rf, ok := ret.Get(0).(func(context.Context, string, *DeleteFolderOptions) error); ok { |
||||
r0 = rf(ctx, path, options) |
||||
} else { |
||||
r0 = ret.Error(0) |
||||
} |
||||
|
||||
return r0 |
||||
} |
||||
|
||||
// Get provides a mock function with given fields: ctx, path
|
||||
func (_m *MockFileStorage) Get(ctx context.Context, path string) (*File, error) { |
||||
ret := _m.Called(ctx, path) |
||||
|
||||
var r0 *File |
||||
if rf, ok := ret.Get(0).(func(context.Context, string) *File); ok { |
||||
r0 = rf(ctx, path) |
||||
} else { |
||||
if ret.Get(0) != nil { |
||||
r0 = ret.Get(0).(*File) |
||||
} |
||||
} |
||||
|
||||
var r1 error |
||||
if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { |
||||
r1 = rf(ctx, path) |
||||
} else { |
||||
r1 = ret.Error(1) |
||||
} |
||||
|
||||
return r0, r1 |
||||
} |
||||
|
||||
// List provides a mock function with given fields: ctx, folderPath, paging, options
|
||||
func (_m *MockFileStorage) List(ctx context.Context, folderPath string, paging *Paging, options *ListOptions) (*ListResponse, error) { |
||||
ret := _m.Called(ctx, folderPath, paging, options) |
||||
|
||||
var r0 *ListResponse |
||||
if rf, ok := ret.Get(0).(func(context.Context, string, *Paging, *ListOptions) *ListResponse); ok { |
||||
r0 = rf(ctx, folderPath, paging, options) |
||||
} else { |
||||
if ret.Get(0) != nil { |
||||
r0 = ret.Get(0).(*ListResponse) |
||||
} |
||||
} |
||||
|
||||
var r1 error |
||||
if rf, ok := ret.Get(1).(func(context.Context, string, *Paging, *ListOptions) error); ok { |
||||
r1 = rf(ctx, folderPath, paging, options) |
||||
} else { |
||||
r1 = ret.Error(1) |
||||
} |
||||
|
||||
return r0, r1 |
||||
} |
||||
|
||||
// Upsert provides a mock function with given fields: ctx, command
|
||||
func (_m *MockFileStorage) Upsert(ctx context.Context, command *UpsertFileCommand) error { |
||||
ret := _m.Called(ctx, command) |
||||
|
||||
var r0 error |
||||
if rf, ok := ret.Get(0).(func(context.Context, *UpsertFileCommand) error); ok { |
||||
r0 = rf(ctx, command) |
||||
} else { |
||||
r0 = ret.Error(0) |
||||
} |
||||
|
||||
return r0 |
||||
} |
||||
|
||||
// close provides a mock function with given fields:
|
||||
func (_m *MockFileStorage) close() error { |
||||
ret := _m.Called() |
||||
|
||||
var r0 error |
||||
if rf, ok := ret.Get(0).(func() error); ok { |
||||
r0 = rf() |
||||
} else { |
||||
r0 = ret.Error(0) |
||||
} |
||||
|
||||
return r0 |
||||
} |
@ -0,0 +1,44 @@ |
||||
import React from 'react'; |
||||
import { SubmitHandler, Validate } from 'react-hook-form'; |
||||
|
||||
import { Button, Field, Form, Input, Modal } from '@grafana/ui'; |
||||
|
||||
type FormModel = { folderName: string }; |
||||
|
||||
interface Props { |
||||
onSubmit: SubmitHandler<FormModel>; |
||||
onDismiss: () => void; |
||||
validate: Validate<string>; |
||||
} |
||||
|
||||
const initialFormModel = { folderName: '' }; |
||||
|
||||
export function CreateNewFolderModal({ validate, onDismiss, onSubmit }: Props) { |
||||
return ( |
||||
<Modal onDismiss={onDismiss} isOpen={true} title="New Folder"> |
||||
<Form defaultValues={initialFormModel} onSubmit={onSubmit} maxWidth={'none'}> |
||||
{({ register, errors }) => ( |
||||
<> |
||||
<Field |
||||
label="Folder name" |
||||
invalid={!!errors.folderName} |
||||
error={errors.folderName && errors.folderName.message} |
||||
> |
||||
<Input |
||||
id="folder-name-input" |
||||
{...register('folderName', { |
||||
required: 'Folder name is required.', |
||||
validate: { validate }, |
||||
})} |
||||
/> |
||||
</Field> |
||||
|
||||
<Modal.ButtonRow> |
||||
<Button type="submit">Create</Button> |
||||
</Modal.ButtonRow> |
||||
</> |
||||
)} |
||||
</Form> |
||||
</Modal> |
||||
); |
||||
} |
Loading…
Reference in new issue