update files

This commit is contained in:
jfrye122
2023-07-25 23:27:10 -04:00
parent d29a8a6d66
commit 1bc46e87bf
15 changed files with 40 additions and 353 deletions

View File

@@ -5,12 +5,6 @@ import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { useNavigation } from "@react-navigation/native"; import { useNavigation } from "@react-navigation/native";
// const mapDispatchToProps = (dispatch) => ({
// signOut: () => dispatch(employeeSignOut()),
// });
export function AddTimeTicketButton() { export function AddTimeTicketButton() {
const navigation = useNavigation(); const navigation = useNavigation();

View File

@@ -1,162 +0,0 @@
import { FlatList, RefreshControl, StyleSheet, Text, View } from "react-native";
import React from "react";
import { Ionicons } from "@expo/vector-icons";
import { Button, List, Searchbar } from "react-native-paper";
import { useState } from "react";
import { SEARCH_JOBS_FOR_AUTOCOMPLETE } from "../../graphql/jobs.queries";
import { useQuery } from "@apollo/client";
function JobIdSearchAndList({ onClose }) {
const jobSrchNotExported = true;
const jobSrchNotInvoiced = false;
const jobSrchConvertedOnly = false;
const jobSrchCurrentValue = { id: "temp", ro_number: "Temporary Storage" };
const jobSrchOnSetCurrentValue = (e) => {
console.info("onSetCurrentValue was called", e);
};
const jobSrchCurrentValueId = "temp";
const jobSrchOnSetCurrentValueId = () => {
console.info("onSetCurrentValueId was called");
};
const [searchText, setSearchText] = useState(null);
const [loading2, setLoading2] = useState(null);
console.log("onClose :", onClose);
// const showModal = () => setVisible(true);
const close = onClose ? onClose : () => console.info("todo add close"); //setVisible(false);
const onChangeSearch = (query) => {
console.log("onChangeSearch text:", query);
setSearchText(query);
};
const onRefresh = async () => {
//7/18
setLoading2(true);
// refetch();
setTimeout(() => {
setLoading2(false);
}, 1000);
//7/17
// setRefreshing(true);
// console.log(" ");
// console.log(" ");
// console.log(" ");
// console.log(" ");
// console.log(" ");
// console.log("onRefresh was called");
// console.log("data:", data);
// refetch({
// notInvoiced: jobSrchNotInvoiced,
// notExported: jobSrchNotExported,
// isConverted: jobSrchConvertedOnly,
// search: searchText,
// });
};
const { loading, error, data, refetch } = useQuery(
SEARCH_JOBS_FOR_AUTOCOMPLETE,
{
// fetchPolicy: "cache-and-network",
variables: {
search: searchText,
...(jobSrchConvertedOnly || jobSrchNotExported
? {
...(jobSrchConvertedOnly ? { isConverted: true } : {}),
...(jobSrchNotExported ? { notExported: true } : {}),
...(jobSrchNotInvoiced ? { notInvoiced: true } : {}),
}
: {}),
},
skip: !!!searchText,
fetchPolicy: "network-only",
nextFetchPolicy: "network-only",
}
);
return (
<View
style={{
flex: 1,
}}
>
<View
style={{
display: "flex",
flexDirection: "row",
alignItems: "center",
margin: 8,
}}
>
<Button onPress={() => close()}>
<Ionicons name="ios-arrow-back" size={32} color="dodgerblue" />
</Button>
<Searchbar
style={{ flex: 1 }}
onChangeText={(text) => onChangeSearch(text)}
value={searchText}
/>
</View>
<FlatList
refreshControl={
<RefreshControl refreshing={loading2} onRefresh={onRefresh} />
}
// data={[{ id: "temp", ro_number: "Temporary Storage" }, ...jobs]}
data={data?.search_jobs}
keyExtractor={(item) => item.id}
renderItem={(object) => (
<List.Item
onPress={() => {
// jobSrchOnSetCurrentValue(object.item);
// jobSrchOnSetCurrentValueId(object.item.id);
hideModal();
setSearchText("");
}}
left={() => {
if (object.item.id !== jobSrchCurrentValueId) return null;
return (
<Ionicons
name="ios-checkmark-circle"
size={24}
color="dodgerblue"
style={{ alignSelf: "center" }}
/>
);
}}
titleStyle={{
...(object.item.id === jobSrchCurrentValueId
? { color: "dodgerblue" }
: {}),
}}
title={`${
object.item.ro_number ? `${object.item.ro_number} ` : ``
}${object.item.ownr_fn || ""} ${object.item.ownr_ln || ""}${
object.item.v_model_yr ? `- ${object.item.v_model_yr}` : ""
}${object.item.v_make_desc ? `- ${object.item.v_make_desc}` : ""}${
object.item.v_model_desc ? `- ${object.item.v_model_desc}` : ""
}`}
key={object.item.id}
/>
)}
ListEmptyComponent={
<View
style={{
flex: 1,
padding: 10,
alignItems: "center",
justifyContent: "center",
}}
>
<Text>No Data</Text>
</View>
}
/>
</View>
);
}
export default JobIdSearchAndList;
const styles = StyleSheet.create({});

View File

@@ -8,10 +8,7 @@ import { connect } from "react-redux";
import { SEARCH_JOBS_FOR_AUTOCOMPLETE } from "../../graphql/jobs.queries"; import { SEARCH_JOBS_FOR_AUTOCOMPLETE } from "../../graphql/jobs.queries";
import ErrorDisplay from "../error-display/error-display.component"; import ErrorDisplay from "../error-display/error-display.component";
import _ from "lodash"; import _ from "lodash";
import { useCallback } from "react"; import { useCallback,useRef, useEffect } from "react";
import { useRef } from "react";
import { useEffect } from "react";
const useIsMounted = () => { const useIsMounted = () => {
const isMounted = useRef(false); const isMounted = useRef(false);
@@ -38,7 +35,7 @@ export function JobSearchAndSelectModal(props) {
const jobSrchCurrentValue = const jobSrchCurrentValue =
props?.currentValue !== undefined props?.currentValue !== undefined
? props.currentValue ? props.currentValue
: { id: "temp", ro_number: "No Selection" }; : { id:"temp", ro_number:t("selectjobid.labels.noselection") };
const jobSrchOnSetCurrentValue = const jobSrchOnSetCurrentValue =
props?.onSetCurrentValue !== undefined props?.onSetCurrentValue !== undefined
? props.onSetCurrentValue ? props.onSetCurrentValue
@@ -84,7 +81,6 @@ export function JobSearchAndSelectModal(props) {
const inputSearch = useRef(null); const inputSearch = useRef(null);
const isMounted = useIsMounted(); const isMounted = useIsMounted();
const setFocus = useCallback(() => { const setFocus = useCallback(() => {
console.log("setFocus called",inputSearch);
if (inputSearch.current) { if (inputSearch.current) {
inputSearch.current.focus(); inputSearch.current.focus();
} }
@@ -183,7 +179,7 @@ export function JobSearchAndSelectModal(props) {
justifyContent: "center", justifyContent: "center",
}} }}
> >
<Text>No Data</Text> <Text>{t("selectjobid.labels.nodata")}</Text>
</View> </View>
} }
/> />
@@ -205,7 +201,7 @@ export function JobSearchAndSelectModal(props) {
> >
{jobSrchCurrentValue?.id {jobSrchCurrentValue?.id
? jobSrchCurrentValue?.id === "temp" ? jobSrchCurrentValue?.id === "temp"
? t("mediabrowser.labels.temporarystorage") ? t("selectjobid.labels.noselection")
: `${ : `${
jobSrchCurrentValue.ro_number jobSrchCurrentValue.ro_number
? `${jobSrchCurrentValue.ro_number} - ` ? `${jobSrchCurrentValue.ro_number} - `

View File

@@ -1,53 +0,0 @@
import { StyleSheet, Text, View } from "react-native";
import React from "react";
import { useTranslation } from "react-i18next";
import { Button, Modal, Portal } from "react-native-paper";
import JobIdSearchAndList from "./JobIdSearchAndList";
import { useState } from "react";
function JobSearchModal() {
const { t } = useTranslation();
const [visible, setVisible] = useState(false);
const showModal = () => setVisible(true);
const hideModal = () => setVisible(false);
return (
<View style={{ flex: 1 }}>
<Portal>
<Modal
visible={visible}
onDismiss={hideModal}
// eslint-disable-next-line react-native/no-color-literals
contentContainerStyle={{
paddingTop: 20,
paddingBottom: 20,
margin: 12,
flex: 1,
backgroundColor: "white",
}}
>
<JobIdSearchAndList onClose={hideModal}/>
</Modal>
</Portal>
<Button mode="outlined" style={{ margin: 8 }} onPress={showModal}>
{/* {jobSrchCurrentValueId
? jobSrchCurrentValueId === "temp"
? t("mediabrowser.labels.temporarystorage")
: `${
jobSrchCurrentValue.ro_number
? `${jobSrchCurrentValue.ro_number} - `
: ``
}${jobSrchCurrentValue.ownr_fn || ""} ${
jobSrchCurrentValue.ownr_ln || ""
} - ${jobSrchCurrentValue.v_model_yr || ""} ${
jobSrchCurrentValue.v_make_desc || ""
} ${jobSrchCurrentValue.v_model_desc || ""}`
: t("mediabrowser.labels.selectjob")} */}
{t("mediabrowser.labels.selectjob")}
</Button>
</View>
);
}
export default JobSearchModal;
const styles = StyleSheet.create({});

View File

@@ -1,28 +1,21 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { useQuery } from "@apollo/client"; import { StyleSheet, View } from "react-native";
import { StyleSheet, Text, View } from "react-native";
import { Dropdown } from "react-native-element-dropdown"; import { Dropdown } from "react-native-element-dropdown";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import { QUERY_EMPLOYEE_BY_ID } from "../../graphql/employees.queries";
import { useEffect } from "react"; import { useEffect } from "react";
import { t } from "i18next"; import { t } from "i18next";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop bodyshop: selectBodyshop
// timeTicketJobId: selectCurrentTimeTicketJobId,
// timeTicketJob: selectCurrentTimeTicketJob,
}); });
// const mapDispatchToProps = {};
export function CostCenterSelect(props) { export function CostCenterSelect(props) {
const currentRatesNCostCenters = props.currentRatesNCostCenters; const currentRatesNCostCenters = props.currentRatesNCostCenters;
const bodyshop = props.bodyshop; const bodyshop = props.bodyshop;
const [value, setValue] = useState(null); // const [value, setValue] = useState(null);
const [isFocus, setIsFocus] = useState(false); const [isFocus, setIsFocus] = useState(false);
const [costCenters, setCostCenters] = useState([]); const [costCenters, setCostCenters] = useState([]);
@@ -52,7 +45,6 @@ export function CostCenterSelect(props) {
selectedTextStyle={styles.selectedTextStyle} selectedTextStyle={styles.selectedTextStyle}
inputSearchStyle={styles.inputSearchStyle} inputSearchStyle={styles.inputSearchStyle}
iconStyle={styles.iconStyle} iconStyle={styles.iconStyle}
maxHeight={200} maxHeight={200}
labelField="label" labelField="label"
valueField="value" valueField="value"
@@ -64,7 +56,6 @@ export function CostCenterSelect(props) {
value={props.currentValue?.value} value={props.currentValue?.value}
onChange={(item) => { onChange={(item) => {
props.onValueSelected(item); props.onValueSelected(item);
//setValue(item.value);
setIsFocus(false); setIsFocus(false);
}} }}
/> />

View File

@@ -2,8 +2,6 @@ import { View, Text, Platform } from "react-native";
import React from "react"; import React from "react";
import { KeyboardAvoidingView } from "react-native"; import { KeyboardAvoidingView } from "react-native";
import { StyleSheet } from "react-native"; import { StyleSheet } from "react-native";
import { TouchableWithoutFeedback } from "react-native";
import { Keyboard } from "react-native";
const KeyboardAvoidingComponent = ({ children }) => { const KeyboardAvoidingComponent = ({ children }) => {
return ( return (
@@ -12,9 +10,7 @@ const KeyboardAvoidingComponent = ({ children }) => {
behavior={Platform.OS === "ios" ? "padding":"height" } behavior={Platform.OS === "ios" ? "padding":"height" }
style={styles.container} style={styles.container}
> >
{/* <TouchableWithoutFeedback onPress={Keyboard.dismiss}> */} <View style={styles.inner}>{children}</View>
<View style={styles.inner}>{children}</View>
{/* </TouchableWithoutFeedback> */}
</KeyboardAvoidingView> </KeyboardAvoidingView>
); );
}; };

View File

@@ -130,18 +130,11 @@ const TimeTicketBrowserStackNavigator = connect(
const appState = useRef(AppState.currentState); const appState = useRef(AppState.currentState);
useEffect(() => { useEffect(() => {
const subscription = AppState.addEventListener("change", (nextAppState) => { const subscription = AppState.addEventListener("change", (nextAppState) => {
// console.log("oldAppState", appState.current);
// console.log("nextAppState", nextAppState);
// if ( appState.current.match(/inactive|background/) && nextAppState === "active"
// ) { console.log("App has come to the foreground"); //signOut(); }
// if (appState.current.match(/active/) && nextAppState === "inactive") {
// console.log("App is about to be inactive");
// }
if ( if (
appState.current.match(/active|inactive/) && appState.current.match(/active|inactive/) &&
nextAppState === "background" nextAppState === "background"
) { ) {
// console.log("App is about to be background"); //App is about to be background
signOut(); signOut();
} }
// if ( appState.current.match(/inactive/)) { console.log("App has come to the inactive"); } // if ( appState.current.match(/inactive/)) { console.log("App has come to the inactive"); }

View File

@@ -41,7 +41,7 @@ import { INSERT_NEW_TIME_TICKET } from "../../graphql/timetickets.queries";
import { useMutation, useQuery } from "@apollo/client"; import { useMutation, useQuery } from "@apollo/client";
import { QUERY_ACTIVE_TIME_TICKETS } from "../../graphql/timetickets.queries"; import { QUERY_ACTIVE_TIME_TICKETS } from "../../graphql/timetickets.queries";
import EmployeeClockedInList from "../time-ticket-lists/employee-clockedin-list.component"; // import EmployeeClockedInList from "../time-ticket-lists/employee-clockedin-list.component";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import ClockedinListItem from "../time-ticket-items/clockedin-list-item.component"; import ClockedinListItem from "../time-ticket-items/clockedin-list-item.component";
import SignOutButton from "../Buttons/employee-sign-out-button.component"; import SignOutButton from "../Buttons/employee-sign-out-button.component";
@@ -89,7 +89,6 @@ export function ScreenTimeTicketBrowser({
const [curSelClockIntoJob, setCurSelClockIntoJob] = useState(null); const [curSelClockIntoJob, setCurSelClockIntoJob] = useState(null);
const handleFinish = async (values) => { const handleFinish = async (values) => {
// console.log("handleFinish called in ScreenTimeTicketBrowser");
setLoadingClockIn(true); setLoadingClockIn(true);
setError(null); setError(null);
@@ -131,15 +130,11 @@ export function ScreenTimeTicketBrowser({
], ],
}, },
}; };
// console.info("INSERT_NEW_TIME_TICKET, variables for clockin. : ",tempVariablesObj?.variables?.timeTicketInput[0] );
const result = await insertTimeTicket(tempVariablesObj); const result = await insertTimeTicket(tempVariablesObj);
// console.log("insertTimeTicket, result :", result);
setLoadingClockIn(false); setLoadingClockIn(false);
if (!!result.errors) { if (!!result.errors) {
// console.log("insertTimeTicket, result.error :", result.errors);
setError(JSON.stringify(result.errors)); setError(JSON.stringify(result.errors));
} else { } else {
// console.log("insertTimeTicket, result. :", result.data);
setCurSelClockIntoJob(null); setCurSelClockIntoJob(null);
setCurrentSCC(null); setCurrentSCC(null);
} }
@@ -150,7 +145,7 @@ export function ScreenTimeTicketBrowser({
refetch(); refetch();
setTimeout(() => { setTimeout(() => {
setRefreshing(false); setRefreshing(false);
}, 1000); }, 500);
}, []); }, []);
const [itemState, setItemState] = useState({ const [itemState, setItemState] = useState({
@@ -179,7 +174,6 @@ export function ScreenTimeTicketBrowser({
); );
if (loadingATT) { if (loadingATT) {
// console.log("loadingATT : ");
setItemState((itemState) => ({ setItemState((itemState) => ({
...itemState, ...itemState,
content: <ActivityIndicator color="dodgerblue" size="large" />, content: <ActivityIndicator color="dodgerblue" size="large" />,
@@ -187,14 +181,12 @@ export function ScreenTimeTicketBrowser({
return; return;
} }
if (errorATT) { if (errorATT) {
// console.error("ErrorATT : ",errorATT);
setItemState((itemState) => ({ setItemState((itemState) => ({
...itemState, ...itemState,
content: <ErrorDisplay errorMessage={errorATT.message} />, content: <ErrorDisplay errorMessage={errorATT.message} />,
})); }));
return; return;
} }
// console.log({ itemState: !!itemState });
return ( return (
<View style={styles.cardBackground}> <View style={styles.cardBackground}>
@@ -306,7 +298,7 @@ const MyItem = ({ itemState, style }) => {
) : !!itemState?.content ? ( ) : !!itemState?.content ? (
itemState.content itemState.content
) : ( ) : (
<Text>No Data</Text> <Text>{t("timeticketbrowser.labels.nodata")}</Text>
)} )}
</Card.Content> </Card.Content>
</Card> </Card>

View File

@@ -6,10 +6,8 @@ import { createStructuredSelector } from "reselect";
import { signOutStart } from "../../redux/user/user.actions"; import { signOutStart } from "../../redux/user/user.actions";
import { employeeSignOut } from "../../redux/employee/employee.actions"; import { employeeSignOut } from "../../redux/employee/employee.actions";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
//setUserLanguage: language => dispatch(setUserLanguage(language))
signOutStart: () => dispatch(signOutStart()), signOutStart: () => dispatch(signOutStart()),
signOut: () => dispatch(employeeSignOut()), signOut: () => dispatch(employeeSignOut()),
}); });

View File

@@ -13,18 +13,13 @@ const mapDispatchToProps = (dispatch) => ({
}); });
export function ClockedinListItem({ setTmTicketJobIdRedux, ticket }) { export function ClockedinListItem({ setTmTicketJobIdRedux, ticket }) {
// console.log("ClockedinListItem, ticket:",ticket);
const { t } = useTranslation(); const { t } = useTranslation();
const navigation = useNavigation(); const navigation = useNavigation();
const makeNavToTimeTicketClockOff = () => ( const makeNavToTimeTicketClockOff = () => (
// console.log("makeNavToTimeTicketClockOff, checkHasDispatchCall:",setTmTicketJobIdRedux),
setTmTicketJobIdRedux(ticket.job.id), setTmTicketJobIdRedux(ticket.job.id),
navigation.navigate("TimeTicketClockOff", { navigation.navigate("TimeTicketClockOff", {
// jobId: ticket.jobid, //item.id,
timeTicketId:ticket.id, timeTicketId:ticket.id,
// handleOnDone:handleRefresh,
//completedCallback: refetch,
}) })
); );

View File

@@ -1,5 +1,5 @@
import { Formik } from "formik"; import { Formik } from "formik";
import React, { useEffect, useState, useRef, useCallback } from "react"; import React, { useState, useRef, useCallback } from "react";
import { StyleSheet, Text, View, ScrollView, FlatList } from "react-native"; import { StyleSheet, Text, View, ScrollView, FlatList } from "react-native";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; import { connect } from "react-redux";
@@ -8,8 +8,6 @@ import {
Button, Button,
TextInput, TextInput,
Card, Card,
Headline,
Subheading,
} from "react-native-paper"; } from "react-native-paper";
import CostCenterSelect from "../Selects/select-cost-center"; import CostCenterSelect from "../Selects/select-cost-center";
import { import {
@@ -26,14 +24,9 @@ import { useMutation } from "@apollo/client";
import { selectCurrentTmTicketJobId } from "../../redux/app/app.selectors"; import { selectCurrentTmTicketJobId } from "../../redux/app/app.selectors";
import ErrorDisplay from "../error-display/error-display.component"; import ErrorDisplay from "../error-display/error-display.component";
import { timeTicketClockOutStart } from "../../redux/timetickets/timetickets.actions"; import { timeTicketClockOutStart } from "../../redux/timetickets/timetickets.actions";
import { logImEXEvent } from "../../firebase/firebase.analytics";
import axios from "axios"; import axios from "axios";
import { useNavigation } from "@react-navigation/native"; import { useNavigation } from "@react-navigation/native";
import styles from "../styles"; import styles from "../styles";
import StyleRepeater from "../style-repeater/style-repeater";
// import { selectCurrentTimeTicketJobId } from "../../redux/timetickets/timetickets.selectors";
import { QUERY_ACTIVE_TIME_TICKETS } from "../../graphql/timetickets.queries";
import { RefreshControl } from "react-native"; import { RefreshControl } from "react-native";
@@ -57,17 +50,11 @@ export function TimeTicketClockOff({
route, route,
}) { }) {
const costCenterDiff = useRef(0); const costCenterDiff = useRef(0);
const setCostCenterDiff = (value) => { const setCostCenterDiff = (value) => {
countRef.current = val; countRef.current = val;
// console.log(`Button clicked ${countRef.current} times`);
}; };
const navigation = useNavigation(); const navigation = useNavigation();
const { timeTicketId } = route.params; const { timeTicketId } = route.params;
// console.log("TimeTicketClockOff, timeTicketId :", timeTicketId);
// console.log( "TimeTicketClockOff, handleOnDone :", handleOnDone );
const { t } = useTranslation(); const { t } = useTranslation();
const [loadingClockOut, setLoadingClockOut] = useState(false); const [loadingClockOut, setLoadingClockOut] = useState(false);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
@@ -79,30 +66,23 @@ export function TimeTicketClockOff({
}); });
const handleFinish = async (values) => { const handleFinish = async (values) => {
logImEXEvent("TimeTicketClockOff_handleFinish");
if ( if (
!!values.actualhours && !!values.actualhours &&
!!values.productivehours && !!values.productivehours &&
!!currentSCC?.value !!currentSCC?.value
) { ) {
if (isNaN(values.actualhours) | isNaN(values.productivehours)) { if (isNaN(values.actualhours) | isNaN(values.productivehours)) {
// console.log("actual hours is NAN!");
setLoadingClockOut(false); setLoadingClockOut(false);
setError({ message: t("timeticketclockoff.errors.nan") }); setError({ message: t("timeticketclockoff.errors.nan") });
return; return;
} }
setError(null); setError(null);
// console.log("all have values:");
} else { } else {
// console.log("missing values!"); setLoadingClockOut(false);
setLoadingClockOut(false);
setError({ message: t("timeticketclockoff.errors.missingvalues") }); setError({ message: t("timeticketclockoff.errors.missingvalues") });
return; return;
} }
// console.log("TimeTicketClockOff, currentRestrictClaimableHoursFlag :", currentRestrictClaimableHoursFlag);
if (!!currentRestrictClaimableHoursFlag) { if (!!currentRestrictClaimableHoursFlag) {
// console.log("TimeTicketClockOff, currentRestrictClaimableHoursFlag I am here:", currentRestrictClaimableHoursFlag);
if (values.productivehours > costCenterDiff.current) { if (values.productivehours > costCenterDiff.current) {
setLoadingClockOut(false); setLoadingClockOut(false);
setError({ setError({
@@ -145,23 +125,15 @@ export function TimeTicketClockOff({
}, },
}, },
}; };
// console.log("TimeTicketClockOff, tempcallobj :", tempcallobj);
//after obj is good add below to make call
setLoadingClockOut(true); setLoadingClockOut(true);
const result = await updateTimeticket(tempcallobj); const result = await updateTimeticket(tempcallobj);
//after call results are retuning add handling below for cases
// console.log("updateTimeticket, result :", result);
setLoadingClockOut(false); setLoadingClockOut(false);
if (!!result.errors) { if (!!result.errors) {
// console.log("updateTimeticket, result.error :", result.errors);
setError(JSON.stringify(result.errors)); setError(JSON.stringify(result.errors));
} else { } else {
// console.log("updateTimeticket, result :", result.data);
navigation.goBack(); navigation.goBack();
} }
//if (completedCallback) completedCallback();
}; };
const onRefresh = useCallback(() => { const onRefresh = useCallback(() => {
@@ -169,7 +141,7 @@ export function TimeTicketClockOff({
// refetch(); // refetch();
setTimeout(() => { setTimeout(() => {
setLoading(false); setLoading(false);
}, 1000); }, 500);
}, []); }, []);
return ( return (

View File

@@ -1,12 +1,11 @@
import { Formik } from "formik"; import { Formik } from "formik";
import React, { useRef, useState } from "react"; import React, { useRef, useState,useCallback } from "react";
import { StyleSheet, Text, View, ScrollView, RefreshControl } from "react-native"; import { StyleSheet, Text, View, ScrollView, RefreshControl,FlatList } from "react-native";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { Button, TextInput, Card } from "react-native-paper"; import { Button, TextInput, Card } from "react-native-paper";
import CostCenterSelect from "../Selects/select-cost-center"; import CostCenterSelect from "../Selects/select-cost-center";
import { JobIdSearchSelect } from "../Selects/select-job-id";
import DateTimePickerModal from "react-native-modal-datetime-picker"; import DateTimePickerModal from "react-native-modal-datetime-picker";
import { import {
selectCurrentEmployee, selectCurrentEmployee,
@@ -17,21 +16,15 @@ import {
selectBodyshop, selectBodyshop,
selectRestrictClaimableHoursFlag, selectRestrictClaimableHoursFlag,
} from "../../redux/user/user.selectors"; } from "../../redux/user/user.selectors";
import { useCallback } from "react";
// import LaborAllocationsTable from "../labor-allocations-table/labor-allocations-table.component";
import LaborAllocationsTable from "../labor-allocations-table/labor-allocations-table.component"; import LaborAllocationsTable from "../labor-allocations-table/labor-allocations-table.component";
import ErrorDisplay from "../error-display/error-display.component"; import ErrorDisplay from "../error-display/error-display.component";
import { INSERT_NEW_TIME_TICKET } from "../../graphql/timetickets.queries"; import { INSERT_NEW_TIME_TICKET } from "../../graphql/timetickets.queries";
import { useMutation } from "@apollo/client"; import { useMutation } from "@apollo/client";
import axios from "axios";
import { logImEXEvent } from "../../firebase/firebase.analytics";
import moment from "moment"; import moment from "moment";
import { useNavigation } from "@react-navigation/native"; import { useNavigation } from "@react-navigation/native";
import styles from "../styles"; import styles from "../styles";
import StyleRepeater from "../style-repeater/style-repeater";
import { FlatList } from "react-native";
import JobSearchAndSelectModal from "../Modals/JobSearchAndSelectModal"; import JobSearchAndSelectModal from "../Modals/JobSearchAndSelectModal";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -41,7 +34,6 @@ const mapStateToProps = createStructuredSelector({
currentEmployeeFullName: selectEmployeeFullName, currentEmployeeFullName: selectEmployeeFullName,
currentRestrictClaimableHoursFlag: selectRestrictClaimableHoursFlag, currentRestrictClaimableHoursFlag: selectRestrictClaimableHoursFlag,
}); });
// const mapDispatchToProps = (dispatch) => ({});
export function TimeTicketCreate({ export function TimeTicketCreate({
currentEmployee, currentEmployee,
@@ -76,15 +68,8 @@ export function TimeTicketCreate({
const [insertTicket] = useMutation(INSERT_NEW_TIME_TICKET); const [insertTicket] = useMutation(INSERT_NEW_TIME_TICKET);
const handleFinish = async (values) => { const handleFinish = async (values) => {
logImEXEvent("handleFinish_called_in_TimeTicketCreate");
// console.log("handleFinish called in TimeTicketCreate");
setError(null); setError(null);
setLoadingCreate(true); setLoadingCreate(true);
// console.log("insertTicket, currentSCC :", currentSCC);
// console.log("insertTicket, currentSCC :", currentSJobId);
// console.log("insertTicket, values :", values);
if ( if (
!!currentSCC?.value && !!currentSCC?.value &&
!!curSelClockIntoJob?.id && !!curSelClockIntoJob?.id &&
@@ -110,7 +95,6 @@ export function TimeTicketCreate({
} }
if (!!currentRestrictClaimableHoursFlag) { if (!!currentRestrictClaimableHoursFlag) {
// console.log("TimeTicketClockOff, currentRestrictClaimableHoursFlag I am here:", currentRestrictClaimableHoursFlag);
if (values.productivehours > costCenterDiff.current) { if (values.productivehours > costCenterDiff.current) {
setLoadingCreate(false); setLoadingCreate(false);
setError({ setError({
@@ -157,19 +141,8 @@ export function TimeTicketCreate({
], ],
}, },
}; };
// clockoff: undefined,
// clockon: undefined,
// memo: undefined,
// console.log("insertTicket, tempVariablesObj. :", tempVariablesObj?.variables?.timeTicketInput[0]); const result = await insertTicket(tempVariablesObj);
//after obj is good add below to make call
const result = await insertTicket(tempVariablesObj); //.catch(handleMutationError);
// console.log(" result : ", result);
// //after call results are retuning add handling below for cases
// console.log("insertTicket, result :", result?.data?.insert_timetickets?.returning[0]);
setLoadingCreate(false); setLoadingCreate(false);
if (!!result.errors) { if (!!result.errors) {
// console.log("insertTicket, result.error :", result.errors); // console.log("insertTicket, result.error :", result.errors);
@@ -185,7 +158,7 @@ export function TimeTicketCreate({
// refetch(); // refetch();
setTimeout(() => { setTimeout(() => {
setLoading(false); setLoading(false);
}, 1000); }, 500);
}, []); }, []);
return ( return (
@@ -206,20 +179,13 @@ export function TimeTicketCreate({
> >
{({ handleChange, handleBlur, handleSubmit, values }) => ( {({ handleChange, handleBlur, handleSubmit, values }) => (
<View style={localStyles.topTimeTicketContainer}> <View style={localStyles.topTimeTicketContainer}>
{/* <JobIdSearchSelect <JobSearchAndSelectModal
currentValue={currentSJobId} currentValue={curSelClockIntoJob}
onJobSelected={setCurrentSJobId} onSetCurrentValue={setCurSelClockIntoJob}
convertedOnly={true}
notExported={!currentBodyshop.tt_allow_post_to_invoiced} notExported={!currentBodyshop.tt_allow_post_to_invoiced}
notInvoiced={!currentBodyshop.tt_allow_post_to_invoiced} notInvoiced={!currentBodyshop.tt_allow_post_to_invoiced}
/> */} convertedOnly={true}
<JobSearchAndSelectModal />
currentValue={curSelClockIntoJob}
onSetCurrentValue={setCurSelClockIntoJob}
notExported={!currentBodyshop.tt_allow_post_to_invoiced}
notInvoiced={!currentBodyshop.tt_allow_post_to_invoiced}
convertedOnly={true}
/>
<Button <Button
mode="outlined" mode="outlined"
title="TicketDatePickerButton" title="TicketDatePickerButton"

View File

@@ -335,7 +335,8 @@
}, },
"labels": { "labels": {
"loggedinemployee": "Logged in Employee", "loggedinemployee": "Logged in Employee",
"clockintojob": "Clock In" "clockintojob": "Clock In",
"nodata":"No Data"
}, },
"errors": { "errors": {
"missingvalues": "Please make sure all fields have a value." "missingvalues": "Please make sure all fields have a value."
@@ -484,7 +485,9 @@
"labels": { "labels": {
"placeholder": "RO #", "placeholder": "RO #",
"selectedplaceholder": "...", "selectedplaceholder": "...",
"searchplaceholder": "Search..." "searchplaceholder": "Search...",
"noselection":"No Selection",
"nodata":"No Data"
} }
}, },
"selectcostcenter":{ "selectcostcenter":{

View File

@@ -335,7 +335,8 @@
}, },
"labels": { "labels": {
"loggedinemployee": "", "loggedinemployee": "",
"clockintojob": "" "clockintojob": "",
"nodata":""
}, },
"errors": { "errors": {
"missingvalues": "" "missingvalues": ""
@@ -484,7 +485,9 @@
"labels": { "labels": {
"placeholder": "", "placeholder": "",
"selectedplaceholder": "...", "selectedplaceholder": "...",
"searchplaceholder": "" "searchplaceholder": "",
"noselection":"",
"nodata":""
} }
}, },
"selectcostcenter":{ "selectcostcenter":{

View File

@@ -335,7 +335,8 @@
}, },
"labels": { "labels": {
"loggedinemployee": "", "loggedinemployee": "",
"clockintojob": "" "clockintojob": "",
"nodata":""
}, },
"errors": { "errors": {
"missingvalues": "" "missingvalues": ""
@@ -484,7 +485,9 @@
"labels": { "labels": {
"placeholder": "", "placeholder": "",
"selectedplaceholder": "...", "selectedplaceholder": "...",
"searchplaceholder": "" "searchplaceholder": "",
"noselection":"",
"nodata":""
} }
}, },
"selectcostcenter":{ "selectcostcenter":{