import { useMemo } from 'react'; import { CellContext, createColumnHelper } from '@tanstack/react-table'; import { SEARCH_COMPANY_QUERY } from '../../services/api/search/search'; import { SearchConfigType } from '../../interfaces/search/interface'; import { Company, mapToCompany, } from '../../interfaces/entities/company.interface'; import { Person } from '../../interfaces/entities/person.interface'; import { updatePerson } from '../../services/api/people'; import ColumnHead from '../../components/table/ColumnHead'; import Checkbox from '../../components/form/Checkbox'; import { SelectAllCheckbox } from '../../components/table/SelectAllCheckbox'; import EditablePhone from '../../components/editable-cell/EditablePhone'; import EditableFullName from '../../components/editable-cell/EditableFullName'; import EditableDate from '../../components/editable-cell/EditableDate'; import EditableText from '../../components/editable-cell/EditableText'; import EditableRelation from '../../components/editable-cell/EditableRelation'; import CompanyChip, { CompanyChipPropsType, } from '../../components/chips/CompanyChip'; import { TbBuilding, TbCalendar, TbMail, TbMapPin, TbPhone, TbUser, } from 'react-icons/tb'; import { QueryMode } from '../../generated/graphql'; const columnHelper = createColumnHelper(); export const usePeopleColumns = () => { return useMemo(() => { return [ { id: 'select', header: ({ table }: any) => ( ), cell: (props: CellContext) => ( ), size: 25, }, columnHelper.accessor('firstname', { header: () => ( } /> ), cell: (props) => ( { const person = props.row.original; person.firstname = firstName; person.lastname = lastName; updatePerson(person); }} /> ), size: 200, }), columnHelper.accessor('email', { header: () => ( } /> ), cell: (props) => ( { const person = props.row.original; person.email = value; updatePerson(person); }} /> ), size: 200, }), columnHelper.accessor('company', { header: () => ( } /> ), cell: (props) => ( relation={props.row.original.company} searchPlaceholder="Company" ChipComponent={CompanyChip} chipComponentPropsMapper={(company): CompanyChipPropsType => { return { name: company.name || '', picture: `https://www.google.com/s2/favicons?domain=${company.domainName}&sz=256`, }; }} changeHandler={(relation) => { const person = props.row.original; if (person.company) { person.company.id = relation.id; } else { person.company = relation; } updatePerson(person); }} searchConfig={ { query: SEARCH_COMPANY_QUERY, template: (searchInput: string) => ({ name: { contains: `%${searchInput}%`, mode: QueryMode.Insensitive, }, }), resultMapper: (company) => ({ render: (company) => company.name, value: mapToCompany(company), }), } satisfies SearchConfigType } /> ), size: 150, }), columnHelper.accessor('phone', { header: () => ( } /> ), cell: (props) => ( { const person = props.row.original; person.phone = value; updatePerson(person); }} /> ), size: 130, }), columnHelper.accessor('creationDate', { header: () => ( } /> ), cell: (props) => ( { const person = props.row.original; person.creationDate = value; updatePerson(person); }} /> ), size: 100, }), columnHelper.accessor('city', { header: () => ( } /> ), cell: (props) => ( { const person = props.row.original; person.city = value; updatePerson(person); }} /> ), }), ]; }, []); };