All files / libs/assignments/quotas/components/src/lib/user-quota-assignments-table UserQuotaAssignmentsBaseTable.tsx

0% Statements 0/95
0% Branches 0/1
0% Functions 0/1
0% Lines 0/95

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96                                                                                                                                                                                               
import { memo, useMemo } from 'react';

import {
  ColumnHelper,
  DataGrid,
  SortDirection,
  Table,
  useControlledDataGridData,
  useDataGridState,
  type ColumnDefinitionBase,
  type TableProps,
} from '@allshares/studio-design-system';
import { type UserQuotaAssignments } from '@amalia/assignments/quotas/types';
import { canAssignValuesToQuotas } from '@amalia/kernel/auth/shared';
import { useAbilityContext } from '@amalia/kernel/auth/state';
import { type UserProfile } from '@amalia/tenants/users/profile/types';
import { formatUserFullName } from '@amalia/tenants/users/types';

import { QuotaAssignmentDeleteAllAssignmentsAction } from '../quota-assignments-datagrid/cells/actions/delete-all-assignments/QuotaAssignmentDeleteAllAssignmentsAction';
import { QuotaTableNameCell } from '../quota-table/cell/QuotaTableNameCell';

export type UserQuotaAssignmentsBaseTableData = UserQuotaAssignments;

export type UserQuotaAssignmentsBaseTableProps = Omit<
  TableProps<UserQuotaAssignmentsBaseTableData, string>,
  'rowKey'
> & {
  readonly nameTitle?: ColumnDefinitionBase['header'];
  readonly user: Pick<UserProfile, 'firstName' | 'id' | 'lastName'>;
  readonly referenceDate?: Date;
};

export const columnHelper = new ColumnHelper<UserQuotaAssignmentsBaseTableData>();

const rowKey = (row: UserQuotaAssignmentsBaseTableData) => row.quota.id;

export const UserQuotaAssignmentsBaseTable = memo(function UserQuotaAssignmentsBaseTable({
  columns: valueColumns,
  data,
  nameTitle,
  user,
  referenceDate,
  ...props
}: UserQuotaAssignmentsBaseTableProps) {
  const ability = useAbilityContext();

  const { columnSorting } = useDataGridState({
    columnSorting: [{ id: 'name', direction: SortDirection.ASC }],
  });

  const columns = useMemo(
    () => [
      columnHelper.display({
        id: 'name',
        header: nameTitle ?? '',
        cell: ({ row: { quota } }) => <QuotaTableNameCell quota={quota} />,
        sortingFn: (a, b) => DataGrid.sortingFn.strings(a.quota.name, b.quota.name),
        size: 308,
      }),
      ...valueColumns,
      columnHelper.display({
        id: Table.Cell.Actions.columnId,
        header: '',
        size: null,
        cell: ({ row: userQuotaAssignments }) => (
          <Table.Cell.Actions>
            {canAssignValuesToQuotas(ability) && (
              <QuotaAssignmentDeleteAllAssignmentsAction
                entityName={formatUserFullName(user)}
                quota={userQuotaAssignments.quota}
                quotaAssignments={userQuotaAssignments.assignmentsByStartDate}
                referenceDate={referenceDate}
              />
            )}
          </Table.Cell.Actions>
        ),
      }),
    ],
    [valueColumns, nameTitle, ability, user, referenceDate],
  );

  const { data: controlledData } = useControlledDataGridData(columns, data, {
    columnSorting,
  });

  return (
    <Table<UserQuotaAssignmentsBaseTableData, string>
      {...props}
      pinFirstColumn
      columns={columns}
      data={controlledData}
      rowKey={rowKey}
    />
  );
});