import * as React from "bloatless-react"; import { TaskCategoryBulkChangeViewModel, TaskStatusBulkChangeViewModel, } from "../../ViewModel/Utility/taskPropertyBulkChangeViewModel"; import BoardViewModel from "../../ViewModel/Pages/boardViewModel"; import { FilteredList } from "../Components/filteredList"; import { PropertyValueList } from "../Components/propertyList"; import TaskViewModel from "../../ViewModel/Pages/taskViewModel"; import { TaskViewModelToEntry } from "../Components/taskEntry"; import { collectObjectValuesForKey } from "../../Model/Utility/utility"; import { translations } from "../translations"; export function BoardStatusGridPage(boardViewModel: BoardViewModel) { const categoryRowConverter: React.StateItemConverter = ( categoryName: string ) => { return CategoryRow(categoryName, statuses, boardViewModel); }; const statusNameCellConverter: React.StateItemConverter = ( statusName: string ) => { return StatusNameCell(statusName, boardViewModel); }; const statuses: React.ListState = new React.ListState(); boardViewModel.taskViewModels.subscribe(() => { statuses.clear(); const statusArray: string[] = collectObjectValuesForKey( "status", (taskViewModel: TaskViewModel) => taskViewModel.task, [...boardViewModel.taskViewModels.value.values()] ); statuses.add(...statusArray); }); return (
{PropertyValueList( "category", (taskViewModel: TaskViewModel) => taskViewModel.task, boardViewModel.filteredTaskViewModels, (categories: React.ListState) => { return (
); } )}
); } function StatusNameCell(statusName: string, boardViewModel: BoardViewModel) { const taskViewModelsWithMatchingStatus: React.ListState = new React.ListState(); boardViewModel.taskViewModels.handleAddition( (taskViewModel: TaskViewModel) => { const doesMatchStatus: boolean = taskViewModel.task.status == statusName; if (doesMatchStatus == false) return; taskViewModelsWithMatchingStatus.add(taskViewModel); boardViewModel.taskViewModels.handleRemoval(taskViewModel, () => { taskViewModelsWithMatchingStatus.remove(taskViewModel); }); } ); const viewModel: TaskStatusBulkChangeViewModel = new TaskStatusBulkChangeViewModel( taskViewModelsWithMatchingStatus, statusName ); return (
); } function CategoryRow( categoryName: string, allStatuses: React.ListState, boardViewModel: BoardViewModel ) { return FilteredList( { category: categoryName }, (taskViewModel: TaskViewModel) => taskViewModel.task, boardViewModel.taskViewModels, (taskViewModels: React.ListState) => { const statusNameConverter: React.StateItemConverter = ( statusName: string ) => { return CategoryStatusColumn(statusName, taskViewModels); }; const viewModel: TaskCategoryBulkChangeViewModel = new TaskCategoryBulkChangeViewModel(taskViewModels, categoryName); return (
); } ); } function CategoryStatusColumn( statusName: string, 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); }); }); return (
); }