Add shareable links to client portal

This commit is contained in:
David Bomba 2022-02-10 11:36:44 +11:00
parent 76c940ae9a
commit 7378043ce3
6 changed files with 156 additions and 16 deletions

View File

@ -30,9 +30,12 @@ class CreditController extends Controller
{ {
set_time_limit(0); set_time_limit(0);
$data = ['credit' => $credit]; $invitation = $credit->invitations()->where('client_contact_id', auth()->user()->id)->first();
$invitation = $credit->invitations()->where('client_contact_id', auth()->user()->id)->first(); $data = [
'credit' => $credit,
'key' => $invitation->key
];
if ($invitation && auth()->guard('contact') && ! request()->has('silent') && ! $invitation->viewed_date) { if ($invitation && auth()->guard('contact') && ! request()->has('silent') && ! $invitation->viewed_date) {

View File

@ -58,12 +58,14 @@ class QuoteController extends Controller
{ {
/* If the quote is expired, convert the status here */ /* If the quote is expired, convert the status here */
$data = [
'quote' => $quote,
];
$invitation = $quote->invitations()->where('client_contact_id', auth()->user()->id)->first(); $invitation = $quote->invitations()->where('client_contact_id', auth()->user()->id)->first();
$data = [
'quote' => $quote,
'key' => $invitation->key,
];
if ($invitation && auth()->guard('contact') && ! request()->has('silent') && ! $invitation->viewed_date) { if ($invitation && auth()->guard('contact') && ! request()->has('silent') && ! $invitation->viewed_date) {
$invitation->markViewed(); $invitation->markViewed();

View File

@ -1,5 +1,5 @@
@extends('portal.ninja2020.layout.app') @extends('portal.ninja2020.layout.app')
@section('meta_title', ctrans('texts.entity_number_placeholder', ['entity' => ctrans('texts.credit'), 'entity_number' => $credit->number])) @section('meta_title', ctrans('texts.view_credit'))
@push('head') @push('head')
<meta name="pdf-url" content="{{ $credit->pdf_file_path(null, 'url', true) }}"> <meta name="pdf-url" content="{{ $credit->pdf_file_path(null, 'url', true) }}">
@ -9,15 +9,52 @@
@endpush @endpush
@section('body') @section('body')
<div class="bg-white shadow sm:rounded-lg mb-4" translate>
<div class="px-4 py-5 sm:p-6">
<div class="sm:flex sm:items-start sm:justify-between">
<div>
<h3 class="text-lg leading-6 font-medium text-gray-900">
{{ ctrans('texts.entity_number_placeholder', ['entity' => ctrans('texts.credit'), 'entity_number' => $credit->number]) }}
</h3>
<div class="btn" data-clipboard-text="{{url("client/credit/{$key}")}}" aria-label="Copied!">
<div class="flex text-sm leading-6 font-medium text-gray-500">
<p class="mr-2">{{url("client/credit/{$key}")}}</p>
<p><img class="h-5 w-5" src="{{ asset('assets/clippy.svg') }}" alt="Copy to clipboard"></p>
</div>
</div>
</div>
</div>
</div>
</div>
@include('portal.ninja2020.components.entity-documents', ['entity' => $credit]) @include('portal.ninja2020.components.entity-documents', ['entity' => $credit])
@include('portal.ninja2020.components.pdf-viewer', ['entity' => $credit]) @include('portal.ninja2020.components.pdf-viewer', ['entity' => $credit])
<div class="flex justify-center">
<canvas id="pdf-placeholder" class="shadow rounded-lg bg-white lg:hidden mt-4 p-4"></canvas>
</div>
@endsection @endsection
@section('footer') @section('footer')
<script src="{{ asset('js/clients/shared/pdf.js') }}"></script> <script src="{{ asset('vendor/clipboard.min.js') }}"></script>
<script type="text/javascript">
var clipboard = new ClipboardJS('.btn');
// clipboard.on('success', function(e) {
// console.info('Action:', e.action);
// console.info('Text:', e.text);
// console.info('Trigger:', e.trigger);
// e.clearSelection();
// });
// clipboard.on('error', function(e) {
// console.error('Action:', e.action);
// console.error('Trigger:', e.trigger);
// });
</script>
@endsection @endsection

View File

@ -7,7 +7,6 @@
@include('portal.ninja2020.components.no-cache') @include('portal.ninja2020.components.no-cache')
<script src="{{ asset('vendor/signature_pad@2.3.2/signature_pad.min.js') }}"></script> <script src="{{ asset('vendor/signature_pad@2.3.2/signature_pad.min.js') }}"></script>
<script src="{{ asset('vendor/clipboard.min.js') }}"></script>
@endpush @endpush
@ -43,7 +42,7 @@
<div class="btn" data-clipboard-text="{{url("client/invoice/{$key}")}}" aria-label="Copied!"> <div class="btn" data-clipboard-text="{{url("client/invoice/{$key}")}}" aria-label="Copied!">
<div class="flex text-sm leading-6 font-medium text-gray-500"> <div class="flex text-sm leading-6 font-medium text-gray-500">
<p class="pr-10">{{url("client/invoice/{$key}")}}</p> <p class="mr-2">{{url("client/invoice/{$key}")}}</p>
<p><img class="h-5 w-5" src="{{ asset('assets/clippy.svg') }}" alt="Copy to clipboard"></p> <p><img class="h-5 w-5" src="{{ asset('assets/clippy.svg') }}" alt="Copy to clipboard"></p>
</div> </div>
</div> </div>
@ -74,6 +73,13 @@
{{ ctrans('texts.invoice_number_placeholder', ['invoice' => $invoice->number])}} {{ ctrans('texts.invoice_number_placeholder', ['invoice' => $invoice->number])}}
- {{ \App\Models\Invoice::stringStatus($invoice->status_id) }} - {{ \App\Models\Invoice::stringStatus($invoice->status_id) }}
</h3> </h3>
<div class="btn" data-clipboard-text="{{url("client/invoice/{$key}")}}" aria-label="Copied!">
<div class="flex text-sm leading-6 font-medium text-gray-500">
<p class="pr-10">{{url("client/invoice/{$key}")}}</p>
<p><img class="h-5 w-5" src="{{ asset('assets/clippy.svg') }}" alt="Copy to clipboard"></p>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -88,6 +94,8 @@
@section('footer') @section('footer')
<script src="{{ asset('js/clients/invoices/payment.js') }}"></script> <script src="{{ asset('js/clients/invoices/payment.js') }}"></script>
<script src="{{ asset('vendor/clipboard.min.js') }}"></script>
<script type="text/javascript"> <script type="text/javascript">
var clipboard = new ClipboardJS('.btn'); var clipboard = new ClipboardJS('.btn');

View File

@ -9,9 +9,20 @@
<div class="bg-white shadow sm:rounded-lg"> <div class="bg-white shadow sm:rounded-lg">
<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">
<h3 class="text-lg leading-6 font-medium text-gray-900"> <div>
{{ ctrans('texts.approve') }}
</h3> <h3 class="text-lg leading-6 font-medium text-gray-900">
{{ ctrans('texts.approve') }}
</h3>
<div class="btn" data-clipboard-text="{{url("client/quote/{$key}")}}" aria-label="Copied!">
<div class="flex text-sm leading-6 font-medium text-gray-500">
<p class="mr-2">{{url("client/quote/{$key}")}}</p>
<p><img class="h-5 w-5" src="{{ asset('assets/clippy.svg') }}" alt="Copy to clipboard"></p>
</div>
</div>
</div>
<div class="mt-5 sm:mt-0 sm:ml-6 sm:flex-shrink-0 sm:flex sm:items-center"> <div class="mt-5 sm:mt-0 sm:ml-6 sm:flex-shrink-0 sm:flex sm:items-center">
@yield('quote-not-approved-right-side') @yield('quote-not-approved-right-side')

View File

@ -25,8 +25,67 @@
<div class="mb-4"> <div class="mb-4">
@include('portal.ninja2020.quotes.includes.actions', ['quote' => $quote]) @include('portal.ninja2020.quotes.includes.actions', ['quote' => $quote])
</div> </div>
@elseif($quote->status_id === \App\Models\Quote::STATUS_CONVERTED)
<div class="bg-white shadow sm:rounded-lg mb-4">
<div class="px-4 py-5 sm:p-6">
<div class="sm:flex sm:items-start sm:justify-between">
<div>
<h3 class="text-lg leading-6 font-medium text-gray-900">
{{ ctrans('texts.approved') }}
</h3>
<div class="btn" data-clipboard-text="{{url("client/quote/{$key}")}}" aria-label="Copied!">
<div class="flex text-sm leading-6 font-medium text-gray-500">
<p class="mr-2">{{url("client/quote/{$key}")}}</p>
<p><img class="h-5 w-5" src="{{ asset('assets/clippy.svg') }}" alt="Copy to clipboard"></p>
</div>
</div>
</div>
</div>
</div>
</div>
@elseif($quote->status_id === \App\Models\Quote::STATUS_APPROVED) @elseif($quote->status_id === \App\Models\Quote::STATUS_APPROVED)
<p class="text-right text-gray-900 text-sm mb-4">{{ ctrans('texts.approved') }}</p>
<div class="bg-white shadow sm:rounded-lg mb-4">
<div class="px-4 py-5 sm:p-6">
<div class="sm:flex sm:items-start sm:justify-between">
<div>
<h3 class="text-lg leading-6 font-medium text-gray-900">
{{ ctrans('texts.approved') }}
</h3>
<div class="btn" data-clipboard-text="{{url("client/quote/{$key}")}}" aria-label="Copied!">
<div class="flex text-sm leading-6 font-medium text-gray-500">
<p class="mr-2">{{url("client/quote/{$key}")}}</p>
<p><img class="h-5 w-5" src="{{ asset('assets/clippy.svg') }}" alt="Copy to clipboard"></p>
</div>
</div>
</div>
</div>
</div>
</div>
@else
<div class="bg-white shadow sm:rounded-lg mb-4">
<div class="px-4 py-5 sm:p-6">
<div class="sm:flex sm:items-start sm:justify-between">
<div>
<h3 class="text-lg leading-6 font-medium text-gray-900">
{{ ctrans('texts.expired') }}
</h3>
<div class="btn" data-clipboard-text="{{url("client/quote/{$key}")}}" aria-label="Copied!">
<div class="flex text-sm leading-6 font-medium text-gray-500">
<p class="mr-2">{{url("client/quote/{$key}")}}</p>
<p><img class="h-5 w-5" src="{{ asset('assets/clippy.svg') }}" alt="Copy to clipboard"></p>
</div>
</div>
</div>
</div>
</div>
</div>
@endif @endif
@include('portal.ninja2020.components.entity-documents', ['entity' => $quote]) @include('portal.ninja2020.components.entity-documents', ['entity' => $quote])
@ -37,4 +96,24 @@
@section('footer') @section('footer')
<script src="{{ asset('js/clients/quotes/approve.js') }}"></script> <script src="{{ asset('js/clients/quotes/approve.js') }}"></script>
<script src="{{ asset('vendor/clipboard.min.js') }}"></script>
<script type="text/javascript">
var clipboard = new ClipboardJS('.btn');
// clipboard.on('success', function(e) {
// console.info('Action:', e.action);
// console.info('Text:', e.text);
// console.info('Trigger:', e.trigger);
// e.clearSelection();
// });
// clipboard.on('error', function(e) {
// console.error('Action:', e.action);
// console.error('Trigger:', e.trigger);
// });
</script>
@endsection @endsection