mirror of
				https://github.com/lingble/twenty.git
				synced 2025-10-31 04:37:56 +00:00 
			
		
		
		
	Rework Table Header
This commit is contained in:
		
							
								
								
									
										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> | ||||||
|       {viewName} |         <StyledIcon> | ||||||
|  |           {viewIcon && <FontAwesomeIcon icon={viewIcon} size="lg" />} | ||||||
|  |         </StyledIcon> | ||||||
|  |         {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} />, | ||||||
|   }), |   }), | ||||||
| ]; | ]; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Charles Bochet
					Charles Bochet