"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _immutable = _interopRequireDefault(require("immutable"));
var _reactIntl = require("react-intl");
var _get = _interopRequireDefault(require("lodash/get"));
var _InvocableSearchBar = _interopRequireDefault(require("../invocable/InvocableSearchBar"));
var _modalNames = require("../../constants/modalNames");
var _searchOperators = require("../../constants/searchOperators");
var _InvocationModalContainer = _interopRequireDefault(require("../../containers/invocable/InvocationModalContainer"));
var _RecordEditorContainer = _interopRequireDefault(require("../../containers/record/RecordEditorContainer"));
var _SearchPanelContainer = _interopRequireDefault(require("../../containers/search/SearchPanelContainer"));
var _AdminTab = _interopRequireDefault(require("../../../styles/cspace-ui/AdminTab.css"));
var _permissionHelpers = require("../../helpers/permissionHelpers");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
/* global window */

const propTypes = {
  history: _propTypes.default.shape({
    replace: _propTypes.default.func
  }),
  match: _propTypes.default.shape({
    params: _propTypes.default.object
  }),
  perms: _propTypes.default.instanceOf(_immutable.default.Map),
  filterDelay: _propTypes.default.number,
  openModalName: _propTypes.default.string,
  closeModal: _propTypes.default.func,
  openModal: _propTypes.default.func,
  openReport: _propTypes.default.func,
  setToolTab: _propTypes.default.func
};
const defaultProps = {
  filterDelay: 500
};
const contextTypes = {
  config: _propTypes.default.shape({
    recordTypes: _propTypes.default.object
  }).isRequired
};
const recordType = 'report';
const invocationType = 'reportinvocation';
const getSearchDescriptor = () => _immutable.default.fromJS({
  recordType,
  searchQuery: {
    size: 20,
    sort: 'name'
  }
});
class ReportPage extends _react.Component {
  constructor() {
    super();
    this.handleSearchDescriptorChange = this.handleSearchDescriptorChange.bind(this);
    this.renderSearchBar = this.renderSearchBar.bind(this);
    this.handleSearchBarChange = this.handleSearchBarChange.bind(this);
    this.handleItemClick = this.handleItemClick.bind(this);
    this.handleModalCancelButtonClick = this.handleModalCancelButtonClick.bind(this);
    this.handleModalInvokeButtonClick = this.handleModalInvokeButtonClick.bind(this);
    this.handleRunButtonClick = this.handleRunButtonClick.bind(this);
    this.state = {
      searchDescriptor: getSearchDescriptor()
    };
  }
  componentDidMount() {
    const {
      setToolTab
    } = this.props;
    if (setToolTab) {
      setToolTab(recordType);
    }
  }
  handleItemClick(item) {
    const {
      history,
      perms
    } = this.props;
    if ((0, _permissionHelpers.canRead)(recordType, perms)) {
      const csid = item.get('csid');
      history.replace(`/tool/${recordType}/${csid}`);
    }
    return false;
  }
  handleModalCancelButtonClick(event) {
    const {
      closeModal
    } = this.props;
    if (closeModal) {
      event.stopPropagation();
      closeModal();
    }
  }
  handleModalInvokeButtonClick(reportMetadata, invocationDescriptor) {
    const {
      openReport,
      closeModal
    } = this.props;
    const {
      config
    } = this.context;
    if (openReport) {
      openReport(config, reportMetadata, invocationDescriptor).then(() => {
        if (closeModal) {
          closeModal(_modalNames.MODAL_INVOCATION);
        }
      }).catch(() => {});
    }
  }
  handleRunButtonClick() {
    const {
      openModal
    } = this.props;
    if (openModal) {
      openModal(_modalNames.MODAL_INVOCATION);
    }
  }
  handleSearchBarChange(value) {
    if (this.filterTimer) {
      window.clearTimeout(this.filterTimer);
      this.filterTimer = null;
    }
    if (value) {
      const {
        filterDelay
      } = this.props;
      this.filterTimer = window.setTimeout(() => {
        this.filter(value);
        this.filterTimer = null;
      }, filterDelay);
    } else {
      this.filter(value);
    }
  }
  handleSearchDescriptorChange(searchDescriptor) {
    this.setState({
      searchDescriptor
    });
  }
  filter(value) {
    const {
      searchDescriptor
    } = this.state;
    const searchQuery = searchDescriptor.get('searchQuery');
    let updatedSearchQuery;
    if (value) {
      updatedSearchQuery = searchQuery.set('as', _immutable.default.fromJS({
        value,
        op: _searchOperators.OP_CONTAIN,
        path: 'ns2:reports_common/name'
      }));
    } else {
      updatedSearchQuery = searchQuery.delete('as');
    }
    updatedSearchQuery = updatedSearchQuery.set('p', 0);
    this.setState({
      filterValue: value,
      searchDescriptor: searchDescriptor.set('searchQuery', updatedSearchQuery)
    });
  }
  renderSearchBar() {
    const {
      filterValue
    } = this.state;
    return /*#__PURE__*/_react.default.createElement(_InvocableSearchBar.default, {
      value: filterValue,
      onChange: this.handleSearchBarChange
    });
  }
  renderInvocationModal() {
    const {
      match,
      openModalName
    } = this.props;
    const {
      config
    } = this.context;
    return /*#__PURE__*/_react.default.createElement(_InvocationModalContainer.default, {
      config: config,
      csid: match.params.csid,
      initialInvocationDescriptor: _immutable.default.Map({
        mode: 'nocontext'
      }),
      isOpen: openModalName === _modalNames.MODAL_INVOCATION,
      recordType: "report",
      onCancelButtonClick: this.handleModalCancelButtonClick,
      onCloseButtonClick: this.handleModalCancelButtonClick,
      onInvokeButtonClick: this.handleModalInvokeButtonClick
    });
  }
  render() {
    const {
      config
    } = this.context;
    const {
      filterValue,
      searchDescriptor
    } = this.state;
    const {
      history,
      match,
      perms
    } = this.props;
    const {
      csid
    } = match.params;
    const normalizedCsid = csid === 'new' ? '' : csid;
    const recordTypeConfig = (0, _get.default)(config, ['recordTypes', recordType]);
    const title = /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, recordTypeConfig.messages.record.collectionName);
    let recordEditor;
    if (typeof normalizedCsid !== 'undefined' && normalizedCsid !== null) {
      const isRunnable = (0, _permissionHelpers.canCreate)(invocationType, perms);

      // Temporarily disallow deleting or creating records.

      let restrictedPerms = perms;
      restrictedPerms = (0, _permissionHelpers.disallowCreate)(recordType, restrictedPerms);
      restrictedPerms = (0, _permissionHelpers.disallowDelete)(recordType, restrictedPerms);
      restrictedPerms = (0, _permissionHelpers.disallowSoftDelete)(recordType, restrictedPerms);
      recordEditor = /*#__PURE__*/_react.default.createElement(_RecordEditorContainer.default, {
        config: config,
        csid: normalizedCsid,
        recordType: recordType,
        perms: restrictedPerms,
        onRunButtonClick: isRunnable ? this.handleRunButtonClick : undefined
      });
    }
    return /*#__PURE__*/_react.default.createElement("div", {
      className: _AdminTab.default.common
    }, /*#__PURE__*/_react.default.createElement(_SearchPanelContainer.default, {
      collapsed: false,
      collapsible: false,
      config: config,
      history: history,
      isFiltered: !!filterValue,
      linkItems: false,
      name: "reportPage",
      searchDescriptor: searchDescriptor,
      title: title,
      recordType: recordType,
      showSearchButton: false,
      renderTableHeader: this.renderSearchBar,
      onItemClick: this.handleItemClick,
      onSearchDescriptorChange: this.handleSearchDescriptorChange
    }), recordEditor, this.renderInvocationModal());
  }
}
exports.default = ReportPage;
ReportPage.propTypes = propTypes;
ReportPage.defaultProps = defaultProps;
ReportPage.contextTypes = contextTypes;