From 46b4523ed889b91d5ba04347a58ae2f1617617d5 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Mon, 24 Nov 2025 10:25:24 -0800 Subject: [PATCH] Minor UI improvements. --- app.json | 2 +- app/jobs/_layout.tsx | 1 + components/data-label/data-label.jsx | 4 +- components/job-documents/job-documents.jsx | 17 +- .../job-status-selector.jsx | 2 +- components/job-tombstone/job-tombstone.jsx | 58 +- components/jobs-list/job-list-item.jsx | 15 +- env.js | 1 + readme.md | 3 + util/demodata.js | 514 ++++++++++++++++++ 10 files changed, 590 insertions(+), 27 deletions(-) create mode 100644 util/demodata.js diff --git a/app.json b/app.json index b8e716c..bcfd8bb 100644 --- a/app.json +++ b/app.json @@ -6,7 +6,7 @@ "scheme": "imex-mobile-scheme", "userInterfaceStyle": "automatic", "extra": { - "expover": "21", + "expover": "22", "eas": { "projectId": "ffe01f3a-d507-4698-82cd-da1f1cad450b" } diff --git a/app/jobs/_layout.tsx b/app/jobs/_layout.tsx index 5ce4de0..acf0324 100644 --- a/app/jobs/_layout.tsx +++ b/app/jobs/_layout.tsx @@ -50,6 +50,7 @@ function JobsStack({ openImagePicker }) { alignSelf: "center", justifyContent: "center", }} + mode="outlined" onPress={handleUpload} > {t("general.labels.upload")} diff --git a/components/data-label/data-label.jsx b/components/data-label/data-label.jsx index cef84e3..35d5d0d 100644 --- a/components/data-label/data-label.jsx +++ b/components/data-label/data-label.jsx @@ -7,6 +7,7 @@ export default function DataLabelComponent({ label, content, dateTime, + noTextWrap, ...restProps }) { let theContent = content; @@ -19,7 +20,8 @@ export default function DataLabelComponent({ return ( {label} - {theContent} + + {noTextWrap ? content : {theContent}} ); } diff --git a/components/job-documents/job-documents.jsx b/components/job-documents/job-documents.jsx index 9157df6..818b2cf 100644 --- a/components/job-documents/job-documents.jsx +++ b/components/job-documents/job-documents.jsx @@ -5,6 +5,7 @@ import React, { useCallback, useEffect, useState } from "react"; import { FlatList, RefreshControl, TouchableOpacity, View } from "react-native"; import ImageView from "react-native-image-viewing"; import { ActivityIndicator, Text } from "react-native-paper"; +import { SafeAreaView } from "react-native-safe-area-context"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import env from "../../env"; @@ -149,13 +150,15 @@ export function JobDocumentsComponent({ bodyshop }) { )} /> - setPreviewVisible(false)} - visible={previewVisible} - images={fullphotos} - imageIndex={imgIndex} - swipeToCloseEnabled={true} - /> + + setPreviewVisible(false)} + visible={previewVisible} + images={fullphotos} + imageIndex={imgIndex} + swipeToCloseEnabled={true} + /> + ); } diff --git a/components/job-status-selector/job-status-selector.jsx b/components/job-status-selector/job-status-selector.jsx index 0fa9897..b0c805f 100644 --- a/components/job-status-selector/job-status-selector.jsx +++ b/components/job-status-selector/job-status-selector.jsx @@ -107,7 +107,7 @@ export const JobStatusSelector = ({ const styles = StyleSheet.create({ root: { alignSelf: "flex-start", - paddingTop: 4, + paddingTop: 8, }, trigger: { minWidth: 140, diff --git a/components/job-tombstone/job-tombstone.jsx b/components/job-tombstone/job-tombstone.jsx index ba8429b..c3f1c71 100644 --- a/components/job-tombstone/job-tombstone.jsx +++ b/components/job-tombstone/job-tombstone.jsx @@ -1,3 +1,4 @@ +import env from "@/env"; import { GET_JOB_TOMBSTONE } from "@/graphql/jobs.queries"; import { selectBodyshop } from "@/redux/user/user.selectors"; import { useQuery } from "@apollo/client"; @@ -5,15 +6,23 @@ import { useLocalSearchParams, useRouter } from "expo-router"; import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { + Platform, RefreshControl, ScrollView, StyleSheet, TouchableOpacity, - View + View, } from "react-native"; -import { ActivityIndicator, Card, Chip, Text } from "react-native-paper"; +import { + ActivityIndicator, + Button, + Card, + Chip, + Text, +} from "react-native-paper"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; +import { firstNames, getRandomIndex, lastNames } from "../../util/demodata"; import DataLabelComponent from "../data-label/data-label"; import ErrorDisplay from "../error/error-display"; import { JobStatusSelector } from "../job-status-selector/job-status-selector"; @@ -122,8 +131,12 @@ function JobTombstone({ bodyshop }) { {job.inproduction && ( + {t("objects.jobs.labels.inproduction")} } @@ -143,7 +156,12 @@ function JobTombstone({ bodyshop }) { label={t("objects.jobs.fields.related_ros")} content={ {job.vehicle?.jobs ?.filter((ro) => ro.id !== job.id) @@ -159,7 +177,9 @@ function JobTombstone({ bodyshop }) { }} key={ro.id} > - {ro.ro_number || "N/A"} + ))} @@ -178,21 +198,33 @@ function JobTombstone({ bodyshop }) { ); diff --git a/components/jobs-list/job-list-item.jsx b/components/jobs-list/job-list-item.jsx index ed4349f..3e89950 100644 --- a/components/jobs-list/job-list-item.jsx +++ b/components/jobs-list/job-list-item.jsx @@ -1,9 +1,11 @@ +import env from "@/env"; +import { firstNames, getRandomIndex, lastNames } from "@/util/demodata"; import * as Haptics from "expo-haptics"; import { useRouter } from "expo-router"; import React, { memo, useCallback } from "react"; import { useTranslation } from "react-i18next"; import { Pressable, StyleSheet, View } from "react-native"; -import { Chip, IconButton, Text, useTheme } from "react-native-paper"; +import { IconButton, Text, useTheme } from "react-native-paper"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { logImEXEvent } from "../../firebase/firebase.analytics"; @@ -35,7 +37,11 @@ function JobListItemComponent({ openImagePicker, item }) { openImagePicker(item.id); }, [openImagePicker, item.id]); - const ownerName = `${item.ownr_fn || ""} ${item.ownr_ln || ""}`.trim(); + const ownerName = env.DEMO_MODE + ? `${firstNames[getRandomIndex()] || ""} ${ + lastNames[getRandomIndex()] || "" + }` + : `${item.ownr_fn || ""} ${item.ownr_ln || ""}`.trim(); const company = item.ownr_co_nm || ""; const vehicle = `${item.v_model_yr || ""} ${item.v_make_desc || ""} ${ item.v_model_desc || "" @@ -92,8 +98,9 @@ function JobListItemComponent({ openImagePicker, item }) { > {vehicle} - - {item.status} + + + {item.status} { + return Math.floor(Math.random() * (countOfnames - 0 + 1)) + 0; +} + +export { countOfnames, firstNames, getRandomIndex, lastNames }; +