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
3 changes: 3 additions & 0 deletions src/assets/icons/priority-high.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions src/assets/icons/priority-highest.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions src/assets/icons/priority-low.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions src/assets/icons/priority-lowest.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions src/assets/icons/priority-medium.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { ReactComponent as NeedReviewIcon } from 'src/assets/icons/pill-icon-nee
import { useTranslation } from 'react-i18next';
import { theme } from 'src/app/theme';

export const NeedReviewPill = () => {
export const NeedReviewTag = () => {
const { t } = useTranslation();
return (
<Tooltip
Expand Down
4 changes: 2 additions & 2 deletions src/common/components/BugDetail/Meta/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { theme as globalTheme } from 'src/app/theme';
import { Bug } from 'src/features/api';
import { Pipe } from 'src/common/components/Pipe';
import { WrappedText } from 'src/common/components/WrappedText';
import { NeedReviewPill } from './NeedReviewPill';
import { NeedReviewTag } from './NeedReviewTag';

const Container = styled.div`
margin-top: ${({ theme }) => theme.space.xs};
Expand Down Expand Up @@ -58,7 +58,7 @@ export default ({
hasBackground
severity={bug.severity.name.toLowerCase() as Severities}
/>
{bug.status.id === 4 && <NeedReviewPill />}
{bug.status.id === 4 && <NeedReviewTag />}
</SeverityContainer>
<XL
isBold
Expand Down
148 changes: 148 additions & 0 deletions src/common/components/BugDetail/Priority.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
import {
Dropdown,
Select,
Item,
Menu,
Skeleton,
} from '@appquality/unguess-design-system';
import { Field } from '@zendeskgarden/react-dropdowns';
import { useEffect, useState } from 'react';
import { DEFAULT_BUG_PRIORITY } from 'src/constants';
import {
Bug,
useGetCampaignsByCidPrioritiesQuery,
usePatchCampaignsByCidBugsAndBidMutation,
} from 'src/features/api';
import styled from 'styled-components';
import { theme as globalTheme } from 'src/app/theme';
import { useTranslation } from 'react-i18next';
import { getPriorityInfo } from '../utils/getPriorityInfo';
import { Label } from './Label';

const StyledItem = styled(Item)`
display: flex;
align-items: center;

> svg {
margin-right: ${({ theme }) => theme.space.xs};
}
`;

const Container = styled.div`
display: inline-block;
width: 100%;
margin-top: ${({ theme }) => theme.space.md};
`;

const SelectedItem = styled.div`
display: flex;
align-items: center;

> svg {
margin-right: ${({ theme }) => theme.space.xs};
}
`;

type DropdownItem = {
id: number;
text: string;
slug: string;
icon: React.ReactNode;
};

const Priority = ({ bug }: { bug: Bug }) => {
const { t } = useTranslation();
const { priority: bugPriority } = bug;
const [selectedItem, setSelectedItem] = useState<DropdownItem>({
id: DEFAULT_BUG_PRIORITY.id,
slug: DEFAULT_BUG_PRIORITY.name,
text: getPriorityInfo(DEFAULT_BUG_PRIORITY.name as Priority, t).text,
icon: getPriorityInfo(DEFAULT_BUG_PRIORITY.name as Priority, t).icon,
});
const [options, setOptions] = useState<DropdownItem[]>([]);
const [patchBug] = usePatchCampaignsByCidBugsAndBidMutation();
const {
data: cpPriorities,
isLoading,
isFetching,
isError,
} = useGetCampaignsByCidPrioritiesQuery({
cid: bug.campaign_id.toString(),
});

useEffect(() => {
if (cpPriorities) {
setOptions(
cpPriorities.map((priority) => ({
id: priority.id,
slug: priority.name,
text: getPriorityInfo(priority.name as Priority, t).text,
icon: getPriorityInfo(priority.name as Priority, t).icon,
}))
);
}
}, [cpPriorities]);

useEffect(() => {
if (bugPriority) {
setSelectedItem({
id: bugPriority.id,
slug: bugPriority.name,
text: getPriorityInfo(bugPriority.name as Priority, t).text,
icon: getPriorityInfo(bugPriority.name as Priority, t).icon,
});
}
}, [bugPriority]);

if (isError) return null;

return (
<Container>
<Label style={{ marginBottom: globalTheme.space.xxs }}>
{t('__BUGS_PAGE_BUG_DETAIL_PRIORITY_LABEL')}
</Label>
{isLoading || isFetching ? (
<Skeleton
height="30px"
style={{ borderRadius: globalTheme.borderRadii.md }}
/>
) : (
<Dropdown
selectedItem={selectedItem}
onSelect={async (item: DropdownItem) => {
await patchBug({
cid: bug.campaign_id.toString(),
bid: bug.id.toString(),
body: {
priority_id: item.id,
},
});

setSelectedItem(item);
}}
downshiftProps={{
itemToString: (item: DropdownItem) => item && item.slug,
}}
>
<Field>
<Select isCompact>
<SelectedItem>
{selectedItem.icon} {selectedItem.text}
</SelectedItem>
</Select>
</Field>
<Menu>
{options &&
options.map((item) => (
<StyledItem key={item.slug} value={item}>
{item.icon} {item.text}
</StyledItem>
))}
</Menu>
</Dropdown>
)}
</Container>
);
};

export default Priority;
49 changes: 49 additions & 0 deletions src/common/components/utils/getPriorityInfo.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { TFunction } from 'react-i18next';
import { ReactComponent as PriorityHighest } from 'src/assets/icons/priority-highest.svg';
import { ReactComponent as PriorityHigh } from 'src/assets/icons/priority-high.svg';
import { ReactComponent as PriorityMedium } from 'src/assets/icons/priority-medium.svg';
import { ReactComponent as PriorityLow } from 'src/assets/icons/priority-low.svg';
import { ReactComponent as PriorityLowest } from 'src/assets/icons/priority-lowest.svg';

type PriorityInfo = {
icon: React.ReactNode;
text: string;
};

export const getPriorityInfo = (
priority: Priority,
t: TFunction
): PriorityInfo => {
switch (priority) {
case 'highest':
return {
icon: <PriorityHighest />,
text: t('__BUG_PRIORITY_HIGHEST'),
};
case 'high':
return {
icon: <PriorityHigh />,
text: t('__BUG_PRIORITY_HIGH'),
};
case 'medium':
return {
icon: <PriorityMedium />,
text: t('__BUG_PRIORITY_MEDIUM'),
};
case 'low':
return {
icon: <PriorityLow />,
text: t('__BUG_PRIORITY_LOW'),
};
case 'lowest':
return {
icon: <PriorityLowest />,
text: t('__BUG_PRIORITY_LOWEST'),
};
default:
return {
icon: <PriorityMedium />,
text: t('__BUG_PRIORITY_MEDIUM'),
};
}
};
1 change: 0 additions & 1 deletion src/common/components/utils/getStatusInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import {
CampaignFunctionalIcon,
} from '@appquality/unguess-design-system';
import { theme } from 'src/app/theme';
import React from 'react';
import { useTranslation } from 'react-i18next';

type StatusInfo = {
Expand Down
36 changes: 36 additions & 0 deletions src/common/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,15 @@ export interface paths {
};
};
};
'/campaigns/{cid}/priorities': {
get: operations['get-campaigns-cid-priorities'];
parameters: {
path: {
/** Campaign id */
cid: string;
};
};
};
'/campaigns/{cid}/usecases': {
get: operations['get-campaigns-cid-usecases'];
parameters: {
Expand Down Expand Up @@ -282,6 +291,7 @@ export interface components {
severity: components['schemas']['BugSeverity'];
type: components['schemas']['BugType'];
replicability: components['schemas']['BugReplicability'];
priority?: components['schemas']['BugPriority'];
created: string;
occurred_date: string;
updated?: string;
Expand Down Expand Up @@ -350,6 +360,11 @@ export interface components {
id: number;
name: string;
};
/** BugPriority */
BugPriority: {
id: number;
name: string;
};
/** BugTag */
BugTag: {
id: number;
Expand Down Expand Up @@ -1031,6 +1046,7 @@ export interface operations {
tag_id: number;
tag_name: string;
}[];
priority?: components['schemas']['BugPriority'];
};
};
};
Expand All @@ -1046,6 +1062,7 @@ export interface operations {
tag_name: string;
}
)[];
priority_id?: number;
};
};
};
Expand Down Expand Up @@ -1249,6 +1266,25 @@ export interface operations {
500: components['responses']['Error'];
};
};
'get-campaigns-cid-priorities': {
parameters: {
path: {
/** Campaign id */
cid: string;
};
};
responses: {
/** OK */
200: {
content: {
'application/json': components['schemas']['BugPriority'][];
};
};
400: components['responses']['Error'];
403: components['responses']['Error'];
500: components['responses']['Error'];
};
};
'get-campaigns-cid-usecases': {
parameters: {
path: {
Expand Down
5 changes: 5 additions & 0 deletions src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ export const DEFAULT_EXPRESS_REQUIRED_COINS = 1;
export const SERVICES_SHOW_TIPS = true;
export const EXPRESS_USE_CASES_LIMIT = 5;

export const DEFAULT_BUG_PRIORITY = {
id: 3,
name: 'medium',
};

export const EXPRESS_START_DATE_MAX_VALUE = 30;
export const EXPRESS_BUSINESS_DAYS_TO_ADD = 2;
export const EXPRESS_3_BUSINESS_DAYS_TO_ADD = 3;
Expand Down
Loading