From 1a53e50d91ed4787a3b41ac4a82593f9241b82ee Mon Sep 17 00:00:00 2001 From: Edwin Eames Date: Sun, 8 Feb 2026 17:54:30 -0500 Subject: [PATCH] feat: 5-tier pricing UI, market ticker, delivery map, and stats dashboard Full frontend companion to the API updates: - Pricing: Oil price admin page now supports 5-tier configuration for same-day/prime/emergency fees with collapsible tier sections - Market Ticker: Add GlobalMarketTicker and OilPriceTicker components with real-time commodity + competitor prices in header bar - Delivery Map: New interactive Leaflet map view for daily deliveries - Stats: Add PricingHistoryChart component and info pages for market trends with daily/weekly/monthly gallon charts and YoY comparisons - Layout: Refactor header navbar to separate search into navbar-center, add oilPrice Pinia store with polling, update sidebar navigation - Forms: Wire tier selection into delivery create/edit flows, update types and services for new pricing and scraper API endpoints Co-Authored-By: Claude Opus 4.6 --- .env.local | 1 + src/components/GlobalMarketTicker.vue | 192 +++++++ src/components/OilPriceTicker.vue | 158 ++++++ src/components/PricingHistoryChart.vue | 173 ++++++ src/constants/states.ts | 23 + src/layouts/DefaultLayout.vue | 7 + src/layouts/headers/headerauth.vue | 161 ++++-- src/layouts/sidebar/sidebar.vue | 10 +- src/pages/Index.vue | 13 +- src/pages/admin/oilprice.vue | 186 ++++++- src/pages/admin/promo/create.vue | 266 ++++------ src/pages/admin/promo/edit.vue | 323 +++++------- src/pages/admin/promo/promo.vue | 218 +++----- src/pages/auth/changepassword.vue | 214 ++++---- src/pages/auth/lostpassword.vue | 149 +++--- src/pages/auth/register.vue | 213 ++++---- src/pages/automatic/home.vue | 279 +++++++--- src/pages/automatic/view.vue | 115 ++-- src/pages/card/addcard.vue | 369 +++++++------ src/pages/card/editcard.vue | 419 +++++++-------- src/pages/card/home.vue | 331 ++++++------ src/pages/customer/home.vue | 12 +- src/pages/customer/profile/TankEstimation.vue | 149 +++++- src/pages/customer/profile/profile.vue | 40 +- .../profile/profile/AutomaticDeliveries.vue | 8 +- .../customer/profile/profile/CreditCards.vue | 11 +- .../profile/profile/CustomerComments.vue | 11 +- .../profile/profile/CustomerStats.vue | 11 +- .../profile/profile/DeliveriesTable.vue | 4 +- .../profile/profile/EquipmentParts.vue | 11 +- .../customer/profile/profile/HistoryTabs.vue | 14 +- .../customer/profile/profile/ProfileMap.vue | 4 +- .../profile/profile/ProfileSummary.vue | 93 ++-- .../profile/profile/ServiceCallsTable.vue | 4 +- .../customer/profile/profile/TankInfo.vue | 48 +- .../profile/profile/TransactionsTable.vue | 4 +- src/pages/delivery/create.vue | 103 +++- src/pages/delivery/edit.vue | 108 +++- src/pages/delivery/home.vue | 12 +- src/pages/delivery/map.vue | 37 ++ .../update_tickets/finalize_ticket.vue | 44 +- src/pages/delivery/viewstatus/cancelled.vue | 81 ++- src/pages/delivery/viewstatus/delivered.vue | 79 ++- src/pages/delivery/viewstatus/finalized.vue | 82 ++- src/pages/delivery/viewstatus/issue.vue | 82 ++- src/pages/delivery/viewstatus/pending.vue | 85 ++- .../delivery/viewstatus/todaysdeliveries.vue | 124 +++-- src/pages/delivery/viewstatus/tommorrow.vue | 91 +++- src/pages/delivery/viewstatus/waiting.vue | 81 ++- src/pages/employee/changepassword.vue | 271 +++++----- src/pages/employee/create.vue | 299 ++++++----- src/pages/employee/edit.vue | 360 +++++++------ src/pages/employee/home.vue | 181 +++---- src/pages/info/PricingHistory.vue | 63 +++ .../pay/auto/authorize_precharge_autho.vue | 4 + .../pay/auto/capture_authorize_autho.vue | 4 + src/pages/service/ServiceHome.vue | 61 ++- src/pages/service/ServicePast.vue | 55 +- src/pages/service/ServiceToday.vue | 55 +- src/pages/ticket/ticket.vue | 497 +++++++----------- src/pages/ticket/ticketauto.vue | 370 ++++++------- src/router/index.ts | 95 ++-- src/services/api.ts | 11 +- src/services/deliveryService.ts | 13 + src/services/paymentService.ts | 17 + src/services/scraperService.ts | 19 + src/stores/oilPrice.ts | 93 ++++ src/types/models.ts | 14 + src/utils/addressUtils.ts | 61 +++ 69 files changed, 4756 insertions(+), 3040 deletions(-) create mode 100644 src/components/GlobalMarketTicker.vue create mode 100644 src/components/OilPriceTicker.vue create mode 100644 src/components/PricingHistoryChart.vue create mode 100644 src/constants/states.ts create mode 100644 src/pages/info/PricingHistory.vue create mode 100644 src/services/scraperService.ts create mode 100644 src/stores/oilPrice.ts create mode 100644 src/utils/addressUtils.ts diff --git a/.env.local b/.env.local index 1717acb..d1af67a 100644 --- a/.env.local +++ b/.env.local @@ -5,4 +5,5 @@ VITE_AUTHORIZE_URL="http://localhost:9616" VITE_VOIPMS_URL="http://localhost:9617" VITE_SERVICE_URL="http://localhost:9615" VITE_ADDRESS_CHECKER_URL="http://localhost:9618" +VITE_SCRAPER_URL="http://localhost:9619" VITE_COMPANY_ID='1' diff --git a/src/components/GlobalMarketTicker.vue b/src/components/GlobalMarketTicker.vue new file mode 100644 index 0000000..1897202 --- /dev/null +++ b/src/components/GlobalMarketTicker.vue @@ -0,0 +1,192 @@ + + + + + + diff --git a/src/components/OilPriceTicker.vue b/src/components/OilPriceTicker.vue new file mode 100644 index 0000000..7f8bb13 --- /dev/null +++ b/src/components/OilPriceTicker.vue @@ -0,0 +1,158 @@ + + + + + + diff --git a/src/components/PricingHistoryChart.vue b/src/components/PricingHistoryChart.vue new file mode 100644 index 0000000..4cb61a9 --- /dev/null +++ b/src/components/PricingHistoryChart.vue @@ -0,0 +1,173 @@ + + + diff --git a/src/constants/states.ts b/src/constants/states.ts new file mode 100644 index 0000000..d1cd59f --- /dev/null +++ b/src/constants/states.ts @@ -0,0 +1,23 @@ +export const STATE_ID_TO_ABBR: Record = { + 0: 'MA', // Default for unmapped + 1: 'AL', 2: 'AK', 3: 'AS', 4: 'AZ', 5: 'AR', 6: 'CA', 7: 'CO', 8: 'CT', + 9: 'DE', 10: 'DC', 11: 'FL', 12: 'GA', 13: 'GU', 14: 'HI', 15: 'ID', + 16: 'IL', 17: 'IN', 18: 'IA', 19: 'KS', 20: 'KY', 21: 'LA', 22: 'ME', + 23: 'MD', 24: 'MA', 25: 'MI', 26: 'MN', 27: 'MS', 28: 'MO', 29: 'MT', + 30: 'NE', 31: 'NV', 32: 'NH', 33: 'NJ', 34: 'NM', 35: 'NY', 36: 'NC', + 37: 'ND', 38: 'OH', 39: 'OK', 40: 'OR', 41: 'PA', 42: 'PR', 43: 'RI', + 44: 'SC', 45: 'SD', 46: 'TN', 47: 'TX', 48: 'UT', 49: 'VT', 50: 'VA', + 51: 'VI', 52: 'WA', 53: 'WV', 54: 'WI', 55: 'WY', +} + +export const STATE_ID_TO_NAME: Record = { + 0: 'Massachusetts', + 1: 'Alabama', 2: 'Alaska', 3: 'American Samoa', 4: 'Arizona', 5: 'Arkansas', 6: 'California', 7: 'Colorado', 8: 'Connecticut', + 9: 'Delaware', 10: 'District of Columbia', 11: 'Florida', 12: 'Georgia', 13: 'Guam', 14: 'Hawaii', 15: 'Idaho', + 16: 'Illinois', 17: 'Indiana', 18: 'Iowa', 19: 'Kansas', 20: 'Kentucky', 21: 'Louisiana', 22: 'Maine', + 23: 'Maryland', 24: 'Massachusetts', 25: 'Michigan', 26: 'Minnesota', 27: 'Mississippi', 28: 'Missouri', 29: 'Montana', + 30: 'Nebraska', 31: 'Nevada', 32: 'New Hampshire', 33: 'New Jersey', 34: 'New Mexico', 35: 'New York', 36: 'North Carolina', + 37: 'North Dakota', 38: 'Ohio', 39: 'Oklahoma', 40: 'Oregon', 41: 'Pennsylvania', 42: 'Puerto Rico', 43: 'Rhode Island', + 44: 'South Carolina', 45: 'South Dakota', 46: 'Tennessee', 47: 'Texas', 48: 'Utah', 49: 'Vermont', 50: 'Virginia', + 51: 'Virgin Islands', 52: 'Washington', 53: 'West Virginia', 54: 'Wisconsin', 55: 'Wyoming', +} diff --git a/src/layouts/DefaultLayout.vue b/src/layouts/DefaultLayout.vue index 65aa5d9..be51e1d 100644 --- a/src/layouts/DefaultLayout.vue +++ b/src/layouts/DefaultLayout.vue @@ -33,11 +33,18 @@ diff --git a/src/layouts/headers/headerauth.vue b/src/layouts/headers/headerauth.vue index 824892d..2b50864 100755 --- a/src/layouts/headers/headerauth.vue +++ b/src/layouts/headers/headerauth.vue @@ -15,7 +15,7 @@ - - -