mirror of
https://github.com/Unleash/unleash.git
synced 2025-04-24 01:18:01 +02:00
feat: archive is now part of project feature list (#8587)

This commit is contained in:
parent
916e890c93
commit
5f67dcefcd
@ -11,7 +11,7 @@ interface IArchivedFeatureDeleteConfirmProps {
|
|||||||
deletedFeatures: string[];
|
deletedFeatures: string[];
|
||||||
projectId: string;
|
projectId: string;
|
||||||
open: boolean;
|
open: boolean;
|
||||||
setOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
setOpen: (open: boolean) => void;
|
||||||
refetch: () => void;
|
refetch: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { Alert, styled } from '@mui/material';
|
import { Alert, styled } from '@mui/material';
|
||||||
import type React from 'react';
|
|
||||||
import { Dialogue } from 'component/common/Dialogue/Dialogue';
|
import { Dialogue } from 'component/common/Dialogue/Dialogue';
|
||||||
import { formatUnknownError } from 'utils/formatUnknownError';
|
import { formatUnknownError } from 'utils/formatUnknownError';
|
||||||
import useToast from 'hooks/useToast';
|
import useToast from 'hooks/useToast';
|
||||||
@ -11,7 +10,7 @@ interface IArchivedFeatureReviveConfirmProps {
|
|||||||
revivedFeatures: string[];
|
revivedFeatures: string[];
|
||||||
projectId: string;
|
projectId: string;
|
||||||
open: boolean;
|
open: boolean;
|
||||||
setOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
setOpen: (open: boolean) => void;
|
||||||
refetch: () => void;
|
refetch: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,8 @@ import { ProjectOnboarding } from '../../../onboarding/flow/ProjectOnboarding';
|
|||||||
import { useLocalStorageState } from 'hooks/useLocalStorageState';
|
import { useLocalStorageState } from 'hooks/useLocalStorageState';
|
||||||
import { ProjectOnboarded } from 'component/onboarding/flow/ProjectOnboarded';
|
import { ProjectOnboarded } from 'component/onboarding/flow/ProjectOnboarded';
|
||||||
import { usePlausibleTracker } from 'hooks/usePlausibleTracker';
|
import { usePlausibleTracker } from 'hooks/usePlausibleTracker';
|
||||||
|
import { ArchivedFeatureActionCell } from '../../../archive/ArchiveTable/ArchivedFeatureActionCell/ArchivedFeatureActionCell';
|
||||||
|
import { ArchiveBatchActions } from '../../../archive/ArchiveTable/ArchiveBatchActions';
|
||||||
|
|
||||||
interface IPaginatedProjectFeatureTogglesProps {
|
interface IPaginatedProjectFeatureTogglesProps {
|
||||||
environments: string[];
|
environments: string[];
|
||||||
@ -115,6 +117,8 @@ export const ProjectFeatureToggles = ({
|
|||||||
setFeatureArchiveState,
|
setFeatureArchiveState,
|
||||||
setFeatureStaleDialogState,
|
setFeatureStaleDialogState,
|
||||||
setShowMarkCompletedDialogue,
|
setShowMarkCompletedDialogue,
|
||||||
|
setShowFeatureReviveDialogue,
|
||||||
|
setShowFeatureDeleteDialogue,
|
||||||
} = useRowActions(refetch, projectId);
|
} = useRowActions(refetch, projectId);
|
||||||
|
|
||||||
const isPlaceholder = Boolean(initialLoad || (loading && total));
|
const isPlaceholder = Boolean(initialLoad || (loading && total));
|
||||||
@ -321,7 +325,24 @@ export const ProjectFeatureToggles = ({
|
|||||||
columnHelper.display({
|
columnHelper.display({
|
||||||
id: 'actions',
|
id: 'actions',
|
||||||
header: '',
|
header: '',
|
||||||
cell: ({ row }) => (
|
cell: ({ row }) =>
|
||||||
|
tableState.archived ? (
|
||||||
|
<ArchivedFeatureActionCell
|
||||||
|
project={projectId}
|
||||||
|
onRevive={() => {
|
||||||
|
setShowFeatureReviveDialogue({
|
||||||
|
featureId: row.id,
|
||||||
|
open: true,
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
onDelete={() => {
|
||||||
|
setShowFeatureDeleteDialogue({
|
||||||
|
featureId: row.id,
|
||||||
|
open: true,
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
<ActionsCell
|
<ActionsCell
|
||||||
row={row}
|
row={row}
|
||||||
projectId={projectId}
|
projectId={projectId}
|
||||||
@ -329,6 +350,7 @@ export const ProjectFeatureToggles = ({
|
|||||||
onOpenStaleDialog={setFeatureStaleDialogState}
|
onOpenStaleDialog={setFeatureStaleDialogState}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
|
|
||||||
enableSorting: false,
|
enableSorting: false,
|
||||||
enableHiding: false,
|
enableHiding: false,
|
||||||
meta: {
|
meta: {
|
||||||
@ -585,6 +607,16 @@ export const ProjectFeatureToggles = ({
|
|||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
<BatchSelectionActionsBar count={selectedData.length}>
|
<BatchSelectionActionsBar count={selectedData.length}>
|
||||||
|
{tableState.archived ? (
|
||||||
|
<ArchiveBatchActions
|
||||||
|
selectedIds={Object.keys(rowSelection)}
|
||||||
|
projectId={projectId}
|
||||||
|
onConfirm={() => {
|
||||||
|
refetch();
|
||||||
|
table.resetRowSelection();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
<ProjectFeaturesBatchActions
|
<ProjectFeaturesBatchActions
|
||||||
selectedIds={Object.keys(rowSelection)}
|
selectedIds={Object.keys(rowSelection)}
|
||||||
data={selectedData}
|
data={selectedData}
|
||||||
@ -592,6 +624,7 @@ export const ProjectFeatureToggles = ({
|
|||||||
onResetSelection={table.resetRowSelection}
|
onResetSelection={table.resetRowSelection}
|
||||||
onChange={refetch}
|
onChange={refetch}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
</BatchSelectionActionsBar>
|
</BatchSelectionActionsBar>
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
|
@ -95,6 +95,14 @@ export const ProjectOverviewFilters: VFC<IProjectOverviewFilters> = ({
|
|||||||
singularOperators: ['IS', 'IS_NOT'],
|
singularOperators: ['IS', 'IS_NOT'],
|
||||||
pluralOperators: ['IS_ANY_OF', 'IS_NONE_OF'],
|
pluralOperators: ['IS_ANY_OF', 'IS_NONE_OF'],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Show only archived',
|
||||||
|
icon: 'inventory',
|
||||||
|
options: [{ label: 'True', value: 'true' }],
|
||||||
|
filterKey: 'archived',
|
||||||
|
singularOperators: ['IS'],
|
||||||
|
pluralOperators: ['IS_ANY_OF'],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
setAvailableFilters(availableFilters);
|
setAvailableFilters(availableFilters);
|
||||||
|
@ -2,6 +2,8 @@ import { useState } from 'react';
|
|||||||
import { FeatureArchiveDialog } from 'component/common/FeatureArchiveDialog/FeatureArchiveDialog';
|
import { FeatureArchiveDialog } from 'component/common/FeatureArchiveDialog/FeatureArchiveDialog';
|
||||||
import { FeatureStaleDialog } from 'component/common/FeatureStaleDialog/FeatureStaleDialog';
|
import { FeatureStaleDialog } from 'component/common/FeatureStaleDialog/FeatureStaleDialog';
|
||||||
import { MarkCompletedDialogue } from 'component/feature/FeatureView/FeatureOverview/FeatureLifecycle/MarkCompletedDialogue';
|
import { MarkCompletedDialogue } from 'component/feature/FeatureView/FeatureOverview/FeatureLifecycle/MarkCompletedDialogue';
|
||||||
|
import { ArchivedFeatureDeleteConfirm } from '../../../../archive/ArchiveTable/ArchivedFeatureActionCell/ArchivedFeatureDeleteConfirm/ArchivedFeatureDeleteConfirm';
|
||||||
|
import { ArchivedFeatureReviveConfirm } from '../../../../archive/ArchiveTable/ArchivedFeatureActionCell/ArchivedFeatureReviveConfirm/ArchivedFeatureReviveConfirm';
|
||||||
|
|
||||||
export const useRowActions = (onChange: () => void, projectId: string) => {
|
export const useRowActions = (onChange: () => void, projectId: string) => {
|
||||||
const [featureArchiveState, setFeatureArchiveState] = useState<
|
const [featureArchiveState, setFeatureArchiveState] = useState<
|
||||||
@ -20,6 +22,21 @@ export const useRowActions = (onChange: () => void, projectId: string) => {
|
|||||||
featureId: 'default',
|
featureId: 'default',
|
||||||
open: false,
|
open: false,
|
||||||
});
|
});
|
||||||
|
const [showFeatureReviveDialogue, setShowFeatureReviveDialogue] = useState<{
|
||||||
|
featureId: string;
|
||||||
|
open: boolean;
|
||||||
|
}>({
|
||||||
|
featureId: 'default',
|
||||||
|
open: false,
|
||||||
|
});
|
||||||
|
const [showFeatureDeleteDialogue, setShowFeatureDeleteDialogue] = useState<{
|
||||||
|
featureId: string;
|
||||||
|
open: boolean;
|
||||||
|
}>({
|
||||||
|
featureId: 'default',
|
||||||
|
open: false,
|
||||||
|
});
|
||||||
|
|
||||||
const rowActionsDialogs = (
|
const rowActionsDialogs = (
|
||||||
<>
|
<>
|
||||||
<FeatureStaleDialog
|
<FeatureStaleDialog
|
||||||
@ -54,6 +71,36 @@ export const useRowActions = (onChange: () => void, projectId: string) => {
|
|||||||
featureId={showMarkCompletedDialogue.featureId}
|
featureId={showMarkCompletedDialogue.featureId}
|
||||||
onComplete={onChange}
|
onComplete={onChange}
|
||||||
/>
|
/>
|
||||||
|
<ArchivedFeatureDeleteConfirm
|
||||||
|
deletedFeatures={[showFeatureDeleteDialogue.featureId]}
|
||||||
|
projectId={projectId}
|
||||||
|
open={showFeatureDeleteDialogue.open}
|
||||||
|
setOpen={(open) => {
|
||||||
|
setShowFeatureDeleteDialogue((prev) => ({
|
||||||
|
...prev,
|
||||||
|
open,
|
||||||
|
}));
|
||||||
|
}}
|
||||||
|
refetch={onChange}
|
||||||
|
/>
|
||||||
|
<ArchivedFeatureReviveConfirm
|
||||||
|
revivedFeatures={[showFeatureReviveDialogue.featureId]}
|
||||||
|
projectId={projectId}
|
||||||
|
open={showFeatureReviveDialogue.open}
|
||||||
|
setOpen={(open) => {
|
||||||
|
setShowFeatureReviveDialogue((prev) => ({
|
||||||
|
...prev,
|
||||||
|
open,
|
||||||
|
}));
|
||||||
|
}}
|
||||||
|
refetch={() => {
|
||||||
|
setShowFeatureReviveDialogue((prev) => ({
|
||||||
|
...prev,
|
||||||
|
open: false,
|
||||||
|
}));
|
||||||
|
onChange();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -62,5 +109,7 @@ export const useRowActions = (onChange: () => void, projectId: string) => {
|
|||||||
setFeatureArchiveState,
|
setFeatureArchiveState,
|
||||||
setFeatureStaleDialogState,
|
setFeatureStaleDialogState,
|
||||||
setShowMarkCompletedDialogue,
|
setShowMarkCompletedDialogue,
|
||||||
|
setShowFeatureReviveDialogue,
|
||||||
|
setShowFeatureDeleteDialogue,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user