mirror of
https://github.com/twentyhq/twenty.git
synced 2024-11-30 03:43:02 +03:00
Merge pull request #38 from twentyhq/cbo-table-styling
Improve Table Header style
This commit is contained in:
commit
f3b916f20b
34
front/src/components/table/ColumnHead.tsx
Normal file
34
front/src/components/table/ColumnHead.tsx
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import styled from '@emotion/styled';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import { IconProp } from '@fortawesome/fontawesome-svg-core';
|
||||||
|
|
||||||
|
type OwnProps = {
|
||||||
|
viewName: string;
|
||||||
|
viewIcon?: IconProp;
|
||||||
|
};
|
||||||
|
|
||||||
|
const StyledTitle = styled.div`
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
height: 40px;
|
||||||
|
color: ${(props) => props.theme.text60};
|
||||||
|
font-weight: 500;
|
||||||
|
padding-left: ${(props) => props.theme.spacing(2)};
|
||||||
|
`;
|
||||||
|
|
||||||
|
const StyledIcon = styled.div`
|
||||||
|
display: flex;
|
||||||
|
margin-right: ${(props) => props.theme.spacing(1)};
|
||||||
|
`;
|
||||||
|
|
||||||
|
function TableHeader({ viewName, viewIcon }: OwnProps) {
|
||||||
|
return (
|
||||||
|
<StyledTitle>
|
||||||
|
<StyledIcon>{viewIcon && <FontAwesomeIcon icon={viewIcon} />}</StyledIcon>
|
||||||
|
{viewName}
|
||||||
|
</StyledTitle>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default TableHeader;
|
@ -32,6 +32,12 @@ const StyledTable = styled.table`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
const StyledTableWithHeader = styled.div`
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex: 1;
|
||||||
|
`;
|
||||||
|
|
||||||
function Table({ data, columns, viewName, viewIcon }: OwnProps) {
|
function Table({ data, columns, viewName, viewIcon }: OwnProps) {
|
||||||
const table = useReactTable({
|
const table = useReactTable({
|
||||||
data,
|
data,
|
||||||
@ -40,7 +46,7 @@ function Table({ data, columns, viewName, viewIcon }: OwnProps) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<StyledTableWithHeader>
|
||||||
<TableHeader viewName={viewName} viewIcon={viewIcon} />
|
<TableHeader viewName={viewName} viewIcon={viewIcon} />
|
||||||
<StyledTable>
|
<StyledTable>
|
||||||
<thead>
|
<thead>
|
||||||
@ -92,7 +98,7 @@ function Table({ data, columns, viewName, viewIcon }: OwnProps) {
|
|||||||
</tfoot>
|
</tfoot>
|
||||||
)}
|
)}
|
||||||
</StyledTable>
|
</StyledTable>
|
||||||
</div>
|
</StyledTableWithHeader>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,16 +11,47 @@ const StyledTitle = styled.div`
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 5px;
|
justify-content: space-between;
|
||||||
|
height: 40px;
|
||||||
color: ${(props) => props.theme.text60};
|
color: ${(props) => props.theme.text60};
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
|
padding-left: ${(props) => props.theme.spacing(2)};
|
||||||
|
`;
|
||||||
|
|
||||||
|
const StyledIcon = styled.div`
|
||||||
|
display: flex;
|
||||||
|
margin-right: ${(props) => props.theme.spacing(2)};
|
||||||
|
`;
|
||||||
|
|
||||||
|
const StyledViewSection = styled.div`
|
||||||
|
display: flex;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const StyledFilters = styled.div`
|
||||||
|
display: flex;
|
||||||
|
font-weight: 400;
|
||||||
|
margin-right: ${(props) => props.theme.spacing(1)};
|
||||||
|
`;
|
||||||
|
|
||||||
|
const StyledFilterButton = styled.div`
|
||||||
|
display: flex;
|
||||||
|
margin-left: ${(props) => props.theme.spacing(4)};
|
||||||
`;
|
`;
|
||||||
|
|
||||||
function TableHeader({ viewName, viewIcon }: OwnProps) {
|
function TableHeader({ viewName, viewIcon }: OwnProps) {
|
||||||
return (
|
return (
|
||||||
<StyledTitle>
|
<StyledTitle>
|
||||||
{viewIcon && <FontAwesomeIcon icon={viewIcon} />}
|
<StyledViewSection>
|
||||||
|
<StyledIcon>
|
||||||
|
{viewIcon && <FontAwesomeIcon icon={viewIcon} size="lg" />}
|
||||||
|
</StyledIcon>
|
||||||
{viewName}
|
{viewName}
|
||||||
|
</StyledViewSection>
|
||||||
|
<StyledFilters>
|
||||||
|
<StyledFilterButton>Filter</StyledFilterButton>
|
||||||
|
<StyledFilterButton>Sort</StyledFilterButton>
|
||||||
|
<StyledFilterButton>Settings</StyledFilterButton>
|
||||||
|
</StyledFilters>
|
||||||
</StyledTitle>
|
</StyledTitle>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ import { Pipe } from '../../interfaces/pipe.interface';
|
|||||||
import { createColumnHelper } from '@tanstack/react-table';
|
import { createColumnHelper } from '@tanstack/react-table';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import CellLink from '../../components/table/CellLink';
|
import CellLink from '../../components/table/CellLink';
|
||||||
import TableHeader from '../../components/table/TableHeader';
|
import ColumnHead from '../../components/table/ColumnHead';
|
||||||
import personPlaceholder from './placeholder.png';
|
import personPlaceholder from './placeholder.png';
|
||||||
import { parsePhoneNumber, CountryCode } from 'libphonenumber-js';
|
import { parsePhoneNumber, CountryCode } from 'libphonenumber-js';
|
||||||
|
|
||||||
@ -30,13 +30,11 @@ type Person = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const StyledPeopleContainer = styled.div`
|
const StyledPeopleContainer = styled.div`
|
||||||
padding: 8px;
|
display: flex;
|
||||||
|
padding-left: ${(props) => props.theme.spacing(2)};
|
||||||
|
padding-right: ${(props) => props.theme.spacing(2)};
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
table {
|
|
||||||
margin-top: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@ -105,7 +103,7 @@ const columnHelper = createColumnHelper<Person>();
|
|||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
columnHelper.accessor('fullName', {
|
columnHelper.accessor('fullName', {
|
||||||
header: () => <TableHeader viewName="People" viewIcon={faUser} />,
|
header: () => <ColumnHead viewName="People" viewIcon={faUser} />,
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<CellLink
|
<CellLink
|
||||||
name={props.row.original.fullName}
|
name={props.row.original.fullName}
|
||||||
@ -115,7 +113,7 @@ const columns = [
|
|||||||
),
|
),
|
||||||
}),
|
}),
|
||||||
columnHelper.accessor('email', {
|
columnHelper.accessor('email', {
|
||||||
header: () => <TableHeader viewName="Email" viewIcon={faEnvelope} />,
|
header: () => <ColumnHead viewName="Email" viewIcon={faEnvelope} />,
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<a href={`mailto:${props.row.original.email}`}>
|
<a href={`mailto:${props.row.original.email}`}>
|
||||||
{props.row.original.email}
|
{props.row.original.email}
|
||||||
@ -123,7 +121,7 @@ const columns = [
|
|||||||
),
|
),
|
||||||
}),
|
}),
|
||||||
columnHelper.accessor('company', {
|
columnHelper.accessor('company', {
|
||||||
header: () => <TableHeader viewName="Company" viewIcon={faBuildings} />,
|
header: () => <ColumnHead viewName="Company" viewIcon={faBuildings} />,
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<CellLink
|
<CellLink
|
||||||
name={props.row.original.company.name}
|
name={props.row.original.company.name}
|
||||||
@ -133,7 +131,7 @@ const columns = [
|
|||||||
),
|
),
|
||||||
}),
|
}),
|
||||||
columnHelper.accessor('phone', {
|
columnHelper.accessor('phone', {
|
||||||
header: () => <TableHeader viewName="Phone" viewIcon={faPhone} />,
|
header: () => <ColumnHead viewName="Phone" viewIcon={faPhone} />,
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<a
|
<a
|
||||||
href={parsePhoneNumber(
|
href={parsePhoneNumber(
|
||||||
@ -149,7 +147,7 @@ const columns = [
|
|||||||
),
|
),
|
||||||
}),
|
}),
|
||||||
columnHelper.accessor('creationDate', {
|
columnHelper.accessor('creationDate', {
|
||||||
header: () => <TableHeader viewName="Creation" viewIcon={faCalendar} />,
|
header: () => <ColumnHead viewName="Creation" viewIcon={faCalendar} />,
|
||||||
cell: (props) =>
|
cell: (props) =>
|
||||||
new Intl.DateTimeFormat(undefined, {
|
new Intl.DateTimeFormat(undefined, {
|
||||||
month: 'short',
|
month: 'short',
|
||||||
@ -158,7 +156,7 @@ const columns = [
|
|||||||
}).format(props.row.original.creationDate),
|
}).format(props.row.original.creationDate),
|
||||||
}),
|
}),
|
||||||
columnHelper.accessor('pipe', {
|
columnHelper.accessor('pipe', {
|
||||||
header: () => <TableHeader viewName="Pipe" viewIcon={faRectangleList} />,
|
header: () => <ColumnHead viewName="Pipe" viewIcon={faRectangleList} />,
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<CellLink
|
<CellLink
|
||||||
name={props.row.original.pipe.name}
|
name={props.row.original.pipe.name}
|
||||||
@ -168,7 +166,7 @@ const columns = [
|
|||||||
),
|
),
|
||||||
}),
|
}),
|
||||||
columnHelper.accessor('city', {
|
columnHelper.accessor('city', {
|
||||||
header: () => <TableHeader viewName="City" viewIcon={faMapPin} />,
|
header: () => <ColumnHead viewName="City" viewIcon={faMapPin} />,
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user