Yehoshua Sandler c49f8e4d07
refact: generalized back end structs (#1)
* refact: generalized back end structs

* refact: fixed front end type, removed dead code

* removed test image folder

* refact: removed dead structs
2023-05-26 19:23:35 -05:00

141 lines
5.1 KiB
TypeScript

'use client'
import { DocumentPlusIcon, PlusIcon, XMarkIcon } from '@heroicons/react/24/outline'
import React, { useRef } from 'react'
import { useProject } from '../../../context/Project/provider'
import classNames from '../../../utils/classNames'
import onEnterHandler from '../../../utils/onEnterHandler'
import DocumentLineItem from './DocumentLineItem'
import { useSidebar } from './provider'
import { SidebarGroup } from './types'
const GroupLineItem = (props: { group: SidebarGroup, dragOverGroupId?: string }) => {
const {
requestAddDocument,
requestChangeGroupOrder,
getGroupById,
} = useProject()
const {
selectedGroupId,
isAddNewDocumentInputShowing,
setSelectedDocumentId,
setSelectedGroupId,
setIsAddNewDocumentInputShowing,
setIsAddNewGroupInputShowing,
dragOverGroupId,
setDragOverGroupId
} = useSidebar()
const addDocumentTextInput = useRef<HTMLInputElement>(null)
const onConfirmAddDocumentClickHandler = async (groupId: string) => {
const documentName = addDocumentTextInput.current?.value
if (!documentName) return
const response = await requestAddDocument(groupId, documentName)
if (!response.id) return
setSelectedDocumentId(response.id)
setSelectedGroupId(groupId)
setIsAddNewDocumentInputShowing(false)
}
const onCancelAddItemClickHandler = () => {
setIsAddNewDocumentInputShowing(false)
}
const onAddNewDocumentLineItemClickHandler = (groupId: string) => {
setSelectedGroupId(groupId)
setIsAddNewDocumentInputShowing(true)
setIsAddNewGroupInputShowing(false)
}
const onGroupDragOver = (groupId: string) => {
setDragOverGroupId(groupId)
}
const onGroupDropEnd = (groupId: string) => {
if (!groupId || groupId == dragOverGroupId) return
const groupDroppedOn = getGroupById(dragOverGroupId)
console.log('groupDroppedOn', groupDroppedOn)
if (!groupDroppedOn) return
requestChangeGroupOrder(groupId, groupDroppedOn.order)
setDragOverGroupId('')
}
const renderAddNewDocument = (groupId: string) => {
return isAddNewDocumentInputShowing && selectedGroupId === groupId
? <div className="flex rounded-md shadow-sm">
<div className="relative flex flex-grow items-stretch focus-within:z-10 text-lg">
<input
type="text"
name="documentName"
id="documentName"
className="h-8 text-white placeholder-gray-400 bg-gray-900 bg-opacity-5 block w-full rounded-none rounded-l-md border-late-700 focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm"
placeholder="Add Document"
autoFocus
onKeyDown={(event) => {
onEnterHandler(event,
() => onConfirmAddDocumentClickHandler(groupId))
}}
ref={addDocumentTextInput}
/>
</div>
<button
type="button"
onClick={onCancelAddItemClickHandler}
className="bg-gray-900 bg-opacity-5 relative -ml-px inline-flex items-center space-x-2 border border-gray-400 px-1 py-0 text-sm font-medium text-gray-100 hover:text-gray-900 hover:bg-gray-100 focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500"
>
<XMarkIcon className="h-4 w-5" aria-hidden="true" />
</button>
<button
type="button"
onClick={() => onConfirmAddDocumentClickHandler(groupId)}
className="bg-gray-900 bg-opacity-5 relative -ml-px inline-flex items-center space-x-2 rounded-r-md border border-gray-400 px-1 py-0 text-sm font-medium text-gray-100 hover:text-gray-900 hover:bg-gray-100 focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500"
>
<PlusIcon className="h-7 w-5" aria-hidden="true" />
</button>
</div>
:
<a
role='button'
className={classNames(
'text-gray-300 hover:bg-gray-700 hover:text-white',
' group w-full flex items-center pl-5 py-2 text-left font-medium',
'text-sm rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-500'
)}
onClick={() => onAddNewDocumentLineItemClickHandler(groupId)}
>
<DocumentPlusIcon className="h-3.5 mr-1" aria-hidden="true" />
Add Document
</a>
}
return (<details key={props.group.name} open={props.group.id === selectedGroupId}>
<summary
draggable
onDragOver={() => onGroupDragOver(props.group.id)}
onDragEnd={() => onGroupDropEnd(props.group.id)}
className={classNames(
'group items-center px-2 py-2 text-base font-medium rounded-t-md',
selectedGroupId === props.group.id ? 'bg-gray-900 text-white' : 'text-gray-300 hover:bg-gray-700 hover:text-white',
(dragOverGroupId === props.group.id) && props.group.id ? 'bg-gray-300 text-gray-700' : '',
)}
>
<a role='button'>{props.group.name}</a>
</summary>
<ul>
{props.group.documents.map((d, index) => (
<DocumentLineItem key={d.id} document={d} index={index} groupId={props.group.id} />
))}
{renderAddNewDocument(props.group.id)}
</ul>
</details>
)
}
export default GroupLineItem