"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 _qs = _interopRequireDefault(require("qs"));

var _RecordEditorContainer = _interopRequireDefault(require("../../containers/record/RecordEditorContainer"));

var _SearchPanelContainer = _interopRequireDefault(require("../../containers/search/SearchPanelContainer"));

var _permissionHelpers = require("../../helpers/permissionHelpers");

var _AdminTabButtonBar = _interopRequireDefault(require("../admin/AdminTabButtonBar"));

var _AuthRoleSearchBar = _interopRequireDefault(require("../admin/AuthRoleSearchBar"));

var _AdminTab = _interopRequireDefault(require("../../../styles/cspace-ui/AdminTab.css"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/* global window */
const propTypes = {
  history: _propTypes.default.object,
  location: _propTypes.default.object,
  match: _propTypes.default.object,
  perms: _propTypes.default.instanceOf(_immutable.default.Map),
  filterDelay: _propTypes.default.number,
  setAdminTab: _propTypes.default.func
};
const defaultProps = {
  filterDelay: 500
};
const contextTypes = {
  config: _propTypes.default.object.isRequired
};
const recordType = 'authrole';

const getSearchDescriptor = () => _immutable.default.fromJS({
  recordType,
  searchQuery: {
    size: 20
  }
});

class AuthRolePage extends _react.Component {
  constructor() {
    super();
    this.cloneRecord = this.cloneRecord.bind(this);
    this.handleCreateButtonClick = this.handleCreateButtonClick.bind(this);
    this.handleItemClick = this.handleItemClick.bind(this);
    this.handleRecordCreated = this.handleRecordCreated.bind(this);
    this.handleRecordDeleted = this.handleRecordDeleted.bind(this);
    this.handleRecordSaved = this.handleRecordSaved.bind(this);
    this.handleSearchBarChange = this.handleSearchBarChange.bind(this);
    this.handleSearchDescriptorChange = this.handleSearchDescriptorChange.bind(this);
    this.renderSearchBar = this.renderSearchBar.bind(this);
    this.state = {
      searchDescriptor: getSearchDescriptor()
    };
  }

  componentDidMount() {
    const {
      setAdminTab
    } = this.props;

    if (setAdminTab) {
      setAdminTab(recordType);
    }
  }

  cloneRecord() {
    const {
      history,
      match
    } = this.props;
    const {
      csid
    } = match.params;
    const query = {
      clone: csid
    };

    const queryString = _qs.default.stringify(query);

    history.replace({
      pathname: "/admin/".concat(recordType, "/new"),
      search: "?".concat(queryString)
    });
  }

  filter(value) {
    const {
      searchDescriptor
    } = this.state;
    const searchQuery = searchDescriptor.get('searchQuery');
    let updatedSearchQuery;

    if (value) {
      updatedSearchQuery = searchQuery.set('dn', value);
    } else {
      updatedSearchQuery = searchQuery.delete('dn');
    }

    updatedSearchQuery = updatedSearchQuery.set('p', 0);
    this.setState({
      searchDescriptor: searchDescriptor.set('searchQuery', updatedSearchQuery)
    });
  }

  handleCreateButtonClick() {
    const {
      history
    } = this.props;
    history.replace("/admin/".concat(recordType, "/new"));
  }

  handleItemClick(item) {
    const {
      history,
      perms
    } = this.props;

    if ((0, _permissionHelpers.canRead)(recordType, perms)) {
      const csid = item.get('@csid');
      history.replace("/admin/".concat(recordType, "/").concat(csid));
    } // Prevent the default action.


    return false;
  }

  handleRecordCreated(newRecordCsid, isNavigating) {
    if (!isNavigating) {
      const {
        history
      } = this.props;
      history.replace("/admin/".concat(recordType, "/").concat(newRecordCsid));
    }
  }

  handleRecordDeleted() {
    const {
      history
    } = this.props;
    history.replace("/admin/".concat(recordType));
    const {
      searchDescriptor
    } = this.state;
    this.setState({
      searchDescriptor: searchDescriptor.set('seqId', new Date().toISOString())
    });
  }

  handleRecordSaved() {
    const {
      searchDescriptor
    } = this.state;
    this.setState({
      searchDescriptor: searchDescriptor.set('seqId', new Date().toISOString())
    });
  }

  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
    });
  }

  renderSearchBar() {
    const {
      searchDescriptor
    } = this.state;
    const filterValue = searchDescriptor.getIn(['searchQuery', 'dn']);
    return _react.default.createElement(_AuthRoleSearchBar.default, {
      value: filterValue,
      onChange: this.handleSearchBarChange
    });
  }

  render() {
    const {
      config
    } = this.context;
    const {
      history,
      location,
      match,
      perms
    } = this.props;
    const {
      searchDescriptor
    } = this.state;
    const {
      csid
    } = match.params;

    const query = _qs.default.parse(location.search.substring(1));

    const normalizedCsid = csid === 'new' ? '' : csid;
    const cloneCsid = query.clone;
    const recordTypeConfig = (0, _get.default)(config, ['recordTypes', recordType]);
    const filterValue = searchDescriptor.getIn(['searchQuery', 'dn']);

    const title = _react.default.createElement(_reactIntl.FormattedMessage, recordTypeConfig.messages.record.collectionName);

    let recordEditor;

    if (typeof normalizedCsid !== 'undefined' && normalizedCsid !== null) {
      recordEditor = _react.default.createElement(_RecordEditorContainer.default, {
        cloneCsid: cloneCsid,
        config: config,
        csid: normalizedCsid,
        recordType: recordType,
        isHardDelete: true,
        clone: this.cloneRecord,
        onRecordCreated: this.handleRecordCreated,
        onRecordDeleted: this.handleRecordDeleted,
        onRecordSaved: this.handleRecordSaved
      });
    }

    return _react.default.createElement("div", {
      className: _AdminTab.default.common
    }, _react.default.createElement("div", null, _react.default.createElement(_AdminTabButtonBar.default, {
      isCreatable: (0, _permissionHelpers.canCreate)(recordType, perms),
      onCreateButtonClick: this.handleCreateButtonClick
    }), _react.default.createElement(_SearchPanelContainer.default, {
      collapsed: false,
      collapsible: false,
      config: config,
      history: history,
      isFiltered: !!filterValue,
      linkItems: false,
      listType: "role",
      name: "authRolePage",
      pageSizeOptionListName: "searchResultPagePageSizes",
      searchDescriptor: searchDescriptor,
      title: title,
      recordType: recordType,
      renderTableHeader: this.renderSearchBar,
      showSearchButton: false,
      onItemClick: this.handleItemClick,
      onSearchDescriptorChange: this.handleSearchDescriptorChange
    })), recordEditor);
  }

}

exports.default = AuthRolePage;
AuthRolePage.propTypes = propTypes;
AuthRolePage.defaultProps = defaultProps;
AuthRolePage.contextTypes = contextTypes;