All files / src/form/fullTextSearchList FullTextSearchListComponent.tsx

2.04% Statements 1/49
0% Branches 0/14
0% Functions 0/18
2.27% Lines 1/44

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                                            66x                                                                                                                                                                                                                
import React, { ReactElement, useCallback, useEffect, useReducer, useState } from 'react';
import { fetchDomainMeta, fetchCanCreate, fetchFormExtInfo } from '@utils/FetchUtils';
import { FormProps, RecordProps, TableMetaProps } from '@props/RecordProps';
import { PageHeader } from '../../form';
import { LargeSpin } from '../../components';
import './App.less';
import FullTextSearchPanel from './FullTextSearchPanel';
import { dataReducer, initData } from "@utils/hooks";
 
export interface WithSearchListProps {
  domainName: string;
  formId: number;
  zIndex: number;
  setOwnerIds?: (ownerIds: Array<number>) => void;
  initShowCreateModal?: boolean;
  initDomainId?: number;
  hideHeaderTitle?: boolean;
  ownerClass?: string;
  ownerIds?: Array<number>;
  ownerClassColumnName?: string;
}
 
const FullTextSearchListComponent = (props: WithSearchListProps): ReactElement => {
  const {
    domainName, formId, zIndex, initDomainId, initShowCreateModal, hideHeaderTitle,
    ownerClass, ownerIds, ownerClassColumnName, setOwnerIds
  } = props;
  const [canCreate, setCanCreate] = useState<boolean>(false);
  const [columns, setColumns] = useState<Array<TableMetaProps>>([] as TableMetaProps[]);
  const [loading, setLoading] = useState<boolean>(true);
  const [contentDisplayColumns, setContentDisplayColumns] = useState<Array<TableMetaProps>>([]);
  const [fullTextSearchColumns, setFullTextSearchColumns] = useState<Array<TableMetaProps>>([]);
  const [additionalSearchColumns, setAdditionalSearchColumns] = useState<Array<TableMetaProps>>([]);
  const [panelDisplayColumns, setPanelDisplayColumns] = useState<Array<TableMetaProps>>([]);
  const [sortColumns, setSortColumns] = useState<Array<TableMetaProps>>([]);
  const [willRefreshData, setWillRefreshData] = useState<boolean>(false);
  const [formExtInfo, setFormExtInfo] = useState<FormProps>();
  const [dataState, dataDispatch] = useReducer(dataReducer, initData);
  useEffect(() => {
    setLoading(true);
    fetchCanCreate(domainName).then(json => {
      setCanCreate(json.create);
    }).catch(e => console.error(`Failed to get canCreate of ${domainName}: ${e}`));
    fetchFormExtInfo(formId).then((formProps: FormProps) => {
      setFormExtInfo(formProps);
    });
    fetchDomainMeta(domainName, formId).then((meta: Array<TableMetaProps>) => {
      setColumns(meta);
      setContentDisplayColumns(meta.filter(c => c.groupName?.startsWith('contentDisplayGroup')));
      setFullTextSearchColumns(meta.filter(c => c.groupName?.startsWith('fullTextSearchConditionGroup')));
      setAdditionalSearchColumns(meta.filter(c => c.groupName?.startsWith('additionalSearchConditionGroup')));
      setSortColumns(meta.filter(c => c.groupName?.startsWith('sortingConditionGroup')));
      setPanelDisplayColumns(meta.filter(c => c.groupName?.startsWith('panelDisplayGroup')));
      return meta;
    })
      .finally(() => setLoading(false))
      .catch(e => console.error(`Failed to get form ${formId} for domain ${domainName}: ${e}`));
 
  }, [domainName, formId]);
 
  const refreshDataCallback = useCallback((): void => {
    setWillRefreshData(true);
  }, []);
 
  return loading ? (<LargeSpin />) : (
    <div className='with-search-container'>
      {hideHeaderTitle !== true &&
        <PageHeader
          initDomainId={initDomainId}
          initShowCreateModal={initShowCreateModal}
          listForm={formExtInfo ?? {} as FormProps}
          tableMode={"table-list"}
          domainName={domainName}
          data={dataState.data ?? []}
          selectedData={dataState.selectedData ?? []}
          columns={columns}
          enumValues={{}}
          objectValues={{}}
          setData={(data: Array<RecordProps>) => dataDispatch({ type: 'set', payload: { data } })}
          fetchDataCallback={() => refreshDataCallback()}
          initialCanCreate={canCreate}
          zIndex={zIndex + 1}
          ownerClass={ownerClass}
          ownerId={ownerIds?.[0]}
          columnNameInOwnerClass={ownerClassColumnName}
          dataState={dataState}
          dataDispatch={dataDispatch}
          createFormName={formExtInfo?.extInfo?.createFormName}
        />
      }
      <FullTextSearchPanel
        formExtInfo={formExtInfo}
        zIndex={zIndex}
        refreshData={willRefreshData}
        domainName={domainName}
        columns={columns}
        fetchDataCallback={(data: Array<RecordProps>) => {
          dataDispatch({ type: 'set', payload: { data } });
          setWillRefreshData(false);
        }}
        additionalSearchColumns={additionalSearchColumns}
        fullTextSearchColumns={fullTextSearchColumns}
        sortColumns={sortColumns}
        panelDisplayColumns={panelDisplayColumns}
        ownerClass={ownerClass}
        ownerIds={ownerIds}
        ownerClassColumnName={ownerClassColumnName}
        contentDisplayColumns={contentDisplayColumns}
        changeCallback={(record: RecordProps, selected: boolean): void => {
          const sd = (dataState.selectedData ?? []);
          if (selected) {
            dataDispatch({ type: 'set', payload: { selectedData: [...sd, record] } });
          } else {
            const index = sd.indexOf(record);
            const newSelectedData = sd.slice();
            newSelectedData.splice(index, 1);
            dataDispatch({ type: 'set', payload: { selectedData: newSelectedData } });
          }
        }}
        setOwnerIds={setOwnerIds}
      />
    </div>
  );
};
 
export default FullTextSearchListComponent;