update files
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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({});
|
|
||||||
@@ -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} - `
|
||||||
|
|||||||
@@ -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({});
|
|
||||||
@@ -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);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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"); }
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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()),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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,
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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":{
|
||||||
|
|||||||
@@ -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":{
|
||||||
|
|||||||
@@ -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":{
|
||||||
|
|||||||
Reference in New Issue
Block a user