From a33fc3dd6078631a72674480f2024768296a8b3d Mon Sep 17 00:00:00 2001 From: Mike Abebe Date: Sun, 9 Apr 2023 14:34:32 +0300 Subject: [PATCH] feat/implement field options edit and change field option type functionality --- .../grid/GridTableHeader/GridTableHeader.tsx | 34 +---- .../GridTableHeader/GridTableHeaderItem.tsx | 123 ++++++++++++++++++ 2 files changed, 129 insertions(+), 28 deletions(-) create mode 100644 frontend/appflowy_tauri/src/appflowy_app/components/grid/GridTableHeader/GridTableHeaderItem.tsx diff --git a/frontend/appflowy_tauri/src/appflowy_app/components/grid/GridTableHeader/GridTableHeader.tsx b/frontend/appflowy_tauri/src/appflowy_app/components/grid/GridTableHeader/GridTableHeader.tsx index 9293f6cd32..259ad982d7 100644 --- a/frontend/appflowy_tauri/src/appflowy_app/components/grid/GridTableHeader/GridTableHeader.tsx +++ b/frontend/appflowy_tauri/src/appflowy_app/components/grid/GridTableHeader/GridTableHeader.tsx @@ -1,43 +1,21 @@ +import { DatabaseController } from '@/appflowy_app/stores/effects/database/database_controller'; + import AddSvg from '../../_shared/svg/AddSvg'; import { useGridTableHeaderHooks } from './GridTableHeader.hooks'; -import { TextTypeSvg } from '../../_shared/svg/TextTypeSvg'; -import { NumberTypeSvg } from '../../_shared/svg/NumberTypeSvg'; -import { DateTypeSvg } from '../../_shared/svg/DateTypeSvg'; -import { SingleSelectTypeSvg } from '../../_shared/svg/SingleSelectTypeSvg'; -import { MultiSelectTypeSvg } from '../../_shared/svg/MultiSelectTypeSvg'; -import { ChecklistTypeSvg } from '../../_shared/svg/ChecklistTypeSvg'; -import { UrlTypeSvg } from '../../_shared/svg/UrlTypeSvg'; -import { FieldType } from '@/services/backend/models/flowy-database/field_entities'; -import { DatabaseController } from '@/appflowy_app/stores/effects/database/database_controller'; + +import { GridTableHeaderItem } from './GridTableHeaderItem'; import { useTranslation } from 'react-i18next'; export const GridTableHeader = ({ controller }: { controller: DatabaseController }) => { const { fields, onAddField } = useGridTableHeaderHooks(controller); - const { t } = useTranslation(''); return ( <> - {fields.map((field) => { - return ( - -
- - {field.fieldType === FieldType.RichText && } - {field.fieldType === FieldType.Number && } - {field.fieldType === FieldType.DateTime && } - {field.fieldType === FieldType.SingleSelect && } - {field.fieldType === FieldType.MultiSelect && } - {field.fieldType === FieldType.Checklist && } - {field.fieldType === FieldType.Checkbox && } - {field.fieldType === FieldType.URL && } - - {field.name} -
- - ); + {fields.map((field, i) => { + return ; })} diff --git a/frontend/appflowy_tauri/src/appflowy_app/components/grid/GridTableHeader/GridTableHeaderItem.tsx b/frontend/appflowy_tauri/src/appflowy_app/components/grid/GridTableHeader/GridTableHeaderItem.tsx new file mode 100644 index 0000000000..3e13ff8eec --- /dev/null +++ b/frontend/appflowy_tauri/src/appflowy_app/components/grid/GridTableHeader/GridTableHeaderItem.tsx @@ -0,0 +1,123 @@ +import { CellIdentifier } from '@/appflowy_app/stores/effects/database/cell/cell_bd_svc'; +import { DatabaseController } from '@/appflowy_app/stores/effects/database/database_controller'; +import { TypeOptionController } from '@/appflowy_app/stores/effects/database/field/type_option/type_option_controller'; +import { FieldType } from '@/services/backend'; +import { useState, useRef } from 'react'; +import { Some } from 'ts-results'; +import { ChangeFieldTypePopup } from '../../_shared/EditRow/ChangeFieldTypePopup'; +import { EditFieldPopup } from '../../_shared/EditRow/EditFieldPopup'; +import { ChecklistTypeSvg } from '../../_shared/svg/ChecklistTypeSvg'; +import { DateTypeSvg } from '../../_shared/svg/DateTypeSvg'; +import { MultiSelectTypeSvg } from '../../_shared/svg/MultiSelectTypeSvg'; +import { NumberTypeSvg } from '../../_shared/svg/NumberTypeSvg'; +import { SingleSelectTypeSvg } from '../../_shared/svg/SingleSelectTypeSvg'; +import { TextTypeSvg } from '../../_shared/svg/TextTypeSvg'; +import { UrlTypeSvg } from '../../_shared/svg/UrlTypeSvg'; + +export const GridTableHeaderItem = ({ + controller, + field, +}: { + controller: DatabaseController; + field: { + fieldId: string; + name: string; + fieldType: FieldType; + }; +}) => { + const [showFieldEditor, setShowFieldEditor] = useState(false); + const [editFieldTop, setEditFieldTop] = useState(0); + const [editFieldRight, setEditFieldRight] = useState(0); + + const [showChangeFieldTypePopup, setShowChangeFieldTypePopup] = useState(false); + const [changeFieldTypeTop, setChangeFieldTypeTop] = useState(0); + const [changeFieldTypeRight, setChangeFieldTypeRight] = useState(0); + + const [editingField, setEditingField] = useState<{ + fieldId: string; + name: string; + fieldType: FieldType; + } | null>(null); + + const ref = useRef(null); + + const changeFieldType = async (newType: FieldType) => { + if (!editingField) return; + + const currentField = controller.fieldController.getField(editingField.fieldId); + if (!currentField) return; + + const typeOptionController = new TypeOptionController(controller.viewId, Some(currentField)); + await typeOptionController.switchToField(newType); + + setEditingField({ + ...editingField, + fieldType: newType, + }); + + setShowChangeFieldTypePopup(false); + }; + + return ( + +
{ + if (!ref.current) return; + const { top, left } = ref.current.getBoundingClientRect(); + + setEditFieldRight(left - 10); + setEditFieldTop(top + 35); + setEditingField(field); + setShowFieldEditor(true); + }} + > + + {field.fieldType === FieldType.RichText && } + {field.fieldType === FieldType.Number && } + {field.fieldType === FieldType.DateTime && } + {field.fieldType === FieldType.SingleSelect && } + {field.fieldType === FieldType.MultiSelect && } + {field.fieldType === FieldType.Checklist && } + {field.fieldType === FieldType.Checkbox && } + {field.fieldType === FieldType.URL && } + + {field.name} + + {showFieldEditor && editingField && ( + { + setShowFieldEditor(false); + }} + fieldInfo={controller.fieldController.getField(editingField.fieldId)} + changeFieldTypeClick={(buttonTop, buttonRight) => { + setChangeFieldTypeTop(buttonTop); + setChangeFieldTypeRight(buttonRight); + setShowChangeFieldTypePopup(true); + }} + > + )} + + {showChangeFieldTypePopup && ( + changeFieldType(newType)} + onOutsideClick={() => setShowChangeFieldTypePopup(false)} + > + )} +
+ + ); +};