Skip to content

Commit aed2649

Browse files
authored
Merge pull request #148 from devtron-labs/feat/rollout-status
feat: add useStateFilters hook, number and string comparators
2 parents 38c3967 + 8b72fb9 commit aed2649

File tree

9 files changed

+95
-12
lines changed

9 files changed

+95
-12
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": "0.0.82-beta-2",
3+
"version": "0.0.82-beta-3",
44
"description": "Supporting common component library",
55
"type": "module",
66
"main": "dist/index.js",

src/Common/EmptyState/GenericEmptyState.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,8 @@ const GenericEmptyState = ({
6767
} ${contentClassName}`}
6868
>
6969
<div className="flex column dc__gap-8">
70-
<h4 className="title fw-6 cn-9 mt-0 mb-0 lh-24">{title}</h4>
71-
{subTitle && (
72-
<p className={`subtitle ${isRowLayout ? 'subtitle--text-start' : ''}`}>
73-
{subTitle}
74-
</p>
75-
)}
70+
<h4 className="title fw-6 cn-9 mt-0 mb-0 lh-24 dc__align-center">{title}</h4>
71+
{subTitle && <p className={`subtitle ${isRowLayout ? 'subtitle--text-start' : ''}`}>{subTitle}</p>}
7672
</div>
7773
{isButtonAvailable && renderButton()}
7874
{children}

src/Common/Helper.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,3 +784,5 @@ export function deepEqual(configA: any, configB: any): boolean {
784784
return true
785785
}
786786
}
787+
788+
export const prefixZeroIfSingleDigit = (value: number = 0) => (value > 0 && value < 10 ? `0${value}` : value)

src/Common/Hooks/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export { useClickOutside } from './UseClickOutside/UseClickOutside'
33
export { useWindowSize } from './UseWindowSize/UseWindowSize'
44
export * from './useUrlFilters'
55
export * from './UseRegisterShortcut'
6+
export * from './useStateFilters'
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { default as useStateFilters } from './useStateFilters'
2+
export type { UseStateFiltersProps, UseStateFiltersReturnType } from './types'
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { UseUrlFiltersProps, UseUrlFiltersReturnType } from '../useUrlFilters'
2+
3+
export interface UseStateFiltersProps<T> extends Pick<UseUrlFiltersProps<T, never>, 'initialSortKey'> {}
4+
5+
export interface UseStateFiltersReturnType<T>
6+
extends Pick<UseUrlFiltersReturnType<T>, 'sortBy' | 'sortOrder' | 'handleSorting' | 'clearFilters'> {}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { useState } from 'react'
2+
import { SortingOrder } from '../../Constants'
3+
import { UseStateFiltersProps, UseStateFiltersReturnType } from './types'
4+
5+
/**
6+
* Generic hook for implementing state based pagination, search, sorting.
7+
* Sister method of [useUrlFilters](https://github.com/devtron-labs/devtron-fe-common-lib/blob/main/src/Common/Hooks/useUrlFilters/useUrlFilters.ts)
8+
*
9+
* The exposed handlers can be consumed directly without the need for explicit state management
10+
*
11+
* @example Usage with custom type for sort keys and initial sort key:
12+
* ```tsx
13+
* const { sortBy, sortOrder } = useUrlFilters<'email' | 'name'>({ initialSortKey: 'email' })
14+
* ```
15+
*
16+
* To be extended to be used with pagination and search as and when required
17+
*/
18+
const useStateFilters = <T = string,>({
19+
initialSortKey,
20+
}: UseStateFiltersProps<T> = {}): UseStateFiltersReturnType<T> => {
21+
const [sortingConfig, setSortingConfig] = useState({
22+
sortOrder: SortingOrder.ASC,
23+
sortBy: initialSortKey,
24+
})
25+
26+
const { sortBy, sortOrder } = sortingConfig
27+
28+
const handleSorting = (_sortBy: T) => {
29+
let order: SortingOrder
30+
31+
if (_sortBy === sortBy && sortOrder === SortingOrder.ASC) {
32+
order = SortingOrder.DESC
33+
} else {
34+
order = SortingOrder.ASC
35+
}
36+
37+
setSortingConfig(() => ({
38+
...sortingConfig,
39+
sortBy: _sortBy,
40+
sortOrder: order,
41+
}))
42+
}
43+
44+
const clearFilters = () => {
45+
setSortingConfig({
46+
sortOrder: SortingOrder.ASC,
47+
sortBy: initialSortKey,
48+
})
49+
}
50+
51+
return {
52+
...sortingConfig,
53+
handleSorting,
54+
clearFilters,
55+
}
56+
}
57+
58+
export default useStateFilters

src/Shared/Helpers.tsx

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { MaterialInfo } from '../Common'
1+
import { MaterialInfo, SortingOrder } from '../Common'
22
import { GitTriggers, WebhookEventNameType } from './types'
33
import { ReactComponent as ICPullRequest } from '../Assets/Icon/ic-pull-request.svg'
44
import { ReactComponent as ICTag } from '../Assets/Icon/ic-tag.svg'
@@ -70,8 +70,26 @@ export const getGitCommitInfo = (materialInfo: MaterialInfo): GitTriggers => ({
7070
CiConfigureSourceValue: '',
7171
})
7272

73-
export const caseInsensitiveStringComparator = (a: string, b: string): number =>
74-
a.toLowerCase().localeCompare(b.toLowerCase())
73+
export const stringComparatorBySortOrder = (
74+
a: string,
75+
b: string,
76+
sortOrder: SortingOrder = SortingOrder.ASC,
77+
isCaseSensitive: boolean = true,
78+
): number => {
79+
if (isCaseSensitive) {
80+
return sortOrder === SortingOrder.ASC ? a.localeCompare(b) : b.localeCompare(a)
81+
}
82+
83+
return sortOrder === SortingOrder.ASC
84+
? a.toLowerCase().localeCompare(b.toLowerCase())
85+
: b.toLowerCase().localeCompare(a.toLowerCase())
86+
}
87+
88+
export const numberComparatorBySortOrder = (
89+
a: number,
90+
b: number,
91+
sortOrder: SortingOrder = SortingOrder.ASC,
92+
): number => (sortOrder === SortingOrder.ASC ? a - b : b - a)
7593

7694
export const getWebhookEventIcon = (eventName: WebhookEventNameType) => {
7795
switch (eventName) {

0 commit comments

Comments
 (0)