diff --git a/apps/gitness/src/pages-v2/project/labels/project-label-form-container.tsx b/apps/gitness/src/pages-v2/project/labels/project-label-form-container.tsx index d31eec6944..a8e51151d3 100644 --- a/apps/gitness/src/pages-v2/project/labels/project-label-form-container.tsx +++ b/apps/gitness/src/pages-v2/project/labels/project-label-form-container.tsx @@ -24,9 +24,7 @@ export const ProjectLabelFormContainer = () => { isLoading, error: createError } = useSaveSpaceLabelMutation( - { - space_ref: space_ref ?? '' - }, + { space_ref: space_ref ?? '' }, { onSuccess: () => { onFormCancel() @@ -45,18 +43,12 @@ export const ProjectLabelFormContainer = () => { const onSubmit = (data: CreateLabelFormFields) => { const { values, ...rest } = data - mutate({ - body: { - label: { - ...rest - }, - values - } - }) + mutate({ body: { label: { ...rest }, values } }) } return ( { } const { mutate: deleteSpaceLabel, isLoading: isDeletingSpaceLabel } = useDeleteSpaceLabelMutation( - { - space_ref: space_ref ?? '' - }, + { space_ref: space_ref ?? '' }, { onSuccess: (_data, variables) => { setOpenAlertDeleteDialog(false) @@ -48,22 +46,20 @@ export const ProjectLabelsList = () => { } const handleDeleteLabel = (identifier: string) => { - deleteSpaceLabel({ - key: identifier - }) + deleteSpaceLabel({ key: identifier }) } return ( <> navigate(routes.toRepoLabels({ spaceId, repoId })) + const { mutateAsync: restoreBranch } = useRestorePullReqSourceBranchMutation({}) const onRestoreBranch = () => { restoreBranch({ @@ -217,33 +220,30 @@ export default function PullRequestConversationPage() { }, [sourceBranch, pullReqMetadata?.merged, pullReqMetadata?.closed]) useEffect(() => { - if (branchError) { - if (pullReqMetadata?.merged || pullReqMetadata?.closed) { - setShowRestoreBranchButton(true) - } else { - setShowDeleteBranchButton(false) - createBranch({ - repo_ref: repoRef, - body: { - name: pullReqMetadata?.source_branch || '', - target: pullReqMetadata?.source_sha, - bypass_rules: true, - dry_run_rules: true - } - }).then(res => { - if (res?.body?.rule_violations) { - const { checkIfBypassAllowed } = extractInfoFromRuleViolationArr(res.body?.rule_violations) - if (checkIfBypassAllowed) { - setShowRestoreBranchButton(true) - } else { - setShowRestoreBranchButton(false) - } - } else { - setShowRestoreBranchButton(true) - } - }) - } + if (!branchError) return + + if (pullReqMetadata?.merged || pullReqMetadata?.closed) { + return setShowRestoreBranchButton(true) } + + setShowDeleteBranchButton(false) + createBranch({ + repo_ref: repoRef, + body: { + name: pullReqMetadata?.source_branch || '', + target: pullReqMetadata?.source_sha, + bypass_rules: true, + dry_run_rules: true + } + }).then(res => { + if (res?.body?.rule_violations) { + const { checkIfBypassAllowed } = extractInfoFromRuleViolationArr(res.body?.rule_violations) + + return setShowRestoreBranchButton(checkIfBypassAllowed) + } + + setShowRestoreBranchButton(true) + }) }, [branchError]) const [activities, setActivities] = useState(activityData) @@ -349,16 +349,12 @@ export default function PullRequestConversationPage() { const handleAddReviewer = (id?: number) => { reviewerAddPullReq({ repo_ref: repoRef, pullreq_number: prId, body: { reviewer_id: id } }) - .then(() => { - refetchReviewers() - }) + .then(() => refetchReviewers()) .catch(error => setAddReviewerError(error.message)) } const handleDeleteReviewer = (id: number) => { reviewerDeletePullReq({ repo_ref: repoRef, pullreq_number: prId, pullreq_reviewer_id: id }) - .then(() => { - refetchReviewers() - }) + .then(() => refetchReviewers()) .catch(error => setRemoveReviewerError(error.message)) } const onPRStateChanged = useCallback(() => { @@ -525,14 +521,15 @@ export default function PullRequestConversationPage() { {/* TODO: fix handleaction for comment section in panel */} - {rebaseErrorMessage ? ( + {rebaseErrorMessage && ( Cannot rebase branch

{rebaseErrorMessage}

- ) : null} + )} + diff --git a/apps/gitness/src/pages-v2/repo/labels/label-form-container.tsx b/apps/gitness/src/pages-v2/repo/labels/label-form-container.tsx index 8ba547d439..891bce5e58 100644 --- a/apps/gitness/src/pages-v2/repo/labels/label-form-container.tsx +++ b/apps/gitness/src/pages-v2/repo/labels/label-form-container.tsx @@ -24,9 +24,7 @@ export const RepoLabelFormContainer = () => { isLoading, error: createError } = useSaveRepoLabelMutation( - { - repo_ref - }, + { repo_ref }, { onSuccess: () => { onFormCancel() @@ -41,18 +39,12 @@ export const RepoLabelFormContainer = () => { const onSubmit = (data: CreateLabelFormFields) => { const { values, ...rest } = data - mutate({ - body: { - label: { - ...rest - }, - values - } - }) + mutate({ body: { label: { ...rest }, values } }) } return ( { } const { mutate: deleteRepoLabel, isLoading: isDeletingRepoLabel } = useDeleteRepoLabelMutation( - { - repo_ref: repo_ref ?? '' - }, + { repo_ref: repo_ref ?? '' }, { onSuccess: (_data, variables) => { setOpenAlertDeleteDialog(false) @@ -46,9 +44,7 @@ export const RepoLabelsList = () => { ) const { mutate: deleteSpaceLabel, isLoading: isDeletingSpaceLabel } = useDeleteSpaceLabelMutation( - { - space_ref: space_ref ?? '' - }, + { space_ref: space_ref ?? '' }, { onSuccess: (_data, variables) => { setOpenAlertDeleteDialog(false) @@ -72,15 +68,15 @@ export const RepoLabelsList = () => { return ( <> +
{fileName && ( - {fileName} + {fileName} )} {diffFileInstance && ( // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore { return ( -
+
diff --git a/packages/ui/src/components/chat_deprecated.tsx b/packages/ui/src/components/chat_deprecated.tsx index 82066a6291..b88bdaa09d 100644 --- a/packages/ui/src/components/chat_deprecated.tsx +++ b/packages/ui/src/components/chat_deprecated.tsx @@ -5,17 +5,17 @@ import { cn } from '@/utils/cn' // Root Container const Root: React.FC<{ children: ReactNode }> = ({ children }) => { - return
{children}
+ return
{children}
} // Body const Body: React.FC<{ children: ReactNode }> = ({ children }) => { - return
{children}
+ return
{children}
} // Footer const Footer: React.FC<{ children: ReactNode }> = ({ children }) => { - return
{children}
+ return
{children}
} // Message Component @@ -48,8 +48,8 @@ const Message: React.FC = ({ self, time, avatar, actions, children > {children}
-
-
{actions &&
{actions}
}
+
+
{actions &&
{actions}
}
{time && ( {time} @@ -68,9 +68,9 @@ interface TypingProps { const Typing: React.FC = ({ avatar }) => { return ( -
+
{avatar} -
+
· · @@ -115,10 +115,10 @@ const InputField: React.FC = ({ sendIcon = }) => { return ( -
+
= ({ variant="outline" size="icon" disabled={disabled} - className="absolute right-3.5 bottom-3.5 z-10 w-6 h-6" + className="absolute bottom-3.5 right-3.5 z-10 size-6" > {sendIcon} diff --git a/packages/ui/src/components/icon.tsx b/packages/ui/src/components/icon.tsx index 8194104113..e6bf32b159 100644 --- a/packages/ui/src/components/icon.tsx +++ b/packages/ui/src/components/icon.tsx @@ -406,7 +406,14 @@ export interface IconProps { const Icon: React.FC = ({ name, size = 16, height, width, className }) => { const Component = IconNameMap[name] - return + return ( + + ) } export { Icon } diff --git a/packages/ui/src/components/input.tsx b/packages/ui/src/components/input.tsx index d84989b4ce..8ac195e02d 100644 --- a/packages/ui/src/components/input.tsx +++ b/packages/ui/src/components/input.tsx @@ -1,4 +1,4 @@ -import { forwardRef, Fragment, InputHTMLAttributes, ReactNode } from 'react' +import { forwardRef, InputHTMLAttributes, ReactNode } from 'react' import { Caption, ControlGroup, Icon, IconProps, Label, Message, MessageTheme } from '@/components' import { cn } from '@utils/cn' @@ -69,7 +69,7 @@ const BaseInputWithWrapper = forwardRef( }, ref ) => { - const isControlGroup = !!error || !!caption || !!label || !!wrapperClassName - const InputWrapper = isControlGroup ? ControlGroup : Fragment - const inputWrapperProps = isControlGroup - ? { - className: wrapperClassName - } - : {} - const InputComponent = customContent ? BaseInputWithWrapper : BaseInput const baseInputComp = ( @@ -167,7 +159,7 @@ const Input = forwardRef( } return ( - + {!!label && ( + ) } ) @@ -190,4 +182,3 @@ const Input = forwardRef( Input.displayName = 'Input' export { Input } -export type { InputProps } diff --git a/packages/ui/src/components/label-marker.tsx b/packages/ui/src/components/label-marker.tsx index 1dcf1595dc..51f66e5f12 100644 --- a/packages/ui/src/components/label-marker.tsx +++ b/packages/ui/src/components/label-marker.tsx @@ -1,16 +1,19 @@ import { FC } from 'react' +import { Button, Icon } from '@/components' import { cn } from '@utils/cn' -import { ColorsEnum } from '@views/labels' +import { ColorsEnum, ILabelType, LabelType } from '@views/labels' -export interface LabelMarkerProps { +export interface LabelMarkerProps extends Pick { label: string value?: string - color: ColorsEnum - inTable?: boolean + counter?: ILabelType['value_count'] + className?: string + widthType?: 'auto' | 'balanced' + onDelete?: () => void } -export const LabelMarkerColor = { +const LabelMarkerColor = { [ColorsEnum.RED]: 'bg-label-background-red text-label-foreground-red', [ColorsEnum.BLUE]: 'bg-label-background-blue text-label-foreground-blue', [ColorsEnum.GREEN]: 'bg-label-background-green text-label-foreground-green', @@ -25,23 +28,71 @@ export const LabelMarkerColor = { [ColorsEnum.MINT]: 'bg-label-background-mint text-label-foreground-mint', [ColorsEnum.LIME]: 'bg-label-background-lime text-label-foreground-lime' } +const deleteButtonColor = { + [ColorsEnum.RED]: 'text-label-foreground-red', + [ColorsEnum.BLUE]: 'text-label-foreground-blue', + [ColorsEnum.GREEN]: 'text-label-foreground-green', + [ColorsEnum.YELLOW]: 'text-label-foreground-yellow', + [ColorsEnum.PURPLE]: 'text-label-foreground-purple', + [ColorsEnum.PINK]: 'text-label-foreground-pink', + [ColorsEnum.VIOLET]: 'text-label-foreground-violet', + [ColorsEnum.INDIGO]: 'text-label-foreground-indigo', + [ColorsEnum.CYAN]: 'text-label-foreground-cyan', + [ColorsEnum.ORANGE]: 'text-label-foreground-orange', + [ColorsEnum.BROWN]: 'text-label-foreground-brown', + [ColorsEnum.MINT]: 'text-label-foreground-mint', + [ColorsEnum.LIME]: 'text-label-foreground-lime' +} + +const DeleteButton = ({ onDelete, color }: Pick) => ( + +) + +export const LabelMarker: FC = ({ + type, + label, + value, + color, + counter, + onDelete, + className, + widthType = 'auto' +}) => { + const isDynamic = type === LabelType.DYNAMIC + const isBalancedWidthType = widthType === 'balanced' + const isWithExtraContent = !!value || !!counter + const isWithDeleteButton = !!onDelete -export const LabelMarker: FC = ({ label, value, color, inTable = false }) => { return ( - - {label} - {!!value && ( - - {value} - - )} - +
+ + {label} + + {isWithExtraContent && ( + + {!!value && {value}} + + {!!counter && counter} + + {isWithExtraContent && isWithDeleteButton && } + + )} + + {!isWithExtraContent && isWithDeleteButton && } + + + {isDynamic && } +
) } diff --git a/packages/ui/src/components/language-selector/language-dialog.tsx b/packages/ui/src/components/language-selector/language-dialog.tsx index 1179b162aa..32569c9ee8 100644 --- a/packages/ui/src/components/language-selector/language-dialog.tsx +++ b/packages/ui/src/components/language-selector/language-dialog.tsx @@ -40,7 +40,7 @@ const LanguageDialog: FC = ({ }} >
-
+
{lang.code}
({ )} - + {placeholder} diff --git a/packages/ui/src/components/navbar-project-chooser.tsx b/packages/ui/src/components/navbar-project-chooser.tsx index 9863d57dd2..e7910f7d8c 100644 --- a/packages/ui/src/components/navbar-project-chooser.tsx +++ b/packages/ui/src/components/navbar-project-chooser.tsx @@ -24,7 +24,7 @@ function Root({ logo }: ProjectProps) { return (
-
{logo}
+
{logo}
{title && (
-

{title}

+

{title}

)} {children} diff --git a/packages/ui/src/components/problems.tsx b/packages/ui/src/components/problems.tsx index 2c3433d54b..114988a30f 100644 --- a/packages/ui/src/components/problems.tsx +++ b/packages/ui/src/components/problems.tsx @@ -41,7 +41,7 @@ const ProblemsComponent = { role="button" tabIndex={0} onClick={onClick} - className={`width-100 flex flex-1 cursor-pointer items-center gap-2 text-nowrap py-0.5 justify-between px-4 ${rowClasses}`} + className={`width-100 flex flex-1 cursor-pointer items-center justify-between gap-2 text-nowrap px-4 py-0.5 ${rowClasses}`} > {children}
diff --git a/packages/ui/src/components/search-box.tsx b/packages/ui/src/components/search-box.tsx index ac2bcba207..5078cb8fc5 100644 --- a/packages/ui/src/components/search-box.tsx +++ b/packages/ui/src/components/search-box.tsx @@ -1,4 +1,4 @@ -import React, { +import { ForwardedRef, forwardRef, ReactNode, @@ -8,7 +8,7 @@ import React, { type InputHTMLAttributes } from 'react' -import { Icon, Input, Text } from '@/components' +import { Icon, Input } from '@/components' import { cn } from '@utils/cn' import { noop } from 'lodash-es' @@ -115,14 +115,14 @@ const Root = forwardRef( return (
{hasSearchIcon && ( - + )} + {hasShortcut && !!shortcutLetter && (
- - {shortcutLetter} - + + {shortcutLetter}
)} >, 'defaultValue'>, 'dir'>, SelectPrimitive.SelectProps { label?: string diff --git a/packages/ui/src/components/table.tsx b/packages/ui/src/components/table.tsx index 37dd6b15f4..df0548981d 100644 --- a/packages/ui/src/components/table.tsx +++ b/packages/ui/src/components/table.tsx @@ -8,7 +8,7 @@ const tableVariants = cva('w-full text-sm', { variant: { default: 'caption-bottom', asStackedList: - 'bg-background-surface rounded-md border [&_td]:px-4 [&_td]:py-2.5 [&_td]:align-top [&_th]:px-4 [&_thead]:bg-background-2' + 'rounded-md border bg-background-surface [&_td]:px-4 [&_td]:py-2.5 [&_td]:align-top [&_th]:px-4 [&_thead]:bg-background-2' } }, defaultVariants: { @@ -43,7 +43,7 @@ TableHeader.displayName = 'TableHeader' const TableBody = React.forwardRef>( ({ className, ...props }, ref) => ( - + tr:hover]:bg-background-4', className)} {...props} /> ) ) TableBody.displayName = 'TableBody' @@ -57,11 +57,7 @@ TableFooter.displayName = 'TableFooter' const TableRow = React.forwardRef>( ({ className, ...props }, ref) => ( - + ) ) TableRow.displayName = 'TableRow' diff --git a/packages/ui/src/components/theme-selector-v2/theme-dialog.tsx b/packages/ui/src/components/theme-selector-v2/theme-dialog.tsx index fbf165e342..d2ca8e6819 100644 --- a/packages/ui/src/components/theme-selector-v2/theme-dialog.tsx +++ b/packages/ui/src/components/theme-selector-v2/theme-dialog.tsx @@ -38,8 +38,8 @@ const ThemeDialog: FC = ({ defaultTheme, theme, open, onOpenCh {/* Mode */}
- Mode -

+ Mode +

Choose Dark mode for low light or Light mode for bright spaces.

@@ -63,7 +63,7 @@ const ThemeDialog: FC = ({ defaultTheme, theme, open, onOpenCh )} /> {mode === item && ( - + )}
= ({ defaultTheme, theme, open, onOpenCh aria-hidden />
- {item} + {item} ) })}
- + {/* Contrast */}
- Contrast -

+ Contrast +

High contrast improves readability, Dimmer mode reduces glare.

@@ -114,13 +114,13 @@ const ThemeDialog: FC = ({ defaultTheme, theme, open, onOpenCh
- + {/* Color Adjustment */}
- Color adjustment -

+ Color adjustment +

Adjust colors for different types of color blindness.

@@ -143,13 +143,13 @@ const ThemeDialog: FC = ({ defaultTheme, theme, open, onOpenCh
- + {/* Accent Color */}
- Accent color -

Select your application accent color.

+ Accent color +

Select your application accent color.

{Object.values(AccentColor).map(item => ( @@ -176,13 +176,13 @@ const ThemeDialog: FC = ({ defaultTheme, theme, open, onOpenCh
- + {/* Gray Color */}
- Gray color -

Select your application gray color.

+ Gray color +

Select your application gray color.

{Object.values(GrayColor).map(item => ( diff --git a/packages/ui/src/views/labels/components/label-cell-content.tsx b/packages/ui/src/views/labels/components/label-cell-content.tsx index a61caf623f..8163ac6d7c 100644 --- a/packages/ui/src/views/labels/components/label-cell-content.tsx +++ b/packages/ui/src/views/labels/components/label-cell-content.tsx @@ -1,45 +1,53 @@ import { FC } from 'react' import { Accordion, Icon, LabelMarker } from '@/components' -import { ILabelType, LabelValuesType } from '@/views' +import { ILabelType, LabelType, LabelValueType } from '@/views' import { cn } from '@utils/cn' export interface LabelCellContentProps { label: ILabelType - values: LabelValuesType + values?: LabelValueType[] } export const LabelCellContent: FC = ({ label, values }) => { - const value = values?.[label.key] - const length = value ? value.length : 0 + const isWithValues = values?.length && values.length > 0 return ( - + -
- {!!length && ( +
+ {isWithValues && ( )} - + +
- - {!!value && - value.map(item => ( + + {isWithValues && ( + + {values.map(item => ( ))} - + + )} ) diff --git a/packages/ui/src/views/labels/components/label-form-color-and-name-group.tsx b/packages/ui/src/views/labels/components/label-form-color-and-name-group.tsx index 6bb83d4ca3..4b306327be 100644 --- a/packages/ui/src/views/labels/components/label-form-color-and-name-group.tsx +++ b/packages/ui/src/views/labels/components/label-form-color-and-name-group.tsx @@ -1,8 +1,7 @@ import { FC } from 'react' -import { UseFormRegister } from 'react-hook-form' -import { Button, Icon, Input, Select, SelectContent, SelectItem } from '@/components' -import { ColorsEnum, CreateLabelFormFields, TranslationStore } from '@/views' +import { Button, Icon, Input, InputProps, Select, SelectContent, SelectItem, SelectProps } from '@/components' +import { cn, ColorsEnum, TranslationStore } from '@/views' const SelectColorMarker = { [ColorsEnum.RED]: 'bg-label-foreground-red', @@ -21,62 +20,60 @@ const SelectColorMarker = { } interface LabelFormColorAndNameGroupProps { - name: string - colorValue: ColorsEnum - handleColorChange: (color: ColorsEnum) => void - colorError?: string - nameError?: string + className?: string isValue?: boolean useTranslationStore: () => TranslationStore - register: UseFormRegister - registerName: keyof CreateLabelFormFields handleDeleteValue?: () => void + selectProps?: SelectProps + inputProps?: InputProps } export const LabelFormColorAndNameGroup: FC = ({ - name, - colorValue, - handleColorChange, - colorError, - nameError, + className, isValue = false, useTranslationStore, - register, - registerName, - handleDeleteValue + handleDeleteValue, + selectProps, + inputProps }) => { const { t } = useTranslationStore() + const isWithDeleteButton = isValue && !!handleDeleteValue + return ( -
-
- -
+
+ + - {isValue && !!handleDeleteValue && ( + + {isWithDeleteButton && (