diff --git a/components/time-ticket/screen-time-ticket-create.component.jsx b/components/time-ticket/screen-time-ticket-create.component.jsx index e2c8258..a9ca0e4 100644 --- a/components/time-ticket/screen-time-ticket-create.component.jsx +++ b/components/time-ticket/screen-time-ticket-create.component.jsx @@ -1,34 +1,31 @@ import { Formik } from "formik"; import React, { useEffect, useState } from "react"; -import { StyleSheet, Text } from "react-native"; +import { StyleSheet, Text,View, ScrollView } from "react-native"; import { useTranslation } from "react-i18next"; -import { View, ScrollView } from "react-native"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { Button, Dialog, TextInput } from "react-native-paper"; -import { QUERY_EMPLOYEE_BY_ID } from "../../graphql/employees.queries"; -//import SelectDropdown from 'react-native-select-dropdown'; import { SelectCostCenter } from "../Selects/select-cost-center"; +import { JobSearchSelect } from "../Selects/select-job-name"; +import DateTimePickerModal from "react-native-modal-datetime-picker"; import { selectCurrentEmployee, selectRates, } from "../../redux/employee/employee.selectors"; -import DateTimePickerModal from "react-native-modal-datetime-picker"; -import { JobSearchSelect } from "../Selects/select-job-name"; import { selectBodyshop } from "../../redux/user/user.selectors"; //TODO add props needed for call const mapStateToProps = createStructuredSelector({ currentEmployee: selectCurrentEmployee, currentRatesNCostCenters: selectRates, - bodyshop: selectBodyshop, + currentBodyshop: selectBodyshop, }); -const mapDispatchToProps = (dispatch) => ({}); +// const mapDispatchToProps = (dispatch) => ({}); export function TimeTicketCreate({ currentEmployee, currentRatesNCostCenters, - bodyshop + currentBodyshop }) { const { t } = useTranslation(); @@ -53,15 +50,17 @@ export function TimeTicketCreate({ }; useEffect(() => { - var count = Object.keys(currentRatesNCostCenters).length; - let selectDataArray = []; - for (let i = 0; i < count; i++) { - selectDataArray.push({ - value: currentRatesNCostCenters[i].cost_center, - label: currentRatesNCostCenters[i].cost_center, - }); - } - setCostCenters(selectDataArray); + if (typeof currentRatesNCostCenters !== 'undefined') { + var count = Object.keys(currentRatesNCostCenters).length; + let selectDataArray = []; + for (let i = 0; i < count; i++) { + selectDataArray.push({ + value: currentRatesNCostCenters[i].cost_center, + label: currentRatesNCostCenters[i].cost_center, + }); + } + setCostCenters(selectDataArray); + } }, []); return ( @@ -81,8 +80,8 @@ export function TimeTicketCreate({ {({ handleChange, handleBlur, handleSubmit, values }) => ( {/* Below will be replaced with a copy of SelectCostCenter but for jobs*/} - + {/* Below will be replaced with a Date Picker*/} {/* */} diff --git a/graphql/bodyshop.queries.js b/graphql/bodyshop.queries.js index 3f2d6be..374dc3e 100644 --- a/graphql/bodyshop.queries.js +++ b/graphql/bodyshop.queries.js @@ -1,5 +1,6 @@ import gql from "graphql-tag"; +//TODO: find out if cdk_dealerid, pbs_serialnumber and md_responsibility_centers.defaults.costs need to be added to this export const QUERY_BODYSHOP = gql` query QUERY_BODYSHOP { bodyshops(where: { associations: { active: { _eq: true } } }) { diff --git a/redux/app/app.reducer.js b/redux/app/app.reducer.js index b99b3f8..aa15d0c 100644 --- a/redux/app/app.reducer.js +++ b/redux/app/app.reducer.js @@ -6,8 +6,6 @@ const INITIAL_STATE = { documentUploadInProgress: null, documentUploadError: null, deleteAfterUpload: false, - timeTicketJobId: null, - timeTicketJob: null, }; const appReducer = (state = INITIAL_STATE, action) => { @@ -45,16 +43,6 @@ const appReducer = (state = INITIAL_STATE, action) => { ...state, deleteAfterUpload: !state.deleteAfterUpload, }; - case AppActionTypes.SET_TIME_TICKET_JOB_ID: - return { - ...state, - timeTicketJobId: action.payload, - }; - case AppActionTypes.SET_TIME_TICKET_JOB: - return { - ...state, - timeTicketJob: action.payload, - }; default: return state; } diff --git a/redux/app/app.types.js b/redux/app/app.types.js index 2f36bfb..029d8e0 100644 --- a/redux/app/app.types.js +++ b/redux/app/app.types.js @@ -5,7 +5,5 @@ const AppActionTypes = { DOCUMENT_UPLOAD_SUCCESS: "DOCUMENT_UPLOAD_SUCCESS", DOCUMENT_UPLOAD_FAILURE: "DOCUMENT_UPLOAD_FAILURE", TOGGLE_DLETE_AFTER_UPLOAD: "TOGGLE_DLETE_AFTER_UPLOAD", - SET_TIME_TICKET_JOB: "SET_TIME_TICKET_JOB", - SET_TIME_TICKET_JOB_ID: "SET_TIME_TICKET_JOB_ID", }; export default AppActionTypes; diff --git a/redux/employee/employee.actions.js b/redux/employee/employee.actions.js index e5c3f77..4de1cde 100644 --- a/redux/employee/employee.actions.js +++ b/redux/employee/employee.actions.js @@ -31,15 +31,4 @@ export const employeeGetRatesFailure = (error) => ({ type: EmployeeActionTypes.EMPLOYEE_GET_RATES_FAILURE, payload: error, }); -export const timeTicketCreateStart = (timeTicket) => ({ - type: EmployeeActionTypes.TIME_TICKET_CREATE_START, - payload: timeTicket, -}); -export const timeTicketCreateSuccess = (insertTimeTickets) => ({ - type: EmployeeActionTypes.TIME_TICKET_CREATE_SUCCESS, - payload: insertTimeTickets, -}); -export const timeTicketCreateFailure = (error) => ({ - type: EmployeeActionTypes.TIME_TICKET_CREATE_FAILURE, - payload: error, -}); + diff --git a/redux/employee/employee.reducer.js b/redux/employee/employee.reducer.js index a48b881..cbb73bd 100644 --- a/redux/employee/employee.reducer.js +++ b/redux/employee/employee.reducer.js @@ -4,7 +4,6 @@ const INITIAL_STATE = { currentEmployee: { authorized: null, technician: null, - rates:[], }, signingIn: false, gettingRates: false, diff --git a/redux/employee/employee.types.js b/redux/employee/employee.types.js index 6bdf9fc..44fd208 100644 --- a/redux/employee/employee.types.js +++ b/redux/employee/employee.types.js @@ -6,9 +6,6 @@ const EmployeeActionTypes = { EMPLOYEE_AUTHORIZING_SUCCESS: "EMPLOYEE_AUTHORIZING_SUCCESS", EMPLOYEE_AUTHORIZING_FAILURE: "EMPLOYEE_AUTHORIZING_FAILURE", EMPLOYEE_SIGN_OUT: "EMPLOYEE_SIGN_OUT", - TIME_TICKET_CREATE_START: "TIME_TICKET_CREATE_START", - TIME_TICKET_CREATE_SUCCESS: "TIME_TICKET_CREATE_SUCCESS", - TIME_TICKET_CREATE_FAILURE: "TIME_TICKET_CREATE_FAILURE", EMPLOYEE_GET_RATES_START: "EMPLOYEE_GET_RATES_START", EMPLOYEE_GET_RATES_SUCCESS: "EMPLOYEE_GET_RATES_SUCCESS", EMPLOYEE_GET_RATES_FAILURE: "EMPLOYEE_GET_RATES_FAILURE", diff --git a/redux/root.reducer.js b/redux/root.reducer.js index 963952f..1ace819 100644 --- a/redux/root.reducer.js +++ b/redux/root.reducer.js @@ -5,6 +5,7 @@ import appReducer from "./app/app.reducer"; import photosReducer from "./photos/photos.reducer"; import userReducer from "./user/user.reducer"; import employeeReducer from './employee/employee.reducer'; +import timeTicketsReducer from './timetickets/timetickets.reducer'; const persistConfig = { key: "root", @@ -18,6 +19,7 @@ const rootReducer = combineReducers({ app: appReducer, photos: photosReducer, employee: employeeReducer, + timeTickets: timeTicketsReducer, }); export default persistReducer(persistConfig, rootReducer); diff --git a/redux/root.saga.js b/redux/root.saga.js index c217084..8f41c44 100644 --- a/redux/root.saga.js +++ b/redux/root.saga.js @@ -3,7 +3,8 @@ import { appSagas } from "./app/app.sagas"; import { photosSagas } from "./photos/photos.sagas"; import { userSagas } from "./user/user.sagas"; import { employeeSagas } from "./employee/employee.sagas"; +import { timeTicketsSagas } from "./timetickets/timetickets.sagas"; export default function* rootSaga() { - yield all([call(userSagas), call(appSagas), call(photosSagas), call(employeeSagas)]); + yield all([call(userSagas), call(appSagas), call(photosSagas), call(employeeSagas), call(timeTicketsSagas)]); } diff --git a/redux/timetickets/timetickets.actions.js b/redux/timetickets/timetickets.actions.js new file mode 100644 index 0000000..57c1c46 --- /dev/null +++ b/redux/timetickets/timetickets.actions.js @@ -0,0 +1,25 @@ +import TimeTicketsActionTypes from "./timetickets.types"; +export const setTimeTicket = (timeTicket) => ({ + type: TimeTicketsActionTypes.SET_TIME_TICKET, + payload: timeTicket, + }); +export const setTimeTicketJobId = (jobId) => ({ + type: TimeTicketsActionTypes.SET_TIME_TICKET_JOB_ID, + payload: jobId, +}); +export const setTimeTicketJob = (job) => ({ + type: TimeTicketsActionTypes.SET_TIME_TICKET_JOB, + payload: job, +}); +export const timeTicketCreateStart = (timeTicket) => ({ + type: TimeTicketsActionTypes.TIME_TICKET_CREATE_START, + payload: timeTicket, +}); +export const timeTicketCreateSuccess = (insertTimeTickets) => ({ + type: TimeTicketsActionTypes.TIME_TICKET_CREATE_SUCCESS, + payload: insertTimeTickets, +}); +export const timeTicketCreateFailure = (error) => ({ + type: TimeTicketsActionTypes.TIME_TICKET_CREATE_FAILURE, + payload: error, +}); diff --git a/redux/timetickets/timetickets.reducer.js b/redux/timetickets/timetickets.reducer.js new file mode 100644 index 0000000..d63bf7a --- /dev/null +++ b/redux/timetickets/timetickets.reducer.js @@ -0,0 +1,51 @@ +import TimeTicketsActionTypes from "./timetickets.types"; + +const INITIAL_STATE = { + timeTicket: null, + timeTickets: [], + timeTicketJobId: null, + timeTicketJob: null, + uploadTimeTicketInProgress: false, + uploadTimeTicketError: null, +}; + +const timeTicketsReducer = (state = INITIAL_STATE, action) => { + switch (action.type) { + case TimeTicketsActionTypes.SET_TIME_TICKET: + return { + ...state, + timeTicket: action.payload, + }; + case TimeTicketsActionTypes.SET_TIME_TICKET_JOB_ID: + return { + ...state, + timeTicketJobId: action.payload, + }; + case TimeTicketsActionTypes.SET_TIME_TICKET_JOB: + return { + ...state, + timeTicketJob: action.payload, + }; + case TimeTicketsActionTypes.TIME_TICKET_CREATE_START: + return { + ...state, + uploadTimeTicketInProgress: true, + }; + case TimeTicketsActionTypes.TIME_TICKET_CREATE_SUCCESS: + return { + ...state, //TODO add logic here when successful + uploadTimeTicketInProgress: false, + uploadTimeTicketError: null, + }; + case TimeTicketsActionTypes.TIME_TICKET_CREATE_FAILURE: + return { + ...state, + uploadTimeTicketInProgress: false, + uploadTimeTicketError: action.payload, + }; + default: + return state; + } +}; + +export default timeTicketsReducer; diff --git a/redux/timetickets/timetickets.sagas.js b/redux/timetickets/timetickets.sagas.js new file mode 100644 index 0000000..c7d2ec1 --- /dev/null +++ b/redux/timetickets/timetickets.sagas.js @@ -0,0 +1,51 @@ +import { + timeTicketCreateFailure, + timeTicketCreateSuccess, +} from "./timetickets.actions"; +import TimeTicketsActionTypes from "./timetickets.types"; +import { client } from "../../graphql/client"; + +import { all, call, put, select, takeLatest } from "redux-saga/effects"; +import { logImEXEvent } from "../../firebase/firebase.analytics"; +import { selectCurrentTimeTicket } from "./timetickets.selectors"; +import { INSERT_NEW_TIME_TICKET } from "../../graphql/timetickets.queries"; + + +export function* onCreateTimeTicketStart() { + yield takeLatest( + TimeTicketsActionTypes.TIME_TICKET_CREATE_START, + insertNewTimeTicket + ); +} +export function* insertNewTimeTicket({ payload: { timeticketinsert } }) { + try { + logImEXEvent("redux_insertnewtimeticket_attempt"); + //console.loging + // console.log("Saga", employeeId, pin, pin); + const timeTicket = yield select(selectCurrentTimeTicket); + // const response = yield call(axios.post, "/tech/login", { + // shopid: bodyshop.id, + // employeeid: employeeId, + // pin: pin, + // }); + // const { valid, data, error } = response.data; + const result = yield client.query({ + query: INSERT_NEW_TIME_TICKET, + variables: { + id: employeeId, + }, + }); + const { valid, data, error } = result.data; + if (valid) { + yield put(timeTicketCreateSuccess(data)); + } else { + yield put(timeTicketCreateFailure(error)); + } + } catch (error) { + yield put(timeTicketCreateFailure(error)); + } +} + +export function* timeTicketsSagas() { + yield all([call(onCreateTimeTicketStart)]); +} diff --git a/redux/timetickets/timetickets.selectors.js b/redux/timetickets/timetickets.selectors.js new file mode 100644 index 0000000..2539e99 --- /dev/null +++ b/redux/timetickets/timetickets.selectors.js @@ -0,0 +1,16 @@ +import { createSelector } from "reselect"; + +const selectTimeTicketsState = (state) => state.TimeTickets; + +export const selectCurrentTimeTicketJobId = createSelector( + [selectTimeTicketsState], + (TimeTickets) => TimeTickets.timeTicketJobId +); +export const selectCurrentTimeTicketJob = createSelector( + [selectTimeTicketsState], + (TimeTickets) => TimeTickets.timeTicketJob +); +export const selectCurrentTimeTicket = createSelector( + [selectTimeTicketsState], + (TimeTickets) => TimeTickets.timeTicket +); diff --git a/redux/timetickets/timetickets.types.js b/redux/timetickets/timetickets.types.js new file mode 100644 index 0000000..5737385 --- /dev/null +++ b/redux/timetickets/timetickets.types.js @@ -0,0 +1,9 @@ +const TimeTicketsActionTypes = { + SET_TIME_TICKET: "SET_TIME_TICKET", + SET_TIME_TICKET_JOB: "SET_TIME_TICKET_JOB", + SET_TIME_TICKET_JOB_ID: "SET_TIME_TICKET_JOB_ID", + TIME_TICKET_CREATE_START: "TIME_TICKET_CREATE_START", + TIME_TICKET_CREATE_SUCCESS: "TIME_TICKET_CREATE_SUCCESS", + TIME_TICKET_CREATE_FAILURE: "TIME_TICKET_CREATE_FAILURE", +}; +export default TimeTicketsActionTypes;