From 9cc72105485037ea08263ef0db53741c9566f82b Mon Sep 17 00:00:00 2001
From: Alexandru Munteanu <alexandru.munteanu@thinslices.com>
Date: Thu, 1 Feb 2018 15:59:01 +0200
Subject: [PATCH] Fix lint

---
 .../src/components/Dashboard/Dashboard.js     | 46 ++++++++++++++++-
 .../components/Dashboard/Dashboard.local.scss | 13 +++++
 .../components/Dashboard/DashboardFilters.js  | 49 ++++++++++++++++---
 .../src/components/Dashboard/redux/filters.js | 37 +++++++++++++-
 4 files changed, 136 insertions(+), 9 deletions(-)

diff --git a/packages/components-faraday/src/components/Dashboard/Dashboard.js b/packages/components-faraday/src/components/Dashboard/Dashboard.js
index ed359ff49..03de9a484 100644
--- a/packages/components-faraday/src/components/Dashboard/Dashboard.js
+++ b/packages/components-faraday/src/components/Dashboard/Dashboard.js
@@ -1,6 +1,8 @@
 import React from 'react'
 import { get } from 'lodash'
 import { Button } from '@pubsweet/ui'
+import { connect } from 'react-redux'
+import { compose, withHandlers } from 'recompose'
 
 import classes from './Dashboard.local.scss'
 import DashboardItems from './DashboardItems'
@@ -13,6 +15,8 @@ const Dashboard = ({
   dashboard,
   deleteProject,
   listView,
+  filters,
+  getItems,
 }) => (
   <div className={classes.root}>
     <div className={classes.header}>
@@ -24,10 +28,48 @@ const Dashboard = ({
     <DashboardFilters changeView={changeViewMode} listView={listView} />
     <DashboardItems
       deleteProject={deleteProject}
-      list={get(currentUser, 'admin') ? dashboard.all : dashboard.owner}
+      list={getItems()}
       listView={listView}
     />
   </div>
 )
 
-export default Dashboard
+export default compose(
+  connect(state => ({
+    filters: state.filters.filter,
+    sortOrder: state.filters.sortValue,
+  })),
+  withHandlers({
+    getItems: ({ filters, sortOrder, currentUser, dashboard }) => () => {
+      const userItems = get(currentUser, 'admin')
+        ? dashboard.all
+        : dashboard.owner
+      const statusItems =
+        filters.status === 'all'
+          ? userItems
+          : userItems.filter(item => {
+              const itemStatus = get(item, 'status')
+              if (!itemStatus && filters.status === 'draft') {
+                return true
+              }
+              return itemStatus === filters.status
+            })
+      const ownerItems =
+        filters.owner === 'all'
+          ? statusItems
+          : statusItems.filter(item => {
+              const itemOwnerIds = item.owners.map(o => o.id)
+              if (filters.owner === 'me') {
+                return itemOwnerIds.includes(currentUser.id)
+              } else if (filters.owner === 'other') {
+                return !itemOwnerIds.includes(currentUser.id)
+              }
+              return false
+            })
+      return ownerItems.sort((a, b) => {
+        if (sortOrder === 'newest') return a.created - b.created < 0
+        return a.created - b.created > 0
+      })
+    },
+  }),
+)(Dashboard)
diff --git a/packages/components-faraday/src/components/Dashboard/Dashboard.local.scss b/packages/components-faraday/src/components/Dashboard/Dashboard.local.scss
index bc62ceb69..c4b717e21 100644
--- a/packages/components-faraday/src/components/Dashboard/Dashboard.local.scss
+++ b/packages/components-faraday/src/components/Dashboard/Dashboard.local.scss
@@ -15,11 +15,24 @@
 }
 
 .filters {
+  align-items: flex-end;
+  display: flex;
+
   > span {
     border: 1px solid gray;
     margin: 0 0.5em;
     padding: 0 5px;
   }
+
+  .filter-group {
+    align-items: flex-start;
+    display: flex;
+    flex-direction: column;
+
+    > span {
+      margin-left: 10px;
+    }
+  }
 }
 
 .disabled {
diff --git a/packages/components-faraday/src/components/Dashboard/DashboardFilters.js b/packages/components-faraday/src/components/Dashboard/DashboardFilters.js
index 124ca5583..45ceb6508 100644
--- a/packages/components-faraday/src/components/Dashboard/DashboardFilters.js
+++ b/packages/components-faraday/src/components/Dashboard/DashboardFilters.js
@@ -1,7 +1,27 @@
 import React from 'react'
-import { Icon } from '@pubsweet/ui'
+import { connect } from 'react-redux'
+import { Icon, Menu } from '@pubsweet/ui'
+import { compose, withHandlers } from 'recompose'
 
 import classes from './Dashboard.local.scss'
+import { changeFilter, changeSort } from './redux/filters'
+
+const statusFilterOptions = [
+  { label: 'All', value: 'all' },
+  { label: 'Submitted', value: 'submitted' },
+  { label: 'Draft', value: 'draft' },
+]
+
+const ownerFilterOptions = [
+  { label: 'Everyone', value: 'all' },
+  { label: 'My work', value: 'me' },
+  { label: `Other's work`, value: 'other' },
+]
+
+const sortOptions = [
+  { label: 'Newest first', value: 'newest' },
+  { label: 'Oldest first', value: 'oldest' },
+]
 
 const DashboardFilters = ({
   view,
@@ -9,14 +29,24 @@ const DashboardFilters = ({
   createdAt,
   changeView,
   listView,
+  changeFilter,
+  changeSort,
 }) => (
   <div className={classes.filtersContainer}>
     <div className={classes.filters}>
       Filter view:
-      <span> My work </span>
-      <span> Type </span>
-      <span> Status </span>
-      <span> Newest on top </span>
+      <div className={classes['filter-group']}>
+        <span>Owner</span>
+        <Menu onChange={changeFilter('owner')} options={ownerFilterOptions} />
+      </div>
+      <div className={classes['filter-group']}>
+        <span>Status</span>
+        <Menu onChange={changeFilter('status')} options={statusFilterOptions} />
+      </div>
+      <div className={classes['filter-group']}>
+        <span>Sort</span>
+        <Menu onChange={changeSort} options={sortOptions} />
+      </div>
     </div>
     <div className={classes.viewMode} onClick={changeView}>
       <div className={classes.icon}>
@@ -27,4 +57,11 @@ const DashboardFilters = ({
   </div>
 )
 
-export default DashboardFilters
+export default compose(
+  connect(null, { changeFilter, changeSort }),
+  withHandlers({
+    changeFilter: ({ changeFilter }) => filterKey => value => {
+      changeFilter(filterKey, value)
+    },
+  }),
+)(DashboardFilters)
diff --git a/packages/components-faraday/src/components/Dashboard/redux/filters.js b/packages/components-faraday/src/components/Dashboard/redux/filters.js
index 4bf55715d..e50016723 100644
--- a/packages/components-faraday/src/components/Dashboard/redux/filters.js
+++ b/packages/components-faraday/src/components/Dashboard/redux/filters.js
@@ -1,5 +1,40 @@
-export default (state = {}, action) => {
+const initialState = {
+  filter: {
+    status: 'all',
+    owner: 'all',
+  },
+  sortValue: 'newest',
+}
+
+const CHANGE_FILTER = 'filters/CHANGE_FILTER'
+const CHANGE_SORT = 'filters/CHANGE_SORT'
+
+export const changeFilter = (filterKey, value) => ({
+  type: CHANGE_FILTER,
+  filterKey,
+  value,
+})
+
+export const changeSort = value => ({
+  type: CHANGE_SORT,
+  value,
+})
+
+export default (state = initialState, action) => {
   switch (action.type) {
+    case CHANGE_FILTER:
+      return {
+        ...state,
+        filter: {
+          ...state.filter,
+          [action.filterKey]: action.value,
+        },
+      }
+    case CHANGE_SORT:
+      return {
+        ...state,
+        sortValue: action.value,
+      }
     default:
       return state
   }
-- 
GitLab