9 Commits

Author SHA1 Message Date
dba8381913 2026.2.3 2026-02-14 18:56:22 -05:00
d4fa314011 moved screenshot folder 2026-02-14 09:40:46 -05:00
be2effb1b4 Added screenshots 2026-02-14 09:36:52 -05:00
4bcccbd2f1 Fixed formatting, missing </b> 2026-02-13 22:31:59 -05:00
92cc7222fb feat(i18n): sort en.yml and fix typos
Alphabetized keys for better maintainability.

Fixed spelling errors in customer and vehicle keys/values.

Corrected "QuickBooks Online" branding.
2026-02-13 22:25:43 -05:00
c5318a3528 Copied message in bold 2026-02-13 22:06:32 -05:00
9315433cb1 Keep the last 8 bold 2026-02-13 21:50:38 -05:00
82e25314f3 removed unused spans 2026-02-13 21:38:34 -05:00
5cad4a6856 added js to copy vin on click 2026-02-13 21:28:45 -05:00
12 changed files with 66 additions and 25 deletions

View File

@@ -1,5 +1,5 @@
<h4><%=t(:field_vehicles)%>:</h4> <h4><%=t(:field_vehicles)%>:</h4>
<%= render partial: 'vehicles/list', locals: { vehicles: customer.vehicles.paginate(page: params[:page]) } %> <%= render partial: 'vehicles/list', locals: { vehicles: customer.vehicles.paginate(page: params[:page]) } %>
<div style="float: right;"> <div style="float: right;">
<%= button_to t(:button_new_vehice), new_customer_vehicle_path(customer), method: :get %> <%= button_to t(:button_new_vehicle), new_customer_vehicle_path(customer), method: :get %>
</div> </div>

View File

@@ -1,14 +1,17 @@
<div class="vehicle attribute"> <div class="vehicle attribute">
<div class="label"><span><%=t(:field_vehicle)%></span>:</div> <div class="label"><%=t(:field_vehicle)%>:</div>
<div class="value"><%= vehicle %></div> <div class="value"><%= vehicle %></div>
</div> </div>
<div class="vehicle_vin attribute"> <div class="vehicle_vin attribute">
<div class="label"><span><%=t(:field_vin)%></span>:</div> <div class="label"><%=t(:field_vin)%>:</div>
<div class="value"><%=split_vin[0] if split_vin%><b><%=split_vin[1] if split_vin%></b></div> <div class="value" id="vin">
<a href="#" id="copyLink" onclick="handleCopy(event)"><%=split_vin[0] if split_vin%><b><%=split_vin[1] if split_vin%></b></a>
</div>
</div> </div>
<div class="vehicle_notes attribute"> <div class="vehicle_notes attribute">
<div class="label"><span><%=t(:field_notes)%></span>:</div> <div class="label"><%=t(:field_notes)%>:</div>
<pre class="value" id="note-display" style="text-align: left; white-space: pre-wrap; font-family: inherit; "><%=notes%></pre> <pre class="value" id="note-display" style="text-align: left; white-space: pre-wrap; font-family: inherit; "><%=notes%></pre>
</div> </div>

View File

@@ -18,7 +18,9 @@
<tr> <tr>
<th><%= t(:field_vin) %></th> <th><%= t(:field_vin) %></th>
<td><%= @vin[0] if @vin %><b><%=@vin[1] if @vin%></b></td> <td id="vin">
<a href="#" onclick="handleCopy(event)"><%= @vin[0] if @vin %><b><%=@vin[1] if @vin%></b></a>
</td>
</tr> </tr>
<th><%= t(:label_trim) %></th> <th><%= t(:label_trim) %></th>

View File

@@ -1,4 +1,4 @@
<h2><%=t(:label_cusomer_vehicles)%> <span style="float:right"> <%= render partial: 'vehicles/search' %> </span> </h2> <h2><%=t(:label_customer_vehicles)%> <span style="float:right"> <%= render partial: 'vehicles/search' %> </span> </h2>
<br/> <br/>
<%= render partial: 'vehicles/list', locals: {vehicles: @vehicles} %> <%= render partial: 'vehicles/list', locals: {vehicles: @vehicles} %>

View File

@@ -0,0 +1,35 @@
async function handleCopy(event) {
console.log("Copy link clicked");
// 1. Prevent the link from actually navigating
event.preventDefault();
// 2. Grab the text from our span
const text = document.getElementById('vin').innerText;
try {
// 3. Write to clipboard
await navigator.clipboard.writeText(text);
// 4. Update the UI to show it worked
const link = event.target;
const originalText = link.innerText;
link.innerHTML = "<b>Copied!</b>";
link.style.color = "#4CAF50"; // Turn green
// 5. Reset after 2 seconds
setTimeout(() => {
// Check if the text is long enough to prevent errors
if (originalText.length >= 8) {
const firstPart = originalText.slice(0, -8);
const lastEight = originalText.slice(-8);
link.innerHTML = `${firstPart}<b>${lastEight}</b>`;
} else {
link.innerText = originalText;
}
link.style.color = "";
}, 2000);
} catch (err) {
console.error('Unable to copy', err);
}
}

View File

@@ -10,27 +10,27 @@
# English strings go here for Rails i18n # English strings go here for Rails i18n
# Usage I18n.t(:label) # Usage I18n.t(:label)
en: en:
field_vehicles: "Vehicles" alert_no_customer: "Customer no longer exists, check for merged customers or deleted customers in QuickBooks Online."
alert_vehicle_not_created: "Vehicle could not be created."
alert_vehicle_not_deleted: "Vehicle could not be deleted."
alert_vehicle_not_found: "Vehicle not found."
alert_vehicle_not_updated: "Vehicle could not be updated."
button_new_vehicle: "New Vehicle"
field_vehicle: "Vehicle" field_vehicle: "Vehicle"
field_vehicles: "Vehicles"
field_vin: "VIN" field_vin: "VIN"
label_customer_vehicles: "Customer Vehicles"
label_edit: "Edit" label_edit: "Edit"
label_year: "Year" label_edit_customer_vehicle: "Edit Customer Vehicle"
label_make: "Make" label_make: "Make"
label_model: "Model" label_model: "Model"
label_new_vehicle: "New Customer Vehicle"
label_no_vehicles: "There are no vehicles containing the term(s)" label_no_vehicles: "There are no vehicles containing the term(s)"
label_search_vin: "Search Vehicles by VIN" label_search_vin: "Search Vehicles by VIN"
label_edit_customer_vehicle: "Edit Customer Vehicle" label_year: "Year"
label_cusomer_vehicles: "Customer Vehicles"
label_new_vehicle: "New Customer Vehicle"
button_new_vehice: "New Vehicle"
notice_vehicle_created: "Vehicle was successfully created."
notice_vehicle_updated: "Vehicle was successfully updated."
notice_vehicle_deleted: "Vehicle was successfully deleted."
alert_vehicle_not_found: "Vehicle not found."
alert_vehicle_not_deleted: "Vehicle could not be deleted."
alert_vehicle_not_created: "Vehicle could not be created."
alert_vehicle_not_updated: "Vehicle could not be updated."
no_customer: "Customer no longer exists" no_customer: "Customer no longer exists"
alert_no_customer: "Customer no longer exists, check for merged customers or deleted customers in Quick Books Online." notice_vehicle_created: "Vehicle was successfully created."
notice_vehicle_deleted: "Vehicle was successfully deleted."
notice_vehicle_updated: "Vehicle was successfully updated."

View File

@@ -14,7 +14,7 @@ Redmine::Plugin.register :redmine_qbo_vehicles do
name 'Redmine QBO Vehicles plugin' name 'Redmine QBO Vehicles plugin'
author 'Rick Barrette' author 'Rick Barrette'
description 'This is a plugin for Redmine to intergrate with the redmine_qbo plugin to provide vehicle data tracking' description 'This is a plugin for Redmine to intergrate with the redmine_qbo plugin to provide vehicle data tracking'
version '2026.2.2' version '2026.2.3'
url 'https://github.com/rickbarrette/redmine_qbo_vehicles' url 'https://github.com/rickbarrette/redmine_qbo_vehicles'
author_url 'https://barrettefabrication.com' author_url 'https://barrettefabrication.com'
requires_redmine version_or_higher: '6.1.0' requires_redmine version_or_higher: '6.1.0'

View File

@@ -14,7 +14,8 @@ module Vehicles
def view_layouts_base_html_head(context = {}) def view_layouts_base_html_head(context = {})
safe_join([ safe_join([
stylesheet_link_tag('style', plugin: :redmine_qbo_vehicles, media: :all) stylesheet_link_tag('style', plugin: :redmine_qbo_vehicles, media: :all),
javascript_include_tag('copy', plugin: :redmine_qbo_vehicles)
]) ])
end end

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 KiB

BIN
screenshots/issue.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 724 KiB

BIN
screenshots/issue_form.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 KiB