mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-04 08:37:32 -05:00 
			
		
		
		
	Merge branch 'v5-develop' of https://github.com/turbo124/invoiceninja into v5-develop
This commit is contained in:
		
						commit
						7e3d85c0b6
					
				
							
								
								
									
										30
									
								
								app/Helpers/Document/WithTypeHelpers.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								app/Helpers/Document/WithTypeHelpers.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Invoice Ninja (https://invoiceninja.com).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @link https://github.com/invoiceninja/invoiceninja source repository
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @license https://www.elastic.co/licensing/elastic-license
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace App\Helpers\Document;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					trait WithTypeHelpers
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns boolean based on checks for image.
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @return bool 
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function isImage(): bool
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (in_array($this->type, ['png', 'svg', 'jpeg', 'jpg', 'tiff', 'gif'])) {
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -59,7 +59,6 @@ class InvoiceController extends Controller
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        $invoice->service()->removeUnpaidGatewayFees()->save();
 | 
					        $invoice->service()->removeUnpaidGatewayFees()->save();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
            $invitation = $invoice->invitations()->where('client_contact_id', auth()->user()->id)->first();
 | 
					            $invitation = $invoice->invitations()->where('client_contact_id', auth()->user()->id)->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if ($invitation && auth()->guard('contact') && ! request()->has('silent') && ! $invitation->viewed_date) {
 | 
					            if ($invitation && auth()->guard('contact') && ! request()->has('silent') && ! $invitation->viewed_date) {
 | 
				
			||||||
 | 
				
			|||||||
@ -221,6 +221,9 @@ class BaseTransformer
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        $name = strtolower(trim($name));
 | 
					        $name = strtolower(trim($name));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(strlen($name) == 2)
 | 
				
			||||||
 | 
					            return $this->getCountryIdBy2($name);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        return isset($this->maps['countries'][$name]) ? $this->maps['countries'][$name] : null;
 | 
					        return isset($this->maps['countries'][$name]) ? $this->maps['countries'][$name] : null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -75,7 +75,7 @@ class ClientPaymentFailureObject
 | 
				
			|||||||
        $mail_obj->amount = $this->getAmount();
 | 
					        $mail_obj->amount = $this->getAmount();
 | 
				
			||||||
        $mail_obj->subject = $this->getSubject();
 | 
					        $mail_obj->subject = $this->getSubject();
 | 
				
			||||||
        $mail_obj->data = $this->getData();
 | 
					        $mail_obj->data = $this->getData();
 | 
				
			||||||
        $mail_obj->markdown = 'email.admin.generic';
 | 
					        $mail_obj->markdown = 'email.client.generic';
 | 
				
			||||||
        $mail_obj->tag = $this->company->company_key;
 | 
					        $mail_obj->tag = $this->company->company_key;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return $mail_obj;
 | 
					        return $mail_obj;
 | 
				
			||||||
@ -113,14 +113,15 @@ class ClientPaymentFailureObject
 | 
				
			|||||||
                ]
 | 
					                ]
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            'greeting' => ctrans('texts.email_salutation', ['name' => $this->client->present()->name]),
 | 
					            'greeting' => ctrans('texts.email_salutation', ['name' => $this->client->present()->name]),
 | 
				
			||||||
            'message' => ctrans('texts.client_payment_failure_body', ['invoice' => implode(",", $this->invoices->pluck('number')->toArray()), 'amount' => $this->getAmount()]),
 | 
					            'content' => ctrans('texts.client_payment_failure_body', ['invoice' => implode(",", $this->invoices->pluck('number')->toArray()), 'amount' => $this->getAmount()]),
 | 
				
			||||||
            'signature' => $signature,
 | 
					            'signature' => $signature,
 | 
				
			||||||
            'logo' => $this->company->present()->logo(),
 | 
					            'logo' => $this->company->present()->logo(),
 | 
				
			||||||
            'settings' => $this->client->getMergedSettings(),
 | 
					            'settings' => $this->client->getMergedSettings(),
 | 
				
			||||||
            'whitelabel' => $this->company->account->isPaid() ? true : false,
 | 
					            'whitelabel' => $this->company->account->isPaid() ? true : false,
 | 
				
			||||||
            'url' => route('client.login'),
 | 
					            'view_link' => $html_variables['$payment_link'],
 | 
				
			||||||
            'button' => ctrans('texts.login'),
 | 
					            'button' => $html_variables['$payment_button'],
 | 
				
			||||||
            'additional_info' => false
 | 
					            'additional_info' => false,
 | 
				
			||||||
 | 
					            'company' => $this->company,
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return $data;
 | 
					        return $data;
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace App\Models;
 | 
					namespace App\Models;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use App\Helpers\Document\WithTypeHelpers;
 | 
				
			||||||
use App\Models\Filterable;
 | 
					use App\Models\Filterable;
 | 
				
			||||||
use Illuminate\Database\Eloquent\SoftDeletes;
 | 
					use Illuminate\Database\Eloquent\SoftDeletes;
 | 
				
			||||||
use Illuminate\Support\Facades\Storage;
 | 
					use Illuminate\Support\Facades\Storage;
 | 
				
			||||||
@ -19,6 +20,7 @@ class Document extends BaseModel
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    use SoftDeletes;
 | 
					    use SoftDeletes;
 | 
				
			||||||
    use Filterable;
 | 
					    use Filterable;
 | 
				
			||||||
 | 
					    use WithTypeHelpers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const DOCUMENT_PREVIEW_SIZE = 300; // pixels
 | 
					    const DOCUMENT_PREVIEW_SIZE = 300; // pixels
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -63,8 +63,8 @@ class CreditCard
 | 
				
			|||||||
        $transaction = [
 | 
					        $transaction = [
 | 
				
			||||||
            'Reference' => $this->eway_driver->client->number,
 | 
					            'Reference' => $this->eway_driver->client->number,
 | 
				
			||||||
            'Title' => '',
 | 
					            'Title' => '',
 | 
				
			||||||
            'FirstName' => $this->eway_driver->client->contacts()->first()->present()->last_name(),
 | 
					            'FirstName' => $this->eway_driver->client->contacts()->first()->present()->first_name(),
 | 
				
			||||||
            'LastName' => $this->eway_driver->client->contacts()->first()->present()->first_name(),
 | 
					            'LastName' => $this->eway_driver->client->contacts()->first()->present()->last_name(),
 | 
				
			||||||
            'CompanyName' => $this->eway_driver->client->name,
 | 
					            'CompanyName' => $this->eway_driver->client->name,
 | 
				
			||||||
            'Street1' => $this->eway_driver->client->address1,
 | 
					            'Street1' => $this->eway_driver->client->address1,
 | 
				
			||||||
            'Street2' => $this->eway_driver->client->address2,
 | 
					            'Street2' => $this->eway_driver->client->address2,
 | 
				
			||||||
 | 
				
			|||||||
@ -481,6 +481,8 @@ class HtmlEngine
 | 
				
			|||||||
        $data['$statement_amount'] = ['value' => '', 'label' => ctrans('texts.amount')];
 | 
					        $data['$statement_amount'] = ['value' => '', 'label' => ctrans('texts.amount')];
 | 
				
			||||||
        $data['$statement'] = ['value' => '', 'label' => ctrans('texts.statement')];
 | 
					        $data['$statement'] = ['value' => '', 'label' => ctrans('texts.statement')];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $data['$entity_images'] = ['value' => $this->generateEntityImagesMarkup(), 'label' => ''];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $arrKeysLength = array_map('strlen', array_keys($data));
 | 
					        $arrKeysLength = array_map('strlen', array_keys($data));
 | 
				
			||||||
        array_multisort($arrKeysLength, SORT_DESC, $data);
 | 
					        array_multisort($arrKeysLength, SORT_DESC, $data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -737,4 +739,38 @@ html {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return $css;
 | 
					        return $css;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Generate markup for HTML images on entity.
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @return string|void 
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected function generateEntityImagesMarkup()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if ($this->client->getSetting('embed_documents') === false) {
 | 
				
			||||||
 | 
					            return '';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $dom = new \DOMDocument('1.0', 'UTF-8');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $container =  $dom->createElement('div');
 | 
				
			||||||
 | 
					        $container->setAttribute('style', 'display:grid; grid-auto-flow: row; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(2, 1fr);');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        foreach ($this->entity->documents as $document) {
 | 
				
			||||||
 | 
					            if (!$document->isImage()) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $image = $dom->createElement('img');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $image->setAttribute('src', $document->generateUrl());
 | 
				
			||||||
 | 
					            $image->setAttribute('style', 'max-height: 100px; margin-top: 20px;');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $container->appendChild($image);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $dom->appendChild($container);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $dom->saveHTML();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										6
									
								
								public/flutter_service_worker.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								public/flutter_service_worker.js
									
									
									
									
										vendored
									
									
								
							@ -6,10 +6,10 @@ const RESOURCES = {
 | 
				
			|||||||
  "icons/Icon-512.png": "0f9aff01367f0a0c69773d25ca16ef35",
 | 
					  "icons/Icon-512.png": "0f9aff01367f0a0c69773d25ca16ef35",
 | 
				
			||||||
"icons/Icon-192.png": "bb1cf5f6982006952211c7c8404ffbed",
 | 
					"icons/Icon-192.png": "bb1cf5f6982006952211c7c8404ffbed",
 | 
				
			||||||
"favicon.png": "dca91c54388f52eded692718d5a98b8b",
 | 
					"favicon.png": "dca91c54388f52eded692718d5a98b8b",
 | 
				
			||||||
"/": "542e2d73b9cfe7a3d5174afa95366cc3",
 | 
					"/": "b4c07dbdd037f673ca8bc623748c8dad",
 | 
				
			||||||
"manifest.json": "ef43d90e57aa7682d7e2cfba2f484a40",
 | 
					"manifest.json": "ef43d90e57aa7682d7e2cfba2f484a40",
 | 
				
			||||||
"favicon.ico": "51636d3a390451561744c42188ccd628",
 | 
					"favicon.ico": "51636d3a390451561744c42188ccd628",
 | 
				
			||||||
"version.json": "6d65f0d3d61870372cdbb5f485e4da00",
 | 
					"version.json": "9c7b0edc83733da56c726678aacd9fd3",
 | 
				
			||||||
"assets/fonts/MaterialIcons-Regular.otf": "4e6447691c9509f7acdbf8a931a85ca1",
 | 
					"assets/fonts/MaterialIcons-Regular.otf": "4e6447691c9509f7acdbf8a931a85ca1",
 | 
				
			||||||
"assets/NOTICES": "9eb7e2eb2888ea5bae5f536720db37cd",
 | 
					"assets/NOTICES": "9eb7e2eb2888ea5bae5f536720db37cd",
 | 
				
			||||||
"assets/packages/material_design_icons_flutter/lib/fonts/materialdesignicons-webfont.ttf": "174c02fc4609e8fc4389f5d21f16a296",
 | 
					"assets/packages/material_design_icons_flutter/lib/fonts/materialdesignicons-webfont.ttf": "174c02fc4609e8fc4389f5d21f16a296",
 | 
				
			||||||
@ -34,7 +34,7 @@ const RESOURCES = {
 | 
				
			|||||||
"assets/assets/images/google_logo.png": "0f118259ce403274f407f5e982e681c3",
 | 
					"assets/assets/images/google_logo.png": "0f118259ce403274f407f5e982e681c3",
 | 
				
			||||||
"assets/assets/images/logo_light.png": "e5f46d5a78e226e7a9553d4ca6f69219",
 | 
					"assets/assets/images/logo_light.png": "e5f46d5a78e226e7a9553d4ca6f69219",
 | 
				
			||||||
"assets/AssetManifest.json": "38d9aea341601f3a5c6fa7b5a1216ea5",
 | 
					"assets/AssetManifest.json": "38d9aea341601f3a5c6fa7b5a1216ea5",
 | 
				
			||||||
"main.dart.js": "9ce1905069f75f930622606502e06e31"
 | 
					"main.dart.js": "14e5394ca49eb2b79256a95f65a7905b"
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The application shell files that are downloaded before a service worker can
 | 
					// The application shell files that are downloaded before a service worker can
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								public/js/clients/invoices/payment.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								public/js/clients/invoices/payment.js
									
									
									
									
										vendored
									
									
								
							@ -1,2 +1,2 @@
 | 
				
			|||||||
/*! For license information please see payment.js.LICENSE.txt */
 | 
					/*! For license information please see payment.js.LICENSE.txt */
 | 
				
			||||||
(()=>{function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}var t=function(){function t(e,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),this.shouldDisplayTerms=e,this.shouldDisplaySignature=n,this.termsAccepted=!1}var n,a,i;return n=t,(a=[{key:"handleMethodSelect",value:function(e){var t=this;document.getElementById("company_gateway_id").value=e.dataset.companyGatewayId,document.getElementById("payment_method_id").value=e.dataset.gatewayTypeId,this.shouldDisplaySignature&&!this.shouldDisplayTerms&&(this.displayTerms(),document.getElementById("accept-terms-button").addEventListener("click",(function(){t.termsAccepted=!0,t.submitForm()}))),!this.shouldDisplaySignature&&this.shouldDisplayTerms&&(this.displaySignature(),document.getElementById("signature-next-step").addEventListener("click",(function(){document.querySelector('input[name="signature"').value=t.signaturePad.toDataURL(),t.submitForm()}))),this.shouldDisplaySignature&&this.shouldDisplayTerms&&(this.displaySignature(),document.getElementById("signature-next-step").addEventListener("click",(function(){t.displayTerms(),document.getElementById("accept-terms-button").addEventListener("click",(function(){document.querySelector('input[name="signature"').value=t.signaturePad.toDataURL(),t.termsAccepted=!0,t.submitForm()}))}))),this.shouldDisplaySignature||this.shouldDisplayTerms||this.submitForm()}},{key:"submitForm",value:function(){document.getElementById("payment-form").submit()}},{key:"displayTerms",value:function(){document.getElementById("displayTermsModal").removeAttribute("style")}},{key:"displaySignature",value:function(){document.getElementById("displaySignatureModal").removeAttribute("style");var e=new SignaturePad(document.getElementById("signature-pad"),{penColor:"rgb(0, 0, 0)"});this.signaturePad=e}},{key:"handle",value:function(){var e=this;document.querySelectorAll(".dropdown-gateway-button").forEach((function(t){t.addEventListener("click",(function(){return e.handleMethodSelect(t)}))}))}}])&&e(n.prototype,a),i&&e(n,i),t}(),n=document.querySelector('meta[name="require-invoice-signature"]').content,a=document.querySelector('meta[name="show-invoice-terms"]').content;new t(Boolean(+n),Boolean(+a)).handle()})();
 | 
					(()=>{function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}var t=function(){function t(e,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),this.shouldDisplayTerms=e,this.shouldDisplaySignature=n,this.termsAccepted=!1,this.submitting=!1}var n,a,i;return n=t,(a=[{key:"handleMethodSelect",value:function(e){var t=this;document.getElementById("company_gateway_id").value=e.dataset.companyGatewayId,document.getElementById("payment_method_id").value=e.dataset.gatewayTypeId,this.shouldDisplaySignature&&!this.shouldDisplayTerms&&(this.displayTerms(),document.getElementById("accept-terms-button").addEventListener("click",(function(){t.termsAccepted=!0,t.submitForm()}))),!this.shouldDisplaySignature&&this.shouldDisplayTerms&&(this.displaySignature(),document.getElementById("signature-next-step").addEventListener("click",(function(){document.querySelector('input[name="signature"').value=t.signaturePad.toDataURL(),t.submitForm()}))),this.shouldDisplaySignature&&this.shouldDisplayTerms&&(this.displaySignature(),document.getElementById("signature-next-step").addEventListener("click",(function(){t.displayTerms(),document.getElementById("accept-terms-button").addEventListener("click",(function(){document.querySelector('input[name="signature"').value=t.signaturePad.toDataURL(),t.termsAccepted=!0,t.submitForm()}))}))),this.shouldDisplaySignature||this.shouldDisplayTerms||this.submitForm()}},{key:"submitForm",value:function(){document.getElementById("payment-form").submit()}},{key:"displayTerms",value:function(){document.getElementById("displayTermsModal").removeAttribute("style")}},{key:"displaySignature",value:function(){document.getElementById("displaySignatureModal").removeAttribute("style");var e=new SignaturePad(document.getElementById("signature-pad"),{penColor:"rgb(0, 0, 0)"});this.signaturePad=e}},{key:"handle",value:function(){var e=this;document.querySelectorAll(".dropdown-gateway-button").forEach((function(t){t.addEventListener("click",(function(){e.submitting||(e.handleMethodSelect(t),e.submitting=!0)}))}))}}])&&e(n.prototype,a),i&&e(n,i),t}(),n=document.querySelector('meta[name="require-invoice-signature"]').content,a=document.querySelector('meta[name="show-invoice-terms"]').content;new t(Boolean(+n),Boolean(+a)).handle()})();
 | 
				
			||||||
							
								
								
									
										186846
									
								
								public/main.dart.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										186846
									
								
								public/main.dart.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										220258
									
								
								public/main.foss.dart.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										220258
									
								
								public/main.foss.dart.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										186242
									
								
								public/main.html.dart.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										186242
									
								
								public/main.html.dart.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										182566
									
								
								public/main.next.dart.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										182566
									
								
								public/main.next.dart.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										7687
									
								
								public/main.profile.dart.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7687
									
								
								public/main.profile.dart.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -4,7 +4,7 @@
 | 
				
			|||||||
    "/js/clients/payments/authorize-credit-card-payment.js": "/js/clients/payments/authorize-credit-card-payment.js?id=cfe5de1cf87a0b01568d",
 | 
					    "/js/clients/payments/authorize-credit-card-payment.js": "/js/clients/payments/authorize-credit-card-payment.js?id=cfe5de1cf87a0b01568d",
 | 
				
			||||||
    "/js/clients/payments/stripe-ach.js": "/js/clients/payments/stripe-ach.js?id=5e74bc0d346beeb57ee9",
 | 
					    "/js/clients/payments/stripe-ach.js": "/js/clients/payments/stripe-ach.js?id=5e74bc0d346beeb57ee9",
 | 
				
			||||||
    "/js/clients/invoices/action-selectors.js": "/js/clients/invoices/action-selectors.js?id=6b79265cbb8c963eef19",
 | 
					    "/js/clients/invoices/action-selectors.js": "/js/clients/invoices/action-selectors.js?id=6b79265cbb8c963eef19",
 | 
				
			||||||
    "/js/clients/invoices/payment.js": "/js/clients/invoices/payment.js?id=5b79f72432f92a85fefa",
 | 
					    "/js/clients/invoices/payment.js": "/js/clients/invoices/payment.js?id=d9132fae12153a6943a6",
 | 
				
			||||||
    "/js/clients/payments/stripe-sofort.js": "/js/clients/payments/stripe-sofort.js?id=926c7b9d1ee48bbf786b",
 | 
					    "/js/clients/payments/stripe-sofort.js": "/js/clients/payments/stripe-sofort.js?id=926c7b9d1ee48bbf786b",
 | 
				
			||||||
    "/js/clients/payments/stripe-alipay.js": "/js/clients/payments/stripe-alipay.js?id=1e159400d6a5ca4662c1",
 | 
					    "/js/clients/payments/stripe-alipay.js": "/js/clients/payments/stripe-alipay.js?id=1e159400d6a5ca4662c1",
 | 
				
			||||||
    "/js/clients/payments/checkout-credit-card.js": "/js/clients/payments/checkout-credit-card.js?id=0b47ce36fe20191adb33",
 | 
					    "/js/clients/payments/checkout-credit-card.js": "/js/clients/payments/checkout-credit-card.js?id=0b47ce36fe20191adb33",
 | 
				
			||||||
 | 
				
			|||||||
@ -1 +1 @@
 | 
				
			|||||||
{"app_name":"invoiceninja_flutter","version":"5.0.64","build_number":"64"}
 | 
					{"app_name":"invoiceninja_flutter","version":"5.0.67","build_number":"67"}
 | 
				
			||||||
							
								
								
									
										11
									
								
								resources/js/clients/invoices/payment.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								resources/js/clients/invoices/payment.js
									
									
									
									
										vendored
									
									
								
							@ -13,6 +13,7 @@ class Payment {
 | 
				
			|||||||
        this.shouldDisplayTerms = displayTerms;
 | 
					        this.shouldDisplayTerms = displayTerms;
 | 
				
			||||||
        this.shouldDisplaySignature = displaySignature;
 | 
					        this.shouldDisplaySignature = displaySignature;
 | 
				
			||||||
        this.termsAccepted = false;
 | 
					        this.termsAccepted = false;
 | 
				
			||||||
 | 
					        this.submitting = false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    handleMethodSelect(element) {
 | 
					    handleMethodSelect(element) {
 | 
				
			||||||
@ -95,9 +96,13 @@ class Payment {
 | 
				
			|||||||
        document
 | 
					        document
 | 
				
			||||||
            .querySelectorAll(".dropdown-gateway-button")
 | 
					            .querySelectorAll(".dropdown-gateway-button")
 | 
				
			||||||
            .forEach(element => {
 | 
					            .forEach(element => {
 | 
				
			||||||
                element.addEventListener("click", () =>
 | 
					                element.addEventListener("click", () => {
 | 
				
			||||||
                    this.handleMethodSelect(element)
 | 
					                    if (!this.submitting) {
 | 
				
			||||||
                );
 | 
					                        this.handleMethodSelect(element)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        this.submitting = true;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -367,6 +367,9 @@
 | 
				
			|||||||
        </tfoot>
 | 
					        </tfoot>
 | 
				
			||||||
    </table>
 | 
					    </table>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$entity_images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div id="footer">
 | 
					<div id="footer">
 | 
				
			||||||
    <div>
 | 
					    <div>
 | 
				
			||||||
        <p data-ref="total_table-footer">$entity_footer</p>
 | 
					        <p data-ref="total_table-footer">$entity_footer</p>
 | 
				
			||||||
 | 
				
			|||||||
@ -294,7 +294,7 @@
 | 
				
			|||||||
    /** To find out selectors on your own: https://invoiceninja.github.io/docs/custom-fields/#snippets **/
 | 
					    /** To find out selectors on your own: https://invoiceninja.github.io/docs/custom-fields/#snippets **/
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<table>
 | 
					<table style="min-width: 100%">
 | 
				
			||||||
   <thead>
 | 
					   <thead>
 | 
				
			||||||
      <tr>
 | 
					      <tr>
 | 
				
			||||||
         <td>
 | 
					         <td>
 | 
				
			||||||
@ -347,6 +347,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<div class="repeating-header" id="header"></div>
 | 
					<div class="repeating-header" id="header"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$entity_images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div class="repeating-footer" id="footer">
 | 
					<div class="repeating-footer" id="footer">
 | 
				
			||||||
    <p data-ref="total_table-footer">$entity_footer</p>
 | 
					    <p data-ref="total_table-footer">$entity_footer</p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
				
			|||||||
@ -258,7 +258,7 @@
 | 
				
			|||||||
    /** To find out selectors on your own: https://invoiceninja.github.io/docs/custom-fields/#snippets **/
 | 
					    /** To find out selectors on your own: https://invoiceninja.github.io/docs/custom-fields/#snippets **/
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<table>
 | 
					<table style="min-width: 100%">
 | 
				
			||||||
   <thead>
 | 
					   <thead>
 | 
				
			||||||
      <tr>
 | 
					      <tr>
 | 
				
			||||||
         <td>
 | 
					         <td>
 | 
				
			||||||
@ -309,6 +309,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<div class="repeating-header" id="header"></div>
 | 
					<div class="repeating-header" id="header"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$entity_images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div class="repeating-footer" id="footer">
 | 
					<div class="repeating-footer" id="footer">
 | 
				
			||||||
   <p data-ref="total_table-footer">$entity_footer</p>
 | 
					   <p data-ref="total_table-footer">$entity_footer</p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
				
			|||||||
@ -247,7 +247,7 @@
 | 
				
			|||||||
    /** To find out selectors on your own: https://invoiceninja.github.io/docs/custom-fields/#snippets **/
 | 
					    /** To find out selectors on your own: https://invoiceninja.github.io/docs/custom-fields/#snippets **/
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<table>
 | 
					<table style="min-width: 100%">
 | 
				
			||||||
   <thead>
 | 
					   <thead>
 | 
				
			||||||
      <tr>
 | 
					      <tr>
 | 
				
			||||||
         <td>
 | 
					         <td>
 | 
				
			||||||
@ -307,6 +307,8 @@
 | 
				
			|||||||
   <p data-ref="total_table-footer">$entity_footer</p>
 | 
					   <p data-ref="total_table-footer">$entity_footer</p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$entity_images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
    // Clear up space a bit, if [product-table, tasks-table, delivery-note-table] isn't present.
 | 
					    // Clear up space a bit, if [product-table, tasks-table, delivery-note-table] isn't present.
 | 
				
			||||||
    document.addEventListener('DOMContentLoaded', () => {
 | 
					    document.addEventListener('DOMContentLoaded', () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -317,6 +317,8 @@
 | 
				
			|||||||
   <p data-ref="total_table-footer">$entity_footer</p>
 | 
					   <p data-ref="total_table-footer">$entity_footer</p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$entity_images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
    // Clear up space a bit, if [product-table, tasks-table, delivery-note-table] isn't present.
 | 
					    // Clear up space a bit, if [product-table, tasks-table, delivery-note-table] isn't present.
 | 
				
			||||||
    document.addEventListener('DOMContentLoaded', () => {
 | 
					    document.addEventListener('DOMContentLoaded', () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -272,7 +272,7 @@
 | 
				
			|||||||
    /** To find out selectors on your own: https://invoiceninja.github.io/docs/custom-fields/#snippets **/
 | 
					    /** To find out selectors on your own: https://invoiceninja.github.io/docs/custom-fields/#snippets **/
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<table>
 | 
					<table style="min-width: 100%">
 | 
				
			||||||
   <thead>
 | 
					   <thead>
 | 
				
			||||||
      <tr>
 | 
					      <tr>
 | 
				
			||||||
         <td>
 | 
					         <td>
 | 
				
			||||||
@ -358,6 +358,8 @@
 | 
				
			|||||||
   <p data-ref="total_table-footer">$entity_footer</p>
 | 
					   <p data-ref="total_table-footer">$entity_footer</p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$entity_images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
    // Clear up space a bit, if [product-table, tasks-table, delivery-note-table] isn't present.
 | 
					    // Clear up space a bit, if [product-table, tasks-table, delivery-note-table] isn't present.
 | 
				
			||||||
    document.addEventListener('DOMContentLoaded', () => {
 | 
					    document.addEventListener('DOMContentLoaded', () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -344,6 +344,8 @@
 | 
				
			|||||||
    </table>
 | 
					    </table>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$entity_images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div id="footer">
 | 
					<div id="footer">
 | 
				
			||||||
    <div class="footer-content">
 | 
					    <div class="footer-content">
 | 
				
			||||||
        <div>
 | 
					        <div>
 | 
				
			||||||
 | 
				
			|||||||
@ -238,7 +238,7 @@
 | 
				
			|||||||
    /** To find out selectors on your own: https://invoiceninja.github.io/docs/custom-fields/#snippets **/
 | 
					    /** To find out selectors on your own: https://invoiceninja.github.io/docs/custom-fields/#snippets **/
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<table>
 | 
					<table style="min-width: 100%">
 | 
				
			||||||
   <thead>
 | 
					   <thead>
 | 
				
			||||||
      <tr>
 | 
					      <tr>
 | 
				
			||||||
         <td>
 | 
					         <td>
 | 
				
			||||||
@ -292,6 +292,8 @@
 | 
				
			|||||||
   <p data-ref="total_table-footer">$entity_footer</p>
 | 
					   <p data-ref="total_table-footer">$entity_footer</p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$entity_images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
    // Clear up space a bit, if [product-table, tasks-table, delivery-note-table] isn't present.
 | 
					    // Clear up space a bit, if [product-table, tasks-table, delivery-note-table] isn't present.
 | 
				
			||||||
    document.addEventListener('DOMContentLoaded', () => {
 | 
					    document.addEventListener('DOMContentLoaded', () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -375,7 +375,9 @@
 | 
				
			|||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div  class="repeating-footer"  id="footer">
 | 
					$entity_images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="repeating-footer"  id="footer">
 | 
				
			||||||
    <p data-ref="total_table-footer">$entity_footer</p>
 | 
					    <p data-ref="total_table-footer">$entity_footer</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <div id="footer-colors">
 | 
					    <div id="footer-colors">
 | 
				
			||||||
 | 
				
			|||||||
@ -357,6 +357,8 @@
 | 
				
			|||||||
   <p data-ref="total_table-footer">$entity_footer</p>
 | 
					   <p data-ref="total_table-footer">$entity_footer</p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$entity_images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
    // Clear up space a bit, if [product-table, tasks-table, delivery-note-table] isn't present.
 | 
					    // Clear up space a bit, if [product-table, tasks-table, delivery-note-table] isn't present.
 | 
				
			||||||
    document.addEventListener('DOMContentLoaded', () => {
 | 
					    document.addEventListener('DOMContentLoaded', () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,23 +1,42 @@
 | 
				
			|||||||
@if($entity->documents->count() > 0)
 | 
					@if ($entity->documents->count() > 0 || $entity->company->documents->count() > 0)
 | 
				
			||||||
    <div class="bg-white shadow sm:rounded-lg my-4">
 | 
					    <div class="bg-white shadow sm:rounded-lg my-4">
 | 
				
			||||||
        <div class="px-4 py-5 sm:p-6">
 | 
					        <div class="px-4 py-5 sm:p-6">
 | 
				
			||||||
            <div class="sm:flex sm:items-start sm:justify-between">
 | 
					            <div class="sm:flex sm:items-start sm:justify-between">
 | 
				
			||||||
                <div>
 | 
					                <div>
 | 
				
			||||||
                    <p class="text-lg leading-6 font-medium text-gray-900">{{ ctrans('texts.attachments') }}:</p>
 | 
					                    <p class="text-lg leading-6 font-medium text-gray-900">{{ ctrans('texts.attachments') }}:</p>
 | 
				
			||||||
                    @foreach($entity->documents as $document)
 | 
					                    @foreach ($entity->documents as $document)
 | 
				
			||||||
                        <div class="inline-flex items-center space-x-1">
 | 
					                        <div class="inline-flex items-center space-x-1">
 | 
				
			||||||
                            <a href="{{ route('client.documents.show', $document->hashed_id) }}" target="_blank"
 | 
					                            <a href="{{ route('client.documents.show', $document->hashed_id) }}" target="_blank"
 | 
				
			||||||
                               class="block text-sm button-link text-primary">{{ Illuminate\Support\Str::limit($document->name, 40) }}</a>
 | 
					                                class="block text-sm button-link text-primary">{{ Illuminate\Support\Str::limit($document->name, 40) }}</a>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
 | 
					                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
 | 
				
			||||||
                                 fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
 | 
					                                stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
 | 
				
			||||||
                                 stroke-linejoin="round" class="text-primary h-6 w-4">
 | 
					                                class="text-primary h-6 w-4">
 | 
				
			||||||
                                <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
 | 
					                                <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
 | 
				
			||||||
                                <polyline points="15 3 21 3 21 9"></polyline>
 | 
					                                <polyline points="15 3 21 3 21 9"></polyline>
 | 
				
			||||||
                                <line x1="10" y1="14" x2="21" y2="3"></line>
 | 
					                                <line x1="10" y1="14" x2="21" y2="3"></line>
 | 
				
			||||||
                            </svg>
 | 
					                            </svg>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            @if(!$loop->last)
 | 
					                            @if (!$loop->last)
 | 
				
			||||||
 | 
					                                <span>—</span>
 | 
				
			||||||
 | 
					                            @endif
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
 | 
					                    @endforeach
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    @foreach ($entity->company->documents as $document)
 | 
				
			||||||
 | 
					                        <div class="inline-flex items-center space-x-1">
 | 
				
			||||||
 | 
					                            <a href="{{ route('client.documents.show', $document->hashed_id) }}" target="_blank"
 | 
				
			||||||
 | 
					                                class="block text-sm button-link text-primary">{{ Illuminate\Support\Str::limit($document->name, 40) }}</a>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
 | 
				
			||||||
 | 
					                                stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
 | 
				
			||||||
 | 
					                                class="text-primary h-6 w-4">
 | 
				
			||||||
 | 
					                                <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
 | 
				
			||||||
 | 
					                                <polyline points="15 3 21 3 21 9"></polyline>
 | 
				
			||||||
 | 
					                                <line x1="10" y1="14" x2="21" y2="3"></line>
 | 
				
			||||||
 | 
					                            </svg>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            @if (!$loop->last)
 | 
				
			||||||
                                <span>—</span>
 | 
					                                <span>—</span>
 | 
				
			||||||
                            @endif
 | 
					                            @endif
 | 
				
			||||||
                        </div>
 | 
					                        </div>
 | 
				
			||||||
 | 
				
			|||||||
@ -64,7 +64,7 @@
 | 
				
			|||||||
                <option>15</option>
 | 
					                <option>15</option>
 | 
				
			||||||
                <option>20</option>
 | 
					                <option>20</option>
 | 
				
			||||||
            </select>
 | 
					            </select>
 | 
				
			||||||
            <button x-on:click="document.getElementById('multiple-downloads').submit()" class="button button-primary bg-primary py-2 ml-2">
 | 
					            <button onclick="document.getElementById('multiple-downloads').submit(); setTimeout(() => this.disabled = true, 0); setTimeout(() => this.disabled = false, 5000);" class="button button-primary bg-primary py-2 ml-2">
 | 
				
			||||||
                <span class="hidden md:block">
 | 
					                <span class="hidden md:block">
 | 
				
			||||||
                    {{ ctrans('texts.download_selected') }}
 | 
					                    {{ ctrans('texts.download_selected') }}
 | 
				
			||||||
                </span>
 | 
					                </span>
 | 
				
			||||||
 | 
				
			|||||||
@ -99,7 +99,7 @@
 | 
				
			|||||||
                                        @csrf
 | 
					                                        @csrf
 | 
				
			||||||
                                        <input type="hidden" name="invoices[]" value="{{ $invoice->hashed_id }}">
 | 
					                                        <input type="hidden" name="invoices[]" value="{{ $invoice->hashed_id }}">
 | 
				
			||||||
                                        <input type="hidden" name="action" value="payment">
 | 
					                                        <input type="hidden" name="action" value="payment">
 | 
				
			||||||
                                        <button class="px-2 py-1 mr-3 text-xs uppercase button button-primary bg-primary" dusk="pay-now">
 | 
					                                        <button onclick="setTimeout(() => this.disabled = true, 0); return true;" class="px-2 py-1 mr-3 text-xs uppercase button button-primary bg-primary" dusk="pay-now">
 | 
				
			||||||
                                            {{ ctrans('texts.pay_now') }}
 | 
					                                            {{ ctrans('texts.pay_now') }}
 | 
				
			||||||
                                        </button>
 | 
					                                        </button>
 | 
				
			||||||
                                    </form>
 | 
					                                    </form>
 | 
				
			||||||
 | 
				
			|||||||
@ -15,10 +15,10 @@
 | 
				
			|||||||
    <div class="flex items-center">
 | 
					    <div class="flex items-center">
 | 
				
			||||||
        <form action="{{ route('client.invoices.bulk') }}" method="post" id="bulkActions">
 | 
					        <form action="{{ route('client.invoices.bulk') }}" method="post" id="bulkActions">
 | 
				
			||||||
            @csrf
 | 
					            @csrf
 | 
				
			||||||
            <button type="submit" class="button button-primary bg-primary" name="action" value="download">{{ ctrans('texts.download') }}</button>
 | 
					            <button type="submit" onclick="setTimeout(() => this.disabled = true, 0); setTimeout(() => this.disabled = false, 5000); return true;" class="button button-primary bg-primary" name="action" value="download">{{ ctrans('texts.download') }}</button>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            @if(!empty(auth()->user()->client->service()->getPaymentMethods(0)))
 | 
					            @if(!empty(auth()->user()->client->service()->getPaymentMethods(0)))
 | 
				
			||||||
                <button type="submit" class="button button-primary bg-primary" name="action" value="payment">{{ ctrans('texts.pay_now') }}</button>
 | 
					                <button onclick="setTimeout(() => this.disabled = true, 0); return true;" type="submit" class="button button-primary bg-primary" name="action" value="payment">{{ ctrans('texts.pay_now') }}</button>
 | 
				
			||||||
            @endif
 | 
					            @endif
 | 
				
			||||||
        </form>
 | 
					        </form>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
				
			|||||||
@ -36,7 +36,7 @@
 | 
				
			|||||||
                <form action="{{ route('client.payment_methods.destroy', [$payment_method->hashed_id, 'method' => $payment_method->gateway_type->id]) }}" method="post">
 | 
					                <form action="{{ route('client.payment_methods.destroy', [$payment_method->hashed_id, 'method' => $payment_method->gateway_type->id]) }}" method="post">
 | 
				
			||||||
                    @csrf
 | 
					                    @csrf
 | 
				
			||||||
                    @method('DELETE')
 | 
					                    @method('DELETE')
 | 
				
			||||||
                    <button type="submit" class="button button-danger button-block" dusk="confirm-payment-removal">
 | 
					                    <button type="submit" onclick="setTimeout(() => this.disabled = true, 0); return true;" class="button button-danger button-block" dusk="confirm-payment-removal">
 | 
				
			||||||
                        {{ ctrans('texts.remove') }}
 | 
					                        {{ ctrans('texts.remove') }}
 | 
				
			||||||
                    </button>
 | 
					                    </button>
 | 
				
			||||||
                </form>
 | 
					                </form>
 | 
				
			||||||
 | 
				
			|||||||
@ -26,7 +26,7 @@
 | 
				
			|||||||
                        <div class="relative inline-block text-left">
 | 
					                        <div class="relative inline-block text-left">
 | 
				
			||||||
                            <div>
 | 
					                            <div>
 | 
				
			||||||
                                <div class="rounded-md shadow-sm">
 | 
					                                <div class="rounded-md shadow-sm">
 | 
				
			||||||
                                    <button type="button" id="approve-button"
 | 
					                                    <button type="button" id="approve-button" onclick="setTimeout(() => this.disabled = true, 0); return true;"
 | 
				
			||||||
                                            class="inline-flex justify-center w-full rounded-md border border-gray-300 px-4 py-2 bg-white text-sm leading-5 font-medium text-gray-700 hover:text-gray-500 focus:outline-none focus:border-blue-300 focus:ring-blue active:bg-gray-50 active:text-gray-800 transition ease-in-out duration-150">
 | 
					                                            class="inline-flex justify-center w-full rounded-md border border-gray-300 px-4 py-2 bg-white text-sm leading-5 font-medium text-gray-700 hover:text-gray-500 focus:outline-none focus:border-blue-300 focus:ring-blue active:bg-gray-50 active:text-gray-800 transition ease-in-out duration-150">
 | 
				
			||||||
                                        {{ ctrans('texts.approve') }}
 | 
					                                        {{ ctrans('texts.approve') }}
 | 
				
			||||||
                                    </button>
 | 
					                                    </button>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,27 +1,30 @@
 | 
				
			|||||||
<form action="{{ route('client.quotes.bulk') }}" method="post" id="approve-form" />
 | 
					<form action="{{ route('client.quotes.bulk') }}" method="post" id="approve-form" />
 | 
				
			||||||
    @csrf
 | 
					@csrf
 | 
				
			||||||
    <input type="hidden" name="action" value="approve">
 | 
					 | 
				
			||||||
    <input type="hidden" name="process" value="true">
 | 
					 | 
				
			||||||
    <input type="hidden" name="quotes[]" value="{{ $quote->hashed_id }}">
 | 
					 | 
				
			||||||
    <input type="hidden" name="signature">
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <div class="bg-white shadow sm:rounded-lg">
 | 
					<input type="hidden" name="action" value="approve">
 | 
				
			||||||
        <div class="px-4 py-5 sm:p-6">
 | 
					<input type="hidden" name="process" value="true">
 | 
				
			||||||
            <div class="sm:flex sm:items-start sm:justify-between">
 | 
					<input type="hidden" name="quotes[]" value="{{ $quote->hashed_id }}">
 | 
				
			||||||
                <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					<input type="hidden" name="signature">
 | 
				
			||||||
                    {{ ctrans('texts.approve') }}
 | 
					 | 
				
			||||||
                </h3>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                <div class="mt-5 sm:mt-0 sm:ml-6 sm:flex-shrink-0 sm:flex sm:items-center">
 | 
					<div class="bg-white shadow sm:rounded-lg">
 | 
				
			||||||
                    @yield('quote-not-approved-right-side')
 | 
					    <div class="px-4 py-5 sm:p-6">
 | 
				
			||||||
 | 
					        <div class="sm:flex sm:items-start sm:justify-between">
 | 
				
			||||||
 | 
					            <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
 | 
					                {{ ctrans('texts.approve') }}
 | 
				
			||||||
 | 
					            </h3>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    <div class="inline-flex rounded-md shadow-sm">
 | 
					            <div class="mt-5 sm:mt-0 sm:ml-6 sm:flex-shrink-0 sm:flex sm:items-center">
 | 
				
			||||||
                        <input type="hidden" name="action" value="payment">
 | 
					                @yield('quote-not-approved-right-side')
 | 
				
			||||||
                        <button type="button" class="button button-primary bg-primary" id="approve-button">{{ ctrans('texts.approve') }}</button>
 | 
					
 | 
				
			||||||
                    </div>
 | 
					                <div class="inline-flex rounded-md shadow-sm">
 | 
				
			||||||
 | 
					                    <input type="hidden" name="action" value="payment">
 | 
				
			||||||
 | 
					                    <button onclick="setTimeout(() => this.disabled = true, 0); return true;" type="button"
 | 
				
			||||||
 | 
					                        class="button button-primary bg-primary"
 | 
				
			||||||
 | 
					                        id="approve-button">{{ ctrans('texts.approve') }}</button>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
</form>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</form>
 | 
				
			||||||
 | 
				
			|||||||
@ -2,9 +2,9 @@
 | 
				
			|||||||
@section('meta_title', ctrans('texts.quotes'))
 | 
					@section('meta_title', ctrans('texts.quotes'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@section('header')
 | 
					@section('header')
 | 
				
			||||||
    @if($errors->any())
 | 
					    @if ($errors->any())
 | 
				
			||||||
        <div class="alert alert-failure mb-4">
 | 
					        <div class="alert alert-failure mb-4">
 | 
				
			||||||
            @foreach($errors->all() as $error)
 | 
					            @foreach ($errors->all() as $error)
 | 
				
			||||||
                <p>{{ $error }}</p>
 | 
					                <p>{{ $error }}</p>
 | 
				
			||||||
            @endforeach
 | 
					            @endforeach
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
@ -15,12 +15,16 @@
 | 
				
			|||||||
    <div class="flex justify-between items-center">
 | 
					    <div class="flex justify-between items-center">
 | 
				
			||||||
        <form action="{{ route('client.quotes.bulk') }}" method="post" id="bulkActions">
 | 
					        <form action="{{ route('client.quotes.bulk') }}" method="post" id="bulkActions">
 | 
				
			||||||
            @csrf
 | 
					            @csrf
 | 
				
			||||||
            <button type="submit" class="button button-primary bg-primary" name="action"
 | 
					            <button type="submit"
 | 
				
			||||||
                    value="download">{{ ctrans('texts.download') }}</button>
 | 
					                onclick="setTimeout(() => this.disabled = true, 0); setTimeout(() => this.disabled = false, 5000); return true;"
 | 
				
			||||||
            <button type="submit" class="button button-primary bg-primary" name="action"
 | 
					                class="button button-primary bg-primary" name="action"
 | 
				
			||||||
                    value="approve">{{ ctrans('texts.approve') }}</button>
 | 
					                value="download">{{ ctrans('texts.download') }}</button>
 | 
				
			||||||
 | 
					            <button type="submit" onclick="setTimeout(() => this.disabled = true, 0); return true;"
 | 
				
			||||||
 | 
					                class="button button-primary bg-primary" name="action"
 | 
				
			||||||
 | 
					                value="approve">{{ ctrans('texts.approve') }}</button>
 | 
				
			||||||
        </form>
 | 
					        </form>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <div class="flex flex-col mt-4">
 | 
					    <div class="flex flex-col mt-4">
 | 
				
			||||||
        @livewire('quotes-table', ['company' => $company])
 | 
					        @livewire('quotes-table', ['company' => $company])
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
				
			|||||||
@ -31,7 +31,7 @@
 | 
				
			|||||||
                <span class="ml-2">{{ ctrans('texts.show_aging') }}</span>
 | 
					                <span class="ml-2">{{ ctrans('texts.show_aging') }}</span>
 | 
				
			||||||
            </label> <!-- End show aging checkbox -->
 | 
					            </label> <!-- End show aging checkbox -->
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <button id="pdf-download" class="button button-primary bg-primary mt-4 md:mt-0">{{ ctrans('texts.download') }}</button>
 | 
					        <button onclick="setTimeout(() => this.disabled = true, 0); setTimeout(() => this.disabled = false, 5000); return true;" id="pdf-download" class="button button-primary bg-primary mt-4 md:mt-0">{{ ctrans('texts.download') }}</button>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @include('portal.ninja2020.components.pdf-viewer', ['url' => route('client.statement.raw')])
 | 
					    @include('portal.ninja2020.components.pdf-viewer', ['url' => route('client.statement.raw')])
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										45
									
								
								tests/Unit/WithTypeHelpersTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								tests/Unit/WithTypeHelpersTest.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Invoice Ninja (https://invoiceninja.com).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @link https://github.com/invoiceninja/invoiceninja source repository
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @license https://www.elastic.co/licensing/elastic-license
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Tests\Unit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use App\Models\Account;
 | 
				
			||||||
 | 
					use App\Models\Company;
 | 
				
			||||||
 | 
					use App\Models\Document;
 | 
				
			||||||
 | 
					use Tests\TestCase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class WithTypeHelpersTest extends TestCase
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public function testIsImageHelper(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $account = Account::factory()->create();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $company = Company::factory()->create([
 | 
				
			||||||
 | 
					            'account_id' => $account->id,
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /** @var Document */
 | 
				
			||||||
 | 
					        $document = Document::factory()->create([
 | 
				
			||||||
 | 
					            'company_id' => $company->id,
 | 
				
			||||||
 | 
					            'type' => 'jpeg',
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertTrue($document->isImage());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /** @var Document */
 | 
				
			||||||
 | 
					        $document = Document::factory()->create([
 | 
				
			||||||
 | 
					            'company_id' => $company->id,
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertFalse($document->isImage());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user