import * as React from "bloatless-react"; import { Chat, MessageObject } from "../../Model/chatModel"; import { AllObjectsView } from "./allObjectsView"; import { KanbanView } from "./kanbanView"; import { NoteObjectsView } from "./noteObjectsView"; import { ObjectDetailModal } from "./objectDetailModal"; import { ObjectGridView } from "./objectGridView"; import { StatusView } from "./statusView"; import { icons } from "../../icons"; import { translation } from "../../translations"; export const viewTypes = { all: [translation.viewAll, "grid_view"], notes: [translation.viewNotes, icons.noteContent], kanban: [translation.viewKanban, "view_kanban"], status: [translation.viewStatus, icons.status], }; export function ObjectPane(chat: Chat) { // selection and modal const isShowingObjectModal = new React.State(false); const isShowingFilterModel = new React.State(false); const selectedObject = new React.State(undefined); // methods function createObject() { const newObject = chat.createObjectFromTitle(""); chat.addObjectAndSend(newObject); selectedObject.value = newObject; isShowingObjectModal.value = true; } function showFilters() { isShowingFilterModel.value = true; } function closeFilters() { isShowingFilterModel.value = false; } // filter const filterInput = new React.State(""); const appliedFilter = new React.State(""); const resultCount = new React.State(0); const resultText = React.createProxyState([appliedFilter, resultCount], () => translation.searchTitleText(appliedFilter.value, resultCount.value) ); const messageObjects = new React.MapState(); const cannotReset = React.createProxyState( [appliedFilter], () => appliedFilter.value == "" ); function resetFilter() { filterInput.value = ""; applyFilter(); } function applyFilter() { appliedFilter.value = filterInput.value; } function updateObjects() { const allObjects = [...chat.objects.value.entries()]; const matchingObjects = allObjects.filter((entry) => { let objectTitle = entry[1].title || translation.untitledObject; const regex = new RegExp(appliedFilter.value.toLowerCase()); return regex.test(objectTitle.toLowerCase()); }); resultCount.value = matchingObjects.length; messageObjects.clear(); matchingObjects.forEach((entry) => messageObjects.set(...entry)); } React.bulkSubscribe([appliedFilter, chat.objects], updateObjects); updateObjects(); // view const objectModal = React.createProxyState( [chat.objects, selectedObject], () => { if (selectedObject.value == undefined) return
; return ObjectDetailModal( chat, selectedObject.value, isShowingObjectModal ); } ); const mainView = React.createProxyState([chat.viewType], () => { function getViewFunction() { switch (chat.viewType.value) { case "notes": return NoteObjectsView; case "kanban": return KanbanView; case "status": return StatusView; default: return AllObjectsView; } } return getViewFunction()( chat, messageObjects, selectedObject, isShowingObjectModal ); }); return (
{...Object.keys(viewTypes).map((key: any) => ViewTypeToggle(key, chat.viewType) )}
); } function ViewTypeToggle( key: keyof typeof viewTypes, selection: React.State ) { const [label, icon] = viewTypes[key]; function select() { selection.value = key; } const isSelected = React.createProxyState( [selection], () => selection.value == key ); return ( ); }