From cc0be1aee5f1995d0bb30bd68a3fed932175034c Mon Sep 17 00:00:00 2001 From: Lin Wang Date: Tue, 4 Jul 2023 09:39:14 +0800 Subject: [PATCH] add new fields to workspace form Signed-off-by: Lin Wang --- .../workspace_creator/workspace_form.tsx | 181 +++++++++++------- .../workspace_icon_selector.tsx | 36 ++++ 2 files changed, 150 insertions(+), 67 deletions(-) create mode 100644 src/plugins/workspace/public/components/workspace_creator/workspace_icon_selector.tsx diff --git a/src/plugins/workspace/public/components/workspace_creator/workspace_form.tsx b/src/plugins/workspace/public/components/workspace_creator/workspace_form.tsx index 98273625d17a..0b67eff22fe9 100644 --- a/src/plugins/workspace/public/components/workspace_creator/workspace_form.tsx +++ b/src/plugins/workspace/public/components/workspace_creator/workspace_form.tsx @@ -20,19 +20,23 @@ import { EuiFlexGrid, EuiFlexGroup, EuiImage, - EuiAccordion, EuiCheckbox, EuiCheckboxGroup, EuiCheckableCardProps, EuiCheckboxGroupProps, EuiCheckboxProps, EuiFieldTextProps, + EuiColorPicker, + EuiColorPickerProps, + EuiComboBox, + EuiComboBoxProps, } from '@elastic/eui'; import { WorkspaceTemplate } from '../../../../../core/types'; import { AppNavLinkStatus, ApplicationStart } from '../../../../../core/public'; import { useApplications, useWorkspaceTemplate } from '../../hooks'; import { WORKSPACE_OP_TYPE_CREATE, WORKSPACE_OP_TYPE_UPDATE } from '../../../common/constants'; +import { WorkspaceIconSelector } from './workspace_icon_selector'; interface WorkspaceFeature { id: string; @@ -49,6 +53,9 @@ export interface WorkspaceFormData { name: string; description?: string; features: string[]; + color?: string; + icon?: string; + defaultVISTheme?: string; } type WorkspaceFormErrors = { [key in keyof WorkspaceFormData]?: string }; @@ -59,6 +66,8 @@ const isWorkspaceFeatureGroup = ( const workspaceHtmlIdGenerator = htmlIdGenerator(); +const defaultVISThemeOptions = [{ label: 'Categorical', value: 'categorical' }]; + interface WorkspaceFormProps { application: ApplicationStart; onSubmit?: (formData: WorkspaceFormData) => void; @@ -76,6 +85,10 @@ export const WorkspaceForm = ({ const [name, setName] = useState(defaultValues?.name); const [description, setDescription] = useState(defaultValues?.description); + const [color, setColor] = useState(defaultValues?.color); + const [icon, setIcon] = useState(defaultValues?.icon); + const [defaultVISTheme, setDefaultVISTheme] = useState(defaultValues?.defaultVISTheme); + const [selectedTemplateId, setSelectedTemplateId] = useState(); const [selectedFeatureIds, setSelectedFeatureIds] = useState(defaultValues?.features || []); const selectedTemplate = workspaceTemplates.find( @@ -87,6 +100,9 @@ export const WorkspaceForm = ({ name, description, features: selectedFeatureIds, + color, + icon, + defaultVISTheme, }); const getFormDataRef = useRef(getFormData); getFormDataRef.current = getFormData; @@ -120,6 +136,11 @@ export const WorkspaceForm = ({ }, []); }, [applications]); + const selectedDefaultVISThemeOptions = useMemo( + () => defaultVISThemeOptions.filter((item) => item.value === defaultVISTheme), + [defaultVISTheme] + ); + if (!formIdRef.current) { formIdRef.current = workspaceHtmlIdGenerator(); } @@ -198,6 +219,20 @@ export const WorkspaceForm = ({ setDescription(e.target.value); }, []); + const handleColorChange = useCallback['onChange']>((text) => { + setColor(text); + }, []); + + const handleIconChange = useCallback((newIcon: string) => { + setIcon(newIcon); + }, []); + + const handleDefaultVISThemeInputChange = useCallback< + Required>['onChange'] + >((options) => { + setDefaultVISTheme(options[0]?.value); + }, []); + return ( @@ -217,6 +252,25 @@ export const WorkspaceForm = ({ > + + + + + + + + + @@ -267,74 +321,67 @@ export const WorkspaceForm = ({ )} - - -

Advanced Options

-
- - } - > - - {featureOrGroups.map((featureOrGroup) => { - const features = isWorkspaceFeatureGroup(featureOrGroup) +
+ + + +

Workspace features

+
+ + {featureOrGroups.map((featureOrGroup) => { + const features = isWorkspaceFeatureGroup(featureOrGroup) ? featureOrGroup.features : []; + const selectedIds = selectedFeatureIds.filter((id) => + (isWorkspaceFeatureGroup(featureOrGroup) ? featureOrGroup.features - : []; - const selectedIds = selectedFeatureIds.filter((id) => - (isWorkspaceFeatureGroup(featureOrGroup) - ? featureOrGroup.features - : [featureOrGroup] - ).find((item) => item.id === id) - ); - return ( - - 0 ? `(${selectedIds.length}/${features.length})` : ''}`} - checked={selectedIds.length > 0} - indeterminate={ - isWorkspaceFeatureGroup(featureOrGroup) && - selectedIds.length > 0 && - selectedIds.length < features.length - } + : [featureOrGroup] + ).find((item) => item.id === id) + ); + return ( + + 0 ? `(${selectedIds.length}/${features.length})` : ''}`} + checked={selectedIds.length > 0} + indeterminate={ + isWorkspaceFeatureGroup(featureOrGroup) && + selectedIds.length > 0 && + selectedIds.length < features.length + } + /> + {isWorkspaceFeatureGroup(featureOrGroup) && ( + ({ + id: item.id, + label: item.name, + }))} + idToSelectedMap={selectedIds.reduce( + (previousValue, currentValue) => ({ + ...previousValue, + [currentValue]: true, + }), + {} + )} + onChange={handleFeatureChange} + style={{ marginLeft: 40 }} /> - {isWorkspaceFeatureGroup(featureOrGroup) && ( - ({ - id: item.id, - label: item.name, - }))} - idToSelectedMap={selectedIds.reduce( - (previousValue, currentValue) => ({ - ...previousValue, - [currentValue]: true, - }), - {} - )} - onChange={handleFeatureChange} - style={{ marginLeft: 40 }} - /> - )} - - ); - })} - - + )} + + ); + })} +
diff --git a/src/plugins/workspace/public/components/workspace_creator/workspace_icon_selector.tsx b/src/plugins/workspace/public/components/workspace_creator/workspace_icon_selector.tsx new file mode 100644 index 000000000000..80e08d8e2e98 --- /dev/null +++ b/src/plugins/workspace/public/components/workspace_creator/workspace_icon_selector.tsx @@ -0,0 +1,36 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; + +import { EuiFlexGroup, EuiFlexItem, EuiIcon } from '@elastic/eui'; + +const icons = ['glasses', 'search', 'bell']; + +export const WorkspaceIconSelector = ({ + color, + value, + onChange, +}: { + color?: string; + value?: string; + onChange: (value: string) => void; +}) => { + return ( + + {icons.map((item) => ( + { + onChange(item); + }} + grow={false} + > + + + ))} + + ); +};