Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@devtron-labs/devtron-fe-common-lib",
"version": "1.20.6-pre-47",
"version": "1.20.6-pre-49",
"description": "Supporting common component library",
"type": "module",
"main": "dist/index.js",
Expand Down
10 changes: 9 additions & 1 deletion src/Common/SegmentedControl/Segment.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,15 @@ const wrapWithTooltip = (tooltipProps: SegmentType['tooltipProps']) => (children
</Tooltip>
)

const Segment = ({ segment, isSelected, name, onChange, fullWidth, size, disabled }: SegmentProps) => {
const Segment = <T extends string | number>({
segment,
isSelected,
name,
onChange,
fullWidth,
size,
disabled,
}: SegmentProps<T>) => {
const inputId = useMemo(getUniqueId, [])

const { value, icon, isError, label, tooltipProps, ariaLabel } = segment
Expand Down
8 changes: 4 additions & 4 deletions src/Common/SegmentedControl/SegmentedControl.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,20 @@ import { SegmentedControlProps, SegmentType } from './types'

import './segmentedControl.scss'

const SegmentedControl = ({
const SegmentedControl = <T extends string | number>({
segments,
onChange,
name,
size = ComponentSizeType.medium,
value: controlledValue,
fullWidth = false,
disabled,
}: SegmentedControlProps) => {
}: SegmentedControlProps<T>) => {
const isUnControlledComponent = controlledValue === undefined
const [selectedSegmentValue, setSelectedSegmentValue] = useState<SegmentType['value'] | null>(segments[0].value)
const [selectedSegmentValue, setSelectedSegmentValue] = useState<SegmentType<T>['value'] | null>(segments[0].value)
const segmentValue = isUnControlledComponent ? selectedSegmentValue : controlledValue

const handleSegmentChange = (updatedSegment: SegmentType) => {
const handleSegmentChange = (updatedSegment: SegmentType<T>) => {
if (isUnControlledComponent) {
setSelectedSegmentValue(updatedSegment.value)
}
Expand Down
84 changes: 44 additions & 40 deletions src/Common/SegmentedControl/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ type SegmentTooltipProps = Omit<
'alwaysShowTippyOnHover' | 'showOnTruncate' | 'shortcutKeyCombo' | 'placement'
>

export type SegmentType = Pick<SelectPickerOptionType, 'value'> & {
export type SegmentType<T = string | number> = {
/**
* If true, the segment will be in error state with error icon
*/
Expand All @@ -32,44 +32,48 @@ export type SegmentType = Pick<SelectPickerOptionType, 'value'> & {
* If true, the segment will be in disabled state
*/
isDisabled?: boolean
/**
* Value for the segment
*/
value: T
} & (
| ({
/**
* Label for the segment
*
* Note: Either of label or icon is required
*/
label: SelectPickerOptionType['label']
/**
* Icon for the segment
*
* Note: Either of label or icon is required
*/
icon?: IconsProps['name']
/**
* Tooltip props for the segment
*
* Note: Required if only icon is provided
*/
tooltipProps?: SegmentTooltipProps
ariaLabel?: never
} & Pick<SelectPickerOptionType, 'label'>)
| {
label?: never
tooltipProps: SegmentTooltipProps
icon: IconsProps['name']
/**
* Aria label for the segment
*/
ariaLabel: string
}
)
| ({
/**
* Label for the segment
*
* Note: Either of label or icon is required
*/
label: SelectPickerOptionType['label']
/**
* Icon for the segment
*
* Note: Either of label or icon is required
*/
icon?: IconsProps['name']
/**
* Tooltip props for the segment
*
* Note: Required if only icon is provided
*/
tooltipProps?: SegmentTooltipProps
ariaLabel?: never
} & Pick<SelectPickerOptionType, 'label'>)
| {
label?: never
tooltipProps: SegmentTooltipProps
icon: IconsProps['name']
/**
* Aria label for the segment
*/
ariaLabel: string
}
)

export type SegmentedControlProps = {
export type SegmentedControlProps<T = string | number> = {
/**
* List of segments to be displayed
*/
segments: SegmentType[]
segments: SegmentType<T>[]
/**
* Please make sure this is unique
*/
Expand All @@ -83,19 +87,19 @@ export type SegmentedControlProps = {
/**
* On change handler for the component
*/
onChange?: (selectedSegment: SegmentType) => void
onChange?: (selectedSegment: SegmentType<T>) => void
}
| {
/**
* If defined, the component is controlled and onChange needs to be handled by the parent
*/
value: SegmentType['value']
onChange: (selectedSegment: SegmentType) => void
value: SegmentType<T>['value']
onChange: (selectedSegment: SegmentType<T>) => void
}
)

export interface SegmentProps
extends Required<Pick<SegmentedControlProps, 'name' | 'onChange' | 'fullWidth' | 'size' | 'disabled'>> {
export interface SegmentProps<T>
extends Required<Pick<SegmentedControlProps<T>, 'name' | 'onChange' | 'fullWidth' | 'size' | 'disabled'>> {
isSelected: boolean
segment: SegmentType
segment: SegmentType<T>
}
1 change: 0 additions & 1 deletion src/Common/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ export * from './Policy.Types'
export { default as PopupMenu } from './PopupMenu'
export * from './Progressing'
export { default as RadioGroup } from './RadioGroup'
export { default as StyledRadioGroup } from './RadioGroup/RadioGroup'
export { default as RadioGroupItem } from './RadioGroupItem'
export { default as Reload } from './Reload'
export * from './RJSF'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,16 @@
* limitations under the License.
*/

import { ChangeEvent, useEffect, useState } from 'react'
import { useEffect, useState } from 'react'
import { Link, NavLink } from 'react-router-dom'
import Tippy from '@tippyjs/react'

import { ReactComponent as ICClose } from '@Icons/ic-close.svg'
import { ReactComponent as ICError } from '@Icons/ic-error.svg'
import { ReactComponent as ICInfoOutlined } from '@Icons/ic-info-outlined.svg'
import { StyledRadioGroup } from '@Common/index'
import { SegmentedControl } from '@Common/index'
import { SegmentType } from '@Common/SegmentedControl/types'
import { ComponentSizeType } from '@Shared/constants'

import { CollapsibleList, CollapsibleListConfig } from '../CollapsibleList'
import { diffStateIconMap, diffStateTooltipTextMap } from './DeploymentConfigDiff.constants'
Expand Down Expand Up @@ -87,11 +89,8 @@ export const DeploymentConfigDiffNavigation = ({
}

/** Handles tab click. */
const onTabClick = (e: ChangeEvent<HTMLInputElement>) => {
const { value } = e.target
if (tabConfig?.activeTab !== value) {
tabConfig?.onClick?.(value)
}
const onTabClick = (segment: SegmentType<string>) => {
tabConfig?.onClick?.(segment.value)
}

// RENDERERS
Expand All @@ -113,19 +112,13 @@ export const DeploymentConfigDiffNavigation = ({

return (
<div className="p-12">
<StyledRadioGroup
name="deployment-config-diff-tab-list"
initialTab={activeTab}
<SegmentedControl
segments={tabs.map((tab) => ({ label: tab, value: tab }))}
value={activeTab}
onChange={onTabClick}
disabled={isLoading}
className="gui-yaml-switch deployment-config-diff__tab-list"
>
{tabs.map((tab) => (
<StyledRadioGroup.Radio key={tab} value={tab} className="fs-12 lh-20 cn-7 fw-6">
{tab}
</StyledRadioGroup.Radio>
))}
</StyledRadioGroup>
name="deployment-config-diff-tab-list"
size={ComponentSizeType.xs}
/>
</div>
)
}
Expand Down
2 changes: 1 addition & 1 deletion src/Shared/Components/InfoBlock/InfoBlock.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ const InfoBlock = ({
if (layout === 'row') {
return (
<div className={`${baseContainerClass} flexbox dc__gap-16`}>
<div className="flexbox dc__gap-8 flex-grow-1">
<div className="flex left dc__gap-8 flex-grow-1">
{renderIcon()}
{renderContent()}
</div>
Expand Down