@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.
@@ -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
+ }