From d07ee9a36be97c1043e2fddc2fbaef89b680f3ac Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Sun, 15 Dec 2019 19:10:01 -0800 Subject: [PATCH] Add create directory button --- .../api/server/files/createDirectory.ts | 9 ++ .../server/files/FileManagerContainer.tsx | 69 ++++++++------ .../server/files/NewDirectoryButton.tsx | 89 +++++++++++++++++++ 3 files changed, 142 insertions(+), 25 deletions(-) create mode 100644 resources/scripts/api/server/files/createDirectory.ts create mode 100644 resources/scripts/components/server/files/NewDirectoryButton.tsx diff --git a/resources/scripts/api/server/files/createDirectory.ts b/resources/scripts/api/server/files/createDirectory.ts new file mode 100644 index 000000000..588868655 --- /dev/null +++ b/resources/scripts/api/server/files/createDirectory.ts @@ -0,0 +1,9 @@ +import http from '@/api/http'; + +export default (uuid: string, root: string, name: string): Promise => { + return new Promise((resolve, reject) => { + http.post(`/api/client/servers/${uuid}/files/create-folder`, { root, name }) + .then(() => resolve()) + .catch(reject); + }); +}; diff --git a/resources/scripts/components/server/files/FileManagerContainer.tsx b/resources/scripts/components/server/files/FileManagerContainer.tsx index 86652a4b1..6e5b13320 100644 --- a/resources/scripts/components/server/files/FileManagerContainer.tsx +++ b/resources/scripts/components/server/files/FileManagerContainer.tsx @@ -8,6 +8,13 @@ import { CSSTransition } from 'react-transition-group'; import Spinner from '@/components/elements/Spinner'; import FileObjectRow from '@/components/server/files/FileObjectRow'; import FileManagerBreadcrumbs from '@/components/server/files/FileManagerBreadcrumbs'; +import { FileObject } from '@/api/server/files/loadDirectory'; +import NewDirectoryButton from '@/components/server/files/NewDirectoryButton'; + +const sortFiles = (files: FileObject[]): FileObject[] => { + return files.sort((a, b) => a.name.localeCompare(b.name)) + .sort((a, b) => a.isFile === b.isFile ? 0 : (a.isFile ? 1 : -1)); +}; export default () => { const [ loading, setLoading ] = useState(true); @@ -37,34 +44,46 @@ export default () => { loading ? : - !files.length ? -

- This directory seems to be empty. -

- : - -
- {files.length > 250 ? - -
-

- This directory is too large to display in the browser, limiting - the output to the first 250 files. -

-
- { - files.slice(0, 250).map(file => ( + + {!files.length ? +

+ This directory seems to be empty. +

+ : + + +
+ {files.length > 250 ? + +
+

+ This directory is too large to display in the browser, + limiting + the output to the first 250 files. +

+
+ { + sortFiles(files.slice(0, 250)).map(file => ( + + )) + } +
+ : + sortFiles(files).map(file => ( )) } - - : - files.map(file => ( - - )) - } -
-
+
+ +
+ } +
+ + +
+ } diff --git a/resources/scripts/components/server/files/NewDirectoryButton.tsx b/resources/scripts/components/server/files/NewDirectoryButton.tsx new file mode 100644 index 000000000..dfd2bde1f --- /dev/null +++ b/resources/scripts/components/server/files/NewDirectoryButton.tsx @@ -0,0 +1,89 @@ +import React, { useState } from 'react'; +import Modal from '@/components/elements/Modal'; +import { ServerContext } from '@/state/server'; +import { Form, Formik, FormikActions } from 'formik'; +import Field from '@/components/elements/Field'; +import { join } from 'path'; +import { object, string } from 'yup'; +import createDirectory from '@/api/server/files/createDirectory'; +import v4 from 'uuid/v4'; + +interface Values { + directoryName: string; +} + +const schema = object().shape({ + directoryName: string().required('A valid directory name must be provided.'), +}); + +export default () => { + const [ visible, setVisible ] = useState(false); + const uuid = ServerContext.useStoreState(state => state.server.data!.uuid); + const directory = ServerContext.useStoreState(state => state.files.directory); + const pushFile = ServerContext.useStoreActions(actions => actions.files.pushFile); + + const submit = (values: Values, { setSubmitting }: FormikActions) => { + createDirectory(uuid, directory, values.directoryName) + .then(() => { + pushFile({ + uuid: v4(), + name: values.directoryName, + mode: '0644', + size: 0, + isFile: false, + isEditable: false, + isSymlink: false, + mimetype: '', + createdAt: new Date(), + modifiedAt: new Date(), + }); + setVisible(false); + }) + .catch(error => { + console.error(error); + setSubmitting(false); + }); + }; + + return ( + + + {({ resetForm, isSubmitting, values }) => ( + { + setVisible(false); + resetForm(); + }} + > +
+ +

+ This directory will be created as +  /home/container/{join(directory, values.directoryName).replace(/^(\.\.\/|\/)+/, '')} +

+
+ +
+ +
+ )} +
+ +
+ ); +};