Home Reference Source Repository

src/components/admin/AdminDashboardViewer/AdminDashboardViewer.js

/*!
 * Codefolio
 * Copyright(c) 2016 MSMFSD
 * MIT Licensed
 */
import React, { Component, PropTypes } from 'react'
import { Link } from 'react-router'
import CssModules from 'react-css-modules'
import styles from './AdminDashboardViewer.css'

/**
 * @class AdminDashboardViewer
 * @extends {Component}
 */
class AdminDashboardViewer extends Component {

  constructor (props) {
    super(props)
    this.state = { deleteId: null }
  }

  componentDidMount () {
    // ensure API data and redux store sync
    // by always refreshing data on mount
    if(!this.props.projects.loading) {
      this.props.fetchProjectsAsync()
    }
  }

  /**
   * Prepare to remove project by id
   * @param {string} id
   * @param {object} e - event object
   */
  deleteProject (id, e) {
    e.preventDefault()
    this.setState({ deleteId: id })
    $('#modal1').openModal()
  }

  /**
   * Remove project by current deleteId
   * @param {object} e - event object
   */
  deleteProjectConfirm (e) {
    e.preventDefault()
    this.props.deleteProjectAsync(this.state.deleteId, this.props.auth.token)
  }

  /**
   * Cancel remove project by current deleteId
   * @param {object} e - event object
   */
  deleteProjectCancel (e) {
    e.preventDefault()
    this.setState({ deleteId: null })
  }

  render () {
    const { projects } = this.props
    return (
      <div>
        <div className="row">
          <div className="col s12 m6">
            <div className="card">
              <div className="card-content">
                <span className="card-title">Admin settings</span>
                <p>View administrator username and last logged in date and change your admin password.</p>
              </div>
              <div className="card-action">
                <Link styleName="admin-btn" className="btn" to={'/admin/edit-administrator'}>VIEW</Link>
              </div>
            </div>
          </div>
          <div className="col s12 m6">
            <div className="card">
              <div className="card-content">
                <span className="card-title">Profile settings</span>
                <p>Manage your public folio profile to update your avatar, details, technology set, contacts and bio.</p>
              </div>
              <div className="card-action">
                <Link styleName="admin-btn" className="btn" to={'/admin/edit-profile'}>Edit</Link>
              </div>
            </div>
          </div>
          <div className="col s12">
            <div className="card">
              <div className="card-content">
                <span className="card-title">Projects</span>
                <p>Manage your public folio projects to showcase your development work. Edit current projects below or create a new project.</p>
                <p><Link styleName="admin-btn-create" className="btn" to={'/admin/new-project'}>Create new project</Link></p>
              </div>
              <div styleName="card-action-full" className="card-action left">
                <div className={projects.loading || projects.error ? 'show' : 'hide'}>
                  {projects.error ? <div styleName="card-padding" className="card-panel">{projects.errMessage}</div> : <div styleName="cf-progress"><div className="progress"><div className="indeterminate"></div></div></div>}
                </div>
                <div className={projects.loading ? 'hide' : 'show'}>
                  <ul styleName="cf-projects-list" className={projects.loading || projects.error ? 'hide' : 'show'}>
                    {
                      projects.data.map((obj, index) => {
                        return (<li key={index} styleName="cf-project-link-item" className="hoverable">
                          <div>
                            <h6 className="truncate">
                              {obj.name}
                              <span className="truncate">view order: {obj.viewOrder}{obj.sticky === 1 ? ' | featured' : ''}</span>
                            </h6>
                            <Link to={'/admin/edit-project/' + obj.slug} className="btn-floating hoverable"><i className="material-icons">mode_edit</i></Link>
                            <a href="#" onClick={(this.deleteProject.bind(this, obj._id))} className="btn-floating hoverable"><i className="material-icons">delete</i></a>
                          </div>
                        </li>)
                      })
                    }
                  </ul>
                </div>
              </div>
            </div>
          </div>
        </div>
        <div id="modal1" className="modal">
          <div className="modal-content"><p>Are you sure you want to delete this project?</p></div>
          <div className="modal-footer">
            <a href="#" onClick={this.deleteProjectConfirm.bind(this)} className="modal-action modal-close btn-flat">Delete</a>
            <a href="#" onClick={this.deleteProjectCancel.bind(this)} className="modal-action modal-close btn-flat">Cancel</a>
          </div>
        </div>
      </div>
    )
  }
}

AdminDashboardViewer.propTypes = {
  auth: PropTypes.object.isRequired,
  projects: PropTypes.object.isRequired,
  deleteProjectAsync: PropTypes.func.isRequired,
  fetchProjectsAsync: PropTypes.func.isRequired
}

AdminDashboardViewer = CssModules(AdminDashboardViewer, styles)
export default AdminDashboardViewer