From adbcf445bb537968ee44037d00132796e2bea981 Mon Sep 17 00:00:00 2001 From: Alex Ramsdell Date: Thu, 2 Nov 2023 13:08:26 -0400 Subject: [PATCH 1/4] add ButtonWithLoader component, use in delete file window. todo: replace other network-bound buttons w/ this loader button. --- src/assets/styles/components/_web-ide.scss | 24 ++++++++---- src/components/shared/ButtonWithLoader.js | 39 +++++++++++++++++++ src/components/shared/webide/index.js | 4 +- .../shared/webide/windows/DeleteFileWindow.js | 21 ++++++++-- .../shared/webide/windows/NameInput.js | 2 - 5 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 src/components/shared/ButtonWithLoader.js diff --git a/src/assets/styles/components/_web-ide.scss b/src/assets/styles/components/_web-ide.scss index b2948c576..2cb47f5ce 100644 --- a/src/assets/styles/components/_web-ide.scss +++ b/src/assets/styles/components/_web-ide.scss @@ -162,14 +162,6 @@ background: rgb(26, 26, 26); } - /* - .root { - display: grid; - grid-template-columns: 150px minmax(0px, auto); - height: 100%; - } - */ - // background: transparent !important; } .file-menu, @@ -294,6 +286,22 @@ } .web-ide { + .button-with-loader { + min-width: 105px; + + &.loading { + color: transparent; + } + + .button-with-loader-icon { + width: 100%; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + } + + } .cancel-button { margin-left: 10px; } diff --git a/src/components/shared/ButtonWithLoader.js b/src/components/shared/ButtonWithLoader.js new file mode 100644 index 000000000..8f63e5db4 --- /dev/null +++ b/src/components/shared/ButtonWithLoader.js @@ -0,0 +1,39 @@ +import React, { useState } from 'react'; +import cn from 'classnames'; + +export default function ButtonWithLoader({ text, className, onClick, children }) { + + const [ loading, setLoading ] = useState(false); + + return ( + + ); +} + + diff --git a/src/components/shared/webide/index.js b/src/components/shared/webide/index.js index c382bc1c1..4111b8c30 100644 --- a/src/components/shared/webide/index.js +++ b/src/components/shared/webide/index.js @@ -384,8 +384,8 @@ function WebIDE({ active={ activeEditorWindow === EDITOR_WINDOWS.DELETE_FILE_WINDOW } selectedFile={ selectedFile } onConfirm={ - () => { - onDeleteFile(selectedFile); + async () => { + await onDeleteFile(selectedFile); setSelectedFile(null); setSelectedFolder(null); updateActiveEditorWindow(EDITOR_WINDOWS.DEFAULT_WINDOW, activeEditorWindow); diff --git a/src/components/shared/webide/windows/DeleteFileWindow.js b/src/components/shared/webide/windows/DeleteFileWindow.js index 54219e960..ae9b1b693 100644 --- a/src/components/shared/webide/windows/DeleteFileWindow.js +++ b/src/components/shared/webide/windows/DeleteFileWindow.js @@ -1,8 +1,13 @@ -import React from 'react'; +import React, { useState } from 'react'; +import cn from 'classnames'; import { Card, CardTitle, CardBody } from 'reactstrap'; +import { useAlert } from 'react-alert'; +import ButtonWithLoader from '../../ButtonWithLoader'; export default function DeleteFileWindow({ active, selectedFile, onConfirm, onCancel }) { + const [ loading, setLoading ] = useState(false); + if (!active) { return null; } @@ -10,14 +15,24 @@ export default function DeleteFileWindow({ active, selectedFile, onConfirm, onCa const {project} = selectedFile; const filepath = selectedFile.path.split(`/${project}/`)[1]; + return (
Delete Confirmation

Are you sure you want to delete file {filepath} from project { project } ?

- - + + Delete + +
diff --git a/src/components/shared/webide/windows/NameInput.js b/src/components/shared/webide/windows/NameInput.js index 413b86107..6503192e6 100644 --- a/src/components/shared/webide/windows/NameInput.js +++ b/src/components/shared/webide/windows/NameInput.js @@ -6,8 +6,6 @@ import cn from 'classnames'; export default function NameInput({ onCancel, onConfirm, onEnter, label='', placeholder='', value, validate=() => true }) { - - const [ name, setName ] = useState(value || ''); const [ isValidName, setIsValidName ] = useState(false); From 4592f3022e01ed3277ada5e6a539be2371192496 Mon Sep 17 00:00:00 2001 From: Alex Ramsdell Date: Thu, 2 Nov 2023 13:16:27 -0400 Subject: [PATCH 2/4] add disabled prop to button with loader, use in more windows. --- src/components/shared/ButtonWithLoader.js | 3 ++- .../webide/windows/DeleteFolderWindow.js | 7 ++++++- .../webide/windows/DeletePackageWindow.js | 7 ++++++- .../shared/webide/windows/NameInput.js | 20 ++++++++++++------- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/components/shared/ButtonWithLoader.js b/src/components/shared/ButtonWithLoader.js index 8f63e5db4..276cb3946 100644 --- a/src/components/shared/ButtonWithLoader.js +++ b/src/components/shared/ButtonWithLoader.js @@ -1,12 +1,13 @@ import React, { useState } from 'react'; import cn from 'classnames'; -export default function ButtonWithLoader({ text, className, onClick, children }) { +export default function ButtonWithLoader({ className, onClick, disabled, children }) { const [ loading, setLoading ] = useState(false); return ( + + Delete + diff --git a/src/components/shared/webide/windows/DeletePackageWindow.js b/src/components/shared/webide/windows/DeletePackageWindow.js index 6f88ade88..cdec8f499 100644 --- a/src/components/shared/webide/windows/DeletePackageWindow.js +++ b/src/components/shared/webide/windows/DeletePackageWindow.js @@ -1,5 +1,6 @@ import React from 'react'; import { Card, CardTitle, CardBody } from 'reactstrap'; +import ButtonWithLoader from '../../ButtonWithLoader'; export default function DeletePackageWindow({ active, selectedPackage, onConfirm, onCancel }) { @@ -15,7 +16,11 @@ export default function DeletePackageWindow({ active, selectedPackage, onConfirm
Delete Confirmation

Are you sure you want to delete package { packageName } ?

- + + Delete +
diff --git a/src/components/shared/webide/windows/NameInput.js b/src/components/shared/webide/windows/NameInput.js index 6503192e6..a2557af95 100644 --- a/src/components/shared/webide/windows/NameInput.js +++ b/src/components/shared/webide/windows/NameInput.js @@ -3,6 +3,7 @@ import React, { useState } from 'react'; import cn from 'classnames'; +import ButtonWithLoader from '../../ButtonWithLoader'; export default function NameInput({ onCancel, onConfirm, onEnter, label='', placeholder='', value, validate=() => true }) { @@ -59,15 +60,20 @@ export default function NameInput({ onCancel, onConfirm, onEnter, label='', plac
- - + onClick={ + async () => { + await onConfirm(name); + } + }>OK +
); From 15dd3d781a6e722341aae2458ae0bd398397e082 Mon Sep 17 00:00:00 2001 From: Alex Ramsdell Date: Thu, 2 Nov 2023 13:54:36 -0400 Subject: [PATCH 3/4] fix callbacks invoked by ButtonWithLoader --- src/components/instance/functions/index.js | 1 + src/components/shared/webide/index.js | 2 +- src/components/shared/webide/windows/NameInput.js | 9 +++------ 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/instance/functions/index.js b/src/components/instance/functions/index.js index 31a4ca24e..729bdcb6e 100644 --- a/src/components/instance/functions/index.js +++ b/src/components/instance/functions/index.js @@ -52,6 +52,7 @@ function CustomFunctionsIndex() { if (configuring) refreshCustomFunctions(); }, 2000); + console.log('cf error: ', custom_functions?.error); return !custom_functions ? ( ) : custom_functions.error ? ( diff --git a/src/components/shared/webide/index.js b/src/components/shared/webide/index.js index 4111b8c30..09d050be6 100644 --- a/src/components/shared/webide/index.js +++ b/src/components/shared/webide/index.js @@ -88,7 +88,7 @@ function WebIDE({ } async function addProjectFolder(newFolderName) { - onAddProjectFolder(newFolderName, selectedFolder) + await onAddProjectFolder(newFolderName, selectedFolder) // go back to prev window updateActiveEditorWindow(previousActiveEditorWindow, activeEditorWindow); } diff --git a/src/components/shared/webide/windows/NameInput.js b/src/components/shared/webide/windows/NameInput.js index a2557af95..a053712d6 100644 --- a/src/components/shared/webide/windows/NameInput.js +++ b/src/components/shared/webide/windows/NameInput.js @@ -35,7 +35,7 @@ export default function NameInput({ onCancel, onConfirm, onEnter, label='', plac
- { label && } + { label && }
0 && !isValidName }) } @@ -63,11 +63,8 @@ export default function NameInput({ onCancel, onConfirm, onEnter, label='', plac { - await onConfirm(name); - } - }>OK + onClick={ () => onConfirm(name) } + >OK