export function useOverridesManualEditDSL()

in frontend/apps/quantgrid/src/app/hooks/useOverridesManualEditDSL.ts [12:185]


export function useOverridesManualEditDSL() {
  const { sheetContent } = useContext(ProjectContext);
  const { updateDSL, findTable } = useDSLUtils();
  const { gridService } = useContext(SpreadsheetContext);
  const { append } = useContext(UndoRedoContext);

  const removeOverride = useCallback(
    (
      tableName: string,
      fieldName: string,
      overrideIndex: number,
      value: string
    ) => {
      const table = findTable(tableName);

      if (!table?.dslOverridePlacement || !table?.overrides || !sheetContent)
        return;

      const { overrides, dslOverridePlacement } = table;
      const { start, end } = dslOverridePlacement;
      overrides.updateFieldValueByIndex(fieldName, overrideIndex, null);
      const updatedOverride = overrides.convertToDsl();
      const overrideDsl = updatedOverride
        ? `override${newLine}${updatedOverride}${newLine}${newLine}`
        : '';

      const updatedSheetContent =
        sheetContent.substring(0, start) +
        overrideDsl +
        sheetContent.substring(end + 1);

      updateDSL(updatedSheetContent);

      append(
        `Remove override ${value} from table "${tableName}"`,
        updatedSheetContent
      );
    },
    [append, findTable, sheetContent, updateDSL]
  );

  const editOverride = useCallback(
    (
      tableName: string,
      fieldName: string,
      overrideIndex: number,
      value: string
    ) => {
      const table = findTable(tableName);

      if (!table?.dslOverridePlacement || !table?.overrides || !sheetContent)
        return;

      const { overrides, dslOverridePlacement } = table;
      const { start, end } = dslOverridePlacement;
      overrides.updateFieldValueByIndex(fieldName, overrideIndex, value);
      const updatedOverride = overrides.convertToDsl();

      const updatedSheetContent =
        sheetContent.substring(0, start) +
        `override${newLine}${updatedOverride}${newLine}` +
        sheetContent.substring(end + 1);

      updateDSL(updatedSheetContent);

      append(
        `Edit override ${value} in table "${tableName}"`,
        updatedSheetContent
      );
    },
    [append, findTable, sheetContent, updateDSL]
  );

  const addOverride = useCallback(
    (tableName: string, fieldName: string, tableRow: number, value: string) => {
      const table = findTable(tableName);

      if (!table || !sheetContent || !table.dslPlacement) return;

      if (!table.overrides) {
        table.overrides = new ParsedOverride('');
        const keys = table.fields
          .filter((f) => f.isKey)
          .map((f) => f.key.fieldName);
        table.overrides.keys = new Set(keys);
      }

      const { overrides, dslPlacement, dslOverridePlacement } = table;

      if (table.isManual()) {
        overrides?.setFieldValueByIndex(fieldName, tableRow, value);
      } else if (table.hasKeys()) {
        const [startRow, startCol] = table.getPlacement();
        const sheetRow = tableRow + startRow + 2;
        const keys: Record<string, string> = {};

        overrides.keys.forEach((key) => {
          const tableFieldIndex = table.fields.findIndex(
            (f) => f.key.fieldName === key
          );
          const sheetCol = tableFieldIndex + startCol;
          const cell = gridService?.getCellValue(sheetRow, sheetCol);
          key && cell?.value && (keys[key] = cell.value);
        });

        overrides.setValueByKeys(keys, fieldName, value);
      } else {
        overrides.setFieldValueByKey(
          defaultRowKey,
          tableRow + 1,
          fieldName,
          value
        );
      }

      let start = 0;
      let end = 0;
      const { stopOffset } = dslPlacement;

      if (dslOverridePlacement) {
        start = dslOverridePlacement.start;
        end = dslOverridePlacement.end;
      } else {
        start = end = stopOffset + 1;
      }

      const updatedOverride = overrides?.convertToDsl();
      const updatedSheetContent =
        sheetContent.substring(0, start).trimEnd() +
        `${newLine}override${newLine}${updatedOverride}${newLine}${newLine}` +
        sheetContent.substring(end + 1);

      updateDSL(updatedSheetContent);

      append(
        `Add override ${value} to table "${tableName}"`,
        updatedSheetContent
      );
    },
    [append, findTable, gridService, sheetContent, updateDSL]
  );

  const renameOverrideField = useCallback(
    (tableName: string, oldFieldName: string, newFieldName: string) => {
      const targetTable = findTable(tableName);

      if (
        !targetTable?.dslOverridePlacement ||
        !targetTable?.overrides ||
        !sheetContent
      )
        return '';

      const { overrides, dslOverridePlacement } = targetTable;
      const { start, end } = dslOverridePlacement;
      overrides?.renameField(oldFieldName, newFieldName);
      const updatedOverride = overrides.convertToDsl();

      return (
        sheetContent.substring(0, start) +
        `override${newLine}${updatedOverride}${newLine}${newLine}${newLine}` +
        sheetContent.substring(end + 1)
      );
    },
    [findTable, sheetContent]
  );

  return {
    addOverride,
    editOverride,
    removeOverride,
    renameOverrideField,
  };
}