From a498b41fe11d4edd13847d8d4fdfb52e2330d2bf Mon Sep 17 00:00:00 2001 From: GLDuval Date: Wed, 15 Mar 2023 11:39:32 -0400 Subject: [PATCH] Improve usability --- .../components/common/LabeledInput.tsx | 6 +- .../pages/ArmPresetsConfig/ArmJointInput.tsx | 11 ++- .../pages/ArmPresetsConfig/ArmPreset.tsx | 97 +++++++++++++------ .../ArmPresetsConfig/ArmPresetsConfig.tsx | 36 ++++++- 4 files changed, 111 insertions(+), 39 deletions(-) diff --git a/src/renderer/components/common/LabeledInput.tsx b/src/renderer/components/common/LabeledInput.tsx index 358c61fc..ad6f668f 100644 --- a/src/renderer/components/common/LabeledInput.tsx +++ b/src/renderer/components/common/LabeledInput.tsx @@ -1,4 +1,4 @@ -import React, { ChangeEvent, FC } from 'react'; +import React, { ChangeEvent, CSSProperties, FC } from 'react'; import { Input } from '@/renderer/components/common/Input'; import { styled } from '@/renderer/globalStyles/styled'; @@ -18,6 +18,7 @@ interface LabeledInputProps { label: string; onChange: (event: ChangeEvent) => void; type?: 'text' | 'number' | 'password'; + labelStyle?: CSSProperties; } export const LabeledInput: FC = ({ @@ -25,10 +26,11 @@ export const LabeledInput: FC = ({ onChange, label, type, + labelStyle, }) => { return ( - {label} + {label} ); diff --git a/src/renderer/components/pages/Config/pages/ArmPresetsConfig/ArmJointInput.tsx b/src/renderer/components/pages/Config/pages/ArmPresetsConfig/ArmJointInput.tsx index 601521e7..eeb1f36c 100644 --- a/src/renderer/components/pages/Config/pages/ArmPresetsConfig/ArmJointInput.tsx +++ b/src/renderer/components/pages/Config/pages/ArmPresetsConfig/ArmJointInput.tsx @@ -1,4 +1,5 @@ import { LabeledInput } from '@/renderer/components/common/LabeledInput'; +import { defaultTheme } from '@/renderer/globalStyles/themes/defaultTheme'; import React, { useCallback, useState } from 'react'; interface ArmJointInputProps { @@ -40,12 +41,12 @@ const ArmJointInput = ({ value={inputValue} type="number" onChange={onInputChange} + labelStyle={ + error + ? { color: defaultTheme.colors.danger } + : { color: defaultTheme.colors.fontLight } + } /> - {error && ( -
- Value must be between {min} and {max} -
- )} ); }; diff --git a/src/renderer/components/pages/Config/pages/ArmPresetsConfig/ArmPreset.tsx b/src/renderer/components/pages/Config/pages/ArmPresetsConfig/ArmPreset.tsx index 0c050c1a..66bb0578 100644 --- a/src/renderer/components/pages/Config/pages/ArmPresetsConfig/ArmPreset.tsx +++ b/src/renderer/components/pages/Config/pages/ArmPresetsConfig/ArmPreset.tsx @@ -1,13 +1,13 @@ -import React, { useCallback } from 'react'; +import React, { useCallback, useState } from 'react'; import { ArmPreset, armPresetsSlice, } from '@/renderer/store/modules/armPresets'; import { styled } from '@/renderer/globalStyles/styled'; -import { LabeledInput } from '@/renderer/components/common/LabeledInput'; import { useDispatch } from 'react-redux'; -import { FaTimes } from 'react-icons/fa'; +import { FaCheck, FaPen, FaTimes } from 'react-icons/fa'; import ArmJointInput from './ArmJointInput'; +import { Input } from '@/renderer/components/common/Input'; interface ArmPresetProps { preset: ArmPreset; @@ -34,12 +34,11 @@ const Card = styled.div` padding: 16px; margin: 8px; display: flex; - min-width: 300px; + width: 350px; flex-direction: column; justify-content: flex-start; align-items: flex-start; box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.5); - transition: box-shadow 0.2s ease-in-out; `; const HeaderRow = styled.div` @@ -50,6 +49,21 @@ const HeaderRow = styled.div` width: 100%; `; +const InputRow = styled.div` + display: flex; + flex-direction: row; + width: 100%; + justify-content: space-between; + flex-wrap: wrap; +`; + +const ButtonRow = styled.div` + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; +`; + const DeleteButton = styled.a` border: none; border-radius: 4px; @@ -62,8 +76,21 @@ const DeleteButton = styled.a` } `; +const EditButton = styled.a` + border: none; + border-radius: 4px; + padding: 4px 8px; + margin-top: 8px; + cursor: pointer; + transition: background-color 0.2s ease-in-out; + &:hover { + color: ${({ theme }) => theme.colors.success}; + } +`; + const ArmPreset = ({ preset }: ArmPresetProps) => { const dispatch = useDispatch(); + const [editMode, setEditMode] = useState(false); const onJointChange = useCallback( (event: React.ChangeEvent, id: number) => { @@ -106,29 +133,43 @@ const ArmPreset = ({ preset }: ArmPresetProps) => { return ( - -

{preset.name}

- onDelete(preset.id)}> - - -
- - {preset.positions.map((joint, index) => ( -
- -
- ))} + {editMode ? ( + <> + + + setEditMode(!editMode)}> + {} + + + + {preset.positions.map((joint, index) => ( +
+ +
+ ))} +
+ + ) : ( + +

{preset.name}

+ + setEditMode(!editMode)}> + {} + + {!editMode && ( + onDelete(preset.id)}> + + + )} + +
+ )}
); }; diff --git a/src/renderer/components/pages/Config/pages/ArmPresetsConfig/ArmPresetsConfig.tsx b/src/renderer/components/pages/Config/pages/ArmPresetsConfig/ArmPresetsConfig.tsx index 624aceb5..56379be4 100644 --- a/src/renderer/components/pages/Config/pages/ArmPresetsConfig/ArmPresetsConfig.tsx +++ b/src/renderer/components/pages/Config/pages/ArmPresetsConfig/ArmPresetsConfig.tsx @@ -24,6 +24,14 @@ const PresetsContainer = styled.div` flex-wrap: wrap; `; +const ButtonRow = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + fit-content: fit-content; +`; + const ArmPresetsConfig = () => { const armPresets = useSelector(selectAllPresets); const selectedPreset = useSelector(selectSelectedPreset); @@ -40,6 +48,16 @@ const ArmPresetsConfig = () => { ); }, [dispatch]); + const addPresetWithCurrentPositions = () => { + dispatch( + armPresetsSlice.actions.addPreset({ + id: nanoid(), + name: 'New Preset', + positions: jointPositions, + }) + ); + }; + const onPresetSelect = useCallback( (e: React.ChangeEvent) => { dispatch(armPresetsSlice.actions.selectPreset(e.target.value)); @@ -75,10 +93,20 @@ const ArmPresetsConfig = () => { )} Presets - + + + {jointPositions.length > 0 && ( + + )} + {armPresets.map((preset) => (