Skip to content

Commit 398bd39

Browse files
authored
Merge pull request #731 from devtron-labs/feat/app-clone-flow
feat: app clone flow
2 parents 224c682 + 530c0de commit 398bd39

File tree

11 files changed

+170
-4
lines changed

11 files changed

+170
-4
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@devtron-labs/devtron-fe-common-lib",
3-
"version": "1.13.0-pre-6",
3+
"version": "1.13.0-pre-7",
44
"description": "Supporting common component library",
55
"type": "module",
66
"main": "dist/index.js",
Lines changed: 23 additions & 0 deletions
Loading
Lines changed: 23 additions & 0 deletions
Loading
Lines changed: 10 additions & 0 deletions
Loading

src/Assets/Img/empty-create.png

49.4 KB
Loading
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/*
2+
* Copyright (c) 2024. Devtron Inc.
3+
*/
4+
5+
import { useMemo } from 'react'
6+
7+
import emptyList from '@Images/empty-create.png'
8+
import ErrorScreenManager from '@Common/ErrorScreenManager'
9+
import { GenericEmptyState, GenericFilterEmptyState } from '@Common/index'
10+
11+
import GenericInfoCard from './GenericInfoCard.component'
12+
import { GenericInfoListSkeleton } from './GenericInfoListSkeleton'
13+
import { GenericInfoCardListingProps } from './types'
14+
15+
export const GenericInfoCardListing = ({
16+
isLoading,
17+
error,
18+
list,
19+
searchKey,
20+
reloadList,
21+
borderVariant,
22+
handleClearFilters,
23+
emptyStateConfig,
24+
}: GenericInfoCardListingProps) => {
25+
const filteredList = useMemo(() => {
26+
const sanitizedList = list || []
27+
if (!searchKey || error) {
28+
return sanitizedList
29+
}
30+
31+
const loweredSearchKey = searchKey.toLowerCase()
32+
return sanitizedList.filter(({ title }) => title.toLowerCase().includes(loweredSearchKey))
33+
}, [searchKey, list, error])
34+
35+
if (isLoading) {
36+
return <GenericInfoListSkeleton borderVariant={borderVariant} />
37+
}
38+
39+
if (error) {
40+
return <ErrorScreenManager code={error?.code as number} reload={reloadList} />
41+
}
42+
43+
if (filteredList.length === 0) {
44+
if (searchKey) {
45+
return <GenericFilterEmptyState handleClearFilters={handleClearFilters} />
46+
}
47+
48+
return (
49+
<GenericEmptyState
50+
image={emptyStateConfig.image ?? emptyList}
51+
renderButton={emptyStateConfig.renderButton}
52+
isButtonAvailable={!!emptyStateConfig.renderButton}
53+
{...emptyStateConfig}
54+
/>
55+
)
56+
}
57+
58+
return (
59+
<>
60+
{filteredList.map(({ id, title, description, author, Icon, onClick, linkProps }) => (
61+
<GenericInfoCard
62+
key={id}
63+
title={title}
64+
description={description}
65+
author={author}
66+
borderVariant={borderVariant}
67+
Icon={Icon}
68+
{...(onClick ? { onClick } : { linkProps })}
69+
/>
70+
))}
71+
</>
72+
)
73+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import GenericInfoCard from './GenericInfoCard.component'
2+
import { GenericInfoListSkeletonProps } from './types'
3+
4+
export const GenericInfoListSkeleton = ({ borderVariant }: GenericInfoListSkeletonProps) => (
5+
<>
6+
<GenericInfoCard isLoading borderVariant={borderVariant} />
7+
<GenericInfoCard isLoading borderVariant={borderVariant} />
8+
<GenericInfoCard isLoading borderVariant={borderVariant} />
9+
</>
10+
)

src/Shared/Components/GenericInfoCard/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@
1515
*/
1616

1717
export { default as GenericInfoCard } from './GenericInfoCard.component'
18-
export { GenericInfoCardBorderVariant, type GenericInfoCardProps } from './types'
18+
export * from './GenericInfoCardListing'
19+
export { GenericInfoListSkeleton } from './GenericInfoListSkeleton'
20+
export { GenericInfoCardBorderVariant, type GenericInfoCardListingProps, type GenericInfoCardProps } from './types'

src/Shared/Components/GenericInfoCard/types.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
import { MouseEventHandler, ReactElement } from 'react'
1818
import { LinkProps } from 'react-router-dom'
1919

20+
import { GenericFilterEmptyStateProps } from '@Common/EmptyState/types'
21+
import { GenericEmptyStateType } from '@Common/Types'
22+
23+
import { APIResponseHandlerProps } from '../APIResponseHandler'
24+
2025
type BaseGenericInfoCardProps = {
2126
title: string
2227
description: string
@@ -46,3 +51,17 @@ export type GenericInfoCardProps = { borderVariant: GenericInfoCardBorderVariant
4651
isLoading?: boolean
4752
} & BaseGenericInfoCardProps)
4853
)
54+
55+
export interface GenericInfoCardListingProps
56+
extends Pick<GenericInfoCardProps, 'borderVariant'>,
57+
Pick<GenericFilterEmptyStateProps, 'handleClearFilters'> {
58+
list: (Pick<GenericInfoCardProps, 'Icon' | 'author' | 'description' | 'linkProps' | 'onClick' | 'title'> &
59+
Record<'id', string>)[]
60+
emptyStateConfig: Pick<GenericEmptyStateType, 'title' | 'subTitle' | 'image' | 'renderButton' | 'renderButton'>
61+
searchKey?: string
62+
reloadList: () => void
63+
error?: APIResponseHandlerProps['error']
64+
isLoading?: boolean
65+
}
66+
67+
export interface GenericInfoListSkeletonProps extends Partial<Pick<GenericInfoCardProps, 'borderVariant'>> {}

0 commit comments

Comments
 (0)