diff --git a/app/controllers/api/v1/users_controller.rb b/app/controllers/api/v1/users_controller.rb new file mode 100644 index 0000000..9ed866b --- /dev/null +++ b/app/controllers/api/v1/users_controller.rb @@ -0,0 +1,15 @@ +class Api::V1::UsersController < Api::V1::ApplicationController + respond_to :json + + def show + user = User.find(params[:id]) + + respond_with(user, serializer: UserSerializer) + end + + def index + users = User.ransack(ransack_params).result.page(page).per(per_page) + + respond_with(users, each_serializer: UserSerializer, meta: build_meta(users), root: 'items') + end +end diff --git a/app/javascript/components/AddPopup/AddPopup.js b/app/javascript/components/AddPopup/AddPopup.js index 7c6ee41..750bf79 100644 --- a/app/javascript/components/AddPopup/AddPopup.js +++ b/app/javascript/components/AddPopup/AddPopup.js @@ -12,7 +12,10 @@ import IconButton from '@material-ui/core/IconButton'; import Modal from '@material-ui/core/Modal'; import TextField from '@material-ui/core/TextField'; +import TaskPresenter from 'presenters/TaskPresenter'; + import TaskForm from 'forms/TaskForm'; +import UserSelect from 'components/UserSelect'; import useStyles from './useStyles'; @@ -23,6 +26,8 @@ const AddPopup = (props) => { const [isSaving, setSaving] = useState(false); const [errors, setErrors] = useState({}); + const styles = useStyles(); + const handleCreate = () => { setSaving(true); @@ -38,7 +43,8 @@ const AddPopup = (props) => { }; const handleChangeTextField = (fieldName) => (event) => changeTask({ ...task, [fieldName]: event.target.value }); - const styles = useStyles(); + + const handleSelectChange = (fieldName) => (user) => changeTask({ ...task, [fieldName]: user }); return ( @@ -57,7 +63,7 @@ const AddPopup = (props) => { error={has('name', errors)} helperText={errors.name} onChange={handleChangeTextField('name')} - value={task.name} + value={TaskPresenter.name(task)} label="Name" required margin="dense" @@ -66,11 +72,29 @@ const AddPopup = (props) => { error={has('description', errors)} helperText={errors.description} onChange={handleChangeTextField('description')} - value={task.description} + value={TaskPresenter.description(task)} label="Description" required margin="dense" /> + + diff --git a/app/javascript/components/EditPopup/EditPopup.js b/app/javascript/components/EditPopup/EditPopup.js index 0b0c18e..db32d5d 100644 --- a/app/javascript/components/EditPopup/EditPopup.js +++ b/app/javascript/components/EditPopup/EditPopup.js @@ -2,6 +2,8 @@ import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import { isNil } from 'ramda'; +import TaskPresenter from 'presenters/TaskPresenter'; + import Form from './components/Form'; import Modal from '@material-ui/core/Modal'; import Card from '@material-ui/core/Card'; @@ -24,12 +26,14 @@ const EditPopup = (props) => { const styles = useStyles(); const isLoading = isNil(task); - const isEditButtonDisabled = isLoading && isSaving; + const isDataLoading = isLoading && isSaving; - const handleCardUpdate = () => { + const handleCardUpdate = async () => { setSaving(true); - onCardUpdate(task).catch((error) => { + try { + await onCardUpdate(task); + } catch (error) { setSaving(false); setErrors(error || {}); @@ -37,22 +41,29 @@ const EditPopup = (props) => { // eslint-disable-next-line no-alert alert(`Update Failed! Error: ${error.message}`); } - }); + } }; - const handleCardDestroy = () => { + const handleCardDestroy = async () => { setSaving(true); - onCardDestroy(task).catch((error) => { + try { + await onCardDestroy(task); + } catch (error) { setSaving(false); // eslint-disable-next-line no-alert alert(`Destruction Failed! Error: ${error.message}`); - }); + } }; useEffect(() => { - onCardLoad(cardId).then(setTask); + const initCard = async () => { + const card = await onCardLoad(cardId); + setTask(card); + }; + + initCard(); }, []); return ( @@ -64,7 +75,9 @@ const EditPopup = (props) => { } - title={isLoading ? 'Your task is loading. Please be patient.' : `Task # ${task.id} [${task.name}]`} + title={ + isLoading ? 'Your task is loading. Please be patient.' : `Task # ${task.id} [${TaskPresenter.name(task)}]` + } /> {isLoading ? ( @@ -72,21 +85,15 @@ const EditPopup = (props) => { ) : ( -
+ )} -