import { FaRegBuilding, FaCalendar, FaEnvelope, FaRegUser, FaMapPin, FaPhone, FaUser, FaBuilding, } from 'react-icons/fa'; import { CellContext, createColumnHelper } from '@tanstack/react-table'; import ColumnHead from '../../components/table/ColumnHead'; import Checkbox from '../../components/form/Checkbox'; import CompanyChip, { CompanyChipPropsType, } from '../../components/chips/CompanyChip'; import { GraphqlQueryPerson, Person } from '../../interfaces/person.interface'; import EditableText from '../../components/table/editable-cell/EditableText'; import { FilterType, SortType, } from '../../components/table/table-header/interface'; import { Order_By, People_Bool_Exp, People_Order_By, } from '../../generated/graphql'; import { SEARCH_COMPANY_QUERY, SEARCH_PEOPLE_QUERY, } from '../../services/search/search'; import { GraphqlQueryCompany, PartialCompany, } from '../../interfaces/company.interface'; import EditablePhone from '../../components/table/editable-cell/EditablePhone'; import EditableFullName from '../../components/table/editable-cell/EditableFullName'; import EditableDate from '../../components/table/editable-cell/EditableDate'; import EditableRelation from '../../components/table/editable-cell/EditableRelation'; import { updatePerson } from '../../services/people'; import { useMemo } from 'react'; import { SelectAllCheckbox } from '../../components/table/SelectAllCheckbox'; export const availableSorts = [ { key: 'fullname', label: 'People', icon: , _type: 'custom_sort', orderByTemplate: (order: Order_By) => ({ firstname: order, lastname: order, }), }, { key: 'company_name', label: 'Company', icon: , _type: 'custom_sort', orderByTemplate: (order: Order_By) => ({ company: { name: order } }), }, { key: 'email', label: 'Email', icon: , _type: 'default_sort', }, { key: 'phone', label: 'Phone', icon: , _type: 'default_sort', }, { key: 'created_at', label: 'Created at', icon: , _type: 'default_sort', }, { key: 'city', label: 'City', icon: , _type: 'default_sort', }, ] satisfies Array>; const fullnameFilter = { key: 'fullname', label: 'People', icon: , whereTemplate: (operand, { firstname, lastname }) => { if (operand.keyWord === 'equal') { return { _and: [ { firstname: { _eq: `${firstname}` } }, { lastname: { _eq: `${lastname}` } }, ], }; } if (operand.keyWord === 'not_equal') { return { _not: { _and: [ { firstname: { _eq: `${firstname}` } }, { lastname: { _eq: `${lastname}` } }, ], }, }; } }, searchQuery: SEARCH_PEOPLE_QUERY, searchTemplate: (searchInput: string) => ({ _or: [ { firstname: { _ilike: `%${searchInput}%` } }, { lastname: { _ilike: `%${searchInput}%` } }, ], }), searchResultMapper: (person: GraphqlQueryPerson) => ({ displayValue: `${person.firstname} ${person.lastname}`, value: { firstname: person.firstname, lastname: person.lastname }, }), operands: [ { label: 'Equal', id: 'equal', keyWord: 'equal' }, { label: 'Not equal', id: 'not-equal', keyWord: 'not_equal' }, ], } satisfies FilterType; const companyFilter = { key: 'company_name', label: 'Company', icon: , whereTemplate: (operand, { companyName }) => { if (operand.keyWord === 'equal') { return { company: { name: { _eq: companyName } }, }; } if (operand.keyWord === 'not_equal') { return { _not: { company: { name: { _eq: companyName } } }, }; } }, searchQuery: SEARCH_COMPANY_QUERY, searchTemplate: (searchInput: string) => ({ name: { _ilike: `%${searchInput}%` }, }), searchResultMapper: (company: GraphqlQueryCompany) => ({ displayValue: company.name, value: { companyName: company.name }, }), operands: [ { label: 'Equal', id: 'equal', keyWord: 'equal' }, { label: 'Not equal', id: 'not-equal', keyWord: 'not_equal' }, ], } satisfies FilterType; const emailFilter = { key: 'email', label: 'Email', icon: , whereTemplate: (operand, { email }) => { if (operand.keyWord === 'equal') { return { email: { _eq: email }, }; } if (operand.keyWord === 'not_equal') { return { _not: { email: { _eq: email } }, }; } }, searchQuery: SEARCH_PEOPLE_QUERY, searchTemplate: (searchInput: string) => ({ email: { _ilike: `%${searchInput}%` }, }), searchResultMapper: (person: GraphqlQueryPerson) => ({ displayValue: person.email, value: { email: person.email }, }), operands: [ { label: 'Equal', id: 'equal', keyWord: 'equal' }, { label: 'Not equal', id: 'not-equal', keyWord: 'not_equal' }, ], } satisfies FilterType; const cityFilter = { key: 'city', label: 'City', icon: , whereTemplate: (operand, { city }) => { if (operand.keyWord === 'equal') { return { city: { _eq: city }, }; } if (operand.keyWord === 'not_equal') { return { _not: { city: { _eq: city } }, }; } }, searchQuery: SEARCH_PEOPLE_QUERY, searchTemplate: (searchInput: string) => ({ city: { _ilike: `%${searchInput}%` }, }), searchResultMapper: (person: GraphqlQueryPerson) => ({ displayValue: person.city, value: { city: person.city }, }), operands: [ { label: 'Equal', id: 'equal', keyWord: 'equal' }, { label: 'Not equal', id: 'not-equal', keyWord: 'not_equal' }, ], } satisfies FilterType; export const availableFilters = [ fullnameFilter, companyFilter, emailFilter, cityFilter, // { // key: 'phone', // label: 'Phone', // icon: faPhone, // whereTemplate: () => ({ phone: { _ilike: '%value%' } }), // searchQuery: GET_PEOPLE, // searchTemplate: { phone: { _ilike: '%value%' } }, // }, // { // key: 'created_at', // label: 'Created at', // icon: faCalendar, // whereTemplate: () => ({ created_at: { _eq: '%value%' } }), // searchQuery: GET_PEOPLE, // searchTemplate: { created_at: { _eq: '%value%' } }, // }, ] satisfies FilterType[]; const columnHelper = createColumnHelper(); export const usePeopleColumns = () => { return useMemo(() => { return [ { id: 'select', header: ({ table }: any) => ( ), cell: (props: CellContext) => ( ), }, columnHelper.accessor('firstname', { header: () => } />, cell: (props) => ( { const person = props.row.original; person.firstname = firstName; person.lastname = lastName; updatePerson(person); }} /> ), }), columnHelper.accessor('email', { header: () => } />, cell: (props) => ( { const person = props.row.original; person.email = value; updatePerson(person); }} /> ), }), columnHelper.accessor('company', { header: () => ( } /> ), cell: (props) => ( relation={props.row.original.company} searchPlaceholder="Company" ChipComponent={CompanyChip} chipComponentPropsMapper={( company: PartialCompany, ): CompanyChipPropsType => { return { name: company.name, picture: `https://www.google.com/s2/favicons?domain=${company.domain_name}&sz=256`, }; }} changeHandler={(relation: PartialCompany) => { const person = props.row.original; if (person.company) { person.company.id = relation.id; } else { person.company = { id: relation.id, name: relation.name, domain_name: relation.domain_name, }; } updatePerson(person); }} searchFilter={ { key: 'company_name', label: 'Company', icon: , whereTemplate: () => { return {}; }, searchQuery: SEARCH_COMPANY_QUERY, searchTemplate: (searchInput: string) => ({ name: { _ilike: `%${searchInput}%` }, }), searchResultMapper: (company: GraphqlQueryCompany) => ({ displayValue: company.name, value: { id: company.id, name: company.name, domain_name: company.domain_name, }, }), operands: [], } satisfies FilterType } /> ), }), columnHelper.accessor('phone', { header: () => } />, cell: (props) => ( { const person = props.row.original; person.phone = value; updatePerson(person); }} /> ), }), columnHelper.accessor('creationDate', { header: () => ( } /> ), cell: (props) => ( { const person = props.row.original; person.creationDate = value; updatePerson(person); }} /> ), }), columnHelper.accessor('city', { header: () => } />, cell: (props) => ( { const person = props.row.original; person.city = value; updatePerson(person); }} /> ), }), ]; }, []); };