PluginProbe
Easy Invoice – Invoice Generator, PDF Quotes & Payments / 2.4.0
Easy Invoice – Invoice Generator, PDF Quotes & Payments v2.4.0
2.4.0 2.4.1 2.3.8 2.3.7 2.3.6 2.3.5 2.3.4 2.3.3 2.3.2 2.3.1 2.2.0 2.1.21 2.1.20 2.1.19 2.1.18 2.1.0 2.1.1 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.16 2.1.2 All 57 releases
← All changes | templates/client-view-page.php +59 -74 2.1.142.4.0 View file →
@@ -27,77 +27,69 @@
27 27 </a>
28 28 </div>
29 29 </div>
30 30
31 - <!-- Client Information Card -->
32 31 <div class="bg-white p-6 rounded-xl border border-gray-200 shadow-sm mb-8">
33 32 <div class="flex items-center justify-between pb-4 border-b border-gray-200 mb-4">
34 33 <h4 class="text-lg font-semibold text-gray-800 flex items-center">
35 34 <i class="fas fa-user-check text-indigo-500 mr-3"></i>
36 - <span><?php _e('Client Details', 'easy-invoice'); ?></span>
35 + <span><?php esc_html_e('Client Details', 'easy-invoice'); ?></span>
37 36 </h4>
38 37 </div>
39 38
40 39 <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-x-8 gap-y-6 pt-2">
41 - <!-- Client Name -->
42 40 <div class="flex items-start group">
43 41 <div class="flex-shrink-0 w-8 text-center pt-1"><i class="fas fa-user-tie text-gray-400 group-hover:text-indigo-500 transition-colors"></i></div>
44 42 <div class="ml-3">
45 - <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php _e('Full Name', 'easy-invoice'); ?></label>
43 + <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Full Name', 'easy-invoice'); ?></label>
46 44 <p class="text-sm font-semibold text-gray-800 mt-1"><?php echo esc_html($client->getFirstName() . ' ' . $client->getLastName()); ?></p>
47 45 </div>
48 46 </div>
49 47
50 - <!-- Company Name -->
51 48 <div class="flex items-start group">
52 49 <div class="flex-shrink-0 w-8 text-center pt-1"><i class="fas fa-building text-gray-400 group-hover:text-indigo-500 transition-colors"></i></div>
53 50 <div class="ml-3">
54 - <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php _e('Company', 'easy-invoice'); ?></label>
51 + <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Company', 'easy-invoice'); ?></label>
55 52 <p class="text-sm font-semibold text-gray-800 mt-1"><?php echo esc_html($client->getBusinessClientName() ?: 'N/A'); ?></p>
56 53 </div>
57 54 </div>
58 55
59 - <!-- Email -->
60 56 <div class="flex items-start group">
61 57 <div class="flex-shrink-0 w-8 text-center pt-1"><i class="fas fa-envelope text-gray-400 group-hover:text-indigo-500 transition-colors"></i></div>
62 58 <div class="ml-3">
63 - <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php _e('Email', 'easy-invoice'); ?></label>
59 + <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Email', 'easy-invoice'); ?></label>
64 60 <p class="text-sm text-gray-800 mt-1 break-all"><?php echo esc_html($client->getEmail()); ?></p>
65 61 </div>
66 62 </div>
67 63
68 - <!-- Phone -->
69 64 <div class="flex items-start group">
70 65 <div class="flex-shrink-0 w-8 text-center pt-1"><i class="fas fa-phone-alt text-gray-400 group-hover:text-indigo-500 transition-colors"></i></div>
71 66 <div class="ml-3">
72 - <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php _e('Phone', 'easy-invoice'); ?></label>
67 + <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Phone', 'easy-invoice'); ?></label>
73 68 <p class="text-sm text-gray-800 mt-1"><?php echo esc_html($client->getPhone() ?: 'N/A'); ?></p>
74 69 </div>
75 70 </div>
76 71
77 - <!-- Username -->
78 72 <div class="flex items-start group">
79 73 <div class="flex-shrink-0 w-8 text-center pt-1"><i class="fas fa-at text-gray-400 group-hover:text-indigo-500 transition-colors"></i></div>
80 74 <div class="ml-3">
81 - <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php _e('Username', 'easy-invoice'); ?></label>
75 + <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Username', 'easy-invoice'); ?></label>
82 76 <p class="text-sm text-gray-800 mt-1"><?php echo esc_html($client->getUsername()); ?></p>
83 77 </div>
84 78 </div>
85 79
86 - <!-- Client ID -->
87 80 <div class="flex items-start group">
88 81 <div class="flex-shrink-0 w-8 text-center pt-1"><i class="fas fa-id-card text-gray-400 group-hover:text-indigo-500 transition-colors"></i></div>
89 82 <div class="ml-3">
90 - <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php _e('Client ID', 'easy-invoice'); ?></label>
83 + <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Client ID', 'easy-invoice'); ?></label>
91 84 <p class="text-sm text-gray-800 mt-1"><?php echo esc_html($client->getId()); ?></p>
92 85 </div>
93 86 </div>
94 87
95 - <!-- Client Role -->
96 88 <div class="flex items-start group">
97 89 <div class="flex-shrink-0 w-8 text-center pt-1"><i class="fas fa-user-shield text-gray-400 group-hover:text-indigo-500 transition-colors"></i></div>
98 90 <div class="ml-3">
99 - <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php _e('Role', 'easy-invoice'); ?></label>
91 + <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Role', 'easy-invoice'); ?></label>
100 92 <div class="mt-1">
101 93 <?php
102 94 $role_class = 'bg-blue-100 text-blue-800';
103 95 $role_icon = 'fas fa-user';
@@ -129,10 +121,10 @@
129 121 $role_icon = 'fas fa-user';
130 122 }
131 123 }
132 124 ?>
133 - <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium <?php echo $role_class; ?>">
134 - <i class="<?php echo $role_icon; ?> mr-1"></i>
125 + <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium <?php echo esc_attr($role_class); ?>">
126 + <i class="<?php echo esc_attr($role_icon); ?> mr-1"></i>
135 127 <?php echo esc_html(ucfirst($client_role ?? 'client')); ?>
136 128 </span>
137 129 </div>
138 130 </div>
@@ -137,13 +129,12 @@
137 129 </div>
138 130 </div>
139 131 </div>
140 132
141 - <!-- Website -->
142 133 <div class="flex items-start group">
143 134 <div class="flex-shrink-0 w-8 text-center pt-1"><i class="fas fa-globe-americas text-gray-400 group-hover:text-indigo-500 transition-colors"></i></div>
144 135 <div class="ml-3">
145 - <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php _e('Website', 'easy-invoice'); ?></label>
136 + <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Website', 'easy-invoice'); ?></label>
146 137 <p class="text-sm text-gray-800 mt-1">
147 138 <?php if ($client->getWebsite()): ?>
148 139 <a href="<?php echo esc_url($client->getWebsite()); ?>" target="_blank" class="text-indigo-600 hover:text-indigo-800 hover:underline">
149 140 <?php echo esc_html($client->getWebsite()); ?>
@@ -154,13 +145,12 @@
154 145 </p>
155 146 </div>
156 147 </div>
157 148
158 - <!-- Address -->
159 149 <div class="flex items-start group md:col-span-2 lg:col-span-3">
160 150 <div class="flex-shrink-0 w-8 text-center pt-1"><i class="fas fa-map-marker-alt text-gray-400 group-hover:text-indigo-500 transition-colors"></i></div>
161 151 <div class="ml-3">
162 - <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php _e('Address', 'easy-invoice'); ?></label>
152 + <label class="block text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Address', 'easy-invoice'); ?></label>
163 153 <p class="text-sm text-gray-800 mt-1 whitespace-pre-wrap"><?php echo esc_html($client->getAddress() ?: 'N/A'); ?></p>
164 154 </div>
165 155 </div>
166 156 </div>
@@ -168,9 +158,9 @@
168 158 <?php if ($client->getExtraInfo()): ?>
169 159 <div class="mt-6 pt-6 border-t border-gray-200">
170 160 <h3 class="text-sm font-semibold text-gray-800 mb-2 flex items-center">
171 161 <i class="fas fa-info-circle text-gray-400 mr-2"></i>
172 - <span><?php _e('Extra Info', 'easy-invoice'); ?></span>
162 + <span><?php esc_html_e('Extra Info', 'easy-invoice'); ?></span>
173 163 </h3>
174 164 <div class="bg-gray-50 p-4 rounded-md text-sm text-gray-700 prose max-w-none">
175 165 <?php echo nl2br(esc_html($client->getExtraInfo())); ?>
176 166 </div>
@@ -177,14 +167,26 @@
177 167 </div>
178 168 <?php endif; ?>
179 169 </div>
180 170
181 - <!-- Client Invoices -->
171 + <?php
172 + /**
173 + * Fires after the client's details, before their invoices.
174 + *
175 + * Where an addon adds something that belongs to the client rather than to
176 + * any one document -- Pro shows the card on file here, with the control
177 + * to remove it.
178 + *
179 + * @param int $client_id Client (WordPress user) id.
180 + */
181 + do_action('easy_invoice_client_view_after_details', (int) $client->getId());
182 + ?>
183 +
182 184 <div class="bg-white shadow-sm rounded-xl border border-gray-200">
183 185 <div class="p-6 border-b border-gray-200">
184 186 <h2 class="text-lg font-semibold text-gray-800 flex items-center">
185 187 <i class="fas fa-file-invoice-dollar text-indigo-500 mr-3"></i>
186 - <span>Invoices</span>
188 + <span><?php esc_html_e('Invoices', 'easy-invoice'); ?></span>
187 189 </h2>
188 190 </div>
189 191
190 192 <?php if (empty($invoices)): ?>
@@ -189,9 +191,9 @@
189 191
190 192 <?php if (empty($invoices)): ?>
191 193 <div class="text-center py-12">
192 194 <div class="text-gray-400 mb-4"><i class="fas fa-file-invoice fa-4x"></i></div>
193 - <p class="text-gray-500 font-medium mb-4">No invoices found for this client.</p>
195 + <p class="text-gray-500 font-medium mb-4"><?php esc_html_e('No invoices found for this client.', 'easy-invoice'); ?></p>
194 196 </div>
195 197 <?php else: ?>
196 198 <div class="overflow-x-auto">
197 199 <table class="min-w-full divide-y divide-gray-200">
@@ -196,45 +198,29 @@
196 198 <div class="overflow-x-auto">
197 199 <table class="min-w-full divide-y divide-gray-200">
198 200 <thead class="bg-gray-50">
199 201 <tr>
200 - <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Invoice</th>
201 - <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Date</th>
202 - <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Due Date</th>
203 - <th scope="col" class="px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">Amount</th>
204 - <th scope="col" class="px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">Status</th>
202 + <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Invoice', 'easy-invoice'); ?></th>
203 + <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Date', 'easy-invoice'); ?></th>
204 + <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Due Date', 'easy-invoice'); ?></th>
205 + <th scope="col" class="px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Amount', 'easy-invoice'); ?></th>
206 + <th scope="col" class="px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Status', 'easy-invoice'); ?></th>
205 207 <th scope="col" class="relative px-6 py-3">
206 - <span class="sr-only">Actions</span>
208 + <span class="sr-only"><?php esc_html_e('Actions', 'easy-invoice'); ?></span>
207 209 </th>
208 210 </tr>
209 211 </thead>
210 212 <tbody class="bg-white divide-y divide-gray-200">
211 213 <?php foreach ($invoices as $invoice):
212 - $status_class = '';
213 - $status_icon = '';
214 - switch ($invoice['status']) {
215 - case 'paid':
216 - $status_class = 'bg-green-100 text-green-800';
217 - $status_icon = 'fas fa-check-circle';
218 - break;
219 - case 'pending':
220 - $status_class = 'bg-yellow-100 text-yellow-800';
221 - $status_icon = 'fas fa-hourglass-half';
222 - break;
223 - case 'overdue':
224 - $status_class = 'bg-red-100 text-red-800';
225 - $status_icon = 'fas fa-exclamation-triangle';
226 - break;
227 - default:
228 - $status_class = 'bg-gray-100 text-gray-800';
229 - $status_icon = 'fas fa-question-circle';
230 - }
214 + $status_key = \EasyInvoice\Helpers\InvoiceStatus::displayKey( (string) $invoice['status'], $invoice['due_date'] ?? null );
215 + $status_class = \EasyInvoice\Helpers\InvoiceStatus::badgeClass( $status_key );
216 + $status_icon = [ 'paid' => 'fas fa-check-circle', 'partial' => 'fas fa-adjust', 'overdue' => 'fas fa-exclamation-triangle', 'draft' => 'fas fa-pencil-alt', 'cancelled' => 'fas fa-ban' ][ $status_key ] ?? 'fas fa-file-invoice';
231 217 ?>
232 218 <tr>
233 219 <td class="px-6 py-4 whitespace-nowrap">
234 220 <div class="flex flex-col">
235 221 <div class="text-sm font-semibold text-indigo-600 hover:text-indigo-800">
236 - <a href="<?php echo get_permalink($invoice['id']); ?>"><?php echo esc_html($invoice['title']); ?></a>
222 + <a href="<?php echo esc_url(get_permalink($invoice['id'])); ?>"><?php echo esc_html($invoice['title']); ?></a>
237 223 </div>
238 224 <div class="text-xs text-gray-500 font-mono">
239 225 <?php echo esc_html($invoice['invoice_number']); ?>
240 226 </div>
@@ -240,12 +226,12 @@
240 226 </div>
241 227 </div>
242 228 </td>
243 229 <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
244 - <?php echo esc_html(date("M d, Y", strtotime($invoice['date']))); ?>
230 + <?php echo esc_html(gmdate("M d, Y", strtotime($invoice['date']))); ?>
245 231 </td>
246 232 <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
247 - <?php echo esc_html(date("M d, Y", strtotime($invoice['due_date']))); ?>
233 + <?php echo esc_html(gmdate("M d, Y", strtotime($invoice['due_date']))); ?>
248 234 </td>
249 235 <td class="px-6 py-4 whitespace-nowrap text-right text-sm text-gray-800 font-medium">
250 236 <?php
251 237 // Use InvoiceFormatter for proper currency formatting
@@ -253,15 +239,15 @@
253 239 echo esc_html($formatter->format($invoice['amount'] ?? 0));
254 240 ?>
255 241 </td>
256 242 <td class="px-6 py-4 whitespace-nowrap text-center">
257 - <span class="px-3 py-1 inline-flex text-xs leading-5 font-semibold rounded-full <?php echo $status_class; ?>">
258 - <i class="<?php echo $status_icon; ?> mr-1.5"></i>
259 - <?php echo ucfirst(esc_html($invoice['status'])); ?>
243 + <span class="px-3 py-1 inline-flex text-xs leading-5 font-semibold rounded-full <?php echo esc_attr($status_class); ?>">
244 + <i class="<?php echo esc_attr($status_icon); ?> mr-1.5"></i>
245 + <?php echo esc_html( \EasyInvoice\Helpers\InvoiceStatus::label( $status_key ) ); ?>
260 246 </span>
261 247 </td>
262 248 <td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium space-x-3">
263 - <a href="<?php echo get_permalink($invoice['id']); ?>" class="text-indigo-600 hover:text-indigo-900" data-tooltip="View Invoice">
249 + <a href="<?php echo esc_url(get_permalink($invoice['id'])); ?>" class="text-indigo-600 hover:text-indigo-900" data-tooltip="View Invoice">
264 250 <i class="fas fa-eye"></i>
265 251 </a>
266 252 <a href="?page=easy-invoice-builder&invoice_id=<?php echo esc_attr($invoice['id']); ?>" class="text-gray-500 hover:text-indigo-900" data-tooltip="Edit Invoice">
267 253 <i class="fas fa-pen"></i>
@@ -274,14 +260,13 @@
274 260 </div>
275 261 <?php endif; ?>
276 262 </div>
277 263
278 - <!-- Client Quotes -->
279 264 <div class="bg-white shadow-sm rounded-xl border border-gray-200 mt-6">
280 265 <div class="p-6 border-b border-gray-200">
281 266 <h2 class="text-lg font-semibold text-gray-800 flex items-center">
282 267 <i class="fas fa-file-contract text-green-500 mr-3"></i>
283 - <span>Quotes</span>
268 + <span><?php esc_html_e('Quotes', 'easy-invoice'); ?></span>
284 269 </h2>
285 270 </div>
286 271
287 272 <?php if (empty($quotes)): ?>
@@ -286,9 +271,9 @@
286 271
287 272 <?php if (empty($quotes)): ?>
288 273 <div class="text-center py-12">
289 274 <div class="text-gray-400 mb-4"><i class="fas fa-file-contract fa-4x"></i></div>
290 - <p class="text-gray-500 font-medium mb-4">No quotes found for this client.</p>
275 + <p class="text-gray-500 font-medium mb-4"><?php esc_html_e('No quotes found for this client.', 'easy-invoice'); ?></p>
291 276 </div>
292 277 <?php else: ?>
293 278 <div class="overflow-x-auto">
294 279 <table class="min-w-full divide-y divide-gray-200">
@@ -293,15 +278,15 @@
293 278 <div class="overflow-x-auto">
294 279 <table class="min-w-full divide-y divide-gray-200">
295 280 <thead class="bg-gray-50">
296 281 <tr>
297 - <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Quote</th>
298 - <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Date</th>
299 - <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Expiry Date</th>
300 - <th scope="col" class="px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">Amount</th>
301 - <th scope="col" class="px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">Status</th>
282 + <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Quote', 'easy-invoice'); ?></th>
283 + <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Date', 'easy-invoice'); ?></th>
284 + <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Expiry Date', 'easy-invoice'); ?></th>
285 + <th scope="col" class="px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Amount', 'easy-invoice'); ?></th>
286 + <th scope="col" class="px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider"><?php esc_html_e('Status', 'easy-invoice'); ?></th>
302 287 <th scope="col" class="relative px-6 py-3">
303 - <span class="sr-only">Actions</span>
288 + <span class="sr-only"><?php esc_html_e('Actions', 'easy-invoice'); ?></span>
304 289 </th>
305 290 </tr>
306 291 </thead>
307 292 <tbody class="bg-white divide-y divide-gray-200">
@@ -333,9 +318,9 @@
333 318 <tr>
334 319 <td class="px-6 py-4 whitespace-nowrap">
335 320 <div class="flex flex-col">
336 321 <div class="text-sm font-semibold text-green-600 hover:text-green-800">
337 - <a href="<?php echo get_permalink($quote['id']); ?>"><?php echo esc_html($quote['title']); ?></a>
322 + <a href="<?php echo esc_url(get_permalink($quote['id'])); ?>"><?php echo esc_html($quote['title']); ?></a>
338 323 </div>
339 324 <div class="text-xs text-gray-500 font-mono">
340 325 <?php echo esc_html($quote['quote_number']); ?>
341 326 </div>
@@ -341,12 +326,12 @@
341 326 </div>
342 327 </div>
343 328 </td>
344 329 <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
345 - <?php echo esc_html(date("M d, Y", strtotime($quote['date']))); ?>
330 + <?php echo esc_html(gmdate("M d, Y", strtotime($quote['date']))); ?>
346 331 </td>
347 332 <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
348 - <?php echo esc_html(date("M d, Y", strtotime($quote['expiry_date']))); ?>
333 + <?php echo esc_html(gmdate("M d, Y", strtotime($quote['expiry_date']))); ?>
349 334 </td>
350 335 <td class="px-6 py-4 whitespace-nowrap text-right text-sm text-gray-800 font-medium">
351 336 <?php
352 337 // Use QuoteFormatter for proper currency formatting
@@ -354,15 +339,15 @@
354 339 echo esc_html($formatter->format($quote['amount'] ?? 0));
355 340 ?>
356 341 </td>
357 342 <td class="px-6 py-4 whitespace-nowrap text-center">
358 - <span class="px-3 py-1 inline-flex text-xs leading-5 font-semibold rounded-full <?php echo $status_class; ?>">
359 - <i class="<?php echo $status_icon; ?> mr-1.5"></i>
360 - <?php echo ucfirst(esc_html($quote['status'])); ?>
343 + <span class="px-3 py-1 inline-flex text-xs leading-5 font-semibold rounded-full <?php echo esc_attr($status_class); ?>">
344 + <i class="<?php echo esc_attr($status_icon); ?> mr-1.5"></i>
345 + <?php echo esc_html(ucfirst($quote['status'])); ?>
361 346 </span>
362 347 </td>
363 348 <td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium space-x-3">
364 - <a href="<?php echo get_permalink($quote['id']); ?>" class="text-green-600 hover:text-green-900" data-tooltip="View Quote">
349 + <a href="<?php echo esc_url(get_permalink($quote['id'])); ?>" class="text-green-600 hover:text-green-900" data-tooltip="View Quote">
365 350 <i class="fas fa-eye"></i>
366 351 </a>
367 352 <a href="?page=easy-invoice-quote-builder&quote_id=<?php echo esc_attr($quote['id']); ?>" class="text-gray-500 hover:text-green-900" data-tooltip="Edit Quote">
368 353 <i class="fas fa-pen"></i>