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"; import { previousObjectSearches } from "../../Model/model"; import { stringToOptionTag } from "../../utility"; 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 showingMessageObjects = new React.MapState(); const isFilterEmpty = React.createProxyState( [appliedFilter], () => appliedFilter.value == "" ); function resetFilter() { filterInput.value = ""; applyFilter(); } function applyFilter() { appliedFilter.value = filterInput.value; previousObjectSearches.add(appliedFilter.value); const allObjects = [...chat.objects.value.values()]; allObjects.forEach((object, i) => { const doesMatch = checkIfMatchesFilter(object); if (doesMatch) { showingMessageObjects.set(object.id, object); } else { showingMessageObjects.remove(object.id); } }); resultCount.value = showingMessageObjects.value.size; } chat.objects.handleAddition((messageObject) => { if (checkIfMatchesFilter(messageObject) == false) return; showingMessageObjects.set(messageObject.id, messageObject); chat.objects.handleRemoval(messageObject, () => { showingMessageObjects.remove(messageObject.id); }); }); function checkIfMatchesFilter(messageObject: MessageObject) { if (isFilterEmpty.value == true) return true; const stringsInObject: string[] = []; const objectTitle = messageObject.title || translation.untitledObject; stringsInObject.push(objectTitle); const latest = chat.getMostRecentContent(messageObject); if (latest) { Object.values(latest).forEach((value) => { if (typeof value != "string") return; stringsInObject.push(value); }); } const wordsOfObject = stringsInObject .map((string) => string.toLowerCase().split(" ")) .flat(); const wordsOfSearchTerm = appliedFilter.value.toLowerCase().split(" "); for (const word of wordsOfSearchTerm) { if (word[0] == "-") { // exclusion const wordContent = word.substring(1); if (wordsOfObject.includes(wordContent)) return false; } else { return wordsOfObject.includes(word); } } return true; } applyFilter(); // 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, showingMessageObjects, 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 ( ); }