Compare commits

...

1406 Commits

Author SHA1 Message Date
Dave
288c8e6347 RrScratch3 - Tax / Extras Improvements 2025-12-05 13:17:25 -05:00
Dave
56738f800c Merge remote-tracking branch 'origin/feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration' into rrScratch3 2025-12-05 12:13:57 -05:00
Dave
bedf4f2c02 Merge branch 'feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration' into rrScratch3 2025-12-05 12:13:27 -05:00
Dave Richer
6032ff0e5d Merged in release/2025-12-05 (pull request #2690)
feature/IO-3457-Job-Lifecycle-Tags
2025-12-04 21:23:48 +00:00
Dave Richer
77268d5f5b Merged in feature/IO-3457-job-lifecyle-tags (pull request #2689)
feature/IO-3457-Job-Lifecycle-Tags
2025-12-04 21:23:27 +00:00
Dave
1b3abf17ec feature/IO-3457-Job-Lifecycle-Tags 2025-12-04 16:22:41 -05:00
Dave
0ef68afa0c feature/IO-3456-Broken-Image - Fix issue 2025-12-04 14:30:42 -05:00
Dave
12b4ae3b8d Merge remote-tracking branch 'origin/release/2025-12-05' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-12-04 14:22:41 -05:00
Dave Richer
3cfd445894 Merged in feature/IO-3456-Broken-Image-Path (pull request #2687)
feature/IO-3456-Broken-Image - Fix issue
2025-12-04 19:22:03 +00:00
Dave
b510eec9aa feature/IO-3456-Broken-Image - Fix issue 2025-12-04 14:20:58 -05:00
Dave
e92bab0455 Scratch 2025-12-04 14:12:11 -05:00
Dave
4de3d3c6fc Merge remote-tracking branch 'origin/release/2025-12-05' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-12-03 14:04:41 -05:00
Allan Carr
e5eac0933f Merged in feature/IO-3262-Tech-Console-Job-Clock-Out (pull request #2685)
IO-3262 Add email address to Usage Report

Approved-by: Dave Richer
2025-12-03 19:04:08 +00:00
Allan Carr
a3c71fdfc0 IO-3262 Add email address to Usage Report
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-12-03 10:28:20 -08:00
Dave
a6b3bd573e rrScratch3 - Remove unused fields in RR from responsibility centers 2025-12-02 15:08:49 -05:00
Dave
18373fc865 rrScratch3 - Capture external DMS Id 2025-12-02 15:00:11 -05:00
Dave
3ae8ed8496 rrScratch3 - Progress Commit 2025-12-02 14:10:31 -05:00
Allan Carr
78750d3d96 Merged in feature/IO-3262-Tech-Console-Job-Clock-Out (pull request #2682)
IO-3262 Tech Console Job Clock Out

Approved-by: Dave Richer
2025-12-02 18:59:41 +00:00
Allan Carr
90edf94fee IO-3262 Tech Console Job Clock Out
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-12-01 12:50:11 -08:00
Dave
3507e60356 Merge branch 'feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration' of bitbucket.org:snaptsoft/bodyshop into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-12-01 13:02:44 -05:00
Dave
43feb16950 rrScratch3 - Progress Commit 2025-12-01 13:02:13 -05:00
Dave
827f1c2c40 rrScratch3 - Progress Commit 2025-11-28 14:41:00 -05:00
Patrick Fic
58f5ed1ce7 Comment unrequired fortellis API. 2025-11-28 10:31:13 -08:00
Dave
c1e3c08652 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Fixes to Caching of allocations summary 2025-11-28 11:29:48 -05:00
Dave
d885bac7d0 Merge remote-tracking branch 'origin/release/2025-12-05' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-11-28 10:50:08 -05:00
Allan Carr
065fb72677 Merged in feature/IO-3452-Documents-Adjustments (pull request #2678)
IO-3452 Documents Adjustments

Approved-by: Dave Richer
2025-11-28 15:49:40 +00:00
Allan Carr
ddc6141480 IO-3452 Documents Adjustments
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-27 13:15:26 -08:00
Dave
fa7da3cad0 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration / Merges and adjustments 2025-11-26 15:37:34 -05:00
Patrick Fic
f1bad01cec Fortellis certification updates. 2025-11-26 11:09:37 -08:00
Dave
3d6498f938 Merge remote-tracking branch 'origin/release/2025-12-05' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-11-26 11:30:33 -05:00
Allan Carr
7bc137fa79 Merged in feature/IO-3450-Additional-Crisp-Segments (pull request #2675)
Feature/IO-3450 Additional Crisp Segments

Approved-by: Dave Richer
2025-11-26 16:30:07 +00:00
Allan Carr
dafe9de753 IO-3450 Grammer Correction
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-25 18:10:10 -08:00
Allan Carr
78a8474a24 IO-3450 Additional Crisp Segments
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-25 17:56:19 -08:00
Dave
910d388e05 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration / RRScratch2 / Improve reconnect logic 2025-11-25 18:04:15 -05:00
Dave
9faad53b99 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration / RRScratch2 / Polish 2025-11-25 17:59:19 -05:00
Dave
3b07055d5a feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration / RRScratch2 / Polish 2025-11-25 17:36:50 -05:00
Dave
ec29a22984 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration / RRScratch2 / Math Adjustments / DMS State cleaning on Page load 2025-11-25 14:58:53 -05:00
Dave
2b1836d450 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration / RRScratch2 / Checkpoint 2025-11-25 14:13:10 -05:00
Dave
ae7d150a6c feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration / RRScratch2 / Checkpoint 2025-11-24 17:21:33 -05:00
Dave Richer
123066f1cd Merged in release/2025-11-21 (pull request #2671)
Release/2025 11 21 into Master-AIO - IO-3435 IO-3445 IO-3440 IO-3446
2025-11-21 19:19:15 +00:00
Dave
b2184a2d11 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration Checkpoint 2025-11-20 21:57:49 -05:00
Allan Carr
a153cca3c0 Merged in feature/IO-3440-Payment-By-Date-Excel (pull request #2669)
IO-3440 Payment By Date - Excel
2025-11-21 00:26:54 +00:00
Allan Carr
35c7c32c8e IO-3440 Payment By Date - Excel
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-20 16:29:05 -08:00
Dave
9b1c8fa72b Merge remote-tracking branch 'origin/release/2025-11-21' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-11-20 14:54:21 -05:00
Allan Carr
6d6b64ebc3 Merged in feature/IO-3446-Kaizen-Datapump-Extension (pull request #2667)
IO-3446 Kaizen Datapump Extension

Approved-by: Dave Richer
2025-11-20 19:53:47 +00:00
Dave
c3bc29fa9b feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration -Full Flow verified 2025-11-20 14:52:39 -05:00
Allan Carr
c954695d3c IO-3446 Kaizen Datapump Extension
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-19 19:43:55 -08:00
Patrick Fic
338d8e2136 Merged in feature/media-analytics-logging (pull request #2663)
Add unique/dupe columns to media analytics.

Approved-by: Dave Richer
2025-11-19 19:26:00 +00:00
Allan Carr
6674206b4f Merged in feature/IO-3440-Payment-By-Date-Excel (pull request #2665)
IO-3440 Payment By Date - Excel

Approved-by: Dave Richer
2025-11-19 19:16:31 +00:00
Allan Carr
c46ad521d1 Merged in feature/IO-3445-RBAC-BILL-ENTER (pull request #2664)
IO-3445 RBAC Bill:Enter

Approved-by: Dave Richer
2025-11-19 19:13:26 +00:00
Dave
34f45379a6 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checking in verified 2025-11-19 11:22:04 -05:00
Allan Carr
66e5bec4d8 IO-3440 Payment By Date - Excel
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-18 17:05:42 -08:00
Allan Carr
0d3161ef84 IO-3445 RBAC Bill:Enter
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-18 16:47:26 -08:00
Patrick Fic
1cd11bdc18 Add unique/dupe columns to media analytics. 2025-11-17 16:42:39 -08:00
Patrick Fic
9cce2696e2 Merge branch 'master-AIO' into feature/media-analytics-logging 2025-11-17 16:31:04 -08:00
Dave
e20ef4374c Checkpoint 2025-11-17 17:30:52 -05:00
Dave
43dc760c95 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checking in verified 2025-11-17 15:01:38 -05:00
Dave
cfd5aaff87 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checking in verified 2025-11-17 15:00:36 -05:00
Dave
6162e7f18d feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checking in verified 2025-11-17 14:47:08 -05:00
Dave
cdee754042 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Bump Deps 2025-11-17 12:34:23 -05:00
Dave
a8fb16122a feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Bump Deps 2025-11-14 15:36:40 -05:00
Dave
a88be98d45 Merge remote-tracking branch 'origin/feature/IO-2776-cdk-fortellis' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-11-14 15:27:11 -05:00
Dave
e44bc07ffe Merge remote-tracking branch 'origin/feature/IO-2776-cdk-fortellis' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-11-14 15:22:23 -05:00
Dave
60e8aadd8c feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - shop-info.responsibilitycenters.component.jsx cleanup (remove dead code) 2025-11-14 14:42:50 -05:00
Patrick Fic
daf9f197eb IO-2776 Re-disable make fields. 2025-11-14 11:00:08 -08:00
Patrick Fic
5848daef72 IO-2776 Remove ref file. 2025-11-14 10:58:37 -08:00
Dave
bc77bec610 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-14 13:58:20 -05:00
Patrick Fic
c655badae2 Fortellis cleanup. 2025-11-14 10:55:47 -08:00
Patrick Fic
7af70f7512 Additional Fortellis functionality on delete. 2025-11-14 08:36:42 -08:00
Patrick Fic
a8dcc542cc Merge remote-tracking branch 'origin/master-AIO' into feature/IO-2776-cdk-fortellis 2025-11-13 14:27:43 -08:00
Dave
e4c87dd06d feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Enhance logging 2025-11-13 17:08:33 -05:00
Dave
16899007d8 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Enhance logging 2025-11-13 16:53:50 -05:00
Dave
9cb1b25b1d feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Enhance logging 2025-11-13 16:38:00 -05:00
Dave
4c250f6189 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Enhance logging 2025-11-13 15:39:29 -05:00
Dave
9c2c0b665d feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-13 14:31:55 -05:00
Dave
09ea6dff2b feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration -Cleaned up DMS key check (consolidated into a helper function), Clean up DMS post form and make it agnostic, same with customer selector. 2025-11-13 11:18:11 -05:00
Dave
577c3bec04 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Expanded Logs / Formatting change 2025-11-12 17:35:07 -05:00
Dave
90f653c0b7 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Expanded Logs / Formatting change 2025-11-12 17:01:54 -05:00
Dave
556cd993b9 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Cashiering Checkpoint 2025-11-12 16:13:23 -05:00
Dave
e3b4620d0c feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Refresh button inside VIN Enforced, add TOo Many OPen RO Handlers 2025-11-12 12:56:34 -05:00
Dave
cbfda822c6 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Bump Deps 2025-11-12 12:28:53 -05:00
Dave
52811f5f45 Merge remote-tracking branch 'origin/release/2025-11-21' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-11-12 12:11:27 -05:00
Patrick Fic
508d32d2d9 Merged in feature/media-analytics-logging (pull request #2661)
Add indexes for media analytics.
2025-11-12 04:36:26 +00:00
Patrick Fic
cccc307862 Add indexes for media analytics. 2025-11-11 20:35:59 -08:00
Dave
29049cf1b0 Merge remote-tracking branch 'origin/release/2025-11-21' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-11-10 20:22:14 -05:00
Dave
b517f3966d Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-11-10 20:21:11 -05:00
Patrick Fic
0772139a60 Merged in feature/media-analytics-logging (pull request #2659)
Add trigger to remove fk violations for media analytics.
2025-11-10 23:38:58 +00:00
Patrick Fic
70028c8be6 Add trigger to remove fk violations for media analytics. 2025-11-10 15:38:17 -08:00
Allan Carr
3dc22bfdab Merged in feature/IO-3435-SpeedPrint-Filtering-in-Config (pull request #2657)
IO-3435 SpeedPrint Filtering in Config

Approved-by: Dave Richer
2025-11-10 19:31:55 +00:00
Dave
91f419f4b3 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration Translations / Export Logs 2025-11-10 14:30:11 -05:00
Allan Carr
f3ee421030 IO-3435 SpeedPrint Filtering in Config
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-10 11:23:49 -08:00
Dave
a5f8fbacc1 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration Clean up posting form 2025-11-10 13:19:54 -05:00
Dave
8bb58df32e feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration Clean up posting form 2025-11-10 13:19:30 -05:00
Dave
1e3b3b853e feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration -Insert Export Log 2025-11-10 12:34:22 -05:00
Dave
02eb212758 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration -Checkpoint 2025-11-10 12:20:30 -05:00
Dave Richer
6b41d6f2a2 Merged in release/2025-11-07 (pull request #2654)
Release/2025-11-07 into master-AIO - IO-3428 IO-3430 IO-3433 IO-3432 IO-3429
2025-11-08 01:50:57 +00:00
Dave
d45d557a81 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration -Dedupe 2025-11-07 16:09:18 -05:00
Dave
c0157454e1 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - insert service vehical working 2025-11-07 16:02:25 -05:00
Dave
00e6d31a88 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - rr-Utils hardening 2025-11-07 15:57:22 -05:00
Dave
e5ed11287d feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - rr-Utils hardening 2025-11-07 15:43:44 -05:00
Dave
fa250f10a2 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - rr-Utils hardening 2025-11-07 15:28:23 -05:00
Patrick Fic
b8fed77f43 Merged in feature/media-analytics-logging (pull request #2655)
Schema changes to floats.
2025-11-07 20:16:20 +00:00
Patrick Fic
3f5614d77e Schema changes to floats. 2025-11-07 12:15:45 -08:00
Dave
5a8a5bf7ab feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration -VIN Ownership checks 2025-11-07 14:36:57 -05:00
Dave
9ce022b5e8 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Cache advisors for a week / allow them to refresh said cache 2025-11-07 12:26:25 -05:00
Dave
b0b73f1af8 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Cache advisors for a week / allow them to refresh said cache 2025-11-07 11:13:23 -05:00
Dave
a788beaa19 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-07 11:01:56 -05:00
Patrick Fic
6c5c4bd333 Merged in feature/media-analytics-logging (pull request #2652)
Add shop ID to jobs get for LMS.
2025-11-06 22:03:52 +00:00
Patrick Fic
43c1eef70c Add shop ID to jobs get for LMS. 2025-11-06 14:03:19 -08:00
Patrick Fic
b8d97d9821 Merged in feature/media-analytics-logging (pull request #2651)
Add API route for media analytics, and updates to database schema.
2025-11-06 21:58:14 +00:00
Patrick Fic
6843441b17 Add API route for media analytics, and updates to database schema. 2025-11-06 13:57:39 -08:00
Dave
d6b295855d feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Bump Deps 2025-11-06 13:13:09 -05:00
Dave
e36baaa682 Merge remote-tracking branch 'origin/release/2025-11-07' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration
# Conflicts:
#	package-lock.json
#	package.json
2025-11-06 13:06:21 -05:00
Dave Richer
409e04ed0e Merged in feature/IO-3429-Remove-Data-Dog (pull request #2649)
feature/IO-3429-Remove-Data-Dog - Remove Datadog
2025-11-06 18:04:17 +00:00
Dave
95c7872b34 feature/IO-3429-Remove-Data-Dog - Remove Datadog 2025-11-06 13:02:33 -05:00
Allan Carr
91bf5c8d0f Merged in feature/IO-3433-CC-Info-in-Job-Statuses (pull request #2645)
IO-3433 Extend CC Info in Job Status

Approved-by: Dave Richer
2025-11-06 17:53:39 +00:00
Allan Carr
3660fb1b1b Merged in feature/IO-3432-Admin-Clerk (pull request #2647)
IO-3432 Admin Clerk

Approved-by: Dave Richer
2025-11-06 17:52:48 +00:00
Dave
35f00df77e Merge remote-tracking branch 'origin/release/2025-11-07' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-11-06 12:52:04 -05:00
Allan Carr
7573286163 IO-3432 Admin Clerk
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-05 18:08:12 -08:00
Patrick Fic
34ab42c0ad Merged in feature/media-analytics-logging (pull request #2646)
Hasura  for media analytics
2025-11-05 23:09:00 +00:00
Patrick Fic
a3c3f60d2a Hasura for media analytics 2025-11-05 15:07:48 -08:00
Dave
286c49deb1 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-05 16:51:11 -05:00
Patrick Fic
a16c680d04 Add department overrides. 2025-11-05 13:23:24 -08:00
Dave
9341806b0f feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-05 12:04:14 -05:00
Dave
da28fe8592 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-05 11:28:14 -05:00
Dave
f2faa5b686 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-05 11:14:54 -05:00
Dave
bedca60744 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-05 09:46:22 -05:00
Dave
5344a2031d feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-04 16:56:28 -05:00
Allan Carr
8147bc76fd IO-3433 Extend CC Info in Job Status
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-04 13:05:53 -08:00
Dave
c60dfa4319 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-04 15:18:08 -05:00
Dave
aa692d4d05 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-04 15:18:03 -05:00
Allan Carr
9ef1022311 Merged in feature/IO-3430-Additional-Costs (pull request #2643)
IO-3430 Additional Cost Items

Approved-by: Dave Richer
2025-11-04 19:29:15 +00:00
Dave
5bbda89fb9 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-04 14:19:26 -05:00
Dave
ccf3d7df5b feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-04 12:15:27 -05:00
Allan Carr
3c0e62ffac IO-3430 Additional Cost Items
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-04 08:57:23 -08:00
Dave
eeb685802e feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-04 11:45:54 -05:00
Dave
ea14606538 Merge remote-tracking branch 'origin/release/2025-11-07' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-11-04 11:19:44 -05:00
Dave
3d24d44274 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-11-04 11:19:20 -05:00
Allan Carr
a9a0415501 Merged in feature/IO-3428-Media-Selector (pull request #2641)
IO-3428 Media Selector

Approved-by: Dave Richer
2025-11-03 17:11:14 +00:00
Allan Carr
fbaf47b89b IO-3428 Media Selector
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-31 15:13:29 -07:00
Dave
65e26ed5c9 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Bump packages 2025-10-31 12:09:54 -04:00
Dave
a73617fd3c feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-10-29 12:53:53 -04:00
Dave
32a0e89467 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-10-29 10:43:09 -04:00
Dave
e06f0f9918 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint - Remove old attempt at Reynolds Integration in favor of new library. 2025-10-29 10:42:32 -04:00
Dave Richer
907f291f90 Merged in release/2025-10-24 (pull request #2640)
Release/2025 10 24 into master-AIO - IO-3412 - IO-3398
2025-10-25 01:41:09 +00:00
Patrick Fic
abce19530f Merged in feature/IO-3398-bill-line-select-display (pull request #2638)
IO-3398 Bill line search select will now show price in select value.
2025-10-23 18:49:29 +00:00
Patrick Fic
1fd9b68320 IO-3398 Bill line search select will now show price in select value. 2025-10-23 11:48:35 -07:00
Patrick Fic
cff1afe605 Merged in feature/IO-3412-costing-tax-rate-typo (pull request #2637)
IO-3412 Resolve tax rate typo in job costing.
2025-10-23 16:21:03 +00:00
Patrick Fic
b337309f94 IO-3412 Resolve tax rate typo in job costing. 2025-10-23 09:17:15 -07:00
Dave
319f3220ed feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-10-20 11:23:10 -04:00
Patrick Fic
77f041b0f1 Merged in feature/IO-3407-us-qbd-tax-adj-quantity (pull request #2636)
IO-3407 Remove tax code ref for adjustment as well.
2025-10-17 22:09:11 +00:00
Patrick Fic
68be8670b4 IO-3407 Remove tax code ref for adjustment as well. 2025-10-17 15:06:58 -07:00
Patrick Fic
745c429f08 Merged in feature/IO-3407-us-qbd-tax-adj-quantity (pull request #2635)
IO-3407 Resolve quantity required for QBD sales tax adj.
2025-10-17 21:57:23 +00:00
Patrick Fic
cc9e4740de IO-3407 Resolve quantity required for QBD sales tax adj. 2025-10-17 14:56:44 -07:00
Dave
a4da874a1a feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Deps 2025-10-17 17:12:44 -04:00
Dave
2f4c0e329a Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-10-17 15:00:16 -04:00
Dave Richer
06ebcbaa07 Merged in release/2025-10-17 (pull request #2633)
Release/2025 10 17  into Master-AIO - IO-3373 - IO-3404 - IO-3385
2025-10-17 18:59:37 +00:00
Dave
42427c4569 release/2025-10-17 - Refine Job Totals Logging (switch from error to warn for USA key issues, normalize case on logging level) 2025-10-17 14:56:21 -04:00
Patrick Fic
c6d083ce02 Additional fortellis changes. 2025-10-15 15:20:14 -07:00
Dave Richer
d5f921ed35 Merged in feature/IO-3385-Remove-CASL-From-Rome (pull request #2631)
feature/IO-3385-Remove-CASL-From-Rome - Remove CASL Report from Rome Customers.
2025-10-15 15:48:13 +00:00
Dave
043471fdbc feature/IO-3385-Remove-CASL-From-Rome - Remove CASL Report from Rome Customers. 2025-10-15 11:46:51 -04:00
Dave Richer
54850e8ee2 Merged in feature/IO-3404-Seamless-Logout (pull request #2629)
feature/IO-3404-Seamless-Logout - Implement Seamless Logout
2025-10-15 15:33:29 +00:00
Dave
199ddc7d9e feature/IO-3404-Seamless-Logout - Implement Seamless Logout 2025-10-15 11:31:34 -04:00
Dave
e514cf8d6a feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-10-14 14:55:10 -04:00
Dave
6671db1724 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-10-14 14:26:15 -04:00
Dave
5a9381ebdb feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-10-14 13:23:32 -04:00
Dave
6bab792b5e Merge remote-tracking branch 'origin/release/2025-10-17' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-10-14 10:40:31 -04:00
Dave Richer
13a44b9a59 Merged in hotfix/2025-10-10 (pull request #2628)
Hotfix/2025 10 10 - Change BullMQ Key Delimiters based on system logs.

Approved-by: Patrick Fic
2025-10-11 01:35:51 +00:00
Dave Richer
e3337bacea Merged in hotfix/2025-10-10 (pull request #2626)
Hotfix/2025 10 10
2025-10-10 20:05:08 +00:00
Dave
8e6c809fc6 Update 2025-10-10 16:02:56 -04:00
Dave
41afedd02c Change Delemiters in BullMQ, was using an invalid : 2025-10-10 15:58:32 -04:00
Dave
64207ef76c feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-10-10 15:47:37 -04:00
Allan Carr
29df829120 Merged in feature/IO-3373-Dashboard-Component-Redux-Fix (pull request #2622)
IO-3373 Dashboard Component Refresh Cyclic object fix

Approved-by: Dave Richer
2025-10-10 16:08:21 +00:00
Allan Carr
11e0c3e507 Merged in hotfix/2025-10-09 (pull request #2624)
Hotfix/2025 10 09
2025-10-09 17:57:20 +00:00
Allan Carr
6c1c7c9c2c Merged in feature/IO-3386-carfax-rps (pull request #2623)
Feature/IO-3386 carfax rps
2025-10-09 17:55:21 +00:00
Allan Carr
d2b6054e60 Merged in feature/IO-3386-carfax-rps (pull request #2620)
IO-3368 CARFAX Adjustments for OP_CODE [PENDING APPROVAL]
2025-10-09 17:28:31 +00:00
Allan Carr
7004ed9880 IO-3373 Dashboard Component Refresh Cyclic object fix
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-09 09:13:03 -07:00
Allan Carr
36dfed80fb IO-3386 CARFAX RPS adjustment
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-08 19:31:46 -07:00
Dave
de02b34a63 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-10-08 13:57:34 -04:00
Dave Richer
e3df22160b Merged in release/2025-10-17 (pull request #2621)
Release/2025 10 17 into master-AIO - IO-3330, IO-3356, IO-3365, IO-3368, IO-3373, IO-3386, IO-3388, IO-3389, IO-3390, IO-3395
2025-10-08 01:22:16 +00:00
Dave
2ffc4b81f4 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint 2025-10-07 16:45:06 -04:00
Patrick Fic
ec30e73b3e WIP Get Makes 2025-10-07 13:23:42 -07:00
Allan Carr
0ccfe6f3aa IO-3368 CARFAX Adjustments for OP_CODE
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-07 13:02:44 -07:00
Allan Carr
34d70f6a18 Merged in feature/IO-3373-Dashboard-Component-Redux-Fix (pull request #2618)
IO-3373 Remove Cache Eviction

Approved-by: Dave Richer
2025-10-07 18:40:51 +00:00
Allan Carr
fc1bf213c7 Merged in feature/IO-3395-Postback-Payment-Date (pull request #2614)
IO-3395 Postback Payment Date

Approved-by: Dave Richer
2025-10-07 18:40:28 +00:00
Allan Carr
4dc72986d0 IO-3373 Remove Cache Eviction
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-07 11:07:12 -07:00
Allan Carr
f19b9cb8e1 IO-3395 Postback Payment Date
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-07 10:59:10 -07:00
Dave
c149d457e7 feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Packages / Styling. 2025-10-07 13:27:30 -04:00
Dave
88c00cf34f Merge remote-tracking branch 'origin/release/2025-10-17' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration
# Conflicts:
#	client/package-lock.json
#	client/package.json
#	package-lock.json
#	package.json
2025-10-07 12:25:23 -04:00
Allan Carr
c9ade68dc9 Merged in feature/IO-3386-carfax-rps (pull request #2610)
IO-3386 Cleanup To extension

Approved-by: Dave Richer
2025-10-07 16:16:15 +00:00
Allan Carr
0d247a38d2 Merged in feature/IO-3373-Dashboard-Component-Redux-Fix (pull request #2609)
IO-3373 Dashboard Component Redux Fix

Approved-by: Dave Richer
2025-10-07 16:15:49 +00:00
Dave Richer
595ffa02ba Merged in feature/IO-3390-parts-management-2 (pull request #2615)
feature/IO-3390-Parts-Management-2 - Add Job status patch route, Bodyshop Patch route, remove PAO from simplified parts filter.
2025-10-07 16:13:24 +00:00
Dave
d573335eb0 feature/IO-3390-Parts-Management-2 - Add Job status patch route, Bodyshop Patch route, remove PAO from simplified parts filter. 2025-10-07 12:11:53 -04:00
Allan Carr
bdd5056c9a IO-3395 Postback Payment Date
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-06 21:35:31 -07:00
Allan Carr
4f6db827e7 IO-3395 Postback Payment Date
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-06 17:50:19 -07:00
Dave
d16c8d5bd5 Merge remote-tracking branch 'origin/feature/IO-2776-cdk-fortellis' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-10-06 14:48:37 -04:00
Patrick Fic
92b05a290e IO-2776 Remove issue checking revoked token causing log issues on wss. 2025-10-06 11:20:52 -07:00
Dave
6421fc8002 Merge remote-tracking branch 'origin/feature/IO-2776-cdk-fortellis' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-10-06 12:56:01 -04:00
Dave
0d9a7dda53 feature/IO-2776-cdk-fortellis - Rename missing WSS loggers 2025-10-06 12:53:21 -04:00
Dave
601eed6db8 feature/IO-2776-cdk-fortellis - Rename missing WSS loggers 2025-10-06 12:29:29 -04:00
Dave
9b708d5e8e Merge remote-tracking branch 'origin/release/2025-10-17' into feature/IO-2776-cdk-fortellis 2025-10-06 12:26:57 -04:00
Dave
6b4bc27205 feature/IO-2776-cdk-fortellis - Remove socket auth , was supposed to be old sockets. 2025-10-06 12:16:31 -04:00
Patrick Fic
e50bbc3bcc Merged in hotfix/2025-10-06-remove-amplitude (pull request #2613)
Hotfix/2025 10 06 remove amplitude
2025-10-06 15:35:46 +00:00
Patrick Fic
15792cb0ef Merged in hotfix/2025-10-06-remove-amplitude (pull request #2612)
Hotfix/2025 10 06 remove amplitude
2025-10-06 15:33:23 +00:00
Patrick Fic
856a24d496 Remove console log. 2025-10-06 08:33:01 -07:00
Patrick Fic
74d6bcc004 Remove amplitude. 2025-10-06 08:19:43 -07:00
Allan Carr
2af95de353 IO-3386 Cleanup To extension
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-03 12:13:42 -07:00
Allan Carr
7ffb2c1aad IO-3373 Dashboard Component Redux Fix
This properly saves the components with out triggering a redux flush

Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-03 12:11:09 -07:00
Allan Carr
cf3f94bf98 Merged in feature/IO-3386-carfax-rps (pull request #2606)
Feature/IO-3386 carfax rps

Approved-by: Patrick Fic
2025-10-03 18:29:39 +00:00
Allan Carr
4899297539 IO-3386 CARFAX RPS
Add Brad Rhoades to Report

Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-03 11:24:10 -07:00
Allan Carr
0bd8e862e4 Merged in IO-3389-Parts-Scanning-Part-# (pull request #2605)
IO-3389 Parts Scanning with Part # Update

Approved-by: Patrick Fic
2025-10-03 17:54:21 +00:00
Allan Carr
4afafef98f Merged in feature/IO-3368-QB-Bill-Accumulator (pull request #2607)
Feature/IO-3368 QB Bill Accumulator

Approved-by: Patrick Fic
2025-10-03 17:53:38 +00:00
Allan Carr
48a3220c49 Merged in feature/IO-3365-Bills-Filtering-Server-Side (pull request #2608)
IO-3365 Bills Filtering Server Side

Approved-by: Patrick Fic
2025-10-03 17:51:22 +00:00
Allan Carr
31529fad80 IO-3365 Bills Filtering Server Side
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-02 23:43:25 -07:00
Allan Carr
7bc105ea46 IO-3368 QB Bill Accumulator
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-02 21:26:41 -07:00
Allan Carr
ac4fcf1694 IO-3368 QB Bill Accumulator
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-02 21:22:35 -07:00
Allan Carr
678a87f55d Merge branch 'release/2025-10-17' into feature/IO-3386-carfax-rps
Signed-off-by: Allan Carr <allan@imexsystems.ca>

# Conflicts:
#	hasura/metadata/cron_triggers.yaml
2025-10-02 18:36:42 -07:00
Allan Carr
9e977d9a58 IO-3386 CARFAX RPS
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-02 18:34:40 -07:00
Allan Carr
43f822e6ad Merge branch 'master-AIO' into feature/IO-3386-carfax-rps 2025-10-02 18:32:46 -07:00
Allan Carr
7239698a21 IO-3389 Parts Scanning with Part # Update
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-02 15:49:31 -07:00
Patrick Fic
46be1fa889 Merged in feature/IO-3356-pbs-ro-posting (pull request #2577)
Feature/IO-3356 pbs ro posting

Approved-by: Dave Richer
2025-10-02 20:27:48 +00:00
Patrick Fic
40a8036472 Adjust logging statements. 2025-10-02 13:26:12 -07:00
Patrick Fic
22970ac149 Remove additional RO posting. 2025-10-02 13:20:15 -07:00
Dave
0eb0e335fe Merge remote-tracking branch 'origin/master-AIO' into feature/IO-2776-cdk-fortellis 2025-10-02 14:13:03 -04:00
Dave Richer
63eeab888f Merged in feature/IO-3388-parts-queue-fix (pull request #2603)
feature/IO-3388 - Parts Queue Fix
2025-10-02 16:56:37 +00:00
Dave
367ced88d8 feature/IO-3388 - Parts Queue Fix 2025-10-02 12:55:50 -04:00
Dave
71b08855b8 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-10-02 12:16:08 -04:00
Allan Carr
01664c52ec Merged in hotfix/2025-10-01 (pull request #2602)
IO-3384 Mitchell OP14 Import USA
2025-10-02 01:03:15 +00:00
Dave
67b1a7f9f4 Merge remote-tracking branch 'origin/release/2025-10-17' into feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration 2025-10-01 19:37:52 -04:00
Allan Carr
7f67b01c87 Merged in feature/IO-3387-Mitchell-OP14-Import-USA (pull request #2599)
IO-3384 Mitchell OP14 Import USA

Approved-by: Dave Richer
2025-10-01 23:33:56 +00:00
Allan Carr
e66d52784f Merged in feature/IO-3387-Mitchell-OP14-Import-USA (pull request #2600)
IO-3384 Mitchell OP14 Import USA

Approved-by: Dave Richer
2025-10-01 23:33:36 +00:00
Allan Carr
a75969097e IO-3384 Mitchell OP14 Import USA
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-10-01 16:30:54 -07:00
Patrick Fic
5e308f13d3 IO-3386 2025-10-01 14:47:32 -07:00
Dave
24f017bfd2 feature/Reynolds-and-Reynolds-DMS-API-Integration -Expand 2025-10-01 17:11:34 -04:00
Patrick Fic
93e137c84e Final changes for pbs. 2025-10-01 13:59:11 -07:00
Dave
42027f0858 feature/Reynolds-and-Reynolds-DMS-API-Integration -Expand 2025-10-01 15:30:42 -04:00
Dave
3b663d7954 feature/Reynolds-and-Reynolds-DMS-API-Integration -Expand 2025-10-01 15:28:55 -04:00
Dave
e737af2d41 feature/Reynolds-and-Reynolds-DMS-API-Integration -Expand 2025-10-01 14:46:41 -04:00
Dave
10d3b4a485 feature/Reynolds-and-Reynolds-DMS-API-Integration -Expand 2025-10-01 14:39:43 -04:00
Dave
99b79126c3 feature/Reynolds-and-Reynolds-DMS-API-Integration -Expand 2025-10-01 14:38:59 -04:00
Dave
d0eeb7d55d Merge remote-tracking branch 'origin/release/2025-10-17' into feature/Reynolds-and-Reynolds-DMS-API-Integration 2025-10-01 14:23:31 -04:00
Allan Carr
36d4a02be0 Merged in feature/IO-3330-CARFAX-Adjustments (pull request #2598)
IO-3330 CARFAX Adjustment

Approved-by: Dave Richer
2025-10-01 18:23:01 +00:00
Dave
d95c5ce8f9 feature/Reynolds-and-Reynolds-DMS-API-Integration - Use current Token 2025-10-01 14:22:18 -04:00
Dave
b995e1f35d feature/Reynolds-and-Reynolds-DMS-API-Integration - Scaffolding 2025-10-01 14:19:44 -04:00
Dave
3d112ed2cd Merge remote-tracking branch 'origin/master-AIO' into feature/Reynolds-and-Reynolds-DMS-API-Integration 2025-09-30 12:57:23 -04:00
Dave
e978a5a561 Merge remote-tracking branch 'origin/feature/IO-2776-cdk-fortellis' into feature/Reynolds-and-Reynolds-DMS-API-Integration 2025-09-30 12:57:14 -04:00
Allan Carr
31367f278e IO-3330 CARFAX Adjustment
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-29 10:08:11 -07:00
Allan Carr
a384fd5072 Merged in release/2025-09-26 (pull request #2597)
IO-3330 CARFAX Adjustment
2025-09-27 06:17:33 +00:00
Allan Carr
490c66a9cb Merged in feature/IO-3330-CARFAX-Adjustments (pull request #2595)
IO-3330 CARFAX Adjustment
2025-09-27 06:13:25 +00:00
Allan Carr
d38dab0738 IO-3330 CARFAX Adjustment
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-26 23:14:10 -07:00
Dave Richer
37624d385f Merged in release/2025-09-26 (pull request #2592)
Release/2025 09 26 into master-AIO - IO-3365 - IO-3373 - IO-3325 - IO-3377 - IO-3330 - IO-3076
2025-09-27 01:35:06 +00:00
Allan Carr
d565934288 IO-3330 Carfax Adjustment
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-26 14:06:35 -07:00
Allan Carr
5d03574d65 Merged in feature/IO-3330-CARFAX-Adjustments (pull request #2593)
IO-3330 Carfax Adjustment
2025-09-26 21:05:19 +00:00
Patrick Fic
34f7c115b4 Merged in feature/IO-3076-update-usage-report-cron (pull request #2590)
IO-3076 auto trigger report on wed
2025-09-26 15:27:36 +00:00
Patrick Fic
3ac74df504 IO-3076 auto trigger report on wed 2025-09-26 08:26:09 -07:00
Patrick Fic
9ff3311579 Add vehicle query. 2025-09-26 08:19:57 -07:00
Allan Carr
d5f13f750f Merged in feature/IO-3330-CARFAX-Adjustments (pull request #2588)
IO-3330 CARFAX Adjustments

Approved-by: Dave Richer
2025-09-26 00:14:47 +00:00
Allan Carr
b9ddac36a9 IO-3330 CARFAX Adjustments
remove voided jobs

Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-25 16:30:02 -07:00
Allan Carr
c982dde1f5 IO-3330 CARFAX Adjustments
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-25 16:20:28 -07:00
Patrick Fic
cd1e8b0b15 Add delete DMS wip. 2025-09-25 14:34:31 -07:00
Dave
3d910aa246 Merge branch 'feature/IO-2776-cdk-fortellis' into feature/Reynolds-and-Reynolds-DMS-API-Integration 2025-09-25 12:08:05 -04:00
Dave
f7799ffd03 feature/IO-2776-cdk-fortellis - Cleanup + Auth Socket stuff 2025-09-24 18:12:57 -04:00
Dave
57baa3d9fd Merge remote-tracking branch 'origin/release/2025-09-26' into feature/IO-2776-cdk-fortellis 2025-09-24 17:27:08 -04:00
Dave Richer
7f61f652f7 Merged in feature/IO-3377-Add-Notification-Tone-For-Messaging (pull request #2586)
Feature/IO-3377 Add Notification Tone For Messaging
2025-09-24 18:39:52 +00:00
Dave
c1e1d5e82c feature/IO-3377-Add-Notification-Tone-For-Messaging - Finalize 2025-09-24 14:38:58 -04:00
Dave
5ae2e33596 feature/IO-3377-Add-Notification-Tone-For-Messaging - Finalize 2025-09-24 14:32:45 -04:00
Dave
e11260e8fc feautre/IO-3377-Add-Notification-Tone-For-Messaging - remove wav, adjust 2025-09-24 13:52:55 -04:00
Dave Richer
282a22ff51 Merged in feature/IO-3377-Add-Notification-Tone-For-Messaging (pull request #2584)
feautre/IO-3377-Add-Notification-Tone-For-Messaging - Complete
2025-09-24 16:03:52 +00:00
Dave
dfd88308e0 feautre/IO-3377-Add-Notification-Tone-For-Messaging - Complete 2025-09-24 12:02:20 -04:00
Dave
33579c3e6a Merge remote-tracking branch 'origin/release/2025-09-26' into feature/IO-3377-Add-Notification-Tone-For-Messaging 2025-09-24 11:51:27 -04:00
Allan Carr
0b9b3c027f Merged in hotfix/2025-09-23 (pull request #2583)
Hotfix/2025 09 23

Approved-by: Dave Richer
2025-09-24 01:05:35 +00:00
Allan Carr
154f9cdfe6 Merged in feature/IO-3330-CARFAX-Datapump-Adjustments (pull request #2582)
Feature/IO-3330 CARFAX Datapump Adjustments
2025-09-23 20:38:23 +00:00
Allan Carr
5b8c7d922c Merged in feature/IO-3330-CARFAX-Datapump-Adjustments (pull request #2580)
IO-3330 CARFAX Datapump Adjustments

Approved-by: Dave Richer
2025-09-23 19:50:50 +00:00
Allan Carr
d20347d5dc IO-3330 CARFAX Datapump Adjustments
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-23 12:42:09 -07:00
Allan Carr
68c4a1efd7 Merged in feature/IO-3373-Dashboard-Component-Errors (pull request #2567)
IO-3373 Dashboard Errors on Large Datasets

Approved-by: Dave Richer
2025-09-23 15:02:42 +00:00
Allan Carr
3e6d6fdbd1 Merged in feature/IO-3330-CARFAX-Datapump-Adjustments (pull request #2572)
Feature/IO-3330 CARFAX Datapump Adjustments

Approved-by: Dave Richer
2025-09-23 15:01:58 +00:00
Dave
c6cd6d0f4e Merge remote-tracking branch 'origin/master-AIO' into feature/Reynolds-and-Reynolds-DMS-API-Integration 2025-09-23 11:00:05 -04:00
Patrick Fic
f796dd0f89 Add DMS error WIP query. 2025-09-22 11:44:46 -07:00
Allan Carr
302fd58a56 Merge branch 'feature/IO-3373-Dashboard-Component-Infinite-Recursion' into feature/IO-3373-Dashboard-Component-Errors
Signed-off-by: Allan Carr <allan@imexsystems.ca>

# Conflicts:
#	client/src/components/dashboard-grid/dashboard-grid.component.jsx
2025-09-22 09:54:48 -07:00
Patrick Fic
31cfdf9ea3 Merge branch 'feature/IO-3325-additional-log-events' into release/2025-09-26 2025-09-19 09:56:04 -07:00
Patrick Fic
f93800ded4 IO-3325 Additional ImEX log Events. 2025-09-19 09:51:38 -07:00
Patrick Fic
05385fca6d Reoslve DMS allocation scroll. 2025-09-18 14:26:23 -07:00
Patrick Fic
1355d79fa4 Comments and cleanup. 2025-09-18 14:23:51 -07:00
Patrick Fic
8805538706 Merge branch 'master-AIO' into feature/IO-3356-pbs-ro-posting 2025-09-18 14:06:24 -07:00
Patrick Fic
9e35b0f123 Add and remove logging. 2025-09-18 14:05:14 -07:00
Patrick Fic
517c30787d Improved error logging. 2025-09-18 11:32:48 -07:00
Allan Carr
252758747b Merged in hotfix/2025-09-17 (pull request #2576)
IO-3376 Scrollbar Theming
2025-09-17 23:17:00 +00:00
Allan Carr
8b39b7c7be Merged in hotfix/2025-09-17 (pull request #2574)
IO-3376 Scrollbar Theming
2025-09-17 23:07:29 +00:00
Allan Carr
ada07bad62 Merged in feature/IO-3376-Scrollbar-Theming (pull request #2573)
IO-3376 Scrollbar Theming
2025-09-17 23:06:30 +00:00
Allan Carr
166a33af4e IO-3376 Scrollbar Theming
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-17 16:07:15 -07:00
Allan Carr
038aa82087 IO-3330 CARFAX Datapump Adjustment
Cron trigger and billing email

Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-17 14:43:07 -07:00
Allan Carr
99f425eac4 Merged in hotfix/2025-09-17 (pull request #2571)
IO-3373 Dashboard Component Infinite Recursion
2025-09-17 21:09:03 +00:00
Allan Carr
b2c504c69d Merged in feature/IO-3373-Dashboard-Component-Infinite-Recursion (pull request #2570)
IO-3373 Dashboard Component Infinite Recursion
2025-09-17 21:01:11 +00:00
Allan Carr
ac6856b136 IO-3373 Dashboard Component Infinite Recursion
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-17 13:59:20 -07:00
Allan Carr
521955089f Merged in feature/IO-3373-Dashboard-Component-Infinite-Recursion (pull request #2568)
IO-3373 Dashboard Component Infinite Recursion
2025-09-17 20:58:29 +00:00
Allan Carr
4afff893c0 IO-3330 localEmailViewer Update
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-17 09:29:35 -07:00
Allan Carr
cc934fe333 IO-3373 Dashboard Errors on Large Datasets
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-16 17:20:23 -07:00
Patrick Fic
ddd3b3d056 Merged in feature/IO-3325-amplitude-reverse-proxy (pull request #2566)
IO-3325 Add reverse proxy URL for amplitude.
2025-09-15 21:37:33 +00:00
Patrick Fic
8ded028197 Merged in feature/IO-3325-amplitude-reverse-proxy (pull request #2565)
IO-3325 Add reverse proxy URL for amplitude.
2025-09-15 21:16:58 +00:00
Patrick Fic
2660466db1 IO-3325 Add reverse proxy URL for amplitude. 2025-09-15 14:13:48 -07:00
Patrick Fic
c8771275ce WIP and improved error handling 2025-09-15 12:39:35 -07:00
Patrick Fic
fd229d5d09 Debug level changes, vehicle upsert correction, and logic updates. 2025-09-12 13:14:38 -07:00
Dave
7c8260685e feature/Reynolds-and-Reynolds-DMS-API-Integration - Add dealer id / merge fortellis 2025-09-12 14:59:42 -04:00
Dave
2fec9fd16e Merge branch 'feature/IO-2776-cdk-fortellis' into feature/Reynolds-and-Reynolds-DMS-API-Integration 2025-09-12 14:58:50 -04:00
Dave
0f1348496c Deps 2025-09-12 12:41:05 -04:00
Allan Carr
c42a0139fc Merged in feature/IO-3365-Bills-Filters-and-Sorters (pull request #2563)
IO-3365 Push Filters to Query

Approved-by: Dave Richer
2025-09-12 15:33:12 +00:00
Allan Carr
02974e6e4b IO-3365 Push Filters to Query
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-11 21:32:18 -07:00
Patrick Fic
de26979e44 Merge branch 'master-AIO' into feature/IO-2776-cdk-fortellis 2025-09-11 14:40:20 -07:00
Patrick Fic
1bb66a5378 Merge branch 'master-AIO' into feature/IO-3356-pbs-ro-posting 2025-09-11 14:40:08 -07:00
Dave Richer
fe67efe47c Merged in release/2025-09-26 (pull request #2562)
Release/2025 09 26  into master-AIO IO-3365, IO-3366, IO-3369
2025-09-11 20:43:43 +00:00
Dave
69a35772e5 release/2025-09-26 - Remove sockets from Parts Management 2025-09-11 16:41:21 -04:00
Dave Richer
38932f4bf9 Merged in feature/IO-3369-Fix-Parts-Status-List-Component (pull request #2559)
feature/IO-3369-Fix-Parts-Status-List-Component - Add Fixes
2025-09-11 19:58:28 +00:00
Dave
3fcb36a28e feature/IO-3369-Fix-Parts-Status-List-Component - Add Fixes 2025-09-11 15:56:47 -04:00
Allan Carr
fe78f5c7ff Merged in feature/IO-3365-Bills-Filters-and-Sorters (pull request #2556)
IO-3365 Bills Filters and Sorters

Approved-by: Dave Richer
2025-09-11 18:49:55 +00:00
Allan Carr
683846c3b0 Merged in feature/IO-3366-Shop-General-Field-Validators (pull request #2557)
IO-3366 Shop General Field Validators

Approved-by: Dave Richer
2025-09-11 18:49:20 +00:00
Dave Richer
2cc0b247b6 Merged in master-AIO (pull request #2555)
Master AIO
2025-09-11 18:18:26 +00:00
Patrick Fic
661678eb1c Additional WIP Fortellis. 2025-09-11 08:45:34 -07:00
Dave Richer
31579354d4 Merged in release/2025-09-12 (pull request #2554)
DO NOT MERGE - Release/2025-09-12 into master-AIO -IO-3255, IO-3310, IO-3352, IO-3355
2025-09-11 15:31:22 +00:00
Dave Richer
0e7531dc54 Merged in feature/IO-3255-simplified-part-management (pull request #2552)
feature/IO-3255-simplified-parts-management -Extra checks
2025-09-11 15:24:38 +00:00
Dave
268b57c38a feature/IO-3255-simplified-parts-management -Extra checks 2025-09-11 11:22:59 -04:00
Allan Carr
2b8b8b8073 IO-3366 Shop General Field Validators
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-10 22:12:15 -07:00
Allan Carr
808eeb91e9 IO-3365 Bills Filters and Sorters
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-10 21:33:10 -07:00
Dave Richer
23dd8fc9de Merged in feature/IO-3255-simplified-part-management (pull request #2548)
feature/IO-3255-simplified-parts-management - Remove some stuff in vendors
2025-09-10 19:59:10 +00:00
Dave
f499859078 Merge remote-tracking branch 'origin/release/2025-09-12' into feature/IO-3255-simplified-part-management 2025-09-10 15:58:06 -04:00
Dave
84d9e3251a feature/IO-3255-simplified-parts-management - Remove some stuff in vendors 2025-09-10 15:57:54 -04:00
Dave Richer
bd7db4dd02 Merged in feature/IO-3255-simplified-part-management (pull request #2546)
feature/IO-3255-simplified-parts-management - Fix Manual line in Change Request
2025-09-10 16:44:59 +00:00
Dave
e9804b736b feature/IO-3255-simplified-parts-management - Fix Manual line in Change Request 2025-09-10 12:44:16 -04:00
Dave Richer
a14874f116 Merged in feature/Reynolds-and-Reynolds-DMS-API-Integration (pull request #2543)
Feature/Reynolds and Reynolds DMS API Integration
2025-09-09 16:00:01 +00:00
Dave
ac9fac458c feature/Reynolds-and-Reynolds-DMS-API-Integration - DB Modifications 2025-09-09 11:59:18 -04:00
Dave
8f9db15852 feature/Reynolds-and-Reynolds-DMS-API-Integration - DB Modifications 2025-09-09 11:59:08 -04:00
Dave
1728982b2b deps 2025-09-08 12:17:17 -04:00
Dave
8aa747edc5 Merge remote-tracking branch 'origin/release/2025-09-12' into feature/IO-2776-cdk-fortellis 2025-09-08 12:16:14 -04:00
Patrick Fic
01fc0cbc08 IO-3356 PBS posting initial working commit. 2025-09-05 10:45:59 -07:00
Dave Richer
61b3d3c18c Merged in feature/IO-3255-simplified-part-management (pull request #2540)
feature/IO-3255-simplified-parts-management - missing translations
2025-09-05 16:52:39 +00:00
Dave
e6f08d3b1c feature/IO-3255-simplified-parts-management - missing translations 2025-09-05 12:51:12 -04:00
Dave Richer
d5cf0f8371 Merged in feature/IO-3255-simplified-part-management (pull request #2538)
Feature/IO-3255 simplified part management
2025-09-05 16:46:39 +00:00
Dave
52e230fc54 feature/IO-3255-simplified-parts-management - bump deps 2025-09-05 12:45:46 -04:00
Dave
4011237c22 feature/IO-3255-simplified-parts-management - Checkpoint 2025-09-05 12:36:45 -04:00
Dave
c24bfbf655 feature/IO-3255-simplified-parts-management - Checkpoint 2025-09-05 12:31:45 -04:00
Allan Carr
08fe8c3c70 Merged in feature/IO-3355-Job-Cash-Discounting (pull request #2537)
Feature/IO-3355 Job Cash Discounting

Approved-by: Dave Richer
2025-09-05 16:30:47 +00:00
Dave
771a239773 feature/IO-3255-simplified-parts-management - Checkpoint 2025-09-05 12:16:25 -04:00
Dave
82195a0584 feature/IO-3255-simplified-parts-management - Checkpoint 2025-09-05 12:02:17 -04:00
Dave
838c24b3f1 feature/IO-3255-simplified-parts-management - Checkpoint 2025-09-05 11:03:20 -04:00
Dave
13cb68b0af feature/IO-3255-simplified-parts-management - Checkpoint 2025-09-05 10:18:03 -04:00
Dave
7c84b08707 feature/IO-3255-simplified-parts-management - Checkpoint 2025-09-05 10:12:37 -04:00
Dave
3165957e95 feature/IO-3255-simplified-parts-management - Checkpoint 2025-09-05 10:05:23 -04:00
Allan Carr
d9f59fcad4 IO-3355 Correct translation
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-04 15:27:06 -07:00
Allan Carr
edaeb5d77a IO-3355 Job Cash Discounting
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-04 15:16:48 -07:00
Dave Richer
544494ce0d Merged in release/2025-09-12 (pull request #2536)
Release/2025 09 12
2025-09-03 18:54:16 +00:00
Allan Carr
5365d95d6f Merged in feature/IO-3310-Shop-Info-Data-Preservation (pull request #2533)
IO-3310 Shop Info Data Preservation

Approved-by: Dave Richer
2025-09-03 14:48:39 +00:00
Allan Carr
5cfefd5afd Merged in feature/IO-3352-Arrived-Color-on-Schedule (pull request #2532)
IO-3352 Arrived Color on Schedule

Approved-by: Dave Richer
2025-09-03 14:48:10 +00:00
Dave Richer
bbccdb0650 Merged in feature/IO-3255-simplified-part-management (pull request #2534)
feature/IO-3255-simplified-parts-management - Fix deprovision route
2025-09-03 14:47:51 +00:00
Dave
f3535c01af feature/IO-3255-simplified-parts-management - Fix deprovision route 2025-09-03 10:47:04 -04:00
Dave Richer
7f8c82b300 Merged in release/2025-08-29 (pull request #2528)
Release/2025 08 29 into master-AIO - IO-3182, IO-3255, IO-3325, IO-3330, IO-3340
2025-09-03 00:56:28 +00:00
Patrick Fic
9ab3d8c81a Merge branch 'master-AIO' into feature/IO-XXXX-pbs-ro-posting 2025-09-02 15:24:15 -07:00
Patrick Fic
83c0696a3e Reformat translations. 2025-09-02 15:24:01 -07:00
Dave Richer
609ac2bd33 Merged in feature/IO-3255-simplified-part-management (pull request #2530)
Feature/IO-3255 simplified part management
2025-09-02 19:24:59 +00:00
Dave
0883274320 feature/IO-3255-simplified-parts-management - Expand deprovision route 2025-09-02 15:23:44 -04:00
Dave
fa33b88632 feature/IO-3255-simplified-parts-management - Expand deprovision route 2025-09-02 15:23:36 -04:00
Dave
bec32c1d70 feature/IO-3255-simplified-parts-management - Checkpoint 2025-09-02 15:01:56 -04:00
Allan Carr
eb18130e51 IO-3310 Shop Info Data Preservation
Correction to preserve hidden data

Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-09-01 20:29:39 -07:00
Allan Carr
0fbf63dec8 IO-3352 Arrived Color on Schedule
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-08-31 22:42:24 -07:00
Patrick Fic
f817902d5c Merged in feature/IO-3340-imgproxy-pdf-contenttype (pull request #2527)
IO-3340 Resolve unenforced content-type
2025-08-28 22:08:09 +00:00
Patrick Fic
7a383aaec9 IO-3340 Resolve unenforced content-type 2025-08-28 15:07:18 -07:00
Dave Richer
e5c0ace6cb Merged in feature/IO-3255-simplified-part-management (pull request #2525)
feature/IO-3255-simplified-parts-management - Checkpoint
2025-08-28 20:01:35 +00:00
Dave
814447373a feature/IO-3255-simplified-parts-management - Checkpoint 2025-08-28 16:00:39 -04:00
Dave Richer
d766a468c3 Merged in release/2025-08-29 (pull request #2523)
Release/2025 08 29
2025-08-28 19:36:10 +00:00
Dave
0ede2d0649 Merge remote-tracking branch 'origin/master-AIO' into release/2025-08-29 2025-08-28 15:33:26 -04:00
Dave Richer
54089c2ab3 Merged in feature/IO-3255-simplified-part-management (pull request #2521)
Feature/IO-3255 simplified part management
2025-08-28 19:26:25 +00:00
Dave
73e3d71cf1 feature/IO-3255-simplified-parts-management - Checkpoint 2025-08-28 14:50:26 -04:00
Dave
f071a5cc9e feature/IO-3255-simplified-parts-management - Checkpoint 2025-08-28 14:24:35 -04:00
Dave
67002b8443 Merge remote-tracking branch 'origin/feature/IO-3255-parts-management-review1' into feature/IO-3255-simplified-part-management 2025-08-28 14:06:07 -04:00
Dave
3f83c6afa7 Merge remote-tracking branch 'origin/release/2025-08-29' into feature/IO-3255-simplified-part-management 2025-08-28 13:27:16 -04:00
Dave
b7f57e91aa feature/IO-3255-simplified-parts-management - Checkpoint 2025-08-28 13:26:47 -04:00
Allan Carr
b8465c0cc7 Merged in feature/IO-3330-CARFAX-Query (pull request #2520)
IO-3330 CARFAX Bodyshop Query Adjustment

Approved-by: Dave Richer
2025-08-28 17:25:18 +00:00
Allan Carr
6bae0b8406 IO-3330 CARFAX Bodyshop Query Adjustment
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-08-27 23:41:16 -07:00
Patrick Fic
2e25324ae9 IO-2776 Calculate allocations on load using Fortellis connection. 2025-08-27 16:56:46 -07:00
Patrick Fic
f525ec6fb8 IO-2776 Resolve circular dependancy for legacy WS preventing run time. 2025-08-27 16:52:47 -07:00
Patrick Fic
8296d914c5 IO-2776 Add posting transactions for Fortellis. 2025-08-27 16:37:31 -07:00
Dave Richer
3d691568ff Merged in release/2025-08-29 (pull request #2518)
Release/2025 08 29
2025-08-27 19:27:22 +00:00
Patrick Fic
553c154e46 IO-3255 Review comments. 2025-08-27 11:50:00 -07:00
Dave Richer
35cbb921d2 Merged in feature/IO-3255-simplified-part-management (pull request #2516)
feature/IO-3255-simplified-parts-management - Change Parts Status logic for Parts Management
2025-08-27 18:19:40 +00:00
Dave
6b926401d0 feature/IO-3255-simplified-parts-management - Change Parts Status logic for Parts Management 2025-08-27 14:17:23 -04:00
Patrick Fic
5b400dce4f Merge branch 'feature/IO-3255-simplified-part-management' into feature/IO-3255-parts-management-review1 2025-08-27 09:39:55 -07:00
Dave Richer
914946c264 Merged in feature/IO-3255-simplified-part-management (pull request #2514)
feature/IO-3255-simplified-parts-management - Change Parts Status logic for Parts Management
2025-08-27 16:37:27 +00:00
Dave
2939b5795b feature/IO-3255-simplified-parts-management - Change Parts Status logic for Parts Management 2025-08-27 12:35:53 -04:00
Dave Richer
531f968ce6 Merged in feature/IO-3255-simplified-part-management (pull request #2512)
feature/IO-3255-simplified-parts-management - Change From Claim to JobID (chgrq)
2025-08-27 15:37:47 +00:00
Dave
24cc3fa6a4 feature/IO-3255-simplified-parts-management - Change From Claim to JobID (chgrq) 2025-08-27 11:36:39 -04:00
Dave Richer
a6f17e7db5 Merged in feature/IO-3255-simplified-part-management (pull request #2510)
feature/IO-3255-simplified-parts-management - Typo in chg request route
2025-08-26 14:51:18 +00:00
Dave
29c904feea feature/IO-3255-simplified-parts-management - Typo in chg request route 2025-08-26 10:50:44 -04:00
Dave Richer
0743048e75 Merged in feature/IO-3255-simplified-part-management (pull request #2509)
Feature/IO-3255 simplified part management
2025-08-25 16:58:43 +00:00
Dave
e2f1758378 feature/IO-3255-simplified-parts-management - Simplified Parts print center stacks on top of each other, not beside each other 2025-08-25 11:33:12 -04:00
Dave
b6dc7a4d92 feature/IO-3255-simplified-parts-management - Notes are appended if they are not duplicates 2025-08-25 11:30:18 -04:00
Dave Richer
130745d7e7 Merged in hotfix/2025-08-22 (pull request #2508)
DO NOT MERGE Hotfix/2025 08 22
2025-08-22 19:36:51 +00:00
Patrick Fic
a722ab9758 hotfix/2025-08-22 - Datahog 2025-08-22 15:35:55 -04:00
Patrick Fic
41c9c0be49 Add in amplititude 2025-08-22 15:22:45 -04:00
Patrick Fic
52f62126e1 Merged in feature/IO-3340-imgproxy-pdf-contenttype (pull request #2507)
IO-3340 Change application type on PDFs uploaded via imgproxy to allow inline display.
2025-08-22 19:02:44 +00:00
Patrick Fic
cfdfb8110b IO-3340 Change application type on PDFs uploaded via imgproxy to allow inline display. 2025-08-22 12:01:16 -07:00
Allan Carr
eb04a8b6c5 Merged in feature/IO-3349-Chart-Enqueue-and-Label-Required (pull request #2505)
IO-3349 Chart Enqueue and Label Required

Approved-by: Dave Richer
2025-08-22 18:55:58 +00:00
Allan Carr
141b05f558 IO-3349 Chart Enqueue and Label Required
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-08-22 11:29:33 -07:00
Dave Richer
e9ea36fdad Merged in feature/IO-3255-simplified-part-management (pull request #2504)
feature/IO-3255-simplified-parts-management - Bug changes / Socket close cleanup
2025-08-22 18:26:38 +00:00
Dave
e990781ff7 feature/IO-3255-simplified-parts-management - Bug changes / Socket close cleanup 2025-08-22 14:24:03 -04:00
Patrick Fic
e24237e010 Merged in feature/IO-3325-amplitude (pull request #2502)
Feature/IO-3325 amplitude
2025-08-22 18:00:37 +00:00
Patrick Fic
f00f5f2e4a IO-3325 resolve partial commit error. 2025-08-22 10:57:38 -07:00
Patrick Fic
f38b550e75 IO-3325 Added posthog analytics for comparison. 2025-08-22 10:57:25 -07:00
Patrick Fic
fabe1508ac Merged in feature/IO-3325-amplitude (pull request #2500)
IO-3325 Add amplitude tracking.
2025-08-22 17:40:33 +00:00
Patrick Fic
5f3c880d0b IO-3325 Add amplitude tracking. 2025-08-22 10:40:11 -07:00
Patrick Fic
86f0c02c82 Merged in feature/IO-3348-es-vehicletype (pull request #2498)
ES-3348 Ass ES Vehicle type Route.
2025-08-22 15:53:22 +00:00
Patrick Fic
2004eb840f ES-3348 Ass ES Vehicle type Route. 2025-08-22 08:52:08 -07:00
Dave Richer
2f0190e190 Merged in feature/IO-3255-simplified-part-management (pull request #2496)
feature/IO-3255-simplified-parts-management - Missing breadcrumb / title translations
2025-08-22 15:31:40 +00:00
Dave
e5a48531a0 feature/IO-3255-simplified-parts-management - Missing breadcrumb / title translations 2025-08-22 11:31:01 -04:00
Patrick Fic
5552c73721 WIP PBS RO 2025-08-22 08:21:29 -07:00
Dave
9860447e42 feature/IO-3255-simplified-parts-management - Fix Breadcrumbs 2025-08-22 11:03:34 -04:00
Dave
364813193f feature/IO-3255-simplified-parts-management - DO NOT SPLIT LABOR / PARTS 2025-08-21 18:35:10 -04:00
Dave
2c8f3a173e feature/IO-3255-simplified-parts-management - Soft Deletes 2025-08-21 18:20:53 -04:00
Dave
1577921334 feature/IO-3255-simplified-parts-management -Bug fixes 2025-08-21 18:12:56 -04:00
Dave
a934249c02 feature/IO-3255-simplified-parts-management - Revert dashboard 2025-08-21 16:40:07 -04:00
Dave
6486de3c61 feature/IO-3255-simplified-parts-management - Update and fix dashboard-grid.component.jsx 2025-08-21 16:09:36 -04:00
Dave
ed6a8b210d feature/IO-3255-simplified-parts-management - Update and fix dashboard-grid.component.jsx 2025-08-21 15:51:10 -04:00
Dave
96e38d509f feature/IO-3255-simplified-parts-management - cleanup 2025-08-21 15:42:06 -04:00
Dave
42e072e8ff feature/IO-3255-simplified-parts-management - Package Updates 2025-08-21 15:11:41 -04:00
Dave
6942d6e4f9 feature/IO-3255-simplified-parts-management - Cleanup / Bug fixes 2025-08-21 14:57:55 -04:00
Dave
43d5a77d60 feature/IO-3255-simplified-parts-management - Checkoint 2025-08-21 12:51:14 -04:00
Dave
a74ce063ec feature/IO-3255-simplified-parts-management - Checkoint 2025-08-21 12:39:15 -04:00
Dave
7ab070e2bc feature/IO-2776-cdk-fortellis - Fix linting errors preventing build of front end 2025-08-21 12:23:02 -04:00
Dave
47a974e3cb Merge branch 'feature/IO-3255-simplified-part-management' into feature/IO-2776-cdk-fortellis 2025-08-21 12:04:36 -04:00
Dave
9c45b49ab9 feature/IO-3255-simplified-parts-management - Remove unnecessary dotenv calls / fix import bug 2025-08-21 12:00:26 -04:00
Dave
d690790dfe feature/IO-3255-simplified-parts-management - Remove unnecessary dotenv calls / fix import bug 2025-08-21 11:57:12 -04:00
Dave
eac81cdffb Merge branch 'feature/IO-3255-simplified-part-management' into feature/IO-2776-cdk-fortellis 2025-08-21 11:45:58 -04:00
Dave
70fa638c37 feature/IO-3255-simplified-parts-management - Remove unnecessary dotenv calls 2025-08-21 11:45:38 -04:00
Dave
77c3e6f7e7 feature/IO-2776-cdk-fortellis - Update to the latest from simplified Parts Management 2025-08-21 11:28:23 -04:00
Dave
7f07da4360 Merge branch 'feature/IO-3255-simplified-part-management' into feature/IO-2776-cdk-fortellis
# Conflicts:
#	client/package-lock.json
#	client/src/components/dms-cdk-makes/dms-cdk-makes.component.jsx
#	client/src/components/dms-customer-selector/dms-customer-selector.component.jsx
#	client/src/pages/dms/dms.container.jsx
#	package-lock.json
#	package.json
2025-08-21 11:13:27 -04:00
Dave
c47144df72 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-2776-cdk-fortellis
# Conflicts:
#	client/src/components/dms-post-form/dms-post-form.component.jsx
#	package-lock.json
#	package.json
#	server/web-sockets/redisSocketEvents.js
2025-08-21 11:05:03 -04:00
Dave Richer
77cacdec91 Merged in feature/IO-3343-The-Great-Lint-Cleanup (pull request #2488)
Lint all the things
2025-08-21 14:53:59 +00:00
Dave
33fb60ca1a Lint all the things 2025-08-19 16:23:29 -04:00
Dave
f6d6b548be feature/IO-3255-simplified-parts-management Deprovision route can now remove jobs, joblines, and audit trail 2025-08-19 11:17:29 -04:00
Dave
c0a215d20d feature/IO-3255-simplified-parts-management -Add Timezone default to provisioning 2025-08-19 10:32:02 -04:00
Dave Richer
8c9ef375be Merged in hotfix/background-colors-dark-mode (pull request #2485)
Hotfix/background colors dark mode
2025-08-18 18:39:42 +00:00
Dave Richer
5342377ca9 Merged in hotfix/background-colors-dark-mode (pull request #2483)
Fix Dark Mode Schedule
2025-08-18 18:38:32 +00:00
Dave
8295cb111a Fix Dark Mode Schedule 2025-08-18 14:37:00 -04:00
Dave Richer
cd4754069b Merged in hotfix/background-colors-dark-mode (pull request #2481)
feature/IO-3255-simplified-parts-management  - Beef Up Change Request Parser, add Change Request documentation data
2025-08-18 18:13:48 +00:00
Dave
951d214d49 feature/IO-3255-simplified-parts-management - Beef Up Change Request Parser, add Change Request documentation data 2025-08-18 14:13:16 -04:00
Dave
c586d0283b feature/IO-3255-simplified-parts-management - Beef Up Change Request Parser, add Change Request documentation data 2025-08-18 12:42:06 -04:00
Dave
203cc1ebdf feature/IO-3255-simplified-parts-management - Modify Parser 2025-08-18 12:03:52 -04:00
Dave
db09f33e5c feature/IO-3255-simplified-parts-management - Add PAO in for isPartsEntry 2025-08-18 11:47:34 -04:00
Dave
1941034dcb feature/IO-3255-simplified-parts-management - Record Labor Again 2025-08-18 11:02:03 -04:00
Dave
6bd2828176 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3255-simplified-part-management 2025-08-18 10:41:05 -04:00
Dave Richer
6f19c1dd3f Merged in release/2025-08-15 (pull request #2478)
Release/2025-08-15 into master-AIO - IO-1113, IO-3285, IO-3307, IO-3330, IO-3332, IO-3335
2025-08-16 01:13:04 +00:00
Dave
b428a1078c feature/IO-3255-simplified-parts-management - Bug Fixes 2025-08-15 13:38:05 -04:00
Dave
cc232eac93 feature/IO-3255-simplified-parts-management - Bug Fixes 2025-08-15 13:20:17 -04:00
Dave
5e90504e56 feature/IO-3255-simplified-parts-management - Bug Fixes 2025-08-15 13:07:32 -04:00
Dave
73e103f2df feature/IO-3255-simplified-parts-management - Bug Fixes 2025-08-15 12:25:06 -04:00
Dave
b09b8b4f34 feature/IO-3255-simplified-parts-management - Cleanup 2025-08-14 22:50:59 -04:00
Dave
9dd34c9f6c feature/IO-3255-simplified-parts-management - Bump Packages 2025-08-14 22:44:52 -04:00
Dave
cf60f7cd03 Merge remote-tracking branch 'origin/release/2025-08-15' into feature/IO-3255-simplified-part-management 2025-08-14 15:01:38 -04:00
Allan Carr
637e95c351 Merged in feature/IO-3330-CARFAX-Datapump (pull request #2474)
Feature/IO-3330 CARFAX Datapump

Approved-by: Dave Richer
2025-08-14 18:59:34 +00:00
Dave
7af7f3c4e7 feature/IO-3255-simplified-parts-management - vehicleDamageEstimateAddRq.js enhancements 2025-08-14 14:56:02 -04:00
Allan Carr
0cadf007b5 IO-3330 CARFAX Datapump
Prep for express upgrade with return

Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-08-14 11:30:04 -07:00
Dave
1394176218 Merge branch 'feature/IO-3255-simplified-part-management' of bitbucket.org:snaptsoft/bodyshop into feature/IO-3255-simplified-part-management 2025-08-14 13:30:27 -04:00
Dave
284d25eeb9 feature/IO-3255-simplified-parts-management Bug Fixes 2025-08-14 13:29:49 -04:00
Allan Carr
60258a0f5d IO-3330 CARFAX Datapump
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-08-14 09:17:02 -07:00
Allan Carr
7873405a30 IO-3330 CARFAX Datapump
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-08-14 08:44:10 -07:00
Dave Richer
c38d7d9aea Merged in release/2025-08-15 (pull request #2472)
Release/2025 08 15
2025-08-14 14:26:36 +00:00
Allan Carr
7639655911 Merged in feature/IO-3330-CARFAX-Datapump (pull request #2471)
IO-3330 CARFAX Datapump

Approved-by: Dave Richer
2025-08-14 14:26:03 +00:00
Allan Carr
4fb1871044 Merged in feature/IO-3335-QBO-Payment-Logging (pull request #2470)
IO-3335 QBO Payment Logging

Approved-by: Dave Richer
2025-08-14 14:25:15 +00:00
Allan Carr
e5dd1edf13 IO-3330 CARFAX Datapump
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-08-13 21:49:55 -07:00
Allan Carr
542c95c395 IO-3335 QBO Payment Logging
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-08-13 16:35:52 -07:00
Dave
a3122a59b1 feature/IO-3255-simplified-parts-management - centralize alerts 2025-08-13 18:22:12 -04:00
Dave
81d642fcd3 feature/IO-3255-simplified-parts-management - dumb down print center 2025-08-13 18:10:57 -04:00
Dave
960a2ccd30 feature/IO-3255-simplified-parts-management - Add Dark mode 2025-08-13 17:39:05 -04:00
Dave
2ab6093bd8 feature/IO-3255-simplified-parts-management - Add Dark mode 2025-08-13 17:31:33 -04:00
Dave
7ed7b6117f feature/IO-3255-simplified-parts-management - Cleanup 2025-08-13 17:24:46 -04:00
Dave
7158676562 feature/IO-3255-simplified-parts-management - Cleanup 2025-08-13 17:04:48 -04:00
Dave
67a8c13bad feature/IO-3255-simplified-parts-management - Favor isPartsEntry over isPartsManagementOnly 2025-08-13 16:52:08 -04:00
Dave
766b4b950a feature/IO-3255-simplified-parts-management - Checkpoint 2025-08-13 16:31:04 -04:00
Dave
88ba8ab929 feature/IO-3255-simplified-parts-management - Checkpoint 2025-08-13 16:20:10 -04:00
Dave
0d570d0323 feature/IO-3255-simplified-parts-management - Checkpoint 2025-08-13 15:48:09 -04:00
Dave
898b97151f feature/IO-3255-simplified-parts-management - Checkpoint 2025-08-13 15:05:57 -04:00
Dave Richer
de6bb3d634 Merge remote-tracking branch 'origin/release/2025-08-15' into feature/IO-3255-simplified-part-management 2025-08-12 13:51:59 -04:00
Patrick Fic
2b40793c77 Merged in feature/IO-3322-intellipay-refund (pull request #2465)
IO-3332 Add error message to intellipay refund error.
2025-08-11 19:29:59 +00:00
Dave Richer
c4649b2fc6 Merge remote-tracking branch 'origin/release/2025-08-15' into feature/IO-3255-simplified-part-management 2025-08-11 14:28:19 -04:00
Dave Richer
4d475e25fa release/2025-08-15 - Add LogImexEvent for Theme toggling / remove Tooltip with translations (no longer necessary) 2025-08-11 14:27:48 -04:00
Dave Richer
00d2d3012d Merge remote-tracking branch 'origin/release/2025-08-15' into feature/IO-3255-simplified-part-management 2025-08-11 13:50:41 -04:00
Allan Carr
4e5aba59d7 Merged in feature/IO-3285-Shop-Config-Lite-Basic (pull request #2456)
IO-3285 Shop Config Lite-Basic

Approved-by: Dave Richer
2025-08-11 17:50:02 +00:00
Patrick Fic
09f96f0b68 Merged in feature/IO-3307-imgproxy-bill-route (pull request #2455)
IO-3307 Resolve bill document for imgproxy.

Approved-by: Dave Richer
2025-08-11 17:46:03 +00:00
Dave Richer
866f5f72eb Merged in release/2025-08-15 (pull request #2461)
feature/IO-1113-Online-Dark-Mode - Adjust Car SVG Background color in Dark mode
2025-08-08 16:51:48 +00:00
Dave Richer
f0c166907b Merged in feature/IO-1113-Online-Dark-Mode (pull request #2460)
feature/IO-1113-Online-Dark-Mode - Adjust Car SVG Background color in Dark mode
2025-08-08 16:51:26 +00:00
Dave Richer
c06b4e8af5 feature/IO-1113-Online-Dark-Mode - Adjust Car SVG Background color in Dark mode 2025-08-08 12:51:00 -04:00
Dave Richer
bebe3ef633 Merge branch 'feature/IO-3255-simplified-part-management' of bitbucket.org:snaptsoft/bodyshop into feature/IO-3255-simplified-part-management 2025-08-08 12:24:30 -04:00
Dave Richer
50d2e912ed Merge remote-tracking branch 'origin/release/2025-08-15' into feature/IO-3255-simplified-part-management, resolve conflicts 2025-08-08 12:24:13 -04:00
Dave Richer
a7e21b0505 Merged in feature/IO-1113-Online-Dark-Mode (pull request #2458)
Feature/IO-1113 Online Dark Mode
2025-08-08 16:20:48 +00:00
Dave Richer
3b481afa9e feature/IO-1113-Online-Dark-Mode - Finish 2025-08-08 12:14:11 -04:00
Patrick Fic
75de177b7b IO-3332 Add error message to intellipay refund error. 2025-08-08 09:11:48 -07:00
Dave Richer
ec6c0279de feature/IO-1113-Online-Dark-Mode - Toggle / Local storage solution 2025-08-08 11:53:51 -04:00
Dave Richer
c9572d2db5 feature/IO-1113-Online-Dark-Mode - Remove unnecessary forward ref 2025-08-08 10:38:47 -04:00
Dave Richer
93e9e20f6f feature/IO-1113-Online-Dark-Mode - Initial Commit 2025-08-08 10:23:09 -04:00
Allan Carr
4e8ea736c5 IO-3285 Shop Config Lite-Basic
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-08-07 20:45:04 -07:00
Patrick Fic
8f00dbfc17 IO-3307 Resolve bill document for imgproxy. 2025-08-07 13:54:39 -07:00
Dave Richer
55d242d40d Merged in hotfix/2025-08-07 (pull request #2454)
IO-3322 IntelliPay Refund
2025-08-07 17:58:49 +00:00
Allan Carr
4f99ae40d3 Merged in feature/IO-3322-IntelliPay-Refund (pull request #2453)
IO-3322 IntelliPay Refund

Approved-by: Dave Richer
2025-08-07 17:28:21 +00:00
Dave Richer
05c049c9af Merged in release/2025-08-15 (pull request #2451)
IO-3322 IntelliPay Refund
2025-08-07 15:54:23 +00:00
Allan Carr
d94b573ae6 Merged in feature/IO-3322-IntelliPay-Refund (pull request #2450)
IO-3322 IntelliPay Refund

Approved-by: Dave Richer
2025-08-07 15:54:03 +00:00
Allan Carr
790ab0447f IO-3322 IntelliPay Refund
Add logging to capture Response from IntelliPay API on success

Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-08-06 16:30:56 -07:00
Dave Richer
84795b2048 feature/IO-3255-simplified-parts-management - Fix top level breadcrumbs, up deps 2025-08-06 13:34:00 -04:00
Dave Richer
567002236d feature/IO-3255-simplified-parts-management - Packages / Housekeeping 2025-08-06 11:58:50 -04:00
Dave Richer
0ed41de956 feature/IO-3255-simplified-parts-management - Add Shop / Vendor Configuration 2025-08-05 16:04:07 -04:00
Dave Richer
8a2dfae487 Merge branch 'master-AIO' into feature/IO-3255-simplified-part-management 2025-08-05 09:23:30 -04:00
Dave Richer
3737fe457f Merged in release/2025-08-01 (pull request #2448)
Release/2025 08 01 into master-AIO - IO-2604, IO-3292, IO-3310, IO-3315, IO-3316, IO-3318, IO-3319, IO-3320
2025-08-02 01:21:40 +00:00
Dave Richer
c5978d4c21 Merge remote-tracking branch 'origin/release/2025-08-01' into feature/IO-3255-simplified-part-management 2025-07-31 15:51:49 -04:00
Allan Carr
bb4e8eb5bd Merged in feature/IO-3320-Responsibility-Center-RBAC (pull request #2446)
IO-3320 Responsibility Center RBAC

Approved-by: Dave Richer
2025-07-31 19:51:38 +00:00
Allan Carr
27a07e8d5d IO-3320 Responsibility Center RBAC
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-31 12:49:56 -07:00
Dave Richer
e52fe93e14 Merge remote-tracking branch 'origin/release/2025-08-01' into feature/IO-3255-simplified-part-management 2025-07-31 15:48:06 -04:00
Allan Carr
e2618eee83 Merged in feature/IO-2604-vendor-tagging (pull request #2444)
IO-2604 Vendor Tagging English Translation

Approved-by: Dave Richer
2025-07-31 19:47:53 +00:00
Dave Richer
dd20871707 Merge remote-tracking branch 'origin/release/2025-08-01' into feature/IO-3255-simplified-part-management 2025-07-31 15:47:07 -04:00
Dave Richer
66c51a4be5 release/2025-08-01 - Fix Notes via refetch queries, cache manipulation too complex 2025-07-31 15:46:34 -04:00
Allan Carr
d5afcaeaab IO-2604 Vendor Tagging English Translation
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-31 11:35:02 -07:00
Dave Richer
d0370d3e60 Merge remote-tracking branch 'origin/release/2025-08-01' into feature/IO-3255-simplified-part-management 2025-07-30 14:14:11 -04:00
Allan Carr
c332ec11b7 Merged in feature/IO-3319-Job-Status-Change (pull request #2442)
IO-3319 Job Status Change

Approved-by: Dave Richer
2025-07-30 18:13:59 +00:00
Allan Carr
cf31290f05 IO-3319 Job Status Change
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-30 11:12:15 -07:00
Dave Richer
203dc28720 Merge remote-tracking branch 'origin/release/2025-08-01' into feature/IO-3255-simplified-part-management 2025-07-30 13:10:59 -04:00
Allan Carr
dbbab910b6 Merged in feature/IO-3318-Close-Job-Page-UI-Bugs (pull request #2440)
IO-3318 Close Job Page UI Bugs

Approved-by: Dave Richer
2025-07-30 17:10:40 +00:00
Allan Carr
abf01b4966 IO-3318 Close Job Page UI Bugs
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-29 19:19:38 -07:00
Dave Richer
952feeb685 feature/IO-3255-simplified-parts-management - Adjust routes / Deps 2025-07-29 14:37:51 -04:00
Dave Richer
bb2b67cece Merge remote-tracking branch 'origin/release/2025-08-01' into feature/IO-3255-simplified-part-management 2025-07-29 13:25:03 -04:00
Allan Carr
a965f9edf5 Merged in feature/IO-3315-CDK-InService-Date (pull request #2437)
IO-3315 CDK InService Date

Approved-by: Dave Richer
2025-07-29 17:24:51 +00:00
Allan Carr
f02ca05eba Merged in feature/IO-3316-Local-Storage-Sort (pull request #2436)
IO-3316 Local Storage Sort

Approved-by: Dave Richer
2025-07-29 17:23:26 +00:00
Allan Carr
a182ea0869 IO-3315 CDK InService Date
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-29 10:04:13 -07:00
Allan Carr
7bc2d41a68 IO-3316 Local Storage Sort
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-28 14:05:59 -07:00
Dave Richer
e4fb8b61b0 feature/IO-3255-simplified-parts-management - Deprovisoning route 2025-07-25 12:26:36 -04:00
Dave Richer
1cc33a67e6 Merge remote-tracking branch 'origin/release/2025-08-01' into feature/IO-3255-simplified-part-management 2025-07-25 11:25:35 -04:00
Allan Carr
5277e90946 Merged in feature/IO-3310-Shop-Data-Preservation (pull request #2433)
IO-3310 Shop Data Preservation on Hidden Fields

Approved-by: Dave Richer
2025-07-24 17:50:14 +00:00
Dave Richer
0a16a0fcbc Merge remote-tracking branch 'origin/release/2025-08-01' into feature/IO-3255-simplified-part-management 2025-07-23 10:18:36 -04:00
Allan Carr
15ea4e6afa IO-3310 Shop Data Preservation on Hidden Fields
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-22 17:40:51 -07:00
Dave Richer
295f1d1cb3 Merge branch 'hotfix/2025-07-22-SocketProvider' into feature/IO-3255-simplified-part-management 2025-07-22 20:17:13 -04:00
Dave Richer
5b3b6a409c Merged in hotfix/2025-07-22-SocketProvider (pull request #2431)
Hotfix/2025 07 22 SocketProvider
2025-07-23 00:16:13 +00:00
Patrick Fic
d92bab113e Merged in hotfix/2025-07-22-SocketProvider (pull request #2430)
Hotfix/2025 07 22 SocketProvider
2025-07-22 21:24:59 +00:00
Patrick Fic
93c6e2b601 Revert socket transport settings. 2025-07-22 14:23:25 -07:00
Dave Richer
19a90571f6 Down Socket Reconnects 2025-07-22 17:11:52 -04:00
Dave Richer
37ceddf54d Merge remote-tracking branch 'origin/release/2025-08-01' into feature/IO-3255-simplified-part-management 2025-07-22 14:56:22 -04:00
Patrick Fic
736e9cedfa Merged in feature/IO-2604-vendor-tagging (pull request #2428)
IO-2604 Add vendor tags to search select & vendor edit screen.

Approved-by: Dave Richer
2025-07-22 18:09:57 +00:00
Patrick Fic
c433103e1b IO-2604 Merge in conflicted translations file. 2025-07-22 10:25:04 -07:00
Patrick Fic
2892fdbb58 IO-2604 reformat translations to resolve conflict. 2025-07-22 10:17:10 -07:00
Patrick Fic
c45f38e47b IO-2604 Add vendor tags to search select & vendor edit screen. 2025-07-22 10:03:07 -07:00
Dave Richer
6f4d21cac9 feature/IO-3255-simplified-parts-management - Merge release 2025-07-22 12:22:52 -04:00
Dave Richer
6b5ad3dafa feature/IO-3255-simplified-parts-management -Checkpoint 2025-07-22 12:20:59 -04:00
Patrick Fic
54a58c9fbc Merged in feature/IO-3292-pinned-notes (pull request #2427)
IO-3292 Add note pinning functionality.

Approved-by: Dave Richer
2025-07-22 16:13:51 +00:00
Patrick Fic
1934ae0758 IO-3292 Add note pinning functionality. 2025-07-22 09:03:41 -07:00
Dave Richer
0ac9bbd97c feature/IO-3255-simplified-parts-management -Checkpoint 2025-07-21 15:28:03 -04:00
Dave Richer
dfa457e3c6 feature/IO-3255-simplified-parts-management -Checkpoint 2025-07-21 15:05:15 -04:00
Dave Richer
e8dec042bd feature/IO-3255-simplified-parts-management - Merge Master / Bump Packages 2025-07-21 13:04:30 -04:00
Dave Richer
d65e7deacc Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3255-simplified-part-management 2025-07-21 12:59:13 -04:00
Dave Richer
953e70efef Merged in release/2025-07-18 (pull request #2422)
Release 2025-07-18 into master-AIO - IO-1054, IO-3252, IO-3286, IO-3291, IO-3296, IO-3303, IO-3309
2025-07-19 00:57:33 +00:00
Dave Richer
a6bae390e5 feature/IO-3255-simplified-parts-management - Merge release / resolve conflicts 2025-07-18 14:55:00 -04:00
Dave Richer
139ee46dc0 feature/IO-3255-simplified-parts-management - Merge release / resolve conflicts 2025-07-18 11:26:51 -04:00
Allan Carr
cf9d8d649d Merged in feature/IO-3309-Date-Restriction-Removal (pull request #2419)
IO-3309 Date Field Rescriton Removal

Approved-by: Dave Richer
2025-07-17 23:36:53 +00:00
Allan Carr
a25051c4c2 IO-3309 Date Field Rescriton Removal
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-17 16:31:08 -07:00
Dave Richer
7a1e7bd4f9 feature/IO-3255-simplified-parts-management - Expand Joblines Parser, remove body-parser reference in favor of express.raw 2025-07-17 13:31:02 -04:00
Dave Richer
254fb4f77f Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3255-simplified-part-management
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2025-07-17 12:49:03 -04:00
Dave Richer
53a559b126 feature/IO-3255-simplified-parts-management - Checkpoint 2025-07-17 12:48:30 -04:00
Allan Carr
d5c3152631 Merged in feature/IO-3252-Reschedule-Job (pull request #2417)
IO-3252 Reschedule Job with Existing Data

Approved-by: Dave Richer
2025-07-16 21:08:03 +00:00
Allan Carr
66c425bf96 IO-3252 Fix Spelling Mistake in Feature Request
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-16 14:12:16 -07:00
Allan Carr
ffad0dfbf7 IO-3252 Reschedule Job with Existing Data
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-16 14:02:30 -07:00
Patrick Fic
17285fc029 Merged in hotfix/2025-07-15-nginxtune (pull request #2416)
Remove all testing due to failed test in RO.
2025-07-16 19:07:20 +00:00
Patrick Fic
401e3cff73 Remove all testing due to failed test in RO. 2025-07-16 12:05:40 -07:00
Patrick Fic
865680e019 Merged in hotfix/2025-07-15-nginxtune (pull request #2415)
Adjust body and buffer sizes.
2025-07-15 21:07:46 +00:00
Patrick Fic
9f97ca0336 Adjust body and buffer sizes. 2025-07-15 14:06:55 -07:00
Patrick Fic
5df38f8612 Merged in hotfix/2025-07-15-nginxtune (pull request #2414)
Override nginx.conf
2025-07-15 20:46:27 +00:00
Patrick Fic
63c5719420 Override nginx.conf 2025-07-15 13:45:37 -07:00
Patrick Fic
d6c80f1420 Merged in hotfix/2025-07-15-nginxtune (pull request #2413)
Additional change
2025-07-15 20:36:13 +00:00
Patrick Fic
fade927c9e Additional change 2025-07-15 13:35:17 -07:00
Patrick Fic
9f472ce1d0 Merged in hotfix/2025-07-15-nginxtune (pull request #2412)
Add worker process limits for EB config.
2025-07-15 20:21:38 +00:00
Patrick Fic
47a56e32b9 Add worker process limits for EB config. 2025-07-15 13:20:41 -07:00
Allan Carr
f13f79acb6 Merged in feature/IO-3286-Additional-Product-Fruit-IDs (pull request #2406)
IO-3286 Additional Product Fruit IDs

Approved-by: Dave Richer
2025-07-15 18:01:05 +00:00
Dave Richer
bfa9fddb9e Merged in feature/IO-3303-logging (pull request #2410)
[DO NOT MERGE] - IO-3303 Logging/Socket Params into Master-AIO

Approved-by: Patrick Fic
2025-07-14 23:51:09 +00:00
Dave Richer
28abd9707e feature/IO-3303-logging - Logging 2025-07-14 19:31:31 -04:00
Dave Richer
5f621e1ae0 feature/IO-3303-logging - Logging 2025-07-14 19:28:29 -04:00
Dave Richer
624414799e Merge branch 'feature/IO-3303-Socket-IO-Optimization-Auto-Add-Watchers-Gate' into release/2025-07-18
# Conflicts:
#	client/src/contexts/SocketIO/socketProvider.jsx
2025-07-14 18:45:34 -04:00
Dave Richer
72091e9eae feature/IO-3303-Socket-IO-Optimization-Auto-Add-Watchers-Gate - SocketIO Optimization / Auto Add Watchers Gate 2025-07-14 18:42:27 -04:00
Dave Richer
9cfacdd025 Merged in feature/IO-3291-Tasks-Notifications (pull request #2407)
feature/IO-3291-Tasks-Notifications: Package Bumps
2025-07-14 17:34:30 +00:00
Dave Richer
d5c63b798a feature/IO-3291-Tasks-Notifications: Package Bumps 2025-07-14 13:33:23 -04:00
Allan Carr
655e516246 IO-3286 Additional Product Fruit IDs
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-11 11:07:12 -07:00
Dave Richer
7b12f0a3b9 Merged in feature/IO-3291-Tasks-Notifications (pull request #2404)
Feature/IO-3291 Tasks Notifications
2025-07-11 17:40:06 +00:00
Dave Richer
e0b937474d feature/IO-3291-Tasks-Notifications: Final 2025-07-11 13:38:19 -04:00
Allan Carr
5c4267f3ef Merge branch 'master-AIO' into feature/IO-3286-Additional-Product-Fruit-IDs 2025-07-11 10:31:22 -07:00
Dave Richer
4dcfb382a9 feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-10 17:27:32 -04:00
Dave Richer
cf181dfd0a feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-10 16:40:55 -04:00
Dave Richer
1127864ba9 feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-10 13:18:01 -04:00
Dave Richer
79e379b61a feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-10 10:12:50 -04:00
Allan Carr
e79e512291 Merged in feature/IO-3296-Scheduled-Delivery-Dashboard (pull request #2402)
Feature/IO-3296 Scheduled Delivery Dashboard

Approved-by: Dave Richer
2025-07-09 22:30:29 +00:00
Allan Carr
f0064abfbe IO-3296 Schedule Delivery Dashboard
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-09 15:16:31 -07:00
Dave Richer
4a30a5bc64 feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-09 17:47:32 -04:00
Allan Carr
32bdea559e IO-3296 Schedule Delivery Dashboard
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-09 14:37:51 -07:00
Dave Richer
d4215b7aee feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-09 16:41:55 -04:00
Dave Richer
2494399993 feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-09 13:12:28 -04:00
Dave Richer
34f62a8858 feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-09 12:40:26 -04:00
Dave Richer
9e5689b06f feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-09 11:59:57 -04:00
Dave Richer
931fa4b82b Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3255-simplified-part-management 2025-07-09 11:15:00 -04:00
Dave Richer
5d69d37db2 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3291-Tasks-Notifications 2025-07-09 11:14:28 -04:00
Dave Richer
9ab2fdc868 feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-09 11:14:04 -04:00
Patrick Fic
fbd6766dcd Merged in feature/IO-3294-imgproxy-bill-upload-hotfix (pull request #2401)
IO-3294 fix upload to image proxy for bills.
2025-07-08 21:46:35 +00:00
Patrick Fic
9ace531edb IO-3294 fix upload to image proxy for bills. 2025-07-08 14:31:32 -07:00
Dave Richer
2e3944099b feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-08 13:52:59 -04:00
Dave Richer
9b53bd9b40 feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-08 12:29:23 -04:00
Dave Richer
443ed717cb feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-08 11:38:18 -04:00
Dave Richer
9845c1cea5 feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-07 18:10:40 -04:00
Dave Richer
2061a49e0e feature/IO-3291-Tasks-Notifications: Checkpoint 2025-07-07 17:35:00 -04:00
Dave Richer
f8a3d0f854 feature/IO-3291-Tasks-Notifications: Pre-cleanup 2025-07-07 15:06:37 -04:00
Dave Richer
91cc12873e feature/IO-3255-simplified-parts-management -Cleanup / Docblocks 2025-07-07 13:19:19 -04:00
Dave Richer
c71026f22a feature/IO-3255-simplified-parts-management - Sample data modified / added 2025-07-07 13:12:47 -04:00
Dave Richer
bd2720f534 feature/IO-3255-simplified-parts-management - Refactor / Working Change Request 2025-07-07 13:09:55 -04:00
Dave Richer
8bc6bea4b2 feature/IO-3255-simplified-parts-management - Bump deps, add Change Request 2025-07-07 12:14:23 -04:00
Allan Carr
23901c0cc1 IO-3286 Adjustment to ID
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-07 08:36:16 -07:00
Allan Carr
b99a212d75 Merged in feature/IO-3286-Additional-Product-Fruit-IDs (pull request #2398)
IO-3286 Adjustment to ID

Approved-by: Dave Richer
2025-07-07 15:33:46 +00:00
Dave Richer
0891c7d4b3 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3255-simplified-part-management
# Conflicts:
#	client/src/components/jobs-detail-header/jobs-detail-header.component.jsx
2025-07-07 11:18:16 -04:00
Dave Richer
a4963922da Merged in feature/IO-1054-ScoreBoard-WorkingDays (pull request #2396)
feature/IO-1054-ScoreBoard-WorkingDays - Fix
2025-07-07 14:37:33 +00:00
Dave Richer
3ae41b7016 feature/IO-1054-ScoreBoard-WorkingDays - Fix 2025-07-07 10:36:58 -04:00
Dave Richer
9c59fd4c00 Merged in release/2025-07-04 (pull request #2393)
DO NOT MERGE - PENDING Release/2025 07 04  into master-AIO - IO-3284 IO-3285 IO-3286 IO-3288
2025-07-05 01:21:35 +00:00
Allan Carr
a9f959cced Merged in feature/IO-3286-Additional-Product-Fruit-IDs (pull request #2394)
IO-3286 Additional Product Fruit IDs

Approved-by: Dave Richer
2025-07-04 21:03:37 +00:00
Allan Carr
414897bba0 IO-3286 Additional Product Fruit IDs
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-07-04 13:35:32 -07:00
Dave Richer
94b154a4ac feature/IO-3255-simplified-parts-management - Checkpoint / Meeting changes 2025-07-03 14:05:35 -04:00
Dave Richer
5fa58e5013 feature/IO-3255-simplified-parts-management - Front End Cleanup 2025-07-03 12:00:21 -04:00
Dave Richer
6496f6c414 feature/IO-3255-simplified-parts-management - Bump deps 2025-07-03 11:52:01 -04:00
Patrick Fic
3a0a3c9fb9 Merge branch 'feature/IO-3255-simplified-part-management' of bitbucket.org:snaptsoft/bodyshop into feature/IO-3255-simplified-part-management 2025-07-02 11:06:29 -07:00
Allan Carr
7467a31d76 Merged in feature/IO-3284-JobLine-Price-Lbr-Hrs-Totals (pull request #2387)
IO-3284 JobLine Price Lbr Hrs Total

Approved-by: Dave Richer
2025-06-27 18:24:16 +00:00
Allan Carr
894f6bf6d2 Merged in feature/IO-3285-Shop-Config-Lite-Basic (pull request #2388)
IO-3285 Shop Config Lite Basic

Approved-by: Dave Richer
2025-06-27 18:23:41 +00:00
Allan Carr
744dfa8163 Merged in feature/IO-3286-Additional-Product-Fruit-IDs (pull request #2389)
IO-3286 Additional Product Fruit IDs

Approved-by: Dave Richer
2025-06-27 18:22:56 +00:00
Dave Richer
2293119518 Merged in feature/IO-3288-Score-Board-Blocked-Days (pull request #2390)
feature/IO-3288-Score-Board-Blocked-Days - Fix
2025-06-27 17:57:25 +00:00
Dave Richer
bd529a0dfa feature/IO-3288-Score-Board-Blocked-Days - Fix 2025-06-27 13:56:18 -04:00
Dave Richer
646c42b8c7 feature/IO-3255-simplified-parts-management - Checkpoint 2025-06-27 13:48:49 -04:00
Dave Richer
8de92403ee feature/IO-3255-simplified-parts-management - Checkpoint 2025-06-27 13:01:18 -04:00
Allan Carr
57ad89747f IO-3286 Additional Product Fruit IDs
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-06-26 18:48:09 -07:00
Allan Carr
3ae8f38adb IO-3285 Shop Config Lite Basic
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-06-26 18:45:48 -07:00
Allan Carr
dc5ed1a39c IO-3284 JobLine Price Lbr Hrs Total
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-06-26 18:40:38 -07:00
Dave Richer
f5ea8719ef Merge branch 'master-AIO' into feature/IO-3255-simplified-part-management 2025-06-26 14:17:04 -04:00
Patrick Fic
aa6e6b8980 Merged in hotfix/2025-06-25 (pull request #2386)
IO-3281 Resolve key issue for downloads.
2025-06-25 23:33:37 +00:00
Patrick Fic
1dc80c068b Merged in feature/IO-3281-imgproxy-download-hotfix (pull request #2385)
IO-3281 Resolve key issue for downloads.
2025-06-25 23:33:14 +00:00
Patrick Fic
bd0c4ceae2 IO-3281 Resolve key issue for downloads. 2025-06-25 16:32:47 -07:00
Patrick Fic
30b58c6ea5 Merged in hotfix/2025-06-25 (pull request #2384)
IO-3281 missed file in previous commit.
2025-06-25 22:48:53 +00:00
Patrick Fic
a55e9224f8 Merged in feature/IO-3281-imgproxy-download-hotfix (pull request #2383)
IO-3281 missed file in previous commit.
2025-06-25 22:48:41 +00:00
Patrick Fic
0c80abb3ca IO-3281 missed file in previous commit. 2025-06-25 15:48:06 -07:00
Patrick Fic
7137e611cd Merged in hotfix/2025-06-25 (pull request #2382)
IO-3281 Prevent broken stream reseting HTTP headers.
2025-06-25 22:37:01 +00:00
Patrick Fic
6f9d291d36 Merged in feature/IO-3281-imgproxy-download-hotfix (pull request #2381)
IO-3281 Prevent broken stream reseting HTTP headers.
2025-06-25 22:36:47 +00:00
Patrick Fic
f2a2653eae IO-3281 Prevent broken stream reseting HTTP headers. 2025-06-25 15:36:03 -07:00
Patrick Fic
73c25ab91f Merged in hotfix/2025-06-25 (pull request #2380)
Hotfix/2025 06 25 - IO-3279 IO-3281
2025-06-25 17:08:57 +00:00
Patrick Fic
780449bac6 Merge branch 'hotfix/2025-06-25' of bitbucket.org:snaptsoft/bodyshop into hotfix/2025-06-25 2025-06-25 10:08:09 -07:00
Patrick Fic
2509a1ecf3 Merge branch 'feature/IO-3279-usage-report' into hotfix/2025-06-25 2025-06-25 10:08:02 -07:00
Patrick Fic
16075f7ddd Merged in feature/IO-3281-imgproxy-download-hotfix (pull request #2378)
IO-3281 Adjust zip to stream.
2025-06-25 16:43:29 +00:00
Patrick Fic
27d28e7ffc IO-3281 Adjust zip to stream. 2025-06-25 09:42:45 -07:00
Patrick Fic
66b87e5c45 Merged in feature/IO-3281-imgproxy-download-hotfix (pull request #2376)
IO-3281 resolve imgproxy download failures.
2025-06-25 15:53:33 +00:00
Patrick Fic
c1e1dff7d2 IO-3281 resolve imgproxy download failures. 2025-06-25 08:51:41 -07:00
Patrick Fic
0e1ec83fcd IO-3255 Fix breadcrumb path. 2025-06-25 08:15:37 -07:00
Dave Richer
01185b3073 feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-06-24 16:22:07 -04:00
Dave Richer
49b0990c7b Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3255-simplified-part-management 2025-06-24 14:45:04 -04:00
Dave Richer
f76eb7abf5 Merged in hotfix/IO-3280-Image-Selection-Bug (pull request #2374)
hotfix/IO-3280-Image-Selection-Bug - Fix Bug in image selection dialog
2025-06-24 18:43:29 +00:00
Dave Richer
25ea2a80a3 hotfix/IO-3280-Image-Selection-Bug - Fix Bug in image selection dialog 2025-06-24 14:42:06 -04:00
Dave Richer
7d930045ef feature/IO-3255-simplified-parts-management - Checkpoint 2025-06-24 14:38:13 -04:00
Patrick Fic
633d5668f0 IO-3279 Set usage report to 1 year. 2025-06-23 15:08:36 -07:00
Patrick Fic
cbb6c43ec3 IO-3255 Clean up front end components for pm. 2025-06-23 14:00:25 -07:00
Dave Richer
09e1887609 feature/IO-3255-simplified-parts-management - Checkpoint 2025-06-23 14:24:15 -04:00
Dave Richer
4b83330db9 feature/IO-3255-simplified-parts-management - Checkpoint 2025-06-23 14:00:58 -04:00
Dave Richer
b0283f827e feature/IO-3255-simplified-parts-management - Checkpoint 2025-06-20 14:51:30 -04:00
Dave Richer
3c71902047 feature/IO-3255-simplified-parts-management - Checkpoint 2025-06-20 13:48:58 -04:00
Dave Richer
79bf30b299 feature/IO-3255-simplified-parts-management - Checkpoint 2025-06-20 13:30:49 -04:00
Dave Richer
dc3e9b7226 feature/IO-3255-simplified-parts-management - Checkpoint 2025-06-20 13:25:48 -04:00
Dave Richer
00cc47553b Merged in release/2025-06-13 (pull request #2373)
Release/2025 06 13 into master-AIO - IO-3222 IO-3256 IO-3254
2025-06-19 18:26:08 +00:00
Dave Richer
2505edede7 feature/IO-3255-simplified-parts-management - Checkpoint 2025-06-19 13:08:48 -04:00
Dave Richer
4b75504d9e feature/IO-3255-simplified-parts-management - Checkpoint 2025-06-18 11:22:23 -04:00
Dave Richer
8af6c8dd24 feature/IO-3255-simplified-parts-management 2025-06-12 12:05:40 -04:00
Dave Richer
4c6344a8d7 Merge remote-tracking branch 'origin/release/2025-06-13' into feature/IO-3255-simplified-part-management 2025-06-12 11:49:28 -04:00
Patrick Fic
92369fceba IO-3255 Initial parts management changes. 2025-06-11 10:29:58 -07:00
Dave Richer
3c360130a3 Merged in feature/IO-3258-Shop-User-Vendor-Creation (pull request #2371)
Feature/IO-3258 Shop User Vendor Creation
2025-06-09 22:44:01 +00:00
Dave Richer
13e4143eeb feature/IO-3258-Shop-User-Vendor-Creation: Finish 2025-06-09 18:43:15 -04:00
Dave Richer
68c7b184d2 feature/IO-3258-Shop-User-Vendor-Creation: Finish 2025-06-09 18:39:29 -04:00
Dave Richer
9b85d15ff1 feature/IO-3258-Shop-User-Vendor-Creation: bump deps 2025-06-09 11:18:08 -04:00
Dave Richer
e7cf49a2ec Merged in feature/IO-3254-Basic-Lite-Trial-Completion-User-Lockout (pull request #2369)
feature/IO-3254-Basic-Lite-Trial-Completion-User-Lockout - Translations
2025-06-09 15:11:50 +00:00
Dave Richer
04b29b6970 feature/IO-3254-Basic-Lite-Trial-Completion-User-Lockout - Translations 2025-06-09 11:10:54 -04:00
Dave Richer
f5bc79cba7 Merged in feature/IO-3254-Basic-Lite-Trial-Completion-User-Lockout (pull request #2367)
feature/IO-3254-Basic-Lite-Trial-Completion-User-Lockout - Bump deps
2025-06-05 17:25:00 +00:00
Dave Richer
2ae18681cb feature/IO-3254-Basic-Lite-Trial-Completion-User-Lockout - Bump deps 2025-06-05 13:23:52 -04:00
Allan Carr
fda763476a IO-3256 Product Fruits IDs
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-06-04 17:34:23 -07:00
Dave Richer
999cbd80f4 Merged in feature/IO-3222-Vendor-Name-OpenSearch (pull request #2365)
IO-3222 Vendor Name Open Search
2025-06-03 18:11:06 +00:00
Dave Richer
ad2a5fe95b Merged in release/2025-06-02 (pull request #2364)
Release 2025-06-02 into master-AIO - IO-3075, IO-3105, IO-3182, IO-3214, IO-3230, IO-3235, IO-3236, IO-3239, IO-3243, IO-3246, IO-3247, IO-3249, IO-3251
2025-06-02 23:58:37 +00:00
Patrick Fic
d835021069 IO-3092 Resolve imgproxy limit fetch. 2025-06-02 11:03:58 -07:00
Dave Richer
c4b303aee1 Merged in feature/IO-3182-Phone-Number-Consent (pull request #2362)
feature/IO-3182-Phone-Number-Consent - Checkpoint
2025-05-30 18:14:52 +00:00
Dave Richer
e2c5a4cba4 feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-30 14:14:05 -04:00
Dave Richer
fd04125ed1 Merged in feature/IO-3182-Phone-Number-Consent (pull request #2360)
feature/IO-3182-Phone-Number-Consent - Checkpoint
2025-05-29 17:51:45 +00:00
Dave Richer
a0566e76ab feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-29 13:49:56 -04:00
Patrick Fic
87e8b2ce27 Merged in feature/IO-3239-integration-logging (pull request #2359)
IO-3239 Additional logging fixes.
2025-05-28 22:22:09 +00:00
Patrick Fic
d52426f5f5 IO-3239 Additional logging fixes. 2025-05-28 15:21:42 -07:00
Allan Carr
5e24404e82 Merged in feature/IO-3251-Quick-Intake-Jobs-at-Change (pull request #2357)
IO-3251 Quick Intake Jobs at Change

Approved-by: Dave Richer
2025-05-28 20:25:37 +00:00
Allan Carr
64a280b111 IO-3251 Quick Intake Jobs at Change
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-05-28 13:26:13 -07:00
Dave Richer
cf393e8f9e Merged in feature/IO-3182-Phone-Number-Consent (pull request #2355)
feature/IO-3182-Phone-Number-Consent - Checkpoint
2025-05-28 18:02:19 +00:00
Dave Richer
909a21023a feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-28 14:01:24 -04:00
Dave Richer
0402156b4d Merged in feature/IO-3182-Phone-Number-Consent (pull request #2353)
Feature/IO-3182 Phone Number Consent
2025-05-28 17:46:42 +00:00
Dave Richer
94bdc6c43f feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-28 13:45:12 -04:00
Dave Richer
9466d36e69 feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-28 13:17:21 -04:00
Dave Richer
412efb06e5 feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-28 13:07:11 -04:00
Dave Richer
da7e637183 feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-28 12:26:48 -04:00
Dave Richer
2e95fa25af feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-28 12:17:43 -04:00
Dave Richer
f6c63bbd74 Merged in feature/IO-3182-Phone-Number-Consent (pull request #2351)
feature/IO-3182-Phone-Number-Consent - Checkpoint
2025-05-27 15:43:03 +00:00
Dave Richer
0a654082c2 feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-27 11:41:31 -04:00
Dave Richer
2c20b731d2 Merged in feature/IO-3182-Phone-Number-Consent (pull request #2350)
Feature/IO-3182 Phone Number Consent
2025-05-27 15:38:56 +00:00
Dave Richer
8a22897cdd feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-27 11:35:16 -04:00
Dave Richer
677da61b52 Merge remote-tracking branch 'origin/release/2025-06-02' into feature/IO-3182-Phone-Number-Consent 2025-05-27 11:34:44 -04:00
Dave Richer
6513434bd7 feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-27 11:34:16 -04:00
Dave Richer
fe2600029f feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-27 11:03:09 -04:00
Allan Carr
c5b4efedfb Merged in feature/IO-3249-Delete-Job-Watchers (pull request #2348)
IO-3249 Delete Job Watchers

Approved-by: Dave Richer
2025-05-26 20:28:56 +00:00
Allan Carr
310321d0ab IO-3249 Delete Job Watchers
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-05-26 12:49:58 -07:00
Allan Carr
7e884c42ea Merged in feature/IO-3214-Extend-New-Fields-to-Audit-Log (pull request #2346)
IO-3214 Extend New Fields to Audit Log

Approved-by: Dave Richer
2025-05-26 19:10:16 +00:00
Allan Carr
e279bf41a4 IO-3214 Extend New Fields to Audit Log
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-05-26 12:11:26 -07:00
Dave Richer
4a060ab51c Merged in feature/IO-3182-Phone-Number-Consent (pull request #2345)
Feature/IO-3182 Phone Number Consent
2025-05-26 19:08:47 +00:00
Dave Richer
62c1c77a18 feature/IO-3182-Phone-Number-Consent - Finish core functionality 2025-05-26 15:07:57 -04:00
Dave Richer
db19ecb28c feature/IO-3182-Phone-Number-Consent - Front/Back Start/stop logic complete 2025-05-26 14:49:02 -04:00
Dave Richer
51748ce28d feature/IO-3182-Phone-Number-Consent - Front/Back Start/stop logic complete 2025-05-26 14:44:27 -04:00
Allan Carr
4bbfd8a9da Merged in feature/IO-3247-Quick-Deliver-Require-Delivery (pull request #2343)
IO-3247 Quick Deliver Require Delivery

Approved-by: Dave Richer
2025-05-26 17:37:36 +00:00
Allan Carr
d4d2db2cac IO-3247 Quick Deliver Require Delivery
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-05-26 10:29:03 -07:00
Dave Richer
23483144e1 Merged in feature/IO-3182-Phone-Number-Consent (pull request #2341)
feature/IO-3182-Phone-Number-Consent - Up Deps
2025-05-26 17:09:48 +00:00
Dave Richer
67d5dcb062 feature/IO-3182-Phone-Number-Consent - Up Deps 2025-05-26 13:09:07 -04:00
Allan Carr
901a49e571 Merged in feature/IO-3246-Remote-Assist (pull request #2337)
IO-3246 Remote Assist

Approved-by: Dave Richer
2025-05-24 17:29:38 +00:00
Dave Richer
49ae107fde release/2025-06-02 - add phone 2025-05-24 13:23:38 -04:00
Dave Richer
0135281bcd release/2025-06-02 - test push 2025-05-24 13:15:53 -04:00
Allan Carr
99cf95daf0 IO-3246 Remote Assist
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-05-23 16:45:24 -07:00
Allan Carr
8c1758ae49 Merged in feature/IO-3075-Crisp-Basic-Info (pull request #2335)
IO-3075 Crisp Basic Info

Approved-by: Dave Richer
2025-05-23 18:03:15 +00:00
Allan Carr
2d764921ff IO-3075 Crisp Basic Info
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-05-23 10:43:15 -07:00
Dave Richer
858a11f8b4 Merged in feature/IO-3242-Visual-Production-Board-Vertical-Drag-Bug (pull request #2334)
HOTFIX - feature/IO-3242-Visual-Production-Board-Vertical-Drag-Bug - Fix bug
2025-05-23 15:38:17 +00:00
Dave Richer
4859239f55 Merged in feature/IO-3242-Visual-Production-Board-Vertical-Drag-Bug (pull request #2332)
feature/IO-3242-Visual-Production-Board-Vertical-Drag-Bug - Fix bug
2025-05-23 15:01:44 +00:00
Dave Richer
5c64d7185e feature/IO-3242-Visual-Production-Board-Vertical-Drag-Bug - Fix bug 2025-05-23 11:00:21 -04:00
Patrick Fic
152479bc08 Merged in feature/IO-3239-integration-logging (pull request #2331)
Feature/IO-3239 integration logging
2025-05-22 18:56:05 +00:00
Patrick Fic
2c508cf1a1 IO-3239 QBO Logging and integration log schema changes. 2025-05-22 11:54:17 -07:00
Patrick Fic
16a91c772a Merged in release/2025-06-02 (pull request #2330)
Release/2025 06 02
2025-05-22 16:46:27 +00:00
Dave Richer
5c47088b11 release/2025-06-02 - Lint Updates 2025-05-22 11:37:47 -04:00
Allan Carr
8e5dc4fa71 Merged in feature/IO-3243-Job-Costing-TOW (pull request #2327)
IO-3243 Job Costing TOW

Approved-by: Dave Richer
2025-05-22 15:13:34 +00:00
Allan Carr
39c3729f6d Merged in feature/IO-3230-Customer-List-Excel (pull request #2326)
IO-3230 Customer List Excel

Approved-by: Dave Richer
2025-05-22 15:13:03 +00:00
Allan Carr
e3d854e02b IO-3243 Job Costing TOW
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-05-21 17:53:33 -07:00
Allan Carr
618acf2acf IO-3230 Customer List Excel
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-05-21 16:28:09 -07:00
Dave Richer
2cf2b70293 Merged in feature/IO-3182-Phone-Number-Consent (pull request #2325)
Feature/IO-3182 Phone Number Consent
2025-05-21 19:17:52 +00:00
Dave Richer
0541afceb8 feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-21 15:17:11 -04:00
Dave Richer
28ed3f9936 Merged in feature/IO-3182-Phone-Number-Consent (pull request #2324)
DO NOT MERGE JUST USING TO UNDO
2025-05-21 19:03:58 +00:00
Dave Richer
6afa50332b feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-21 15:03:02 -04:00
Dave Richer
8c8c68867d feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-21 14:39:17 -04:00
Dave Richer
8ee52598e8 feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-21 14:32:35 -04:00
Allan Carr
c822028174 Merged in feature/IO-3235-FeatureAccess-VisualBoard-Color (pull request #2322)
IO-3235 FeatureAccess on VisualBoard for SmartSchedule Option of Color Cards

Approved-by: Dave Richer
2025-05-21 18:06:04 +00:00
Allan Carr
36b82c6195 Merged in feature/IO-3236-HasFeatureAccess-Date (pull request #2323)
IO-3236 HasFeatureAccess Date

Approved-by: Dave Richer
2025-05-21 18:05:23 +00:00
Allan Carr
079dffce4d IO-3236 HasFeatureAccess Date
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-05-20 17:16:27 -07:00
Allan Carr
831802f5af IO-3235 FeatureAccess on VisualBoard for SmartSchedule Option of Color Cards
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-05-20 15:25:29 -07:00
Dave Richer
7bd5190bf2 feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-20 18:19:39 -04:00
Dave Richer
83860152a9 feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-20 16:04:36 -04:00
Dave Richer
1e10493615 Merged in feature/IO-3182-Phone-Number-Consent (pull request #2321)
Feature/IO-3182 Phone Number Consent
2025-05-20 17:45:24 +00:00
Dave Richer
9d81c68a4d feature/IO-3182-Phone-Number-Consent - Checkpoint 2025-05-20 13:14:05 -04:00
Dave Richer
985d066978 feature/IO-3182-Phone-Number-Consent - Finish Database changes 2025-05-20 12:49:32 -04:00
Dave Richer
6ad9e27d1d feature/IO-3182-Phone-Number-Consent - Merge master / bump deps 2025-05-20 12:38:31 -04:00
Dave Richer
19ebdda5b3 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3182-Phone-Number-Consent 2025-05-20 12:30:15 -04:00
Allan Carr
4602dd1183 Merged in master-AIO (pull request #2320)
IO-3217 OTSL Labor Type
2025-05-19 21:03:00 +00:00
Allan Carr
6005eaee6a Merged in feature/IO-3217-OTSL-Labor-Type (pull request #2319)
IO-3217 OTSL Labor Type
2025-05-19 21:02:01 +00:00
Patrick Fic
6d59e3994f Merged in feature/IO-3105-qbo-version-update (pull request #2318)
feature/IO-3105-qbo-version-update

Approved-by: Patrick Fic
2025-05-19 19:30:34 +00:00
Patrick Fic
f770b2f1b1 IO-3105 Add QBO Minor Version. 2025-05-19 12:28:50 -07:00
Patrick Fic
b014744940 IO-3239 Add integration log statements on QBO. 2025-05-19 11:10:02 -07:00
Dave Richer
714c90c25e Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3182-Phone-Number-Consent 2025-05-15 18:55:23 -04:00
Dave Richer
9a3a971da6 Clear Stage 2025-05-15 18:55:20 -04:00
Dave Richer
96cba0aaab Clear Stage 2025-05-15 18:54:55 -04:00
Patrick Fic
c069600cfd Merged in hotfix/2025-05-15 (pull request #2317)
Hotfix/2025 05 15 IO-3217 IO-3066 IO-3210 IO-2328
2025-05-15 22:47:26 +00:00
Patrick Fic
186cbf2c97 Merge branch 'feature/IO-3066-ems-upload' into hotfix/2025-05-15 2025-05-15 15:47:04 -07:00
Patrick Fic
392988ae11 Io-3066 resolve typo. 2025-05-15 15:46:45 -07:00
Allan Carr
2e33b79eb9 Merged in feature/IO-3210-Podium-Datapump (pull request #2315)
IO-3210 Podium Datapump

Approved-by: Patrick Fic
2025-05-15 22:39:39 +00:00
Allan Carr
d4f718c44c Merged in feature/IO-3210-Podium-Datapump (pull request #2314)
IO-3210 Podium Datapump

Approved-by: Patrick Fic
2025-05-15 22:39:28 +00:00
Patrick Fic
fa99ef7b37 Merge branch 'feature/IO-3066-ems-upload' into hotfix/2025-05-15 2025-05-15 15:36:44 -07:00
Patrick Fic
c4aff1b516 Merge branch 'feature/IO-2328-intellipay-querystring-package' into hotfix/2025-05-15 2025-05-15 15:36:31 -07:00
Patrick Fic
61276bb2d1 IO-2328 change querystring versions. 2025-05-15 15:35:56 -07:00
Allan Carr
8b89e2eb9d IO-3210 Podium Datapump
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-05-15 15:27:59 -07:00
Patrick Fic
9ab41308e7 IO-3066 add EMS upload functionality. 2025-05-15 12:53:41 -07:00
Allan Carr
f76052ec9b Merge branch 'master-AIO' into feature/IO-3210-Podium-Datapump
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-05-15 12:41:09 -07:00
Patrick Fic
b8841e3ded Merged in release/2025-05-09 (pull request #2312)
IO-3190 Add nulll coalesce and check for non-intake events.

Approved-by: Patrick Fic
2025-05-15 00:57:44 +00:00
Patrick Fic
a49b3f6496 IO-3190 Add nulll coalesce and check for non-intake events. 2025-05-14 17:56:15 -07:00
Patrick Fic
163eaac110 Fortellis bug fixes. 2025-05-14 17:48:28 -07:00
Dave Richer
3e17ec3cf8 Merged in release/2025-05-09 (pull request #2310)
[DO NOT MERGE ] Release/2025-05-09 into master-AIO
2025-05-14 20:10:07 +00:00
Dave Richer
76c0c7c41e release/2025-05-09 - Bump Deps 2025-05-13 10:43:15 -04:00
Dave Richer
025b986f60 Merged in feature/IO-3228-Notifications-1.6-and-Deprecations (pull request #2308)
feature/IO-3228-Notifications-1.6-and-Deprecations
2025-05-09 14:39:59 +00:00
Dave Richer
6e6addd62f feature/IO-3228-Notifications-1.6-and-Deprecations
- See Ticket for full details (Notifications restrictions, AntD deprecations)
2025-05-09 10:38:19 -04:00
Dave Richer
266c3acf34 Merged in feature/IO-3214-Job-Status-Card-Extension (pull request #2306)
feature/IO-3214-Job-Status-Card-Extension - PR Notes/Package Updates
2025-05-08 15:27:53 +00:00
Dave Richer
c4631f50e5 feature/IO-3214-Job-Status-Card-Extension - PR Notes/Package Updates 2025-05-08 11:25:44 -04:00
Dave Richer
ca18291425 Merged in feature/IO-3214-Job-Status-Card-Extension (pull request #2304)
feature/IO-3214-Job-Status-Card-Extension - Complete
2025-05-06 21:10:52 +00:00
Dave Richer
110fad2abc feature/IO-3214-Job-Status-Card-Extension - Complete 2025-05-06 17:08:46 -04:00
Dave Richer
b7456cecd4 release/2025-05-09 - Restore GraphQL Dep 2025-05-06 14:55:18 -04:00
Dave Richer
84db1fe81b Merged in feature/IO-3225-Notifications-1.5 (pull request #2300)
Feature/IO-3225 Notifications 1.5 into Release/2025-05-09
2025-05-06 18:20:20 +00:00
Dave Richer
b539111be8 feature/IO-3225-Notifications-1.5: Final Refactoring / Optimization 2025-05-06 14:19:22 -04:00
Dave Richer
8a8bc5a6ed feature/IO-3225-Notifications-1.5: Final Refactoring / Optimization 2025-05-06 13:53:40 -04:00
Dave Richer
020db91105 feature/IO-3225-Notifications-1.5: checkpoint 2025-05-06 13:38:42 -04:00
Dave Richer
1dd28af752 feature/IO-3225-Notifications-1.5: Package Updates / Maintenance 2025-05-06 12:58:21 -04:00
Dave Richer
5ba192eee0 feature/IO-3225-Notifications-1.5: Finish 2025-05-05 17:06:23 -04:00
Dave Richer
8109a12898 feature/IO-3225-Notifications-1.5: DB Changes 2025-05-05 15:02:44 -04:00
Dave Richer
2deb7fd520 feature/IO-3225-Notifications-1.5: DB Changes 2025-05-05 13:57:25 -04:00
Dave Richer
f6cd136679 feature/IO-3225-Notifications-1.5: Packages 2025-05-05 13:16:57 -04:00
Dave Richer
e50cb86296 release/2025-04-25 - Update DD, trying again 2025-05-02 13:45:14 -04:00
Dave Richer
a5a01c44fa release/2025-04-25 - Remove DD 2025-04-30 14:07:01 -04:00
Dave Richer
947e0705e4 release/2025-04-25 - Update/Restore DD for test purposes.4 2025-04-30 11:37:21 -04:00
Dave Richer
aa8a6a837d release/2025-04-25: remove body-parser reference from pay-all.js 2025-04-30 11:30:25 -04:00
Dave Richer
5db440fc9c release/2025-04-25: remove body-parser reference from misc routes 2025-04-30 11:28:15 -04:00
Dave Richer
c299b9376a release/2025-04-25: revert body parser, remove DD 2025-04-30 10:26:38 -04:00
Dave Richer
e5d530ea3e release/2025-04-25: Update Backend Packages 2025-04-28 17:15:13 -04:00
Dave Richer
6da9850946 release/2025-04-25: Update Sentry 2025-04-28 13:03:02 -04:00
Dave Richer
f62609f60c release/2025-04-25: revert body parser to discrete package 2025-04-28 12:58:27 -04:00
Dave Richer
b2d8c66e5b release/2025-04-25: clean 2025-04-28 12:17:40 -04:00
Dave Richer
3c4ed3ba0c release/2025-04-25: Patch Updates to packages 2025-04-26 12:16:46 -04:00
Dave Richer
2e7f827c3f release/2025-04-25: Patch Updates to packages 2025-04-26 11:18:39 -04:00
Patrick Fic
dc82b39dc8 Remove crisp status reporter. 2025-04-25 20:27:07 -07:00
Dave Richer
a9814c1eb1 Merged in release/2025-04-25 (pull request #2287)
Release/2025-04-25 into Master-AIO -  IO-2282, IO-3066, IO-3164, IO-3187, IO-3190, IO-3200, IO-3210, IO-3212, IO-3213, IO-3215, IO-3220, IO-3223
2025-04-26 00:43:22 +00:00
Patrick Fic
bdb741caf8 Merged in feature/IO-3223-canny (pull request #2288)
IO-3223 Add Canny for feature request and change log.

Approved-by: Dave Richer
2025-04-25 21:12:43 +00:00
Dave Richer
f50b198c21 feature/IO-3223-canny - Small syntactic update 2025-04-25 17:12:18 -04:00
Dave Richer
3495326de3 feature/IO-3223-canny - Merge release / fix conflicts 2025-04-25 17:06:44 -04:00
Patrick Fic
b5973085e7 IO-3223 Add Canny for feature request and change log. 2025-04-25 14:02:40 -07:00
Patrick Fic
19ce1c66ad WIP Fortellis. 2025-04-25 11:58:38 -07:00
Allan Carr
3fe0e3a33c IO-3222 Vendor Name Open Search
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-25 09:39:20 -07:00
Dave Richer
8687214420 release/2025-04-25 - update handleInvoiceBasedPayment.test.js 2025-04-25 11:58:47 -04:00
Dave Richer
d61b89a1e5 release/2025-04-25 - Add logging around handleInvoiceBasePayment paymentResponse, toned logs down. fixed issue in paymentResponseResults 2025-04-25 11:54:36 -04:00
Allan Carr
468b42abd2 Merged in feature/IO-3220-VPB-Popup (pull request #2284)
IO-3220 VPB Board Settings Popup

Approved-by: Dave Richer
2025-04-25 14:59:13 +00:00
Allan Carr
fc03e5f983 IO-3220 VPB Board Settings Popup
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-24 13:32:27 -07:00
Allan Carr
c4742e38ea Merged in feature/IO-3213-Hit-and-Run-Toggle (pull request #2280)
IO-3213 Hit and Run Toggle

Approved-by: Dave Richer
2025-04-24 15:41:41 +00:00
Allan Carr
99e1adbe13 Merge branch 'release/2025-04-25' into feature/IO-3213-Hit-and-Run-Toggle
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>

# Conflicts:
#	client/src/components/jobs-detail-general/jobs-detail-general.component.jsx
2025-04-24 08:42:32 -07:00
Allan Carr
eb5c797a43 Merged in feature/IO-3215-Employee-Assignment-Timeticket-Modal (pull request #2279)
IO-3215 Employee Assignment Timeticket Modal

Approved-by: Dave Richer
2025-04-24 15:34:42 +00:00
Allan Carr
0595c5545e Merged in feature/IO-3212-ACV-Amount (pull request #2281)
IO-3212 ACV Amount

Approved-by: Dave Richer
2025-04-24 15:33:41 +00:00
Allan Carr
12c87ed689 IO-3217 OTSL Labor Type
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-23 18:48:35 -07:00
Allan Carr
55944257aa IO-3212 ACV Amount
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-23 13:16:49 -07:00
Allan Carr
03241778fa IO-3212 ACV Amount
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-23 13:10:42 -07:00
Allan Carr
555b81fb14 IO-3213 Hit and Run Toggle
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-23 12:04:29 -07:00
Allan Carr
a56b720e09 IO-3215 Employee Assignment Timeticket Modal
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-23 09:51:44 -07:00
Allan Carr
b89eede164 Merged in feature/IO-3164-Schedule-Completion-Business-Days (pull request #2277)
IO-3164 Schedule Completion Business Days

Approved-by: Dave Richer
2025-04-22 13:48:43 +00:00
Allan Carr
c21cc8d6b9 IO-3164 Schedule Completion Business Days
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-21 12:27:33 -07:00
Dave Richer
d02a6bc197 Merged in feature/IO-2282-VSSTA-Integration (pull request #2270)
[DO NOT MERGE] Feature/IO-2282 VSSTA Integration into release/2025-04-25
2025-04-21 17:00:07 +00:00
Dave Richer
360c1ce82d feature/IO-2282-VSSTA-Integration 2025-04-21 12:57:00 -04:00
Allan Carr
a7ef02976c Merged in feature/IO-3200-Extended-Crisp-Segments (pull request #2276)
IO-3200 Extended Crisp Segments for BASIC/LITE

Approved-by: Dave Richer
2025-04-21 16:54:31 +00:00
Allan Carr
6a9e36ea4d IO-3200 Extended Crisp Segments for BASIC/LITE
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-17 16:20:34 -07:00
Allan Carr
37d4c0a40f IO-3210 Podium Datapump CRON Trigger
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-17 12:42:19 -07:00
Allan Carr
5ebca3ff06 Merged in feature/IO-3210-Podium-Datapump (pull request #2275)
IO-3210 Podium Datapump CRON Trigger
2025-04-17 19:42:05 +00:00
Allan Carr
1969a92226 Merged in feature/IO-3210-Podium-Datapump (pull request #2273)
IO-3210 Podium Datapump

Approved-by: Dave Richer
2025-04-17 17:40:59 +00:00
Allan Carr
8840ffc9ba IO-3210 Product Fruits Insurance Company Add Button ID
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-17 10:03:08 -07:00
Allan Carr
19e42ef397 IO-3210 Podium Datapump
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-16 17:52:22 -07:00
Patrick Fic
e2b4b408ed Basic posting up to fortellis-select-customer. 2025-04-16 15:55:22 -07:00
Allan Carr
c7eb026986 Merged in feature/IO-3190-Quick-Intake-Schedule-Event (pull request #2271)
IO-3190 Quick Intake Schedule Event

Approved-by: Dave Richer
2025-04-16 20:16:41 +00:00
Allan Carr
b0dcd3618e IO-3190 Quick Intake Schedule Event
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-16 13:00:01 -07:00
Allan Carr
5f23f135f2 Merged in feature/IO-3187-Admin-Enhancements (pull request #2269)
IO-3187 Admin Enhancements

Approved-by: Dave Richer
2025-04-16 19:10:03 +00:00
Allan Carr
159ee7364d IO-3187 Admin Enhancements
add BCC

Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-15 22:08:21 -07:00
Dave Richer
aa6ad109c9 feature/IO-3187-Admin-Enhancements - Minor cleanup 2025-04-15 14:21:28 -04:00
Dave Richer
f2a896d568 feature/IO-3187-Admin-Enhancements - Minor cleanup 2025-04-15 14:02:29 -04:00
Dave Richer
546ebba0bd feature/IO-3187-Admin-Enhancements - Minor cleanup 2025-04-15 13:57:50 -04:00
Dave Richer
0e75f54d6e feature/IO-2282-VSSTA-Integration: - doc blocks / cleanup 2025-04-15 13:39:34 -04:00
Dave Richer
30f34a17ea feature/IO-2282-VSSTA-Integration: - doc blocks / cleanup 2025-04-15 13:20:07 -04:00
Dave Richer
6035d94404 feature/IO-2282-VSSTA-Integration: - doc blocks / cleanup 2025-04-15 13:05:42 -04:00
Dave Richer
0b7a23d555 feature/IO-2282-VSSTA-Integration: - include some tests for media utils 2025-04-15 13:02:54 -04:00
Dave Richer
91fe1f4af9 feature/IO-2282-VSSTA-Integration: - Finish Integration 2025-04-15 12:55:38 -04:00
Dave Richer
f09cb7b247 feature/IO-2282-VSSTA-Integration: - Finish Integration 2025-04-15 12:40:33 -04:00
Dave Richer
35a7222f5e feature/IO-2282-VSSTA-Integration: - checkpoint 2025-04-15 11:29:44 -04:00
Dave Richer
d444821cf7 feature/IO-2282-VSSTA-Integration: - checkpoint 2025-04-15 10:46:49 -04:00
Allan Carr
b5cb520944 IO-3187 Admin Enhancements
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-14 17:07:57 -07:00
Allan Carr
6814a3bc33 Merge branch 'master-AIO' into feature/IO-3187-Admin-Enhancements
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-14 16:57:20 -07:00
Patrick Fic
19c2b19abc Merged in feature/IO-3066-partner-refresh (pull request #2268)
IO-3066 Call partner refresh on shop change.
2025-04-14 22:32:44 +00:00
Patrick Fic
22b011139d IO-3066 Call partner refresh on shop change. 2025-04-14 15:29:45 -07:00
Patrick Fic
567171c722 Resolve use socket. 2025-04-14 14:59:36 -07:00
Patrick Fic
03acb78ab2 Merge branch 'master-AIO' into feature/IO-2776-cdk-fortellis 2025-04-14 12:51:43 -07:00
Dave Richer
5b30daefe5 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-2282-VSSTA-Integration 2025-04-14 11:03:29 -04:00
Dave Richer
e015d3574a Merged in release/2025-04-11 (pull request #2267)
Release/2025-04-11 into master-AIO - IO-2769, IO-2885, IO-3045, IO-3066, IO-3193, IO-3198, IO-3202
2025-04-12 01:27:08 +00:00
Dave Richer
60140902d4 Merged in feature/IO-3045-Product-Fruits-Tours-Modifications (pull request #2265)
feature/IO-3045-Product-Fruits-Tours-Modifications - Add in roles prop on Product fruits, tie the usage of it to a new db bodyshop var tours_enabled.
2025-04-10 16:28:21 +00:00
Dave Richer
84f41b2c11 feature/IO-3045-Product-Fruits-Tours-Modifications - Add in roles prop on Product fruits, tie the usage of it to a new db bodyshop var tours_enabled. 2025-04-10 12:27:54 -04:00
Dave Richer
e8b9fcbc6e feature/IO-2282-VSSTA-Integration:
- Clean up imgproxy-media.js
2025-04-10 09:37:31 -04:00
Dave Richer
5adf591670 feature/IO-2282-VSSTA-Integration:
- Clean up imgproxy-media.js
2025-04-10 09:27:49 -04:00
Dave Richer
f55764e859 feature/IO-2282-VSSTA-Integration:
- Boilerplate in new route
- Fix issues with imgproxy
- Clean up imgproxy
2025-04-09 14:56:49 -04:00
Dave Richer
282fa787a9 Merged in feature/IO-2769-Job-Totals-Testing (pull request #2263)
feature/IO-2769-Job-Totals-Testing - packages, final update
2025-04-09 16:53:04 +00:00
Dave Richer
037efff81c feature/IO-2769-Job-Totals-Testing - packages, final update 2025-04-09 12:52:23 -04:00
Patrick Fic
e26eb17d09 Merged in feature/IO-3066-ems-parts-order-data (pull request #2262)
IO-3066 Add additional CIECA fields for new partner

Approved-by: Patrick Fic
2025-04-09 16:34:42 +00:00
Patrick Fic
fbea9fde27 IO-3066 Add additional CIECA fields for new partner 2025-04-09 09:33:37 -07:00
Dave Richer
ce7cf6bdbe Merged in feature/IO-2769-Job-Totals-Testing (pull request #2260)
feature/IO-2769-Job-Totals-Testing - updated tests
2025-04-09 15:19:09 +00:00
Dave Richer
2c47e5d852 feature/IO-2769-Job-Totals-Testing - updated tests 2025-04-09 11:18:09 -04:00
Dave Richer
a6f809b20a Merged in feature/IO-2769-Job-Totals-Testing (pull request #2258)
feature/IO-2769-Job-Totals-Testing - non-related
2025-04-08 22:14:52 +00:00
Dave Richer
2bcad68351 feature/IO-2769-Job-Totals-Testing - non-related 2025-04-08 18:14:20 -04:00
Dave Richer
6b1b393804 Merged in feature/IO-2769-Job-Totals-Testing (pull request #2256)
Feature/IO-2769 Job Totals Testing
2025-04-08 22:11:26 +00:00
Dave Richer
c5181d1c5d feature/IO-2769-Job-Totals-Testing - non-related 2025-04-08 18:10:28 -04:00
Dave Richer
e33ff2a45d feature/IO-2769-Job-Totals-Testing - cleanup 2025-04-08 17:04:50 -04:00
Allan Carr
9eb77964db Merged in feature/IO-3202-HasFeatureAccess-Boolean (pull request #2250)
IO-3202 HasFeatureAccess Boolean

Approved-by: Dave Richer
2025-04-08 17:17:50 +00:00
Allan Carr
0a68d2791d IO-3202 HasFeatureAccess Boolean
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-08 09:51:52 -07:00
Dave Richer
11928d9a7e Merged in feature/IO-2769-Job-Totals-Testing (pull request #2253)
Feature/IO-2769 Job Totals Testing
2025-04-08 16:23:34 +00:00
Dave Richer
c169bb5d5d feature/IO-2769-Job-Totals-Testing - update end point 2025-04-08 12:19:33 -04:00
Dave Richer
3cc4f1c63e feature/IO-2769-Job-Totals-Testing - fix typo 2025-04-08 12:00:43 -04:00
Dave Richer
5237b1d535 Merged in feature/IO-2769-Job-Totals-Testing (pull request #2251)
feature/IO-2769-Job-Totals-Testing
2025-04-08 15:47:09 +00:00
Dave Richer
cd56c50cf9 feature/IO-2769-Job-Totals-Testing 2025-04-08 11:46:16 -04:00
Dave Richer
a18ce18d72 feature/IO-2769-Job-Totals-Testing 2025-04-08 11:42:27 -04:00
Allan Carr
3691d32aaa IO-3202 HasFeatureAccess Boolean
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-07 17:36:39 -07:00
Dave Richer
5f66488410 release/2025-04-11 - Remove unused constant from server.js 2025-04-07 13:06:47 -04:00
Dave Richer
d1be7f6e09 Merged in test-AIO (pull request #2249)
Test AIO
2025-04-07 17:04:04 +00:00
Dave Richer
44f02f28a6 Merged in release/2025-04-11 (pull request #2248)
release/2025-04-11 - Add Ivana to Usage Report
2025-04-07 17:03:00 +00:00
Dave Richer
6d33622b4e release/2025-04-11 - Add Ivana to Usage Report 2025-04-07 13:01:23 -04:00
Dave Richer
f8b8e23ef4 Merged in release/2025-04-11 (pull request #2247)
release/2025-04-11 - Fix Packages
2025-04-07 16:12:42 +00:00
Dave Richer
db09d09428 release/2025-04-11 - Fix Packages 2025-04-07 12:11:53 -04:00
Dave Richer
451820a67c Merged in release/2025-04-11 (pull request #2246)
Release/2025 04 11
2025-04-04 18:19:46 +00:00
Dave Richer
ba0ce5027e Merged in feature/IO-2769-Job-Totals-Testing (pull request #2245)
feature/IO-2769-Job-Totals-testing: Setup testing method for job totals

Approved-by: Patrick Fic
2025-04-04 18:18:51 +00:00
Dave Richer
f777d26cc1 feature/IO-2769-Job-Totals-testing: Allow for both american and canadian capture + tests 2025-04-04 14:15:30 -04:00
Dave Richer
1463037878 feature/IO-2769-Job-Totals-testing: Allow for both american and canadian capture + tests 2025-04-04 13:54:53 -04:00
Dave Richer
7ddec0bb0f feature/IO-2769-Job-Totals-testing: Allow for both american and canadian capture + tests 2025-04-04 13:49:21 -04:00
Dave Richer
51c2d3351a feature/IO-2769-Job-Totals-testing: Allow for both american and canadian capture + tests 2025-04-04 13:47:38 -04:00
Dave Richer
8323fa6696 feature/IO-2769-Job-Totals-testing: Allow for both american and canadian capture + tests 2025-04-04 13:45:45 -04:00
Dave Richer
27a3932c08 feature/IO-2769-Job-Totals-testing: Allow for both american and canadian capture + tests 2025-04-04 13:43:19 -04:00
Dave Richer
add88659a4 feature/IO-2769-Job-Totals-testing: Setup testing method for job totals 2025-04-04 13:23:33 -04:00
Dave Richer
320ad065d0 feature/IO-2769-Job-Totals-testing: Setup testing method for job totals 2025-04-04 13:19:44 -04:00
Dave Richer
a9bc51949a Merged in release/2025-04-11 (pull request #2244)
feature/IO-3198-Seperate-Socket-Provider-useSocket
2025-04-03 17:12:19 +00:00
Dave Richer
39d1397221 Merged in feature/IO-3198-Seperate-Socket-Provider-useSocket (pull request #2243)
feature/IO-3198-Seperate-Socket-Provider-useSocket
2025-04-03 17:11:55 +00:00
Dave Richer
b44b71072f feature/IO-3198-Seperate-Socket-Provider-useSocket 2025-04-03 13:10:24 -04:00
Dave Richer
f3e2a83bab Merged in release/2025-04-11 (pull request #2242)
IO-3193 Reconciliation Zero Part Price or Qty
2025-04-03 16:37:40 +00:00
Allan Carr
0ef030bb89 Merged in feature/IO-3193-Reconciliation-Zero-Part (pull request #2241)
IO-3193 Reconciliation Zero Part Price or Qty

Approved-by: Dave Richer
2025-04-03 15:26:21 +00:00
Allan Carr
3e9e6baf32 IO-3193 Reconciliation Zero Part Price or Qty
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-04-02 13:56:02 -07:00
Dave Richer
c03d45b3fc Merged in release/2025-04-11 (pull request #2240)
Release/2025 04 11
2025-04-02 18:15:36 +00:00
Dave Richer
0a9b583c4b Merged in feature/IO-2885-IntelliPay-App-Postback-Support (pull request #2236)
Feature/IO-2885 IntelliPay App Postback Support
2025-04-02 18:15:07 +00:00
Dave Richer
54ac0c84a7 Merged release/2025-04-11 into feature/IO-2885-IntelliPay-App-Postback-Support 2025-04-02 17:44:54 +00:00
Dave Richer
4d59798d8d Merged in release/2025-03-28 (pull request #2239)
release/2025-03-28 - Add Cookies Provider
2025-04-02 17:44:40 +00:00
Dave Richer
f95dab544d Merged release/2025-04-11 into feature/IO-2885-IntelliPay-App-Postback-Support 2025-04-02 16:59:45 +00:00
Dave Richer
41e43dda96 feature/IO-2885-IntelliPay-App-Postback-Support - Cleanup 2025-04-02 11:59:54 -04:00
Dave Richer
cec60db78c Merge branch 'release/2025-03-28' into feature/IO-2885-IntelliPay-App-Postback-Support 2025-04-02 11:50:42 -04:00
Dave Richer
7e741e4af9 Merged in release/2025-03-28 (pull request #2238)
release/2025-03-28 - Add Cookies Provider
2025-04-02 15:47:49 +00:00
Dave Richer
24d47ae1c5 Merged in release/2025-03-28 (pull request #2237)
Release/2025 03 28
2025-04-02 15:39:16 +00:00
Dave Richer
f556d59ad7 release/2025-03-28 - Add Cookies Provider 2025-04-02 11:38:40 -04:00
Dave Richer
09c4662436 feature/IO-2885-IntelliPay-App-Postback
- Add Tests
2025-04-02 11:34:48 -04:00
Dave Richer
9bf6ba9cf0 feature/IO-2885-IntelliPay-App-Postback
- Refactor / Add Tests
2025-04-02 11:09:03 -04:00
Dave Richer
7843ca9b1a Merged in release/2025-03-28 (pull request #2235)
[DO NOT MERGE ]Release/2025-03-28 into master-AIO - IO-2999, IO-3092, IO-3176, IO-3178, IO-3181, IO-3183, IO-3185, IO-3187
2025-04-02 12:51:24 +00:00
Dave Richer
c78b9866a3 feature/IO-2885-IntelliPay-App-Postback
- Finish ticket
2025-04-01 15:15:48 -04:00
Patrick Fic
c8701aba63 Add region capture to Crisp. 2025-04-01 10:03:17 -07:00
Dave Richer
09c1a8ae35 feature/IO-2885-IntelliPay-App-Postback-Support
- Clean intellipay.js
2025-04-01 12:57:32 -04:00
Dave Richer
0ef2814de3 feature/IO-2885-IntelliPay-App-Postback-Support
- Clean intellipay.js, add new route scaffolding
2025-04-01 12:33:41 -04:00
Dave Richer
8e105f0b36 feature/IO-2885-IntelliPay-App-Postback-Support
- Replace/Remove body-parser with Expresses built in body parsing middleware
2025-04-01 12:20:50 -04:00
Dave Richer
ba4da3e35c feature/IO-2885-IntelliPay-App-Postback-Support
- Packages
2025-04-01 12:04:14 -04:00
Dave Richer
1b8be56c15 Merged in release/2025-03-28 (pull request #2234)
Release/2025-03-28 into test-AIO - IO-3181
2025-03-28 16:18:08 +00:00
Dave Richer
f6e65f82e5 Merged in feature/IO-3181-Test-Framework-Selection (pull request #2233)
Feature/IO-3181 Test Framework Selection
2025-03-28 16:17:31 +00:00
Dave Richer
8b7bb099f3 feature/IO-3181-Test-Framework-Selection - Skeletons complete 2025-03-28 12:16:36 -04:00
Dave Richer
2b26db78eb Merged in release/2025-03-28 (pull request #2232)
IO-3187 Admin Enhancements
2025-03-27 14:04:43 +00:00
Allan Carr
663d91b648 Merged in feature/IO-3187-Admin-Enhancements (pull request #2231)
IO-3187 Admin Enhancements

Approved-by: Dave Richer
2025-03-27 14:04:09 +00:00
Allan Carr
2a7686ec75 IO-3187 Admin Enhancements
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-26 15:21:42 -07:00
Dave Richer
549cb56cdf feature/IO-3181-Test-Framework-Selection - Skeletons complete 2025-03-26 16:54:05 -04:00
Dave Richer
146bb6c5c0 feature/IO-3181-Test-Framework-Selection - Skeletons complete 2025-03-26 16:52:59 -04:00
Dave Richer
67b6da7c31 feature/IO-3181-Test-Framework-Selection - Skeletons complete 2025-03-26 16:51:53 -04:00
Dave Richer
c2d96922c8 Merged in release/2025-03-28 (pull request #2230)
IO-3176 IntelliPay Payment Mapping
2025-03-26 18:24:26 +00:00
Allan Carr
624894621b Merged in feature/IO-3176-IntelliPay-Payment-Mapping (pull request #2229)
IO-3176 IntelliPay Payment Mapping

Approved-by: Dave Richer
2025-03-26 18:13:51 +00:00
Allan Carr
3fba215266 Merge branch 'release/2025-03-28' into feature/IO-3176-IntelliPay-Payment-Mapping
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-25 20:17:50 -07:00
Allan Carr
bbf291e8f3 IO-3176 IntelliPay Payment Mapping
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-25 20:16:34 -07:00
Dave Richer
70b4ec7948 Merged in release/2025-03-28 (pull request #2228)
release/2025-03-28 - Modify vite config
2025-03-25 20:53:36 +00:00
Dave Richer
341fc09c22 release/2025-03-28 - Modify vite config 2025-03-25 16:51:33 -04:00
Dave Richer
a3ec364034 Merged in release/2025-03-28 (pull request #2227)
release/2025-03-28 - Modify vite config
2025-03-25 20:48:25 +00:00
Dave Richer
fb30529808 release/2025-03-28 - Modify vite config 2025-03-25 16:48:03 -04:00
Dave Richer
e1728b275b Merged in release/2025-03-28 (pull request #2226)
release/2025-03-28 - Package locks
2025-03-25 20:38:36 +00:00
Dave Richer
46999145fc release/2025-03-28 - Package locks 2025-03-25 16:38:03 -04:00
Allan Carr
9d1f810af2 Merge branch 'release/2025-03-28' into feature/IO-3176-IntelliPay-Payment-Mapping
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-25 12:22:36 -07:00
Dave Richer
10d55df461 Merged in release/2025-03-28 (pull request #2224)
Release/2025 03 28
2025-03-25 19:07:28 +00:00
Dave Richer
b9693aae95 Merge remote-tracking branch 'origin/test-AIO' into release/2025-03-28 2025-03-25 15:04:46 -04:00
Dave Richer
02f5f1985c release/2025-03-28 - Up two deps 2025-03-25 15:01:50 -04:00
Dave Richer
37edceee84 Merged in feature/IO-3092-imgproxy (pull request #2225)
Feature/IO-3092 imgproxy
2025-03-25 18:58:34 +00:00
Dave Richer
76a855990d feature/IO-3092-imgproxy - Merge release to take care of PR conflicts. 2025-03-25 14:57:17 -04:00
Dave Richer
517eca0900 Revert "Merge remote-tracking branch 'origin/release/2025-02-28' into feature/IO-3092-imgproxy"
This reverts commit ba9b248b1f, reversing
changes made to 0810798d30.
2025-03-25 14:53:09 -04:00
Dave Richer
ba9b248b1f Merge remote-tracking branch 'origin/release/2025-02-28' into feature/IO-3092-imgproxy 2025-03-25 14:44:49 -04:00
Dave Richer
0cd1e3ae98 Merged in feature/IO-3183-Dependency-Updates-and-maintenance (pull request #2220)
Feature/IO-3183-Dependency-Updates-and-maintenance
2025-03-25 17:10:10 +00:00
Dave Richer
ecac8197a9 Merged release/2025-03-28 into feature/IO-3183-Dependency-Updates-and-maintenance 2025-03-25 17:10:03 +00:00
Allan Carr
c595a00a45 Merged in feature/IO-3185-Job-Drawer-Suspend-Job (pull request #2223)
IO-3185 Job Drawer Suspend Job

Approved-by: Dave Richer
2025-03-25 17:09:45 +00:00
Dave Richer
ed7aaac620 Merged release/2025-03-28 into feature/IO-3183-Dependency-Updates-and-maintenance 2025-03-25 13:42:43 +00:00
Allan Carr
b88795078c IO-3185 Job Drawer Suspend Job
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-24 18:16:31 -07:00
Allan Carr
1fd63012b0 Merged in release/2025-03-28 (pull request #2222)
Release/2025 03 28
2025-03-25 00:03:29 +00:00
Allan Carr
3c02553d08 Merged in feature/IO-3178-Flat-Rate-ATS (pull request #2221)
IO-3178 Flat Rate ATS

Approved-by: Dave Richer
2025-03-24 21:48:34 +00:00
Allan Carr
f485951a4c IO-3178 Requested Changes for Flat Rate ATS
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-24 12:47:51 -07:00
Dave Richer
1b5ae29078 IO-3183-Dependency-Updates-and-maintenance - Remove concurrently, clean up scripts in both package.json`s 2025-03-24 15:34:32 -04:00
Dave Richer
aaf966e721 IO-3183-Dependency-Updates-and-maintenance - remove userpilot, update i18next , logrocket, react-cookie, react-i18next, react-markdown 2025-03-24 15:01:18 -04:00
Dave Richer
c9cc9d2df3 IO-3183-Dependency-Updates-and-maintenance - Cleaning dashboard-grid.component.jsx 2025-03-24 14:26:32 -04:00
Dave Richer
b5611c8470 IO-3183-Dependency-Updates-and-maintenance - Cleaning dashboard-grid.component.jsx 2025-03-24 14:16:25 -04:00
Dave Richer
e36bb65e4c IO-3183-Dependency-Updates-and-maintenance - Cleaning dashboard-grid.component.jsx 2025-03-24 14:14:24 -04:00
Dave Richer
3b21c603f6 IO-3183-Dependency-Updates-and-maintenance - Cleaning dashboard-grid.component.jsx 2025-03-24 14:09:21 -04:00
Dave Richer
c568970fd8 IO-3183-Dependency-Updates-and-maintenance - Refactor dashboard-grid.component.jsx to separate some of the logic into componentList.js and createDashboardQuery.js 2025-03-24 14:05:21 -04:00
Dave Richer
4589e7fa05 IO-3183-Dependency-Updates-and-maintenance - Revert react-grid-layout 2025-03-24 13:54:18 -04:00
Dave Richer
922aaaf4b2 IO-3183-Dependency-Updates-and-maintenance - Minor front end dep bump, logging clean up on OS 2025-03-24 13:23:41 -04:00
Dave Richer
f3b9c6399f IO-3183-Dependency-Updates-and-maintenance - UUID, Concurrently and Twilio Updates 2025-03-24 13:10:00 -04:00
Allan Carr
8bb86b9caa IO-3178 Flat Rate ATS
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-24 09:59:41 -07:00
Dave Richer
c0670e09e0 IO-3183-Dependency-Updates-and-maintenance - remove unneeded react import 2025-03-24 12:41:50 -04:00
Allan Carr
14046b96db Merged in feature/IO-3176-IntelliPay-Payment-Mapping (pull request #2219)
IO-3176 IntelliPay Payment Mapping Correction

Approved-by: Dave Richer
2025-03-24 16:40:19 +00:00
Dave Richer
65ae105c33 IO-3181-Testing-Framework-Selection: Small backend package bumps 2025-03-24 12:33:19 -04:00
Dave Richer
cf376d413f IO-3181-Testing-Framework-Selection: Additional package removals 2025-03-24 11:42:19 -04:00
Dave Richer
96557115b8 IO-3181-Testing-Framework-Selection: Firebase update / additional package removal / console.log removal 2025-03-24 11:39:07 -04:00
Dave Richer
85f1d5cae2 IO-3181-Testing-Framework-Selection: Remove Cypress, upgrade Split 2025-03-24 11:04:07 -04:00
Dave Richer
b9eb622207 IO-3181-Testing-Framework-Selection: Package update checkpoint 2025-03-21 13:16:57 -04:00
Allan Carr
7e2a214a50 IO-3176 IntelliPay Payment Mapping Correction
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-20 12:07:16 -07:00
Dave Richer
cf084fa168 Merged in release/2025-03-28 (pull request #2218)
IO-3176 IntelliPay Payment Method Mapping
2025-03-19 18:19:45 +00:00
Allan Carr
4c6d28f612 Merged in feature/IO-3176-IntelliPay-Payment-Mapping (pull request #2217)
IO-3176 IntelliPay Payment Method Mapping

Approved-by: Dave Richer
Approved-by: Patrick Fic
2025-03-19 18:19:25 +00:00
Allan Carr
38119f7f1f IO-3176 IntelliPay Payment Method Mapping
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-19 09:10:20 -07:00
Dave Richer
96af289640 Merged in release/2025-03-28 (pull request #2216)
IO-2999 IO Test Report Server Migration
2025-03-17 18:37:32 +00:00
Patrick Fic
e7c4797fef IO-2776 Add additional redis helpers, restructure some fortellis calls. 2025-03-17 10:49:02 -07:00
Allan Carr
869fe78d8e Merged in feature/IO-2999-IO-Test-Report-Server-Migration (pull request #2215)
IO-2999 IO Test Report Server Migration

Approved-by: Dave Richer
2025-03-17 17:43:10 +00:00
Allan Carr
4a9b0cae69 IO-2999 IO Test Report Server Migration
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-14 21:47:03 -07:00
Dave Richer
de3f1972a6 Merged in release/2025-03-14 (pull request #2204)
Release/2025-03-14 into master-AIO -IO-3096, IO-3166, IO-3169, IO-3170, IO-3172

Approved-by: Patrick Fic
2025-03-14 22:01:48 +00:00
Patrick Fic
88c35e8c48 Merge branch 'release/2025-03-14' into feature/IO-2776-cdk-fortellis 2025-03-14 09:21:09 -07:00
Dave Richer
f8df351de6 Merged in release/2025-03-14 (pull request #2214)
Release/2025 03 14
2025-03-14 15:29:10 +00:00
Dave Richer
02a9274f98 Merged in feature/IO-3096-GlobalNotifications (pull request #2213)
Feature/IO-3096 GlobalNotifications
2025-03-14 15:28:45 +00:00
Dave Richer
2c0eab9366 IO-3096-GlobalNotifications - Correct time zone from footer in notification email 2025-03-14 11:27:28 -04:00
Patrick Fic
b831d8ca8a IO-3096 Add indexes for notifications. 2025-03-13 15:27:20 -07:00
Dave Richer
87a57e057d Merged in feature/IO-3096-GlobalNotifications (pull request #2212)
IO-3096-GlobalNotifications - Adjust splits
2025-03-13 21:41:35 +00:00
Dave Richer
69da6bccf7 IO-3096-GlobalNotifications - Adjust splits 2025-03-13 17:37:36 -04:00
Patrick Fic
8623172aa1 WIP Fortellis work. 2025-03-13 14:06:07 -07:00
Dave Richer
b8c096f4ff Merged in release/2025-03-14 (pull request #2211)
IO-3172 RO Basic Payments V2
2025-03-13 21:03:15 +00:00
Allan Carr
f2e399f0df Merged in feature/IO-3172-RO-Basic-Payments-V2 (pull request #2210)
IO-3172 RO Basic Payments V2

Approved-by: Dave Richer
2025-03-13 21:02:12 +00:00
Allan Carr
9a1f0e1e42 IO-3172 RO Basic Payments V2
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-13 14:01:24 -07:00
Dave Richer
93ad23b615 Merged in release/2025-03-14 (pull request #2209)
Release/2025 03 14
2025-03-13 19:34:49 +00:00
Dave Richer
0675f84386 release/2025-03-14 - Fix issues caused by 3 of us merging stuff into release, 2 of which are months long. 2025-03-13 15:30:26 -04:00
Dave Richer
6994e44bd3 Merge branch 'release/2025-03-14' of bitbucket.org:snaptsoft/bodyshop into release/2025-03-14 2025-03-13 15:28:27 -04:00
Dave Richer
0d6d8e9d7c release/2025-03-14 - Fix issues caused by 3 of us merging stuff into release, 2 of which are months long. 2025-03-13 15:28:15 -04:00
Dave Richer
0a918535bb Merged in release/2025-03-14 (pull request #2208)
IO-3096-GlobalNotifications - Verify status reporter is a function and exists prior to calling it in cleanup task
2025-03-13 19:00:54 +00:00
Dave Richer
f7c01d5b35 Merged in feature/IO-3096-GlobalNotifications (pull request #2207)
IO-3096-GlobalNotifications - Verify status reporter is a function and exists prior to calling it in cleanup task
2025-03-13 19:00:34 +00:00
Dave Richer
e3d7ebd7d8 IO-3096-GlobalNotifications - Verify status reporter is a function and exists prior to calling it in cleanup task 2025-03-13 14:59:58 -04:00
Dave Richer
4863b16b5f Merged in release/2025-03-14 (pull request #2206)
IO-3096-GlobalNotifications - Add in a function to exclude extra logging from production
2025-03-13 17:58:20 +00:00
Dave Richer
acea8d2fee Merged in feature/IO-3096-GlobalNotifications (pull request #2205)
IO-3096-GlobalNotifications - Add in a function to exclude extra logging from production
2025-03-13 17:57:17 +00:00
Dave Richer
5f0b63a192 IO-3096-GlobalNotifications - Add in a function to exclude extra logging from production 2025-03-13 13:56:30 -04:00
Dave Richer
a27f5e2153 Merged in release/2025-03-14 (pull request #2203)
IO-3170-HotfixFoRedis
2025-03-13 15:52:48 +00:00
Dave Richer
1d0b4386d1 Merged in feature/IO-3170-HotFixForRedis (pull request #2202)
IO-3170-HotfixFoRedis

Approved-by: Patrick Fic
2025-03-13 15:52:26 +00:00
Dave Richer
a36db7cee7 Merge branch 'feature/IO-3096-GlobalNotifications' into release/2025-03-14 2025-03-13 11:51:32 -04:00
Dave Richer
7a5ac739ab Merge branch 'feature/IO-3170-HotFixForRedis' into feature/IO-3096-GlobalNotifications 2025-03-13 11:49:31 -04:00
Dave Richer
e2297be0af IO-3170-HotfixFoRedis 2025-03-13 11:47:21 -04:00
Dave Richer
3ffea50072 Merged in release/2025-03-14 (pull request #2201)
IO-3166-Global-Notifications-Part-2: Remove unused event handler (hasura),
2025-03-13 15:32:21 +00:00
Dave Richer
a3c0e25407 Merged in feature/IO-3096-GlobalNotifications (pull request #2200)
IO-3166-Global-Notifications-Part-2: Remove unused event handler (hasura),
2025-03-13 15:31:52 +00:00
Dave Richer
73c4983342 Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2199)
IO-3166-Global-Notifications-Part-2: Remove unused event handler (hasura),
2025-03-13 15:31:28 +00:00
Dave Richer
166e1e4030 IO-3166-Global-Notifications-Part-2: Remove unused event handler (hasura), 2025-03-13 11:29:41 -04:00
Dave Richer
34af7d3880 Merged in release/2025-03-14 (pull request #2198)
IO-3166-Global-Notifications-Part-2: add additional key prefixes for dev v prod
2025-03-13 01:14:18 +00:00
Dave Richer
a6c863f67d Merged in feature/IO-3096-GlobalNotifications (pull request #2197)
IO-3166-Global-Notifications-Part-2: add additional key prefixes for dev v prod
2025-03-13 01:13:23 +00:00
Dave Richer
5fa7377121 Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2196)
IO-3166-Global-Notifications-Part-2: add additional key prefixes for dev v prod
2025-03-13 01:12:33 +00:00
Dave Richer
f21ba8e087 IO-3166-Global-Notifications-Part-2: add additional key prefixes for dev v prod 2025-03-12 21:10:42 -04:00
Dave Richer
4432721c27 Merged in release/2025-03-14 (pull request #2195)
IO-3166-Global-Notifications-Part-2: Make sure BULLMQ prefixes do not collide
2025-03-13 00:03:35 +00:00
Dave Richer
169b5265c3 Merged in feature/IO-3096-GlobalNotifications (pull request #2194)
IO-3166-Global-Notifications-Part-2: Make sure BULLMQ prefixes do not collide
2025-03-13 00:02:40 +00:00
Dave Richer
d56d1f369c Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2193)
IO-3166-Global-Notifications-Part-2: Make sure BULLMQ prefixes do not collide
2025-03-13 00:01:56 +00:00
Dave Richer
360a1954f4 IO-3166-Global-Notifications-Part-2: Make sure BULLMQ prefixes do not collide 2025-03-12 20:00:53 -04:00
Dave Richer
65ad4d9426 Merged in release/2025-03-14 (pull request #2192)
Release/2025-03-14 into test-AIO - IO-3172 IO-3166
2025-03-12 16:09:26 +00:00
Dave Richer
72ee621303 Merge remote-tracking branch 'origin/feature/IO-3172-RO-Basic-Payments' into release/2025-03-14 2025-03-12 12:08:07 -04:00
Dave Richer
478e5fb569 Merged in feature/IO-3096-GlobalNotifications (pull request #2191)
Feature/IO-3096 GlobalNotifications
2025-03-12 16:07:09 +00:00
Dave Richer
6b047418cc Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2190)
Feature/IO-3166 Global Notifications Part 2
2025-03-12 16:06:34 +00:00
Dave Richer
87db292e5d IO-3166-Global-Notifications-Part-2: Fix typo in builder function name 2025-03-12 12:05:21 -04:00
Dave Richer
9ef8440e64 IO-3166-Global-Notifications-Part-2: Add Enabled key to scenario map (backend), filter out scenarios not enabled. 2025-03-12 11:46:09 -04:00
Dave Richer
8ae3b28cb6 IO-3166-Global-Notifications-Part-2: checkpoint, Modify additional strings as per Allan, Refactor builder down to prevent duplicate logic, comment out supplement imported. 2025-03-12 11:34:50 -04:00
Allan Carr
87a55028e1 Merge branch 'release/2025-03-14' into feature/IO-3172-RO-Basic-Payments
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>

# Conflicts:
#	client/src/components/header/header.component.jsx
#	client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx
2025-03-11 13:38:19 -07:00
Allan Carr
8045c228d6 IO-3172 RO Basic Payments
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-11 13:25:25 -07:00
Patrick Fic
6ecc67184d Merge branch 'master-AIO' into feature/IO-2776-cdk-fortellis 2025-03-11 13:08:54 -07:00
Dave Richer
18924b4f08 Merged in release/2025-03-14 (pull request #2188)
Release/2025 03 14
2025-03-11 19:16:00 +00:00
Dave Richer
b97bc0df8e Merged in feature/IO-3096-GlobalNotifications (pull request #2187)
Feature/IO-3096 GlobalNotifications
2025-03-11 19:15:10 +00:00
Dave Richer
0d80854196 Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2186)
Feature/IO-3166 Global Notifications Part 2
2025-03-11 19:14:02 +00:00
Dave Richer
029fb58f48 IO-3166-Global-Notifications-Part-2: checkpoint 2025-03-11 14:47:54 -04:00
Dave Richer
85929b0bb1 IO-3166-Global-Notifications-Part-2: checkpoint 2025-03-11 14:09:35 -04:00
Dave Richer
dc234e4d72 IO-3166-Global-Notifications-Part-2: checkpoint 2025-03-11 13:57:05 -04:00
Dave Richer
c524f5f0e0 Merged in release/2025-03-14 (pull request #2185)
Release/2025 03 14
2025-03-11 17:18:59 +00:00
Dave Richer
cf86430aa9 Merged in feature/IO-3096-GlobalNotifications (pull request #2184)
Feature/IO-3096 GlobalNotifications
2025-03-11 17:18:43 +00:00
Dave Richer
212fc4a7cc Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2183)
Feature/IO-3166 Global Notifications Part 2
2025-03-11 17:18:10 +00:00
Dave Richer
8de7db60e6 IO-3166-Global-Notifications-Part-2: checkpoint 2025-03-11 13:16:47 -04:00
Dave Richer
d6df5af1a4 IO-3166-Global-Notifications-Part-2: checkpoint 2025-03-11 11:57:16 -04:00
Dave Richer
8d36ad3589 IO-3166-Global-Notifications-Part-2: checkpoint 2025-03-11 11:38:56 -04:00
Dave Richer
9061821347 IO-3166-Global-Notifications-Part-2: Fixed unread notifications not vanishing once marked as read in unread only 2025-03-11 11:00:42 -04:00
Dave Richer
aa6fc78aa0 Merged in feature/IO-3169-OpenSearch-Extension (pull request #2182)
IO-3169 OpenSearch Extension
2025-03-07 21:35:59 +00:00
Dave Richer
2fbac78eec Merged in release/2025-03-14 (pull request #2181)
IO-3166-Global-Notifications-Part-2: getAwsClusterFix
2025-03-07 21:00:29 +00:00
Dave Richer
77e4d72a54 Merged in feature/IO-3096-GlobalNotifications (pull request #2180)
IO-3166-Global-Notifications-Part-2: getAwsClusterFix
2025-03-07 21:00:09 +00:00
Dave Richer
1fad3968bb Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2179)
IO-3166-Global-Notifications-Part-2: getAwsClusterFix
2025-03-07 20:59:43 +00:00
Dave Richer
1d84dd1a83 IO-3166-Global-Notifications-Part-2: getAwsClusterFix 2025-03-07 15:58:52 -05:00
Dave Richer
4734971d48 Merged in release/2025-03-14 (pull request #2178)
IO-3170-Enhanced-GetRedisEndpointsFromAWS - Fix to prevent breaking
2025-03-07 20:30:58 +00:00
Dave Richer
9a5a2c7497 Merged in feature/IO-3096-GlobalNotifications (pull request #2177)
IO-3170-Enhanced-GetRedisEndpointsFromAWS - Fix to prevent breaking
2025-03-07 20:28:08 +00:00
Dave Richer
a492909ad7 Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2176)
IO-3170-Enhanced-GetRedisEndpointsFromAWS - Fix to prevent breaking
2025-03-07 20:27:22 +00:00
Dave Richer
14a885b443 Merge branch 'hotfix/IO-3170-Enhanced-GetRedisEndpointsFromAWS' into feature/IO-3166-Global-Notifications-Part-2 2025-03-07 15:26:22 -05:00
Dave Richer
d5bd9d9b59 IO-3170-Enhanced-GetRedisEndpointsFromAWS - Fix to prevent breaking 2025-03-07 15:19:40 -05:00
Dave Richer
fc1055c644 Merged in release/2024-03-14 (pull request #2174)
IO-3166-Global-Notifications-Part-2 - Improved GetRedisNodesFromAWS
2025-03-07 20:13:18 +00:00
Dave Richer
774f1fea68 Merged in feature/IO-3096-GlobalNotifications (pull request #2173)
IO-3166-Global-Notifications-Part-2 - Improved GetRedisNodesFromAWS
2025-03-07 20:12:28 +00:00
Dave Richer
6e6cabbd63 Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2172)
IO-3166-Global-Notifications-Part-2 - Improved GetRedisNodesFromAWS
2025-03-07 20:11:02 +00:00
Dave Richer
480838b1dc IO-3166-Global-Notifications-Part-2 - Improved GetRedisNodesFromAWS 2025-03-07 15:10:06 -05:00
Allan Carr
57930005b2 IO-3169 OpenSearch Extension
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-03-07 11:55:37 -08:00
Dave Richer
24798390b5 Merged in release/2024-03-14 (pull request #2170)
IO-3166-Global-Notifications-Part-2 - Small styling change
2025-03-07 18:52:24 +00:00
Dave Richer
e7bbb96dc3 Merged in feature/IO-3096-GlobalNotifications (pull request #2169)
IO-3166-Global-Notifications-Part-2 - Small styling change
2025-03-07 18:51:56 +00:00
Dave Richer
ffadd31a5f Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2168)
IO-3166-Global-Notifications-Part-2 - Small styling change
2025-03-07 18:51:21 +00:00
Dave Richer
235527140c IO-3166-Global-Notifications-Part-2 - Small styling change 2025-03-07 13:50:40 -05:00
Dave Richer
a992dead04 Merged in release/2024-03-14 (pull request #2167)
IO-3166-Global-Notifications-Part-2 - Checkpoint
2025-03-07 16:05:48 +00:00
Dave Richer
af6139dcaf Merged in feature/IO-3096-GlobalNotifications (pull request #2166)
IO-3166-Global-Notifications-Part-2 - Checkpoint
2025-03-07 16:05:22 +00:00
Dave Richer
ef22ba3d2c Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2165)
IO-3166-Global-Notifications-Part-2 - Checkpoint
2025-03-07 16:04:27 +00:00
Dave Richer
11ff8e91c7 IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-07 10:58:01 -05:00
Dave Richer
f039cd8d0d Merged in release/2024-03-14 (pull request #2164)
Release/2024 03 14
2025-03-06 22:44:23 +00:00
Dave Richer
f120116e52 Merged in feature/IO-3096-GlobalNotifications (pull request #2163)
Feature/IO-3096 GlobalNotifications
2025-03-06 22:43:52 +00:00
Dave Richer
71dd138f2f Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2162)
Feature/IO-3166 Global Notifications Part 2
2025-03-06 22:43:24 +00:00
Dave Richer
36f4cc8cb8 IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-06 17:41:54 -05:00
Patrick Fic
d2944ff902 IO-3166 Update notification strings. 2025-03-06 14:38:00 -08:00
Dave Richer
494e691230 Merged in release/2024-03-14 (pull request #2161)
Release/2024 03 14
2025-03-06 21:08:05 +00:00
Dave Richer
46af401e9b Merged in feature/IO-3096-GlobalNotifications (pull request #2160)
Feature/IO-3096 GlobalNotifications
2025-03-06 21:06:39 +00:00
Dave Richer
3cbcbb92eb Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2159)
Feature/IO-3166 Global Notifications Part 2
2025-03-06 21:06:15 +00:00
Dave Richer
02e6c6007c IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-06 16:05:42 -05:00
Dave Richer
2cee5f1944 IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-06 16:02:01 -05:00
Dave Richer
4cc7366290 Merged in release/2024-03-14 (pull request #2158)
Release/2024 03 14
2025-03-06 18:40:37 +00:00
Dave Richer
1c1f0a16e2 Merged in feature/IO-3096-GlobalNotifications (pull request #2157)
Feature/IO-3096 GlobalNotifications
2025-03-06 18:40:17 +00:00
Dave Richer
ef695776cd Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2156)
Feature/IO-3166 Global Notifications Part 2
2025-03-06 18:39:46 +00:00
Dave Richer
53580fbc78 IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-06 13:36:19 -05:00
Dave Richer
21335d4e8c IO-3166-Global-Notifications-Part-2 - Checkpoint - job watchers styling 2025-03-05 21:05:24 -05:00
Dave Richer
fd9d660a61 Merged in release/2024-03-14 (pull request #2155)
Release/2024 03 14
2025-03-05 22:33:06 +00:00
Dave Richer
8b98206e63 Merged in feature/IO-3096-GlobalNotifications (pull request #2154)
Feature/IO-3096 GlobalNotifications
2025-03-05 22:31:24 +00:00
Dave Richer
9b545d6c8c Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2153)
Feature/IO-3166 Global Notifications Part 2
2025-03-05 22:30:11 +00:00
Dave Richer
fbe674a2e5 IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-05 17:29:24 -05:00
Dave Richer
2a65cb5025 IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-05 17:28:32 -05:00
Dave Richer
0b5bd4f718 Merged in release/2024-03-14 (pull request #2152)
Release/2024 03 14
2025-03-05 18:56:08 +00:00
Dave Richer
14cffd3ad4 Merged in feature/IO-3096-GlobalNotifications (pull request #2151)
Feature/IO-3096 GlobalNotifications
2025-03-05 18:55:14 +00:00
Dave Richer
b4a3960eac Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2150)
Feature/IO-3166 Global Notifications Part 2
2025-03-05 18:54:42 +00:00
Dave Richer
358503f9ef IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-05 12:46:45 -05:00
Dave Richer
25a9e6cea1 IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-05 12:18:01 -05:00
Dave Richer
7511b42bd4 Merged in release/2024-03-14 (pull request #2149)
Release/2024 03 14
2025-03-05 16:47:40 +00:00
Dave Richer
9567cd88b1 Merged in feature/IO-3096-GlobalNotifications (pull request #2148)
Feature/IO-3096 GlobalNotifications
2025-03-05 16:45:24 +00:00
Dave Richer
e40e0bbb8f Merged release/2024-03-14 into feature/IO-3096-GlobalNotifications 2025-03-05 16:45:08 +00:00
Dave Richer
8fdd07827e Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2147)
Feature/IO-3166 Global Notifications Part 2
2025-03-05 16:44:40 +00:00
Dave Richer
059067bc61 IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-05 11:43:05 -05:00
Dave Richer
f8ae6dc5af IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-05 11:07:28 -05:00
Dave Richer
26f94c4d5b Merged in release/2024-03-14 (pull request #2146)
Release/2024 03 14
2025-03-04 22:56:23 +00:00
Dave Richer
ac2bb42124 Merged in feature/IO-3096-GlobalNotifications (pull request #2145)
Feature/IO-3096 GlobalNotifications
2025-03-04 22:55:58 +00:00
Dave Richer
b149f70b6f Merged in feature/IO-3166-Global-Notifications-Part-2 (pull request #2144)
Feature/IO-3166 Global Notifications Part 2
2025-03-04 22:55:26 +00:00
Dave Richer
ec8a413ed1 IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-04 17:54:57 -05:00
Dave Richer
76ec755d07 IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-04 17:50:58 -05:00
Dave Richer
07faa5eec2 IO-3166-Global-Notifications-Part-2 - Checkpoint 2025-03-04 17:07:31 -05:00
Patrick Fic
0810798d30 IO-3092 Remove compiler warnings. 2025-03-04 11:14:43 -08:00
Dave Richer
aa55f4840b Merged in release/2024-03-14 (pull request #2142)
Release/2024 03 14
2025-03-04 16:58:41 +00:00
Dave Richer
7bbbf5934a Merged in feature/IO-3096-GlobalNotifications (pull request #2143)
Feature/IO-3096 GlobalNotifications
2025-03-04 16:57:30 +00:00
Dave Richer
fd7850b551 IO-3096-GlobalNotifications: Self Watcher env var was not handled correctly 2025-03-04 11:56:46 -05:00
Dave Richer
2b76f8a12d IO-3096-GlobalNotifications: Package Updates to match test-AIO 2025-03-04 11:40:19 -05:00
Dave Richer
aa073cfd68 IO-3096-GlobalNotifications: Fixed a small typo in emailQueue 2025-03-04 11:38:21 -05:00
Dave Richer
2810428d19 test-AIO - Merge in GlobalNotifications branch 2025-03-04 11:35:12 -05:00
Dave Richer
03863ce838 Merged in feature/IO-3096-GlobalNotifications (pull request #2141)
Feature/IO-3096 GlobalNotifications
2025-03-04 16:21:54 +00:00
Dave Richer
1b22697429 feature/IO-3096-GlobalNotifications - Code Review Part 5 2025-03-04 11:21:21 -05:00
Dave Richer
4fc3fbdcc0 Merged in release/2025-02-28 (pull request #2140)
IO-2561 Return Items Modal
2025-03-04 16:18:49 +00:00
Dave Richer
163978930f feature/IO-3096-GlobalNotifications - Code Review Part 4 2025-03-03 23:29:47 -05:00
Dave Richer
c75e27e018 feature/IO-3096-GlobalNotifications - Code Review Part 3 2025-03-03 23:20:01 -05:00
Dave Richer
555bedbb6c feature/IO-3096-GlobalNotifications - Code Review Part 2 2025-03-03 23:11:03 -05:00
Dave Richer
a57abec81b feature/IO-3096-GlobalNotifications - Code Review Part 1 2025-03-03 22:14:33 -05:00
Dave Richer
b9df4c2587 feature/IO-3096-GlobalNotifications - Logging / Merge release 2025-03-03 14:36:18 -05:00
Dave Richer
15686bdab8 Merge remote-tracking branch 'origin/release/2025-02-28' into feature/IO-3096-GlobalNotifications 2025-03-03 14:35:52 -05:00
Dave Richer
175e2097fa feature/IO-3096-GlobalNotifications - Logging 2025-03-03 14:00:38 -05:00
Dave Richer
359c4c75a1 feature/IO-3096-GlobalNotifications - typo 2025-03-03 13:43:28 -05:00
Dave Richer
86aa5bf5e7 feature/IO-3096-GlobalNotifications - Checkpoint - Additional String Cleanup, loading spinner 2025-03-03 12:07:19 -05:00
Dave Richer
35b92570e5 feature/IO-3096-GlobalNotifications - Checkpoint - Splits are now in place 2025-03-03 11:41:10 -05:00
Dave Richer
b5c03b8cf0 feature/IO-3096-GlobalNotifications - Checkpoint - add some missing keys (cleanup) 2025-03-03 11:00:55 -05:00
Dave Richer
3c45519457 feature/IO-3096-GlobalNotifications - Checkpoint - merge master 2025-03-03 10:57:27 -05:00
Patrick Fic
dc60b8d18e Merged in feature/IO-3162-sentry-improvements (pull request #2138)
Feature/IO-3162 sentry improvements
2025-02-28 23:44:58 +00:00
Patrick Fic
83da64f96b Merged in feature/IO-3162-sentry-improvements (pull request #2137)
IO-3162 Resize test CI boxes.
2025-02-28 23:27:49 +00:00
Patrick Fic
ea75ac49aa IO-3162 Resize test CI boxes. 2025-02-28 15:25:03 -08:00
Patrick Fic
1f8d027f97 Merged in feature/IO-3162-sentry-improvements (pull request #2136)
feature/IO-3162-sentry-improvements

Approved-by: Patrick Fic
2025-02-28 23:19:23 +00:00
Patrick Fic
f3c6c7f004 IO-3162 Sentry cleanup. 2025-02-28 15:18:42 -08:00
Patrick Fic
65fb73ae82 IO-3162 Add Prod/Test restriction on sentry init. 2025-02-28 15:14:56 -08:00
Patrick Fic
2f8ba20a5b Merged in feature/IO-3162-sentry-improvements (pull request #2135)
feature/IO-3162-sentry-improvements

Approved-by: Patrick Fic
2025-02-28 23:04:41 +00:00
Patrick Fic
617e39eb17 IO-3162 Add CI paramters to aid in sourcemap generation. 2025-02-28 15:03:16 -08:00
Patrick Fic
b525f920e0 Merged in feature/IO-3162-sentry-improvements (pull request #2134)
feature/IO-3162-sentry-improvements
2025-02-28 22:49:41 +00:00
Dave Richer
f4a3b75a86 feature/IO-3096-GlobalNotifications - Checkpoint - Header finalized, scenarioParser now uses ENV var for FILTER_SELF from watchers. 2025-02-28 17:33:46 -05:00
Patrick Fic
c0ffda27cf IO-3162 Additional logging improvements. 2025-02-28 14:21:36 -08:00
Dave Richer
f51fa08961 feature/IO-3096-GlobalNotifications - Checkpoint - Header finalized, scenarioParser now uses ENV var for FILTER_SELF from watchers. 2025-02-28 17:17:13 -05:00
Patrick Fic
ba63e8054f IO-3162 Sentry package upgrades and refactors. 2025-02-28 12:15:47 -08:00
Dave Richer
91fe6745fe Merged in release/2025-02-28 (pull request #2133)
IO-2561 Return Items Modal
2025-02-28 17:37:25 +00:00
Allan Carr
32813032e6 Merged in feature/IO-2561-Return-Items-Modal (pull request #2131)
Feature/IO-2561 Return Items Modal

Approved-by: Dave Richer
2025-02-28 17:36:37 +00:00
Patrick Fic
b9073fe3f5 Merged in feature/IO-3092-imgproxy (pull request #2132)
IO-3092 Refactor exports.

Approved-by: Dave Richer
2025-02-28 17:35:07 +00:00
Patrick Fic
787366b231 IO-3092 Refactor exports. 2025-02-28 09:32:16 -08:00
Dave Richer
a5904f55aa feature/IO-3096-GlobalNotifications - styling checkpoint 2025-02-28 12:14:50 -05:00
Dave Richer
f6acc1107c feature/IO-3096-GlobalNotifications - add Dayjs, minor packages on backend 2025-02-28 12:05:40 -05:00
Dave Richer
9b871149ac feature/IO-3096-GlobalNotifications - add Dayjs, minor packages on backend 2025-02-28 11:13:08 -05:00
Allan Carr
9a71779cfe IO-2561 Return Items Modal
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-02-27 18:42:43 -08:00
Dave Richer
5bd6f0453d feature/IO-3096-GlobalNotifications -Read Status Sync accross all clients. 2025-02-27 20:28:41 -05:00
Dave Richer
f6328d10f7 feature/IO-3096-GlobalNotifications -Read Status Sync accross all clients. 2025-02-27 20:16:33 -05:00
Patrick Fic
2c95b49ae1 Merged in feature/IO-3092-imgproxy (pull request #2130)
Feature/IO-3092 imgproxy
2025-02-27 21:55:00 +00:00
Patrick Fic
ace0039429 IO-3092 Address PR concerns. 2025-02-27 13:54:16 -08:00
Patrick Fic
f13a70a22f IO-3092 Improve import name in routes. 2025-02-27 12:17:26 -08:00
Patrick Fic
fa29bd609f IO-3092 Additional comments, email compatibility. 2025-02-27 12:15:36 -08:00
Dave Richer
3766c3d938 feature/IO-3096-GlobalNotifications - Adjust the Global Placement for notificationContext.jsx, removed adjustments to said location and duration to socket 2025-02-27 13:30:18 -05:00
Dave Richer
01b18a4a02 feature/IO-3096-GlobalNotifications - Checkpoint - Clean up previous socket usages by funneling them all through useSocket vs useContext(SocketConext), package updates. 2025-02-27 11:56:31 -05:00
Patrick Fic
38681158c1 Merge branch 'master-AIO' into feature/IO-3092-imgproxy 2025-02-26 20:59:19 -08:00
Patrick Fic
25b289b65d IO-3092 add messaging support for imgproxy 2025-02-26 20:56:13 -08:00
Dave Richer
17c4e2fd0e Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3096-GlobalNotifications 2025-02-26 16:46:00 -05:00
Dave Richer
eb51085055 feature/IO-3096-GlobalNotifications - Checkpoint - Clicking the alert notification will also navigate you to the job. 2025-02-26 16:44:25 -05:00
Dave Richer
abd530b8b2 feature/IO-3096-GlobalNotifications - Checkpoint - clicking an individual notification will mark it read 2025-02-26 16:30:16 -05:00
Dave Richer
e4d437018d feature/IO-3096-GlobalNotifications - Checkpoint - clicking an individual notification will mark it read 2025-02-26 15:52:21 -05:00
Dave Richer
0767e290f4 feature/IO-3096-GlobalNotifications - Checkpoint - Fix user getting all bodyshop notifications (now by associationId), fix regression in 'Assigned To' scenario. 2025-02-26 13:11:49 -05:00
Dave Richer
b86309e74b feature/IO-3096-GlobalNotifications - Checkpoint 2025-02-25 20:18:59 -05:00
Dave Richer
7e2bd128e8 feature/IO-3096-GlobalNotifications - Checkpoint 2025-02-25 20:08:55 -05:00
Dave Richer
7f547c90c2 feature/IO-3096-GlobalNotifications - Checkpoint 2025-02-25 20:02:27 -05:00
Dave Richer
fa39e2b97e feature/IO-3096-GlobalNotifications - Checkpoint 2025-02-25 19:58:00 -05:00
Dave Richer
c5d00f7641 feature/IO-3096-GlobalNotifications - Checkpoint 2025-02-25 17:23:35 -05:00
Dave Richer
08b7f0e59c feature/IO-3096-GlobalNotifications - Checkpoint - In production, a user can not trigger their own scenario notification. 2025-02-25 15:46:11 -05:00
Patrick Fic
f0af12bc2c Merged in feature/IO-3152-opensearch-improvements (pull request #2129)
feature/IO-3152-opensearch-improvements

Approved-by: Patrick Fic
2025-02-25 19:28:03 +00:00
Patrick Fic
ace9ec792d IO-3152 Restrict searched indexes and remove wildcard search.
IO-3152 Resolve accidentally committed change.
2025-02-25 11:22:36 -08:00
Patrick Fic
66671385d0 IO-3092 resolve thumbnail fetching 2025-02-25 11:15:29 -08:00
Dave Richer
015f4cc5bd feature/IO-3096-GlobalNotifications - Checkpoint - Notification Center 2025-02-25 14:01:57 -05:00
Dave Richer
4f1c0b9996 feature/IO-3096-GlobalNotifications - Checkpoint - Notification Center 2025-02-24 18:04:15 -05:00
Dave Richer
b395839b37 feature/IO-3096-GlobalNotifications - Checkpoint - Notification Center 2025-02-24 16:02:55 -05:00
Dave Richer
0f067fc503 feature/IO-3096-GlobalNotifications - Checkpoint, Ratify notifications tb table. 2025-02-24 12:52:10 -05:00
Dave Richer
a5cf81bd28 feature/IO-3096-GlobalNotifications - Checkpoint, merge master, ready DB 2025-02-24 12:05:40 -05:00
Dave Richer
e892e4cab1 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3096-GlobalNotifications 2025-02-24 12:03:43 -05:00
Patrick Fic
5adb54f5cb Merge branch 'master-AIO' into feature/IO-3092-imgproxy 2025-02-21 13:03:37 -08:00
Patrick Fic
9bde06e110 Merged in release/2025-02-28 (pull request #2127)
Add catch error handling.

Approved-by: Dave Richer
2025-02-21 16:50:57 +00:00
Patrick Fic
ef4bb75ce7 Merged in release/2025-02-28 (pull request #2128)
Add catch error handling.

Approved-by: Patrick Fic
2025-02-21 00:44:05 +00:00
Patrick Fic
459af4f537 Add catch error handling. 2025-02-20 16:39:20 -08:00
Patrick Fic
30449ca113 Merged in release/2025-02-28 (pull request #2126)
Remove email from handler.

Approved-by: Patrick Fic
2025-02-21 00:38:01 +00:00
Patrick Fic
f860931eab Remove email from handler. 2025-02-20 16:35:47 -08:00
Patrick Fic
0405d19f98 Merged in release/2025-02-28 (pull request #2125)
release/2025-02-28

Approved-by: Patrick Fic
2025-02-20 23:46:37 +00:00
Patrick Fic
0bf9f932b7 Adjust handler logging. 2025-02-20 15:44:49 -08:00
Patrick Fic
2c5310403b Merged in release/2025-02-28 (pull request #2124)
release/2025-02-28

Approved-by: Patrick Fic
2025-02-20 23:38:06 +00:00
Dave Richer
a077cf0820 feature/IO-3096-GlobalNotifications - Package updates, prepare scenario builder for app notifications, redo header to have right aligned items. 2025-02-20 17:41:52 -05:00
Patrick Fic
c1abe98b89 Merged in release/2025-02-28 (pull request #2123)
release/2025-02-28

Approved-by: Patrick Fic
2025-02-20 22:37:55 +00:00
Patrick Fic
0f32e6ffc7 Add additional logging to OS Handler. 2025-02-20 14:37:25 -08:00
Dave Richer
eca7ff4a42 feature/IO-3096-GlobalNotifications - Clear stage, add notes 2025-02-20 15:25:34 -05:00
Dave Richer
7d6b95d344 feature/IO-3096-GlobalNotifications - Merge master 2025-02-20 14:10:01 -05:00
Dave Richer
9e44ee2a26 Merged in release/2025-02-28 (pull request #2122)
hotfix/IO-3148-Error-In-Email-Bounce-Route: Hot Fix for Broken Import
2025-02-20 19:04:25 +00:00
Dave Richer
5d0500582e Merged in hotfix/IO-3148-Error-In-Email-Bounce-Route (pull request #2121)
hotfix/IO-3148-Error-In-Email-Bounce-Route: Hot Fix for Broken Import
2025-02-20 19:03:52 +00:00
Dave Richer
f53fcc345e hotfix/IO-3148-Error-In-Email-Bounce-Route: Hot Fix for Broken Import 2025-02-20 14:01:11 -05:00
Dave Richer
1b7cb7c852 feature/IO-3096-GlobalNotifications - Checkpoint, fixed some email bugs in other files, consolidated the GetEndpoints on the backend, moved the consolidation delays for queues to ENV vars 2025-02-20 13:43:22 -05:00
Dave Richer
c82cfb3ec2 feature/IO-3096-GlobalNotifications - Checkpoint, fixed some email bugs in other files, consolidated the GetEndpoints on the backend, moved the consolidation delays for queues to ENV vars 2025-02-20 13:13:09 -05:00
Dave Richer
cc5fea9410 feature/IO-3096-GlobalNotifications - Checkpoint, finished testing queue, adjusted timeouts to be pegged to one variable. 2025-02-20 12:21:09 -05:00
Dave Richer
29f7144e72 feature/IO-3096-GlobalNotifications - Email Queue now batches per job per user 2025-02-19 16:10:53 -05:00
Dave Richer
1384616d66 feature/IO-3096-GlobalNotifications - Cleanup and Package bumps 2025-02-19 12:50:01 -05:00
Dave Richer
366f7b9c4a Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3096-GlobalNotifications 2025-02-19 10:42:34 -05:00
Dave Richer
67e904e121 Merged in release/2025-02-28 (pull request #2120)
feature/IO-3146-Hotfix-For-Email-Translations
2025-02-19 15:41:14 +00:00
Dave Richer
e2ef4f1caf Merged in release/2025-02-28 (pull request #2119)
feature/IO-3146-Hotfix-For-Email-Translations
2025-02-19 15:40:47 +00:00
Dave Richer
83ea51157d Merged in feature/IO-3146-Hotfix-For-Email-Translation (pull request #2118)
feature/IO-3146-Hotfix-For-Email-Translations
2025-02-19 15:40:05 +00:00
Dave Richer
9f207f0946 feature/IO-3146-Hotfix-For-Email-Translations 2025-02-19 10:38:32 -05:00
Dave Richer
2a81517104 feature/IO-3096-GlobalNotifications - Checkpoint, App Queue 2025-02-18 17:37:24 -05:00
Dave Richer
00005c881e feature/IO-3096-GlobalNotifications - Checkpoint, App Queue 2025-02-18 14:29:07 -05:00
Dave Richer
c1ea8e8a3d feature/IO-3096-GlobalNotifications - Checkpoint, App Queue 2025-02-18 13:38:57 -05:00
Dave Richer
adb15a4748 feature/IO-3096-GlobalNotifications - Checkpoint, Builders 2025-02-18 12:57:54 -05:00
Dave Richer
c214ed1dfb feature/IO-3096-GlobalNotifications - Checkpoint, Builders 2025-02-18 12:05:35 -05:00
Dave Richer
c02c36c548 feature/IO-3096-GlobalNotifications - Checkpoint, socket to email to bodyshop mapping. 2025-02-18 11:02:46 -05:00
Dave Richer
a15f86cc4e Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3096-GlobalNotifications 2025-02-18 09:52:35 -05:00
Dave Richer
8a88a241d6 Merged in release/2025-02-14 (pull request #2117)
Release/2025-02-14 - IO-3127 IO-3128 IO-3077 IO-3131 IO-3139 IO-3140
2025-02-16 01:20:59 +00:00
Dave Richer
df13f257db feature/IO-3096-GlobalNotifications - Checkpoint, BULLMQ! 2025-02-13 16:19:36 -05:00
Allan Carr
b32a2d4d86 Merged in release/2025-02-14 (pull request #2116)
Release/2025 02 14

Approved-by: Dave Richer
2025-02-13 17:38:26 +00:00
Dave Richer
5cfadf7929 feature/IO-3096-GlobalNotifications - Merge release / Add PropTypes 2025-02-13 11:15:16 -05:00
Dave Richer
4a46870327 Merge remote-tracking branch 'origin/release/2025-02-14' into feature/IO-3096-GlobalNotifications 2025-02-13 11:14:20 -05:00
Allan Carr
4684bada1e Merged in feature/IO-3140-Job-Close-Print-Center (pull request #2115)
IO-3140 Job Close Print Center

Approved-by: Dave Richer
2025-02-13 01:05:17 +00:00
Allan Carr
163354f4b4 IO-3140 Job Close Print Center
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-02-12 16:19:17 -08:00
Dave Richer
3d225c9f92 Merge remote-tracking branch 'origin/release/2025-02-14' into feature/IO-3096-GlobalNotifications 2025-02-12 15:21:29 -05:00
Dave Richer
f3b2edea1c Merged in feature/IO-3139-Header-Deprecation-Bug (pull request #2114)
feature/IO-3139-Header-Deprecation-Bug - Quick fix for header deprecation.
2025-02-12 20:21:12 +00:00
Dave Richer
01e103fd0e feature/IO-3139-Header-Deprecation-Bug - Quick fix for header deprecation. 2025-02-12 15:20:17 -05:00
Dave Richer
1fc21e49a0 feature/IO-3096-GlobalNotifications - Merge 2025-02-14 branch and resolve conflicts 2025-02-12 14:46:58 -05:00
Dave Richer
19d608e2b0 feature/IO-3096-GlobalNotifications - Checkpoint/Refactor cleanup 2025-02-12 14:44:24 -05:00
Dave Richer
7c92484ae0 Merged in release/2025-02-14 (pull request #2113)
Release/2025-02-14 into test-AIO - IO-3127 IO-3128 IO-3077 IO-3131
2025-02-12 19:07:08 +00:00
Dave Richer
4b184d1d42 Merged in hotfix/IO-3128-Unread-Messages-Not-Updating (pull request #2112)
hotfix/IO-3128-Unread-Messages-Not-Updating - Initial fix just to make sure clients see messages, will poll and update every 60 seconds if the chat window is closed and has never been opened.
2025-02-12 19:06:13 +00:00
Dave Richer
3f75041ad9 feature/IO-3096-GlobalNotifications - Checkpoint 2025-02-12 11:57:50 -05:00
Patrick Fic
09973ecb3b Merge branch 'release/2025-02-14' into feature/IO-2776-cdk-fortellis 2025-02-12 08:18:27 -08:00
Patrick Fic
8c541dad05 Merge branch 'release/2025-02-14' of bitbucket.org:snaptsoft/bodyshop into release/2025-02-14 2025-02-12 07:42:20 -08:00
Patrick Fic
921cca86c1 Remove patrick from support emails. 2025-02-12 07:41:52 -08:00
Allan Carr
841312ebcd Merged in feature/IO-3131-Crisp-Segment-for-BASIC (pull request #2111)
IO-3131 Crisp Segment for Basic

Approved-by: Dave Richer
2025-02-12 14:55:08 +00:00
Allan Carr
5ed00eaffe IO-3131 Crisp Segment for Basic
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-02-11 20:26:44 -08:00
Dave Richer
994ea8bb20 feature/IO-3096-GlobalNotifications - Checkpoint 2025-02-11 17:13:40 -05:00
Dave Richer
580641bae6 feature/IO-3096-GlobalNotifications - Checkpoint 2025-02-11 15:07:42 -05:00
Patrick Fic
024b4fe21b Merged in feature/IO-3077-import-rules-engine (pull request #2110)
Feature/IO-3077 import rules engine
2025-02-11 18:52:08 +00:00
Patrick Fic
40aca91c76 IO-3077 Move parts scan order to correctly update totals. 2025-02-11 10:51:26 -08:00
Dave Richer
72305f91d8 feature/IO-3096-GlobalNotifications - Checkpoint 2025-02-11 13:38:15 -05:00
Dave Richer
abe4f4fb3d feature/IO-3077-import-rules-engine - Fix Translations 2025-02-11 12:34:28 -05:00
Dave Richer
142617bc3d feature/IO-3096-GlobalNotifications - Check-point 2025-02-11 12:33:13 -05:00
Dave Richer
2ee582bfa2 feature/IO-3096-GlobalNotifications - Check-point 2025-02-11 10:40:57 -05:00
Patrick Fic
35a3726cf0 IO-3077 Implement import rules engine. 2025-02-10 14:24:50 -08:00
Dave Richer
54820fe3c8 feature/IO-3096-GlobalNotifications - Check-point 2025-02-10 17:15:53 -05:00
Dave Richer
b1ffbe0e12 feature/IO-3096-GlobalNotifications - Check-point 2025-02-10 15:19:41 -05:00
Dave Richer
ba2d03176f feature/IO-3096-GlobalNotifications - Check-point 2025-02-10 11:24:20 -05:00
Patrick Fic
95a592fb9a Merged in feature/IO-3127-Dashboard-Schedule-Translations (pull request #2106)
IO-3127 Dashboard Schedule Translations

Approved-by: Dave Richer
2025-02-10 14:44:02 +00:00
Patrick Fic
b069b6bc4c IO-3092 Implement delete, move and download on image proxy. Add imgproxy based components. 2025-02-07 13:33:22 -08:00
Patrick Fic
fbb473941c IO-3092 implement backwards compatibility for Cloudinary documents. 2025-02-06 14:37:16 -08:00
Dave Richer
6d343e9b7f feature/IO-3096-GlobalNotifications - Watchers - Third version, final. 2025-02-06 17:35:12 -05:00
Dave Richer
c27b1d802f feature/IO-3096-GlobalNotifications - Watchers - Second Version 2025-02-06 16:57:55 -05:00
Dave Richer
f11d9dd804 feature/IO-3096-GlobalNotifications - Watchers - First revision. 2025-02-06 15:03:07 -05:00
Dave Richer
996f5b3c71 feature/IO-3096-GlobalNotifications - Global Notification Settings on profile page 2025-02-06 13:38:15 -05:00
Dave Richer
9bb7f647a7 feature/IO-3096-GlobalNotifications - Global Notification Settings on profile page 2025-02-06 13:36:19 -05:00
Dave Richer
760f2ac7f9 hotfix/IO-3128-Unread-Messages-Not-Updating - Initial fix just to make sure clients see messages, will poll and update every 60 seconds if the chat window is closed and has never been opened. 2025-02-06 12:49:51 -05:00
Patrick Fic
4d2d9500ff Merge branch 'master-AIO' into feature/IO-3092-imgproxy 2025-02-06 08:43:20 -08:00
Allan Carr
67cada5d8e Merged in hotfix/2025-02-06 (pull request #2109)
Hotfix/2025 02 06
2025-02-06 16:34:52 +00:00
Allan Carr
872e36a61a Merged in hotfix/2025-02-06 (pull request #2108)
IO-3121 Adjust Footer
2025-02-06 16:33:52 +00:00
Allan Carr
779f608506 Merged in feature/IO-3121-Generic-Report-Header (pull request #2107)
IO-3121 Adjust Footer
2025-02-06 16:32:50 +00:00
Allan Carr
d9f562faa4 IO-3121 Adjust Footer
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-02-06 08:32:52 -08:00
Patrick Fic
14e362ec3f Merged in release/2025-01-31 (pull request #2105)
Release/2025 01 31 - IO-1582, IO-2676, IO-2681, IO-2825, IO-2952, IO-2970, IO-3074, IO-3075, IO-3076, IO-3096, IO-3101, IO-3103, IO-3114, IO-3115, IO-3116, IO-3121, IO-3123
2025-02-06 04:01:53 +00:00
Patrick Fic
c213e13624 Resolve CI issues. 2025-02-05 20:00:48 -08:00
Patrick Fic
dae7642a8c Merged in release/2025-01-31 (pull request #2104)
Release/2025 01 31 - IO-1582, IO-2676, IO-2681, IO-2825, IO-2952, IO-2970, IO-3074, IO-3075, IO-3076, IO-3096, IO-3101, IO-3103, IO-3114, IO-3115, IO-3116, IO-3121, IO-3123
2025-02-06 03:56:56 +00:00
Allan Carr
c751f0cba4 IO-3127 Dashboard Schedule Translations
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-02-05 15:10:18 -08:00
Patrick Fic
47fe1959b1 IO-3092 WIP on img proxy thumbnail generation. 2025-02-05 11:03:29 -08:00
Allan Carr
e128c108f8 Merged in feature/IO-3121-Generic-Report-Header (pull request #2102)
IO-3121 Generic Report Header

Approved-by: Dave Richer
2025-02-05 15:18:45 +00:00
Allan Carr
b8b76cb96c IO-3121 Generic Report Header
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-02-04 18:11:48 -08:00
Allan Carr
fa958cbbfe IO-3121 Generic Report Header
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-02-04 17:42:40 -08:00
Patrick Fic
e8ee2a9416 Merge branch 'release/2025-01-31' into feature/IO-3092-imgproxy 2025-02-04 15:14:08 -08:00
Dave Richer
4bf68b637f Merged in release/2025-01-31 (pull request #2101)
release/2025-01-31 - fix teams icon
2025-02-04 18:48:35 +00:00
Dave Richer
2146672916 release/2025-01-31 - fix teams icon 2025-02-04 13:47:58 -05:00
Dave Richer
b40c433865 Merged in release/2025-01-31 (pull request #2100)
Release/2025 01 31 into test-AIO - IO-3096 IO-2825 IO-3123
2025-02-04 18:04:45 +00:00
Dave Richer
f96460f332 Merged in feature/IO-2825-Node-22-Update (pull request #2092)
[DO NOT MERGE] Feature/IO-2825 Node 22 Update

Approved-by: Patrick Fic
2025-02-04 17:54:06 +00:00
Dave Richer
04c70876d0 Merged release/2025-01-31 into feature/IO-2825-Node-22-Update 2025-02-04 17:53:52 +00:00
Dave Richer
bc6a94eede Merged in feature/IO-3123-Code-Review-Adjustments (pull request #2099)
feature/IO-3123-Code-Review-Adjustments: Make Code review adjustments
2025-02-04 17:53:36 +00:00
Dave Richer
f288b0ee22 feature/IO-3123-Code-Review-Adjustments: Make Code review adjustments 2025-02-04 12:28:22 -05:00
Patrick Fic
e54692928b Merged in feature/IO-3076-report-trigger (pull request #2098)
IO-3076 Add cron trigger for RO usage report.

Approved-by: Patrick Fic
2025-02-04 16:28:55 +00:00
Patrick Fic
0fd8bcb1b1 IO-3076 Add cron trigger for RO usage report. 2025-02-04 08:28:06 -08:00
Dave Richer
07b18836f5 feature/IO-2825-Node-22-Update: Fix Header styling 2025-02-03 16:11:14 -05:00
Dave Richer
ff08d19d79 Merged release/2025-01-31 into feature/IO-2825-Node-22-Update 2025-02-03 16:46:01 +00:00
Dave Richer
55ed499ab5 Merged in release/2025-01-31 (pull request #2095)
Release/2025 01 31
2025-01-31 18:25:32 +00:00
Dave Richer
bd6f300c8d Merged in feature/IO-2970-Production-Board-Unassigned-Filter (pull request #2096)
feature/IO-2970-Production-Board-Unassigned-Filter - Implementation
2025-01-31 18:24:50 +00:00
Dave Richer
ac2fbaf6f7 feature/IO-2970-Production-Board-Unassigned-Filter - Implementation 2025-01-31 13:23:36 -05:00
Allan Carr
f409acc7fd Merged in feature/IO-3116-Production-Flag-Translation (pull request #2093)
IO-3116 Production Flag Translation

Approved-by: Dave Richer
2025-01-31 15:59:15 +00:00
Allan Carr
06dcb20b2b Merged in feature/IO-3074-Mark-as-PST-Exempt-Job-Create (pull request #2094)
IO-3074 Mark as PST Exempt in Manaul Job Creation

Approved-by: Dave Richer
2025-01-31 15:58:42 +00:00
Allan Carr
f4fed0db9d IO-3074 Mark as PST Exempt in Manaul Job Creation
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-30 15:25:39 -08:00
Allan Carr
8430f500ef IO-3116 Production Flag Translation
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-30 14:30:47 -08:00
Dave Richer
68584243f4 Merge remote-tracking branch 'origin/release/2025-01-31' into feature/IO-2825-Node-22-Update 2025-01-30 15:37:37 -05:00
Dave Richer
c8f5c3ed9e release/2025-01-31 - Fix unused import 2025-01-30 15:36:47 -05:00
Dave Richer
994d7e17aa feature/IO-2825-Node-22-Update - Package Updates 2025-01-30 15:36:05 -05:00
Dave Richer
fd1dd6dddd Merge remote-tracking branch 'origin/release/2025-01-31' into feature/IO-2825-Node-22-Update 2025-01-30 15:32:31 -05:00
Dave Richer
1e9b82ba1e feature/IO-2825-Node-22-Update - Merge release 2025-01-30 15:32:11 -05:00
Dave Richer
353bc3bc05 Merged in release/2025-01-31 (pull request #2091)
Release/2025 01 31 into test-AIO - IO-2681
2025-01-30 20:18:08 +00:00
Dave Richer
312795618e Merged in feature/IO-2681-Share-To-Teams-Button (pull request #2090)
Feature/IO-2681 Share To Teams Button
2025-01-30 20:17:24 +00:00
Dave Richer
35b5645d6f feature/IO-2681-Share-To-Teams-Button - Missing translation 2025-01-30 15:16:56 -05:00
Dave Richer
a49d845f50 feature/IO-2681-Share-To-Teams-Button - Merge release 2025-01-30 15:13:48 -05:00
Dave Richer
9d44540ca8 feature/IO-2681-Share-To-Teams-Button - Final revisions. 2025-01-30 15:06:52 -05:00
Dave Richer
df5c96345c Merged in release/2025-01-31 (pull request #2089)
Release/2025 01 31
2025-01-30 17:12:44 +00:00
Allan Carr
cc95d3bd44 Merged in feature/IO-3115-Print-Center-on-Job-Close (pull request #2088)
IO-3115 Print Center on Job Close

Approved-by: Dave Richer
2025-01-30 17:12:11 +00:00
Allan Carr
648c47cde2 IO-3115 Change Icon to internal button prop
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-30 09:12:58 -08:00
Allan Carr
17cf6e7696 Merged in feature/IO-1582-Temp-Docs-to-Exported-Files (pull request #2087)
IO-1582 Temp Docs to Exported/Invoiced Files

Approved-by: Dave Richer
2025-01-30 16:42:54 +00:00
Allan Carr
7326ffbae6 Merged in feature/IO-3114-Quick-Intake (pull request #2086)
Feature/IO-3114 Quick Intake

Approved-by: Dave Richer
2025-01-30 16:42:36 +00:00
Allan Carr
b2f73c4fba IO-3115 Print Center on Job Close
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-29 16:55:31 -08:00
Allan Carr
6628d43e12 IO-1582 Temp Docs to Exported/Invoiced Files
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-29 15:43:38 -08:00
Allan Carr
596132b2af Merge branch 'release/2025-01-31' into feature/IO-3114-Quick-Intake
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>

# Conflicts:
#	client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx
#	client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.toggle-production.jsx
2025-01-29 15:24:47 -08:00
Dave Richer
a064b8e07e feature/IO-2681-Share-To-Teams-Button - checkpoint 2025-01-29 18:19:34 -05:00
Allan Carr
a55102b0ae IO-3114 Quick Intake
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-29 15:16:20 -08:00
Allan Carr
9b75993ac1 IO-3114 Quick Intake
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-29 15:14:03 -08:00
Allan Carr
d5e750c1f0 IO-3114 Quick Intake Data
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-29 15:12:20 -08:00
Allan Carr
8801990d4a Merged in feature/IO-3075-Crisp-in-ROME (pull request #2085)
IO-3075 Crisp in Rome Online

Approved-by: Dave Richer
2025-01-29 21:39:21 +00:00
Allan Carr
e8cda88a33 IO-3075 Crisp in Rome Online
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-28 16:17:11 -08:00
Dave Richer
2c7c187c45 Merged in release/2025-01-31 (pull request #2084)
Release/2025 01 31 into test-AIO - IO-3108 IO-2676
2025-01-27 18:11:07 +00:00
Allan Carr
a240391a28 Merged in feature/IO-2676-Target-Date-to-Schedule-Completion-Translation (pull request #2083)
IO-2676 Target Date to Schedule Completion Translation Adjustment

Approved-by: Dave Richer
2025-01-27 18:10:17 +00:00
Dave Richer
42660a7dd1 release/2025-01-31 - Add ID to tasks upsert modal title 2025-01-27 11:05:42 -05:00
Allan Carr
f186d9f8be IO-2676 Target Date to Schedule Completion Translation Adjustment
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-24 14:07:09 -08:00
Allan Carr
71a74c5437 Merged in hotfix/2025-01-23 (pull request #2082)
Hotfix/2025 01 23
2025-01-23 23:21:28 +00:00
Allan Carr
6fe4d982f5 Merged in feature/IO-3108-Job-Totals-USA-PASL (pull request #2081)
Feature/IO-3108 Job Totals USA PASL
2025-01-23 23:20:44 +00:00
Allan Carr
5ec032d8d6 IO-3108 Remove Console Log
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-23 15:21:10 -08:00
Allan Carr
3f58f9a5f5 Merged in feature/IO-3108-Job-Totals-USA-PASL (pull request #2080)
Feature/IO-3108 Job Totals USA PASL
2025-01-23 23:20:17 +00:00
Allan Carr
2718a66fb0 IO-3108 Adjust Initial Values/FieldValues
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-23 15:19:33 -08:00
Allan Carr
4c737371e3 IO-3108 Adjust Initial Values
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-23 14:49:51 -08:00
Dave Richer
ee7a3d0bdf Merged in hotfix/2025-01-23 (pull request #2079)
Hotfix/2025 01 23
2025-01-23 21:01:43 +00:00
Allan Carr
181af581e5 Merged in feature/IO-3108-Job-Totals-USA-PASL (pull request #2078)
IO-3108 Job Totals USA PASL

Approved-by: Dave Richer
2025-01-23 21:00:43 +00:00
Dave Richer
85fcd64220 release/2025-01-31 - Manual Merge conflict done 2025-01-23 13:00:13 -08:00
Dave Richer
11e2f5d83d feature/IO-3108-Job-Totals-USA-PASL - Fix submit button for Product Fruits reasons, to go into hotfix 2025-01-23 12:57:10 -08:00
Allan Carr
cbc723fa38 IO-3108 Job Totals USA PASL
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-23 12:05:35 -08:00
Patrick Fic
9efaa55235 IO-3092 basic URL signing and image/pdf/video thumb generation. 2025-01-22 15:52:41 -08:00
Dave Richer
da41668b3f feature/IO-3096-Notification-Preferences - Update Circle CI to Node 22 2025-01-22 10:56:53 -08:00
Dave Richer
df008abec9 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3096-Global-Notification-Preferences 2025-01-22 10:53:42 -08:00
Dave Richer
3a5a78d60a Merged in release/2025-01-31 (pull request #2076)
feature/IO-3103-Ant5-Notifications - Job Icons fixed (spacing)
2025-01-22 18:48:25 +00:00
Dave Richer
8a97c5109f Merged in feature/IO-3103-Ant5-Notifications (pull request #2075)
feature/IO-3103-Ant5-Notifications - Job Icons fixed (spacing)
2025-01-22 18:48:12 +00:00
Dave Richer
d767302c4a feature/IO-3103-Ant5-Notifications - Job Icons fixed (spacing) 2025-01-22 10:47:44 -08:00
Dave Richer
6dd2871c07 Merged in release/2025-01-31 (pull request #2074)
Release/2025 01 31 into test-AIO -  IO-2952, IO-3099, IO-3101, IO-3103
2025-01-22 18:11:57 +00:00
Dave Richer
2fdb06fabe Merged in feature/IO-3103-Ant5-Notifications (pull request #2071)
feature/IO-3103-Ant5-Notifications
2025-01-22 18:11:05 +00:00
Dave Richer
32bb04939f feature/IO-3103-Ant5-Notifications - Bill Lines Fix 2025-01-22 09:59:57 -08:00
Dave Richer
9cddc9cce0 feature/IO-3103-Ant5-Notifications - Bill Lines Fix 2025-01-22 09:30:27 -08:00
Allan Carr
95c310119f Merged in hotfix/2025-01-22 (pull request #2073)
IO-3099 check for intellipay initialization before calling. rename files to remove erroneous period.
2025-01-22 16:52:28 +00:00
Allan Carr
ebe1facbd1 Merged in feature/IO-3099-wait-for-intellipay (pull request #2072)
IO-3099 check for intellipay initialization before calling. rename files to remove erroneous period.
2025-01-22 16:50:08 +00:00
Dave Richer
ed023cd62a feature/IO-3103-Ant5-Notifications - Missing Deps on UseDep 2025-01-21 18:19:32 -08:00
Dave Richer
b1ca423a59 feature/IO-3103-Ant5-Notifications - Missing Dep on UseDep 2025-01-21 18:16:20 -08:00
Dave Richer
85d25862eb feature/IO-3103-Ant5-Notifications 2025-01-21 17:20:46 -08:00
Allan Carr
b8c56c5c24 Merged in feature/IO-2952-RBAC-Defaults (pull request #2070)
IO-2952 RBAC Defaults

Approved-by: Dave Richer
2025-01-20 23:26:23 +00:00
Patrick Fic
276771a8b7 Merged in feature/IO-3099-wait-for-intellipay (pull request #2069)
IO-3099 check for intellipay initialization before calling. rename files to remove erroneous period.

Approved-by: Dave Richer
2025-01-20 23:25:53 +00:00
Allan Carr
b2239351f6 IO-2952 RBAC Defaults
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-20 15:11:13 -08:00
Patrick Fic
b021992552 IO-3099 check for intellipay initialization before calling. rename files to remove erroneous period. 2025-01-20 12:16:24 -08:00
Patrick Fic
f5be07d028 Merged in feature/IO-3101-default-notification-hasura (pull request #2068)
IO-3101 Update default value for notification settings.

Approved-by: Patrick Fic
2025-01-20 17:50:38 +00:00
Patrick Fic
1202b86529 IO-3101 Update default value for notification settings. 2025-01-20 09:45:42 -08:00
Dave Richer
29c99f2dd9 feature/IO-3096-Global-Notification-Preferences - Upgrade Node to 22 / Remove canvas and replace it 100% with canvas-skia 2025-01-20 09:02:55 -08:00
Dave Richer
3033e84f45 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-3096-Global-Notification-Preferences 2025-01-20 08:33:31 -08:00
Dave Richer
0e218abbf4 Merged in release/2025-01-17 (pull request #2067)
Release/2025 01 17 into master-AIO - IO-999 IO-1927 IO-2951 IO-3022 IO-3060 IO-3063 IO-3065 IO-3076 IO-3078 IO-3080 IO-3082 IO-3083 IO-3094 IO-3096
2025-01-18 04:04:26 +00:00
Dave Richer
0cf7961d7d Merged in hotfix/AdditionalProductFruitIds (pull request #2066)
hotfix/AdditionalProductFruitsIds - Add additional IDs for product fruits
2025-01-17 18:15:56 +00:00
Dave Richer
ef36ab9da0 Merged in release/2025-01-17 (pull request #2065)
hotfix/AdditionalProductFruitsIds - Add additional IDs for product fruits
2025-01-17 18:14:49 +00:00
Dave Richer
ca02937461 Merged in hotfix/AdditionalProductFruitIds (pull request #2064)
hotfix/AdditionalProductFruitsIds - Add additional IDs for product fruits
2025-01-17 18:14:26 +00:00
Dave Richer
fa7e0a107b hotfix/AdditionalProductFruitsIds - Add additional IDs for product fruits 2025-01-17 10:13:41 -08:00
Dave Richer
a917f6bcdf Merged in release/2025-01-17 (pull request #2063)
Release/2025 01 17 into test-AIO - IO-2951 IO-999 IO-3096
2025-01-17 17:54:01 +00:00
Allan Carr
9ccffd73ba Merged in feature/IO-999-Part-Tax-rate-Label (pull request #2062)
IO-999 Part Tax Rate Label

Approved-by: Dave Richer
2025-01-17 17:53:05 +00:00
Dave Richer
f68ad181e4 feature/IO-999-Part-Tax-rate-Label 2025-01-17 09:52:35 -08:00
Dave Richer
23bd6085a8 feature/IO-3096-Global-Notifications-Preferences
-  Package Updates
2025-01-17 09:51:55 -08:00
Dave Richer
18966476e4 feature/IO-3096-Global-Notifications-Preferences
-  Package Updates
2025-01-17 09:26:30 -08:00
Allan Carr
e4325e39bf Merged in feature/IO-2951-Ro-Guard-Labor-Warning (pull request #2061)
IO-2951 RO Guard Labor Warning

Approved-by: Dave Richer
2025-01-17 15:32:51 +00:00
Allan Carr
584c2e5de2 IO-999 Part Tax Rate Label
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-16 18:39:41 -08:00
Allan Carr
eccc992cfa IO-2951 RO Guard Labor Warning
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-16 18:28:54 -08:00
Dave Richer
c5d6457146 Merged in release/2025-01-17 (pull request #2060)
IO-3063 LOU on Schedule PopOver
2025-01-16 15:24:29 +00:00
Allan Carr
f293e80d0d Merged in feature/IO-3063-LOU-on-Schedule-PopOver (pull request #2059)
IO-3063 LOU on Schedule PopOver

Approved-by: Dave Richer
2025-01-16 15:23:59 +00:00
Allan Carr
eea2a758b0 IO-3063 LOU on Schedule PopOver
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-15 17:14:08 -08:00
Dave Richer
f3831e934f Merged in release/2025-01-17 (pull request #2058)
Release/2025 01 17
2025-01-15 15:50:58 +00:00
Allan Carr
8d7d4ab4ac Merged in feature/IO-3083-i18-Translation-Shop-Info-Warning (pull request #2044)
IO-3083 i18 Translation Warning in Shop Info

Approved-by: Dave Richer
2025-01-15 15:49:37 +00:00
Dave Richer
f9105806ba feature/IO-3083-i18-Translation-Shop-Info-Warning
resolve conflicts
2025-01-15 07:49:19 -08:00
Dave Richer
acd278f5b4 Merged in release/2025-01-17 (pull request #2057)
Release/2025 01 17 IO-3065, IO-3076, IO-3094
2025-01-15 15:40:44 +00:00
Allan Carr
a4a6fac224 Merged in feature/IO-3094-Purchases-by-Date-Excel (pull request #2056)
IO-3094 Purchases by Date - Excel Report

Approved-by: Dave Richer
2025-01-15 15:39:12 +00:00
Patrick Fic
b2b7064007 Merged in feature/IO-3065-0-dollar-parts-status (pull request #2055)
feature/IO-3065-0-dollar-parts-status

Approved-by: Dave Richer
2025-01-15 15:38:42 +00:00
Allan Carr
4a56fbb135 IO-3094 Purchases by Date - Excel Report
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-14 18:00:46 -08:00
Allan Carr
e1fcb0ecba IO-3083 Merge Conflit Resolution
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-14 17:54:12 -08:00
Allan Carr
ee5e091118 Merge branch 'release/2025-01-17' into feature/IO-3083-i18-Translation-Shop-Info-Warning
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>

# Conflicts:
#	client/src/translations/en_us/common.json
2025-01-14 17:48:10 -08:00
Patrick Fic
9f46f8ec31 IO-3065 All manual toggle to include $0 line in part status count. 2025-01-14 13:49:38 -08:00
Patrick Fic
8c737ff0ae Merged in feature/IO-3076-daily-usage-reports (pull request #2054)
feature/IO-3076-daily-usage-reports

Approved-by: Patrick Fic
2025-01-14 21:14:13 +00:00
Patrick Fic
a8ef681cf1 IO-3076 Adjust daily usage report window. 2025-01-14 13:13:09 -08:00
Dave Richer
494c8b6867 Merged in release/2025-01-17 (pull request #2053)
Release/2025 01 17 into test-AIO - IO-1927, IO-3022, IO-3060, IO-3078, IO-3080, IO-3082
2025-01-14 17:02:26 +00:00
Dave Richer
262b5600d8 Merged in feature/IO-3060-Realtime-Notification-System (pull request #2052)
feature/IO-3060-Realtime-Notifications- Checkpoint
2025-01-14 17:01:20 +00:00
Dave Richer
a06d3c9365 feature/IO-3060-Realtime-Notifications- Checkpoint 2025-01-14 09:00:04 -08:00
Allan Carr
1861bd68d1 Merged in feature/IO-3080-Restrict-Claimable-Hours-Label (pull request #2042)
IO-3080 Restrict Claimable Hours Label

Approved-by: Dave Richer
2025-01-14 14:43:12 +00:00
Allan Carr
348561c812 Merged in feature/IO-3078-Job-Presets-Company-Setup-Markup-Rule (pull request #2043)
IO-3078 Jobs Presets Company Setup Markup Discount

Approved-by: Dave Richer
2025-01-14 14:42:59 +00:00
Allan Carr
bf4a52b3c1 Merged in feature/IO-3022-Export-Payments-Payment-Methods (pull request #2045)
IO-3022 Export Payments - Payment Method

Approved-by: Dave Richer
2025-01-14 14:42:34 +00:00
Allan Carr
1950023f37 Merged in feature/IO-3082-Additional-IO-Basic-Lock-Out-Reports (pull request #2041)
IO-3082 Additional IO Basic Lock Out Reports

Approved-by: Dave Richer
2025-01-14 14:42:17 +00:00
Allan Carr
a2798a02b3 Merged in feature/IO-1927-Mark-Exported-Primary (pull request #2046)
IO-1927 Export Button as Primary

Approved-by: Dave Richer
2025-01-14 14:41:54 +00:00
Dave Richer
5fcb5a3a3e Merged in release/2025-01-17 (pull request #2051)
Release/2025 01 17
2025-01-14 01:44:03 +00:00
Dave Richer
ba41b29538 Merged in feature/IO-3060-Realtime-Notification-System (pull request #2050)
Feature/IO-3060 Realtime Notification System
2025-01-14 01:42:46 +00:00
Dave Richer
8a0916a47f feature/IO-3060-Realtime-Notifications- Checkpoint 2025-01-13 07:27:10 -08:00
Patrick Fic
d187ed6f73 Merged in release/2025-01-10 (pull request #2049)
Release/2025 01 10
2025-01-10 22:03:04 +00:00
Patrick Fic
13a57406d9 Merged in release/2025-01-10 (pull request #2048)
Release/2025 01 10
2025-01-10 20:06:28 +00:00
Dave Richer
3bc6504ae6 feature/IO-3060-Realtime-Notifications-Progress Update 2025-01-10 09:33:47 -08:00
Allan Carr
c7f293ceca IO-1927 Export Button as Primary
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-09 19:28:28 -08:00
Allan Carr
66e60e96ad IO-3022 Export Payments - Payment Method
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-09 19:16:45 -08:00
Allan Carr
54a9beb37f IO-3083 i18 Translation Warning in Shop Info
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-09 19:00:23 -08:00
Allan Carr
779cc7d9e8 IO-3078 Jobs Presets Company Setup Markup Discount
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-09 18:57:21 -08:00
Allan Carr
c1b3df9c3b IO-3080 Restrict Claimable Hours Label
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-09 17:43:43 -08:00
Allan Carr
80379cdd79 IO-3082 Additional IO Basic Lock Out Reports
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2025-01-09 17:37:30 -08:00
Dave Richer
e2e5f3f885 feature/IO-3060-Realtime-Notifications-System
- Add handlers for Job and Bill Change / Register Routers
- Add Tables / Modify Tables / Add permissions.
2025-01-09 13:28:56 -08:00
Patrick Fic
91c3ac56fa Merged in release/2025-01-10 (pull request #2039)
Release/2025 01 10
2025-01-08 18:39:00 +00:00
Patrick Fic
7d21cb7d70 Merged in feature/IO-3067-implement-learn-more-link-for-rome-upsells (pull request #2037)
Revert "IO-3067 Add learn more link for Rome."
2025-01-07 18:24:52 +00:00
Patrick Fic
db9e86e4c8 Succesful header creation. 2024-08-15 12:37:05 -07:00
Patrick Fic
85c446bc57 Refactor testing js file and made more modular. 2024-08-15 10:17:11 -07:00
Patrick Fic
5cf6f47bdc Merge remote-tracking branch 'origin/master-AIO' into feature/AIO/IO-2776-cdk-fortellis 2024-08-14 08:18:49 -07:00
Patrick Fic
1db4cbeeb8 Fortellis WIP 2024-05-22 08:18:10 -07:00
Patrick Fic
c88bf4065e Fortellis WIP 2024-05-14 08:15:40 -07:00
1254 changed files with 79436 additions and 43766 deletions

View File

@@ -9,13 +9,13 @@ orbs:
jobs:
imex-api-deploy:
docker:
- image: cimg/node:18.18.2
- image: cimg/node:22.13.1
steps:
- checkout
- eb/setup
- run:
command: |
eb init imex-online-production-api -r ca-central-1 -p "Node.js 18 running on 64bit Amazon Linux 2"
eb init imex-online-production-api -r ca-central-1 -p "Node.js 22 running on 64bit Amazon Linux 2023"
eb status --verbose
eb deploy
eb status
@@ -28,7 +28,7 @@ jobs:
imex-hasura-migrate:
docker:
- image: cimg/node:18.18.2
- image: cimg/node:22.13.1
parameters:
secret:
type: string
@@ -52,7 +52,7 @@ jobs:
pipeline_number: << pipeline.number >>
imex-app-build:
docker:
- image: cimg/node:18.18.2
- image: cimg/node:22.13.1
resource_class: large
working_directory: ~/repo/client
steps:
@@ -77,7 +77,7 @@ jobs:
imex-app-beta-build:
docker:
- image: cimg/node:18.18.2
- image: cimg/node:22.13.1
resource_class: large
working_directory: ~/repo/client
@@ -88,7 +88,7 @@ jobs:
name: Install Dependencies
command: npm i
- run: npm run build:production:imex
- run: NODE_OPTIONS=--max-old-space-size=8192 npm run build:production:imex
- aws-cli/setup:
aws_access_key_id: AWS_ACCESS_KEY_ID
@@ -114,7 +114,7 @@ jobs:
- eb/setup
- run:
command: |
eb init romeonline-productionapi -r us-east-2 -p "Node.js 18 running on 64bit Amazon Linux 2"
eb init romeonline-productionapi -r us-east-2 -p "Node.js 22 running on 64bit Amazon Linux 2023"
eb status --verbose
eb deploy
eb status
@@ -126,7 +126,7 @@ jobs:
pipeline_number: << pipeline.number >>
rome-hasura-migrate:
docker:
- image: cimg/node:18.18.2
- image: cimg/node:22.13.1
parameters:
secret:
type: string
@@ -150,8 +150,8 @@ jobs:
pipeline_number: << pipeline.number >>
rome-app-build:
docker:
- image: cimg/node:18.18.2
- image: cimg/node:22.13.1
resource_class: large
working_directory: ~/repo/client
steps:
@@ -161,7 +161,7 @@ jobs:
name: Install Dependencies
command: npm i
- run: npm run build:production:rome
- run: NODE_OPTIONS=--max-old-space-size=8192 npm run build:production:rome
- aws-cli/setup:
aws_access_key_id: AWS_ACCESS_KEY_ID
@@ -181,7 +181,7 @@ jobs:
test-rome-hasura-migrate:
docker:
- image: cimg/node:18.18.2
- image: cimg/node:22.13.1
parameters:
secret:
type: string
@@ -208,8 +208,8 @@ jobs:
test-rome-app-build:
docker:
- image: cimg/node:18.18.2
- image: cimg/node:22.13.1
resource_class: large
working_directory: ~/repo/client
steps:
@@ -219,7 +219,7 @@ jobs:
name: Install Dependencies
command: npm i
- run: npm run build:test:rome
- run: NODE_OPTIONS=--max-old-space-size=8192 npm run build:test:rome
- aws-cli/setup:
aws_access_key_id: AWS_ACCESS_KEY_ID
@@ -239,7 +239,7 @@ jobs:
test-hasura-migrate:
docker:
- image: cimg/node:18.18.2
- image: cimg/node:22.13.1
parameters:
secret:
type: string
@@ -266,7 +266,7 @@ jobs:
imex-test-app-build:
docker:
- image: cimg/node:18.18.2
- image: cimg/node:22.13.1
resource_class: large
working_directory: ~/repo/client
@@ -277,7 +277,7 @@ jobs:
name: Install Dependencies
command: npm i
- run: npm run build:test:imex
- run: NODE_OPTIONS=--max-old-space-size=8192 npm run build:test:imex
- aws-s3/sync:
from: build
@@ -286,7 +286,7 @@ jobs:
imex-test-app-beta-build:
docker:
- image: cimg/node:18.18.2
- image: cimg/node:22.13.1
resource_class: large
working_directory: ~/repo/client
@@ -298,7 +298,7 @@ jobs:
name: Install Dependencies
command: npm i
- run: npm run build:test:imex
- run: NODE_OPTIONS=--max-old-space-size=8192 npm run build:test:imex
- aws-cli/setup:
aws_access_key_id: AWS_ACCESS_KEY_ID

View File

@@ -11,7 +11,6 @@ node_modules
# Files to exclude
.ebignore
.editorconfig
.eslintrc.json
.gitignore
.prettierrc.js
Dockerfile
@@ -19,6 +18,6 @@ README.MD
bodyshop_translations.babel
docker-compose.yml
ecosystem.config.js
eslint.config.mjs
# Optional: Exclude logs and temporary files
*.log

View File

@@ -1,19 +0,0 @@
{
"env": {
"es6": true,
"node": true
},
"extends": "eslint:recommended",
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parserOptions": {
"ecmaVersion": 2018,
"sourceType": "module"
},
"rules": {
"no-console": "off"
},
"settings": {}
}

11
.gitignore vendored
View File

@@ -121,3 +121,14 @@ logs/oAuthClient-log.log
/*.env.*
.idea/*
.idea
# Vitest
vitest-report*/
vitest-coverage/
*.vitest.log
test-output.txt
server/job/test/fixtures
.github
_reference/ragmate/.ragmate.env
docker_data

View File

@@ -1,2 +1,2 @@
client_max_body_size 50M;
client_body_buffer_size 5M;
client_body_buffer_size 5M;

View File

@@ -3,7 +3,7 @@ FROM amazonlinux:2023
# Install Git and Node.js (Amazon Linux 2023 uses the DNF package manager)
RUN dnf install -y git \
&& curl -sL https://rpm.nodesource.com/setup_20.x | bash - \
&& curl -sL https://rpm.nodesource.com/setup_22.x | bash - \
&& dnf install -y nodejs \
&& dnf clean all
@@ -56,4 +56,5 @@ COPY . .
EXPOSE 4000 9229
# Start the application
CMD ["nodemon", "--legacy-watch", "--inspect=0.0.0.0:9229", "server.js"]
RUN echo "Starting the application..."
CMD ["nodemon", "--ignore", "./server/job/test/fixtures", "--legacy-watch", "--inspect=0.0.0.0:9229", "server.js"]

346
Fortellis Notes.md Normal file
View File

@@ -0,0 +1,346 @@
Fortellis Notes
Subscription ID
- Appears to give us a list of all dealerships we have access to, and `apiDmsInfo` contains the integrations that are enabled for that dealership.
- Will likely need to filter based on the DMS ID or something?
- Should store the whole subscription object. Contains department information needed in subsequent calls.
Department ID
- May have multiple departments. Appears that financial stuff goes to Accounting, History will go to Service.
- TODO: How do we handle the multiple departments that may come up.
###Internal Questions
* Overview of the redis storing mechanism to cache this data.
*
# GL Wip Posting
## Org Helper Return Data
```json
[
{
"acctgLgnID": "DEVWB-A",
"applCode": "V",
"coID": "77",
"companyName": "TEST SYS C187092 DEVWB",
"lgnDesc": "DEV WRITE BACK VMS",
"logon": "DEVWB-V"
},
{
"acctgLgnID": "DEVWB-A",
"applCode": "F",
"coID": "77",
"companyName": "TEST SYS C187092 DEVWB",
"lgnDesc": "DEV WRITE BACK F&I SALES",
"logon": "DEVWB-FI"
},
{
"acctgLgnID": "DEVWB-A",
"applCode": "CS",
"coID": "77",
"companyName": "TEST SYS C187092 DEVWB",
"lgnDesc": "DEV WRITE BACK SERVICE",
"logon": "DEVWB-S"
},
{
"acctgLgnID": "DEVWB-A",
"applCode": "A",
"coID": "77",
"companyName": "TEST SYS C187092 DEVWB",
"lgnDesc": "DEV WRITE BACK ACCTG",
"logon": "DEVWB-A"
},
{
"acctgLgnID": "DEVWB-A",
"applCode": "SL",
"coID": "77",
"companyName": "TEST SYS C187092 DEVWB",
"lgnDesc": "DEV WRTIE BACK SLS MGMT",
"logon": "DEVWB-SL"
},
{
"acctgLgnID": "DEVWB-A",
"applCode": "O",
"coID": "77",
"companyName": "TEST SYS C187092 DEVWB",
"lgnDesc": "DEV WRITE BACK PARTS",
"logon": "DEVWB-I"
}
]
```
## Journal Helper Return Data
```json
[
{
"companyNo": "77",
"jrnlID": "32",
"jrnlName": "PARTS SALES",
"jrnlType": "S",
"intercoFlag": "0",
"defaultDocType": "4",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "92",
"jrnlName": "YTD ADJUSTMENTS",
"jrnlType": "Y",
"intercoFlag": "0",
"defaultDocType": "3",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "12",
"jrnlName": "FLEET SALES",
"jrnlType": "S",
"intercoFlag": "0",
"defaultDocType": "9",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "57",
"jrnlName": "CASH RECEIPTS (OPEN-ITEM)",
"jrnlType": "R",
"intercoFlag": "0",
"defaultDocType": "1",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "93",
"jrnlName": "SET UP HISTORY",
"jrnlType": "H",
"intercoFlag": "0",
"defaultDocType": "10",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "88",
"jrnlName": "F/S STATISCAL DATA",
"jrnlType": "F",
"intercoFlag": "0",
"defaultDocType": "10",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "58",
"jrnlName": "WARRANTY CREDITS",
"jrnlType": "G",
"intercoFlag": "0",
"defaultDocType": "3",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "FC",
"jrnlName": "FINANCE CHARGE",
"jrnlType": "A",
"intercoFlag": "0",
"defaultDocType": "12",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "94",
"jrnlName": "SET UP SCHEDULES",
"jrnlType": "C",
"intercoFlag": "0",
"defaultDocType": "3",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "95",
"jrnlName": "SET UP GENERAL LEDGER",
"jrnlType": "B",
"intercoFlag": "0",
"defaultDocType": "3",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "20",
"jrnlName": "USED VEHICLE SALES",
"jrnlType": "S",
"intercoFlag": "0",
"defaultDocType": "9",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "60",
"jrnlName": "CASH DISBURSEMENTS",
"jrnlType": "G",
"intercoFlag": "0",
"defaultDocType": "2",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "30",
"jrnlName": "SERVICE SALES",
"jrnlType": "S",
"intercoFlag": "0",
"defaultDocType": "7",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "40",
"jrnlName": "PAYROLL",
"jrnlType": "G",
"intercoFlag": "0",
"defaultDocType": "11",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "15",
"jrnlName": "DEALER TRADES",
"jrnlType": "S",
"intercoFlag": "0",
"defaultDocType": "9",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "70",
"jrnlName": "NEW VEHICLE PURCHASES",
"jrnlType": "G",
"intercoFlag": "0",
"defaultDocType": "8",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "25",
"jrnlName": "USED WHOLESALE",
"jrnlType": "S",
"intercoFlag": "0",
"defaultDocType": "9",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "75",
"jrnlName": "GENERAL PURCHASES",
"jrnlType": "G",
"intercoFlag": "0",
"defaultDocType": "5",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "10",
"jrnlName": "NEW VEHICLE SALES",
"jrnlType": "S",
"intercoFlag": "0",
"defaultDocType": "9",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "80",
"jrnlName": "GENERAL JOURNAL",
"jrnlType": "G",
"intercoFlag": "0",
"defaultDocType": "3",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "11",
"jrnlName": "WORK IN PROGRESS",
"jrnlType": "G",
"intercoFlag": "0",
"defaultDocType": "10",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "56",
"jrnlName": "CASH RECEIPTS (BALANCE FWD)",
"jrnlType": "G",
"intercoFlag": "0",
"defaultDocType": "1",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "81",
"jrnlName": "STANDARD ENTRIES",
"jrnlType": "G",
"intercoFlag": "0",
"defaultDocType": "6",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "51",
"jrnlName": "CASH RECEIPTS JOURNAL - EFT",
"jrnlType": "G",
"intercoFlag": "0",
"defaultDocType": "10",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "61",
"jrnlName": "CASH DISBURSMENTS -EFT",
"jrnlType": "G",
"intercoFlag": "0",
"defaultDocType": "10",
"errCode": "",
"errMsg": ""
},
{
"companyNo": "77",
"jrnlID": "71",
"jrnlName": "USED VEHICLE PURCHASES",
"jrnlType": "G",
"intercoFlag": "0",
"defaultDocType": "8",
"errCode": "",
"errMsg": ""
}
]
```
# Feedback
- Receiving bad request errors, with no details. API errors page doesn't indicate what's wrong for certain types of error codes.
- API Error page works on a several minute delay.

View File

@@ -1,116 +1,96 @@
// index.js
import express from 'express';
import fetch from 'node-fetch';
import {simpleParser} from 'mailparser';
import express from "express";
import fetch from "node-fetch";
import { simpleParser } from "mailparser";
const app = express();
const PORT = 3334;
app.get('/', async (req, res) => {
try {
const response = await fetch('http://localhost:4566/_aws/ses');
if (!response.ok) {
throw new Error('Network response was not ok');
}
const data = await response.json();
const messagesHtml = await parseMessages(data.messages);
res.send(renderHtml(messagesHtml));
} catch (error) {
console.error('Error fetching messages:', error);
res.status(500).send('Error fetching messages');
app.get("/", async (req, res) => {
try {
const response = await fetch("http://localhost:4566/_aws/ses");
if (!response.ok) {
throw new Error("Network response was not ok");
}
const data = await response.json();
const messagesHtml = await parseMessages(data.messages);
res.send(renderHtml(messagesHtml));
} catch (error) {
console.error("Error fetching messages:", error);
res.status(500).send("Error fetching messages");
}
});
async function parseMessages(messages) {
const parsedMessages = await Promise.all(
messages.map(async (message, index) => {
try {
const parsed = await simpleParser(message.RawData);
return `
<div class="shadow-md rounded-lg p-4 mb-6" style="background-color: lightgray">
<div class="shadow-md rounded-lg p-4 mb-6" style="background-color: white">
<div class="mb-2">
<span class="font-bold text-lg">Message ${index + 1}</span>
</div>
<div class="mb-2">
<span class="font-semibold">From:</span> ${message.Source}
</div>
<div class="mb-2">
<span class="font-semibold">Region:</span> ${message.Region}
</div>
<div class="mb-2">
<span class="font-semibold">Timestamp:</span> ${message.Timestamp}
</div>
</div>
<div class="prose">
${parsed.html || parsed.textAsHtml || 'No HTML content available'}
</div>
</div>
`;
} catch (error) {
console.error('Error parsing email:', error);
return `
<div class="bg-white shadow-md rounded-lg p-4 mb-6">
<div class="mb-2">
<span class="font-bold text-lg">Message ${index + 1}</span>
</div>
<div class="mb-2">
<span class="font-semibold">From:</span> ${message.Source}
</div>
<div class="mb-2">
<span class="font-semibold">Region:</span> ${message.Region}
</div>
<div class="mb-2">
<span class="font-semibold">Timestamp:</span> ${message.Timestamp}
</div>
<div class="text-red-500">
Error parsing email content
</div>
</div>
`;
}
})
);
return parsedMessages.join('');
const parsedMessages = await Promise.all(
messages.map(async (message, index) => {
try {
const parsed = await simpleParser(message.RawData);
return `
<div class="shadow-md rounded-lg p-4 mb-6" style="background-color: lightgray">
<div class="shadow-md rounded-lg p-4 mb-6" style="background-color: white">
<div class="mb-2"><span class="font-bold text-lg">Message ${index + 1}</span></div>
<div class="mb-2"><span class="font-semibold">From:</span> ${message.Source}</div>
<div class="mb-2"><span class="font-semibold">To:</span> ${parsed.to.text || "No To Address"}</div>
<div class="mb-2"><span class="font-semibold">Subject:</span> ${parsed.subject || "No Subject"}</div>
<div class="mb-2"><span class="font-semibold">Region:</span> ${message.Region}</div>
<div class="mb-2"><span class="font-semibold">Timestamp:</span> ${message.Timestamp}</div>
</div>
<div class="prose">${parsed.html || parsed.textAsHtml || "No HTML content available"}</div>
</div>
`;
} catch (error) {
console.error("Error parsing email:", error);
return `
<div class="bg-white shadow-md rounded-lg p-4 mb-6">
<div class="mb-2"><span class="font-bold text-lg">Message ${index + 1}</span></div>
<div class="mb-2"><span class="font-semibold">From:</span> ${message.Source}</div>
<div class="mb-2"><span class="font-semibold">Region:</span> ${message.Region}</div>
<div class="mb-2"><span class="font-semibold">Timestamp:</span> ${message.Timestamp}</div>
<div class="text-red-500">Error parsing email content</div>
</div>
`;
}
})
);
return parsedMessages.join("");
}
function renderHtml(messagesHtml) {
return `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Email Messages Viewer</title>
<script src="https://cdn.tailwindcss.com"></script>
<style>
body {
background-color: #f3f4f6;
font-family: Arial, sans-serif;
}
.container {
max-width: 800px;
margin: 50px auto;
padding: 20px;
}
.prose {
line-height: 1.6;
}
</style>
</head>
<body>
<div class="container bg-white shadow-lg rounded-lg p-6">
<h1 class="text-2xl font-bold text-center mb-6">Email Messages Viewer</h1>
<div id="messages-container">
${messagesHtml}
</div>
</div>
</body>
</html>
`;
return `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Email Messages Viewer</title>
<script src="https://cdn.tailwindcss.com"></script>
<style>
body {
background-color: #f3f4f6;
font-family: Arial, sans-serif;
}
.container {
max-width: 800px;
margin: 50px auto;
padding: 20px;
}
.prose {
line-height: 1.6;
}
</style>
</head>
<body>
<div class="container bg-white shadow-lg rounded-lg p-6">
<h1 class="text-2xl font-bold text-center mb-6">Email Messages Viewer</h1>
<div id="messages-container">${messagesHtml}</div>
</div>
</body>
</html>
`;
}
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
console.log(`Server is running on http://localhost:${PORT}`);
});

File diff suppressed because it is too large Load Diff

View File

@@ -11,8 +11,8 @@
"license": "ISC",
"description": "",
"dependencies": {
"express": "^4.21.1",
"mailparser": "^3.7.1",
"express": "^5.1.0",
"mailparser": "^3.7.4",
"node-fetch": "^3.3.2"
}
}

View File

@@ -0,0 +1,61 @@
# PATCH /integrations/parts-management/job/:id/status
Update (patch) the status of a job created under parts management. This endpoint is only available
for jobs whose parent bodyshop has an `external_shop_id` (i.e., is provisioned for parts
management).
## Endpoint
```
PATCH /integrations/parts-management/job/:id/status
```
- `:id` is the UUID of the job to update.
## Request Headers
- `Authorization`: (if required by your integration middleware)
- `Content-Type: application/json`
## Request Body
Send a JSON object with the following field:
- `status` (string, required): The new status for the job.
Example:
```
PATCH /integrations/parts-management/job/123e4567-e89b-12d3-a456-426614174000/status
Content-Type: application/json
{
"status": "IN_PROGRESS"
}
```
## Success Response
- **200 OK**
- Returns the updated job object with the new status.
```
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"status": "IN_PROGRESS",
...
}
```
## Error Responses
- **400 Bad Request**: Missing status field, or parent bodyshop does not have an `external_shop_id`.
- **404 Not Found**: No job found with the given ID.
- **500 Internal Server Error**: Unexpected error.
## Notes
- Only jobs whose parent bodyshop has an `external_shop_id` can be patched via this route.
- Fields other than `status` will be ignored if included in the request body.
- The route is protected by the same middleware as other parts management endpoints.

View File

@@ -0,0 +1,81 @@
# PATCH /integrations/parts-management/provision/:id
Update (patch) select fields for a parts management bodyshop. Only available for shops that have an
`external_shop_id` (i.e., are provisioned for parts management).
## Endpoint
```
PATCH /integrations/parts-management/provision/:id
```
- `:id` is the UUID of the bodyshop to update.
## Request Headers
- `Authorization`: (if required by your integration middleware)
- `Content-Type: application/json`
## Request Body
Send a JSON object with one or more of the following fields to update:
- `shopname` (string)
- `address1` (string)
- `address2` (string, optional)
- `city` (string)
- `state` (string)
- `zip_post` (string)
- `country` (string)
- `email` (string, shop's email, not user email)
- `timezone` (string)
- `phone` (string)
- `logo_img_path` (string)
Any fields not included in the request body will remain unchanged.
## Example Request
```
PATCH /integrations/parts-management/provision/123e4567-e89b-12d3-a456-426614174000
Content-Type: application/json
{
"shopname": "New Shop Name",
"address1": "123 Main St",
"city": "Springfield",
"state": "IL",
"zip_post": "62704",
"country": "USA",
"email": "shop@example.com",
"timezone": "America/Chicago",
"phone": "555-123-4567",
"logo_img_path": "https://example.com/logo.png"
}
```
## Success Response
- **200 OK**
- Returns the updated shop object with the patched fields.
```
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"shopname": "New Shop Name",
...
}
```
## Error Responses
- **400 Bad Request**: No valid fields provided, or shop does not have an `external_shop_id`.
- **404 Not Found**: No shop found with the given ID.
- **500 Internal Server Error**: Unexpected error.
## Notes
- Only shops with an `external_shop_id` can be patched via this route.
- Fields not listed above will be ignored if included in the request body.
- The route is protected by the same middleware as other parts management endpoints.

View File

@@ -0,0 +1,166 @@
openapi: 3.0.3
info:
title: Parts Management Provisioning API
description: API endpoint to provision a new shop and user in the Parts Management system.
version: 1.0.0
paths:
/parts-management/provision:
post:
summary: Provision a new parts management shop and user
operationId: partsManagementProvisioning
tags:
- Parts Management
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- external_shop_id
- shopname
- address1
- city
- state
- zip_post
- country
- email
- phone
- userEmail
properties:
external_shop_id:
type: string
description: External shop ID (must be unique)
shopname:
type: string
address1:
type: string
address2:
type: string
nullable: true
city:
type: string
state:
type: string
zip_post:
type: string
country:
type: string
email:
type: string
phone:
type: string
userEmail:
type: string
format: email
userPassword:
type: string
description: Optional password for the new user. If provided, the password is set directly, and no password reset link is sent. Must be at least 6 characters.
nullable: true
logoUrl:
type: string
format: uri
nullable: true
timezone:
type: string
nullable: true
vendors:
type: array
items:
type: object
properties:
name:
type: string
street1:
type: string
nullable: true
street2:
type: string
nullable: true
city:
type: string
nullable: true
state:
type: string
nullable: true
zip:
type: string
nullable: true
country:
type: string
nullable: true
email:
type: string
format: email
nullable: true
discount:
type: number
nullable: true
due_date:
type: string
format: date
nullable: true
cost_center:
type: string
nullable: true
favorite:
type: array
items:
type: string
nullable: true
phone:
type: string
nullable: true
active:
type: boolean
nullable: true
dmsid:
type: string
nullable: true
responses:
'200':
description: Shop and user successfully created
content:
application/json:
schema:
type: object
properties:
shop:
type: object
properties:
id:
type: string
format: uuid
shopname:
type: string
user:
type: object
properties:
id:
type: string
email:
type: string
resetLink:
type: string
format: uri
nullable: true
description: Password reset link for the user. Only included if userPassword is not provided in the request.
'400':
description: Bad request (missing or invalid fields)
content:
application/json:
schema:
type: object
properties:
error:
type: string
'500':
description: Internal server error
content:
application/json:
schema:
type: object
properties:
error:
type: string

View File

@@ -0,0 +1,10 @@
services:
ragmate:
image: ghcr.io/ragmate/ragmate:latest
ports:
- "11434:11434"
env_file:
- .ragmate.env
volumes:
- .:/project
- ./docker_data/ragmate:/apps/cache

File diff suppressed because it is too large Load Diff

View File

@@ -9,6 +9,12 @@ VITE_APP_CLOUDINARY_THUMB_TRANSFORMATIONS=c_fill,h_250,w_250
VITE_APP_FIREBASE_PUBLIC_VAPID_KEY='BG3tzU7L2BXlGZ_3VLK4PNaRceoEXEnmHfxcVbRMF5o5g05ejslhVPki9kBM9cBBT-08Ad9kN3HSpS6JmrWD6h4'
VITE_APP_STRIPE_PUBLIC_KEY=pk_test_51GqB4TJl3nQjrZ0wCQWAxAhlNF8jKe0tipIa6ExBaxwJGitwvFsIZUEua4dUzaMIAuXp4qwYHXx7lgjyQSwP0Pe900vzm38C7g
VITE_APP_AXIOS_BASE_API_URL=/api/
VITE_APP_REPORTS_SERVER_URL=https://reports3.test.imex.online
VITE_APP_REPORTS_SERVER_URL=https://reports.test.imex.online
VITE_APP_SPLIT_API=ts615lqgnmk84thn72uk18uu5pgce6e0l4rc
VITE_APP_INSTANCE=IMEX
TEST_USERNAME="test@imex.dev"
TEST_PASSWORD="test123"
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
VITE_APP_AMP_KEY=6228a598e57cd66875cfd41604f1f891

View File

@@ -10,7 +10,13 @@ VITE_APP_CLOUDINARY_THUMB_TRANSFORMATIONS=c_fill,h_250,w_250
VITE_APP_FIREBASE_PUBLIC_VAPID_KEY='BP1B7ZTYpn-KMt6nOxlld6aS8Skt3Q7ZLEqP0hAvGHxG4UojPYiXZ6kPlzZkUC5jH-EcWXomTLtmadAIxurfcHo'
VITE_APP_STRIPE_PUBLIC_KEY=pk_test_51GqB4TJl3nQjrZ0wCQWAxAhlNF8jKe0tipIa6ExBaxwJGitwvFsIZUEua4dUzaMIAuXp4qwYHXx7lgjyQSwP0Pe900vzm38C7g
VITE_APP_AXIOS_BASE_API_URL=/api/
VITE_APP_REPORTS_SERVER_URL=https://reports3.test.imex.online
VITE_APP_REPORTS_SERVER_URL=https://reports.test.romeonline.io
VITE_APP_SPLIT_API=ts615lqgnmk84thn72uk18uu5pgce6e0l4rc
VITE_APP_COUNTRY=USA
VITE_APP_INSTANCE=ROME
TEST_USERNAME="test@imex.dev"
TEST_PASSWORD="test123"
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
VITE_APP_AMP_KEY=46b1193a867d4e3131ae4c3a64a3fc78

View File

@@ -13,3 +13,7 @@ VITE_APP_AXIOS_BASE_API_URL=https://api.imex.online/
VITE_APP_REPORTS_SERVER_URL=https://reports.imex.online
VITE_APP_SPLIT_API=et9pjkik6bn67he5evpmpr1agoo7gactphgk
VITE_APP_INSTANCE=IMEX
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
VITE_APP_AMP_KEY=6228a598e57cd66875cfd41604f1f891

View File

@@ -13,3 +13,7 @@ VITE_APP_AXIOS_BASE_API_URL=https://api.romeonline.io/
VITE_APP_REPORTS_SERVER_URL=https://reports.romeonline.io
VITE_APP_SPLIT_API=et9pjkik6bn67he5evpmpr1agoo7gactphgk
VITE_APP_INSTANCE=ROME
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
VITE_APP_AMP_KEY=46b1193a867d4e3131ae4c3a64a3fc78

View File

@@ -9,7 +9,11 @@ VITE_APP_CLOUDINARY_THUMB_TRANSFORMATIONS=c_fill,h_250,w_250
VITE_APP_FIREBASE_PUBLIC_VAPID_KEY='BN2GcDPjipR5MTEosO5dT4CfQ3cmrdBIsI4juoOQrRijn_5aRiHlwj1mlq0W145mOusx6xynEKl_tvYJhpCc9lo'
VITE_APP_STRIPE_PUBLIC_KEY=pk_test_51GqB4TJl3nQjrZ0wCQWAxAhlNF8jKe0tipIa6ExBaxwJGitwvFsIZUEua4dUzaMIAuXp4qwYHXx7lgjyQSwP0Pe900vzm38C7g
VITE_APP_AXIOS_BASE_API_URL=https://api.test.imex.online/
VITE_APP_REPORTS_SERVER_URL=https://reports3.test.imex.online
VITE_APP_REPORTS_SERVER_URL=https://reports.test.imex.online
VITE_APP_IS_TEST=true
VITE_APP_SPLIT_API=ts615lqgnmk84thn72uk18uu5pgce6e0l4rc
VITE_APP_INSTANCE=IMEX
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
VITE_APP_AMP_KEY=6228a598e57cd66875cfd41604f1f891

View File

@@ -13,3 +13,7 @@ VITE_APP_REPORTS_SERVER_URL=https://reports.test.romeonline.io
VITE_APP_IS_TEST=true
VITE_APP_SPLIT_API=ts615lqgnmk84thn72uk18uu5pgce6e0l4rc
VITE_APP_INSTANCE=ROME
VITE_PUBLIC_POSTHOG_KEY=phc_xtLmBIu0rjWwExY73Oj5DTH1bGbwq1G1Y8jnlTceien
VITE_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
VITE_APP_AMP_URL=https://vp8k908qy2.execute-api.ca-central-1.amazonaws.com
VITE_APP_AMP_KEY=46b1193a867d4e3131ae4c3a64a3fc78

View File

@@ -1,8 +0,0 @@
{
"extends": [
"react-app"
],
"rules": {
"no-useless-rename": "off"
}
}

11
client/.gitignore vendored
View File

@@ -1,3 +1,14 @@
# Vitest
vitest-report*/
vitest-coverage/
*.vitest.log
test-output.txt
# Playwright
playwright-report/
test-results/
playwright/.cache/
*.playwright.log
# Sentry Config File
.sentryclirc

View File

@@ -1,17 +0,0 @@
const { defineConfig } = require("cypress");
module.exports = defineConfig({
experimentalStudio: true,
env: {
FIREBASE_USERNAME: "cypress@imex.test",
FIREBASE_PASSWORD: "cypress"
},
e2e: {
// We've imported your old cypress plugins here.
// You may want to clean this up later by importing these.
setupNodeEvents(on, config) {
return require("./cypress/plugins/index.js")(on, config);
},
baseUrl: "https://localhost:3000"
}
});

View File

@@ -1,19 +0,0 @@
/// <reference types="Cypress" />
const { FIREBASE_USERNAME, FIREBASE_PASSWORcD } = Cypress.env();
describe("Renders the General Page", () => {
beforeEach(() => {
cy.visit("/");
});
it("Renders Correctly", () => {});
it("Has the Slogan", () => {
cy.findByText("A whole x22new kind of shop management system.").should("exist");
/* ==== Generated with Cypress Studio ==== */
cy.get(".ant-menu-item-active > .ant-menu-title-content > .header0-item-block").click();
cy.get("#email").clear();
cy.get("#email").type("patrick@imex.dev");
cy.get("#password").clear();
cy.get("#password").type("patrick123{enter}");
cy.get(".ant-form > .ant-btn").click();
/* ==== End Cypress Studio ==== */
});
});

View File

@@ -1,124 +0,0 @@
/// <reference types="cypress" />
// Welcome to Cypress!
//
// This spec file contains a variety of sample tests
// for a todo list app that are designed to demonstrate
// the power of writing tests in Cypress.
//
// To learn more about how Cypress works and
// what makes it such an awesome testing tool,
// please read our getting started guide:
// https://on.cypress.io/introduction-to-cypress
describe("example to-do app", () => {
beforeEach(() => {
// Cypress starts out with a blank slate for each test
// so we must tell it to visit our website with the `cy.visit()` command.
// Since we want to visit the same URL at the start of all our tests,
// we include it in our beforeEach function so that it runs before each test
cy.visit("https://example.cypress.io/todo");
});
it("displays two todo items by default", () => {
// We use the `cy.get()` command to get all elements that match the selector.
// Then, we use `should` to assert that there are two matched items,
// which are the two default items.
cy.get(".todo-list li").should("have.length", 2);
// We can go even further and check that the default todos each contain
// the correct text. We use the `first` and `last` functions
// to get just the first and last matched elements individually,
// and then perform an assertion with `should`.
cy.get(".todo-list li").first().should("have.text", "Pay electric bill");
cy.get(".todo-list li").last().should("have.text", "Walk the dog");
});
it("can add new todo items", () => {
// We'll store our item text in a variable so we can reuse it
const newItem = "Feed the cat";
// Let's get the input element and use the `type` command to
// input our new list item. After typing the content of our item,
// we need to type the enter key as well in order to submit the input.
// This input has a data-test attribute so we'll use that to select the
// element in accordance with best practices:
// https://on.cypress.io/selecting-elements
cy.get("[data-test=new-todo]").type(`${newItem}{enter}`);
// Now that we've typed our new item, let's check that it actually was added to the list.
// Since it's the newest item, it should exist as the last element in the list.
// In addition, with the two default items, we should have a total of 3 elements in the list.
// Since assertions yield the element that was asserted on,
// we can chain both of these assertions together into a single statement.
cy.get(".todo-list li").should("have.length", 3).last().should("have.text", newItem);
});
it("can check off an item as completed", () => {
// In addition to using the `get` command to get an element by selector,
// we can also use the `contains` command to get an element by its contents.
// However, this will yield the <label>, which is lowest-level element that contains the text.
// In order to check the item, we'll find the <input> element for this <label>
// by traversing up the dom to the parent element. From there, we can `find`
// the child checkbox <input> element and use the `check` command to check it.
cy.contains("Pay electric bill").parent().find("input[type=checkbox]").check();
// Now that we've checked the button, we can go ahead and make sure
// that the list element is now marked as completed.
// Again we'll use `contains` to find the <label> element and then use the `parents` command
// to traverse multiple levels up the dom until we find the corresponding <li> element.
// Once we get that element, we can assert that it has the completed class.
cy.contains("Pay electric bill").parents("li").should("have.class", "completed");
});
context("with a checked task", () => {
beforeEach(() => {
// We'll take the command we used above to check off an element
// Since we want to perform multiple tests that start with checking
// one element, we put it in the beforeEach hook
// so that it runs at the start of every test.
cy.contains("Pay electric bill").parent().find("input[type=checkbox]").check();
});
it("can filter for uncompleted tasks", () => {
// We'll click on the "active" button in order to
// display only incomplete items
cy.contains("Active").click();
// After filtering, we can assert that there is only the one
// incomplete item in the list.
cy.get(".todo-list li").should("have.length", 1).first().should("have.text", "Walk the dog");
// For good measure, let's also assert that the task we checked off
// does not exist on the page.
cy.contains("Pay electric bill").should("not.exist");
});
it("can filter for completed tasks", () => {
// We can perform similar steps as the test above to ensure
// that only completed tasks are shown
cy.contains("Completed").click();
cy.get(".todo-list li").should("have.length", 1).first().should("have.text", "Pay electric bill");
cy.contains("Walk the dog").should("not.exist");
});
it("can delete all completed tasks", () => {
// First, let's click the "Clear completed" button
// `contains` is actually serving two purposes here.
// First, it's ensuring that the button exists within the dom.
// This button only appears when at least one task is checked
// so this command is implicitly verifying that it does exist.
// Second, it selects the button so we can click it.
cy.contains("Clear completed").click();
// Then we can make sure that there is only one element
// in the list and our element does not exist
cy.get(".todo-list li").should("have.length", 1).should("not.have.text", "Pay electric bill");
// Finally, make sure that the clear button no longer exists.
cy.contains("Clear completed").should("not.exist");
});
});
});

View File

@@ -1,284 +0,0 @@
/// <reference types="cypress" />
context("Actions", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/actions");
});
// https://on.cypress.io/interacting-with-elements
it(".type() - type into a DOM element", () => {
// https://on.cypress.io/type
cy.get(".action-email")
.type("fake@email.com")
.should("have.value", "fake@email.com")
// .type() with special character sequences
.type("{leftarrow}{rightarrow}{uparrow}{downarrow}")
.type("{del}{selectall}{backspace}")
// .type() with key modifiers
.type("{alt}{option}") //these are equivalent
.type("{ctrl}{control}") //these are equivalent
.type("{meta}{command}{cmd}") //these are equivalent
.type("{shift}")
// Delay each keypress by 0.1 sec
.type("slow.typing@email.com", { delay: 100 })
.should("have.value", "slow.typing@email.com");
cy.get(".action-disabled")
// Ignore error checking prior to type
// like whether the input is visible or disabled
.type("disabled error checking", { force: true })
.should("have.value", "disabled error checking");
});
it(".focus() - focus on a DOM element", () => {
// https://on.cypress.io/focus
cy.get(".action-focus").focus().should("have.class", "focus").prev().should("have.attr", "style", "color: orange;");
});
it(".blur() - blur off a DOM element", () => {
// https://on.cypress.io/blur
cy.get(".action-blur")
.type("About to blur")
.blur()
.should("have.class", "error")
.prev()
.should("have.attr", "style", "color: red;");
});
it(".clear() - clears an input or textarea element", () => {
// https://on.cypress.io/clear
cy.get(".action-clear")
.type("Clear this text")
.should("have.value", "Clear this text")
.clear()
.should("have.value", "");
});
it(".submit() - submit a form", () => {
// https://on.cypress.io/submit
cy.get(".action-form").find('[type="text"]').type("HALFOFF");
cy.get(".action-form").submit().next().should("contain", "Your form has been submitted!");
});
it(".click() - click on a DOM element", () => {
// https://on.cypress.io/click
cy.get(".action-btn").click();
// You can click on 9 specific positions of an element:
// -----------------------------------
// | topLeft top topRight |
// | |
// | |
// | |
// | left center right |
// | |
// | |
// | |
// | bottomLeft bottom bottomRight |
// -----------------------------------
// clicking in the center of the element is the default
cy.get("#action-canvas").click();
cy.get("#action-canvas").click("topLeft");
cy.get("#action-canvas").click("top");
cy.get("#action-canvas").click("topRight");
cy.get("#action-canvas").click("left");
cy.get("#action-canvas").click("right");
cy.get("#action-canvas").click("bottomLeft");
cy.get("#action-canvas").click("bottom");
cy.get("#action-canvas").click("bottomRight");
// .click() accepts an x and y coordinate
// that controls where the click occurs :)
cy.get("#action-canvas")
.click(80, 75) // click 80px on x coord and 75px on y coord
.click(170, 75)
.click(80, 165)
.click(100, 185)
.click(125, 190)
.click(150, 185)
.click(170, 165);
// click multiple elements by passing multiple: true
cy.get(".action-labels>.label").click({ multiple: true });
// Ignore error checking prior to clicking
cy.get(".action-opacity>.btn").click({ force: true });
});
it(".dblclick() - double click on a DOM element", () => {
// https://on.cypress.io/dblclick
// Our app has a listener on 'dblclick' event in our 'scripts.js'
// that hides the div and shows an input on double click
cy.get(".action-div").dblclick().should("not.be.visible");
cy.get(".action-input-hidden").should("be.visible");
});
it(".rightclick() - right click on a DOM element", () => {
// https://on.cypress.io/rightclick
// Our app has a listener on 'contextmenu' event in our 'scripts.js'
// that hides the div and shows an input on right click
cy.get(".rightclick-action-div").rightclick().should("not.be.visible");
cy.get(".rightclick-action-input-hidden").should("be.visible");
});
it(".check() - check a checkbox or radio element", () => {
// https://on.cypress.io/check
// By default, .check() will check all
// matching checkbox or radio elements in succession, one after another
cy.get('.action-checkboxes [type="checkbox"]').not("[disabled]").check().should("be.checked");
cy.get('.action-radios [type="radio"]').not("[disabled]").check().should("be.checked");
// .check() accepts a value argument
cy.get('.action-radios [type="radio"]').check("radio1").should("be.checked");
// .check() accepts an array of values
cy.get('.action-multiple-checkboxes [type="checkbox"]').check(["checkbox1", "checkbox2"]).should("be.checked");
// Ignore error checking prior to checking
cy.get(".action-checkboxes [disabled]").check({ force: true }).should("be.checked");
cy.get('.action-radios [type="radio"]').check("radio3", { force: true }).should("be.checked");
});
it(".uncheck() - uncheck a checkbox element", () => {
// https://on.cypress.io/uncheck
// By default, .uncheck() will uncheck all matching
// checkbox elements in succession, one after another
cy.get('.action-check [type="checkbox"]').not("[disabled]").uncheck().should("not.be.checked");
// .uncheck() accepts a value argument
cy.get('.action-check [type="checkbox"]').check("checkbox1").uncheck("checkbox1").should("not.be.checked");
// .uncheck() accepts an array of values
cy.get('.action-check [type="checkbox"]')
.check(["checkbox1", "checkbox3"])
.uncheck(["checkbox1", "checkbox3"])
.should("not.be.checked");
// Ignore error checking prior to unchecking
cy.get(".action-check [disabled]").uncheck({ force: true }).should("not.be.checked");
});
it(".select() - select an option in a <select> element", () => {
// https://on.cypress.io/select
// at first, no option should be selected
cy.get(".action-select").should("have.value", "--Select a fruit--");
// Select option(s) with matching text content
cy.get(".action-select").select("apples");
// confirm the apples were selected
// note that each value starts with "fr-" in our HTML
cy.get(".action-select").should("have.value", "fr-apples");
cy.get(".action-select-multiple")
.select(["apples", "oranges", "bananas"])
// when getting multiple values, invoke "val" method first
.invoke("val")
.should("deep.equal", ["fr-apples", "fr-oranges", "fr-bananas"]);
// Select option(s) with matching value
cy.get(".action-select")
.select("fr-bananas")
// can attach an assertion right away to the element
.should("have.value", "fr-bananas");
cy.get(".action-select-multiple")
.select(["fr-apples", "fr-oranges", "fr-bananas"])
.invoke("val")
.should("deep.equal", ["fr-apples", "fr-oranges", "fr-bananas"]);
// assert the selected values include oranges
cy.get(".action-select-multiple").invoke("val").should("include", "fr-oranges");
});
it(".scrollIntoView() - scroll an element into view", () => {
// https://on.cypress.io/scrollintoview
// normally all of these buttons are hidden,
// because they're not within
// the viewable area of their parent
// (we need to scroll to see them)
cy.get("#scroll-horizontal button").should("not.be.visible");
// scroll the button into view, as if the user had scrolled
cy.get("#scroll-horizontal button").scrollIntoView().should("be.visible");
cy.get("#scroll-vertical button").should("not.be.visible");
// Cypress handles the scroll direction needed
cy.get("#scroll-vertical button").scrollIntoView().should("be.visible");
cy.get("#scroll-both button").should("not.be.visible");
// Cypress knows to scroll to the right and down
cy.get("#scroll-both button").scrollIntoView().should("be.visible");
});
it(".trigger() - trigger an event on a DOM element", () => {
// https://on.cypress.io/trigger
// To interact with a range input (slider)
// we need to set its value & trigger the
// event to signal it changed
// Here, we invoke jQuery's val() method to set
// the value and trigger the 'change' event
cy.get(".trigger-input-range")
.invoke("val", 25)
.trigger("change")
.get("input[type=range]")
.siblings("p")
.should("have.text", "25");
});
it("cy.scrollTo() - scroll the window or element to a position", () => {
// https://on.cypress.io/scrollto
// You can scroll to 9 specific positions of an element:
// -----------------------------------
// | topLeft top topRight |
// | |
// | |
// | |
// | left center right |
// | |
// | |
// | |
// | bottomLeft bottom bottomRight |
// -----------------------------------
// if you chain .scrollTo() off of cy, we will
// scroll the entire window
cy.scrollTo("bottom");
cy.get("#scrollable-horizontal").scrollTo("right");
// or you can scroll to a specific coordinate:
// (x axis, y axis) in pixels
cy.get("#scrollable-vertical").scrollTo(250, 250);
// or you can scroll to a specific percentage
// of the (width, height) of the element
cy.get("#scrollable-both").scrollTo("75%", "25%");
// control the easing of the scroll (default is 'swing')
cy.get("#scrollable-vertical").scrollTo("center", { easing: "linear" });
// control the duration of the scroll (in ms)
cy.get("#scrollable-both").scrollTo("center", { duration: 2000 });
});
});

View File

@@ -1,35 +0,0 @@
/// <reference types="cypress" />
context("Aliasing", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/aliasing");
});
it(".as() - alias a DOM element for later use", () => {
// https://on.cypress.io/as
// Alias a DOM element for use later
// We don't have to traverse to the element
// later in our code, we reference it with @
cy.get(".as-table").find("tbody>tr").first().find("td").first().find("button").as("firstBtn");
// when we reference the alias, we place an
// @ in front of its name
cy.get("@firstBtn").click();
cy.get("@firstBtn").should("have.class", "btn-success").and("contain", "Changed");
});
it(".as() - alias a route for later use", () => {
// Alias the route to wait for its response
cy.intercept("GET", "**/comments/*").as("getComment");
// we have code that gets a comment when
// the button is clicked in scripts.js
cy.get(".network-btn").click();
// https://on.cypress.io/wait
cy.wait("@getComment").its("response.statusCode").should("eq", 200);
});
});

View File

@@ -1,173 +0,0 @@
/// <reference types="cypress" />
context("Assertions", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/assertions");
});
describe("Implicit Assertions", () => {
it(".should() - make an assertion about the current subject", () => {
// https://on.cypress.io/should
cy.get(".assertion-table")
.find("tbody tr:last")
.should("have.class", "success")
.find("td")
.first()
// checking the text of the <td> element in various ways
.should("have.text", "Column content")
.should("contain", "Column content")
.should("have.html", "Column content")
// chai-jquery uses "is()" to check if element matches selector
.should("match", "td")
// to match text content against a regular expression
// first need to invoke jQuery method text()
// and then match using regular expression
.invoke("text")
.should("match", /column content/i);
// a better way to check element's text content against a regular expression
// is to use "cy.contains"
// https://on.cypress.io/contains
cy.get(".assertion-table")
.find("tbody tr:last")
// finds first <td> element with text content matching regular expression
.contains("td", /column content/i)
.should("be.visible");
// for more information about asserting element's text
// see https://on.cypress.io/using-cypress-faq#How-do-I-get-an-elements-text-contents
});
it(".and() - chain multiple assertions together", () => {
// https://on.cypress.io/and
cy.get(".assertions-link").should("have.class", "active").and("have.attr", "href").and("include", "cypress.io");
});
});
describe("Explicit Assertions", () => {
// https://on.cypress.io/assertions
it("expect - make an assertion about a specified subject", () => {
// We can use Chai's BDD style assertions
expect(true).to.be.true;
const o = { foo: "bar" };
expect(o).to.equal(o);
expect(o).to.deep.equal({ foo: "bar" });
// matching text using regular expression
expect("FooBar").to.match(/bar$/i);
});
it("pass your own callback function to should()", () => {
// Pass a function to should that can have any number
// of explicit assertions within it.
// The ".should(cb)" function will be retried
// automatically until it passes all your explicit assertions or times out.
cy.get(".assertions-p")
.find("p")
.should(($p) => {
// https://on.cypress.io/$
// return an array of texts from all of the p's
// @ts-ignore TS6133 unused variable
const texts = $p.map((i, el) => Cypress.$(el).text());
// jquery map returns jquery object
// and .get() convert this to simple array
const paragraphs = texts.get();
// array should have length of 3
expect(paragraphs, "has 3 paragraphs").to.have.length(3);
// use second argument to expect(...) to provide clear
// message with each assertion
expect(paragraphs, "has expected text in each paragraph").to.deep.eq([
"Some text from first p",
"More text from second p",
"And even more text from third p"
]);
});
});
it("finds element by class name regex", () => {
cy.get(".docs-header")
.find("div")
// .should(cb) callback function will be retried
.should(($div) => {
expect($div).to.have.length(1);
const className = $div[0].className;
expect(className).to.match(/heading-/);
})
// .then(cb) callback is not retried,
// it either passes or fails
.then(($div) => {
expect($div, "text content").to.have.text("Introduction");
});
});
it("can throw any error", () => {
cy.get(".docs-header")
.find("div")
.should(($div) => {
if ($div.length !== 1) {
// you can throw your own errors
throw new Error("Did not find 1 element");
}
const className = $div[0].className;
if (!className.match(/heading-/)) {
throw new Error(`Could not find class "heading-" in ${className}`);
}
});
});
it("matches unknown text between two elements", () => {
/**
* Text from the first element.
* @type {string}
*/
let text;
/**
* Normalizes passed text,
* useful before comparing text with spaces and different capitalization.
* @param {string} s Text to normalize
*/
const normalizeText = (s) => s.replace(/\s/g, "").toLowerCase();
cy.get(".two-elements")
.find(".first")
.then(($first) => {
// save text from the first element
text = normalizeText($first.text());
});
cy.get(".two-elements")
.find(".second")
.should(($div) => {
// we can massage text before comparing
const secondText = normalizeText($div.text());
expect(secondText, "second text").to.equal(text);
});
});
it("assert - assert shape of an object", () => {
const person = {
name: "Joe",
age: 20
};
assert.isObject(person, "value is object");
});
it("retries the should callback until assertions pass", () => {
cy.get("#random-number").should(($div) => {
const n = parseFloat($div.text());
expect(n).to.be.gte(1).and.be.lte(10);
});
});
});
});

View File

@@ -1,96 +0,0 @@
/// <reference types="cypress" />
context("Connectors", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/connectors");
});
it(".each() - iterate over an array of elements", () => {
// https://on.cypress.io/each
cy.get(".connectors-each-ul>li").each(($el, index, $list) => {
console.log($el, index, $list);
});
});
it(".its() - get properties on the current subject", () => {
// https://on.cypress.io/its
cy.get(".connectors-its-ul>li")
// calls the 'length' property yielding that value
.its("length")
.should("be.gt", 2);
});
it(".invoke() - invoke a function on the current subject", () => {
// our div is hidden in our script.js
// $('.connectors-div').hide()
// https://on.cypress.io/invoke
cy.get(".connectors-div")
.should("be.hidden")
// call the jquery method 'show' on the 'div.container'
.invoke("show")
.should("be.visible");
});
it(".spread() - spread an array as individual args to callback function", () => {
// https://on.cypress.io/spread
const arr = ["foo", "bar", "baz"];
cy.wrap(arr).spread((foo, bar, baz) => {
expect(foo).to.eq("foo");
expect(bar).to.eq("bar");
expect(baz).to.eq("baz");
});
});
describe(".then()", () => {
it("invokes a callback function with the current subject", () => {
// https://on.cypress.io/then
cy.get(".connectors-list > li").then(($lis) => {
expect($lis, "3 items").to.have.length(3);
expect($lis.eq(0), "first item").to.contain("Walk the dog");
expect($lis.eq(1), "second item").to.contain("Feed the cat");
expect($lis.eq(2), "third item").to.contain("Write JavaScript");
});
});
it("yields the returned value to the next command", () => {
cy.wrap(1)
.then((num) => {
expect(num).to.equal(1);
return 2;
})
.then((num) => {
expect(num).to.equal(2);
});
});
it("yields the original subject without return", () => {
cy.wrap(1)
.then((num) => {
expect(num).to.equal(1);
// note that nothing is returned from this callback
})
.then((num) => {
// this callback receives the original unchanged value 1
expect(num).to.equal(1);
});
});
it("yields the value yielded by the last Cypress command inside", () => {
cy.wrap(1)
.then((num) => {
expect(num).to.equal(1);
// note how we run a Cypress command
// the result yielded by this Cypress command
// will be passed to the second ".then"
cy.wrap(2);
})
.then((num) => {
// this callback receives the value yielded by "cy.wrap(2)"
expect(num).to.equal(2);
});
});
});
});

View File

@@ -1,79 +0,0 @@
/// <reference types="cypress" />
context("Cookies", () => {
beforeEach(() => {
Cypress.Cookies.debug(true);
cy.visit("https://example.cypress.io/commands/cookies");
// clear cookies again after visiting to remove
// any 3rd party cookies picked up such as cloudflare
cy.clearCookies();
});
it("cy.getCookie() - get a browser cookie", () => {
// https://on.cypress.io/getcookie
cy.get("#getCookie .set-a-cookie").click();
// cy.getCookie() yields a cookie object
cy.getCookie("token").should("have.property", "value", "123ABC");
});
it("cy.getCookies() - get browser cookies", () => {
// https://on.cypress.io/getcookies
cy.getCookies().should("be.empty");
cy.get("#getCookies .set-a-cookie").click();
// cy.getCookies() yields an array of cookies
cy.getCookies()
.should("have.length", 1)
.should((cookies) => {
// each cookie has these properties
expect(cookies[0]).to.have.property("name", "token");
expect(cookies[0]).to.have.property("value", "123ABC");
expect(cookies[0]).to.have.property("httpOnly", false);
expect(cookies[0]).to.have.property("secure", false);
expect(cookies[0]).to.have.property("domain");
expect(cookies[0]).to.have.property("path");
});
});
it("cy.setCookie() - set a browser cookie", () => {
// https://on.cypress.io/setcookie
cy.getCookies().should("be.empty");
cy.setCookie("foo", "bar");
// cy.getCookie() yields a cookie object
cy.getCookie("foo").should("have.property", "value", "bar");
});
it("cy.clearCookie() - clear a browser cookie", () => {
// https://on.cypress.io/clearcookie
cy.getCookie("token").should("be.null");
cy.get("#clearCookie .set-a-cookie").click();
cy.getCookie("token").should("have.property", "value", "123ABC");
// cy.clearCookies() yields null
cy.clearCookie("token").should("be.null");
cy.getCookie("token").should("be.null");
});
it("cy.clearCookies() - clear browser cookies", () => {
// https://on.cypress.io/clearcookies
cy.getCookies().should("be.empty");
cy.get("#clearCookies .set-a-cookie").click();
cy.getCookies().should("have.length", 1);
// cy.clearCookies() yields null
cy.clearCookies();
cy.getCookies().should("be.empty");
});
});

View File

@@ -1,208 +0,0 @@
/// <reference types="cypress" />
context("Cypress.Commands", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/cypress-api");
});
// https://on.cypress.io/custom-commands
it(".add() - create a custom command", () => {
Cypress.Commands.add(
"console",
{
prevSubject: true
},
(subject, method) => {
// the previous subject is automatically received
// and the commands arguments are shifted
// allow us to change the console method used
method = method || "log";
// log the subject to the console
// @ts-ignore TS7017
console[method]("The subject is", subject);
// whatever we return becomes the new subject
// we don't want to change the subject so
// we return whatever was passed in
return subject;
}
);
// @ts-ignore TS2339
cy.get("button")
.console("info")
.then(($button) => {
// subject is still $button
});
});
});
context("Cypress.Cookies", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/cypress-api");
});
// https://on.cypress.io/cookies
it(".debug() - enable or disable debugging", () => {
Cypress.Cookies.debug(true);
// Cypress will now log in the console when
// cookies are set or cleared
cy.setCookie("fakeCookie", "123ABC");
cy.clearCookie("fakeCookie");
cy.setCookie("fakeCookie", "123ABC");
cy.clearCookie("fakeCookie");
cy.setCookie("fakeCookie", "123ABC");
});
it(".preserveOnce() - preserve cookies by key", () => {
// normally cookies are reset after each test
cy.getCookie("fakeCookie").should("not.be.ok");
// preserving a cookie will not clear it when
// the next test starts
cy.setCookie("lastCookie", "789XYZ");
Cypress.Cookies.preserveOnce("lastCookie");
});
it(".defaults() - set defaults for all cookies", () => {
// now any cookie with the name 'session_id' will
// not be cleared before each new test runs
Cypress.Cookies.defaults({
preserve: "session_id"
});
});
});
context("Cypress.arch", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/cypress-api");
});
it("Get CPU architecture name of underlying OS", () => {
// https://on.cypress.io/arch
expect(Cypress.arch).to.exist;
});
});
context("Cypress.config()", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/cypress-api");
});
it("Get and set configuration options", () => {
// https://on.cypress.io/config
let myConfig = Cypress.config();
expect(myConfig).to.have.property("animationDistanceThreshold", 5);
expect(myConfig).to.have.property("baseUrl", null);
expect(myConfig).to.have.property("defaultCommandTimeout", 4000);
expect(myConfig).to.have.property("requestTimeout", 5000);
expect(myConfig).to.have.property("responseTimeout", 30000);
expect(myConfig).to.have.property("viewportHeight", 660);
expect(myConfig).to.have.property("viewportWidth", 1000);
expect(myConfig).to.have.property("pageLoadTimeout", 60000);
expect(myConfig).to.have.property("waitForAnimations", true);
expect(Cypress.config("pageLoadTimeout")).to.eq(60000);
// this will change the config for the rest of your tests!
Cypress.config("pageLoadTimeout", 20000);
expect(Cypress.config("pageLoadTimeout")).to.eq(20000);
Cypress.config("pageLoadTimeout", 60000);
});
});
context("Cypress.dom", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/cypress-api");
});
// https://on.cypress.io/dom
it(".isHidden() - determine if a DOM element is hidden", () => {
let hiddenP = Cypress.$(".dom-p p.hidden").get(0);
let visibleP = Cypress.$(".dom-p p.visible").get(0);
// our first paragraph has css class 'hidden'
expect(Cypress.dom.isHidden(hiddenP)).to.be.true;
expect(Cypress.dom.isHidden(visibleP)).to.be.false;
});
});
context("Cypress.env()", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/cypress-api");
});
// We can set environment variables for highly dynamic values
// https://on.cypress.io/environment-variables
it("Get environment variables", () => {
// https://on.cypress.io/env
// set multiple environment variables
Cypress.env({
host: "veronica.dev.local",
api_server: "http://localhost:8888/v1/"
});
// get environment variable
expect(Cypress.env("host")).to.eq("veronica.dev.local");
// set environment variable
Cypress.env("api_server", "http://localhost:8888/v2/");
expect(Cypress.env("api_server")).to.eq("http://localhost:8888/v2/");
// get all environment variable
expect(Cypress.env()).to.have.property("host", "veronica.dev.local");
expect(Cypress.env()).to.have.property("api_server", "http://localhost:8888/v2/");
});
});
context("Cypress.log", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/cypress-api");
});
it("Control what is printed to the Command Log", () => {
// https://on.cypress.io/cypress-log
});
});
context("Cypress.platform", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/cypress-api");
});
it("Get underlying OS name", () => {
// https://on.cypress.io/platform
expect(Cypress.platform).to.be.exist;
});
});
context("Cypress.version", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/cypress-api");
});
it("Get current version of Cypress being run", () => {
// https://on.cypress.io/version
expect(Cypress.version).to.be.exist;
});
});
context("Cypress.spec", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/cypress-api");
});
it("Get current spec information", () => {
// https://on.cypress.io/spec
// wrap the object so we can inspect it easily by clicking in the command log
cy.wrap(Cypress.spec).should("include.keys", ["name", "relative", "absolute"]);
});
});

View File

@@ -1,86 +0,0 @@
/// <reference types="cypress" />
/// JSON fixture file can be loaded directly using
// the built-in JavaScript bundler
// @ts-ignore
const requiredExample = require("../../fixtures/example");
context("Files", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/files");
});
beforeEach(() => {
// load example.json fixture file and store
// in the test context object
cy.fixture("example.json").as("example");
});
it("cy.fixture() - load a fixture", () => {
// https://on.cypress.io/fixture
// Instead of writing a response inline you can
// use a fixture file's content.
// when application makes an Ajax request matching "GET **/comments/*"
// Cypress will intercept it and reply with the object in `example.json` fixture
cy.intercept("GET", "**/comments/*", { fixture: "example.json" }).as("getComment");
// we have code that gets a comment when
// the button is clicked in scripts.js
cy.get(".fixture-btn").click();
cy.wait("@getComment")
.its("response.body")
.should("have.property", "name")
.and("include", "Using fixtures to represent data");
});
it("cy.fixture() or require - load a fixture", function () {
// we are inside the "function () { ... }"
// callback and can use test context object "this"
// "this.example" was loaded in "beforeEach" function callback
expect(this.example, "fixture in the test context").to.deep.equal(requiredExample);
// or use "cy.wrap" and "should('deep.equal', ...)" assertion
cy.wrap(this.example).should("deep.equal", requiredExample);
});
it("cy.readFile() - read file contents", () => {
// https://on.cypress.io/readfile
// You can read a file and yield its contents
// The filePath is relative to your project's root.
cy.readFile("cypress.json").then((json) => {
expect(json).to.be.an("object");
});
});
it("cy.writeFile() - write to a file", () => {
// https://on.cypress.io/writefile
// You can write to a file
// Use a response from a request to automatically
// generate a fixture file for use later
cy.request("https://jsonplaceholder.cypress.io/users").then((response) => {
cy.writeFile("cypress/fixtures/users.json", response.body);
});
cy.fixture("users").should((users) => {
expect(users[0].name).to.exist;
});
// JavaScript arrays and objects are stringified
// and formatted into text.
cy.writeFile("cypress/fixtures/profile.json", {
id: 8739,
name: "Jane",
email: "jane@example.com"
});
cy.fixture("profile").should((profile) => {
expect(profile.name).to.eq("Jane");
});
});
});

View File

@@ -1,58 +0,0 @@
/// <reference types="cypress" />
context("Local Storage", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/local-storage");
});
// Although local storage is automatically cleared
// in between tests to maintain a clean state
// sometimes we need to clear the local storage manually
it("cy.clearLocalStorage() - clear all data in local storage", () => {
// https://on.cypress.io/clearlocalstorage
cy.get(".ls-btn")
.click()
.should(() => {
expect(localStorage.getItem("prop1")).to.eq("red");
expect(localStorage.getItem("prop2")).to.eq("blue");
expect(localStorage.getItem("prop3")).to.eq("magenta");
});
// clearLocalStorage() yields the localStorage object
cy.clearLocalStorage().should((ls) => {
expect(ls.getItem("prop1")).to.be.null;
expect(ls.getItem("prop2")).to.be.null;
expect(ls.getItem("prop3")).to.be.null;
});
cy.get(".ls-btn")
.click()
.should(() => {
expect(localStorage.getItem("prop1")).to.eq("red");
expect(localStorage.getItem("prop2")).to.eq("blue");
expect(localStorage.getItem("prop3")).to.eq("magenta");
});
// Clear key matching string in Local Storage
cy.clearLocalStorage("prop1").should((ls) => {
expect(ls.getItem("prop1")).to.be.null;
expect(ls.getItem("prop2")).to.eq("blue");
expect(ls.getItem("prop3")).to.eq("magenta");
});
cy.get(".ls-btn")
.click()
.should(() => {
expect(localStorage.getItem("prop1")).to.eq("red");
expect(localStorage.getItem("prop2")).to.eq("blue");
expect(localStorage.getItem("prop3")).to.eq("magenta");
});
// Clear keys matching regex in Local Storage
cy.clearLocalStorage(/prop1|2/).should((ls) => {
expect(ls.getItem("prop1")).to.be.null;
expect(ls.getItem("prop2")).to.be.null;
expect(ls.getItem("prop3")).to.eq("magenta");
});
});
});

View File

@@ -1,32 +0,0 @@
/// <reference types="cypress" />
context("Location", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/location");
});
it("cy.hash() - get the current URL hash", () => {
// https://on.cypress.io/hash
cy.hash().should("be.empty");
});
it("cy.location() - get window.location", () => {
// https://on.cypress.io/location
cy.location().should((location) => {
expect(location.hash).to.be.empty;
expect(location.href).to.eq("https://example.cypress.io/commands/location");
expect(location.host).to.eq("example.cypress.io");
expect(location.hostname).to.eq("example.cypress.io");
expect(location.origin).to.eq("https://example.cypress.io");
expect(location.pathname).to.eq("/commands/location");
expect(location.port).to.eq("");
expect(location.protocol).to.eq("https:");
expect(location.search).to.be.empty;
});
});
it("cy.url() - get the current URL", () => {
// https://on.cypress.io/url
cy.url().should("eq", "https://example.cypress.io/commands/location");
});
});

View File

@@ -1,98 +0,0 @@
/// <reference types="cypress" />
context("Misc", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/misc");
});
it(".end() - end the command chain", () => {
// https://on.cypress.io/end
// cy.end is useful when you want to end a chain of commands
// and force Cypress to re-query from the root element
cy.get(".misc-table").within(() => {
// ends the current chain and yields null
cy.contains("Cheryl").click().end();
// queries the entire table again
cy.contains("Charles").click();
});
});
it("cy.exec() - execute a system command", () => {
// execute a system command.
// so you can take actions necessary for
// your test outside the scope of Cypress.
// https://on.cypress.io/exec
// we can use Cypress.platform string to
// select appropriate command
// https://on.cypress/io/platform
cy.log(`Platform ${Cypress.platform} architecture ${Cypress.arch}`);
// on CircleCI Windows build machines we have a failure to run bash shell
// https://github.com/cypress-io/cypress/issues/5169
// so skip some of the tests by passing flag "--env circle=true"
const isCircleOnWindows = Cypress.platform === "win32" && Cypress.env("circle");
if (isCircleOnWindows) {
cy.log("Skipping test on CircleCI");
return;
}
// cy.exec problem on Shippable CI
// https://github.com/cypress-io/cypress/issues/6718
const isShippable = Cypress.platform === "linux" && Cypress.env("shippable");
if (isShippable) {
cy.log("Skipping test on ShippableCI");
return;
}
cy.exec("echo Jane Lane").its("stdout").should("contain", "Jane Lane");
if (Cypress.platform === "win32") {
cy.exec("print cypress.json").its("stderr").should("be.empty");
} else {
cy.exec("cat cypress.json").its("stderr").should("be.empty");
cy.exec("pwd").its("code").should("eq", 0);
}
});
it("cy.focused() - get the DOM element that has focus", () => {
// https://on.cypress.io/focused
cy.get(".misc-form").find("#name").click();
cy.focused().should("have.id", "name");
cy.get(".misc-form").find("#description").click();
cy.focused().should("have.id", "description");
});
context("Cypress.Screenshot", function () {
it("cy.screenshot() - take a screenshot", () => {
// https://on.cypress.io/screenshot
cy.screenshot("my-image");
});
it("Cypress.Screenshot.defaults() - change default config of screenshots", function () {
Cypress.Screenshot.defaults({
blackout: [".foo"],
capture: "viewport",
clip: { x: 0, y: 0, width: 200, height: 200 },
scale: false,
disableTimersAndAnimations: true,
screenshotOnRunFailure: true,
onBeforeScreenshot() {},
onAfterScreenshot() {}
});
});
});
it("cy.wrap() - wrap an object", () => {
// https://on.cypress.io/wrap
cy.wrap({ foo: "bar" }).should("have.property", "foo").and("include", "bar");
});
});

View File

@@ -1,56 +0,0 @@
/// <reference types="cypress" />
context("Navigation", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io");
cy.get(".navbar-nav").contains("Commands").click();
cy.get(".dropdown-menu").contains("Navigation").click();
});
it("cy.go() - go back or forward in the browser's history", () => {
// https://on.cypress.io/go
cy.location("pathname").should("include", "navigation");
cy.go("back");
cy.location("pathname").should("not.include", "navigation");
cy.go("forward");
cy.location("pathname").should("include", "navigation");
// clicking back
cy.go(-1);
cy.location("pathname").should("not.include", "navigation");
// clicking forward
cy.go(1);
cy.location("pathname").should("include", "navigation");
});
it("cy.reload() - reload the page", () => {
// https://on.cypress.io/reload
cy.reload();
// reload the page without using the cache
cy.reload(true);
});
it("cy.visit() - visit a remote url", () => {
// https://on.cypress.io/visit
// Visit any sub-domain of your current domain
// Pass options to the visit
cy.visit("https://example.cypress.io/commands/navigation", {
timeout: 50000, // increase total time for the visit to resolve
onBeforeLoad(contentWindow) {
// contentWindow is the remote page's window object
expect(typeof contentWindow === "object").to.be.true;
},
onLoad(contentWindow) {
// contentWindow is the remote page's window object
expect(typeof contentWindow === "object").to.be.true;
}
});
});
});

View File

@@ -1,165 +0,0 @@
/// <reference types="cypress" />
context("Network Requests", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/network-requests");
});
// Manage HTTP requests in your app
it("cy.request() - make an XHR request", () => {
// https://on.cypress.io/request
cy.request("https://jsonplaceholder.cypress.io/comments").should((response) => {
expect(response.status).to.eq(200);
// the server sometimes gets an extra comment posted from another machine
// which gets returned as 1 extra object
expect(response.body).to.have.property("length").and.be.oneOf([500, 501]);
expect(response).to.have.property("headers");
expect(response).to.have.property("duration");
});
});
it("cy.request() - verify response using BDD syntax", () => {
cy.request("https://jsonplaceholder.cypress.io/comments").then((response) => {
// https://on.cypress.io/assertions
expect(response).property("status").to.equal(200);
expect(response).property("body").to.have.property("length").and.be.oneOf([500, 501]);
expect(response).to.include.keys("headers", "duration");
});
});
it("cy.request() with query parameters", () => {
// will execute request
// https://jsonplaceholder.cypress.io/comments?postId=1&id=3
cy.request({
url: "https://jsonplaceholder.cypress.io/comments",
qs: {
postId: 1,
id: 3
}
})
.its("body")
.should("be.an", "array")
.and("have.length", 1)
.its("0") // yields first element of the array
.should("contain", {
postId: 1,
id: 3
});
});
it("cy.request() - pass result to the second request", () => {
// first, let's find out the userId of the first user we have
cy.request("https://jsonplaceholder.cypress.io/users?_limit=1")
.its("body") // yields the response object
.its("0") // yields the first element of the returned list
// the above two commands its('body').its('0')
// can be written as its('body.0')
// if you do not care about TypeScript checks
.then((user) => {
expect(user).property("id").to.be.a("number");
// make a new post on behalf of the user
cy.request("POST", "https://jsonplaceholder.cypress.io/posts", {
userId: user.id,
title: "Cypress Test Runner",
body: "Fast, easy and reliable testing for anything that runs in a browser."
});
})
// note that the value here is the returned value of the 2nd request
// which is the new post object
.then((response) => {
expect(response).property("status").to.equal(201); // new entity created
expect(response).property("body").to.contain({
title: "Cypress Test Runner"
});
// we don't know the exact post id - only that it will be > 100
// since JSONPlaceholder has built-in 100 posts
expect(response.body).property("id").to.be.a("number").and.to.be.gt(100);
// we don't know the user id here - since it was in above closure
// so in this test just confirm that the property is there
expect(response.body).property("userId").to.be.a("number");
});
});
it("cy.request() - save response in the shared test context", () => {
// https://on.cypress.io/variables-and-aliases
cy.request("https://jsonplaceholder.cypress.io/users?_limit=1")
.its("body")
.its("0") // yields the first element of the returned list
.as("user") // saves the object in the test context
.then(function () {
// NOTE 👀
// By the time this callback runs the "as('user')" command
// has saved the user object in the test context.
// To access the test context we need to use
// the "function () { ... }" callback form,
// otherwise "this" points at a wrong or undefined object!
cy.request("POST", "https://jsonplaceholder.cypress.io/posts", {
userId: this.user.id,
title: "Cypress Test Runner",
body: "Fast, easy and reliable testing for anything that runs in a browser."
})
.its("body")
.as("post"); // save the new post from the response
})
.then(function () {
// When this callback runs, both "cy.request" API commands have finished
// and the test context has "user" and "post" objects set.
// Let's verify them.
expect(this.post, "post has the right user id").property("userId").to.equal(this.user.id);
});
});
it("cy.intercept() - route responses to matching requests", () => {
// https://on.cypress.io/intercept
let message = "whoa, this comment does not exist";
// Listen to GET to comments/1
cy.intercept("GET", "**/comments/*").as("getComment");
// we have code that gets a comment when
// the button is clicked in scripts.js
cy.get(".network-btn").click();
// https://on.cypress.io/wait
cy.wait("@getComment").its("response.statusCode").should("be.oneOf", [200, 304]);
// Listen to POST to comments
cy.intercept("POST", "**/comments").as("postComment");
// we have code that posts a comment when
// the button is clicked in scripts.js
cy.get(".network-post").click();
cy.wait("@postComment").should(({ request, response }) => {
expect(request.body).to.include("email");
expect(request.headers).to.have.property("content-type");
expect(response && response.body).to.have.property("name", "Using POST in cy.intercept()");
});
// Stub a response to PUT comments/ ****
cy.intercept(
{
method: "PUT",
url: "**/comments/*"
},
{
statusCode: 404,
body: { error: message },
headers: { "access-control-allow-origin": "*" },
delayMs: 500
}
).as("putComment");
// we have code that puts a comment when
// the button is clicked in scripts.js
cy.get(".network-put").click();
cy.wait("@putComment");
// our 404 statusCode logic in scripts.js executed
cy.get(".network-put-comment").should("contain", message);
});
});

View File

@@ -1,100 +0,0 @@
/// <reference types="cypress" />
context("Querying", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/querying");
});
// The most commonly used query is 'cy.get()', you can
// think of this like the '$' in jQuery
it("cy.get() - query DOM elements", () => {
// https://on.cypress.io/get
cy.get("#query-btn").should("contain", "Button");
cy.get(".query-btn").should("contain", "Button");
cy.get("#querying .well>button:first").should("contain", "Button");
// ↲
// Use CSS selectors just like jQuery
cy.get('[data-test-id="test-example"]').should("have.class", "example");
// 'cy.get()' yields jQuery object, you can get its attribute
// by invoking `.attr()` method
cy.get('[data-test-id="test-example"]').invoke("attr", "data-test-id").should("equal", "test-example");
// or you can get element's CSS property
cy.get('[data-test-id="test-example"]').invoke("css", "position").should("equal", "static");
// or use assertions directly during 'cy.get()'
// https://on.cypress.io/assertions
cy.get('[data-test-id="test-example"]')
.should("have.attr", "data-test-id", "test-example")
.and("have.css", "position", "static");
});
it("cy.contains() - query DOM elements with matching content", () => {
// https://on.cypress.io/contains
cy.get(".query-list").contains("bananas").should("have.class", "third");
// we can pass a regexp to `.contains()`
cy.get(".query-list").contains(/^b\w+/).should("have.class", "third");
cy.get(".query-list").contains("apples").should("have.class", "first");
// passing a selector to contains will
// yield the selector containing the text
cy.get("#querying").contains("ul", "oranges").should("have.class", "query-list");
cy.get(".query-button").contains("Save Form").should("have.class", "btn");
});
it(".within() - query DOM elements within a specific element", () => {
// https://on.cypress.io/within
cy.get(".query-form").within(() => {
cy.get("input:first").should("have.attr", "placeholder", "Email");
cy.get("input:last").should("have.attr", "placeholder", "Password");
});
});
it("cy.root() - query the root DOM element", () => {
// https://on.cypress.io/root
// By default, root is the document
cy.root().should("match", "html");
cy.get(".query-ul").within(() => {
// In this within, the root is now the ul DOM element
cy.root().should("have.class", "query-ul");
});
});
it("best practices - selecting elements", () => {
// https://on.cypress.io/best-practices#Selecting-Elements
cy.get("[data-cy=best-practices-selecting-elements]").within(() => {
// Worst - too generic, no context
cy.get("button").click();
// Bad. Coupled to styling. Highly subject to change.
cy.get(".btn.btn-large").click();
// Average. Coupled to the `name` attribute which has HTML semantics.
cy.get("[name=submission]").click();
// Better. But still coupled to styling or JS event listeners.
cy.get("#main").click();
// Slightly better. Uses an ID but also ensures the element
// has an ARIA role attribute
cy.get("#main[role=button]").click();
// Much better. But still coupled to text content that may change.
cy.contains("Submit").click();
// Best. Insulated from all changes.
cy.get("[data-cy=submit]").click();
});
});
});

View File

@@ -1,203 +0,0 @@
/// <reference types="cypress" />
// remove no check once Cypress.sinon is typed
// https://github.com/cypress-io/cypress/issues/6720
context("Spies, Stubs, and Clock", () => {
it("cy.spy() - wrap a method in a spy", () => {
// https://on.cypress.io/spy
cy.visit("https://example.cypress.io/commands/spies-stubs-clocks");
const obj = {
foo() {}
};
const spy = cy.spy(obj, "foo").as("anyArgs");
obj.foo();
expect(spy).to.be.called;
});
it("cy.spy() retries until assertions pass", () => {
cy.visit("https://example.cypress.io/commands/spies-stubs-clocks");
const obj = {
/**
* Prints the argument passed
* @param x {any}
*/
foo(x) {
console.log("obj.foo called with", x);
}
};
cy.spy(obj, "foo").as("foo");
setTimeout(() => {
obj.foo("first");
}, 500);
setTimeout(() => {
obj.foo("second");
}, 2500);
cy.get("@foo").should("have.been.calledTwice");
});
it("cy.stub() - create a stub and/or replace a function with stub", () => {
// https://on.cypress.io/stub
cy.visit("https://example.cypress.io/commands/spies-stubs-clocks");
const obj = {
/**
* prints both arguments to the console
* @param a {string}
* @param b {string}
*/
foo(a, b) {
console.log("a", a, "b", b);
}
};
const stub = cy.stub(obj, "foo").as("foo");
obj.foo("foo", "bar");
expect(stub).to.be.called;
});
it("cy.clock() - control time in the browser", () => {
// https://on.cypress.io/clock
// create the date in UTC so its always the same
// no matter what local timezone the browser is running in
const now = new Date(Date.UTC(2017, 2, 14)).getTime();
cy.clock(now);
cy.visit("https://example.cypress.io/commands/spies-stubs-clocks");
cy.get("#clock-div").click().should("have.text", "1489449600");
});
it("cy.tick() - move time in the browser", () => {
// https://on.cypress.io/tick
// create the date in UTC so its always the same
// no matter what local timezone the browser is running in
const now = new Date(Date.UTC(2017, 2, 14)).getTime();
cy.clock(now);
cy.visit("https://example.cypress.io/commands/spies-stubs-clocks");
cy.get("#tick-div").click().should("have.text", "1489449600");
cy.tick(10000); // 10 seconds passed
cy.get("#tick-div").click().should("have.text", "1489449610");
});
it("cy.stub() matches depending on arguments", () => {
// see all possible matchers at
// https://sinonjs.org/releases/latest/matchers/
const greeter = {
/**
* Greets a person
* @param {string} name
*/
greet(name) {
return `Hello, ${name}!`;
}
};
cy.stub(greeter, "greet")
.callThrough() // if you want non-matched calls to call the real method
.withArgs(Cypress.sinon.match.string)
.returns("Hi")
.withArgs(Cypress.sinon.match.number)
.throws(new Error("Invalid name"));
expect(greeter.greet("World")).to.equal("Hi");
// @ts-ignore
expect(() => greeter.greet(42)).to.throw("Invalid name");
expect(greeter.greet).to.have.been.calledTwice;
// non-matched calls goes the actual method
// @ts-ignore
expect(greeter.greet()).to.equal("Hello, undefined!");
});
it("matches call arguments using Sinon matchers", () => {
// see all possible matchers at
// https://sinonjs.org/releases/latest/matchers/
const calculator = {
/**
* returns the sum of two arguments
* @param a {number}
* @param b {number}
*/
add(a, b) {
return a + b;
}
};
const spy = cy.spy(calculator, "add").as("add");
expect(calculator.add(2, 3)).to.equal(5);
// if we want to assert the exact values used during the call
expect(spy).to.be.calledWith(2, 3);
// let's confirm "add" method was called with two numbers
expect(spy).to.be.calledWith(Cypress.sinon.match.number, Cypress.sinon.match.number);
// alternatively, provide the value to match
expect(spy).to.be.calledWith(Cypress.sinon.match(2), Cypress.sinon.match(3));
// match any value
expect(spy).to.be.calledWith(Cypress.sinon.match.any, 3);
// match any value from a list
expect(spy).to.be.calledWith(Cypress.sinon.match.in([1, 2, 3]), 3);
/**
* Returns true if the given number is event
* @param {number} x
*/
const isEven = (x) => x % 2 === 0;
// expect the value to pass a custom predicate function
// the second argument to "sinon.match(predicate, message)" is
// shown if the predicate does not pass and assertion fails
expect(spy).to.be.calledWith(Cypress.sinon.match(isEven, "isEven"), 3);
/**
* Returns a function that checks if a given number is larger than the limit
* @param {number} limit
* @returns {(x: number) => boolean}
*/
const isGreaterThan = (limit) => (x) => x > limit;
/**
* Returns a function that checks if a given number is less than the limit
* @param {number} limit
* @returns {(x: number) => boolean}
*/
const isLessThan = (limit) => (x) => x < limit;
// you can combine several matchers using "and", "or"
expect(spy).to.be.calledWith(
Cypress.sinon.match.number,
Cypress.sinon.match(isGreaterThan(2), "> 2").and(Cypress.sinon.match(isLessThan(4), "< 4"))
);
expect(spy).to.be.calledWith(
Cypress.sinon.match.number,
Cypress.sinon.match(isGreaterThan(200), "> 200").or(Cypress.sinon.match(3))
);
// matchers can be used from BDD assertions
cy.get("@add").should("have.been.calledWith", Cypress.sinon.match.number, Cypress.sinon.match(3));
// you can alias matchers for shorter test code
const { match: M } = Cypress.sinon;
cy.get("@add").should("have.been.calledWith", M.number, M(3));
});
});

View File

@@ -1,97 +0,0 @@
/// <reference types="cypress" />
context("Traversal", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/traversal");
});
it(".children() - get child DOM elements", () => {
// https://on.cypress.io/children
cy.get(".traversal-breadcrumb").children(".active").should("contain", "Data");
});
it(".closest() - get closest ancestor DOM element", () => {
// https://on.cypress.io/closest
cy.get(".traversal-badge").closest("ul").should("have.class", "list-group");
});
it(".eq() - get a DOM element at a specific index", () => {
// https://on.cypress.io/eq
cy.get(".traversal-list>li").eq(1).should("contain", "siamese");
});
it(".filter() - get DOM elements that match the selector", () => {
// https://on.cypress.io/filter
cy.get(".traversal-nav>li").filter(".active").should("contain", "About");
});
it(".find() - get descendant DOM elements of the selector", () => {
// https://on.cypress.io/find
cy.get(".traversal-pagination").find("li").find("a").should("have.length", 7);
});
it(".first() - get first DOM element", () => {
// https://on.cypress.io/first
cy.get(".traversal-table td").first().should("contain", "1");
});
it(".last() - get last DOM element", () => {
// https://on.cypress.io/last
cy.get(".traversal-buttons .btn").last().should("contain", "Submit");
});
it(".next() - get next sibling DOM element", () => {
// https://on.cypress.io/next
cy.get(".traversal-ul").contains("apples").next().should("contain", "oranges");
});
it(".nextAll() - get all next sibling DOM elements", () => {
// https://on.cypress.io/nextall
cy.get(".traversal-next-all").contains("oranges").nextAll().should("have.length", 3);
});
it(".nextUntil() - get next sibling DOM elements until next el", () => {
// https://on.cypress.io/nextuntil
cy.get("#veggies").nextUntil("#nuts").should("have.length", 3);
});
it(".not() - remove DOM elements from set of DOM elements", () => {
// https://on.cypress.io/not
cy.get(".traversal-disabled .btn").not("[disabled]").should("not.contain", "Disabled");
});
it(".parent() - get parent DOM element from DOM elements", () => {
// https://on.cypress.io/parent
cy.get(".traversal-mark").parent().should("contain", "Morbi leo risus");
});
it(".parents() - get parent DOM elements from DOM elements", () => {
// https://on.cypress.io/parents
cy.get(".traversal-cite").parents().should("match", "blockquote");
});
it(".parentsUntil() - get parent DOM elements from DOM elements until el", () => {
// https://on.cypress.io/parentsuntil
cy.get(".clothes-nav").find(".active").parentsUntil(".clothes-nav").should("have.length", 2);
});
it(".prev() - get previous sibling DOM element", () => {
// https://on.cypress.io/prev
cy.get(".birds").find(".active").prev().should("contain", "Lorikeets");
});
it(".prevAll() - get all previous sibling DOM elements", () => {
// https://on.cypress.io/prevall
cy.get(".fruits-list").find(".third").prevAll().should("have.length", 2);
});
it(".prevUntil() - get all previous sibling DOM elements until el", () => {
// https://on.cypress.io/prevuntil
cy.get(".foods-list").find("#nuts").prevUntil("#veggies").should("have.length", 3);
});
it(".siblings() - get all sibling DOM elements", () => {
// https://on.cypress.io/siblings
cy.get(".traversal-pills .active").siblings().should("have.length", 2);
});
});

View File

@@ -1,108 +0,0 @@
/// <reference types="cypress" />
context("Utilities", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/utilities");
});
it("Cypress._ - call a lodash method", () => {
// https://on.cypress.io/_
cy.request("https://jsonplaceholder.cypress.io/users").then((response) => {
let ids = Cypress._.chain(response.body).map("id").take(3).value();
expect(ids).to.deep.eq([1, 2, 3]);
});
});
it("Cypress.$ - call a jQuery method", () => {
// https://on.cypress.io/$
let $li = Cypress.$(".utility-jquery li:first");
cy.wrap($li).should("not.have.class", "active").click().should("have.class", "active");
});
it("Cypress.Blob - blob utilities and base64 string conversion", () => {
// https://on.cypress.io/blob
cy.get(".utility-blob").then(($div) => {
// https://github.com/nolanlawson/blob-util#imgSrcToDataURL
// get the dataUrl string for the javascript-logo
return Cypress.Blob.imgSrcToDataURL(
"https://example.cypress.io/assets/img/javascript-logo.png",
undefined,
"anonymous"
).then((dataUrl) => {
// create an <img> element and set its src to the dataUrl
let img = Cypress.$("<img />", { src: dataUrl });
// need to explicitly return cy here since we are initially returning
// the Cypress.Blob.imgSrcToDataURL promise to our test
// append the image
$div.append(img);
cy.get(".utility-blob img").click().should("have.attr", "src", dataUrl);
});
});
});
it("Cypress.minimatch - test out glob patterns against strings", () => {
// https://on.cypress.io/minimatch
let matching = Cypress.minimatch("/users/1/comments", "/users/*/comments", {
matchBase: true
});
expect(matching, "matching wildcard").to.be.true;
matching = Cypress.minimatch("/users/1/comments/2", "/users/*/comments", {
matchBase: true
});
expect(matching, "comments").to.be.false;
// ** matches against all downstream path segments
matching = Cypress.minimatch("/foo/bar/baz/123/quux?a=b&c=2", "/foo/**", {
matchBase: true
});
expect(matching, "comments").to.be.true;
// whereas * matches only the next path segment
matching = Cypress.minimatch("/foo/bar/baz/123/quux?a=b&c=2", "/foo/*", {
matchBase: false
});
expect(matching, "comments").to.be.false;
});
it("Cypress.Promise - instantiate a bluebird promise", () => {
// https://on.cypress.io/promise
let waited = false;
/**
* @return Bluebird<string>
*/
function waitOneSecond() {
// return a promise that resolves after 1 second
// @ts-ignore TS2351 (new Cypress.Promise)
return new Cypress.Promise((resolve, reject) => {
setTimeout(() => {
// set waited to true
waited = true;
// resolve with 'foo' string
resolve("foo");
}, 1000);
});
}
cy.then(() => {
// return a promise to cy.then() that
// is awaited until it resolves
// @ts-ignore TS7006
return waitOneSecond().then((str) => {
expect(str).to.eq("foo");
expect(waited).to.be.true;
});
});
});
});

View File

@@ -1,59 +0,0 @@
/// <reference types="cypress" />
context("Viewport", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/viewport");
});
it("cy.viewport() - set the viewport size and dimension", () => {
// https://on.cypress.io/viewport
cy.get("#navbar").should("be.visible");
cy.viewport(320, 480);
// the navbar should have collapse since our screen is smaller
cy.get("#navbar").should("not.be.visible");
cy.get(".navbar-toggle").should("be.visible").click();
cy.get(".nav").find("a").should("be.visible");
// lets see what our app looks like on a super large screen
cy.viewport(2999, 2999);
// cy.viewport() accepts a set of preset sizes
// to easily set the screen to a device's width and height
// We added a cy.wait() between each viewport change so you can see
// the change otherwise it is a little too fast to see :)
cy.viewport("macbook-15");
cy.wait(200);
cy.viewport("macbook-13");
cy.wait(200);
cy.viewport("macbook-11");
cy.wait(200);
cy.viewport("ipad-2");
cy.wait(200);
cy.viewport("ipad-mini");
cy.wait(200);
cy.viewport("iphone-6+");
cy.wait(200);
cy.viewport("iphone-6");
cy.wait(200);
cy.viewport("iphone-5");
cy.wait(200);
cy.viewport("iphone-4");
cy.wait(200);
cy.viewport("iphone-3");
cy.wait(200);
// cy.viewport() accepts an orientation for all presets
// the default orientation is 'portrait'
cy.viewport("ipad-2", "portrait");
cy.wait(200);
cy.viewport("iphone-4", "landscape");
cy.wait(200);
// The viewport will be reset back to the default dimensions
// in between tests (the default can be set in cypress.json)
});
});

View File

@@ -1,31 +0,0 @@
/// <reference types="cypress" />
context("Waiting", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/waiting");
});
// BE CAREFUL of adding unnecessary wait times.
// https://on.cypress.io/best-practices#Unnecessary-Waiting
// https://on.cypress.io/wait
it("cy.wait() - wait for a specific amount of time", () => {
cy.get(".wait-input1").type("Wait 1000ms after typing");
cy.wait(1000);
cy.get(".wait-input2").type("Wait 1000ms after typing");
cy.wait(1000);
cy.get(".wait-input3").type("Wait 1000ms after typing");
cy.wait(1000);
});
it("cy.wait() - wait for a specific route", () => {
// Listen to GET to comments/1
cy.intercept("GET", "**/comments/*").as("getComment");
// we have code that gets a comment when
// the button is clicked in scripts.js
cy.get(".network-btn").click();
// wait for GET comments/1
cy.wait("@getComment").its("response.statusCode").should("be.oneOf", [200, 304]);
});
});

View File

@@ -1,22 +0,0 @@
/// <reference types="cypress" />
context("Window", () => {
beforeEach(() => {
cy.visit("https://example.cypress.io/commands/window");
});
it("cy.window() - get the global window object", () => {
// https://on.cypress.io/window
cy.window().should("have.property", "top");
});
it("cy.document() - get the document object", () => {
// https://on.cypress.io/document
cy.document().should("have.property", "charset").and("eq", "UTF-8");
});
it("cy.title() - get the title", () => {
// https://on.cypress.io/title
cy.title().should("include", "Kitchen Sink");
});
});

View File

@@ -1,5 +0,0 @@
{
"name": "Using fixtures to represent data",
"email": "hello@cypress.io",
"body": "Fixtures are a great way to mock data for responses to routes"
}

View File

@@ -1,5 +0,0 @@
{
"id": 8739,
"name": "Jane",
"email": "jane@example.com"
}

View File

@@ -1 +0,0 @@
[]

View File

@@ -1,22 +0,0 @@
/// <reference types="cypress" />
// ***********************************************************
// This example plugins/index.jsx can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
/**
* @type {Cypress.PluginConfig}
*/
// eslint-disable-next-line no-unused-vars
module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
};

View File

@@ -1,27 +0,0 @@
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add('login', (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
import "@testing-library/cypress/add-commands";

View File

@@ -1,20 +0,0 @@
// ***********************************************************
// This example support/index.jsx is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import "./commands";
// Alternatively you can use CommonJS syntax:
// require('./commands')

View File

@@ -1,8 +0,0 @@
{
"compilerOptions": {
"allowJs": true,
"baseUrl": "../node_modules",
"types": ["cypress"]
},
"include": ["**/*.*"]
}

View File

@@ -2,9 +2,9 @@ import globals from "globals";
import pluginJs from "@eslint/js";
import pluginReact from "eslint-plugin-react";
/** @type {import('eslint').Linter.Config[]} */
/** @type {import("eslint").Linter.Config[]} */
export default [
{ ignores: ["node_modules/**", "dist/**", "build/**", "dev-dist/**"] },
{
files: ["**/*.{js,mjs,cjs,jsx}"]
},
@@ -12,9 +12,13 @@ export default [
pluginJs.configs.recommended,
{
...pluginReact.configs.flat.recommended,
settings: {
react: { version: "detect" }
},
rules: {
...pluginReact.configs.flat.recommended.rules,
"react/prop-types": 0
"react/prop-types": 0,
"react/no-children-prop": 0 // Disable react/no-children-prop rule
}
},
pluginReact.configs.flat["jsx-runtime"]

View File

@@ -62,52 +62,20 @@
t = d.getElementsByTagName("script")[0];
t.parentNode.insertBefore(s, t);
</script>
<% } %>
<script>
!(function () {
"use strict";
var e = [
"debug",
"destroy",
"do",
"help",
"identify",
"is",
"off",
"on",
"ready",
"render",
"reset",
"safe",
"set"
];
if (window.noticeable) console.warn("Noticeable SDK code snippet loaded more than once");
else {
var n = (window.noticeable = window.noticeable || []);
function t(e) {
return function () {
var t = Array.prototype.slice.call(arguments);
return t.unshift(e), n.push(t), n;
};
}
!(function () {
for (var o = 0; o < e.length; o++) {
var r = e[o];
n[r] = t(r);
}
})(),
(function () {
var e = document.createElement("script");
(e.async = !0), (e.src = "https://sdk.noticeable.io/l.js");
var n = document.head;
n.insertBefore(e, n.firstChild);
})();
}
<script type="text/javascript">
window.$crisp = [];
window.CRISP_WEBSITE_ID = "36724f62-2eb0-4b29-9cdd-9905fb99913e";
(function () {
d = document;
s = d.createElement("script");
s.src = "https://client.crisp.chat/l.js";
s.async = 1;
d.getElementsByTagName("head")[0].appendChild(s);
})();
</script>
<% } %>
<script>!function(w,d,i,s){function l(){if(!d.getElementById(i)){var f=d.getElementsByTagName(s)[0],e=d.createElement(s);e.type="text/javascript",e.async=!0,e.src="https://canny.io/sdk.js",f.parentNode.insertBefore(e,f)}}if("function"!=typeof w.Canny){var c=function(){c.q.push(arguments)};c.q=[],w.Canny=c,"complete"===d.readyState?l():w.attachEvent?w.attachEvent("onload",l):w.addEventListener("load",l,!1)}}(window,document,"canny-jssdk","script");</script>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>

15133
client/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -2,84 +2,90 @@
"name": "bodyshop",
"version": "0.2.1",
"engines": {
"node": ">=18.18.2"
"node": ">=22.0.0"
},
"type": "module",
"private": true,
"proxy": "http://localhost:4000",
"dependencies": {
"@ant-design/pro-layout": "^7.19.12",
"@apollo/client": "^3.11.8",
"@emotion/is-prop-valid": "^1.3.1",
"@fingerprintjs/fingerprintjs": "^4.5.0",
"@amplitude/analytics-browser": "^2.31.3",
"@ant-design/pro-layout": "^7.22.6",
"@apollo/client": "^3.13.9",
"@emotion/is-prop-valid": "^1.4.0",
"@fingerprintjs/fingerprintjs": "^4.6.1",
"@firebase/analytics": "^0.10.19",
"@firebase/app": "^0.14.6",
"@firebase/auth": "^1.11.1",
"@firebase/firestore": "^4.9.2",
"@firebase/messaging": "^0.12.22",
"@jsreport/browser-client": "^3.1.0",
"@reduxjs/toolkit": "^2.2.7",
"@sentry/cli": "^2.36.2",
"@sentry/react": "^7.114.0",
"@splitsoftware/splitio-react": "^1.13.0",
"@tanem/react-nprogress": "^5.0.51",
"@vitejs/plugin-react": "^4.3.1",
"antd": "^5.20.1",
"@reduxjs/toolkit": "^2.11.0",
"@sentry/cli": "^2.58.2",
"@sentry/react": "^9.43.0",
"@sentry/vite-plugin": "^4.6.1",
"@splitsoftware/splitio-react": "^2.6.1",
"@tanem/react-nprogress": "^5.0.56",
"antd": "^5.28.1",
"apollo-link-logger": "^2.0.1",
"apollo-link-sentry": "^3.3.0",
"apollo-link-sentry": "^4.4.0",
"autosize": "^6.0.1",
"axios": "^1.7.7",
"axios": "^1.13.2",
"classnames": "^2.5.1",
"css-box-model": "^1.2.1",
"dayjs": "^1.11.13",
"dayjs-business-days2": "^1.2.2",
"dayjs": "^1.11.19",
"dayjs-business-days2": "^1.3.2",
"dinero.js": "^1.9.1",
"dotenv": "^16.4.5",
"dotenv": "^17.2.3",
"env-cmd": "^10.1.0",
"exifr": "^7.1.3",
"firebase": "^10.13.2",
"graphql": "^16.9.0",
"i18next": "^23.15.1",
"i18next-browser-languagedetector": "^8.0.0",
"graphql": "^16.12.0",
"i18next": "^25.7.1",
"i18next-browser-languagedetector": "^8.2.0",
"immutability-helper": "^3.1.1",
"libphonenumber-js": "^1.11.9",
"logrocket": "^8.1.2",
"markerjs2": "^2.32.2",
"libphonenumber-js": "^1.12.31",
"lightningcss": "^1.30.2",
"logrocket": "^9.0.2",
"markerjs2": "^2.32.7",
"memoize-one": "^6.0.0",
"normalize-url": "^8.0.1",
"normalize-url": "^8.1.0",
"object-hash": "^3.0.0",
"phone": "^3.1.67",
"posthog-js": "^1.299.0",
"prop-types": "^15.8.1",
"query-string": "^9.1.0",
"query-string": "^9.3.1",
"raf-schd": "^4.0.3",
"react": "^18.3.1",
"react-big-calendar": "^1.14.1",
"react-big-calendar": "^1.19.4",
"react-color": "^2.19.3",
"react-cookie": "^7.2.0",
"react-cookie": "^8.0.1",
"react-dom": "^18.3.1",
"react-drag-listview": "^2.0.0",
"react-grid-gallery": "^1.0.1",
"react-grid-layout": "1.3.4",
"react-i18next": "^14.1.3",
"react-icons": "^5.3.0",
"react-i18next": "^15.7.3",
"react-icons": "^5.5.0",
"react-image-lightbox": "^5.1.4",
"react-markdown": "^9.0.1",
"react-number-format": "^5.4.2",
"react-markdown": "^10.1.0",
"react-number-format": "^5.4.3",
"react-popopo": "^2.1.9",
"react-product-fruits": "^2.2.61",
"react-redux": "^9.1.2",
"react-product-fruits": "^2.2.62",
"react-redux": "^9.2.0",
"react-resizable": "^3.0.5",
"react-router-dom": "^6.26.2",
"react-router-dom": "^6.30.0",
"react-sticky": "^6.0.3",
"react-virtualized": "^9.22.5",
"react-virtuoso": "^4.10.4",
"recharts": "^2.12.7",
"react-virtuoso": "^4.16.1",
"recharts": "^2.15.2",
"redux": "^5.0.1",
"redux-actions": "^3.0.3",
"redux-persist": "^6.0.0",
"redux-saga": "^1.3.0",
"redux-saga": "^1.4.2",
"redux-state-sync": "^3.1.4",
"reselect": "^5.1.1",
"sass": "^1.79.3",
"socket.io-client": "^4.8.0",
"styled-components": "^6.1.13",
"sass": "^1.94.2",
"socket.io-client": "^4.8.1",
"styled-components": "^6.1.19",
"subscriptions-transport-ws": "^0.11.0",
"use-memo-one": "^1.1.3",
"userpilot": "^1.3.6",
"vite-plugin-ejs": "^1.7.0",
"web-vitals": "^3.5.2"
},
@@ -96,11 +102,17 @@
"build:test:rome": "env-cmd -f .env.test.rome npm run build",
"build:production:imex": "env-cmd -f .env.production.imex npm run build",
"build:production:rome": "env-cmd -f .env.production.rome npm run build",
"test": "cypress open",
"eject": "react-scripts eject",
"madge": "madge --image ./madge-graph.svg --extensions js,jsx,ts,tsx --circular .",
"eulaize": "node src/utils/eulaize.js",
"sentry:sourcemaps:imex": "sentry-cli sourcemaps inject --org imex --project imexonline ./build && sentry-cli sourcemaps upload --org imex --project imexonline ./build"
"test:unit": "vitest run",
"test:watch": "vitest",
"test:e2e:imex": "playwright test --config playwright.config.js",
"test:e2e:rome": "playwright test --config playwright.rome.config.js",
"test:e2e:imex:headed": "playwright test --config playwright.config.js --headed",
"test:e2e:rome:headed": "playwright test --config playwright.rome.config.js --headed",
"test:e2e:report": "playwright show-report",
"lint": "eslint .",
"lint:fix": "eslint . --fix"
},
"browserslist": {
"production": [
@@ -121,36 +133,39 @@
"@rollup/rollup-linux-x64-gnu": "4.6.1"
},
"devDependencies": {
"@ant-design/icons": "^5.5.1",
"@ant-design/icons": "^6.1.0",
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@babel/preset-react": "^7.24.7",
"@dotenvx/dotenvx": "^1.14.1",
"@emotion/babel-plugin": "^11.12.0",
"@emotion/react": "^11.13.3",
"@eslint/js": "^9.15.0",
"@sentry/webpack-plugin": "^2.22.4",
"@testing-library/cypress": "^10.0.2",
"browserslist": "^4.23.3",
"@babel/preset-react": "^7.28.5",
"@dotenvx/dotenvx": "^1.51.1",
"@emotion/babel-plugin": "^11.13.5",
"@emotion/react": "^11.14.0",
"@eslint/js": "^9.39.1",
"@playwright/test": "^1.57.0",
"@sentry/webpack-plugin": "^4.6.1",
"@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.0",
"@vitejs/plugin-react": "^4.6.0",
"browserslist": "^4.28.0",
"browserslist-to-esbuild": "^2.1.1",
"chalk": "^5.3.0",
"cross-env": "^7.0.3",
"cypress": "^13.14.2",
"eslint": "^8.57.1",
"eslint-config-react-app": "^7.0.1",
"eslint-plugin-cypress": "^2.15.1",
"eslint-plugin-react": "^7.37.2",
"globals": "^15.12.0",
"memfs": "^4.12.0",
"chalk": "^5.6.2",
"eslint": "^9.39.1",
"eslint-plugin-react": "^7.37.5",
"globals": "^15.15.0",
"jsdom": "^26.0.0",
"memfs": "^4.51.1",
"os-browserify": "^0.3.0",
"react-error-overlay": "6.0.11",
"playwright": "^1.57.0",
"react-error-overlay": "^6.1.0",
"redux-logger": "^3.0.6",
"source-map-explorer": "^2.5.3",
"vite": "^5.4.7",
"vite-plugin-babel": "^1.2.0",
"vite": "^7.2.6",
"vite-plugin-babel": "^1.3.2",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-node-polyfills": "^0.22.0",
"vite-plugin-pwa": "^0.20.5",
"vite-plugin-node-polyfills": "^0.24.0",
"vite-plugin-pwa": "^1.2.0",
"vite-plugin-style-import": "^2.0.0",
"workbox-window": "^7.1.0"
"vitest": "^3.2.4",
"workbox-window": "^7.4.0"
}
}

View File

@@ -0,0 +1,26 @@
import { defineConfig } from "@playwright/test";
import dotenv from "dotenv";
dotenv.config({
path: "./.env.development.imex",
prefix: "TEST_"
});
export default defineConfig({
testDir: "./tests/e2e",
testMatch: "*.e2e.js",
timeout: 60 * 1000,
reporter: [["list"], ["html"]],
use: {
baseURL: "https://localhost:3000",
browser: "chromium",
ignoreHTTPSErrors: true
},
webServer: {
command: "npm run start:imex",
ignoreHTTPSErrors: true,
url: "https://localhost:3000/health", // Health check endpoint will tell us when the server is ready
// eslint-disable-next-line no-undef
reuseExistingServer: !process.env.CI // Reuse server locally, not in CI
}
});

View File

@@ -0,0 +1,26 @@
import { defineConfig } from "@playwright/test";
import dotenv from "dotenv";
dotenv.config({
path: "./.env.development.rome",
prefix: "TEST_"
});
export default defineConfig({
testDir: "./tests/e2e",
testMatch: "*.e2e.js",
timeout: 60 * 1000,
reporter: [["list"], ["html"]],
use: {
baseURL: "https://localhost:3000",
browser: "chromium",
ignoreHTTPSErrors: true
},
webServer: {
command: "npm run start:rome",
ignoreHTTPSErrors: true,
url: "https://localhost:3000/health", // Health check endpoint will tell us when the server is ready
// eslint-disable-next-line no-undef
reuseExistingServer: !process.env.CI // Reuse server locally, not in CI
}
});

View File

@@ -1,5 +1,7 @@
// Scripts for firebase and firebase messaging
// eslint-disable-next-line no-undef
importScripts("https://www.gstatic.com/firebasejs/10.14.1/firebase-app-compat.js");
// eslint-disable-next-line no-undef
importScripts("https://www.gstatic.com/firebasejs/10.14.1/firebase-messaging-compat.js");
// Initialize the Firebase app in the service worker by passing the generated config
@@ -42,13 +44,16 @@ switch (this.location.hostname) {
};
}
// eslint-disable-next-line no-undef
firebase.initializeApp(firebaseConfig);
// Retrieve firebase messaging
// eslint-disable-next-line no-undef
const messaging = firebase.messaging();
messaging.onBackgroundMessage(function (payload) {
// Customize notification here
console.log("[firebase-messaging-sw.js] Received background message ", payload);
// eslint-disable-next-line no-undef
self.registration.showNotification(notificationTitle, notificationOptions);
});

View File

@@ -1,54 +1,130 @@
import { ApolloProvider } from "@apollo/client";
import { SplitFactoryProvider, SplitSdk } from "@splitsoftware/splitio-react";
import * as Sentry from "@sentry/react";
import { SplitFactoryProvider, useSplitClient } from "@splitsoftware/splitio-react";
import { ConfigProvider } from "antd";
import enLocale from "antd/es/locale/en_US";
import React from "react";
import { useEffect, useMemo } from "react";
import { CookiesProvider } from "react-cookie";
import { useTranslation } from "react-i18next";
import { connect, useSelector } from "react-redux";
import { createStructuredSelector } from "reselect";
import GlobalLoadingBar from "../components/global-loading-bar/global-loading-bar.component";
import { setDarkMode } from "../redux/application/application.actions";
import { selectDarkMode } from "../redux/application/application.selectors";
import { selectCurrentUser } from "../redux/user/user.selectors.js";
import { signOutStart } from "../redux/user/user.actions";
import client from "../utils/GraphQLClient";
import App from "./App";
import * as Sentry from "@sentry/react";
import themeProvider from "./themeProvider";
import { Userpilot } from "userpilot";
// Initialize Userpilot
if (import.meta.env.DEV) {
Userpilot.initialize("NX-69145f08");
}
import getTheme from "./themeProvider";
// Base Split configuration
const config = {
core: {
authorizationKey: import.meta.env.VITE_APP_SPLIT_API,
key: "anon"
}
};
export const factory = SplitSdk(config);
function AppContainer() {
function SplitClientProvider({ children }) {
const imexshopid = useSelector((state) => state.user.imexshopid);
const splitClient = useSplitClient({ key: imexshopid || "anon" });
useEffect(() => {
if (splitClient && imexshopid) {
console.log(`Split client initialized with key: ${imexshopid}, isReady: ${splitClient.isReady}`);
}
}, [splitClient, imexshopid]);
return children;
}
const mapStateToProps = createStructuredSelector({
currentUser: selectCurrentUser
});
const mapDispatchToProps = (dispatch) => ({
setDarkMode: (isDarkMode) => dispatch(setDarkMode(isDarkMode)),
signOutStart: () => dispatch(signOutStart())
});
function AppContainer({ currentUser, setDarkMode, signOutStart }) {
const { t } = useTranslation();
const isDarkMode = useSelector(selectDarkMode);
const theme = useMemo(() => getTheme(isDarkMode), [isDarkMode]);
// Global seamless logout listener with redirect to /signin
useEffect(() => {
const handleSeamlessLogout = (event) => {
if (event.data?.type !== "seamlessLogoutRequest") return;
const requestOrigin = event.origin;
if (currentUser?.authorized !== true) {
window.parent.postMessage(
{ type: "seamlessLogoutResponse", status: "already_logged_out" },
requestOrigin || "*"
);
return;
}
signOutStart();
window.parent.postMessage({ type: "seamlessLogoutResponse", status: "logged_out" }, requestOrigin || "*");
};
window.addEventListener("message", handleSeamlessLogout);
return () => {
window.removeEventListener("message", handleSeamlessLogout);
};
}, [signOutStart, currentUser]);
// Update data-theme attribute
useEffect(() => {
document.documentElement.setAttribute("data-theme", isDarkMode ? "dark" : "light");
return () => document.documentElement.removeAttribute("data-theme");
}, [isDarkMode]);
// Sync darkMode with localStorage
useEffect(() => {
if (currentUser?.uid) {
const savedMode = localStorage.getItem(`dark-mode-${currentUser.uid}`);
if (savedMode !== null) {
setDarkMode(JSON.parse(savedMode));
} else {
setDarkMode(false);
}
} else {
setDarkMode(false);
}
}, [currentUser?.uid, setDarkMode]);
// Persist darkMode
useEffect(() => {
if (currentUser?.uid) {
localStorage.setItem(`dark-mode-${currentUser.uid}`, JSON.stringify(isDarkMode));
}
}, [isDarkMode, currentUser?.uid]);
return (
<ApolloProvider client={client}>
<ConfigProvider
//componentSize="small"
input={{ autoComplete: "new-password" }}
locale={enLocale}
theme={themeProvider}
form={{
validateMessages: {
// eslint-disable-next-line no-template-curly-in-string
required: t("general.validation.required", { label: "${label}" })
}
}}
>
<GlobalLoadingBar />
<SplitFactoryProvider factory={factory}>
<App />
</SplitFactoryProvider>
</ConfigProvider>
</ApolloProvider>
<CookiesProvider>
<ApolloProvider client={client}>
<ConfigProvider
input={{ autoComplete: "new-password" }}
locale={enLocale}
theme={theme}
form={{
validateMessages: {
required: t("general.validation.required", { label: "${label}" })
}
}}
>
<GlobalLoadingBar />
<SplitFactoryProvider config={config}>
<SplitClientProvider>
<App />
</SplitClientProvider>
</SplitFactoryProvider>
</ConfigProvider>
</ApolloProvider>
</CookiesProvider>
);
}
export default Sentry.withProfiler(AppContainer);
export default Sentry.withProfiler(connect(mapStateToProps, mapDispatchToProps)(AppContainer));

View File

@@ -1,19 +1,20 @@
import { useSplitClient } from "@splitsoftware/splitio-react";
import { Button, Result } from "antd";
import LogRocket from "logrocket";
import React, { lazy, Suspense, useEffect, useState } from "react";
import { lazy, Suspense, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Route, Routes } from "react-router-dom";
import { Route, Routes, useNavigate } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import DocumentEditorContainer from "../components/document-editor/document-editor.container";
import ErrorBoundary from "../components/error-boundary/error-boundary.component"; // Component Imports
import ErrorBoundary from "../components/error-boundary/error-boundary.component";
import LoadingSpinner from "../components/loading-spinner/loading-spinner.component";
import DisclaimerPage from "../pages/disclaimer/disclaimer.page";
import LandingPage from "../pages/landing/landing.page";
import TechPageContainer from "../pages/tech/tech.page.container";
import { setOnline } from "../redux/application/application.actions";
import { selectOnline } from "../redux/application/application.selectors";
import SimplifiedPartsPageContainer from "../pages/simplified-parts/simplified-parts.page.container.jsx";
import { setIsPartsEntry, setOnline } from "../redux/application/application.actions";
import { selectIsPartsEntry, selectOnline } from "../redux/application/application.selectors";
import { checkUserSession } from "../redux/user/user.actions";
import { selectBodyshop, selectCurrentEula, selectCurrentUser } from "../redux/user/user.selectors";
import PrivateRoute from "../components/PrivateRoute";
@@ -21,41 +22,56 @@ import "./App.styles.scss";
import Eula from "../components/eula/eula.component";
import InstanceRenderMgr from "../utils/instanceRenderMgr";
import ProductFruitsWrapper from "./ProductFruitsWrapper.jsx";
import { SocketProvider } from "../contexts/SocketIO/socketContext.jsx";
import { NotificationProvider } from "../contexts/Notifications/notificationContext.jsx";
import SocketProvider from "../contexts/SocketIO/socketProvider.jsx";
import SoundWrapper from "./SoundWrapper.jsx";
const ResetPassword = lazy(() => import("../pages/reset-password/reset-password.component"));
const ManagePage = lazy(() => import("../pages/manage/manage.page.container"));
const SignInPage = lazy(() => import("../pages/sign-in/sign-in.page"));
const CsiPage = lazy(() => import("../pages/csi/csi.container.page"));
const MobilePaymentContainer = lazy(() => import("../pages/mobile-payment/mobile-payment.container"));
const mapStateToProps = createStructuredSelector({
currentUser: selectCurrentUser,
online: selectOnline,
bodyshop: selectBodyshop,
currentEula: selectCurrentEula
currentEula: selectCurrentEula,
isPartsEntry: selectIsPartsEntry
});
const mapDispatchToProps = (dispatch) => ({
checkUserSession: () => dispatch(checkUserSession()),
setOnline: (isOnline) => dispatch(setOnline(isOnline))
setOnline: (isOnline) => dispatch(setOnline(isOnline)),
setIsPartsEntry: (isParts) => dispatch(setIsPartsEntry(isParts))
});
export function App({ bodyshop, checkUserSession, currentUser, online, setOnline, currentEula }) {
export function App({
bodyshop,
checkUserSession,
currentUser,
online,
setOnline,
setIsPartsEntry,
currentEula,
isPartsEntry
}) {
const client = useSplitClient().client;
const [listenersAdded, setListenersAdded] = useState(false);
const { t } = useTranslation();
const navigate = useNavigate();
useEffect(() => {
if (!navigator.onLine) {
setOnline(false);
}
checkUserSession();
}, [checkUserSession, setOnline]);
//const b = Grid.useBreakpoint();
// console.log("Breakpoints:", b);
useEffect(() => {
const pathname = window.location.pathname;
const isParts = pathname === "/parts" || pathname.startsWith("/parts/");
setIsPartsEntry(isParts);
}, [setIsPartsEntry]);
// Associate event listeners, memoize to prevent multiple listeners being added
useEffect(() => {
@@ -140,89 +156,94 @@ export function App({ bodyshop, checkUserSession, currentUser, online, setOnline
>
<ProductFruitsWrapper
currentUser={currentUser}
workspaceCode={InstanceRenderMgr({
imex: null,
rome: "9BkbEseqNqxw8jUH"
})}
bodyshop={bodyshop}
workspaceCode={bodyshop?.tours_enabled ? "9BkbEseqNqxw8jUH" : ""}
isPartsEntry={isPartsEntry}
/>
<Routes>
<Route
path="*"
element={
<ErrorBoundary>
<LandingPage />
</ErrorBoundary>
}
/>
<Route
path="/signin"
element={
<ErrorBoundary>
<SignInPage />
</ErrorBoundary>
}
/>
<Route
path="/resetpassword"
element={
<ErrorBoundary>
<ResetPassword />
</ErrorBoundary>
}
/>
<Route
path="/csi/:surveyId"
element={
<ErrorBoundary>
<CsiPage />
</ErrorBoundary>
}
/>
<Route
path="/disclaimer"
element={
<ErrorBoundary>
<DisclaimerPage />
</ErrorBoundary>
}
/>
<Route
path="/mp/:paymentIs"
element={
<ErrorBoundary>
<MobilePaymentContainer />
</ErrorBoundary>
}
/>
<Route
path="/manage/*"
element={
<ErrorBoundary>
<SocketProvider bodyshop={bodyshop}>
<PrivateRoute isAuthorized={currentUser.authorized} />
</SocketProvider>
</ErrorBoundary>
}
>
<Route path="*" element={<ManagePage />} />
</Route>
<Route
path="/tech/*"
element={
<ErrorBoundary>
<SocketProvider bodyshop={bodyshop}>
<PrivateRoute isAuthorized={currentUser.authorized} />
</SocketProvider>
</ErrorBoundary>
}
>
<Route path="*" element={<TechPageContainer />} />
</Route>
<Route path="/edit/*" element={<PrivateRoute isAuthorized={currentUser.authorized} />}>
<Route path="*" element={<DocumentEditorContainer />} />
</Route>
</Routes>
<NotificationProvider>
<SoundWrapper bodyshop={bodyshop}>
<Routes>
<Route
path="*"
element={
<ErrorBoundary>
<LandingPage />
</ErrorBoundary>
}
/>
<Route
path="/signin"
element={
<ErrorBoundary>
<SignInPage />
</ErrorBoundary>
}
/>
<Route
path="/resetpassword"
element={
<ErrorBoundary>
<ResetPassword />
</ErrorBoundary>
}
/>
<Route
path="/csi/:surveyId"
element={
<ErrorBoundary>
<CsiPage />
</ErrorBoundary>
}
/>
<Route
path="/disclaimer"
element={
<ErrorBoundary>
<DisclaimerPage />
</ErrorBoundary>
}
/>
<Route
path="/manage/*"
element={
<ErrorBoundary>
<SocketProvider bodyshop={bodyshop} navigate={navigate} currentUser={currentUser}>
<PrivateRoute isAuthorized={currentUser.authorized} />
</SocketProvider>
</ErrorBoundary>
}
>
<Route path="*" element={<ManagePage />} />
</Route>
<Route
path="/tech/*"
element={
<ErrorBoundary>
<SocketProvider bodyshop={bodyshop} navigate={navigate} currentUser={currentUser}>
<PrivateRoute isAuthorized={currentUser.authorized} />
</SocketProvider>
</ErrorBoundary>
}
>
<Route path="*" element={<TechPageContainer />} />
</Route>
<Route
path="/parts/*"
element={
<ErrorBoundary>
<PrivateRoute isAuthorized={currentUser.authorized} />
</ErrorBoundary>
}
>
<Route path="*" element={<SimplifiedPartsPageContainer />} />
</Route>
<Route path="/edit/*" element={<PrivateRoute isAuthorized={currentUser.authorized} />}>
<Route path="*" element={<DocumentEditorContainer />} />
</Route>
</Routes>
</SoundWrapper>
</NotificationProvider>
</Suspense>
);
}

View File

@@ -1,8 +1,225 @@
//Global Styles.
@import "react-big-calendar/lib/sass/styles";
@use "react-big-calendar/lib/sass/styles" as rbc;
:root {
--table-stripe-bg: #f4f4f4; /* Light mode table stripe */
--menu-divider-color: #74695c; /* Light mode menu divider */
--menu-submenu-text: rgba(255, 255, 255, 0.65); /* Light mode submenu text */
--kanban-column-bg: #ddd; /* Light mode kanban column */
--alert-color: blue; /* Light mode alert */
--completion-soon-color: rgba(255, 140, 0, 0.8); /* Light mode completion soon */
--completion-past-color: rgba(255, 0, 0, 0.8); /* Light mode completion past */
--job-line-manual-color: tomato; /* Light mode job line manual */
--muted-button-color: lightgray; /* Light mode muted button */
--muted-button-hover-color: darkgrey; /* Light mode muted button hover */
--table-border-color: #ddd; /* Light mode table border */
--table-hover-bg: #f5f5f5; /* Light mode table hover */
--popover-bg: #fff; /* Light mode popover background */
--error-text: red; /* Light mode error message */
--no-jobs-text: #888; /* Light mode no jobs message */
--message-yours-bg: #eee; /* Light mode yours message background */
--message-mine-bg-start: #00d0ea; /* Light mode mine message gradient start */
--message-mine-bg-end: #0085d1; /* Light mode mine message gradient end */
--message-mine-text: white; /* Light mode mine message text */
--message-mine-tail-bg: white; /* Light mode mine/yours message tail */
--system-message-bg: #f5f5f5; /* Light mode system message background */
--system-message-text: #555; /* Light mode system message text */
--system-label-text: #888; /* Light mode system label/date text */
--message-icon-color: whitesmoke; /* Light mode message icon */
--eula-card-bg: lightgray; /* Light mode eula card background */
--notification-bg: #fff; /* Light mode notification background */
--notification-text: rgba(0, 0, 0, 0.85); /* Light mode notification text */
--notification-border: #d9d9d9; /* Light mode notification border */
--notification-header-bg: #fafafa; /* Light mode notification header background */
--notification-header-border: #f0f0f0; /* Light mode notification header border */
--notification-header-text: rgba(0, 0, 0, 0.85); /* Light mode notification header text */
--notification-toggle-icon: #1677ff; /* Light mode notification toggle icon */
--notification-switch-bg: #1677ff; /* Light mode notification switch background */
--notification-btn-link: #1677ff; /* Light mode notification link button */
--notification-btn-link-hover: #69b1ff; /* Light mode notification link button hover */
--notification-btn-link-disabled: rgba(0, 0, 0, 0.25); /* Light mode notification link button disabled */
--notification-btn-link-active: #0958d9; /* Light mode notification link button active */
--notification-read-bg: #fff; /* Light mode notification read background */
--notification-read-text: rgba(0, 0, 0, 0.65); /* Light mode notification read text */
--notification-unread-bg: #f5f5f5; /* Light mode notification unread background */
--notification-unread-text: rgba(0, 0, 0, 0.85); /* Light mode notification unread text */
--notification-item-hover-bg: #fafafa; /* Light mode notification item hover background */
--notification-ro-number: #1677ff; /* Light mode notification RO number */
--notification-relative-time: rgba(0, 0, 0, 0.45); /* Light mode notification relative time */
--alert-bg: #fff1f0; /* Light mode alert background */
--alert-text: rgba(0, 0, 0, 0.85); /* Light mode alert text */
--alert-border: #ffa39e; /* Light mode alert border */
--alert-message: #ff4d4f; /* Light mode alert message */
--share-badge-bg: #cccccc; /* Light mode share badge background */
--column-header-bg: #d0d0d0; /* Light mode column header background */
--footer-bg: #d0d0d0; /* Light mode footer background */
--tech-icon-color: orangered; /* Light mode tech icon color */
--clone-border-color: #1890ff; /* Light mode clone border color */
--event-arrived-bg: rgba(4, 141, 4, 0.4); /* Light mode arrived event background */
--event-block-bg: tomato; /* Light mode block event background */
--event-selected-bg: slategrey; /* Light mode selected event background */
--task-bg: #fff; /* Light mode task center background */
--task-text: rgba(0, 0, 0, 0.85); /* Light mode task text */
--task-border: #d9d9d9; /* Light mode task border */
--task-header-bg: #fafafa; /* Light mode task header background */
--task-header-border: #f0f0f0; /* Light mode task header border */
--task-section-bg: #f5f5f5; /* Light mode task section background */
--task-section-border: #e8e8e8; /* Light mode task section border */
--task-row-hover-bg: #f5f5f5; /* Light mode task row hover background */
--task-row-border: #f0f0f0; /* Light mode task row border */
--task-ro-number: #1677ff; /* Light mode task RO number */
--task-due-text: rgba(0, 0, 0, 0.45); /* Light mode task due text */
--task-button-bg: #1677ff; /* Light mode task button background */
--task-button-hover-bg: #4096ff; /* Light mode task button hover background */
--task-button-disabled-bg: #d9d9d9; /* Light mode task button disabled background */
--task-button-text: white; /* Light mode task button text */
--task-message-text: rgba(0, 0, 0, 0.45); /* Light mode task message text */
--mask-bg: rgba(0, 0, 0, 0.05); /* Light mode mask background */
--board-text-color: #393939; /* Light mode board text color */
--section-bg: #e3e3e3; /* Light mode section background */
--detail-text-color: #4d4d4d; /* Light mode detail text color */
--card-selected-bg: rgba(128, 128, 128, 0.2); /* Light mode selected card background */
--card-stripe-even-bg: #f0f2f5; /* Light mode even card background */
--card-stripe-odd-bg: #ffffff; /* Light mode odd card background */
--bar-border-color: #f0f2f5; /* Light mode bar border and background */
--tag-wrapper-bg: #f0f2f5; /* Light mode tag wrapper background */
--tag-wrapper-text: #000; /* Light mode tag wrapper text */
--preview-bg: lightgray; /* Light mode preview background */
--preview-border-color: #2196F3; /* Light mode preview border color */
--event-bg-fallback: #c4c4c4; /* Light mode event background fallback */
--card-bg-fallback: #ffffff; /* Light mode card background fallback */
--card-text-fallback: black; /* Light mode card text fallback */
--table-row-even-bg: rgb(236, 236, 236); /* Light mode table row even background */
--status-row-bg-fallback: #ffffff; /* Light mode status row fallback background */
--reset-link-color: #0000ff; /* Light mode reset link color */
--error-header-text: tomato; /* Light mode error header text */
--tooltip-bg: white; /* Light mode tooltip background */
--tooltip-border: gray; /* Light mode tooltip border */
--tooltip-text-fallback: black; /* Light mode tooltip text fallback */
--teams-button-bg: #6264A7; /* Light mode Teams button background */
--teams-button-border: #6264A7; /* Light mode Teams button border */
--teams-button-text: #FFFFFF; /* Light mode Teams button text and icon */
--content-bg: #fff; /* Light mode content background */
--legend-bg-fallback: #ffffff; /* Light mode legend background fallback */
--tech-content-bg: #fff; /* Light mode tech content background */
--today-bg: #ffffff; /* Light mode today background */
--today-text: #000000; /* Light mode today text */
--off-range-bg: #f8f8f8; /* Light mode off-range background */
}
[data-theme="dark"] {
--table-stripe-bg: #2a2a2a; /* Dark mode table stripe */
--menu-divider-color: #5c5c5c; /* Dark mode menu divider */
--menu-submenu-text: rgba(255, 255, 255, 0.85); /* Dark mode submenu text */
--kanban-column-bg: #333333; /* Dark mode kanban column */
--alert-color: #4da8ff; /* Dark mode alert */
--completion-soon-color: #ff8c1a; /* Dark mode completion soon */
--completion-past-color: #ff4d4f; /* Dark mode completion past */
--job-line-manual-color: #ff6347; /* Dark mode job line manual */
--muted-button-color: #666666; /* Dark mode muted button */
--muted-button-hover-color: #999999; /* Dark mode muted button hover */
--table-border-color: #5c5c5c; /* Dark mode table border */
--table-hover-bg: #2a2a2a; /* Dark mode table hover */
--popover-bg: #2a2a2a; /* Dark mode popover background */
--error-text: #ff4d4f; /* Dark mode error message */
--no-jobs-text: #999999; /* Dark mode no jobs message */
--message-yours-bg: #2a2a2a; /* Dark mode yours message background */
--message-mine-bg-start: #4da8ff; /* Dark mode mine message gradient start */
--message-mine-bg-end: #326ade; /* Dark mode mine message gradient end */
--message-mine-text: #ffffff; /* Dark mode mine message text */
--message-mine-tail-bg: #1f1f1f; /* Dark mode mine/yours message tail */
--system-message-bg: #333333; /* Dark mode system message background */
--system-message-text: #cccccc; /* Dark mode system message text */
--system-label-text: #999999; /* Dark mode system label/date text */
--message-icon-color: #cccccc; /* Dark mode message icon */
--eula-card-bg: #2a2a2a; /* Dark mode eula card background */
--notification-bg: #2a2a2a; /* Dark mode notification background */
--notification-text: rgba(255, 255, 255, 0.85); /* Dark mode notification text */
--notification-border: #5c5c5c; /* Dark mode notification border */
--notification-header-bg: #333333; /* Dark mode notification header background */
--notification-header-border: #444444; /* Dark mode notification header border */
--notification-header-text: rgba(255, 255, 255, 0.85); /* Dark mode notification header text */
--notification-toggle-icon: #4da8ff; /* Dark mode notification toggle icon */
--notification-switch-bg: #4da8ff; /* Dark mode notification switch background */
--notification-btn-link: #4da8ff; /* Dark mode notification link button */
--notification-btn-link-hover: #80c1ff; /* Dark mode notification link button hover */
--notification-btn-link-disabled: rgba(255, 255, 255, 0.25); /* Dark mode notification link button disabled */
--notification-btn-link-active: #2681ff; /* Dark mode notification link button active */
--notification-read-bg: #2a2a2a; /* Dark mode notification read background */
--notification-read-text: rgba(255, 255, 255, 0.65); /* Dark mode notification read text */
--notification-unread-bg: #333333; /* Dark mode notification unread background */
--notification-unread-text: rgba(255, 255, 255, 0.85); /* Dark mode notification unread text */
--notification-item-hover-bg: #3a3a3a; /* Dark mode notification item hover background */
--notification-ro-number: #4da8ff; /* Dark mode notification RO number */
--notification-relative-time: rgba(255, 255, 255, 0.45); /* Dark mode notification relative time */
--alert-bg: #3a1a1a; /* Dark mode alert background */
--alert-text: rgba(255, 255, 255, 0.85); /* Dark mode alert text */
--alert-border: #ff6666; /* Dark mode alert border */
--alert-message: #ff6666; /* Dark mode alert message */
--share-badge-bg: #666666; /* Dark mode share badge background */
--column-header-bg: #333333; /* Dark mode column header background */
--footer-bg: #333333; /* Dark mode footer background */
--tech-icon-color: #ff4500; /* Dark mode tech icon color */
--clone-border-color: #4da8ff; /* Dark mode clone border color */
--event-arrived-bg: rgba(4, 141, 4, 0.6); /* Dark mode arrived event background */
--event-block-bg: tomato; /* Dark mode block event background */
--event-selected-bg: #4a5e6e; /* Dark mode selected event background */
--task-bg: #2a2a2a; /* Dark mode task center background */
--task-text: rgba(255, 255, 255, 0.85); /* Dark mode task text */
--task-border: #5c5c5c; /* Dark mode task border */
--task-header-bg: #333333; /* Dark mode task header background */
--task-header-border: #444444; /* Dark mode task header border */
--task-section-bg: #333333; /* Dark mode task section background */
--task-section-border: #444444; /* Dark mode task section border */
--task-row-hover-bg: #3a3a3a; /* Dark mode task row hover background */
--task-row-border: #444444; /* Dark mode task row border */
--task-ro-number: #4da8ff; /* Dark mode task RO number */
--task-due-text: rgba(255, 255, 255, 0.45); /* Dark mode task due text */
--task-button-bg: #4da8ff; /* Dark mode task button background */
--task-button-hover-bg: #80c1ff; /* Dark mode task button hover background */
--task-button-disabled-bg: #666666; /* Dark mode task button disabled background */
--task-button-text: #ffffff; /* Dark mode task button text */
--task-message-text: rgba(255, 255, 255, 0.45); /* Dark mode task message text */
--mask-bg: rgba(255, 255, 255, 0.05); /* Dark mode mask background */
--board-text-color: #cccccc; /* Dark mode board text color */
--section-bg: #333333; /* Dark mode section background */
--detail-text-color: #bbbbbb; /* Dark mode detail text color */
--card-selected-bg: rgba(255, 255, 255, 0.1); /* Dark mode selected card background */
--card-stripe-even-bg: #2a2a2a; /* Dark mode even card background */
--card-stripe-odd-bg: #1f1f1f; /* Dark mode odd card background */
--bar-border-color: #2a2a2a; /* Dark mode bar border and background */
--tag-wrapper-bg: #2a2a2a; /* Dark mode tag wrapper background */
--tag-wrapper-text: #cccccc; /* Dark mode tag wrapper text */
--preview-bg: #2a2a2a; /* Dark mode preview background */
--preview-border-color: #4da8ff; /* Dark mode preview border color */
--event-bg-fallback: #262626; /* Dark mode event background fallback */
--card-bg-fallback: #2a2a2a; /* Dark mode card background fallback */
--card-text-fallback: #cccccc; /* Dark mode card text fallback */
--table-row-even-bg: #2a2a2a; /* Dark mode table row even background */
--status-row-bg-fallback: #1f1f1f; /* Dark mode status row fallback background */
--reset-link-color: #4da8ff; /* Dark mode reset link color */
--error-header-text: #ff6347; /* Dark mode error header text */
--tooltip-bg: #2a2a2a; /* Dark mode tooltip background */
--tooltip-border: #5c5c5c; /* Dark mode tooltip border */
--tooltip-text-fallback: #cccccc; /* Dark mode tooltip text fallback */
--teams-button-bg: #7b7dc4; /* Dark mode Teams button background */
--teams-button-border: #7b7dc4; /* Dark mode Teams button border */
--teams-button-text: #ffffff; /* Dark mode Teams button text and icon */
--content-bg: #2a2a2a; /* Dark mode content background */
--legend-bg-fallback: #2a2a2a; /* Dark mode legend background fallback */
--tech-content-bg: #2a2a2a; /* Dark mode tech content background */
--today-bg: #4a5e6e; /* Dark mode today background */
--today-text: #ffffff; /* Dark mode today text */
--off-range-bg: #333333; /* Dark mode off-range background */
--svg-background: #FFF; /* Dark mode SVG background */
}
.ant-menu-item-divider {
border-bottom: 1px solid #74695c !important;
border-bottom: 1px solid var(--menu-divider-color) !important;
}
// Note: Monitor this in dark mode to ensure text visibility
.ant-menu-submenu-title {
color: var(--menu-submenu-text) !important;
}
.imex-table-header {
@@ -39,7 +256,7 @@
}
.ellipses {
display: inline-block; /* for em, a, span, etc (inline by default) */
display: inline-block;
text-overflow: ellipsis;
width: calc(95%);
overflow: hidden;
@@ -53,22 +270,23 @@
}
}
// Scrollbar styles (uncomment if needed, updated for dark mode)
// ::-webkit-scrollbar-track {
// -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
// border-radius: 0.2rem;
// background-color: #f5f5f5;
// background-color: var(--table-stripe-bg);
// }
// ::-webkit-scrollbar {
// width: 0.25rem;
// max-height: 0.25rem;
// background-color: #f5f5f5;
// background-color: var(--table-stripe-bg);
// }
// ::-webkit-scrollbar-thumb {
// border-radius: 0.2rem;
// -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
// background-color: #188fff;
// background-color: var(--alert-color);
// }
.ant-input-number-input,
@@ -81,28 +299,27 @@
.production-alert {
animation: alertBlinker 1s linear infinite;
color: blue;
color: var(--alert-color);
}
@keyframes alertBlinker {
50% {
color: red;
color: var(--completion-past-color);
opacity: 100;
//opacity: 0;
}
}
.blue {
color: blue;
color: var(--alert-color);
}
.production-completion-soon {
color: rgba(255, 140, 0, 0.8);
color: var(--completion-soon-color);
font-weight: bold;
}
.production-completion-past {
color: rgba(255, 0, 0, 0.8);
color: var(--completion-past-color);
font-weight: bold;
}
@@ -132,7 +349,7 @@
}
.react-kanban-column {
background-color: #ddd !important;
background-color: var(--kanban-column-bg) !important;
}
.production-list-table {
@@ -144,18 +361,18 @@
.ReactGridGallery_tile-icon-bar {
div {
svg {
fill: #1890ff;
fill: var(--alert-color);
}
}
}
.job-line-manual {
color: tomato;
color: var(--job-line-manual-color);
font-style: italic;
}
.ant-table-tbody > tr.ant-table-row:nth-child(2n) > td {
background-color: #f4f4f4;
background-color: var(--table-stripe-bg);
}
.rowWithColor > td {
@@ -163,13 +380,69 @@
}
.muted-button {
color: lightgray;
color: var(--muted-button-color);
border: none;
background: none;
cursor: pointer;
font-size: 16px; /* Adjust as needed */
font-size: 16px;
}
.muted-button:hover {
color: darkgrey;
color: var(--muted-button-hover-color);
}
.notification-alert-unordered-list {
cursor: pointer;
padding: 0;
margin: 0;
.notification-alert-unordered-list-item {
margin-right: 0;
}
}
.content-container {
padding: 1rem;
}
// Override react-big-calendar styles for dark mode only
[data-theme="dark"] {
.car-svg {
background-color: var(--svg-background);
}
.rbc-today {
background-color: var(--today-bg);
color: var(--today-text);
}
.rbc-off-range {
background-color: var(--off-range-bg);
}
.rbc-day-bg.rbc-today {
background-color: var(--today-bg);
}
}
.dms-equal-height-col {
display: flex; // make the Col a flex container
}
/* If the direct child is an AntD Card, make it fill the column */
.dms-equal-height-col > .ant-card {
flex: 1 1 auto;
display: flex;
flex-direction: column;
}
/* Optional: if you want the card body to fill vertically too */
.dms-equal-height-col > .ant-card .ant-card-body {
flex: 1;
display: flex;
flex-direction: column;
}
//.rbc-time-header-gutter {
// padding: 0;
//}

View File

@@ -1,9 +1,18 @@
import React from "react";
import { ProductFruits } from "react-product-fruits";
import { memo } from "react";
import PropTypes from "prop-types";
import { ProductFruits } from "react-product-fruits";
import dayjs from "dayjs";
const ProductFruitsWrapper = memo(({ currentUser, bodyshop, workspaceCode, isPartsEntry }) => {
const featureProps = bodyshop?.features
? Object.entries(bodyshop.features).reduce((acc, [key, value]) => {
acc[key] = value === true || (typeof value === "string" && dayjs(value).isAfter(dayjs()));
return acc;
}, {})
: {};
const ProductFruitsWrapper = React.memo(({ currentUser, workspaceCode }) => {
return (
!isPartsEntry &&
workspaceCode &&
currentUser?.authorized === true &&
currentUser?.email && (
@@ -14,13 +23,16 @@ const ProductFruitsWrapper = React.memo(({ currentUser, workspaceCode }) => {
language="en"
user={{
email: currentUser.email,
username: currentUser.email
username: currentUser.email,
props: featureProps
}}
/>
)
);
});
ProductFruitsWrapper.displayName = "ProductFruitsWrapper";
export default ProductFruitsWrapper;
ProductFruitsWrapper.propTypes = {
@@ -28,5 +40,6 @@ ProductFruitsWrapper.propTypes = {
authorized: PropTypes.bool,
email: PropTypes.string
}),
workspaceCode: PropTypes.string
workspaceCode: PropTypes.string,
bodyshop: PropTypes.object
};

View File

@@ -0,0 +1,43 @@
import { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { useNotification } from "../contexts/Notifications/notificationContext.jsx";
import { initNewMessageSound, unlockAudio } from "./../utils/soundManager";
import { initSingleTabAudioLeader } from "../utils/singleTabAudioLeader";
export default function SoundWrapper({ children, bodyshop }) {
const { t } = useTranslation();
const notification = useNotification();
useEffect(() => {
if (!bodyshop?.id) return;
// 1) Init single-tab leader election (only one tab should play sounds), scoped by bodyshopId
const cleanupLeader = initSingleTabAudioLeader(bodyshop.id);
// 2) Initialize base audio
initNewMessageSound("https://images.imex.online/app/messageTone.wav", 0.7);
// 3) Show a one-time prompt when autoplay blocks first play
const onNeedsUnlock = () => {
notification.info({
description: t("audio.manager.description"),
duration: 3
});
};
window.addEventListener("sound-needs-unlock", onNeedsUnlock);
// 4) Proactively unlock on first gesture (once per session)
const gesture = () => unlockAudio(bodyshop.id);
window.addEventListener("click", gesture, { once: true, passive: true });
window.addEventListener("touchstart", gesture, { once: true, passive: true });
window.addEventListener("keydown", gesture, { once: true });
return () => {
cleanupLeader();
window.removeEventListener("sound-needs-unlock", onNeedsUnlock);
// gesture listeners were added with {once:true}
};
}, [notification, t, bodyshop?.id]); // include bodyshop.id so this runs when org changes
return <>{children}</>;
}

View File

@@ -4,36 +4,42 @@ import InstanceRenderMgr from "../utils/instanceRenderMgr";
const { defaultAlgorithm, darkAlgorithm } = theme;
let isDarkMode = false;
/**
* Default theme
* @type {{components: {Menu: {itemDividerBorderColor: string}}}}
*/
const defaultTheme = {
const defaultTheme = (isDarkMode) => ({
components: {
Table: {
rowHoverBg: "#e7f3ff",
rowSelectedBg: "#e6f7ff",
rowHoverBg: isDarkMode ? "#2a2a2a" : "#e7f3ff",
rowSelectedBg: isDarkMode ? "#333333" : "#e6f7ff",
headerSortHoverBg: "transparent"
},
Menu: {
darkItemHoverBg: "#1890ff",
itemHoverBg: "#1890ff",
horizontalItemHoverBg: "#1890ff"
darkItemHoverBg: isDarkMode ? "#004a77" : "#1890ff",
itemHoverBg: isDarkMode ? "#004a77" : "#1890ff",
horizontalItemHoverBg: isDarkMode ? "#004a77" : "#1890ff"
}
},
token: {
colorPrimary: InstanceRenderMgr({
imex: "#1890ff",
rome: "#326ade"
}),
colorInfo: InstanceRenderMgr({
imex: "#1890ff",
rome: "#326ade"
})
colorPrimary: InstanceRenderMgr(
{
imex: isDarkMode ? "#4da8ff" : "#1890ff",
rome: isDarkMode ? "#5b8ce6" : "#326ade"
},
isDarkMode
),
colorInfo: InstanceRenderMgr(
{
imex: isDarkMode ? "#4da8ff" : "#1890ff",
rome: isDarkMode ? "#5b8ce6" : "#326ade"
},
isDarkMode
),
colorError: isDarkMode ? "#ff4d4f" : "#f5222d",
colorBgBase: isDarkMode ? "#1f1f1f" : "#ffffff" // Align with Ant Design dark mode
}
};
});
/**
* Development theme
@@ -60,8 +66,9 @@ const prodTheme = {};
const currentTheme = import.meta.env.DEV ? devTheme : prodTheme;
const finaltheme = {
const getTheme = (isDarkMode) => ({
algorithm: isDarkMode ? darkAlgorithm : defaultAlgorithm,
...defaultsDeep(currentTheme, defaultTheme)
};
export default finaltheme;
});
export default getTheme;

View File

@@ -1,7 +1,7 @@
import React, { useEffect } from "react";
import { useEffect } from "react";
import { Outlet, useLocation, useNavigate } from "react-router-dom";
function PrivateRoute({ component: Component, isAuthorized, ...rest }) {
function PrivateRoute({ isAuthorized }) {
const location = useLocation();
const navigate = useNavigate();

View File

@@ -1,5 +1,4 @@
import { Button } from "antd";
import React from "react";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { setModalContext } from "../../redux/modals/modals.actions";

View File

@@ -1,6 +1,6 @@
import { Card, Checkbox, Input, Space, Table } from "antd";
import queryString from "query-string";
import React, { useState } from "react";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link } from "react-router-dom";
@@ -16,12 +16,13 @@ import PayableExportAll from "../payable-export-all-button/payable-export-all-bu
import PayableExportButton from "../payable-export-button/payable-export-button.component";
import BillMarkSelectedExported from "../payable-mark-selected-exported/payable-mark-selected-exported.component";
import QboAuthorizeComponent from "../qbo-authorize/qbo-authorize.component";
import useLocalStorage from "./../../utils/useLocalStorage";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop
});
const mapDispatchToProps = (dispatch) => ({
const mapDispatchToProps = () => ({
//setUserLanguage: language => dispatch(setUserLanguage(language))
});
@@ -31,7 +32,7 @@ export function AccountingPayablesTableComponent({ bodyshop, loading, bills, ref
const { t } = useTranslation();
const [selectedBills, setSelectedBills] = useState([]);
const [transInProgress, setTransInProgress] = useState(false);
const [state, setState] = useState({
const [state, setState] = useLocalStorage("accounting-payables-table-state", {
sortedInfo: {},
search: ""
});
@@ -181,7 +182,7 @@ export function AccountingPayablesTableComponent({ bodyshop, loading, bills, ref
onChange={handleTableChange}
rowSelection={{
onSelectAll: (selected, selectedRows) => setSelectedBills(selectedRows.map((i) => i.id)),
onSelect: (record, selected, selectedRows, nativeEvent) => {
onSelect: (record, selected, selectedRows) => {
setSelectedBills(selectedRows.map((i) => i.id));
},
getCheckboxProps: (record) => ({

View File

@@ -1,5 +1,5 @@
import { Card, Input, Space, Table } from "antd";
import React, { useState } from "react";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link } from "react-router-dom";
@@ -10,6 +10,7 @@ import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter";
import { exportPageLimit } from "../../utils/config";
import { alphaSort, dateSort } from "../../utils/sorters";
import useLocalStorage from "../../utils/useLocalStorage";
import ExportLogsCountDisplay from "../export-logs-count-display/export-logs-count-display.component";
import OwnerNameDisplay, { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component";
import PaymentExportButton from "../payment-export-button/payment-export-button.component";
@@ -21,7 +22,7 @@ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop
});
const mapDispatchToProps = (dispatch) => ({
const mapDispatchToProps = () => ({
//setUserLanguage: language => dispatch(setUserLanguage(language))
});
@@ -31,7 +32,7 @@ export function AccountingPayablesTableComponent({ bodyshop, loading, payments,
const { t } = useTranslation();
const [selectedPayments, setSelectedPayments] = useState([]);
const [transInProgress, setTransInProgress] = useState(false);
const [state, setState] = useState({
const [state, setState] = useLocalStorage("accounting-payments-table-state", {
sortedInfo: {},
search: ""
});
@@ -85,6 +86,17 @@ export function AccountingPayablesTableComponent({ bodyshop, loading, payments,
sortOrder: state.sortedInfo.columnKey === "amount" && state.sortedInfo.order,
render: (text, record) => <CurrencyFormatter>{record.amount}</CurrencyFormatter>
},
{
title: t("payments.fields.type"),
dataIndex: "type",
key: "type",
sorter: (a, b) => a.type.localeCompare(b.type),
sortOrder: state.sortedInfo.columnKey === "type" && state.sortedInfo.order,
filters: bodyshop.md_payment_types.map((s) => {
return { text: s, value: [s] };
}),
onFilter: (value, record) => value.includes(record.type)
},
{
title: t("payments.fields.memo"),
dataIndex: "memo",
@@ -183,7 +195,7 @@ export function AccountingPayablesTableComponent({ bodyshop, loading, payments,
onChange={handleTableChange}
rowSelection={{
onSelectAll: (selected, selectedRows) => setSelectedPayments(selectedRows.map((i) => i.id)),
onSelect: (record, selected, selectedRows, nativeEvent) => {
onSelect: (record, selected, selectedRows) => {
setSelectedPayments(selectedRows.map((i) => i.id));
},
getCheckboxProps: (record) => ({

View File

@@ -1,5 +1,5 @@
import { Button, Card, Input, Space, Table } from "antd";
import React, { useState } from "react";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link } from "react-router-dom";
@@ -10,6 +10,7 @@ import { exportPageLimit } from "../../utils/config";
import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateFormatter } from "../../utils/DateFormatter";
import { alphaSort, dateSort, statusSort } from "../../utils/sorters";
import useLocalStorage from "../../utils/useLocalStorage";
import ExportLogsCountDisplay from "../export-logs-count-display/export-logs-count-display.component";
import JobExportButton from "../jobs-close-export-button/jobs-close-export-button.component";
import JobsExportAllButton from "../jobs-export-all-button/jobs-export-all-button.component";
@@ -20,7 +21,7 @@ import QboAuthorizeComponent from "../qbo-authorize/qbo-authorize.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop
});
const mapDispatchToProps = (dispatch) => ({
const mapDispatchToProps = () => ({
//setUserLanguage: language => dispatch(setUserLanguage(language))
});
export default connect(mapStateToProps, mapDispatchToProps)(AccountingReceivablesTableComponent);
@@ -30,7 +31,7 @@ export function AccountingReceivablesTableComponent({ bodyshop, loading, jobs, r
const [selectedJobs, setSelectedJobs] = useState([]);
const [transInProgress, setTransInProgress] = useState(false);
const [state, setState] = useState({
const [state, setState] = useLocalStorage("accounting-receivables-table-state", {
sortedInfo: {},
search: ""
});
@@ -141,7 +142,16 @@ export function AccountingReceivablesTableComponent({ bodyshop, loading, jobs, r
refetch={refetch}
/>
<Link to={`/manage/jobs/${record.id}/close`}>
<Button>{t("jobs.labels.viewallocations")}</Button>
<Button
style={{
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap",
verticalAlign: "middle"
}}
>
{t("jobs.labels.viewallocations")}
</Button>
</Link>
</Space>
)
@@ -170,7 +180,7 @@ export function AccountingReceivablesTableComponent({ bodyshop, loading, jobs, r
<Card
extra={
<Space wrap>
{!bodyshop.cdk_dealerid && !bodyshop.pbs_serialnumber && (
{!bodyshop.cdk_dealerid && !bodyshop.pbs_serialnumber && !bodyshop.rr_dealerid && (
<>
<JobMarkSelectedExported
jobIds={selectedJobs}
@@ -188,7 +198,7 @@ export function AccountingReceivablesTableComponent({ bodyshop, loading, jobs, r
/>
</>
)}
{bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && <QboAuthorizeComponent />}
{bodyshop.accountingconfig?.qbo && <QboAuthorizeComponent />}
<Input.Search
value={state.search}
onChange={handleSearch}
@@ -207,7 +217,7 @@ export function AccountingReceivablesTableComponent({ bodyshop, loading, jobs, r
onChange={handleTableChange}
rowSelection={{
onSelectAll: (selected, selectedRows) => setSelectedJobs(selectedRows.map((i) => i.id)),
onSelect: (record, selected, selectedRows, nativeEvent) => {
onSelect: (record, selected, selectedRows) => {
setSelectedJobs(selectedRows.map((i) => i.id));
},
getCheckboxProps: (record) => ({

View File

@@ -1,3 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Alert component should render Alert component 1`] = `ShallowWrapper {}`;

View File

@@ -1,5 +1,4 @@
import { Alert } from "antd";
import React from "react";
export default function AlertComponent(props) {
return <Alert {...props} />;

View File

@@ -1,19 +0,0 @@
import { shallow } from "enzyme";
import React from "react";
import Alert from "./alert.component";
describe("Alert component", () => {
let wrapper;
beforeEach(() => {
const mockProps = {
type: "error",
message: "Test error message."
};
wrapper = shallow(<Alert {...mockProps} />);
});
it("should render Alert component", () => {
expect(wrapper).toMatchSnapshot();
});
});

View File

@@ -0,0 +1,31 @@
import { render, screen } from "@testing-library/react";
import { describe, expect, it } from "vitest";
import AlertComponent from "./alert.component";
describe("AlertComponent", () => {
it("renders with default props", () => {
render(<AlertComponent message="Default Alert" />);
expect(screen.getByText("Default Alert")).toBeInTheDocument();
expect(screen.getByRole("alert")).toHaveClass("ant-alert");
});
it("applies type prop correctly", () => {
render(<AlertComponent message="Success Alert" type="success" />);
const alert = screen.getByRole("alert");
expect(screen.getByText("Success Alert")).toBeInTheDocument();
expect(alert).toHaveClass("ant-alert-success");
});
it("displays description when provided", () => {
render(<AlertComponent message="Error Alert" description="Something went wrong" type="error" />);
expect(screen.getByText("Error Alert")).toBeInTheDocument();
expect(screen.getByText("Something went wrong")).toBeInTheDocument();
expect(screen.getByRole("alert")).toHaveClass("ant-alert-error");
});
it("is closable and shows icon when props are set", () => {
render(<AlertComponent message="Warning Alert" type="warning" showIcon closable />);
expect(screen.getByText("Warning Alert")).toBeInTheDocument();
expect(screen.getByRole("button", { name: /close/i })).toBeInTheDocument(); // Close button
});
});

View File

@@ -1,5 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`AllocationsAssignmentComponent component should create an allocation on save 1`] = `ReactWrapper {}`;
exports[`AllocationsAssignmentComponent component should render AllocationsAssignmentComponent component 1`] = `ReactWrapper {}`;

View File

@@ -1,5 +1,4 @@
import { Button, InputNumber, Popover, Select } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";

View File

@@ -1,35 +0,0 @@
import { mount } from "enzyme";
import React from "react";
import { MockBodyshop } from "../../utils/TestingHelpers";
import { AllocationsAssignmentComponent } from "./allocations-assignment.component";
describe("AllocationsAssignmentComponent component", () => {
let wrapper;
beforeEach(() => {
const mockProps = {
bodyshop: MockBodyshop,
handleAssignment: jest.fn(),
assignment: {},
setAssignment: jest.fn(),
visibilityState: [false, jest.fn()],
maxHours: 4
};
wrapper = mount(<AllocationsAssignmentComponent {...mockProps} />);
});
it("should render AllocationsAssignmentComponent component", () => {
expect(wrapper).toMatchSnapshot();
});
it("should render a list of employees", () => {
const empList = wrapper.find("#employeeSelector");
expect(empList.children()).to.have.lengthOf(2);
});
it("should create an allocation on save", () => {
wrapper.find("Button").simulate("click");
expect(wrapper).toMatchSnapshot();
});
});

View File

@@ -1,9 +1,9 @@
import React, { useState } from "react";
import { useState } from "react";
import AllocationsAssignmentComponent from "./allocations-assignment.component";
import { useMutation } from "@apollo/client";
import { INSERT_ALLOCATION } from "../../graphql/allocations.queries";
import { useTranslation } from "react-i18next";
import { notification } from "antd";
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
export default function AllocationsAssignmentContainer({ jobLineId, hours, refetch }) {
const visibilityState = useState(false);
@@ -14,10 +14,11 @@ export default function AllocationsAssignmentContainer({ jobLineId, hours, refet
employeeid: null
});
const [insertAllocation] = useMutation(INSERT_ALLOCATION);
const notification = useNotification();
const handleAssignment = () => {
insertAllocation({ variables: { alloc: { ...assignment } } })
.then((r) => {
.then(() => {
notification["success"]({
message: t("allocations.successes.save")
});

View File

@@ -1,5 +1,4 @@
import { Button, Popover, Select } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";

View File

@@ -1,9 +1,9 @@
import React, { useState } from "react";
import { useState } from "react";
import AllocationsBulkAssignment from "./allocations-bulk-assignment.component";
import { useMutation } from "@apollo/client";
import { INSERT_ALLOCATION } from "../../graphql/allocations.queries";
import { useTranslation } from "react-i18next";
import { notification } from "antd";
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
export default function AllocationsBulkAssignmentContainer({ jobLines, refetch }) {
const visibilityState = useState(false);
@@ -12,6 +12,7 @@ export default function AllocationsBulkAssignmentContainer({ jobLines, refetch }
employeeid: null
});
const [insertAllocation] = useMutation(INSERT_ALLOCATION);
const notification = useNotification();
const handleAssignment = () => {
const allocs = jobLines.reduce((acc, value) => {
@@ -23,7 +24,7 @@ export default function AllocationsBulkAssignmentContainer({ jobLines, refetch }
return acc;
}, []);
insertAllocation({ variables: { alloc: allocs } }).then((r) => {
insertAllocation({ variables: { alloc: allocs } }).then(() => {
notification["success"]({
message: t("employees.successes.save")
});

View File

@@ -1,5 +1,4 @@
import Icon from "@ant-design/icons";
import React from "react";
import { MdRemoveCircleOutline } from "react-icons/md";
export default function AllocationsLabelComponent({ allocation, handleClick }) {

View File

@@ -1,24 +1,24 @@
import React from "react";
import { useMutation } from "@apollo/client";
import { DELETE_ALLOCATION } from "../../graphql/allocations.queries";
import AllocationsLabelComponent from "./allocations-employee-label.component";
import { notification } from "antd";
import { useTranslation } from "react-i18next";
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
export default function AllocationsLabelContainer({ allocation, refetch }) {
const [deleteAllocation] = useMutation(DELETE_ALLOCATION);
const { t } = useTranslation();
const notification = useNotification();
const handleClick = (e) => {
e.preventDefault();
deleteAllocation({ variables: { id: allocation.id } })
.then((r) => {
.then(() => {
notification["success"]({
message: t("allocations.successes.deleted")
});
if (refetch) refetch();
})
.catch((error) => {
.catch(() => {
notification["error"]({ message: t("allocations.errors.deleting") });
});
};

View File

@@ -1,4 +1,4 @@
import React, { useState } from "react";
import { useState } from "react";
import { Table } from "antd";
import { alphaSort } from "../../utils/sorters";
import { DateTimeFormatter } from "../../utils/DateFormatter";

View File

@@ -1,4 +1,3 @@
import React from "react";
import AuditTrailListComponent from "./audit-trail-list.component";
import { useQuery } from "@apollo/client";
import { QUERY_AUDIT_TRAIL } from "../../graphql/audit_trail.queries";

View File

@@ -1,5 +1,5 @@
import { Table } from "antd";
import React, { useState } from "react";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { DateTimeFormatter } from "../../utils/DateFormatter";
import { alphaSort } from "../../utils/sorters";

View File

@@ -1,4 +1,3 @@
import React from "react";
import { List } from "antd";
import Icon from "@ant-design/icons";
import { FaArrowRight } from "react-icons/fa";

View File

@@ -1,5 +1,4 @@
import { Popover, Tag } from "antd";
import React from "react";
import Barcode from "react-barcode";
import { useTranslation } from "react-i18next";

View File

@@ -1,5 +1,5 @@
import { Checkbox, Form, Skeleton, Typography } from "antd";
import React, { useEffect } from "react";
import { useEffect } from "react";
import { useTranslation } from "react-i18next";
import ReadOnlyFormItemComponent from "../form-items-formatted/read-only-form-item.component";
import "./bill-cm-returns-table.styles.scss";
@@ -33,7 +33,7 @@ export default function BillCmdReturnsTableComponent({ form, returnLoading, retu
return (
<Form.List name="outstanding_returns">
{(fields, { add, remove, move }) => {
{(fields) => {
return (
<>
<Typography.Title level={4}>{t("bills.labels.creditsnotreceived")}</Typography.Title>

View File

@@ -6,7 +6,7 @@
td {
padding: 8px;
text-align: left;
border-bottom: 1px solid #ddd;
border-bottom: 1px solid var(--table-border-color);
.ant-form-item {
margin-bottom: 0px !important;
@@ -14,6 +14,6 @@
}
tr:hover {
background-color: #f5f5f5;
background-color: var(--table-hover-bg);
}
}

View File

@@ -1,7 +1,7 @@
import { DeleteFilled } from "@ant-design/icons";
import { useMutation } from "@apollo/client";
import { Button, notification, Popconfirm } from "antd";
import React, { useState } from "react";
import { Button, Popconfirm } from "antd";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { DELETE_BILL } from "../../graphql/bills.queries";
import RbacWrapper from "../rbac-wrapper/rbac-wrapper.component";
@@ -9,6 +9,7 @@ import { insertAuditTrail } from "../../redux/application/application.actions";
import AuditTrailMapping from "../../utils/AuditTrailMappings";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
const mapStateToProps = createStructuredSelector({});
const mapDispatchToProps = (dispatch) => ({
@@ -21,6 +22,7 @@ export function BillDeleteButton({ bill, jobid, callback, insertAuditTrail }) {
const [loading, setLoading] = useState(false);
const { t } = useTranslation();
const [deleteBill] = useMutation(DELETE_BILL);
const notification = useNotification();
const handleDelete = async () => {
setLoading(true);
@@ -41,7 +43,7 @@ export function BillDeleteButton({ bill, jobid, callback, insertAuditTrail }) {
}
});
if (!!!result.errors) {
if (!result.errors) {
notification["success"]({ message: t("bills.successes.deleted") });
insertAuditTrail({
jobid: jobid,

View File

@@ -2,7 +2,7 @@ import { PageHeader } from "@ant-design/pro-layout";
import { useMutation, useQuery } from "@apollo/client";
import { Button, Divider, Form, Popconfirm, Space } from "antd";
import queryString from "query-string";
import React, { useState } from "react";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useLocation } from "react-router-dom";
@@ -10,7 +10,6 @@ import { createStructuredSelector } from "reselect";
import { DELETE_BILL_LINE, INSERT_NEW_BILL_LINES, UPDATE_BILL_LINE } from "../../graphql/bill-lines.queries";
import { QUERY_BILL_BY_PK, UPDATE_BILL } from "../../graphql/bills.queries";
import { insertAuditTrail } from "../../redux/application/application.actions";
import { setModalContext } from "../../redux/modals/modals.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import AuditTrailMapping from "../../utils/AuditTrailMappings";
import dayjs from "../../utils/day";
@@ -28,13 +27,12 @@ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop
});
const mapDispatchToProps = (dispatch) => ({
setPartsOrderContext: (context) => dispatch(setModalContext({ context: context, modal: "partsOrder" })),
insertAuditTrail: ({ jobid, operation, type }) => dispatch(insertAuditTrail({ jobid, operation, type }))
});
export default connect(mapStateToProps, mapDispatchToProps)(BillDetailEditcontainer);
export function BillDetailEditcontainer({ setPartsOrderContext, insertAuditTrail, bodyshop }) {
export function BillDetailEditcontainer({ insertAuditTrail, bodyshop }) {
const search = queryString.parse(useLocation().search);
const { t } = useTranslation();
@@ -48,7 +46,7 @@ export function BillDetailEditcontainer({ setPartsOrderContext, insertAuditTrail
const { loading, error, data, refetch } = useQuery(QUERY_BILL_BY_PK, {
variables: { billid: search.billid },
skip: !!!search.billid,
skip: !search.billid,
fetchPolicy: "network-only",
nextFetchPolicy: "network-only"
});
@@ -71,7 +69,7 @@ export function BillDetailEditcontainer({ setPartsOrderContext, insertAuditTrail
setUpdateLoading(true);
//let adjustmentsToInsert = {};
const { billlines, upload, ...bill } = values;
const { billlines, ...bill } = values;
const updates = [];
updates.push(
update_bill({
@@ -98,6 +96,7 @@ export function BillDetailEditcontainer({ setPartsOrderContext, insertAuditTrail
});
billlines.forEach((billline) => {
// eslint-disable-next-line no-unused-vars
const { deductedfromlbr, inventories, jobline, original_actual_price, create_ppc, ...il } = billline;
delete il.__typename;
@@ -152,8 +151,8 @@ export function BillDetailEditcontainer({ setPartsOrderContext, insertAuditTrail
if (error) return <AlertComponent message={error.message} type="error" />;
if (!search.billid) return <></>; //<div>{t("bills.labels.noneselected")}</div>;
const exported = data && data.bills_by_pk && data.bills_by_pk.exported;
const isinhouse = data && data.bills_by_pk && data.bills_by_pk.isinhouse;
const exported = data?.bills_by_pk && data.bills_by_pk.exported;
const isinhouse = data?.bills_by_pk && data.bills_by_pk.isinhouse;
return (
<>
@@ -183,8 +182,8 @@ export function BillDetailEditcontainer({ setPartsOrderContext, insertAuditTrail
{t("general.actions.save")}
</Button>
</Popconfirm>
<BillReeportButtonComponent bill={data && data.bills_by_pk} />
<BillMarkExportedButton bill={data && data.bills_by_pk} />
<BillReeportButtonComponent bill={data?.bills_by_pk} />
<BillMarkExportedButton bill={data?.bills_by_pk} />
</Space>
}
/>
@@ -220,11 +219,11 @@ const transformData = (data) => {
billlines: data.bills_by_pk.billlines.map((i) => {
return {
...i,
joblineid: !!i.joblineid ? i.joblineid : "noline",
joblineid: i.joblineid ? i.joblineid : "noline",
applicable_taxes: {
federal: (i.applicable_taxes && i.applicable_taxes.federal) || false,
state: (i.applicable_taxes && i.applicable_taxes.state) || false,
local: (i.applicable_taxes && i.applicable_taxes.local) || false
federal: i.applicable_taxes?.federal || false,
state: i.applicable_taxes?.state || false,
local: i.applicable_taxes?.local || false
}
};
}),

View File

@@ -1,26 +1,28 @@
import { Button, Checkbox, Form, Modal } from "antd";
import queryString from "query-string";
import React, { useEffect, useState } from "react";
import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useLocation, useNavigate } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { insertAuditTrail } from "../../redux/application/application.actions";
import { setModalContext } from "../../redux/modals/modals.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import ReadOnlyFormItemComponent from "../form-items-formatted/read-only-form-item.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop
});
const mapStateToProps = createStructuredSelector({});
const mapDispatchToProps = (dispatch) => ({
setPartsOrderContext: (context) => dispatch(setModalContext({ context: context, modal: "partsOrder" })),
insertAuditTrail: ({ jobid, operation, type }) => dispatch(insertAuditTrail({ jobid, operation, type }))
setPartsOrderContext: (context) =>
dispatch(
setModalContext({
context: context,
modal: "partsOrder"
})
)
});
export default connect(mapStateToProps, mapDispatchToProps)(BillDetailEditReturn);
export function BillDetailEditReturn({ setPartsOrderContext, insertAuditTrail, bodyshop, data, disabled }) {
export function BillDetailEditReturn({ setPartsOrderContext, data, disabled }) {
const search = queryString.parse(useLocation().search);
const history = useNavigate();
const { t } = useTranslation();
@@ -69,13 +71,13 @@ export function BillDetailEditReturn({ setPartsOrderContext, insertAuditTrail, b
<Modal
open={open}
onCancel={() => setOpen(false)}
destroyOnClose
destroyOnHidden
title={t("bills.actions.return")}
onOk={() => form.submit()}
>
<Form initialValues={data && data.bills_by_pk} onFinish={handleFinish} form={form}>
<Form initialValues={data?.bills_by_pk} onFinish={handleFinish} form={form}>
<Form.List name={["billlines"]}>
{(fields, { add, remove, move }) => {
{(fields) => {
return (
<table style={{ tableLayout: "auto", width: "100%" }}>
<thead>

View File

@@ -1,6 +1,5 @@
import { Drawer, Grid } from "antd";
import queryString from "query-string";
import React from "react";
import { useLocation, useNavigate } from "react-router-dom";
import BillDetailEditComponent from "./bill-detail-edit-component";
@@ -29,7 +28,7 @@ export default function BillDetailEditcontainer() {
delete search.billid;
history({ search: queryString.stringify(search) });
}}
destroyOnClose
destroyOnHidden
open={search.billid}
>
<BillDetailEditComponent />

View File

@@ -1,11 +1,12 @@
import { useApolloClient, useMutation } from "@apollo/client";
import { useSplitTreatments } from "@splitsoftware/splitio-react";
import { Button, Checkbox, Form, Modal, notification, Space } from "antd";
import { Button, Checkbox, Form, Modal, Space } from "antd";
import _ from "lodash";
import React, { useEffect, useMemo, useState } from "react";
import { useEffect, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
import { INSERT_NEW_BILL } from "../../graphql/bills.queries";
import { UPDATE_INVENTORY_LINES } from "../../graphql/inventory.queries";
import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries";
@@ -24,6 +25,8 @@ import BillFormContainer from "../bill-form/bill-form.container";
import { CalculateBillTotal } from "../bill-form/bill-form.totals.utility";
import { handleUpload as handleLocalUpload } from "../documents-local-upload/documents-local-upload.utility";
import { handleUpload } from "../documents-upload/documents-upload.utility";
import { handleUpload as handleUploadToImageProxy } from "../documents-upload-imgproxy/documents-upload-imgproxy.utility";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({
billEnterModal: selectBillEnterModal,
@@ -49,12 +52,13 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
const [loading, setLoading] = useState(false);
const client = useApolloClient();
const [generateLabel, setGenerateLabel] = useLocalStorage("enter_bill_generate_label", false);
const notification = useNotification();
const {
treatments: { Enhanced_Payroll }
treatments: { Enhanced_Payroll, Imgproxy }
} = useSplitTreatments({
attributes: {},
names: ["Enhanced_Payroll"],
names: ["Enhanced_Payroll", "Imgproxy"],
splitKey: bodyshop.imexshopid
});
@@ -82,6 +86,8 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
}
setLoading(true);
// eslint-disable-next-line no-unused-vars
const { upload, location, outstanding_returns, inventory, federal_tax_exempt, ...remainingValues } = values;
let adjustmentsToInsert = {};
@@ -99,9 +105,13 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
const {
deductedfromlbr,
lbr_adjustment,
// eslint-disable-next-line no-unused-vars
location: lineLocation,
// eslint-disable-next-line no-unused-vars
part_type,
// eslint-disable-next-line no-unused-vars
create_ppc,
// eslint-disable-next-line no-unused-vars
original_actual_price,
...restI
} = i;
@@ -194,7 +204,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
job: { lbr_adjustments: newAdjustments }
}
});
if (!!jobUpdate.errors) {
if (jobUpdate.errors) {
notification["error"]({
message: t("jobs.errors.saving", {
message: JSON.stringify(jobUpdate.errors)
@@ -211,7 +221,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
variables: { partsLineIds: markPolReceived.map((p) => p.id) },
refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID"]
});
if (!!r2.errors) {
if (r2.errors) {
setLoading(false);
setEnterAgain(false);
notification["error"]({
@@ -222,7 +232,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
}
}
if (!!r1.errors) {
if (r1.errors) {
setLoading(false);
setEnterAgain(false);
notification["error"]({
@@ -242,7 +252,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
consumedbybillid: billId
}
});
if (!!r2.errors) {
if (r2.errors) {
setLoading(false);
setEnterAgain(false);
notification["error"]({
@@ -291,23 +301,44 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
jobid: values.jobid,
invoice_number: remainingValues.invoice_number,
vendorid: remainingValues.vendorid
}
},
notification
});
});
} else {
upload.forEach((u) => {
handleUpload(
{ file: u.originFileObj },
{
bodyshop: bodyshop,
uploaded_by: currentUser.email,
jobId: values.jobid,
billId: billId,
tagsArray: null,
callback: null
}
);
});
//Check if using Imgproxy or cloudinary
if (Imgproxy.treatment === "on") {
upload.forEach((u) => {
handleUploadToImageProxy(
{ file: u.originFileObj },
{
bodyshop: bodyshop,
uploaded_by: currentUser.email,
jobId: values.jobid,
billId: billId,
tagsArray: null,
callback: null
},
notification
);
});
} else {
upload.forEach((u) => {
handleUpload(
{ file: u.originFileObj },
{
bodyshop: bodyshop,
uploaded_by: currentUser.email,
jobId: values.jobid,
billId: billId,
tagsArray: null,
callback: null
},
notification
);
});
}
}
}
///////////////////////////
@@ -325,7 +356,9 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
}
},
{},
"p"
"p",
null,
notification
);
}
@@ -390,7 +423,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
{t("bills.labels.generatepartslabel")}
</Checkbox>
<Button onClick={handleCancel}>{t("general.actions.cancel")}</Button>
<Button loading={loading} onClick={() => form.submit()}>
<Button loading={loading} onClick={() => form.submit()} id="save-bill-enter-modal">
{t("general.actions.save")}
</Button>
{billEnterModal.context && billEnterModal.context.id ? null : (
@@ -400,13 +433,14 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
onClick={() => {
setEnterAgain(true);
}}
id="save-and-new-bill-enter-modal"
>
{t("general.actions.saveandnew")}
</Button>
)}
</Space>
}
destroyOnClose
destroyOnHidden
>
<Form
onFinish={handleFinish}
@@ -417,7 +451,9 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
setEnterAgain(false);
}}
>
<BillFormContainer form={form} disableInvNumber={billEnterModal.context.disableInvNumber} />
<RbacWrapper action="bills:enter">
<BillFormContainer form={form} disableInvNumber={billEnterModal.context.disableInvNumber} />
</RbacWrapper>
</Form>
</Modal>
);

View File

@@ -1,11 +1,11 @@
import { Form, Input, Table } from "antd";
import React, { useState } from "react";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { alphaSort } from "../../utils/sorters";
import BillFormItemsExtendedFormItem from "./bill-form-lines.extended.formitem.component";
export default function BillFormLinesExtended({ lineData, discount, form, responsibilityCenters, disabled }) {
export default function BillFormLinesExtended({ lineData, discount, form, responsibilityCenters }) {
const [search, setSearch] = useState("");
const { t } = useTranslation();
const columns = [

View File

@@ -1,4 +1,3 @@
import React from "react";
import { MinusCircleFilled, PlusCircleFilled, WarningOutlined } from "@ant-design/icons";
import { Button, Form, Input, InputNumber, Select, Space, Switch } from "antd";
import { useTranslation } from "react-i18next";
@@ -8,11 +7,12 @@ import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
import CiecaSelect from "../../utils/Ciecaselect";
import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop
});
const mapDispatchToProps = (dispatch) => ({
const mapDispatchToProps = () => ({
//setUserLanguage: language => dispatch(setUserLanguage(language))
});
export default connect(mapStateToProps, mapDispatchToProps)(BillFormItemsExtendedFormItem);
@@ -22,7 +22,6 @@ export function BillFormItemsExtendedFormItem({
bodyshop,
form,
record,
index,
disabled,
responsibilityCenters,
discount
@@ -46,7 +45,7 @@ export function BillFormItemsExtendedFormItem({
quantity: record.part_qty || 1,
actual_price: record.act_price,
cost_center: record.part_type
? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid
? bodyshopHasDmsKey(bodyshop)
? record.part_type
: responsibilityCenters.defaults && (responsibilityCenters.defaults.costs[record.part_type] || null)
: null
@@ -78,7 +77,7 @@ export function BillFormItemsExtendedFormItem({
...billlineskeys,
[record.id]: {
...billlineskeys[billlineskeys],
actual_cost: !!billlineskeys[billlineskeys].actual_cost
actual_cost: billlineskeys[billlineskeys].actual_cost
? billlineskeys[billlineskeys].actual_cost
: Math.round((parseFloat(e.target.value) * (1 - discount) + Number.EPSILON) * 100) / 100
}
@@ -93,7 +92,7 @@ export function BillFormItemsExtendedFormItem({
<Form.Item shouldUpdate>
{() => {
const line = value;
if (!!!line) return null;
if (!line) return null;
const lineDiscount = (1 - Math.round((line.actual_cost / line.actual_price) * 100) / 100).toPrecision(2);
if (lineDiscount - discount === 0) return <div />;
@@ -102,7 +101,7 @@ export function BillFormItemsExtendedFormItem({
</Form.Item>
<Form.Item label={t("billlines.fields.cost_center")} name={["billlineskeys", record.id, "cost_center"]}>
<Select showSearch style={{ minWidth: "3rem" }} disabled={disabled}>
{bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber
{bodyshopHasDmsKey(bodyshop)
? CiecaSelect(true, false)
: responsibilityCenters.costs.map((item) => <Select.Option key={item.name}>{item.name}</Select.Option>)}
</Select>

View File

@@ -2,7 +2,7 @@ import Icon, { UploadOutlined } from "@ant-design/icons";
import { useApolloClient } from "@apollo/client";
import { useSplitTreatments } from "@splitsoftware/splitio-react";
import { Alert, Divider, Form, Input, Select, Space, Statistic, Switch, Upload } from "antd";
import React, { useEffect, useState } from "react";
import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { MdOpenInNew } from "react-icons/md";
import { connect } from "react-redux";
@@ -22,11 +22,12 @@ import VendorSearchSelect from "../vendor-search-select/vendor-search-select.com
import BillFormLines from "./bill-form.lines.component";
import { CalculateBillTotal } from "./bill-form.totals.utility";
import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component.jsx";
import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop
});
const mapDispatchToProps = (dispatch) => ({});
const mapDispatchToProps = () => ({});
export function BillFormComponent({
bodyshop,
@@ -254,7 +255,7 @@ export function BillFormComponent({
required: true
//message: t("general.validation.required"),
},
({ getFieldValue }) => ({
() => ({
validator(rule, value) {
if (ClosingPeriod.treatment === "on" && bodyshop.accountingconfig.ClosingPeriod) {
if (
@@ -354,7 +355,7 @@ export function BillFormComponent({
<Form.Item span={3} label={t("bills.fields.local_tax_rate")} name="local_tax_rate">
<CurrencyInput min={0} />
</Form.Item>
{bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid ? (
{bodyshopHasDmsKey(bodyshop) ? (
<Form.Item span={2} label={t("bills.labels.federal_tax_exempt")} name="federal_tax_exempt">
<Switch onChange={handleFederalTaxExemptSwitchToggle} />
</Form.Item>
@@ -374,8 +375,10 @@ export function BillFormComponent({
let totals;
if (!!values.total && !!values.billlines && values.billlines.length > 0)
totals = CalculateBillTotal(values);
if (!!totals)
if (totals)
return (
// TODO: Align is not correct
// eslint-disable-next-line react/no-unknown-property
<div align="right">
<Space size="large" wrap>
<Statistic title={t("bills.labels.subtotal")} value={totals.subtotal.toFormat()} precision={2} />
@@ -458,7 +461,7 @@ export function BillFormComponent({
if (Array.isArray(e)) {
return e;
}
return e && e.fileList;
return e?.fileList;
}}
>
<Upload.Dragger multiple={true} name="logo" beforeUpload={() => false} listType="picture">

View File

@@ -1,6 +1,5 @@
import { useLazyQuery, useQuery } from "@apollo/client";
import { useSplitTreatments } from "@splitsoftware/splitio-react";
import React from "react";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { QUERY_OUTSTANDING_INVENTORY } from "../../graphql/inventory.queries";

View File

@@ -1,7 +1,6 @@
import { DeleteFilled, DollarCircleFilled } from "@ant-design/icons";
import { useSplitTreatments } from "@splitsoftware/splitio-react";
import { Button, Checkbox, Form, Input, InputNumber, Select, Space, Switch, Table, Tooltip } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
@@ -11,12 +10,13 @@ import InstanceRenderManager from "../../utils/instanceRenderMgr";
import BillLineSearchSelect from "../bill-line-search-select/bill-line-search-select.component";
import BilllineAddInventory from "../billline-add-inventory/billline-add-inventory.component";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js";
const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser
bodyshop: selectBodyshop
});
const mapDispatchToProps = (dispatch) => ({
const mapDispatchToProps = () => ({
//setUserLanguage: language => dispatch(setUserLanguage(language))
});
@@ -27,8 +27,7 @@ export function BillEnterModalLinesComponent({
discount,
form,
responsibilityCenters,
billEdit,
billid
billEdit
}) {
const { t } = useTranslation();
const { setFieldsValue, getFieldsValue, getFieldValue } = form;
@@ -47,7 +46,7 @@ export function BillEnterModalLinesComponent({
title: t("billlines.fields.jobline"),
dataIndex: "joblineid",
editable: true,
width: "20rem",
minWidth: "10rem",
formItemProps: (field) => {
return {
key: `${field.index}joblinename`,
@@ -73,9 +72,9 @@ export function BillEnterModalLinesComponent({
disabled={disabled}
options={lineData}
style={{
width: "20rem",
maxWidth: "20rem",
minWidth: "10rem",
//width: "10rem",
// maxWidth: "20rem",
minWidth: "20rem",
whiteSpace: "normal",
height: "auto",
minHeight: "32px" // default height of Ant Design inputs
@@ -92,7 +91,7 @@ export function BillEnterModalLinesComponent({
actual_price: opt.cost,
original_actual_price: opt.cost,
cost_center: opt.part_type
? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid
? bodyshopHasDmsKey(bodyshop)
? opt.part_type !== "PAE"
? opt.part_type
: null
@@ -112,7 +111,7 @@ export function BillEnterModalLinesComponent({
title: t("billlines.fields.line_desc"),
dataIndex: "line_desc",
editable: true,
width: "20rem",
minWidth: "10rem",
formItemProps: (field) => {
return {
key: `${field.index}line_desc`,
@@ -126,7 +125,7 @@ export function BillEnterModalLinesComponent({
]
};
},
formInput: (record, index) => <Input.TextArea disabled={disabled} autoSize />
formInput: () => <Input.TextArea disabled={disabled} autoSize />
},
{
title: t("billlines.fields.quantity"),
@@ -158,7 +157,7 @@ export function BillEnterModalLinesComponent({
]
};
},
formInput: (record, index) => <InputNumber precision={0} min={1} disabled={disabled} />
formInput: () => <InputNumber precision={0} min={1} disabled={disabled} />
},
{
title: t("billlines.fields.actual_price"),
@@ -188,7 +187,7 @@ export function BillEnterModalLinesComponent({
if (idx === index) {
return {
...item,
actual_cost: !!item.actual_cost
actual_cost: item.actual_cost
? item.actual_cost
: Math.round((parseFloat(e.target.value) * (1 - discount) + Number.EPSILON) * 100) / 100
};
@@ -234,7 +233,7 @@ export function BillEnterModalLinesComponent({
title: t("billlines.fields.actual_cost"),
dataIndex: "actual_cost",
editable: true,
width: "8rem",
width: "10rem",
formItemProps: (field) => {
return {
@@ -258,7 +257,7 @@ export function BillEnterModalLinesComponent({
<Form.Item shouldUpdate noStyle>
{() => {
const line = getFieldsValue(["billlines"]).billlines[index];
if (!!!line) return null;
if (!line) return null;
let lineDiscount = 1 - line.actual_cost / line.actual_price;
if (isNaN(lineDiscount)) lineDiscount = 0;
return (
@@ -322,9 +321,9 @@ export function BillEnterModalLinesComponent({
]
};
},
formInput: (record, index) => (
formInput: () => (
<Select showSearch style={{ minWidth: "3rem" }} disabled={disabled}>
{bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber
{bodyshopHasDmsKey(bodyshop)
? CiecaSelect(true, false)
: responsibilityCenters.costs.map((item) => <Select.Option key={item.name}>{item.name}</Select.Option>)}
</Select>
@@ -344,7 +343,7 @@ export function BillEnterModalLinesComponent({
name: [field.name, "location"]
};
},
formInput: (record, index) => (
formInput: () => (
<Select disabled={disabled}>
{bodyshop.md_parts_locations.map((loc, idx) => (
<Select.Option key={idx} value={loc}>
@@ -359,6 +358,7 @@ export function BillEnterModalLinesComponent({
title: t("billlines.labels.deductedfromlbr"),
dataIndex: "deductedfromlbr",
editable: true,
width: "40px",
formItemProps: (field) => {
return {
valuePropName: "checked",
@@ -366,7 +366,7 @@ export function BillEnterModalLinesComponent({
name: [field.name, "deductedfromlbr"]
};
},
formInput: (record, index) => <Switch disabled={disabled} />,
formInput: () => <Switch disabled={disabled} />,
additional: (record, index) => (
<Form.Item shouldUpdate noStyle style={{ display: "inline-block" }}>
{() => {
@@ -466,19 +466,19 @@ export function BillEnterModalLinesComponent({
title: t("billlines.fields.federal_tax_applicable"),
dataIndex: "applicable_taxes.federal",
editable: true,
width: "40px",
formItemProps: (field) => {
return {
key: `${field.index}fedtax`,
valuePropName: "checked",
initialValue: InstanceRenderManager({
imex: true,
rome: false,
rome: false
}),
name: [field.name, "applicable_taxes", "federal"]
};
},
formInput: (record, index) => <Switch disabled={disabled} />
formInput: () => <Switch disabled={disabled} />
}
]
}),
@@ -487,7 +487,7 @@ export function BillEnterModalLinesComponent({
title: t("billlines.fields.state_tax_applicable"),
dataIndex: "applicable_taxes.state",
editable: true,
width: "40px",
formItemProps: (field) => {
return {
key: `${field.index}statetax`,
@@ -495,7 +495,7 @@ export function BillEnterModalLinesComponent({
name: [field.name, "applicable_taxes", "state"]
};
},
formInput: (record, index) => <Switch disabled={disabled} />
formInput: () => <Switch disabled={disabled} />
},
...InstanceRenderManager({
@@ -505,7 +505,7 @@ export function BillEnterModalLinesComponent({
title: t("billlines.fields.local_tax_applicable"),
dataIndex: "applicable_taxes.local",
editable: true,
width: "40px",
formItemProps: (field) => {
return {
key: `${field.index}localtax`,
@@ -513,7 +513,7 @@ export function BillEnterModalLinesComponent({
name: [field.name, "applicable_taxes", "local"]
};
},
formInput: (record, index) => <Switch disabled={disabled} />
formInput: () => <Switch disabled={disabled} />
}
]
}),
@@ -575,7 +575,7 @@ export function BillEnterModalLinesComponent({
}
]}
>
{(fields, { add, remove, move }) => {
{(fields, { add, remove }) => {
return (
<>
<Table
@@ -612,24 +612,16 @@ export function BillEnterModalLinesComponent({
export default connect(mapStateToProps, mapDispatchToProps)(BillEnterModalLinesComponent);
const EditableCell = ({
dataIndex,
title,
inputType,
record,
index,
children,
formInput,
formItemProps,
additional,
wrapper,
...restProps
}) => {
const EditableCell = ({ dataIndex, record, children, formInput, formItemProps, additional, wrapper, ...restProps }) => {
const propsFinal = formItemProps && formItemProps(record);
if (propsFinal && "key" in propsFinal) {
delete propsFinal.key;
}
if (additional)
return (
<td {...restProps}>
<div size="small">
<Form.Item name={dataIndex} labelCol={{ span: 0 }} {...(formItemProps && formItemProps(record))}>
<Form.Item name={dataIndex} labelCol={{ span: 0 }} {...propsFinal}>
{(formInput && formInput(record, record.name)) || children}
</Form.Item>
{additional && additional(record, record.name)}
@@ -640,7 +632,7 @@ const EditableCell = ({
return (
<wrapper>
<td {...restProps}>
<Form.Item labelCol={{ span: 0 }} name={dataIndex} {...(formItemProps && formItemProps(record))}>
<Form.Item labelCol={{ span: 0 }} name={dataIndex} {...propsFinal}>
{(formInput && formInput(record, record.name)) || children}
</Form.Item>
</td>
@@ -648,7 +640,7 @@ const EditableCell = ({
);
return (
<td {...restProps}>
<Form.Item labelCol={{ span: 0 }} name={dataIndex} {...(formItemProps && formItemProps(record))}>
<Form.Item labelCol={{ span: 0 }} name={dataIndex} {...propsFinal}>
{(formInput && formInput(record, record.name)) || children}
</Form.Item>
</td>

Some files were not shown because too many files have changed in this diff Show More