1
0
Fork 0
mirror of https://github.com/plankanban/planka.git synced 2025-08-09 07:25:24 +02:00

fix: Separated cardIds, filteredCardIds, IsFiltered selectors

This commit is contained in:
RAR 2023-01-13 02:33:21 +01:00
parent fcb4e22f7f
commit 4f8f4327fd
6 changed files with 68 additions and 27 deletions

View file

@ -16,7 +16,7 @@ import styles from './List.module.scss';
const List = React.memo(
// eslint-disable-next-line prettier/prettier
({ id, index, name, isPersisted, isCollapsed, isFiltered, cardIds, cardIdsFull, canEdit, onUpdate, onDelete, onCardCreate }) => {
({ id, index, name, isPersisted, isCollapsed, cardIds, isFiltered, filteredCardIds, canEdit, onUpdate, onDelete, onCardCreate }) => {
const [t] = useTranslation();
const [isAddCardOpened, setIsAddCardOpened] = useState(false);
@ -66,7 +66,7 @@ const List = React.memo(
if (isAddCardOpened) {
listWrapper.current.scrollTop = listWrapper.current.scrollHeight;
}
}, [cardIds, isAddCardOpened]);
}, [filteredCardIds, isAddCardOpened]);
const cardsNode = (
<Droppable
@ -78,7 +78,7 @@ const List = React.memo(
// eslint-disable-next-line react/jsx-props-no-spreading
<div {...droppableProps} ref={innerRef}>
<div className={styles.cards}>
{cardIds.map((cardId, cardIndex) => (
{filteredCardIds.map((cardId, cardIndex) => (
<CardContainer key={cardId} id={cardId} index={cardIndex} />
))}
{placeholder}
@ -99,9 +99,9 @@ const List = React.memo(
return (
[
isFiltered
? `${cardIds.length} ${t('common.of')} ${cardIdsFull.length} `
: `${cardIdsFull.length} `,
] + [cardIdsFull.length !== 1 ? t('common.cards') : t('common.card')]
? `${filteredCardIds.length} ${t('common.of')} ${cardIds.length} `
: `${cardIds.length} `,
] + [cardIds.length !== 1 ? t('common.cards') : t('common.card')]
);
};
@ -210,7 +210,7 @@ const List = React.memo(
>
<PlusMathIcon className={styles.addCardButtonIcon} />
<span className={styles.addCardButtonText}>
{cardIds.length > 0 ? t('action.addAnotherCard') : t('action.addCard')}
{filteredCardIds.length > 0 ? t('action.addAnotherCard') : t('action.addCard')}
</span>
</button>
)}
@ -228,9 +228,9 @@ List.propTypes = {
name: PropTypes.string.isRequired,
isCollapsed: PropTypes.bool.isRequired,
isPersisted: PropTypes.bool.isRequired,
isFiltered: PropTypes.bool.isRequired,
cardIds: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types
cardIdsFull: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types
isFiltered: PropTypes.bool.isRequired,
filteredCardIds: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types
canEdit: PropTypes.bool.isRequired,
onUpdate: PropTypes.func.isRequired,
onDelete: PropTypes.func.isRequired,

View file

@ -8,9 +8,7 @@ import BoardActions from '../components/BoardActions';
const mapStateToProps = (state) => {
const listIds = selectors.selectListIdsForCurrentBoard(state);
const listCardsCount = listIds.map(
(list) => selectors.selectCardIdsByListId(state, list).cardIdsFull.length,
);
const listCardsCount = listIds.map((list) => selectors.selectCardIdsByListId(state, list).length);
const cardCount = listCardsCount.reduce((sum, count) => sum + count, 0);
const allUsers = selectors.selectUsers(state);
const isCurrentUserManager = selectors.selectIsCurrentUserManagerForCurrentProject(state);

View file

@ -9,10 +9,14 @@ import List from '../components/List';
const makeMapStateToProps = () => {
const selectListById = selectors.makeSelectListById();
const selectCardIdsByListId = selectors.makeSelectCardIdsByListId();
const selectIsFilteredByListId = selectors.makeSelectIsFilteredByListId();
const selectFilteredCardIdsByListId = selectors.makeSelectFilteredCardIdsByListId();
return (state, { id, index }) => {
const { name, isPersisted, isCollapsed } = selectListById(state, id);
const { cardIds, cardIdsFull, isFiltered } = selectCardIdsByListId(state, id);
const cardIds = selectCardIdsByListId(state, id);
const isFiltered = selectIsFilteredByListId(state, id);
const filteredCardIds = selectFilteredCardIdsByListId(state, id);
const currentUserMembership = selectors.selectCurrentUserMembershipForCurrentBoard(state);
const isCurrentUserEditor =
@ -24,9 +28,9 @@ const makeMapStateToProps = () => {
name,
isCollapsed,
isPersisted,
isFiltered,
cardIds,
cardIdsFull,
isFiltered,
filteredCardIds,
canEdit: isCurrentUserEditor,
};
};

View file

@ -85,18 +85,25 @@ export default class extends BaseModel {
return this.cards.orderBy('position');
}
getOrderedCardsModelArray() {
return this.getOrderedCardsQuerySet().toModelArray();
}
getIsFiltered() {
const filterUserIds = this.board.filterUsers.toRefArray().map((user) => user.id);
const filterLabelIds = this.board.filterLabels.toRefArray().map((label) => label.id);
return filterUserIds.length > 0 || filterLabelIds.length > 0;
}
getFilteredOrderedCardsModelArray() {
let cardModels = this.getOrderedCardsQuerySet().toModelArray();
const cardModelsFull = cardModels;
const filterUserIds = this.board.filterUsers.toRefArray().map((user) => user.id);
const filterLabelIds = this.board.filterLabels.toRefArray().map((label) => label.id);
let isFiltered = false;
if (filterUserIds.length > 0) {
cardModels = cardModels.filter((cardModel) => {
const users = cardModel.users.toRefArray();
isFiltered = true;
return users.some((user) => filterUserIds.includes(user.id));
});
}
@ -104,12 +111,11 @@ export default class extends BaseModel {
if (filterLabelIds.length > 0) {
cardModels = cardModels.filter((cardModel) => {
const labels = cardModel.labels.toRefArray();
isFiltered = true;
return labels.some((label) => filterLabelIds.includes(label.id));
});
}
return { cardModels, cardModelsFull, isFiltered };
return cardModels;
}
deleteRelated() {

View file

@ -94,7 +94,7 @@ export const selectNextCardPosition = createSelector(
}
// eslint-disable-next-line prettier/prettier
return nextPosition(listModel.getFilteredOrderedCardsModelArray().cardModels, index, excludedId);
return nextPosition(listModel.getFilteredOrderedCardsModelArray(), index, excludedId);
},
);

View file

@ -34,20 +34,53 @@ export const makeSelectCardIdsByListId = () =>
return listModel;
}
const cardsModelArray = listModel.getFilteredOrderedCardsModelArray();
return {
cardIds: cardsModelArray.cardModels.map((cardModel) => cardModel.id),
cardIdsFull: cardsModelArray.cardModelsFull.map((cardModel) => cardModel.id),
isFiltered: cardsModelArray.isFiltered,
};
return listModel.getOrderedCardsModelArray().map((cardModel) => cardModel.id);
},
);
export const selectCardIdsByListId = makeSelectCardIdsByListId();
export const makeSelectIsFilteredByListId = () =>
createSelector(
orm,
(_, id) => id,
({ List }, id) => {
const listModel = List.withId(id);
if (!listModel) {
return listModel;
}
return listModel.getIsFiltered();
},
);
export const selectIsFilteredByListId = makeSelectIsFilteredByListId();
export const makeSelectFilteredCardIdsByListId = () =>
createSelector(
orm,
(_, id) => id,
({ List }, id) => {
const listModel = List.withId(id);
if (!listModel) {
return listModel;
}
return listModel.getFilteredOrderedCardsModelArray().map((cardModel) => cardModel.id);
},
);
export const selectFilteredCardIdsByListId = makeSelectFilteredCardIdsByListId();
export default {
makeSelectListById,
selectListById,
makeSelectCardIdsByListId,
selectCardIdsByListId,
makeSelectIsFilteredByListId,
selectIsFilteredByListId,
makeSelectFilteredCardIdsByListId,
selectFilteredCardIdsByListId,
};