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 { translations } from "../translations"; export function BoardStatusGridPage(boardViewModel: BoardViewModel) { const statuses: React.ListState = new React.ListState(); const sortedStatuses: React.State = createSortedPropertyValueState(statuses); boardViewModel.taskViewModels.subscribe(() => { collectPropertyValuesToState( "status", (taskViewModel: TaskViewModel) => taskViewModel.task, boardViewModel.taskViewModels, statuses, ); }); const statusNameCellConverter: React.StateItemConverter = ( statusName: string, ) => { const index = createPropertyValueIndexState(sortedStatuses, statusName); return StatusNameCell(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( categoryName, index, statuses, sortedStatuses, boardViewModel, ); }; return (
); }, )}
); } function StatusNameCell( 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( 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 CategoryStatusColumn( categoryName, statusName, index, boardViewModel, taskViewModels, ); }; const viewModel: TaskCategoryBulkChangeViewModel = new TaskCategoryBulkChangeViewModel( taskViewModels, categoryName, ); const view = (
); index.subscribe((newIndex) => { view.style.order = newIndex; }); return view; }, ); } function CategoryStatusColumn( 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; }