Fix some icon display size + fix padding issue on EditableChip component (#314)

* Fix some icon display size + fix padding issue on EditableChip component

* Fix according to PR

* Fix server generate and deploy scripts

* Fix image size on Opportunities board

* Fix lint

* Fix according to PR
This commit is contained in:
Charles Bochet
2023-06-16 14:16:35 +02:00
committed by GitHub
parent 98127d1d4c
commit 7f25f16766
18 changed files with 64 additions and 41 deletions

View File

@ -1,4 +1,5 @@
import { useMatch, useResolvedPath } from 'react-router-dom'; import { useMatch, useResolvedPath } from 'react-router-dom';
import { useTheme } from '@emotion/react';
import { import {
IconBuildingSkyscraper, IconBuildingSkyscraper,
@ -14,6 +15,7 @@ import NavTitle from './modules/ui/layout/navbar/NavTitle';
import NavWorkspaceButton from './modules/ui/layout/navbar/NavWorkspaceButton'; import NavWorkspaceButton from './modules/ui/layout/navbar/NavWorkspaceButton';
export function AppNavbar() { export function AppNavbar() {
const theme = useTheme();
return ( return (
<> <>
<NavWorkspaceButton /> <NavWorkspaceButton />
@ -21,25 +23,25 @@ export function AppNavbar() {
<NavItem <NavItem
label="Search" label="Search"
to="/search" to="/search"
icon={<IconSearch size={16} />} icon={<IconSearch size={theme.iconSizeMedium} />}
soon={true} soon={true}
/> />
<NavItem <NavItem
label="Inbox" label="Inbox"
to="/inbox" to="/inbox"
icon={<IconInbox size={16} />} icon={<IconInbox size={theme.iconSizeMedium} />}
soon={true} soon={true}
/> />
<NavItem <NavItem
label="Settings" label="Settings"
to="/settings/profile" to="/settings/profile"
icon={<IconSettings size={16} />} icon={<IconSettings size={theme.iconSizeMedium} />}
/> />
<NavTitle label="Workspace" /> <NavTitle label="Workspace" />
<NavItem <NavItem
label="People" label="People"
to="/people" to="/people"
icon={<IconUser size={16} />} icon={<IconUser size={theme.iconSizeMedium} />}
active={ active={
!!useMatch({ !!useMatch({
path: useResolvedPath('/people').pathname, path: useResolvedPath('/people').pathname,
@ -50,7 +52,7 @@ export function AppNavbar() {
<NavItem <NavItem
label="Companies" label="Companies"
to="/companies" to="/companies"
icon={<IconBuildingSkyscraper size={16} />} icon={<IconBuildingSkyscraper size={theme.iconSizeMedium} />}
active={ active={
!!useMatch({ !!useMatch({
path: useResolvedPath('/companies').pathname, path: useResolvedPath('/companies').pathname,

View File

@ -1,3 +1,4 @@
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { IconComment } from '@/ui/icons'; import { IconComment } from '@/ui/icons';
@ -47,13 +48,15 @@ const StyledCount = styled.div`
`; `;
export function CommentChip({ count, onClick }: CommentChipProps) { export function CommentChip({ count, onClick }: CommentChipProps) {
const theme = useTheme();
if (count === 0) return null; if (count === 0) return null;
const formattedCount = count > 99 ? '99+' : count; const formattedCount = count > 99 ? '99+' : count;
return ( return (
<StyledChip data-testid="comment-chip" onClick={onClick}> <StyledChip data-testid="comment-chip" onClick={onClick}>
<StyledCount>{formattedCount}</StyledCount> <StyledCount>{formattedCount}</StyledCount>
<IconComment size={16} /> <IconComment size={theme.iconSizeMedium} />
</StyledChip> </StyledChip>
); );
} }

View File

@ -1,4 +1,5 @@
import { Tooltip } from 'react-tooltip'; import { Tooltip } from 'react-tooltip';
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { CommentForDrawer } from '@/comments/types/CommentForDrawer'; import { CommentForDrawer } from '@/comments/types/CommentForDrawer';
@ -62,6 +63,7 @@ const StyledTooltip = styled(Tooltip)`
`; `;
export function CommentHeader({ comment }: OwnProps) { export function CommentHeader({ comment }: OwnProps) {
const theme = useTheme();
const beautifiedCreatedAt = beautifyPastDateRelativeToNow(comment.createdAt); const beautifiedCreatedAt = beautifyPastDateRelativeToNow(comment.createdAt);
const exactCreatedAt = beautifyExactDate(comment.createdAt); const exactCreatedAt = beautifyExactDate(comment.createdAt);
const showDate = beautifiedCreatedAt !== ''; const showDate = beautifiedCreatedAt !== '';
@ -79,7 +81,7 @@ export function CommentHeader({ comment }: OwnProps) {
<StyledContainer> <StyledContainer>
<Avatar <Avatar
avatarUrl={avatarUrl} avatarUrl={avatarUrl}
size={16} size={theme.iconSizeMedium}
placeholder={capitalizedFirstUsernameLetter} placeholder={capitalizedFirstUsernameLetter}
/> />
<StyledName>{authorName}</StyledName> <StyledName>{authorName}</StyledName>

View File

@ -1,3 +1,4 @@
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { Company, Person } from '../../../generated/graphql'; import { Company, Person } from '../../../generated/graphql';
@ -26,10 +27,10 @@ const StyledBoardCardHeader = styled.div`
height: 24px; height: 24px;
padding: ${(props) => props.theme.spacing(2)}; padding: ${(props) => props.theme.spacing(2)};
img { img {
height: 16px; height: ${(props) => props.theme.iconSizeMedium}px;
margin-right: ${(props) => props.theme.spacing(2)}; margin-right: ${(props) => props.theme.spacing(2)};
object-fit: cover; object-fit: cover;
width: 16px; width: ${(props) => props.theme.iconSizeMedium}px;
} }
`; `;
const StyledBoardCardBody = styled.div` const StyledBoardCardBody = styled.div`
@ -57,6 +58,7 @@ export const BoardCard = ({ item }: { item: Person | Company }) => {
const PersonBoardCard = ({ person }: { person: Person }) => { const PersonBoardCard = ({ person }: { person: Person }) => {
const fullname = `${person.firstname} ${person.lastname}`; const fullname = `${person.firstname} ${person.lastname}`;
const theme = useTheme();
return ( return (
<StyledBoardCard> <StyledBoardCard>
<StyledBoardCardHeader> <StyledBoardCardHeader>
@ -69,7 +71,7 @@ const PersonBoardCard = ({ person }: { person: Person }) => {
</StyledBoardCardHeader> </StyledBoardCardHeader>
<StyledBoardCardBody> <StyledBoardCardBody>
<span> <span>
<IconBuildingSkyscraper size={16} /> <IconBuildingSkyscraper size={theme.iconSizeMedium} />
<CompanyChip <CompanyChip
name={person.company?.name || ''} name={person.company?.name || ''}
picture={getLogoUrlFromDomainName( picture={getLogoUrlFromDomainName(
@ -78,15 +80,15 @@ const PersonBoardCard = ({ person }: { person: Person }) => {
/> />
</span> </span>
<span> <span>
<IconMail size={16} /> <IconMail size={theme.iconSizeMedium} />
{person.email} {person.email}
</span> </span>
<span> <span>
<IconPhone size={16} /> <IconPhone size={theme.iconSizeMedium} />
{person.phone} {person.phone}
</span> </span>
<span> <span>
<IconCalendarEvent size={16} /> <IconCalendarEvent size={theme.iconSizeMedium} />
{humanReadableDate(new Date(person.createdAt as string))} {humanReadableDate(new Date(person.createdAt as string))}
</span> </span>
</StyledBoardCardBody> </StyledBoardCardBody>
@ -95,6 +97,7 @@ const PersonBoardCard = ({ person }: { person: Person }) => {
}; };
const CompanyBoardCard = ({ company }: { company: Company }) => { const CompanyBoardCard = ({ company }: { company: Company }) => {
const theme = useTheme();
return ( return (
<StyledBoardCard> <StyledBoardCard>
<StyledBoardCardHeader> <StyledBoardCardHeader>
@ -106,14 +109,14 @@ const CompanyBoardCard = ({ company }: { company: Company }) => {
</StyledBoardCardHeader> </StyledBoardCardHeader>
<StyledBoardCardBody> <StyledBoardCardBody>
<span> <span>
<IconUser size={16} /> <IconUser size={theme.iconSizeMedium} />
<PersonChip name={company.accountOwner?.displayName || ''} /> <PersonChip name={company.accountOwner?.displayName || ''} />
</span> </span>
<span> <span>
<IconUsers size={16} /> {company.employees} <IconUsers size={theme.iconSizeMedium} /> {company.employees}
</span> </span>
<span> <span>
<IconCalendarEvent size={16} /> <IconCalendarEvent size={theme.iconSizeMedium} />
{humanReadableDate(new Date(company.createdAt as string))} {humanReadableDate(new Date(company.createdAt as string))}
</span> </span>
</StyledBoardCardBody> </StyledBoardCardBody>

View File

@ -45,7 +45,6 @@ export const useBoard = () => {
const pipelineEntityType: 'Person' | 'Company' | undefined = const pipelineEntityType: 'Person' | 'Company' | undefined =
pipelineStages?.[0].pipelineProgresses?.[0].progressableType; pipelineStages?.[0].pipelineProgresses?.[0].progressableType;
console.log(pipelineEntityType);
const query = const query =
pipelineEntityType === 'Person' ? useGetPeopleQuery : useGetCompaniesQuery; pipelineEntityType === 'Person' ? useGetPeopleQuery : useGetCompaniesQuery;

View File

@ -1,4 +1,5 @@
import { useMatch, useResolvedPath } from 'react-router-dom'; import { useMatch, useResolvedPath } from 'react-router-dom';
import { useTheme } from '@emotion/react';
import { removeTokens } from '@/auth/services/AuthService'; import { removeTokens } from '@/auth/services/AuthService';
import { import {
@ -13,6 +14,7 @@ import NavItemsContainer from '@/ui/layout/navbar/NavItemsContainer';
import NavTitle from '@/ui/layout/navbar/NavTitle'; import NavTitle from '@/ui/layout/navbar/NavTitle';
export function SettingsNavbar() { export function SettingsNavbar() {
const theme = useTheme();
return ( return (
<> <>
<NavBackButton title="Settings" /> <NavBackButton title="Settings" />
@ -21,7 +23,7 @@ export function SettingsNavbar() {
<NavItem <NavItem
label="Profile" label="Profile"
to="/settings/profile" to="/settings/profile"
icon={<IconUser size={16} />} icon={<IconUser size={theme.iconSizeMedium} />}
active={ active={
!!useMatch({ !!useMatch({
path: useResolvedPath('/people').pathname, path: useResolvedPath('/people').pathname,
@ -32,7 +34,7 @@ export function SettingsNavbar() {
<NavItem <NavItem
label="Experience" label="Experience"
to="/settings/profile/experience" to="/settings/profile/experience"
icon={<IconColorSwatch size={16} />} icon={<IconColorSwatch size={theme.iconSizeMedium} />}
soon={true} soon={true}
active={ active={
!!useMatch({ !!useMatch({
@ -45,7 +47,7 @@ export function SettingsNavbar() {
<NavItem <NavItem
label="General" label="General"
to="/settings/workspace" to="/settings/workspace"
icon={<IconSettings size={16} />} icon={<IconSettings size={theme.iconSizeMedium} />}
soon={true} soon={true}
active={ active={
!!useMatch({ !!useMatch({
@ -58,7 +60,7 @@ export function SettingsNavbar() {
<NavItem <NavItem
label="Logout" label="Logout"
onClick={removeTokens} onClick={removeTokens}
icon={<IconLogout size={16} />} icon={<IconLogout size={theme.iconSizeMedium} />}
danger={true} danger={true}
/> />
</NavItemsContainer> </NavItemsContainer>

View File

@ -1,3 +1,4 @@
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { IconPlus } from '@/ui/icons/index'; import { IconPlus } from '@/ui/icons/index';
@ -21,9 +22,10 @@ const StyledButton = styled.button`
`; `;
export const NewButton = () => { export const NewButton = () => {
const theme = useTheme();
return ( return (
<StyledButton> <StyledButton>
<IconPlus size={16} /> <IconPlus size={theme.iconSizeMedium} />
New New
</StyledButton> </StyledButton>
); );

View File

@ -19,8 +19,8 @@ export type EditableChipProps = {
// TODO: refactor // TODO: refactor
const StyledInplaceInput = styled.input` const StyledInplaceInput = styled.input`
padding-left: ${(props) => props.theme.spacing(1)}; padding-left: ${(props) => props.theme.spacing(2)};
padding-right: ${(props) => props.theme.spacing(1)}; padding-right: ${(props) => props.theme.spacing(2)};
width: 100%; width: 100%;
${textInputStyle} ${textInputStyle}

View File

@ -1,4 +1,5 @@
import React from 'react'; import React from 'react';
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { IconCheck } from '@/ui/icons/index'; import { IconCheck } from '@/ui/icons/index';
@ -35,10 +36,13 @@ export function DropdownMenuSelectableItem({
onClick, onClick,
children, children,
}: React.PropsWithChildren<Props>) { }: React.PropsWithChildren<Props>) {
const theme = useTheme();
return ( return (
<DropdownMenuSelectableItemContainer onClick={onClick} selected={selected}> <DropdownMenuSelectableItemContainer onClick={onClick} selected={selected}>
<StyledLeftContainer>{children}</StyledLeftContainer> <StyledLeftContainer>{children}</StyledLeftContainer>
<StyledRightIcon>{selected && <IconCheck size={16} />}</StyledRightIcon> <StyledRightIcon>
{selected && <IconCheck size={theme.iconSizeMedium} />}
</StyledRightIcon>
</DropdownMenuSelectableItemContainer> </DropdownMenuSelectableItemContainer>
); );
} }

View File

@ -1,3 +1,4 @@
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { import {
@ -65,6 +66,7 @@ function SortAndFilterBar<SortField, TData extends FilterableFieldsType>({
onRemoveFilter, onRemoveFilter,
onCancelClick, onCancelClick,
}: OwnProps<SortField, TData>) { }: OwnProps<SortField, TData>) {
const theme = useTheme();
return ( return (
<StyledBar> <StyledBar>
<StyledChipcontainer> <StyledChipcontainer>
@ -76,9 +78,9 @@ function SortAndFilterBar<SortField, TData extends FilterableFieldsType>({
id={sort.key} id={sort.key}
icon={ icon={
sort.order === 'desc' ? ( sort.order === 'desc' ? (
<IconArrowNarrowDown /> <IconArrowNarrowDown size={theme.iconSizeMedium} />
) : ( ) : (
<IconArrowNarrowUp /> <IconArrowNarrowUp size={theme.iconSizeMedium} />
) )
} }
onRemove={() => onRemoveSort(sort.key)} onRemove={() => onRemoveSort(sort.key)}

View File

@ -1,4 +1,5 @@
import { ReactNode } from 'react'; import { ReactNode } from 'react';
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { IconX } from '@/ui/icons/index'; import { IconX } from '@/ui/icons/index';
@ -50,13 +51,14 @@ function SortOrFilterChip({
icon, icon,
onRemove, onRemove,
}: OwnProps) { }: OwnProps) {
const theme = useTheme();
return ( return (
<StyledChip> <StyledChip>
<StyledIcon>{icon}</StyledIcon> <StyledIcon>{icon}</StyledIcon>
{labelKey && <StyledLabelKey>{labelKey}:&nbsp;</StyledLabelKey>} {labelKey && <StyledLabelKey>{labelKey}:&nbsp;</StyledLabelKey>}
{labelValue} {labelValue}
<StyledDelete onClick={onRemove} data-testid={'remove-icon-' + id}> <StyledDelete onClick={onRemove} data-testid={'remove-icon-' + id}>
<IconX /> <IconX size={theme.iconSizeMedium} />
</StyledDelete> </StyledDelete>
</StyledChip> </StyledChip>
); );

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,5 +1,5 @@
import DarkNoise from './../dark-noise.jpg'; import DarkNoise from '../assets/dark-noise.jpg';
import LightNoise from './../light-noise.jpg'; import LightNoise from '../assets/light-noise.jpg';
export const backgroundColorsLight = { export const backgroundColorsLight = {
noisyBackground: `url(${LightNoise.toString()});`, noisyBackground: `url(${LightNoise.toString()});`,

View File

@ -4,13 +4,12 @@ export const commonText = {
fontSizeMedium: '1rem', fontSizeMedium: '1rem',
fontSizeLarge: '1.08rem', fontSizeLarge: '1.08rem',
iconSizeSmall: '0.92rem',
iconSizeMedium: '1.08rem',
iconSizeLarge: '1.23rem',
fontWeightMedium: 500, fontWeightMedium: 500,
fontWeightSemibold: 600, fontWeightSemibold: 600,
fontWeightBold: 700, fontWeightBold: 700,
fontFamily: 'Inter, sans-serif', fontFamily: 'Inter, sans-serif',
lineHeight: '150%',
lineHeight: 1.5,
iconSizeMedium: 16,
}; };

View File

@ -1,4 +1,5 @@
import { useCallback, useState } from 'react'; import { useCallback, useState } from 'react';
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
@ -73,12 +74,12 @@ export function Companies() {
} }
const companiesColumns = useCompaniesColumns(); const companiesColumns = useCompaniesColumns();
const theme = useTheme();
return ( return (
<AppPage> <AppPage>
<WithTopBarContainer <WithTopBarContainer
title="Companies" title="Companies"
icon={<IconBuildingSkyscraper size={16} />} icon={<IconBuildingSkyscraper size={theme.iconSizeMedium} />}
onAddButtonClick={handleAddButtonClick} onAddButtonClick={handleAddButtonClick}
> >
<> <>

View File

@ -1,4 +1,5 @@
import { useCallback, useState } from 'react'; import { useCallback, useState } from 'react';
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
@ -71,11 +72,12 @@ export function People() {
const peopleColumns = usePeopleColumns(); const peopleColumns = usePeopleColumns();
const theme = useTheme();
return ( return (
<AppPage> <AppPage>
<WithTopBarContainer <WithTopBarContainer
title="People" title="People"
icon={<IconUser size={16} />} icon={<IconUser size={theme.iconSizeMedium} />}
onAddButtonClick={handleAddButtonClick} onAddButtonClick={handleAddButtonClick}
> >
<> <>
@ -84,7 +86,7 @@ export function People() {
data={people} data={people}
columns={peopleColumns} columns={peopleColumns}
viewName="All People" viewName="All People"
viewIcon={<IconList />} viewIcon={<IconList size={theme.iconSizeMedium} />}
availableSorts={availableSorts} availableSorts={availableSorts}
availableFilters={availableFilters} availableFilters={availableFilters}
onSortsUpdate={updateSorts} onSortsUpdate={updateSorts}

View File

@ -20,10 +20,10 @@
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "jest --config ./test/jest-e2e.json", "test:e2e": "jest --config ./test/jest-e2e.json",
"prisma:generate-client": "npx prisma generate --generator client", "prisma:generate-client": "npx prisma generate --generator client",
"prisma:generate-nest-graphql": "npx prisma generate --generator nestgraphql && eslint \"src/api/@generated/**\" --fix", "prisma:generate-nest-graphql": "npx prisma generate --generator nestgraphql && eslint \"src/core/@generated/**\" --fix",
"prisma:migrate": "npx prisma migrate deploy", "prisma:migrate": "npx prisma migrate deploy",
"prisma:seed": "npx prisma db seed", "prisma:seed": "npx prisma db seed",
"prisma:reset": "yarn prisma:generate-client && yarn prisma:generate-nest-grapql && npx prisma migrate reset" "prisma:reset": "yarn prisma:generate-client && yarn prisma:generate-nest-graphql && npx prisma migrate reset"
}, },
"dependencies": { "dependencies": {
"@apollo/server": "^4.7.3", "@apollo/server": "^4.7.3",