import { action, computed, makeObservable, observable } from "mobx"; import { computedFn } from "mobx-utils"; import { IssueRootStore } from "./root.store"; import { TIssueGroupByOptions } from "@plane/types"; import { DRAG_ALLOWED_GROUPS } from "@/constants/issue"; // types export interface IIssueKanBanViewStore { kanBanToggle: { groupByHeaderMinMax: string[]; subgroupByIssuesVisibility: string[]; }; isDragging: boolean; // computed getCanUserDragDrop: ( group_by: TIssueGroupByOptions | undefined, sub_group_by: TIssueGroupByOptions | undefined ) => boolean; canUserDragDropVertically: boolean; canUserDragDropHorizontally: boolean; // actions handleKanBanToggle: (toggle: "groupByHeaderMinMax" | "subgroupByIssuesVisibility", value: string) => void; setIsDragging: (isDragging: boolean) => void; } export class IssueKanBanViewStore implements IIssueKanBanViewStore { kanBanToggle: { groupByHeaderMinMax: string[]; subgroupByIssuesVisibility: string[]; } = { groupByHeaderMinMax: [], subgroupByIssuesVisibility: [] }; isDragging = false; // root store rootStore; constructor(_rootStore: IssueRootStore) { makeObservable(this, { kanBanToggle: observable, isDragging: observable.ref, // computed canUserDragDropVertically: computed, canUserDragDropHorizontally: computed, // actions handleKanBanToggle: action, setIsDragging: action.bound, }); this.rootStore = _rootStore; } setIsDragging = (isDragging: boolean) => { this.isDragging = isDragging; }; getCanUserDragDrop = computedFn( (group_by: TIssueGroupByOptions | undefined, sub_group_by: TIssueGroupByOptions | undefined) => { if (group_by && DRAG_ALLOWED_GROUPS.includes(group_by)) { if (!sub_group_by) return true; if (sub_group_by && DRAG_ALLOWED_GROUPS.includes(sub_group_by)) return true; } return false; } ); get canUserDragDropVertically() { return false; } get canUserDragDropHorizontally() { return false; } handleKanBanToggle = (toggle: "groupByHeaderMinMax" | "subgroupByIssuesVisibility", value: string) => { this.kanBanToggle = { ...this.kanBanToggle, [toggle]: this.kanBanToggle[toggle].includes(value) ? this.kanBanToggle[toggle].filter((v) => v !== value) : [...this.kanBanToggle[toggle], value], }; }; }