mirror of
				https://github.com/fspc/workstand.git
				synced 2025-10-31 08:25:35 -04:00 
			
		
		
		
	Edit bikes.
This commit is contained in:
		
							parent
							
								
									98902242a2
								
							
						
					
					
						commit
						1dbefb2d4b
					
				| @ -9,4 +9,5 @@ export const setBikeSaved = createAction('set bike.saved'); | ||||
| export const setBikeIsSaving = createAction('set bike.isSaving'); | ||||
| export const setBikeSaveFailed = createAction('set bike.isSaving'); | ||||
| export const editBike = createAction('edit bike'); | ||||
| export const createBike = createAction('create bike'); | ||||
| export const createBike = createAction('create bike'); | ||||
| export const saveBike = createAction('save bike'); | ||||
| @ -12,6 +12,7 @@ import fetch from 'isomorphic-fetch'; | ||||
| import moment from 'moment-timezone'; | ||||
| import Source from '../Source'; | ||||
| import Size from '../Size'; | ||||
| import { saveBike } from '../../actions'; | ||||
| 
 | ||||
| const styles = { | ||||
|   block: { | ||||
| @ -84,7 +85,10 @@ const validate = (values) => { | ||||
|   return errors; | ||||
| }; | ||||
| 
 | ||||
| const handleSubmit = data => false; | ||||
| const handleSubmit = (data, dispatch) => { | ||||
|   console.log(data); | ||||
|   dispatch(saveBike(data)); | ||||
| }; | ||||
| 
 | ||||
| class BikeForm extends React.Component { | ||||
|   constructor({ bike, create }) { | ||||
| @ -100,18 +104,6 @@ class BikeForm extends React.Component { | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   handleChange(event, value) { | ||||
|     this.setState({ bike: { ...this.state.bike, [event.target.name]: value } }); | ||||
|   } | ||||
| 
 | ||||
|   handleSizeChange(event, index, value) { | ||||
|     this.setState({ bike: { ...this.state.bike, size: value } }); | ||||
|   } | ||||
| 
 | ||||
|   handleSourceChange(event, index, value) { | ||||
|     this.setState({ bike: { ...this.state.bike, source: value } }); | ||||
|   } | ||||
| 
 | ||||
|   handleCpicCheck() { | ||||
|     const id = this.state.bike.id; | ||||
|     const serialNumber = this.state.bike.serial_number; | ||||
| @ -160,24 +152,11 @@ class BikeForm extends React.Component { | ||||
|   } | ||||
| 
 | ||||
|   render() { | ||||
|     // const timezone = moment.tz.guess(); | ||||
|     // const { | ||||
|     //   claimed_at, | ||||
|     //   claimed_by, | ||||
|     //   cpic_searched_at, | ||||
|     //   created_at, | ||||
|     //   stolen, | ||||
|     //   checked, | ||||
|     // } = this.props.bike || {}; | ||||
|     const create = this.props.create; | ||||
|     // const createdAtFormatted = (moment(created_at).isValid()) ? moment(created_at).tz(timezone).fromNow() : ''; | ||||
|     // const claimedAtFormatted = (moment(claimed_at).isValid()) ? moment(claimed_at).tz(timezone).fromNow() : ''; | ||||
|     // const cpicSearchedAtFormatted = (moment(cpic_searched_at).isValid()) ? moment(cpic_searched_at).tz(timezone) | ||||
|     //     .fromNow() : ''; | ||||
|     const { create } = this.props; | ||||
| 
 | ||||
|     return ( | ||||
|       <div> | ||||
|         <form onSubmit={handleSubmit}> | ||||
|         <form onSubmit={this.props.handleSubmit}> | ||||
|           <div className="mdl-grid"> | ||||
|             <div className="mdl-cell mdl-cell--3-col"> | ||||
|               <Field | ||||
| @ -286,7 +265,7 @@ class BikeForm extends React.Component { | ||||
|           <div className="mdl-grid" style={styles.bottom}> | ||||
|             <div className="mdl-cell mdl-cell--8-col"> | ||||
|               <Field | ||||
|                 name="donation_source" | ||||
|                 name="source" | ||||
|                 component={renderSelectField} | ||||
|                 floatingLabelText="Donation source" | ||||
|                 fullWidth | ||||
| @ -310,7 +289,7 @@ class BikeForm extends React.Component { | ||||
|           </div> | ||||
|           <div className="mdl-grid"> | ||||
|             <div style={{ textAlign: 'right' }} className="mdl-cell mdl-cell--12-col"> | ||||
|               <RaisedButton style={{ marginRight: '8px' }} label="Cancel" onTouchTap={this.props.handleClose} secondary /> | ||||
|               <RaisedButton style={{ marginRight: '8px' }} label="Cancel" onTouchTap={this.props.handleModalClose} secondary /> | ||||
|               <RaisedButton type="submit" label="Save" default disabled={this.props.pristine || this.props.submitting || this.props.invalid} /> | ||||
|             </div> | ||||
|           </div> | ||||
| @ -323,6 +302,7 @@ class BikeForm extends React.Component { | ||||
| BikeForm = reduxForm({ | ||||
|   form: 'BikeForm',  // a unique identifier for this form | ||||
|   validate, | ||||
|   onSubmit: handleSubmit, | ||||
| })(BikeForm); | ||||
| 
 | ||||
| const selector = formValueSelector('BikeForm') | ||||
|  | ||||
| @ -6,6 +6,7 @@ import BikeForm from '../BikeForm'; | ||||
| /** | ||||
|  * A modal dialog can only be closed by selecting one of the actions. | ||||
|  */ | ||||
| 
 | ||||
| class BikeModal extends React.Component { | ||||
|   constructor(props) { | ||||
|     super(props); | ||||
| @ -16,9 +17,11 @@ class BikeModal extends React.Component { | ||||
|       <Dialog | ||||
|         title='Bike' | ||||
|         open={this.props.open} | ||||
|         modal={false} | ||||
|         autoScrollBodyContent | ||||
|       > | ||||
|           <BikeForm | ||||
|             handleModalClose={this.props.handleClose} | ||||
|             enableReinitialize | ||||
|           /> | ||||
|       } | ||||
|  | ||||
| @ -15,11 +15,11 @@ class BikeTableComponent extends React.Component { | ||||
|     this.state = { | ||||
|       bikeModal: { | ||||
|         open: false, | ||||
|         bike: undefined, | ||||
|       }, | ||||
|     }; | ||||
| 
 | ||||
|     this.handleOpen = this.handleOpen.bind(this); | ||||
|     this.handleClose = this.handleClose.bind(this); | ||||
|     this.renderBikes = this.renderBikes.bind(this); | ||||
|   } | ||||
| 
 | ||||
| @ -38,6 +38,16 @@ class BikeTableComponent extends React.Component { | ||||
|    this.props.editBike(bike); | ||||
|   } | ||||
| 
 | ||||
|   handleClose() { | ||||
|     this.setState({ | ||||
|       ...this.state, | ||||
|       bikeModal: { | ||||
|         ...this.state.bikeModal, | ||||
|         open: false, | ||||
|       }, | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
|   renderBikes(bikes) { | ||||
|   const bikeRows = bikes.map(bike => ( | ||||
|     <TableRow selectable={false} key={bike.id}> | ||||
| @ -88,6 +98,7 @@ class BikeTableComponent extends React.Component { | ||||
|           </div> | ||||
|           <BikeModal | ||||
|             open={this.state.bikeModal.open} | ||||
|             handleClose={this.handleClose} | ||||
|           /> | ||||
|         </div> | ||||
|       ); | ||||
|  | ||||
| @ -9,7 +9,7 @@ import bikesReducer from './reducers'; | ||||
| import createSagaMiddleware from 'redux-saga' | ||||
| import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; | ||||
| import BikeTable from './components/BikeTable'; | ||||
| import watchFetchBikes from './sagas'; | ||||
| import rootSaga from './sagas'; | ||||
| 
 | ||||
| 
 | ||||
| // Needed for onTouchTap | ||||
| @ -30,7 +30,7 @@ const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; | ||||
| 
 | ||||
| const store = createStore(combinedReducers, composeEnhancers(applyMiddleware(sagaMiddleware))); | ||||
| 
 | ||||
| sagaMiddleware.run(watchFetchBikes); | ||||
| sagaMiddleware.run(rootSaga); | ||||
| 
 | ||||
| 
 | ||||
| class App extends React.Component { | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| import { call, put, takeEvery, takeLatest } from 'redux-saga/effects'; | ||||
| import { fetchBikes as fetchBikesAction, setBikes, setBikesIsFetching, setBikesFetched, | ||||
|          setBikesFetchFailed, setBikeSaved, setBikeSaveFailed, setBikeIsSaving } from './actions'; | ||||
| import { normalize } from 'normalizr'; | ||||
|          setBikesFetchFailed, setBikeSaved, setBikeSaveFailed, setBikeIsSaving, saveBike as saveBikeAction } from './actions'; | ||||
| import { normalize, denormalize } from 'normalizr'; | ||||
| import * as schema from './schema'; | ||||
| import Api from './services'; | ||||
| 
 | ||||
| @ -25,13 +25,27 @@ function* watchFetchBikes() { | ||||
|   yield takeEvery(fetchBikesAction.toString(), fetchBikes); | ||||
| } | ||||
| 
 | ||||
| // function *saveBike(action) {
 | ||||
| //   try {
 | ||||
| //     yield put({ type: setBikeIsSaving.toString(), payload: true });
 | ||||
| //     const bike = yield call(Api.saveBike(action.payload));
 | ||||
| //     yield put({ type: setBikes.toString(), payload: normalize([state])})
 | ||||
| //     yield put({ type: setBikeSaved, payload: true})
 | ||||
| //   }
 | ||||
| // }
 | ||||
| function* saveBike(action) { | ||||
|   try { | ||||
|     yield put({ type: setBikeIsSaving.toString(), payload: true }); | ||||
|     const bike = yield call(Api.saveBike(action.payload)); | ||||
|     yield put({ type: setBikes.toString(), payload: normalize([state])}) | ||||
|     yield put({ type: setBikeSaved, payload: true}) | ||||
|   } catch (e) { | ||||
|     yield put({ type: setBikeSaveFailed, payload: false }); | ||||
|     throw(e); | ||||
|   } finally { | ||||
|     yield put({ type: setBikeIsSaving.toSource(), payload: false }); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export default watchFetchBikes; | ||||
| function* watchSaveBike() { | ||||
|   yield takeEvery(saveBikeAction.toString(), saveBike) | ||||
| } | ||||
| 
 | ||||
| export default function* rootSaga() { | ||||
|   yield [ | ||||
|     watchFetchBikes(), | ||||
|     watchSaveBike(), | ||||
|   ]; | ||||
| }; | ||||
|  | ||||
| @ -1,4 +1,8 @@ | ||||
| import fetch from 'isomorphic-fetch'; | ||||
| import Cookies from 'js-cookie'; | ||||
| 
 | ||||
| const csrfToken = Cookies.get('csrftoken') | ||||
| const headers = new Headers({ 'X-CSRFToken': csrfToken, 'Content-Type': 'application/json' }); | ||||
| 
 | ||||
| const checkStatus = (response) => { | ||||
|   if (response.status >= 200 && response.status < 300) { | ||||
| @ -24,10 +28,12 @@ const Api = { | ||||
|         throw error; | ||||
|       }); | ||||
|   }, | ||||
|   saveBike(id) { | ||||
|     return fetch(`/api/v1/bike/${id}`, { | ||||
|   saveBike(data) { | ||||
|     return fetch(`/api/v1/bikes/${data.id}/`, { | ||||
|       credentials: 'same-origin', | ||||
|       method: 'PUT', | ||||
|       headers, | ||||
|       body: JSON.stringify(data), | ||||
|     }) | ||||
|       .then(checkStatus) | ||||
|       .then(parseJson) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user