export function useFormulaInput()

in frontend/apps/quantgrid/src/app/components/FormulaBar/utils/useFormulaInput.ts [22:142]


export function useFormulaInput() {
  const { projectName, openStatusModal } = useContext(ProjectContext);
  const { formulaBarMode } = useContext(AppContext);
  const { findTableField, findTable } = useDSLUtils();
  const { editOverride, addOverride } = useOverridesManualEditDSL();
  const {
    editExpressionWithOverrideRemove,
    editExpression,
    renameField,
    renameTable,
  } = useManualEditDSL();
  const { submitCellEditor } = useSubmitCellEditor();
  const { addTotalExpression, editTotalExpression } = useTotalManualEditDSL();
  const gridApi = useGridApi();

  const getSelectedCellValue = useCallback(
    (selectedCell: SelectedCell | null, fieldName?: string): string | null => {
      const { Table, Field, Override, Cell, EmptyCell, Total } =
        SelectedCellType;

      if (!selectedCell || (!fieldName && selectedCell.type === Table)) {
        return null;
      }
      const { type, overrideValue, tableName, value, totalIndex } =
        selectedCell;

      if (type === EmptyCell) return '';
      if (type === Total) {
        if (formulaBarMode === 'value') return selectedCell.value || '';

        if (!tableName || !totalIndex) return null;

        const table = findTable(tableName);

        if (!table) return null;

        const fieldTotal = table.total?.getFieldTotalByIndex(
          fieldName || selectedCell.fieldName || '',
          totalIndex
        );

        if (!fieldTotal) return '=';

        return `=${extractExpression(fieldTotal.expression)}`;
      }
      if (type === Override || (type === Cell && formulaBarMode === 'value'))
        return isOverrideValueFormula(overrideValue) &&
          formulaBarMode === 'formula'
          ? `=${extractExpression(overrideValue?.toString())}`
          : selectedCell.value || '';

      if ([Field, Table, Cell].includes(type)) {
        if (!tableName) return null;

        const field = findTableField(
          tableName,
          fieldName || selectedCell?.fieldName || value || ''
        );

        if (!field || !field.expressionMetadata) return null;

        return `=${extractExpression(field.expressionMetadata.text)}`;
      }

      return null;
    },
    [findTable, findTableField, formulaBarMode]
  );

  const saveFormulaInputValue = useCallback(
    (
      code: string,
      selectedCell: SelectedCell | null,
      editMode: GridCellEditorMode,
      dimFieldName?: string
    ) => {
      if (!projectName || !selectedCell || !gridApi) return;

      const cell = gridApi.getCell(selectedCell.col, selectedCell.row);

      return cellEditorSaveValue({
        editMode,
        currentCell: selectedCell,
        cell,
        value: code,
        gridCallbacks: {
          onAddOverride: addOverride,
          onAddTotalExpression: addTotalExpression,
          onCellEditorSubmit: submitCellEditor,
          onEditExpression: editExpression,
          onEditExpressionWithOverrideRemove: editExpressionWithOverrideRemove,
          onEditOverride: editOverride,
          onEditTotalExpression: editTotalExpression,
          onRenameField: renameField,
          onRenameTable: renameTable,
        },
        dimFieldName,
        openStatusModal,
      });
    },
    [
      projectName,
      gridApi,
      addOverride,
      addTotalExpression,
      submitCellEditor,
      editExpression,
      editExpressionWithOverrideRemove,
      editOverride,
      editTotalExpression,
      renameField,
      renameTable,
      openStatusModal,
    ]
  );

  return {
    saveFormulaInputValue,
    getSelectedCellValue,
  };
}