@ablogcms/kanban 3.2.28-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Board.d.ts +3 -0
- package/dist/components/BoardContainer.d.ts +7 -0
- package/dist/components/Card.d.ts +19 -0
- package/dist/components/DefaultCard.d.ts +3 -0
- package/dist/components/DefaultLaneHeader.d.ts +3 -0
- package/dist/components/DragOverlay/CardOverlay.d.ts +11 -0
- package/dist/components/DragOverlay/LaneOverlay.d.ts +7 -0
- package/dist/components/Lane.d.ts +32 -0
- package/dist/components/NewCard.d.ts +4 -0
- package/dist/components/NewLane.d.ts +3 -0
- package/dist/components/SortableLane.d.ts +30 -0
- package/dist/components/Tag.d.ts +6 -0
- package/dist/components/widgets/DeleteButton.d.ts +6 -0
- package/dist/components/widgets/EditableLabel.d.ts +8 -0
- package/dist/components.d.ts +2 -0
- package/dist/context/BoardContext.d.ts +10 -0
- package/dist/context/BoardReducer.d.ts +3 -0
- package/dist/helpers/LaneHelper.d.ts +40 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.mjs +981 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types/index.d.ts +187 -0
- package/dist/utils/dndIds.d.ts +9 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Board.tsx","../src/context/BoardContext.tsx","../src/helpers/LaneHelper.ts","../src/context/BoardReducer.ts","../src/components/BoardContainer.tsx","../src/components/SortableLane.tsx","../src/components/Lane.tsx","../src/components/Card.tsx","../src/components/widgets/DeleteButton.tsx","../src/utils/dndIds.ts","../src/components/DragOverlay/CardOverlay.tsx","../src/components/DragOverlay/LaneOverlay.tsx","../src/components/Tag.tsx","../src/components/DefaultCard.tsx","../src/components/DefaultLaneHeader.tsx","../src/components/NewCard.tsx","../src/components/widgets/EditableLabel.tsx","../src/components/NewLane.tsx","../src/components.ts","../src/index.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { BoardProvider } from '../context/BoardContext';\nimport BoardContainer from './BoardContainer';\nimport { BoardProps } from '../types';\nimport { components as defaultComponents } from '../components';\n\nfunction Board(props: BoardProps) {\n const boardId = useRef(uuidv4()).current;\n const components = useMemo(() => ({ ...defaultComponents, ...props.components }), [props.components]);\n\n return (\n <BoardProvider initialData={props.data}>\n <BoardContainer {...props} id={boardId} components={components} />\n </BoardProvider>\n );\n}\n\nexport default Board;\n","import React, { createContext, useContext, useReducer } from 'react';\nimport { BoardState, BoardAction, BoardData } from '../types';\nimport { boardReducer, initialState } from './BoardReducer';\n\nconst BoardStateContext = createContext<BoardState | null>(null);\nconst BoardDispatchContext = createContext<React.Dispatch<BoardAction> | null>(null);\n\ninterface BoardProviderProps {\n initialData: BoardData;\n children: React.ReactNode;\n}\n\nexport function BoardProvider({ initialData, children }: BoardProviderProps) {\n const [state, dispatch] = useReducer(boardReducer, initialData, (data) =>\n boardReducer(initialState, { type: 'LOAD_BOARD', payload: data })\n );\n\n return (\n <BoardStateContext.Provider value={state}>\n <BoardDispatchContext.Provider value={dispatch}>{children}</BoardDispatchContext.Provider>\n </BoardStateContext.Provider>\n );\n}\n\nexport function useBoardState(): BoardState {\n const ctx = useContext(BoardStateContext);\n if (!ctx) throw new Error('useBoardState must be used within BoardProvider');\n return ctx;\n}\n\nexport function useBoardDispatch(): React.Dispatch<BoardAction> {\n const ctx = useContext(BoardDispatchContext);\n if (!ctx) throw new Error('useBoardDispatch must be used within BoardProvider');\n return ctx;\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { BoardState, BoardData, CardData, LaneData } from '../types';\n\nconst LaneHelper = {\n initialiseLanes: (state: BoardState, { lanes }: BoardData): BoardState => {\n const newLanes = lanes.map((lane) => ({\n ...lane,\n currentPage: 1,\n cards: (lane.cards || []).map((c) => ({ ...c, laneId: lane.id })),\n }));\n return { ...state, lanes: newLanes };\n },\n\n paginateLane: (\n state: BoardState,\n { laneId, newCards, nextPage }: { laneId: string; newCards: CardData[]; nextPage: number }\n ): BoardState => {\n const updatedLanes = LaneHelper.appendCardsToLane(state, { laneId, newCards });\n return {\n ...state,\n lanes: updatedLanes.map((lane) => (lane.id === laneId ? { ...lane, currentPage: nextPage } : lane)),\n };\n },\n\n appendCardsToLane: (\n state: BoardState,\n { laneId, newCards, index }: { laneId: string; newCards: CardData[]; index?: number }\n ): LaneData[] => {\n const lane = state.lanes.find((l) => l.id === laneId);\n if (!lane) return state.lanes;\n const existingIds = new Set(lane.cards.map((c) => c.id));\n const cardsWithLaneId = newCards.map((c) => ({ ...c, laneId })).filter((c) => !existingIds.has(c.id));\n\n return state.lanes.map((l) => {\n if (l.id !== laneId) return l;\n if (index !== undefined) {\n const cards = [...l.cards];\n cards.splice(index, 0, ...cardsWithLaneId);\n return { ...l, cards };\n }\n return { ...l, cards: [...l.cards, ...cardsWithLaneId] };\n });\n },\n\n appendCardToLane: (\n state: BoardState,\n { laneId, card, index }: { laneId: string; card: CardData; index?: number }\n ): BoardState => {\n const newLanes = LaneHelper.appendCardsToLane(state, { laneId, newCards: [card], index });\n return { ...state, lanes: newLanes };\n },\n\n addLane: (state: BoardState, lane: Partial<LaneData>): BoardState => {\n const newLane: LaneData = { id: uuidv4(), cards: [], ...lane };\n return { ...state, lanes: [...state.lanes, newLane] };\n },\n\n removeCardFromLane: (state: BoardState, { laneId, cardId }: { laneId: string; cardId: string }): BoardState => {\n const lanes = state.lanes.map((lane) => {\n if (lane.id !== laneId) return lane;\n return { ...lane, cards: lane.cards.filter((card) => card.id !== cardId) };\n });\n return { ...state, lanes };\n },\n\n moveCardAcrossLanes: (\n state: BoardState,\n { fromLaneId, toLaneId, cardId, index }: { fromLaneId: string; toLaneId: string; cardId: string; index: number }\n ): BoardState => {\n let cardToMove: CardData | null = null;\n const interimLanes = state.lanes.map((lane) => {\n if (lane.id !== fromLaneId) return lane;\n cardToMove = lane.cards.find((card) => card.id === cardId) || null;\n return { ...lane, cards: lane.cards.filter((card) => card.id !== cardId) };\n });\n if (!cardToMove) return state;\n const interimState = { ...state, lanes: interimLanes };\n return LaneHelper.appendCardToLane(interimState, { laneId: toLaneId, card: cardToMove, index });\n },\n\n updateCardsForLane: (state: BoardState, { laneId, cards }: { laneId: string; cards: CardData[] }): BoardState => {\n const lanes = state.lanes.map((lane) => {\n if (lane.id !== laneId) return lane;\n return { ...lane, cards };\n });\n return { ...state, lanes };\n },\n\n updateLanes: (state: BoardState, lanes: LaneData[]): BoardState => {\n return { ...state, lanes };\n },\n\n moveLane: (state: BoardState, { oldIndex, newIndex }: { oldIndex: number; newIndex: number }): BoardState => {\n const lanes = [...state.lanes];\n const [laneToMove] = lanes.splice(oldIndex, 1);\n lanes.splice(newIndex, 0, laneToMove);\n return { ...state, lanes };\n },\n};\n\nexport default LaneHelper;\n","import { BoardState, BoardAction } from '../types';\nimport LaneHelper from '../helpers/LaneHelper';\n\nexport const initialState: BoardState = { lanes: [] };\n\nexport function boardReducer(state: BoardState, action: BoardAction): BoardState {\n switch (action.type) {\n case 'LOAD_BOARD':\n return LaneHelper.initialiseLanes(state, action.payload);\n case 'ADD_CARD':\n return LaneHelper.appendCardToLane(state, action.payload);\n case 'REMOVE_CARD':\n return LaneHelper.removeCardFromLane(state, action.payload);\n case 'MOVE_CARD':\n return LaneHelper.moveCardAcrossLanes(state, action.payload);\n case 'UPDATE_CARDS':\n return LaneHelper.updateCardsForLane(state, action.payload);\n case 'UPDATE_LANES':\n return LaneHelper.updateLanes(state, action.payload);\n case 'PAGINATE_LANE':\n return LaneHelper.paginateLane(state, action.payload);\n case 'MOVE_LANE':\n return LaneHelper.moveLane(state, action.payload);\n case 'ADD_LANE':\n return LaneHelper.addLane(state, action.payload);\n default:\n return state;\n }\n}\n","import { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport {\n DndContext,\n DragEndEvent,\n DragOverEvent,\n DragStartEvent,\n DragOverlay,\n PointerSensor,\n KeyboardSensor,\n useSensor,\n useSensors,\n closestCorners,\n} from '@dnd-kit/core';\nimport {\n SortableContext,\n horizontalListSortingStrategy,\n sortableKeyboardCoordinates,\n arrayMove,\n} from '@dnd-kit/sortable';\n\nimport SortableLane from './SortableLane';\nimport CardOverlay from './DragOverlay/CardOverlay';\nimport LaneOverlay from './DragOverlay/LaneOverlay';\nimport { useBoardState, useBoardDispatch } from '../context/BoardContext';\nimport { BoardProps, EventBusEvent, KanbanComponents, LaneData } from '../types';\nimport { isLaneId, isCardId, fromLaneId, fromCardId, toLaneId, isDropLaneId, fromDropLaneId } from '../utils/dndIds';\n\ntype BoardContainerProps = BoardProps & { id: string; components: KanbanComponents };\n\nfunction BoardContainer(props: BoardContainerProps) {\n const {\n data,\n id,\n draggable = false,\n laneDraggable = true,\n style,\n editable = false,\n canAddLanes = false,\n addLaneTitle = '+ Add another lane',\n components,\n onDataChange = () => {},\n eventBusHandle,\n handleLaneDragStart = () => {},\n handleLaneDragEnd = () => {},\n handleDragStart = () => {},\n handleDragEnd = () => {},\n } = props;\n\n const state = useBoardState();\n const dispatch = useBoardDispatch();\n\n const [addLaneMode, setAddLaneMode] = useState(false);\n const [activeId, setActiveId] = useState<string | null>(null);\n const [activeLaneId, setActiveLaneId] = useState<string | null>(null);\n\n const prevStateRef = useRef(state);\n const prevDataRef = useRef(data);\n\n // 外部 data prop が変化したら再ロード\n useEffect(() => {\n if (JSON.stringify(data) !== JSON.stringify(prevDataRef.current)) {\n dispatch({ type: 'LOAD_BOARD', payload: data });\n onDataChange(data as unknown as typeof state);\n prevDataRef.current = data;\n }\n }, [data, dispatch, onDataChange]);\n\n // 内部 state が変化したら onDataChange を呼ぶ\n useEffect(() => {\n if (state !== prevStateRef.current && prevStateRef.current.lanes.length > 0) {\n onDataChange(state);\n prevStateRef.current = state;\n }\n }, [state, onDataChange]);\n\n // EventBus のセットアップ\n useEffect(() => {\n if (!eventBusHandle) return;\n const eventBus = {\n publish: (event: EventBusEvent) => {\n switch (event.type) {\n case 'ADD_CARD':\n dispatch({ type: 'ADD_CARD', payload: { laneId: event.laneId, card: event.card } });\n break;\n case 'REMOVE_CARD':\n dispatch({ type: 'REMOVE_CARD', payload: { laneId: event.laneId, cardId: event.cardId } });\n break;\n case 'REFRESH_BOARD':\n dispatch({ type: 'LOAD_BOARD', payload: event.data });\n break;\n case 'MOVE_CARD':\n dispatch({\n type: 'MOVE_CARD',\n payload: {\n fromLaneId: event.fromLaneId,\n toLaneId: event.toLaneId,\n cardId: event.cardId,\n index: event.index,\n },\n });\n break;\n case 'UPDATE_LANES':\n dispatch({ type: 'UPDATE_LANES', payload: event.lanes });\n break;\n default:\n // EventBusEvent は union で全パターンを網羅済みだが、lint の default-case 要件を満たすため配置\n break;\n }\n },\n };\n eventBusHandle(eventBus);\n }, [eventBusHandle, dispatch]);\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n const findCardLane = useCallback(\n (cardId: string): LaneData | undefined => {\n return state.lanes.find((lane) => lane.cards.some((c) => c.id === cardId));\n },\n [state.lanes]\n );\n\n const handleDragStartEvent = (event: DragStartEvent) => {\n const { active } = event;\n setActiveId(active.id as string);\n\n if (isCardId(active.id as string)) {\n const cardId = fromCardId(active.id as string);\n const lane = findCardLane(cardId);\n if (lane) {\n setActiveLaneId(lane.id);\n handleDragStart(cardId, lane.id);\n }\n } else if (isLaneId(active.id as string)) {\n const laneId = fromLaneId(active.id as string);\n handleLaneDragStart(laneId);\n }\n };\n\n const handleDragOver = useCallback(\n (event: DragOverEvent) => {\n const { active, over } = event;\n if (!over || !isCardId(active.id as string)) return;\n if (active.id === over.id) return;\n\n const activeCardId = fromCardId(active.id as string);\n const overId = over.id as string;\n\n // overがレーン自体かカードかで toLaneId を決定\n let overLaneId: string;\n let overIndex: number;\n\n if (isLaneId(overId) || isDropLaneId(overId)) {\n overLaneId = isLaneId(overId) ? fromLaneId(overId) : fromDropLaneId(overId);\n const overLane = state.lanes.find((l) => l.id === overLaneId);\n overIndex = overLane?.cards.length ?? 0;\n } else if (isCardId(overId)) {\n const overCardId = fromCardId(overId);\n const overLane = state.lanes.find((l) => l.cards.some((c) => c.id === overCardId));\n if (!overLane) return;\n overLaneId = overLane.id;\n overIndex = overLane.cards.findIndex((c) => c.id === overCardId);\n } else {\n return;\n }\n\n // 現在のカードのレーン(activeLaneId でtracking)\n const currentLaneId = activeLaneId || findCardLane(activeCardId)?.id;\n if (!currentLaneId || currentLaneId === overLaneId) return;\n\n // droppable=false のレーンには落とさない\n const targetLane = state.lanes.find((l) => l.id === overLaneId);\n if (targetLane?.droppable === false) return;\n\n dispatch({\n type: 'MOVE_CARD',\n payload: { fromLaneId: currentLaneId, toLaneId: overLaneId, cardId: activeCardId, index: overIndex },\n });\n setActiveLaneId(overLaneId);\n },\n [state.lanes, activeLaneId, findCardLane, dispatch]\n );\n\n const handleDragEndEvent = useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event;\n\n if (over && isCardId(active.id as string)) {\n const activeCardId = fromCardId(active.id as string);\n\n if (isCardId(over.id as string)) {\n const overCardId = fromCardId(over.id as string);\n if (activeCardId !== overCardId) {\n // 同一レーン内ソート\n const lane = state.lanes.find((l) => l.cards.some((c) => c.id === activeCardId));\n if (lane) {\n const oldIndex = lane.cards.findIndex((c) => c.id === activeCardId);\n const newIndex = lane.cards.findIndex((c) => c.id === overCardId);\n if (oldIndex !== -1 && newIndex !== -1 && lane.cards[oldIndex]?.laneId === lane.cards[newIndex]?.laneId) {\n const newCards = arrayMove(lane.cards, oldIndex, newIndex);\n dispatch({ type: 'UPDATE_CARDS', payload: { laneId: lane.id, cards: newCards } });\n handleDragEnd(activeCardId, lane.id, lane.id, newIndex, lane.cards[oldIndex]);\n }\n }\n }\n }\n\n // クロスレーン移動は onDragOver で済んでいるのでコールバックのみ\n if (activeLaneId) {\n const finalLane = state.lanes.find((l) => l.id === activeLaneId);\n const cardDetails = finalLane?.cards.find((c) => c.id === activeCardId);\n const originalLane = findCardLane(activeCardId);\n if (cardDetails && originalLane && originalLane.id !== activeLaneId) {\n const position = finalLane?.cards.findIndex((c) => c.id === activeCardId) ?? 0;\n handleDragEnd(activeCardId, originalLane.id, activeLaneId, position, cardDetails);\n }\n }\n } else if (over && isLaneId(active.id as string)) {\n const activeLaneIdStr = fromLaneId(active.id as string);\n const overLaneIdStr = isLaneId(over.id as string) ? fromLaneId(over.id as string) : null;\n if (overLaneIdStr && activeLaneIdStr !== overLaneIdStr) {\n const oldIndex = state.lanes.findIndex((l) => l.id === activeLaneIdStr);\n const newIndex = state.lanes.findIndex((l) => l.id === overLaneIdStr);\n if (oldIndex !== -1 && newIndex !== -1) {\n dispatch({ type: 'MOVE_LANE', payload: { oldIndex, newIndex } });\n const payload = state.lanes[oldIndex];\n handleLaneDragEnd(activeLaneIdStr, newIndex, payload);\n }\n }\n }\n\n setActiveId(null);\n setActiveLaneId(null);\n },\n [state.lanes, activeLaneId, findCardLane, dispatch, handleDragEnd, handleLaneDragEnd]\n );\n\n // アクティブなドラッグアイテムの情報\n const activeCard = useMemo(() => {\n if (!activeId || !isCardId(activeId)) return null;\n const cardId = fromCardId(activeId);\n const lane = findCardLane(cardId);\n return lane?.cards.find((c) => c.id === cardId) ?? null;\n }, [activeId, findCardLane]);\n\n const activeLane = useMemo(() => {\n if (!activeId || !isLaneId(activeId)) return null;\n return state.lanes.find((l) => l.id === fromLaneId(activeId)) ?? null;\n }, [activeId, state.lanes]);\n\n const laneIds = useMemo(() => state.lanes.map((l) => toLaneId(l.id)), [state.lanes]);\n\n const {\n onLaneScroll,\n onCardClick,\n onCardDelete,\n onCardAdd,\n onLaneClick,\n addCardLink,\n laneSortFunction,\n cardDraggable,\n collapsibleLanes,\n hideCardDeleteIcon,\n customCardLayout,\n tagStyle,\n cardDragClass,\n addCardTitle,\n } = props;\n const passthroughProps = {\n onLaneScroll,\n onCardClick,\n onCardDelete,\n onCardAdd,\n onLaneClick,\n addCardLink,\n laneSortFunction,\n draggable,\n cardDraggable,\n collapsibleLanes,\n editable,\n canAddLanes,\n hideCardDeleteIcon,\n customCardLayout,\n components,\n tagStyle,\n handleDragStart,\n handleDragEnd,\n cardDragClass,\n addCardTitle,\n };\n\n const addNewLane = (params: { title: string }) => {\n setAddLaneMode(false);\n dispatch({ type: 'ADD_LANE', payload: params });\n };\n\n const renderNewLane = () => (\n <span>\n <components.NewLane onCancel={() => setAddLaneMode(false)} onAdd={addNewLane} />\n </span>\n );\n\n const renderDragOverlayContent = () => {\n if (activeCard) {\n return (\n <CardOverlay\n card={activeCard}\n components={components}\n tagStyle={passthroughProps.tagStyle}\n customCardLayout={passthroughProps.customCardLayout}\n />\n );\n }\n if (activeLane) {\n return <LaneOverlay lane={activeLane} />;\n }\n return null;\n };\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCorners}\n onDragStart={handleDragStartEvent}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEndEvent}\n >\n <div style={style} draggable={false} className=\"acms-admin-kanban-board\" data-boardid={id}>\n <SortableContext items={laneIds} strategy={horizontalListSortingStrategy}>\n {state.lanes.map((lane, index) => {\n const isLaneDraggable = draggable && laneDraggable && (lane.movable === undefined ? true : lane.movable);\n return (\n <SortableLane\n key={lane.id}\n lane={lane}\n boardId={`TrelloBoard${id}`}\n index={index}\n disabled={!isLaneDraggable}\n laneDraggable={laneDraggable}\n {...passthroughProps}\n />\n );\n })}\n </SortableContext>\n {editable && canAddLanes && !addLaneMode && (\n <span\n role=\"button\"\n tabIndex={0}\n style={{ cursor: 'pointer', padding: '10px', color: '#fff' }}\n onClick={() => setAddLaneMode(true)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setAddLaneMode(true);\n }\n }}\n >\n {addLaneTitle}\n </span>\n )}\n {addLaneMode && renderNewLane()}\n </div>\n <DragOverlay>{renderDragOverlayContent()}</DragOverlay>\n </DndContext>\n );\n}\n\nexport default BoardContainer;\n","import React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport Lane from './Lane';\nimport { LaneData, CardData, KanbanComponents } from '../types';\nimport { toLaneId } from '../utils/dndIds';\n\ninterface SortableLaneProps {\n lane: LaneData;\n boardId: string;\n index: number;\n disabled?: boolean;\n draggable?: boolean;\n laneDraggable?: boolean;\n cardDraggable?: boolean;\n collapsibleLanes?: boolean;\n editable?: boolean;\n hideCardDeleteIcon?: boolean;\n customCardLayout?: boolean;\n components: KanbanComponents;\n tagStyle?: React.CSSProperties;\n cardStyle?: React.CSSProperties;\n addCardTitle?: string;\n addCardLink?: React.ReactNode;\n onLaneScroll?: (requestedPage: number, laneId: string) => Promise<CardData[]>;\n onCardClick?: (cardId: string, metadata: unknown, laneId: string) => void;\n onCardDelete?: (cardId: string, laneId: string) => void;\n onCardAdd?: (card: CardData, laneId: string) => void;\n onLaneClick?: (laneId: string) => void;\n handleDragStart?: (cardId: string, laneId: string) => void;\n handleDragEnd?: (\n cardId: string,\n sourceLaneId: string,\n targetLaneId: string,\n position: number,\n cardDetails: CardData\n ) => void;\n laneSortFunction?: (card1: CardData, card2: CardData) => number;\n}\n\nfunction SortableLane({ lane, disabled = false, ...laneProps }: SortableLaneProps) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: toLaneId(lane.id),\n disabled,\n data: { type: 'LANE', lane },\n });\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.3 : 1,\n display: 'inline-block',\n };\n\n return (\n <div ref={setNodeRef} style={style}>\n <Lane\n lane={lane}\n dragHandleListeners={listeners as unknown as Record<string, unknown>}\n dragHandleAttributes={attributes as unknown as Record<string, unknown>}\n {...laneProps}\n />\n </div>\n );\n}\n\nexport default SortableLane;\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { useDroppable } from '@dnd-kit/core';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport Spinner from '@ablogcms/components/spinner';\nimport Card from './Card';\nimport { useBoardDispatch } from '../context/BoardContext';\nimport { CardData, KanbanComponents, LaneData } from '../types';\nimport { toCardId, toDropLaneId } from '../utils/dndIds';\n\ninterface LaneProps {\n lane: LaneData;\n boardId: string;\n index: number;\n draggable?: boolean;\n cardDraggable?: boolean;\n collapsibleLanes?: boolean;\n editable?: boolean;\n hideCardDeleteIcon?: boolean;\n customCardLayout?: boolean;\n components: KanbanComponents;\n tagStyle?: React.CSSProperties;\n cardStyle?: React.CSSProperties;\n titleStyle?: React.CSSProperties;\n labelStyle?: React.CSSProperties;\n addCardTitle?: string;\n addCardLink?: React.ReactNode;\n onLaneScroll?: (requestedPage: number, laneId: string) => Promise<CardData[]>;\n onCardClick?: (cardId: string, metadata: unknown, laneId: string) => void;\n onCardDelete?: (cardId: string, laneId: string) => void;\n onCardAdd?: (card: CardData, laneId: string) => void;\n onLaneClick?: (laneId: string) => void;\n laneSortFunction?: (card1: CardData, card2: CardData) => number;\n dragHandleListeners?: Record<string, unknown>;\n dragHandleAttributes?: Record<string, unknown>;\n}\n\nfunction Lane({\n lane,\n boardId: _boardId, // eslint-disable-line @typescript-eslint/no-unused-vars\n index: _index, // eslint-disable-line @typescript-eslint/no-unused-vars\n draggable = false,\n cardDraggable = true,\n collapsibleLanes = false,\n editable = false,\n hideCardDeleteIcon = false,\n customCardLayout = false,\n components,\n tagStyle,\n cardStyle,\n titleStyle,\n labelStyle,\n addCardTitle = 'Add Card',\n addCardLink,\n onLaneScroll,\n onCardClick,\n onCardDelete = () => {},\n onCardAdd = () => {},\n onLaneClick,\n laneSortFunction,\n dragHandleListeners,\n dragHandleAttributes,\n}: LaneProps) {\n const dispatch = useBoardDispatch();\n const [loading, setLoading] = useState(false);\n const [addCardMode, setAddCardMode] = useState(false);\n const [collapsed, setCollapsed] = useState(false);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n const { id, cards = [], style, droppable, currentPage = 1 } = lane;\n\n // droppable対象にする\n const { isOver, setNodeRef: setDropRef } = useDroppable({\n id: toDropLaneId(id),\n disabled: droppable === false,\n });\n\n const handleScroll = useCallback(\n (evt: Event) => {\n const node = evt.target as HTMLDivElement;\n const elemScrollPosition = node.scrollHeight - node.scrollTop - node.clientHeight;\n if (elemScrollPosition <= 0 && onLaneScroll && !loading) {\n setLoading(true);\n const nextPage = currentPage + 1;\n onLaneScroll(nextPage, id).then((moreCards) => {\n if (!moreCards || moreCards.length === 0) {\n node.scrollTop -= 100;\n } else {\n dispatch({ type: 'PAGINATE_LANE', payload: { laneId: id, newCards: moreCards, nextPage } });\n }\n setLoading(false);\n });\n }\n },\n [currentPage, id, loading, onLaneScroll, dispatch]\n );\n\n useEffect(() => {\n const node = scrollRef.current;\n if (node) {\n node.addEventListener('scroll', handleScroll);\n return () => node.removeEventListener('scroll', handleScroll);\n }\n }, [handleScroll]);\n\n const removeCard = (laneId: string, cardId: string) => {\n dispatch({ type: 'REMOVE_CARD', payload: { laneId, cardId } });\n };\n\n const addNewCard = (params: { title: string; label: string; description: string; [key: string]: unknown }) => {\n const newCardId = uuidv4();\n setAddCardMode(false);\n const card: CardData = { id: newCardId, laneId: id, ...params };\n dispatch({ type: 'ADD_CARD', payload: { laneId: id, card } });\n onCardAdd(card, id);\n };\n\n const toggleLaneCollapsed = () => {\n if (collapsibleLanes) setCollapsed((c) => !c);\n };\n\n const renderAddCardLink = () => {\n if (addCardLink) {\n return (\n <span\n role=\"button\"\n tabIndex={0}\n onClick={() => setAddCardMode(true)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setAddCardMode(true);\n }\n }}\n >\n {addCardLink}\n </span>\n );\n }\n return (\n <button type=\"button\" className=\"acms-admin-kanban-add-card-link\" onClick={() => setAddCardMode(true)}>\n {addCardTitle}\n </button>\n );\n };\n\n const renderFooter = () => {\n if (collapsibleLanes && cards.length > 0) {\n return (\n <button\n type=\"button\"\n className=\"acms-admin-kanban-lane-footer\"\n onClick={toggleLaneCollapsed}\n aria-label={collapsed ? 'Expand' : 'Collapse'}\n >\n <span className={collapsed ? 'acms-admin-kanban-expand-btn' : 'acms-admin-kanban-collapse-btn'} />\n </button>\n );\n }\n return null;\n };\n\n const sortedCards = useMemo(() => {\n const showableCards = collapsed ? [] : cards;\n if (!laneSortFunction) return showableCards;\n return [...showableCards].sort(laneSortFunction);\n }, [cards, collapsed, laneSortFunction]);\n\n const cardIds = useMemo(() => sortedCards.map((c) => toCardId(c.id)), [sortedCards]);\n\n return (\n // レーン全体のクリックは任意コールバック用の補助的なフックであり、内部にカード/ボタン等の\n // インタラクティブ要素を含むため要素自体をボタン化しない(既存挙動を維持)。\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n <section\n key={id}\n style={style as React.CSSProperties}\n onClick={() => onLaneClick && onLaneClick(id)}\n draggable={false}\n className=\"acms-admin-kanban-lane\"\n >\n <components.LaneHeader\n lane={lane}\n titleStyle={titleStyle}\n labelStyle={labelStyle}\n dragHandleListeners={dragHandleListeners}\n dragHandleAttributes={dragHandleAttributes}\n onToggleCollapsed={toggleLaneCollapsed}\n />\n <div\n ref={(node) => {\n scrollRef.current = node;\n setDropRef(node);\n }}\n className={`acms-admin-kanban-lane-scroll${isOver ? ' acms-admin-kanban-lane-scroll-dragover' : ''}`}\n >\n <SortableContext items={cardIds} strategy={verticalListSortingStrategy}>\n {sortedCards.map((card) => (\n <Card\n key={card.id}\n card={card}\n laneId={id}\n draggable={draggable}\n cardDraggable={cardDraggable}\n editable={editable}\n hideCardDeleteIcon={hideCardDeleteIcon}\n customCardLayout={customCardLayout}\n components={components}\n tagStyle={tagStyle}\n cardStyle={cardStyle}\n onCardClick={onCardClick}\n onCardDelete={onCardDelete}\n onRemoveCard={removeCard}\n />\n ))}\n </SortableContext>\n {editable && !addCardMode && renderAddCardLink()}\n {addCardMode && (\n <span>\n <components.NewCard laneId={id} onCancel={() => setAddCardMode(false)} onAdd={addNewCard} />\n </span>\n )}\n </div>\n {loading && <Spinner size={24} style={{ display: 'block', margin: '15px auto' }} />}\n {renderFooter()}\n </section>\n );\n}\n\nexport default Lane;\n","import React from 'react';\nimport { CSS } from '@dnd-kit/utilities';\nimport { useSortable } from '@dnd-kit/sortable';\nimport DeleteButton from './widgets/DeleteButton';\nimport { CardData, KanbanComponents } from '../types';\nimport { toCardId } from '../utils/dndIds';\n\ninterface CardProps {\n card: CardData;\n laneId: string;\n editable?: boolean;\n hideCardDeleteIcon?: boolean;\n customCardLayout?: boolean;\n components: KanbanComponents;\n tagStyle?: React.CSSProperties;\n cardStyle?: React.CSSProperties;\n draggable?: boolean;\n cardDraggable?: boolean;\n onCardClick?: (cardId: string, metadata: unknown, laneId: string) => void;\n onCardDelete?: (cardId: string, laneId: string) => void;\n onRemoveCard?: (laneId: string, cardId: string) => void;\n}\n\nfunction Card({\n card,\n laneId,\n editable = false,\n hideCardDeleteIcon = false,\n customCardLayout = false,\n components,\n tagStyle,\n cardStyle = {},\n draggable = false,\n cardDraggable = true,\n onCardClick,\n onCardDelete = () => {},\n onRemoveCard,\n}: CardProps) {\n const isDraggingEnabled = draggable && cardDraggable;\n\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: toCardId(card.id),\n disabled: !isDraggingEnabled,\n });\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0 : 1,\n };\n\n const handleRemoveCard = (e: React.MouseEvent) => {\n if (onRemoveCard) onRemoveCard(laneId, card.id);\n onCardDelete(card.id, laneId);\n e.stopPropagation();\n };\n\n const handleClick = (e: React.MouseEvent) => {\n if (onCardClick) onCardClick(card.id, card.metadata, laneId);\n e.stopPropagation();\n };\n\n const handleDelete = () => {\n if (onRemoveCard) onRemoveCard(laneId, card.id);\n onCardDelete(card.id, laneId);\n };\n\n const wrapperStyle = customCardLayout ? { ...cardStyle, padding: 0 } : cardStyle;\n\n return (\n // ドラッグ有効時は useSortable の attributes/listeners が role/tabIndex/キーボード操作を提供する。\n // 無効時のクリックはカード選択という補助的な操作のため、キーボード対応は必須にしていない(既存挙動を維持)。\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions\n <article\n ref={setNodeRef}\n className=\"acms-admin-kanban-card\"\n data-id={card.id}\n style={{ ...wrapperStyle, ...style }}\n onClick={handleClick}\n {...(isDraggingEnabled ? { ...attributes, ...listeners } : {})}\n >\n <components.Card card={card} laneId={laneId} tagStyle={tagStyle} onDelete={handleDelete} />\n {editable && !hideCardDeleteIcon && <DeleteButton onClick={handleRemoveCard} />}\n </article>\n );\n}\n\nexport default Card;\n","import React from 'react';\n\ninterface DeleteButtonProps {\n onClick?: (e: React.MouseEvent) => void;\n}\n\nfunction DeleteButton(props: DeleteButtonProps) {\n return (\n <div className=\"acms-admin-kanban-delete-wrapper\">\n <button type=\"button\" className=\"acms-admin-kanban-delete-button\" onClick={props.onClick}>\n x\n </button>\n </div>\n );\n}\n\nexport default DeleteButton;\n","export const toLaneId = (id: string): string => `lane:${id}`;\nexport const toCardId = (id: string): string => `card:${id}`;\nexport const toDropLaneId = (id: string): string => `droplane:${id}`;\nexport const fromLaneId = (id: string): string => id.replace(/^lane:/, '');\nexport const fromCardId = (id: string): string => id.replace(/^card:/, '');\nexport const fromDropLaneId = (id: string): string => id.replace(/^droplane:/, '');\nexport const isLaneId = (id: string): boolean => id.startsWith('lane:');\nexport const isCardId = (id: string): boolean => id.startsWith('card:');\nexport const isDropLaneId = (id: string): boolean => id.startsWith('droplane:');\n","import React from 'react';\nimport { CardData, KanbanComponents } from '../../types';\n\nconst overlayStyle: React.CSSProperties = {\n transform: 'rotate(3deg)',\n boxShadow: '0 5px 15px rgba(0,0,0,0.3)',\n cursor: 'grabbing',\n};\n\ninterface CardOverlayProps {\n card: CardData;\n components: KanbanComponents;\n tagStyle?: React.CSSProperties;\n cardStyle?: React.CSSProperties;\n customCardLayout?: boolean;\n}\n\nfunction CardOverlay({ card, components, tagStyle, cardStyle = {}, customCardLayout = false }: CardOverlayProps) {\n const wrapperStyle = customCardLayout\n ? { ...cardStyle, padding: 0, ...overlayStyle }\n : { ...cardStyle, ...overlayStyle };\n\n return (\n <article className=\"acms-admin-kanban-card\" data-id={card.id} style={wrapperStyle}>\n <components.Card card={card} laneId={card.laneId} tagStyle={tagStyle} onDelete={() => {}} />\n </article>\n );\n}\n\nexport default CardOverlay;\n","import React from 'react';\nimport { LaneData } from '../../types';\n\nconst overlayStyle: React.CSSProperties = {\n transform: 'rotate(3deg)',\n boxShadow: '0 5px 15px rgba(0,0,0,0.3)',\n cursor: 'grabbing',\n opacity: 0.9,\n};\n\ninterface LaneOverlayProps {\n lane: LaneData;\n}\n\nfunction LaneOverlay({ lane }: LaneOverlayProps) {\n return (\n <section\n style={{ ...((lane.style as React.CSSProperties) || {}), ...overlayStyle }}\n className=\"acms-admin-kanban-lane\"\n >\n <span style={{ fontWeight: 'bold', padding: '5px' }}>{lane.title as React.ReactNode}</span>\n </section>\n );\n}\n\nexport default LaneOverlay;\n","import type { CSSProperties } from 'react';\nimport { TagData } from '../types';\n\ninterface TagProps extends TagData {\n [key: string]: unknown;\n}\n\nfunction Tag({ title, color, bgcolor, tagStyle }: TagProps) {\n const style: CSSProperties = {\n color: color || 'white',\n backgroundColor: bgcolor || 'orange',\n ...tagStyle,\n };\n return (\n <span className=\"acms-admin-kanban-tag\" style={style}>\n {title}\n </span>\n );\n}\n\nexport default Tag;\n","import Tag from './Tag';\nimport { CardComponentProps, TagData } from '../types';\n\nfunction DefaultCard({ card, tagStyle }: CardComponentProps) {\n const { title, description, label, tags } = card;\n return (\n <span>\n <header className=\"acms-admin-kanban-card-header\">\n <span className=\"acms-admin-kanban-card-title\">{title}</span>\n <span className=\"acms-admin-kanban-card-label\">{label}</span>\n </header>\n <div className=\"acms-admin-kanban-card-detail\">{description}</div>\n {tags && (\n <div className=\"acms-admin-kanban-card-footer\">\n {tags.map((tag: TagData) => (\n <Tag key={tag.title} {...tag} tagStyle={tagStyle} />\n ))}\n </div>\n )}\n </span>\n );\n}\n\nexport default DefaultCard;\n","import { LaneHeaderComponentProps } from '../types';\n\nfunction DefaultLaneHeader({\n lane,\n titleStyle,\n labelStyle,\n dragHandleListeners,\n dragHandleAttributes,\n onToggleCollapsed,\n}: LaneHeaderComponentProps) {\n return (\n <header\n className=\"acms-admin-kanban-lane-header\"\n onDoubleClick={onToggleCollapsed}\n {...(dragHandleListeners || {})}\n {...(dragHandleAttributes || {})}\n >\n <span className=\"acms-admin-kanban-lane-title\" style={titleStyle}>\n {lane.title}\n </span>\n {lane.label && (\n <span className=\"acms-admin-kanban-lane-label\">\n <span style={labelStyle}>{lane.label}</span>\n </span>\n )}\n </header>\n );\n}\n\nexport default DefaultLaneHeader;\n","import { useState } from 'react';\nimport { Button } from '@ablogcms/components/button';\nimport EditableLabel from './widgets/EditableLabel';\nimport { NewCardComponentProps } from '../types';\n\nfunction NewCard({\n laneId: _laneId, // eslint-disable-line @typescript-eslint/no-unused-vars\n onCancel,\n onAdd,\n}: NewCardComponentProps) {\n const [formData, setFormData] = useState({ title: '', label: '', description: '' });\n\n const updateField = (field: keyof typeof formData, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleAdd = () => {\n onAdd(formData);\n };\n\n return (\n <div className=\"acms-admin-kanban-new-lane\">\n <div className=\"acms-admin-kanban-card\">\n <header className=\"acms-admin-kanban-card-header\">\n <span className=\"acms-admin-kanban-card-title\">\n {/* eslint-disable-next-line jsx-a11y/no-autofocus -- カード追加直後にタイトル入力へフォーカスする意図的なUX */}\n <EditableLabel placeholder=\"title\" onChange={(val) => updateField('title', val)} autoFocus />\n </span>\n <span className=\"acms-admin-kanban-card-label\">\n <EditableLabel placeholder=\"label\" onChange={(val) => updateField('label', val)} />\n </span>\n </header>\n <div className=\"acms-admin-kanban-card-detail\">\n <EditableLabel placeholder=\"description\" onChange={(val) => updateField('description', val)} />\n </div>\n </div>\n <Button type=\"button\" variant=\"success\" onClick={handleAdd}>\n Add\n </Button>\n <Button type=\"button\" variant=\"text\" onClick={onCancel}>\n Cancel\n </Button>\n </div>\n );\n}\n\nexport default NewCard;\n","import React, { useRef, useState, useEffect } from 'react';\n\ninterface EditableLabelProps {\n onChange?: (value: string) => void;\n placeholder?: string;\n autoFocus?: boolean;\n}\n\nfunction EditableLabel({ onChange = () => {}, placeholder = '', autoFocus = false }: EditableLabelProps) {\n const [text, setText] = useState('');\n const divRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (autoFocus && divRef.current) {\n divRef.current.focus();\n }\n }, [autoFocus]);\n\n const onTextChange = (ev: React.FormEvent<HTMLDivElement>) => {\n setText(ev.currentTarget.innerText);\n };\n\n const onBlur = () => {\n onChange(text);\n };\n\n const onPaste = (ev: React.ClipboardEvent<HTMLDivElement>) => {\n ev.preventDefault();\n const pastedText = ev.clipboardData.getData('text');\n document.execCommand('insertText', false, pastedText);\n };\n\n const className = `acms-admin-kanban-editable-label${text === '' ? ' acms-admin-kanban-editable-label--has-placeholder' : ''}`;\n\n return (\n <div\n ref={divRef}\n contentEditable\n className={className}\n onPaste={onPaste}\n onBlur={onBlur}\n onInput={onTextChange}\n data-placeholder={placeholder}\n suppressContentEditableWarning\n />\n );\n}\n\nexport default EditableLabel;\n","import { useState } from 'react';\nimport { Button } from '@ablogcms/components/button';\nimport EditableLabel from './widgets/EditableLabel';\nimport { NewLaneComponentProps } from '../types';\n\nfunction NewLane({ onCancel, onAdd }: NewLaneComponentProps) {\n const [formData, setFormData] = useState({ title: '' });\n\n const updateField = (field: keyof typeof formData, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleAdd = () => {\n onAdd(formData);\n };\n\n return (\n <div className=\"acms-admin-kanban-new-lane\">\n <div className=\"acms-admin-kanban-new-lane-title\">\n {/* eslint-disable-next-line jsx-a11y/no-autofocus -- レーン追加直後にタイトル入力へフォーカスする意図的なUX */}\n <EditableLabel placeholder=\"title\" onChange={(val) => updateField('title', val)} autoFocus />\n </div>\n <div className=\"acms-admin-kanban-new-lane-buttons\">\n <Button type=\"button\" variant=\"success\" onClick={handleAdd}>\n Add\n </Button>\n <Button type=\"button\" variant=\"text\" onClick={onCancel}>\n Cancel\n </Button>\n </div>\n </div>\n );\n}\n\nexport default NewLane;\n","import { KanbanComponents } from './types';\nimport DefaultCard from './components/DefaultCard';\nimport DefaultLaneHeader from './components/DefaultLaneHeader';\nimport NewCard from './components/NewCard';\nimport NewLane from './components/NewLane';\n\nexport const components: KanbanComponents = {\n Card: DefaultCard,\n LaneHeader: DefaultLaneHeader,\n NewCard,\n NewLane,\n};\n","import Board from './components/Board';\nimport Tag from './components/Tag';\nimport Lane from './components/Lane';\nimport Card from './components/Card';\n\nexport { Board, Tag, Lane, Card };\nexport type {\n BoardProps,\n BoardData,\n LaneData,\n CardData,\n TagData,\n EventBus,\n EventBusEvent,\n KanbanComponents,\n CardComponentProps,\n NewCardComponentProps,\n LaneHeaderComponentProps,\n NewLaneComponentProps,\n} from './types';\nexport default Board;\n"],"mappings":"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","names":["useMemo","useRef","uuidv4","fromLaneId","toLaneId","useState","useEffect","useRef","useCallback","useMemo","SortableContext","useSortable","CSS","uuidv4","jsx","jsx","components","jsx","jsxs","components","uuidv4","jsx","useSortable","CSS","jsx","components","jsx","overlayStyle","jsx","jsxs","components","useState","useRef","useEffect","useCallback","useMemo","SortableContext","jsx","jsx","jsxs","jsx","jsxs","useState","useRef","useState","useEffect","jsx","jsx","jsxs","useState","useState","Button","jsx","jsxs","useState","Button","jsx","useRef","uuidv4","components","useMemo"]}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface TagData {
|
|
3
|
+
title: string;
|
|
4
|
+
color?: string;
|
|
5
|
+
bgcolor?: string;
|
|
6
|
+
tagStyle?: React.CSSProperties;
|
|
7
|
+
}
|
|
8
|
+
export interface CardData {
|
|
9
|
+
id: string;
|
|
10
|
+
laneId: string;
|
|
11
|
+
title?: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
label?: string;
|
|
14
|
+
tags?: TagData[];
|
|
15
|
+
metadata?: Record<string, unknown>;
|
|
16
|
+
cardStyle?: React.CSSProperties;
|
|
17
|
+
[key: string]: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface LaneData {
|
|
20
|
+
id: string;
|
|
21
|
+
title?: React.ReactNode;
|
|
22
|
+
label?: string;
|
|
23
|
+
cards: CardData[];
|
|
24
|
+
currentPage?: number;
|
|
25
|
+
droppable?: boolean;
|
|
26
|
+
movable?: boolean;
|
|
27
|
+
style?: React.CSSProperties;
|
|
28
|
+
titleStyle?: React.CSSProperties;
|
|
29
|
+
labelStyle?: React.CSSProperties;
|
|
30
|
+
cardStyle?: React.CSSProperties;
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
}
|
|
33
|
+
export interface BoardData {
|
|
34
|
+
lanes: LaneData[];
|
|
35
|
+
}
|
|
36
|
+
export interface BoardState {
|
|
37
|
+
lanes: LaneData[];
|
|
38
|
+
}
|
|
39
|
+
export type EventBusEvent = {
|
|
40
|
+
type: 'ADD_CARD';
|
|
41
|
+
laneId: string;
|
|
42
|
+
card: CardData;
|
|
43
|
+
} | {
|
|
44
|
+
type: 'REMOVE_CARD';
|
|
45
|
+
laneId: string;
|
|
46
|
+
cardId: string;
|
|
47
|
+
} | {
|
|
48
|
+
type: 'MOVE_CARD';
|
|
49
|
+
fromLaneId: string;
|
|
50
|
+
toLaneId: string;
|
|
51
|
+
cardId: string;
|
|
52
|
+
index: number;
|
|
53
|
+
} | {
|
|
54
|
+
type: 'UPDATE_LANES';
|
|
55
|
+
lanes: LaneData[];
|
|
56
|
+
} | {
|
|
57
|
+
type: 'REFRESH_BOARD';
|
|
58
|
+
data: BoardData;
|
|
59
|
+
};
|
|
60
|
+
export interface EventBus {
|
|
61
|
+
publish: (event: EventBusEvent) => void;
|
|
62
|
+
}
|
|
63
|
+
export interface CardComponentProps {
|
|
64
|
+
card: CardData;
|
|
65
|
+
laneId: string;
|
|
66
|
+
tagStyle?: React.CSSProperties;
|
|
67
|
+
onDelete: () => void;
|
|
68
|
+
}
|
|
69
|
+
export interface NewCardComponentProps {
|
|
70
|
+
laneId: string;
|
|
71
|
+
onAdd: (card: {
|
|
72
|
+
title: string;
|
|
73
|
+
label: string;
|
|
74
|
+
description: string;
|
|
75
|
+
[key: string]: unknown;
|
|
76
|
+
}) => void;
|
|
77
|
+
onCancel: () => void;
|
|
78
|
+
}
|
|
79
|
+
export interface LaneHeaderComponentProps {
|
|
80
|
+
lane: LaneData;
|
|
81
|
+
titleStyle?: React.CSSProperties;
|
|
82
|
+
labelStyle?: React.CSSProperties;
|
|
83
|
+
dragHandleListeners?: Record<string, unknown>;
|
|
84
|
+
dragHandleAttributes?: Record<string, unknown>;
|
|
85
|
+
onToggleCollapsed: () => void;
|
|
86
|
+
}
|
|
87
|
+
export interface NewLaneComponentProps {
|
|
88
|
+
onAdd: (lane: {
|
|
89
|
+
title: string;
|
|
90
|
+
}) => void;
|
|
91
|
+
onCancel: () => void;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Board の各パーツ(カード本文・カード追加フォーム・レーンヘッダー・レーン追加フォーム)を
|
|
95
|
+
* 差し替え可能にする拡張ポイント。cloneElement で追加 props を注入する旧方式(customCard /
|
|
96
|
+
* customLaneHeader / newCardTemplate / newLaneTemplate)を、@ablogcms/components の
|
|
97
|
+
* dataview と同じ「コンポーネント参照を渡す」方式に統一する。
|
|
98
|
+
*/
|
|
99
|
+
export interface KanbanComponents {
|
|
100
|
+
Card: React.ComponentType<CardComponentProps>;
|
|
101
|
+
NewCard: React.ComponentType<NewCardComponentProps>;
|
|
102
|
+
LaneHeader: React.ComponentType<LaneHeaderComponentProps>;
|
|
103
|
+
NewLane: React.ComponentType<NewLaneComponentProps>;
|
|
104
|
+
}
|
|
105
|
+
export interface BoardProps {
|
|
106
|
+
data: BoardData;
|
|
107
|
+
onDataChange?: (data: BoardState) => void;
|
|
108
|
+
eventBusHandle?: (bus: EventBus) => void;
|
|
109
|
+
onLaneScroll?: (requestedPage: number, laneId: string) => Promise<CardData[]>;
|
|
110
|
+
onCardClick?: (cardId: string, metadata: unknown, laneId: string) => void;
|
|
111
|
+
onCardDelete?: (cardId: string, laneId: string) => void;
|
|
112
|
+
onCardAdd?: (card: CardData, laneId: string) => void;
|
|
113
|
+
addCardLink?: React.ReactNode;
|
|
114
|
+
onLaneClick?: (laneId: string) => void;
|
|
115
|
+
laneSortFunction?: (card1: CardData, card2: CardData) => number;
|
|
116
|
+
draggable?: boolean;
|
|
117
|
+
collapsibleLanes?: boolean;
|
|
118
|
+
editable?: boolean;
|
|
119
|
+
canAddLanes?: boolean;
|
|
120
|
+
hideCardDeleteIcon?: boolean;
|
|
121
|
+
handleDragStart?: (cardId: string, laneId: string) => void;
|
|
122
|
+
handleDragEnd?: (cardId: string, sourceLaneId: string, targetLaneId: string, position: number, cardDetails: CardData) => void;
|
|
123
|
+
handleLaneDragStart?: (laneId: string) => void;
|
|
124
|
+
handleLaneDragEnd?: (laneId: string, newPosition: number, payload: LaneData) => void;
|
|
125
|
+
customCardLayout?: boolean;
|
|
126
|
+
style?: React.CSSProperties;
|
|
127
|
+
tagStyle?: React.CSSProperties;
|
|
128
|
+
laneDraggable?: boolean;
|
|
129
|
+
cardDraggable?: boolean;
|
|
130
|
+
cardDragClass?: string;
|
|
131
|
+
laneDragClass?: string;
|
|
132
|
+
addLaneTitle?: string;
|
|
133
|
+
addCardTitle?: string;
|
|
134
|
+
components?: Partial<KanbanComponents>;
|
|
135
|
+
className?: string;
|
|
136
|
+
id?: string;
|
|
137
|
+
}
|
|
138
|
+
export type BoardAction = {
|
|
139
|
+
type: 'LOAD_BOARD';
|
|
140
|
+
payload: BoardData;
|
|
141
|
+
} | {
|
|
142
|
+
type: 'ADD_CARD';
|
|
143
|
+
payload: {
|
|
144
|
+
laneId: string;
|
|
145
|
+
card: CardData;
|
|
146
|
+
index?: number;
|
|
147
|
+
};
|
|
148
|
+
} | {
|
|
149
|
+
type: 'REMOVE_CARD';
|
|
150
|
+
payload: {
|
|
151
|
+
laneId: string;
|
|
152
|
+
cardId: string;
|
|
153
|
+
};
|
|
154
|
+
} | {
|
|
155
|
+
type: 'MOVE_CARD';
|
|
156
|
+
payload: {
|
|
157
|
+
fromLaneId: string;
|
|
158
|
+
toLaneId: string;
|
|
159
|
+
cardId: string;
|
|
160
|
+
index: number;
|
|
161
|
+
};
|
|
162
|
+
} | {
|
|
163
|
+
type: 'UPDATE_CARDS';
|
|
164
|
+
payload: {
|
|
165
|
+
laneId: string;
|
|
166
|
+
cards: CardData[];
|
|
167
|
+
};
|
|
168
|
+
} | {
|
|
169
|
+
type: 'UPDATE_LANES';
|
|
170
|
+
payload: LaneData[];
|
|
171
|
+
} | {
|
|
172
|
+
type: 'PAGINATE_LANE';
|
|
173
|
+
payload: {
|
|
174
|
+
laneId: string;
|
|
175
|
+
newCards: CardData[];
|
|
176
|
+
nextPage: number;
|
|
177
|
+
};
|
|
178
|
+
} | {
|
|
179
|
+
type: 'MOVE_LANE';
|
|
180
|
+
payload: {
|
|
181
|
+
oldIndex: number;
|
|
182
|
+
newIndex: number;
|
|
183
|
+
};
|
|
184
|
+
} | {
|
|
185
|
+
type: 'ADD_LANE';
|
|
186
|
+
payload: Partial<LaneData>;
|
|
187
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const toLaneId: (id: string) => string;
|
|
2
|
+
export declare const toCardId: (id: string) => string;
|
|
3
|
+
export declare const toDropLaneId: (id: string) => string;
|
|
4
|
+
export declare const fromLaneId: (id: string) => string;
|
|
5
|
+
export declare const fromCardId: (id: string) => string;
|
|
6
|
+
export declare const fromDropLaneId: (id: string) => string;
|
|
7
|
+
export declare const isLaneId: (id: string) => boolean;
|
|
8
|
+
export declare const isCardId: (id: string) => boolean;
|
|
9
|
+
export declare const isDropLaneId: (id: string) => boolean;
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ablogcms/kanban",
|
|
3
|
+
"version": "3.2.28-beta.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "管理画面のカンバン UI コンポーネント",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "https://www.a-blogcms.jp",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+ssh://git@bitbucket.org:appleple/ablogcms.git",
|
|
11
|
+
"directory": "packages/frontend/kanban"
|
|
12
|
+
},
|
|
13
|
+
"sideEffects": false,
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@dnd-kit/core": "^6.3.1",
|
|
16
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
17
|
+
"@dnd-kit/utilities": "^3.2.2",
|
|
18
|
+
"immutability-helper": "^3.1.1",
|
|
19
|
+
"uuid": "^10.0.0",
|
|
20
|
+
"@ablogcms/components": "3.2.28-beta.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@storybook/react-vite": "10.5.4",
|
|
24
|
+
"@testing-library/react": "^16.3.2",
|
|
25
|
+
"@testing-library/user-event": "^14.6.1",
|
|
26
|
+
"vitest": "^4.1.9"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"react": "^19",
|
|
30
|
+
"@types/react": "^19.2.17"
|
|
31
|
+
},
|
|
32
|
+
"peerDependenciesMeta": {
|
|
33
|
+
"@types/react": {
|
|
34
|
+
"optional": true
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"exports": {
|
|
38
|
+
".": {
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"import": "./dist/index.mjs",
|
|
41
|
+
"default": "./dist/index.mjs"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public"
|
|
46
|
+
},
|
|
47
|
+
"files": [
|
|
48
|
+
"dist"
|
|
49
|
+
],
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "node ../../../tools/build-package.mjs"
|
|
52
|
+
}
|
|
53
|
+
}
|