All files / src/pages/inventory/components InventoryDialogs.tsx

100% Statements 156/156
88.88% Branches 8/9
100% Functions 7/7
100% Lines 156/156

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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 1571x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x  
/**
 * @file InventoryDialogs.tsx
 * @module pages/inventory/components/InventoryDialogs
 *
 * @summary
 * Dialog components for inventory management operations.
 * Extracted from InventoryBoard for cleaner orchestration.
 *
 * @enterprise
 * - Pure presentation component for dialogs
 * - No internal state, all controlled via props
 * - Single responsibility: render dialog collection
 */
 
import * as React from 'react';
import { ItemFormDialog } from '../dialogs/ItemFormDialog';
import { EditItemDialog } from '../dialogs/EditItemDialog';
import DeleteItemDialog from '../dialogs/DeleteItemDialog/DeleteItemDialog';
import { QuantityAdjustDialog } from '../dialogs/QuantityAdjustDialog';
import { PriceChangeDialog } from '../dialogs/PriceChangeDialog';
import type { InventoryRow } from '../../../api/inventory/types';
 
/**
 * Props for InventoryDialogs component.
 * 
 * @interface InventoryDialogsProps
 * @property {boolean} openNew - ItemFormDialog visibility for new item
 * @property {() => void} setOpenNew - Callback to toggle new item dialog
 * @property {boolean} openEditName - EditItemDialog visibility
 * @property {() => void} setOpenEditName - Callback to toggle edit name dialog
 * @property {boolean} openDelete - DeleteItemDialog visibility
 * @property {() => void} setOpenDelete - Callback to toggle delete dialog
 * @property {boolean} openEdit - ItemFormDialog visibility for edit existing
 * @property {() => void} setOpenEdit - Callback to toggle edit item dialog
 * @property {boolean} openAdjust - QuantityAdjustDialog visibility
 * @property {() => void} setOpenAdjust - Callback to toggle adjust quantity dialog
 * @property {boolean} openPrice - PriceChangeDialog visibility
 * @property {() => void} setOpenPrice - Callback to toggle price change dialog
 * @property {InventoryRow | null} selectedRow - Currently selected inventory item
 * @property {() => void} onReload - Callback when dialog mutation completes
 * @property {boolean} isDemo - Whether user is in demo mode (read-only)
 */
interface InventoryDialogsProps {
  openNew: boolean;
  setOpenNew: (open: boolean) => void;
  openEditName: boolean;
  setOpenEditName: (open: boolean) => void;
  openDelete: boolean;
  setOpenDelete: (open: boolean) => void;
  openEdit: boolean;
  setOpenEdit: (open: boolean) => void;
  openAdjust: boolean;
  setOpenAdjust: (open: boolean) => void;
  openPrice: boolean;
  setOpenPrice: (open: boolean) => void;
  selectedRow: InventoryRow | null;
  onReload: () => void;
  isDemo: boolean;
}
 
/**
 * Inventory dialog collection component.
 * 
 * Renders all 5 inventory management dialogs:
 * - ItemForm (create new item)
 * - EditItemDialog (rename item)
 * - DeleteItemDialog (delete item)
 * - ItemForm (edit existing item)
 * - QuantityAdjustDialog
 * - PriceChangeDialog
 * 
 * @component
 * @param props - Component props
 * @returns JSX element with all dialogs
 * 
 * @example
 * ```tsx
 * <InventoryDialogs
 *   openNew={state.openNew}
 *   setOpenNew={state.setOpenNew}
 *   selectedRow={selectedRow}
 *   onReload={handleReload}
 *   isDemo={isDemo}
 *   {...otherDialogProps}
 * />
 * ```
 */
export const InventoryDialogs: React.FC<InventoryDialogsProps> = ({
  openNew,
  setOpenNew,
  openEditName,
  setOpenEditName,
  openDelete,
  setOpenDelete,
  openEdit,
  setOpenEdit,
  openAdjust,
  setOpenAdjust,
  openPrice,
  setOpenPrice,
  selectedRow,
  onReload,
  isDemo,
}) => {
  return (
    <>
      <ItemFormDialog
        isOpen={openNew}
        onClose={() => setOpenNew(false)}
        onSaved={onReload}
      />
 
      <EditItemDialog
        open={openEditName}
        onClose={() => setOpenEditName(false)}
        onItemRenamed={onReload}
      />
 
      <DeleteItemDialog
        open={openDelete}
        onClose={() => setOpenDelete(false)}
        onItemDeleted={onReload}
        readOnly={isDemo}
      />
 
      {selectedRow && (
        <ItemFormDialog
          isOpen={openEdit}
          initial={{
            id: selectedRow.id,
            name: selectedRow.name,
            code: selectedRow.code ?? '',
            supplierId: selectedRow.supplierId,
            onHand: selectedRow.onHand,
          }}
          onClose={() => setOpenEdit(false)}
          onSaved={onReload}
        />
      )}
 
      <QuantityAdjustDialog
        open={openAdjust}
        onClose={() => setOpenAdjust(false)}
        onAdjusted={onReload}
        readOnly={isDemo}
      />
 
      <PriceChangeDialog
        open={openPrice}
        onClose={() => setOpenPrice(false)}
        onPriceChanged={onReload}
        readOnly={isDemo}
      />
    </>
  );
};