import * as React from "bloatless-react"; import { PropertyValueList, collectPropertyValuesToState, createPropertyValueIndexState, createSortedPropertyValueState, } from "../Components/propertyValueList"; import { TaskCategoryBulkChangeViewModel, TaskStatusBulkChangeViewModel, } from "../../ViewModel/Utility/taskPropertyBulkChangeViewModel"; import BoardViewModel from "../../ViewModel/Pages/boardViewModel"; import { FilteredList } from "../Components/filteredList"; import TaskViewModel from "../../ViewModel/Pages/taskViewModel"; import { TaskViewModelToEntry } from "../Components/taskEntry"; import { allowDrop } from "../utility"; import CoreViewModel from "../../ViewModel/Global/coreViewModel"; export function BoardStatusGridPage( coreViewModel: CoreViewModel, boardViewModel: BoardViewModel, ) { const statuses: React.ListState = new React.ListState(); const sortedStatuses: React.State = createSortedPropertyValueState(statuses); boardViewModel.filteredTaskViewModels.subscribe(() => { collectPropertyValuesToState( "status", (taskViewModel: TaskViewModel) => taskViewModel.task, boardViewModel.filteredTaskViewModels, statuses, ); }); const statusNameCellConverter: React.StateItemConverter = ( statusName: string, ) => { const index = createPropertyValueIndexState(sortedStatuses, statusName); return StatusNameCell(coreViewModel, statusName, index, boardViewModel); }; return (
{PropertyValueList( "category", (taskViewModel: TaskViewModel) => taskViewModel.task, boardViewModel.filteredTaskViewModels, ( categories: React.ListState, sortedCategories: React.State, ) => { const categoryRowConverter: React.StateItemConverter< string > = (categoryName: string) => { const index: React.State = createPropertyValueIndexState( sortedCategories, categoryName, ); return CategoryRow( coreViewModel, categoryName, index, statuses, sortedStatuses, boardViewModel, ); }; return (
); }, )}
); } function StatusNameCell( coreViewModel: CoreViewModel, statusName: string, index: React.State, boardViewModel: BoardViewModel, ) { const taskViewModelsWithMatchingStatus: React.ListState = new React.ListState(); boardViewModel.filteredTaskViewModels.handleAddition( (taskViewModel: TaskViewModel) => { const doesMatchStatus: boolean = taskViewModel.task.status == statusName; if (doesMatchStatus == false) return; taskViewModelsWithMatchingStatus.add(taskViewModel); boardViewModel.filteredTaskViewModels.handleRemoval( taskViewModel, () => { taskViewModelsWithMatchingStatus.remove(taskViewModel); }, ); }, ); const viewModel: TaskStatusBulkChangeViewModel = new TaskStatusBulkChangeViewModel( taskViewModelsWithMatchingStatus, statusName, ); const view = (
); index.subscribe((newIndex) => { view.style.order = newIndex; }); return view; } function CategoryRow( coreViewModel: CoreViewModel, categoryName: string, index: React.State, allStatuses: React.ListState, sortedStatuses: React.State, boardViewModel: BoardViewModel, ) { return FilteredList( { category: categoryName }, (taskViewModel: TaskViewModel) => taskViewModel.task, boardViewModel.filteredTaskViewModels, (taskViewModels: React.ListState) => { const statusNameConverter: React.StateItemConverter = ( statusName: string, ) => { const index = createPropertyValueIndexState( sortedStatuses, statusName, ); return StatusColumn( categoryName, statusName, index, boardViewModel, taskViewModels, ); }; const viewModel: TaskCategoryBulkChangeViewModel = new TaskCategoryBulkChangeViewModel( taskViewModels, categoryName, ); const view = (
); index.subscribe((newIndex) => { view.style.order = newIndex; }); return view; }, ); } function StatusColumn( categoryName: string, statusName: string, index: React.State, boardViewModel: BoardViewModel, taskViewModelsWithMatchingCategory: React.ListState, ) { const taskViewModels: React.ListState = new React.ListState(); taskViewModelsWithMatchingCategory.handleAddition((taskViewModel) => { const doesMatchStatus: boolean = taskViewModel.status.value == statusName; if (doesMatchStatus == false) return; taskViewModels.add(taskViewModel); taskViewModelsWithMatchingCategory.handleRemoval(taskViewModel, () => { taskViewModels.remove(taskViewModel); }); }); function drop() { boardViewModel.handleDropWithinBoard(categoryName, statusName); } const view = (
); index.subscribe((newIndex) => { view.style.order = newIndex; }); return view; }