????

Your IP : 216.73.216.188


Current Path : C:/opt/pgsql/pgAdmin 4/web/pgadmin/tools/sqleditor/static/js/components/dialogs/
Upload File :
Current File : C:/opt/pgsql/pgAdmin 4/web/pgadmin/tools/sqleditor/static/js/components/dialogs/FilterDialog.jsx

/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2024, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import { makeStyles } from '@mui/styles';
import React from 'react';
import SchemaView from '../../../../../../static/js/SchemaView';
import BaseUISchema from '../../../../../../static/js/SchemaView/base_schema.ui';
import gettext from 'sources/gettext';
import { QueryToolContext } from '../QueryToolComponent';
import url_for from 'sources/url_for';
import PropTypes from 'prop-types';

class SortingCollection extends BaseUISchema {
  constructor(columnOptions) {
    super({
      name: undefined,
      order: 'asc',
    });
    this.columnOptions = columnOptions;
    this.reloadColOptions = 0;
  }

  setColumnOptions(columnOptions) {
    this.columnOptions = columnOptions;
    this.reloadColOptions = this.reloadColOptions + 1;
  }

  get baseFields() {
    return [
      {
        id: 'name', label: gettext('Column'), cell: 'select', controlProps: {
          allowClear: false,
        }, noEmpty: true, options: this.columnOptions, optionsReloadBasis: this.reloadColOptions
      },
      {
        id: 'order', label: gettext('Order'), cell: 'select', controlProps: {
          allowClear: false,
        }, options: [
          {label: gettext('ASC'), value: 'asc'},
          {label: gettext('DESC'), value: 'desc'},
        ]
      },
    ];
  }
}

class FilterSchema extends BaseUISchema {
  constructor(columnOptions) {
    super({
      sql: null,
      data_sorting: [],
    });
    this.sortingCollObj = new SortingCollection(columnOptions);
  }

  setColumnOptions(columnOptions) {
    this.sortingCollObj.setColumnOptions(columnOptions);
  }

  get baseFields() {
    let obj = this;
    return [
      {
        id: 'sql', label: gettext('SQL Filter'), type: 'sql', controlProps: {
          options: {
            lineWrapping: true,
          },
        }
      },
      {
        id: 'data_sorting', label: gettext('Data Sorting'), type: 'collection', schema: obj.sortingCollObj,
        group: 'temp', uniqueCol: ['name'], canAdd: true, canEdit: false, canDelete: true,
      },
    ];
  }
}

const useStyles = makeStyles((theme)=>({
  root: {
    ...theme.mixins.tabPanel,
  },
}));

export default function FilterDialog({onClose, onSave}) {
  const classes = useStyles();
  const queryToolCtx = React.useContext(QueryToolContext);
  const filterSchemaObj = React.useMemo(()=>new FilterSchema([]));

  const getInitData = ()=>{
    return new Promise((resolve, reject)=>{
      const getFilterData = async ()=>{
        try {
          let {data: respData} = await queryToolCtx.api.get(url_for('sqleditor.get_filter_data', {
            'trans_id': queryToolCtx.params.trans_id,
          }));
          let {column_list: columns, ...filterData} = respData.data.result;
          filterSchemaObj.setColumnOptions((columns||[]).map((c)=>({label: c, value: c})));
          resolve(filterData);
        } catch (error) {
          reject(error);
        }
      };
      getFilterData();
    });
  };

  const onSaveClick = (_isNew, changeData)=>{
    return new Promise((resolve, reject)=>{
      const setFilterData = async ()=>{
        try {
          let {data: respData} = await queryToolCtx.api.put(url_for('sqleditor.set_filter_data', {
            'trans_id': queryToolCtx.params.trans_id,
          }), changeData);
          if(respData.data.status) {
            resolve();
            onSave();
          } else {
            reject(respData.data.result);
          }
        } catch (error) {
          reject(error);
        }
      };
      setFilterData();
    });
  };

  return (
    <SchemaView
      formType={'dialog'}
      getInitData={getInitData}
      schema={filterSchemaObj}
      viewHelperProps={{
        mode: 'create',
      }}
      onSave={onSaveClick}
      onClose={onClose}
      hasSQL={false}
      disableSqlHelp={true}
      disableDialogHelp={true}
      isTabView={false}
      formClassName={classes.root}
      checkDirtyOnEnableSave={true}
    />
  );
}

FilterDialog.propTypes = {
  onClose: PropTypes.func,
  onSave: PropTypes.func,
};