1
0
Fork 0
mirror of https://github.com/plankanban/planka.git synced 2025-07-28 09:39:43 +02:00

feat: Version 2

Closes #627, closes #1047
This commit is contained in:
Maksim Eltyshev 2025-05-10 02:09:06 +02:00
parent ad7fb51cfa
commit 2ee1166747
1557 changed files with 76832 additions and 47042 deletions

View file

@ -0,0 +1,75 @@
/*!
* Copyright (c) 2024 PLANKA Software GmbH
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
*/
import React, { useCallback } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import selectors from '../../../selectors';
import entryActions from '../../../entry-actions';
import { isUserAdminOrProjectOwner } from '../../../utils/record-helpers';
import { ProjectGroups, ProjectTypes } from '../../../constants/Enums';
import { ProjectGroupIcons } from '../../../constants/Icons';
import Projects from './Projects';
const TITLE_BY_GROUP = {
[ProjectGroups.MY_OWN]: 'common.myOwn',
[ProjectGroups.TEAM]: 'common.team',
[ProjectGroups.SHARED_WITH_ME]: 'common.sharedWithMe',
[ProjectGroups.OTHERS]: 'common.others',
};
const DEFAULT_TYPE_BY_GROUP = {
[ProjectGroups.MY_OWN]: ProjectTypes.PRIVATE,
[ProjectGroups.TEAM]: ProjectTypes.SHARED,
};
const GroupedProjectsView = React.memo(() => {
const projectIdsByGroup = useSelector(selectors.selectFilteredProjctIdsByGroupForCurrentUser);
const canAdd = useSelector((state) => {
const user = selectors.selectCurrentUser(state);
return isUserAdminOrProjectOwner(user);
});
const dispatch = useDispatch();
const handleAdd = useCallback(
(defaultType) => {
dispatch(entryActions.openAddProjectModal(defaultType));
},
[dispatch],
);
return (
<>
{[ProjectGroups.MY_OWN, ProjectGroups.TEAM].map(
(group) =>
(projectIdsByGroup[group].length > 0 || canAdd) && (
<Projects
key={group}
ids={projectIdsByGroup[group]}
title={TITLE_BY_GROUP[group]}
titleIcon={ProjectGroupIcons[group]}
onAdd={() => handleAdd(DEFAULT_TYPE_BY_GROUP[group])}
/>
),
)}
{[ProjectGroups.SHARED_WITH_ME, ProjectGroups.OTHERS].map(
(group) =>
projectIdsByGroup[group].length > 0 && (
<Projects
withTypeIndicator
key={group}
ids={projectIdsByGroup[group]}
title={TITLE_BY_GROUP[group]}
titleIcon={ProjectGroupIcons[group]}
/>
),
)}
</>
);
});
export default GroupedProjectsView;