tachybase_todo/packages/plugins/@nocobase/plugin-kanban/src/client/board/helpers.ts
katherinehhh b1610e6994
feat: kanban& gantt&bulk edit& bulk update& duplicate& print action pluggable (#3019)
* fix: bug

* test: kanban test

* test: gantt block test

* test: gantt test

* test: gantt test

* test: gantt test

* refactor: convert parameters to destructured object

* test: add tests choices

* test: add tests media

* test: add tests for datetime in creating form

* feat(plugin-mock-collection): generate faker time

* test: add tests for datetime in editing form

* test: add tests for datetime in details form

* test: gantt block test

* test: gantt test

* test: gantt test

* test: gantt test

* fix: bug

* feat: improve code

* test: add tests for relation fields

* refactor: style improve

* fix: rename SchemaSettings

* fix: type bug

* refactor: useDesinger()

* fix: bug

* fix: bug

* fix: build tip

* refactor: kanban setting

* refactor: gantt setting

* refactor: bulk update setting

* refactor: bulk update setting

* refactor: bulk edit settings

* refactor: duplicate settings

* refactor: print action setting

* refactor: duplicate settings

* refactor: bulk update refactor

* refactor: bulk update refactor

* fix: designableState

* fix: bug

* fix: designable

* refactor: bulk update

* fix: designable

* test: add tests for relation fields

* test: add tests for relation fields

* test: add tests for relation fields

* feat: client api doc

* test: add tests for relation fields

* test: avoid errors

* test: make tests passing

* fix: bug

* test: gantt test

* test: make tests passing

* test: add tests for advanced fields

* test: increase e2e timeout-minutes to 60

* fix: bug

* fix: improve code

* feat: add schema initailizer component  demos

* test: make tests passing

* fix: schema settings demos

* feat: shallowMerge & deepMerge

* test: reduce number of tests

* test: make tests passing

* feat: updates

* fix: add Initializer Internal

* demos:  useSchemaSettingsRender

* test: make tests passing

* test: make tests passing

* test: bulk update test

* refactor: useSchemaToolbar

* fix: improve docs

* fix: bug

* test: duplicate action test

* test: duplicate action test

* test: duplicate action test

* test: duplicate action test

* chore: upgrade dumi theme

* test: make tests passing

* test: add tests for linkage rules

* test: add test for form data templates

* test: add tests for default value

* test: reduce number of tests

* refactor: bulk edit setting

* test: bulk edit action test

* test: bulk edit action test

* fix: dn.deepMerge

* fix: bug

* test: bulk edit action test

* test: kanban test

* refactor: bulk update version

* refactor: print action version

* fix: bug

* fix: toolbar

* fix: docs ssr

* test: add tests for system fields

* test: add tests for actions

* fix:  bug

* test: add tests for lazy loading of variables

* test: make testing more stable

* test: bulk edit test

* test: bulk update action test

* fix: update docs

* test: print test

* test: kanban test

* test: kanban test

* refactor: duplicate version

* fix: merge bug

* refactor: bulk update

* fix: merge bug

* refactor: bulk edit

* refactor: import

* refactor: export action

* refactor: code improve

* refactor: kanban code improve

* fix: merge bug

* refactor: readPrettyFormActionInitializers

* test: print action test

* test: print action test

* refactor: print action

* test: action test

* refactor: gantt date change

* style: gantt  style improve

* test: gantt &bulkUpdate test

* test: bulk update test

* test: duplicate action test

* test: print action test

* test: bulk edit action test

* test: gantt block test

* test: kanban block test

* test: test file name

* test: test file name

* test: bulk update action tst

* refactor: rename test file name

* refactor: bulk update action

* refactor: gantt test

* fix: block template

* fix: block template

* fix: useFieldModeOptions

* refactor: code improve

* fix: merge bug

---------

Co-authored-by: dream2023 <1098626505@qq.com>
Co-authored-by: Rain <958414905@qq.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-12-16 21:59:33 +08:00

92 lines
3.7 KiB
TypeScript
Executable File

import {
addInArrayAtPosition,
changeElementOfPositionInArray,
removeFromArrayAtPosition,
replaceElementOfArray,
} from './utils';
function reorderCardsOnColumn(column, reorderCards) {
return { ...column, cards: reorderCards(column.cards) };
}
function moveColumn(board, { fromPosition }, { toPosition }) {
return { ...board, columns: changeElementOfPositionInArray(board.columns, fromPosition, toPosition) };
}
function moveCard(board, { fromPosition, fromColumnId }, { toPosition, toColumnId }) {
const sourceColumn = board.columns.find((column) => column.id === fromColumnId);
const destinationColumn = board.columns.find((column) => column.id === toColumnId);
const reorderColumnsOnBoard = (reorderColumnsMapper) => ({
...board,
columns: board.columns.map(reorderColumnsMapper),
});
const reorderCardsOnSourceColumn = reorderCardsOnColumn.bind(null, sourceColumn);
const reorderCardsOnDestinationColumn = reorderCardsOnColumn.bind(null, destinationColumn);
if (sourceColumn.id === destinationColumn.id) {
const reorderedCardsOnColumn = reorderCardsOnSourceColumn((cards) => {
return changeElementOfPositionInArray(cards, fromPosition, toPosition);
});
return reorderColumnsOnBoard((column) => (column.id === sourceColumn.id ? reorderedCardsOnColumn : column));
} else {
const reorderedCardsOnSourceColumn = reorderCardsOnSourceColumn((cards) => {
return removeFromArrayAtPosition(cards, fromPosition);
});
const reorderedCardsOnDestinationColumn = reorderCardsOnDestinationColumn((cards) => {
return addInArrayAtPosition(cards, sourceColumn.cards[fromPosition], toPosition);
});
return reorderColumnsOnBoard((column) => {
if (column.id === sourceColumn.id) return reorderedCardsOnSourceColumn;
if (column.id === destinationColumn.id) return reorderedCardsOnDestinationColumn;
return column;
});
}
}
function addColumn(board, column) {
return { ...board, columns: addInArrayAtPosition(board.columns, column, board.columns.length) };
}
function removeColumn(board, column) {
return { ...board, columns: board.columns.filter(({ id }) => id !== column.id) };
}
function changeColumn(board, column, newColumn) {
const changedColumns = replaceElementOfArray(board.columns)({
when: ({ id }) => id === column.id,
for: (value) => ({ ...value, ...newColumn }),
});
return { ...board, columns: changedColumns };
}
function addCard(board, inColumn, card, { on }: any = {}) {
const columnToAdd = board.columns.find(({ id }) => id === inColumn.id);
const cards = addInArrayAtPosition(columnToAdd.cards, card, on === 'top' ? 0 : columnToAdd.cards.length);
const columns = replaceElementOfArray(board.columns)({
when: ({ id }) => inColumn.id === id,
for: (value) => ({ ...value, cards }),
});
return { ...board, columns };
}
function removeCard(board, fromColumn, card) {
const columnToRemove = board.columns.find(({ id }) => id === fromColumn.id);
const filteredCards = columnToRemove.cards.filter(({ id }) => card.id !== id);
const columnWithoutCard = { ...columnToRemove, cards: filteredCards };
const filteredColumns = board.columns.map((column) => (fromColumn.id === column.id ? columnWithoutCard : column));
return { ...board, columns: filteredColumns };
}
function changeCard(board, cardId, newCard) {
const changedCards = (cards) =>
replaceElementOfArray(cards)({
when: ({ id }) => id === cardId,
for: (card) => ({ ...card, ...newCard }),
});
return { ...board, columns: board.columns.map((column) => ({ ...column, cards: changedCards(column.cards) })) };
}
export { moveColumn, moveCard, addColumn, removeColumn, changeColumn, addCard, removeCard, changeCard };