From d69f02f2c4413a5b76461df11e50d52283c61d67 Mon Sep 17 00:00:00 2001 From: Joshua Shoemaker Date: Mon, 27 Mar 2023 22:35:41 -0500 Subject: [PATCH] fix: side bar line item arangement --- .../workspace/Sidebar/AreaLineItem.tsx | 5 ++- .../workspace/Sidebar/GroupLineItem.tsx | 16 ++++--- .../components/workspace/Sidebar/Sidebar.tsx | 2 +- .../components/workspace/Sidebar/provider.tsx | 9 +++- .../components/workspace/Sidebar/types.ts | 4 ++ frontend/context/Project/provider.tsx | 25 +++++------ frontend/useCases/processImageData.ts | 43 ------------------- frontend/useCases/saveData.ts | 24 +++++++++++ ipc/Documents.go | 10 ++++- ipc/Session.go | 6 +-- storage/Local/Interface.go | 8 ++-- 11 files changed, 77 insertions(+), 75 deletions(-) delete mode 100644 frontend/useCases/processImageData.ts create mode 100644 frontend/useCases/saveData.ts diff --git a/frontend/components/workspace/Sidebar/AreaLineItem.tsx b/frontend/components/workspace/Sidebar/AreaLineItem.tsx index f44ff3f..2721468 100644 --- a/frontend/components/workspace/Sidebar/AreaLineItem.tsx +++ b/frontend/components/workspace/Sidebar/AreaLineItem.tsx @@ -24,11 +24,12 @@ const AreaLineItem = (props: { area: SidebarArea, documentId: string, index: num selectedAreaId, isEditAreaNameInputShowing, setIsEditAreaNameInputShowing, + dragOverAreaId, + setDragOverAreaId, } = useSidebar() const editAreaNameTextInput = useRef(null) - const [dragOverAreaId, setDragOverAreaId] = useState('') const onConfirmAreaNameChangeHandler = async (areaDetails: { areaId: string, areaName: string }) => { const { areaId, areaName } = areaDetails @@ -66,6 +67,8 @@ const AreaLineItem = (props: { area: SidebarArea, documentId: string, index: num } const onAreaDropEnd = (areaId: string) => { + if (!areaId || areaId == dragOverAreaId) return + const areaDroppedOn = getAreaById(dragOverAreaId) console.log(areaDroppedOn) if (!areaDroppedOn) return diff --git a/frontend/components/workspace/Sidebar/GroupLineItem.tsx b/frontend/components/workspace/Sidebar/GroupLineItem.tsx index 171fc62..45839fa 100644 --- a/frontend/components/workspace/Sidebar/GroupLineItem.tsx +++ b/frontend/components/workspace/Sidebar/GroupLineItem.tsx @@ -12,7 +12,7 @@ import { SidebarGroup } from './types' -const GroupLineItem = (props: { group: SidebarGroup }) => { +const GroupLineItem = (props: { group: SidebarGroup, dragOverGroupId?: string }) => { const { requestAddDocument, requestChangeGroupOrder, @@ -26,12 +26,12 @@ const GroupLineItem = (props: { group: SidebarGroup }) => { setSelectedGroupId, setIsAddNewDocumentInputShowing, setIsAddNewGroupInputShowing, + dragOverGroupId, + setDragOverGroupId } = useSidebar() const addDocumentTextInput = useRef(null) - const [dragOverGroupId, setDragOverGroupId] = useState('') - const onConfirmAddDocumentClickHandler = async (groupId: string) => { const documentName = addDocumentTextInput.current?.value if (!documentName) return @@ -63,10 +63,12 @@ const GroupLineItem = (props: { group: SidebarGroup }) => { } const onGroupDropEnd = (groupId: string) => { - const areaDroppedOn = getGroupById(groupId) - console.log('areaDroppedOn', areaDroppedOn) - if (!areaDroppedOn) return - const response = requestChangeGroupOrder(groupId, areaDroppedOn.order) + if (!groupId || groupId == dragOverGroupId) return + + const groupDroppedOn = getGroupById(dragOverGroupId) + console.log('groupDroppedOn', groupDroppedOn) + if (!groupDroppedOn) return + requestChangeGroupOrder(groupId, groupDroppedOn.order) setDragOverGroupId('') } diff --git a/frontend/components/workspace/Sidebar/Sidebar.tsx b/frontend/components/workspace/Sidebar/Sidebar.tsx index 3a5ec46..02676bb 100644 --- a/frontend/components/workspace/Sidebar/Sidebar.tsx +++ b/frontend/components/workspace/Sidebar/Sidebar.tsx @@ -1,6 +1,6 @@ 'use client' -import React from 'react' +import React, { useState } from 'react' import { useProject } from '../../../context/Project/provider' import AddGroupInput from './AddGroupInput' import GroupLineItem from './GroupLineItem' diff --git a/frontend/components/workspace/Sidebar/provider.tsx b/frontend/components/workspace/Sidebar/provider.tsx index 7a72e10..ccfbb99 100644 --- a/frontend/components/workspace/Sidebar/provider.tsx +++ b/frontend/components/workspace/Sidebar/provider.tsx @@ -19,6 +19,9 @@ export function SidebarProvider({ children }: Props) { const [isEditDocumentNameInputShowing, setIsEditDocumentNameInputShowing] = useState(false) const [isAddNewGroupInputShowing, setIsAddNewGroupInputShowing] = useState(false) const [isEditAreaNameInputShowing, setIsEditAreaNameInputShowing] = useState(false) + const [dragOverGroupId, setDragOverGroupId] = useState('') + const [dragOverAreaId, setDragOverAreaId] = useState('') + const { selectedDocumentId, setSelectedDocumentId, @@ -44,7 +47,11 @@ export function SidebarProvider({ children }: Props) { isAddNewGroupInputShowing, setIsAddNewGroupInputShowing, isEditAreaNameInputShowing, - setIsEditAreaNameInputShowing + setIsEditAreaNameInputShowing, + dragOverGroupId, + setDragOverGroupId, + dragOverAreaId, + setDragOverAreaId, } return diff --git a/frontend/components/workspace/Sidebar/types.ts b/frontend/components/workspace/Sidebar/types.ts index a1c130e..2158d4c 100644 --- a/frontend/components/workspace/Sidebar/types.ts +++ b/frontend/components/workspace/Sidebar/types.ts @@ -14,6 +14,10 @@ export type SidebarContextType = { setIsAddNewGroupInputShowing: (_: boolean) => void, isEditAreaNameInputShowing: boolean, setIsEditAreaNameInputShowing: (_: boolean) => void, + dragOverGroupId: string, + setDragOverGroupId: (_: string) => void, + dragOverAreaId: string, + setDragOverAreaId: (_: string) => void, } export type SidebarArea = { diff --git a/frontend/context/Project/provider.tsx b/frontend/context/Project/provider.tsx index e9ff3d6..763d755 100644 --- a/frontend/context/Project/provider.tsx +++ b/frontend/context/Project/provider.tsx @@ -18,6 +18,7 @@ import { import { ipc } from '../../wailsjs/wailsjs/go/models' import { AddAreaProps, AreaProps, ProjectContextType, ProjectProps, UpdateDocumentRequest, UserProps } from './types' import makeDefaultProject from './makeDefaultProject' +import { saveDocuments, saveGroups } from '../../useCases/saveData' const ProjectContext = createContext(makeDefaultProject()) @@ -33,25 +34,11 @@ export function ProjectProvider({ children, projectProps }: Props) { const [selectedDocumentId, setSelectedDocumentId] = useState('') const [currentSession, setCurrentSession] = useState(new ipc.Session()) - const saveDocumentsAndGroups = () => { - RequestSaveDocumentCollection().then(success => { - if (!success) console.error('Could not save DocumentCollection') - }).catch(err => { - console.error('Could not save DocumentCollection:', err) - }) - RequestSaveGroupCollection().then(success => { - if (!success) console.error('Could not save GroupCollection') - }).catch(err => { - console.error('Could not save GroupCollection:', err) - }) - } - const updateDocuments = async () => { GetDocuments().then(response => { console.log(response) if (response.documents.length) setDocuments(response.documents) if (response.groups.length) setGroups(response.groups) - saveDocumentsAndGroups() Promise.resolve(response) }) } @@ -59,18 +46,21 @@ export function ProjectProvider({ children, projectProps }: Props) { const requestAddDocument = async (groupId: string, documentName: string) => { const response = await RequestAddDocument(groupId, documentName) if (response.id) await updateDocuments() + saveDocuments() return response } const requestAddDocumentGroup = async (groupName: string) => { const response = await RequestAddDocumentGroup(groupName) if (response.id) await updateDocuments() + saveGroups() return response } const requestAddArea = async (documentId: string, area: AddAreaProps): Promise => { const response = await RequestAddArea(documentId, new ipc.Area(area)) if (response.id) await updateDocuments() + saveDocuments() return response } @@ -78,6 +68,7 @@ export function ProjectProvider({ children, projectProps }: Props) { const response = await RequestUpdateArea(new ipc.Area(updatedArea)) if (response.id) await updateDocuments() + saveDocuments() return response } @@ -88,6 +79,7 @@ export function ProjectProvider({ children, projectProps }: Props) { const requestDeleteAreaById = async (areaId: string): Promise => { const wasSuccessfulDeletion = await RequestDeleteAreaById(areaId) if (wasSuccessfulDeletion) updateDocuments() + saveDocuments() return wasSuccessfulDeletion } @@ -154,12 +146,14 @@ export function ProjectProvider({ children, projectProps }: Props) { const requestUpdateDocument = async (docuemntProps: UpdateDocumentRequest) => { const response = await RequestUpdateDocument(new ipc.Document(docuemntProps)) await updateDocuments() + saveDocuments() return response } const requestChangeAreaOrder = async (areaId: string, newOrder: number) => { const response = await RequestChangeAreaOrder(areaId, newOrder) await updateDocuments() + saveDocuments() return response } @@ -169,7 +163,10 @@ export function ProjectProvider({ children, projectProps }: Props) { const requestChangeGroupOrder = async (groupId: string, newOrder: number) => { const response = await RequestChangeGroupOrder(groupId, newOrder) + console.log('should be at ', newOrder) + console.log(response) await updateDocuments() + saveGroups() return response } diff --git a/frontend/useCases/processImageData.ts b/frontend/useCases/processImageData.ts deleted file mode 100644 index d2f7d59..0000000 --- a/frontend/useCases/processImageData.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { createScheduler, createWorker } from 'tesseract.js' -import { GetDocumentById } from '../wailsjs/wailsjs/go/ipc/Channel' -import loadImage from './loadImage' - -const getImageWorkerCount = (areaCount: number) => { - const minWorkerCount = 1 - const maxWorkerCount = 10 - const areasPerWorker = 10 - - if (areaCount > maxWorkerCount * areasPerWorker) return maxWorkerCount; - if (areaCount <= areasPerWorker) return minWorkerCount - return ~~(areaCount / areasPerWorker) -} - -const processImageData = async (documentId: string) => { - const foundDocument = await GetDocumentById(documentId) - if (!foundDocument.path || !foundDocument.areas?.length) return - - const { areas, path } = foundDocument - const imageData = await loadImage(path) - - const scheduler = createScheduler() - const workerCount = getImageWorkerCount(areas.length) - for (let index = 0; index < workerCount; index++) { - const worker = await createWorker() - await worker.loadLanguage('eng') // TODO: change this when multilangiage system is implementd - await worker.initialize('eng') // TODO: same here - scheduler.addWorker(worker) - } - - const results = await Promise.allSettled(areas.map(a => { - return scheduler.addJob('recognize', imageData, { rectangle: { - left: a.startX, - top: a.startY, - width: a.endX - a.startX, - height: a.endY - a.startY, - }}) - })) - - return results -} - -export default processImageData \ No newline at end of file diff --git a/frontend/useCases/saveData.ts b/frontend/useCases/saveData.ts new file mode 100644 index 0000000..cdde75e --- /dev/null +++ b/frontend/useCases/saveData.ts @@ -0,0 +1,24 @@ +import { RequestSaveDocumentCollection, RequestSaveGroupCollection } from '../wailsjs/wailsjs/go/ipc/Channel' + +const saveDocuments = async () => { + try { + const sucessfulSave = RequestSaveDocumentCollection() + if (!sucessfulSave) console.error('Could not save DocumentCollection') + } catch (err) { + console.error('Could not save DocumentCollection:', err) + } +} + +const saveGroups = async () => { + try { + const sucessfulSave = RequestSaveGroupCollection() + if (!sucessfulSave) console.error('Could not save GroupCollection') + } catch (err) { + console.error('Could not save GroupCollection:', err) + } +} + +export { + saveDocuments, + saveGroups, +} \ No newline at end of file diff --git a/ipc/Documents.go b/ipc/Documents.go index 5fc9f17..b14b86b 100644 --- a/ipc/Documents.go +++ b/ipc/Documents.go @@ -388,10 +388,16 @@ func (c *Channel) RequestChangeAreaOrder(areaId string, newOrder int) Document { for index, a := range documentOfArea.Areas { if a.Id == areaId { documentOfArea.Areas[index].Order = newOrder - processedAreasCollection.GetAreaById(a.Id).Order = newOrder + foundProcessedArea := processedAreasCollection.GetAreaById(a.Id) + if foundProcessedArea != nil { + foundProcessedArea.Order = newOrder + } } else if a.Order >= newOrder { documentOfArea.Areas[index].Order = a.Order + 1 - processedAreasCollection.GetAreaById(a.Id).Order = a.Order + 1 + foundProcessedArea := processedAreasCollection.GetAreaById(a.Id) + if foundProcessedArea != nil { + foundProcessedArea.Order = a.Order + 1 + } } } diff --git a/ipc/Session.go b/ipc/Session.go index 1d413df..80557ec 100644 --- a/ipc/Session.go +++ b/ipc/Session.go @@ -57,9 +57,9 @@ func (c *Channel) CreateNewProject(name string) Session { } successfulProjectWrite := storage.WriteLocalProjectData(storage.LocalProject{ - Id: uuid.NewString(), - OrganizationId: currentSession.Project.OrganizationId, - Name: name, + Id: newProject.Id, + OrganizationId: newProject.OrganizationId, + Name: newProject.Name, }) if !successfulProjectWrite { diff --git a/storage/Local/Interface.go b/storage/Local/Interface.go index 3c66aa2..e026115 100644 --- a/storage/Local/Interface.go +++ b/storage/Local/Interface.go @@ -30,7 +30,7 @@ func createLocalStorageDirIfNeeded() bool { } errorCreatingDir := os.Mkdir(localStoragePath, os.ModePerm) - return errorCreatingDir != nil + return errorCreatingDir == nil } func createLocalStorageSubDirIfNeeded(relativeSubdirectoryPath string) bool { @@ -48,7 +48,7 @@ func createLocalStorageSubDirIfNeeded(relativeSubdirectoryPath string) bool { } errorCreatingDir := os.MkdirAll(fullLocalStoragePath, os.ModePerm) - return errorCreatingDir != nil + return errorCreatingDir == nil } func WriteLocalUserData(user LocalUser) bool { @@ -110,13 +110,15 @@ func WriteLocalProjectData(project LocalProject) bool { return false } + fmt.Println(project) + subdirectory := "/projects/" + project.Name + "/" isLocalStorageDirectoryCreated := createLocalStorageSubDirIfNeeded(subdirectory) if !isLocalStorageDirectoryCreated { return false } - err := os.WriteFile(GetLocalStoragePath()+subdirectory+project.Name+"/Project.json", file, 0644) + err := os.WriteFile(GetLocalStoragePath()+subdirectory+"Project.json", file, 0644) return err == nil }