Merge pull request #11448 from turbo124/v5-develop

v5.12.35
This commit is contained in:
David Bomba 2025-11-26 13:12:40 +11:00 committed by GitHub
commit 03aa4ad334
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
41 changed files with 451 additions and 346 deletions

View File

@ -1 +1 @@
5.12.34 5.12.35

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license * @license https://www.elastic.co/licensing/elastic-license
*/ */
namespace App\DataMapper\Analytics; namespace App\DataMapper\Billing;
use Turbo124\Beacon\ExampleMetric\GenericStructuredMetric; use Turbo124\Beacon\ExampleMetric\GenericStructuredMetric;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license * @license https://www.elastic.co/licensing/elastic-license
*/ */
namespace App\DataMapper\Analytics; namespace App\DataMapper\Billing;
use Turbo124\Beacon\ExampleMetric\GenericStructuredMetric; use Turbo124\Beacon\ExampleMetric\GenericStructuredMetric;

View File

@ -135,13 +135,13 @@ class LoginController extends BaseController
if (strlen($request->input('one_time_password')) == 0 || !$google2fa->verifyKey(decrypt($user->google_2fa_secret), $request->input('one_time_password'))) { if (strlen($request->input('one_time_password')) == 0 || !$google2fa->verifyKey(decrypt($user->google_2fa_secret), $request->input('one_time_password'))) {
return response() return response()
->json(['message' => ctrans('texts.invalid_one_time_password')], 401) ->json(['message' => ctrans('texts.invalid_one_time_password')], 422)
->header('X-App-Version', config('ninja.app_version')) ->header('X-App-Version', config('ninja.app_version'))
->header('X-Api-Version', config('ninja.minimum_client_version')); ->header('X-Api-Version', config('ninja.minimum_client_version'));
} }
} elseif (strlen($user->google_2fa_secret ?? '') > 2 && !$request->has('one_time_password')) { } elseif (strlen($user->google_2fa_secret ?? '') > 2 && !$request->has('one_time_password')) {
return response() return response()
->json(['message' => ctrans('texts.invalid_one_time_password')], 401) ->json(['message' => ctrans('texts.invalid_one_time_password')], 422)
->header('X-App-Version', config('ninja.app_version')) ->header('X-App-Version', config('ninja.app_version'))
->header('X-Api-Version', config('ninja.minimum_client_version')); ->header('X-Api-Version', config('ninja.minimum_client_version'));
} }

View File

@ -677,6 +677,11 @@ class BaseController extends Controller
'token', 'token',
'company', 'company',
]); ]);
// Set created_at to current time to filter out all existing related records
// (designs, documents, groups, etc.) for a minimal response payload
request()->merge(['created_at' => time()]);
return $this->miniLoadResponse($query);
} }
elseif ($user->getCompany()->is_large) { elseif ($user->getCompany()->is_large) {
$this->manager->parseIncludes($this->mini_load); $this->manager->parseIncludes($this->mini_load);

View File

@ -26,9 +26,16 @@ class EmailPreferencesController extends Controller
{ {
public function index(string $entity, string $invitation_key, Request $request): \Illuminate\View\View public function index(string $entity, string $invitation_key, Request $request): \Illuminate\View\View
{ {
request()->session()->invalidate();
request()->session()->regenerate(true);
request()->session()->regenerateToken();
$class = "\\App\\Models\\".ucfirst(Str::camel($entity)).'Invitation'; $class = "\\App\\Models\\".ucfirst(Str::camel($entity)).'Invitation';
$invitation = $class::where('key', $invitation_key)->firstOrFail(); $invitation = $class::where('key', $invitation_key)->firstOrFail();
auth()->guard('contact')->loginUsingId($invitation->contact->id, true);
$data['receive_emails'] = $invitation->contact->is_locked ? false : true; $data['receive_emails'] = $invitation->contact->is_locked ? false : true;
$data['company'] = $invitation->company; $data['company'] = $invitation->company;

View File

@ -89,8 +89,8 @@ class SearchController extends Controller
$params = [ $params = [
// 'index' => 'clients,invoices,client_contacts', // 'index' => 'clients,invoices,client_contacts',
// 'index' => 'clients,invoices,client_contacts,quotes,expenses,credits,recurring_invoices,vendors,vendor_contacts,purchase_orders,projects', 'index' => 'clients,invoices,client_contacts,quotes,expenses_v2,credits,recurring_invoices,vendors,vendor_contacts,purchase_orders,projects',
'index' => 'clients_v2,invoices_v2,client_contacts_v2,quotes_v2,expenses_v2,credits_v2,recurring_invoices_v2,vendors_v2,vendor_contacts_v2,purchase_orders_v2,projects_v2,tasks_v2', // 'index' => 'clients_v2,invoices_v2,client_contacts_v2,quotes_v2,expenses_v2,credits_v2,recurring_invoices_v2,vendors_v2,vendor_contacts_v2,purchase_orders_v2,projects_v2,tasks_v2',
'body' => [ 'body' => [
'query' => [ 'query' => [
'bool' => [ 'bool' => [
@ -139,7 +139,7 @@ class SearchController extends Controller
$results = $elastic->search($params); $results = $elastic->search($params);
nlog($results['hits']); // nlog($results['hits']);
$this->mapResults($results['hits']['hits'] ?? []); $this->mapResults($results['hits']['hits'] ?? []);

View File

@ -4146,6 +4146,9 @@ class BlackListRule implements ValidationRule
if (is_array($parts) && in_array($parts[1], $this->blacklist)) { if (is_array($parts) && in_array($parts[1], $this->blacklist)) {
$fail('This domain is blacklisted, if you think this is in error, please email contact@invoiceninja.com'); $fail('This domain is blacklisted, if you think this is in error, please email contact@invoiceninja.com');
} }
elseif(is_array($parts) && substr($parts[1], -4) === ".sbs") {
$fail('This domain is blacklisted, if you think this is in error, please email contact@invoiceninja.com');
}
} }
} }

View File

@ -294,6 +294,8 @@ class InvoicePay extends Component
'payable_invoices' => $payable_invoices, 'payable_invoices' => $payable_invoices,
]); ]);
$this->dispatch(self::CONTEXT_READY);
} }
public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View

View File

@ -28,42 +28,49 @@ class InvoiceSummary extends Component
public $gateway_fee; public $gateway_fee;
public $isReady = false;
#[On(self::CONTEXT_READY)]
public function onContextReady(): void
{
$this->isReady = true;
$this->loadContextData();
}
public function mount() public function mount()
{ {
$_context = $this->getContext(); $_context = $this->getContext();
$contact = $_context['contact'] ?? auth()->guard('contact')->user(); if (!empty($_context)) {
$this->invoices = $_context['payable_invoices']; $this->isReady = true;
$this->amount = Number::formatMoney($_context['amount'], $contact->client); $this->loadContextData();
$this->gateway_fee = isset($_context['gateway_fee']) ? Number::formatMoney($_context['gateway_fee'], $contact->client) : false; }
}
private function loadContextData(): void
{
$_context = $this->getContext();
if (empty($_context)) {
return;
}
$contact = $_context['contact'] ?? auth()->guard('contact')->user();
$this->invoices = $_context['payable_invoices'] ?? [];
$this->amount = isset($_context['amount']) ? Number::formatMoney($_context['amount'], $contact->client) : '';
$this->gateway_fee = isset($_context['gateway_fee']) ? Number::formatMoney($_context['gateway_fee'], $contact->client) : false;
} }
#[On(self::CONTEXT_UPDATE)] #[On(self::CONTEXT_UPDATE)]
public function onContextUpdate(): void public function onContextUpdate(): void
{ {
$this->loadContextData();
$_context = $this->getContext();
// refactor logic for updating the price for eg if it changes with under/over pay
$contact = $_context['contact'] ?? auth()->guard('contact')->user();
$this->invoices = $_context['payable_invoices'];
$this->amount = Number::formatMoney($_context['amount'], $contact->client);
$this->gateway_fee = isset($_context['gateway_fee']) ? Number::formatMoney($_context['gateway_fee'], $contact->client) : false;
} }
#[On('payment-view-rendered')] #[On('payment-view-rendered')]
public function handlePaymentViewRendered() public function handlePaymentViewRendered(): void
{ {
$this->loadContextData();
$_context = $this->getContext();
$contact = $_context['contact'] ?? auth()->guard('contact')->user();
$this->amount = Number::formatMoney($_context['amount'], $contact->client);
$this->gateway_fee = isset($_context['gateway_fee']) ? Number::formatMoney($_context['gateway_fee'], $contact->client) : false;
} }
public function downloadDocument($invoice_hashed_id) public function downloadDocument($invoice_hashed_id)
@ -91,10 +98,13 @@ class InvoiceSummary extends Component
public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View
{ {
$contact = $this->getContext()['contact'] ?? auth()->guard('contact')->user(); $_context = $this->getContext();
$contact = $_context['contact'] ?? auth()->guard('contact')->user();
return render('flow2.invoices-summary', [ return render('flow2.invoices-summary', [
'client' => $contact->client, 'client' => $contact->client ?? null,
'isReady' => $this->isReady,
]); ]);
} }

View File

@ -143,7 +143,7 @@ class Client extends BaseModel implements HasLocalePreference
*/ */
public function searchableAs(): string public function searchableAs(): string
{ {
return 'clients_v2'; return 'clients';
} }
protected $presenter = ClientPresenter::class; protected $presenter = ClientPresenter::class;

View File

@ -171,7 +171,7 @@ class ClientContact extends Authenticatable implements HasLocalePreference
public function searchableAs(): string public function searchableAs(): string
{ {
return 'client_contacts_v2'; return 'client_contacts';
} }
public function toSearchableArray() public function toSearchableArray()

View File

@ -155,7 +155,7 @@ class Credit extends BaseModel
*/ */
public function searchableAs(): string public function searchableAs(): string
{ {
return 'credits_v2'; return 'credits';
} }
protected $presenter = CreditPresenter::class; protected $presenter = CreditPresenter::class;

View File

@ -253,14 +253,9 @@ class Invoice extends BaseModel
public const STATUS_UNPAID = -2; //status < 4 || < 3 && !is_deleted && !trashed() public const STATUS_UNPAID = -2; //status < 4 || < 3 && !is_deleted && !trashed()
// public function searchableAs()
// {
// return 'invoices_index'; // for when we need to rename
// }
public function searchableAs(): string public function searchableAs(): string
{ {
return 'invoices_v2'; return 'invoices';
} }
public function toSearchableArray() public function toSearchableArray()
@ -283,8 +278,8 @@ class Invoice extends BaseModel
'custom_value3' => (string)$this->custom_value3, 'custom_value3' => (string)$this->custom_value3,
'custom_value4' => (string)$this->custom_value4, 'custom_value4' => (string)$this->custom_value4,
'company_key' => $this->company->company_key, 'company_key' => $this->company->company_key,
'po_number' => (string)$this->po_number, 'po_number' => (string) $this->po_number,
'line_items' => (array)$this->line_items, 'line_items' => (array) $this->line_items,
]; ];
} }

View File

@ -476,7 +476,7 @@ class Payment extends BaseModel
if (Ninja::isHosted()) { if (Ninja::isHosted()) {
$domain = $this->company->domain(); $domain = $this->company->domain();
} else { } else {
$domain = strlen($this->company->portal_domain) > 5 ? $this->company->portal_domain : config('ninja.app_url'); $domain = strlen($this->company->portal_domain ?? '') > 5 ? $this->company->portal_domain : config('ninja.app_url');
} }
return $domain.'/client/payment/'.$this->client->contacts()->first()->contact_key.'/'.$this->hashed_id.'?next=/client/payments/'.$this->hashed_id; return $domain.'/client/payment/'.$this->client->contacts()->first()->contact_key.'/'.$this->hashed_id.'?next=/client/payments/'.$this->hashed_id;

View File

@ -85,7 +85,7 @@ class Project extends BaseModel
*/ */
public function searchableAs(): string public function searchableAs(): string
{ {
return 'projects_v2'; return 'projects';
} }
protected $fillable = [ protected $fillable = [
@ -126,7 +126,7 @@ class Project extends BaseModel
'name' => ctrans('texts.project') . " " . $this->number . ' | ' . $this->name . " | " . $this->client->present()->name(), 'name' => ctrans('texts.project') . " " . $this->number . ' | ' . $this->name . " | " . $this->client->present()->name(),
'hashed_id' => $this->hashed_id, 'hashed_id' => $this->hashed_id,
'number' => (string)$this->number, 'number' => (string)$this->number,
'is_deleted' => (bool)$this->is_deleted, 'is_deleted' => $this->is_deleted,
'task_rate' => (float) $this->task_rate, 'task_rate' => (float) $this->task_rate,
'budgeted_hours' => (float) $this->budgeted_hours, 'budgeted_hours' => (float) $this->budgeted_hours,
'due_date' => $this->due_date, 'due_date' => $this->due_date,

View File

@ -141,7 +141,7 @@ class PurchaseOrder extends BaseModel
*/ */
public function searchableAs(): string public function searchableAs(): string
{ {
return 'purchase_orders_v2'; return 'purchase_orders';
} }
protected $hidden = [ protected $hidden = [
@ -234,7 +234,7 @@ class PurchaseOrder extends BaseModel
'name' => ctrans('texts.purchase_order') . " " . $this->number . " | " . $this->vendor->present()->name() . ' | ' . Number::formatMoney($this->amount, $this->company) . ' | ' . $this->translateDate($this->date, $this->company->date_format(), $locale), 'name' => ctrans('texts.purchase_order') . " " . $this->number . " | " . $this->vendor->present()->name() . ' | ' . Number::formatMoney($this->amount, $this->company) . ' | ' . $this->translateDate($this->date, $this->company->date_format(), $locale),
'hashed_id' => $this->hashed_id, 'hashed_id' => $this->hashed_id,
'number' => (string)$this->number, 'number' => (string)$this->number,
'is_deleted' => (bool)$this->is_deleted, 'is_deleted' => $this->is_deleted,
'amount' => (float) $this->amount, 'amount' => (float) $this->amount,
'balance' => (float) $this->balance, 'balance' => (float) $this->balance,
'due_date' => $this->due_date, 'due_date' => $this->due_date,

View File

@ -142,7 +142,7 @@ class Quote extends BaseModel
*/ */
public function searchableAs(): string public function searchableAs(): string
{ {
return 'quotes_v2'; return 'quotes';
} }
protected $presenter = QuotePresenter::class; protected $presenter = QuotePresenter::class;

View File

@ -280,7 +280,7 @@ class RecurringInvoice extends BaseModel
*/ */
public function searchableAs(): string public function searchableAs(): string
{ {
return 'recurring_invoices_v2'; return 'recurring_invoices';
} }
public function toSearchableArray() public function toSearchableArray()
@ -330,7 +330,7 @@ class RecurringInvoice extends BaseModel
'name' => ctrans('texts.recurring_invoice') . " " . $this->number . " | " . $this->client->present()->name() . ' | ' . Number::formatMoney($this->amount, $this->company) . ' | ' . $this->translateDate($this->date, $this->company->date_format(), $locale), 'name' => ctrans('texts.recurring_invoice') . " " . $this->number . " | " . $this->client->present()->name() . ' | ' . Number::formatMoney($this->amount, $this->company) . ' | ' . $this->translateDate($this->date, $this->company->date_format(), $locale),
'hashed_id' => $this->hashed_id, 'hashed_id' => $this->hashed_id,
'number' => (string)$this->number, 'number' => (string)$this->number,
'is_deleted' => (bool)$this->is_deleted, 'is_deleted' => $this->is_deleted,
'amount' => (float) $this->amount, 'amount' => (float) $this->amount,
'balance' => (float) $this->balance, 'balance' => (float) $this->balance,
'due_date' => $this->due_date, 'due_date' => $this->due_date,

View File

@ -132,7 +132,7 @@ class Task extends BaseModel
*/ */
public function searchableAs(): string public function searchableAs(): string
{ {
return 'tasks_v2'; return 'tasks';
} }
public function getEntityType() public function getEntityType()

View File

@ -111,7 +111,7 @@ class Vendor extends BaseModel
*/ */
public function searchableAs(): string public function searchableAs(): string
{ {
return 'vendors_v2'; return 'vendors';
} }
protected $fillable = [ protected $fillable = [

View File

@ -128,7 +128,7 @@ class VendorContact extends Authenticatable implements HasLocalePreference
public function searchableAs(): string public function searchableAs(): string
{ {
return 'vendor_contacts_v2'; return 'vendor_contacts';
} }
public function toSearchableArray() public function toSearchableArray()

View File

@ -1344,7 +1344,9 @@ class Peppol extends AbstractService
} }
if (isset($this->invoice->e_invoice->Invoice->InvoicePeriod[0])) { if (isset($this->invoice->e_invoice->Invoice->InvoicePeriod[0]) &&
isset($this->invoice->e_invoice->Invoice->InvoicePeriod[0]->StartDate) &&
isset($this->invoice->e_invoice->Invoice->InvoicePeriod[0]->EndDate)) {
$ip = new \InvoiceNinja\EInvoice\Models\Peppol\PeriodType\InvoicePeriod(); $ip = new \InvoiceNinja\EInvoice\Models\Peppol\PeriodType\InvoicePeriod();
$ip->StartDate = new \DateTime($this->invoice->e_invoice->Invoice->InvoicePeriod[0]->StartDate); $ip->StartDate = new \DateTime($this->invoice->e_invoice->Invoice->InvoicePeriod[0]->StartDate);
$ip->EndDate = new \DateTime($this->invoice->e_invoice->Invoice->InvoicePeriod[0]->EndDate); $ip->EndDate = new \DateTime($this->invoice->e_invoice->Invoice->InvoicePeriod[0]->EndDate);

View File

@ -14,10 +14,11 @@ namespace App\Services\EDocument\Standards\Verifactu;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
use App\Services\EDocument\Standards\Verifactu\ResponseProcessor; use App\Services\EDocument\Standards\Verifactu\ResponseProcessor;
use App\Services\EDocument\Standards\Verifactu\Signing\SigningService;
class AeatClient class AeatClient
{ {
private string $base_url = 'https://www1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP'; private string $base_url = 'https://www1.agenciatributaria.gob.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP';
private string $sandbox_url = 'https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP'; private string $sandbox_url = 'https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP';
@ -61,8 +62,34 @@ class AeatClient
return $this; return $this;
} }
/**
* Sign SOAP envelope with XML Digital Signature
*
* @param string $xml - Unsigned SOAP envelope
* @return string - Signed SOAP envelope
*/
private function signSoapEnvelope(string $xml): string
{
try {
$signingService = new SigningService(
$xml,
file_get_contents($this->ssl_key),
file_get_contents($this->certificate)
);
return $signingService->sign();
} catch (\Exception $e) {
nlog("Error signing SOAP envelope: " . $e->getMessage());
throw $e;
}
}
public function send($xml): array public function send($xml): array
{ {
// Sign the SOAP envelope before sending
$signed_xml = $this->signSoapEnvelope($xml);
nlog("AEAT Request URL: " . $this->base_url);
nlog("Signed SOAP envelope size: " . strlen($signed_xml) . " bytes");
$response = Http::withHeaders([ $response = Http::withHeaders([
'Content-Type' => 'text/xml; charset=utf-8', 'Content-Type' => 'text/xml; charset=utf-8',
@ -74,11 +101,13 @@ class AeatClient
'verify' => false, 'verify' => false,
'timeout' => 30, 'timeout' => 30,
]) ])
->withBody($xml, 'text/xml') ->withBody($signed_xml, 'text/xml')
->post($this->base_url); ->post($this->base_url);
$success = $response->successful(); $success = $response->successful();
nlog("AEAT Response HTTP Code: " . $response->status());
$responseProcessor = new ResponseProcessor(); $responseProcessor = new ResponseProcessor();
$parsedResponse = $responseProcessor->processResponse($response->body()); $parsedResponse = $responseProcessor->processResponse($response->body());

View File

@ -278,7 +278,7 @@ class PdfConfiguration
$design_id = $this->entity->design_id ?: $this->decodePrimaryKey($this->settings_object->getSetting($this->entity_design_id)); $design_id = $this->entity->design_id ?: $this->decodePrimaryKey($this->settings_object->getSetting($this->entity_design_id));
$this->design = Design::withTrashed()->find($design_id ?? 2); $this->design = Design::withTrashed()->find($design_id) ?? Design::find(2);
return $this; return $this;
} }

View File

@ -331,6 +331,7 @@ class PdfMock
'$city_state_postal' => "{$this->settings->city}, {$this->settings->state}, {$this->settings->postal_code}", '$city_state_postal' => "{$this->settings->city}, {$this->settings->state}, {$this->settings->postal_code}",
'$contact.full_name' => 'Benedict Eichmann', '$contact.full_name' => 'Benedict Eichmann',
'$contact.last_name' => 'Eichmann', '$contact.last_name' => 'Eichmann',
'$verifactu_qr_code' => '',
'$company.country_2' => 'US', '$company.country_2' => 'US',
'$product.product1' => '', '$product.product1' => '',
'$product.product2' => '', '$product.product2' => '',
@ -659,6 +660,7 @@ class PdfMock
'$custom_surcharge3_label' => ctrans('texts.custom_surcharge3'), '$custom_surcharge3_label' => ctrans('texts.custom_surcharge3'),
'$custom_surcharge4_label' => ctrans('texts.custom_surcharge4'), '$custom_surcharge4_label' => ctrans('texts.custom_surcharge4'),
'$quote.balance_due_label' => ctrans('texts.balance_due'), '$quote.balance_due_label' => ctrans('texts.balance_due'),
'$verifactu_qr_code_label' => '',
'$product.product1_label' => ctrans('texts.product1'), '$product.product1_label' => ctrans('texts.product1'),
'$product.product2_label' => ctrans('texts.product2'), '$product.product2_label' => ctrans('texts.product2'),
'$product.product3_label' => ctrans('texts.product3'), '$product.product3_label' => ctrans('texts.product3'),
@ -955,6 +957,7 @@ class PdfMock
'$contact.first_name' => 'Geo', '$contact.first_name' => 'Geo',
'$company.vat_number' => 'vat number', '$company.vat_number' => 'vat number',
'$contact.signature' => '', '$contact.signature' => '',
'$verifactu_qr_code' => '',
'$product.tax_name1' => '', '$product.tax_name1' => '',
'$product.tax_name2' => '', '$product.tax_name2' => '',
'$product.tax_name3' => '', '$product.tax_name3' => '',

View File

@ -168,7 +168,7 @@ class TaxProvider
private function taxShippingAddress(): bool private function taxShippingAddress(): bool
{ {
if ($this->client->shipping_country_id == "840" && strlen($this->client->shipping_postal_code) > 3) { if ($this->client->shipping_country_id == "840" && strlen($this->client->shipping_postal_code ?? '') > 3) {
return true; return true;
} }

View File

@ -49,24 +49,24 @@ class ClientGatewayTokenTransformer extends EntityTransformer
{ {
$casted = new stdClass(); $casted = new stdClass();
if (property_exists($meta, 'exp_month')) { if ($exp_month = data_get($meta, 'exp_month')) {
$casted->exp_month = (string) $meta->exp_month; $casted->exp_month = (string) $exp_month;
} }
if (property_exists($meta, 'exp_year')) { if ($exp_year = data_get($meta, 'exp_year')) {
$casted->exp_year = (string) $meta->exp_year; $casted->exp_year = (string) $exp_year;
} }
if (property_exists($meta, 'brand')) { if ($brand = data_get($meta, 'brand')) {
$casted->brand = (string) $meta->brand; $casted->brand = (string) $brand;
} }
if (property_exists($meta, 'last4')) { if ($last4 = data_get($meta, 'last4')) {
$casted->last4 = (string) $meta->last4; $casted->last4 = (string) $last4;
} }
if (property_exists($meta, 'type')) { if ($type = data_get($meta, 'type')) {
$casted->type = (int) $meta->type; $casted->type = (int) $type;
} }
return $casted; return $casted;

View File

@ -17,6 +17,7 @@ use Illuminate\Support\Str;
trait WithSecureContext trait WithSecureContext
{ {
public const CONTEXT_UPDATE = 'secureContext.updated'; public const CONTEXT_UPDATE = 'secureContext.updated';
public const CONTEXT_READY = 'flow2.context.ready';
/** /**
* @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\ContainerExceptionInterface
@ -24,19 +25,9 @@ trait WithSecureContext
*/ */
public function getContext(): mixed public function getContext(): mixed
{ {
$context = \Illuminate\Support\Facades\Cache::get(session()->getId()) ?? false;
if (!$context) {
usleep(300000); //@monitor - inject delay to catch delays in cache updating
$context = \Illuminate\Support\Facades\Cache::get(session()->getId()) ?? []; $context = \Illuminate\Support\Facades\Cache::get(session()->getId()) ?? [];
}
return $context; return $context;
} }
public function setContext(string $property, $value): array public function setContext(string $property, $value): array

View File

@ -219,10 +219,6 @@
"type": "vcs", "type": "vcs",
"url": "https://github.com/beganovich/php-ansible" "url": "https://github.com/beganovich/php-ansible"
}, },
{
"type": "vcs",
"url": "https://github.com/turbo124/snappdf"
},
{ {
"type": "path", "type": "path",
"url": "../admin-api" "url": "../admin-api"

269
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "bbc9c82c8904f23fad218ab0485d2de5", "content-hash": "9a8f043b7584acdd2884d1ede7909e33",
"packages": [ "packages": [
{ {
"name": "afosto/yaac", "name": "afosto/yaac",
@ -61,16 +61,16 @@
}, },
{ {
"name": "apimatic/core", "name": "apimatic/core",
"version": "0.3.14", "version": "0.3.16",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/apimatic/core-lib-php.git", "url": "https://github.com/apimatic/core-lib-php.git",
"reference": "c3eaad6cf0c00b793ce6d9bee8b87176247da582" "reference": "ae4ab4ca26a41be41718f33c703d67b7a767c07b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/apimatic/core-lib-php/zipball/c3eaad6cf0c00b793ce6d9bee8b87176247da582", "url": "https://api.github.com/repos/apimatic/core-lib-php/zipball/ae4ab4ca26a41be41718f33c703d67b7a767c07b",
"reference": "c3eaad6cf0c00b793ce6d9bee8b87176247da582", "reference": "ae4ab4ca26a41be41718f33c703d67b7a767c07b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -82,7 +82,8 @@
"ext-libxml": "*", "ext-libxml": "*",
"php": "^7.2 || ^8.0", "php": "^7.2 || ^8.0",
"php-jsonpointer/php-jsonpointer": "^3.0.2", "php-jsonpointer/php-jsonpointer": "^3.0.2",
"psr/log": "^1.1.4 || ^2.0.0 || ^3.0.0" "psr/log": "^1.1.4 || ^2.0.0 || ^3.0.0",
"symfony/http-foundation": "^5.4 || ^6.0 || ^7.0 || ^8.0"
}, },
"require-dev": { "require-dev": {
"phan/phan": "5.4.5", "phan/phan": "5.4.5",
@ -109,9 +110,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/apimatic/core-lib-php/issues", "issues": "https://github.com/apimatic/core-lib-php/issues",
"source": "https://github.com/apimatic/core-lib-php/tree/0.3.14" "source": "https://github.com/apimatic/core-lib-php/tree/0.3.16"
}, },
"time": "2025-02-27T06:03:30+00:00" "time": "2025-11-25T04:42:27+00:00"
}, },
{ {
"name": "apimatic/core-interfaces", "name": "apimatic/core-interfaces",
@ -496,16 +497,16 @@
}, },
{ {
"name": "aws/aws-sdk-php", "name": "aws/aws-sdk-php",
"version": "3.362.1", "version": "3.363.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/aws/aws-sdk-php.git", "url": "https://github.com/aws/aws-sdk-php.git",
"reference": "f29a49b74d5ee771f13432e16d58651de91f7e79" "reference": "f8b5f125248daa8942144b4771c041a63ec41900"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/f29a49b74d5ee771f13432e16d58651de91f7e79", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/f8b5f125248daa8942144b4771c041a63ec41900",
"reference": "f29a49b74d5ee771f13432e16d58651de91f7e79", "reference": "f8b5f125248daa8942144b4771c041a63ec41900",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -587,9 +588,9 @@
"support": { "support": {
"forum": "https://github.com/aws/aws-sdk-php/discussions", "forum": "https://github.com/aws/aws-sdk-php/discussions",
"issues": "https://github.com/aws/aws-sdk-php/issues", "issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.362.1" "source": "https://github.com/aws/aws-sdk-php/tree/3.363.2"
}, },
"time": "2025-11-20T19:10:40+00:00" "time": "2025-11-25T19:04:55+00:00"
}, },
{ {
"name": "babenkoivan/elastic-adapter", "name": "babenkoivan/elastic-adapter",
@ -1011,13 +1012,13 @@
"version": "dev-master", "version": "dev-master",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/turbo124/snappdf.git", "url": "https://github.com/beganovich/snappdf.git",
"reference": "73997afb327fb9cd99686368769d2f0562cb3a9f" "reference": "340e877e63ef98db82766a8d8a853d7759cf79fa"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/turbo124/snappdf/zipball/73997afb327fb9cd99686368769d2f0562cb3a9f", "url": "https://api.github.com/repos/beganovich/snappdf/zipball/340e877e63ef98db82766a8d8a853d7759cf79fa",
"reference": "73997afb327fb9cd99686368769d2f0562cb3a9f", "reference": "340e877e63ef98db82766a8d8a853d7759cf79fa",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1042,16 +1043,7 @@
"Beganovich\\Snappdf\\": "src/" "Beganovich\\Snappdf\\": "src/"
} }
}, },
"autoload-dev": { "notification-url": "https://packagist.org/downloads/",
"psr-4": {
"Test\\Snappdf\\": "tests/"
}
},
"scripts": {
"tests": [
"@php vendor/bin/phpunit --testdox"
]
},
"license": [ "license": [
"MIT" "MIT"
], ],
@ -1063,9 +1055,10 @@
], ],
"description": "Convert webpages or HTML into the PDF file using Chromium or Google Chrome.", "description": "Convert webpages or HTML into the PDF file using Chromium or Google Chrome.",
"support": { "support": {
"source": "https://github.com/turbo124/snappdf/tree/master" "issues": "https://github.com/beganovich/snappdf/issues",
"source": "https://github.com/beganovich/snappdf/tree/v5.0.1"
}, },
"time": "2025-01-04T00:35:22+00:00" "time": "2024-11-20T17:31:20+00:00"
}, },
{ {
"name": "braintree/braintree_php", "name": "braintree/braintree_php",
@ -1118,16 +1111,16 @@
}, },
{ {
"name": "brick/math", "name": "brick/math",
"version": "0.14.0", "version": "0.14.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/brick/math.git", "url": "https://github.com/brick/math.git",
"reference": "113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2" "reference": "f05858549e5f9d7bb45875a75583240a38a281d0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/brick/math/zipball/113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2", "url": "https://api.github.com/repos/brick/math/zipball/f05858549e5f9d7bb45875a75583240a38a281d0",
"reference": "113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2", "reference": "f05858549e5f9d7bb45875a75583240a38a281d0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1166,7 +1159,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/brick/math/issues", "issues": "https://github.com/brick/math/issues",
"source": "https://github.com/brick/math/tree/0.14.0" "source": "https://github.com/brick/math/tree/0.14.1"
}, },
"funding": [ "funding": [
{ {
@ -1174,7 +1167,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2025-08-29T12:40:03+00:00" "time": "2025-11-24T14:40:29+00:00"
}, },
{ {
"name": "btcpayserver/btcpayserver-greenfield-php", "name": "btcpayserver/btcpayserver-greenfield-php",
@ -3035,16 +3028,16 @@
}, },
{ {
"name": "google/apiclient-services", "name": "google/apiclient-services",
"version": "v0.420.1", "version": "v0.421.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/googleapis/google-api-php-client-services.git", "url": "https://github.com/googleapis/google-api-php-client-services.git",
"reference": "f1200dbf48d02dcfa36c5771f4dbc0433655a7ab" "reference": "d84e7301a52405677807564dab6b1a112dfd03bd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/f1200dbf48d02dcfa36c5771f4dbc0433655a7ab", "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/d84e7301a52405677807564dab6b1a112dfd03bd",
"reference": "f1200dbf48d02dcfa36c5771f4dbc0433655a7ab", "reference": "d84e7301a52405677807564dab6b1a112dfd03bd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3073,9 +3066,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/googleapis/google-api-php-client-services/issues", "issues": "https://github.com/googleapis/google-api-php-client-services/issues",
"source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.420.1" "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.421.0"
}, },
"time": "2025-11-17T01:06:15+00:00" "time": "2025-11-23T01:06:22+00:00"
}, },
{ {
"name": "google/auth", "name": "google/auth",
@ -4835,16 +4828,16 @@
}, },
{ {
"name": "josemmo/facturae-php", "name": "josemmo/facturae-php",
"version": "v1.8.3", "version": "v1.8.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/josemmo/Facturae-PHP.git", "url": "https://github.com/josemmo/Facturae-PHP.git",
"reference": "f4099c9479fb770bd03f9c559c054c0fea86fa44" "reference": "21283e460d2a24d58c06454596fcaecc63c8f123"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/josemmo/Facturae-PHP/zipball/f4099c9479fb770bd03f9c559c054c0fea86fa44", "url": "https://api.github.com/repos/josemmo/Facturae-PHP/zipball/21283e460d2a24d58c06454596fcaecc63c8f123",
"reference": "f4099c9479fb770bd03f9c559c054c0fea86fa44", "reference": "21283e460d2a24d58c06454596fcaecc63c8f123",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4886,9 +4879,15 @@
], ],
"support": { "support": {
"issues": "https://github.com/josemmo/Facturae-PHP/issues", "issues": "https://github.com/josemmo/Facturae-PHP/issues",
"source": "https://github.com/josemmo/Facturae-PHP/tree/v1.8.3" "source": "https://github.com/josemmo/Facturae-PHP/tree/v1.8.4"
}, },
"time": "2025-06-22T08:30:43+00:00" "funding": [
{
"url": "https://github.com/josemmo",
"type": "github"
}
],
"time": "2025-11-24T14:05:18+00:00"
}, },
{ {
"name": "kmukku/php-iso11649", "name": "kmukku/php-iso11649",
@ -5079,16 +5078,16 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v11.46.1", "version": "v11.46.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "5fd457f807570a962a53b403b1346efe4cc80bb8" "reference": "d6b16e72a98c2ad3257ec6b3f1f00532c3b1c2fc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/5fd457f807570a962a53b403b1346efe4cc80bb8", "url": "https://api.github.com/repos/laravel/framework/zipball/d6b16e72a98c2ad3257ec6b3f1f00532c3b1c2fc",
"reference": "5fd457f807570a962a53b403b1346efe4cc80bb8", "reference": "d6b16e72a98c2ad3257ec6b3f1f00532c3b1c2fc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5290,7 +5289,7 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2025-09-30T14:51:32+00:00" "time": "2025-11-25T19:02:06+00:00"
}, },
{ {
"name": "laravel/octane", "name": "laravel/octane",
@ -5384,16 +5383,16 @@
}, },
{ {
"name": "laravel/prompts", "name": "laravel/prompts",
"version": "v0.3.7", "version": "v0.3.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/prompts.git", "url": "https://github.com/laravel/prompts.git",
"reference": "a1891d362714bc40c8d23b0b1d7090f022ea27cc" "reference": "096748cdfb81988f60090bbb839ce3205ace0d35"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/prompts/zipball/a1891d362714bc40c8d23b0b1d7090f022ea27cc", "url": "https://api.github.com/repos/laravel/prompts/zipball/096748cdfb81988f60090bbb839ce3205ace0d35",
"reference": "a1891d362714bc40c8d23b0b1d7090f022ea27cc", "reference": "096748cdfb81988f60090bbb839ce3205ace0d35",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5409,7 +5408,7 @@
"require-dev": { "require-dev": {
"illuminate/collections": "^10.0|^11.0|^12.0", "illuminate/collections": "^10.0|^11.0|^12.0",
"mockery/mockery": "^1.5", "mockery/mockery": "^1.5",
"pestphp/pest": "^2.3|^3.4", "pestphp/pest": "^2.3|^3.4|^4.0",
"phpstan/phpstan": "^1.12.28", "phpstan/phpstan": "^1.12.28",
"phpstan/phpstan-mockery": "^1.1.3" "phpstan/phpstan-mockery": "^1.1.3"
}, },
@ -5437,22 +5436,22 @@
"description": "Add beautiful and user-friendly forms to your command-line applications.", "description": "Add beautiful and user-friendly forms to your command-line applications.",
"support": { "support": {
"issues": "https://github.com/laravel/prompts/issues", "issues": "https://github.com/laravel/prompts/issues",
"source": "https://github.com/laravel/prompts/tree/v0.3.7" "source": "https://github.com/laravel/prompts/tree/v0.3.8"
}, },
"time": "2025-09-19T13:47:56+00:00" "time": "2025-11-21T20:52:52+00:00"
}, },
{ {
"name": "laravel/scout", "name": "laravel/scout",
"version": "v10.22.0", "version": "v10.22.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/scout.git", "url": "https://github.com/laravel/scout.git",
"reference": "5f629471eed80c97a1fa2f12a2fb213c7e09f729" "reference": "13ed8e0eeaddd894bf360b85cb873980de19dbaf"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/scout/zipball/5f629471eed80c97a1fa2f12a2fb213c7e09f729", "url": "https://api.github.com/repos/laravel/scout/zipball/13ed8e0eeaddd894bf360b85cb873980de19dbaf",
"reference": "5f629471eed80c97a1fa2f12a2fb213c7e09f729", "reference": "13ed8e0eeaddd894bf360b85cb873980de19dbaf",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5473,10 +5472,9 @@
"algolia/algoliasearch-client-php": "^3.2|^4.0", "algolia/algoliasearch-client-php": "^3.2|^4.0",
"meilisearch/meilisearch-php": "^1.0", "meilisearch/meilisearch-php": "^1.0",
"mockery/mockery": "^1.0", "mockery/mockery": "^1.0",
"orchestra/testbench": "^7.31|^8.11|^9.0|^10.0", "orchestra/testbench": "^7.31|^8.36|^9.15|^10.8",
"php-http/guzzle7-adapter": "^1.0", "php-http/guzzle7-adapter": "^1.0",
"phpstan/phpstan": "^1.10", "phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^9.3|^10.4|^11.5",
"typesense/typesense-php": "^4.9.3" "typesense/typesense-php": "^4.9.3"
}, },
"suggest": { "suggest": {
@ -5520,20 +5518,20 @@
"issues": "https://github.com/laravel/scout/issues", "issues": "https://github.com/laravel/scout/issues",
"source": "https://github.com/laravel/scout" "source": "https://github.com/laravel/scout"
}, },
"time": "2025-11-12T17:00:55+00:00" "time": "2025-11-25T15:19:35+00:00"
}, },
{ {
"name": "laravel/serializable-closure", "name": "laravel/serializable-closure",
"version": "v2.0.6", "version": "v2.0.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/serializable-closure.git", "url": "https://github.com/laravel/serializable-closure.git",
"reference": "038ce42edee619599a1debb7e81d7b3759492819" "reference": "cb291e4c998ac50637c7eeb58189c14f5de5b9dd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/038ce42edee619599a1debb7e81d7b3759492819", "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/cb291e4c998ac50637c7eeb58189c14f5de5b9dd",
"reference": "038ce42edee619599a1debb7e81d7b3759492819", "reference": "cb291e4c998ac50637c7eeb58189c14f5de5b9dd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5542,7 +5540,7 @@
"require-dev": { "require-dev": {
"illuminate/support": "^10.0|^11.0|^12.0", "illuminate/support": "^10.0|^11.0|^12.0",
"nesbot/carbon": "^2.67|^3.0", "nesbot/carbon": "^2.67|^3.0",
"pestphp/pest": "^2.36|^3.0", "pestphp/pest": "^2.36|^3.0|^4.0",
"phpstan/phpstan": "^2.0", "phpstan/phpstan": "^2.0",
"symfony/var-dumper": "^6.2.0|^7.0.0" "symfony/var-dumper": "^6.2.0|^7.0.0"
}, },
@ -5581,20 +5579,20 @@
"issues": "https://github.com/laravel/serializable-closure/issues", "issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure" "source": "https://github.com/laravel/serializable-closure"
}, },
"time": "2025-10-09T13:42:30+00:00" "time": "2025-11-21T20:52:36+00:00"
}, },
{ {
"name": "laravel/slack-notification-channel", "name": "laravel/slack-notification-channel",
"version": "v3.6.0", "version": "v3.7.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/slack-notification-channel.git", "url": "https://github.com/laravel/slack-notification-channel.git",
"reference": "642677a57490eebccb7e9fb666f5a5379c6e3459" "reference": "414aec57b487bfbac7f90fc30f50a2f0a2df4caa"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/slack-notification-channel/zipball/642677a57490eebccb7e9fb666f5a5379c6e3459", "url": "https://api.github.com/repos/laravel/slack-notification-channel/zipball/414aec57b487bfbac7f90fc30f50a2f0a2df4caa",
"reference": "642677a57490eebccb7e9fb666f5a5379c6e3459", "reference": "414aec57b487bfbac7f90fc30f50a2f0a2df4caa",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5644,22 +5642,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/laravel/slack-notification-channel/issues", "issues": "https://github.com/laravel/slack-notification-channel/issues",
"source": "https://github.com/laravel/slack-notification-channel/tree/v3.6.0" "source": "https://github.com/laravel/slack-notification-channel/tree/v3.7.0"
}, },
"time": "2025-06-26T16:51:38+00:00" "time": "2025-11-20T17:26:07+00:00"
}, },
{ {
"name": "laravel/socialite", "name": "laravel/socialite",
"version": "v5.23.1", "version": "v5.23.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/socialite.git", "url": "https://github.com/laravel/socialite.git",
"reference": "83d7523c97c1101d288126948947891319eef800" "reference": "41e65d53762d33d617bf0253330d672cb95e624b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/socialite/zipball/83d7523c97c1101d288126948947891319eef800", "url": "https://api.github.com/repos/laravel/socialite/zipball/41e65d53762d33d617bf0253330d672cb95e624b",
"reference": "83d7523c97c1101d288126948947891319eef800", "reference": "41e65d53762d33d617bf0253330d672cb95e624b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5675,9 +5673,9 @@
}, },
"require-dev": { "require-dev": {
"mockery/mockery": "^1.0", "mockery/mockery": "^1.0",
"orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", "orchestra/testbench": "^4.18|^5.20|^6.47|^7.55|^8.36|^9.15|^10.8",
"phpstan/phpstan": "^1.12.23", "phpstan/phpstan": "^1.12.23",
"phpunit/phpunit": "^8.0|^9.3|^10.4|^11.5" "phpunit/phpunit": "^8.0|^9.3|^10.4|^11.5|^12.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -5718,20 +5716,20 @@
"issues": "https://github.com/laravel/socialite/issues", "issues": "https://github.com/laravel/socialite/issues",
"source": "https://github.com/laravel/socialite" "source": "https://github.com/laravel/socialite"
}, },
"time": "2025-10-27T15:36:41+00:00" "time": "2025-11-21T14:00:38+00:00"
}, },
{ {
"name": "laravel/tinker", "name": "laravel/tinker",
"version": "v2.10.1", "version": "v2.10.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/tinker.git", "url": "https://github.com/laravel/tinker.git",
"reference": "22177cc71807d38f2810c6204d8f7183d88a57d3" "reference": "3bcb5f62d6f837e0f093a601e26badafb127bd4c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3", "url": "https://api.github.com/repos/laravel/tinker/zipball/3bcb5f62d6f837e0f093a601e26badafb127bd4c",
"reference": "22177cc71807d38f2810c6204d8f7183d88a57d3", "reference": "3bcb5f62d6f837e0f093a601e26badafb127bd4c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5782,9 +5780,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/laravel/tinker/issues", "issues": "https://github.com/laravel/tinker/issues",
"source": "https://github.com/laravel/tinker/tree/v2.10.1" "source": "https://github.com/laravel/tinker/tree/v2.10.2"
}, },
"time": "2025-01-27T14:24:01+00:00" "time": "2025-11-20T16:29:12+00:00"
}, },
{ {
"name": "laravel/ui", "name": "laravel/ui",
@ -8072,16 +8070,16 @@
}, },
{ {
"name": "nette/utils", "name": "nette/utils",
"version": "v4.0.8", "version": "v4.0.9",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nette/utils.git", "url": "https://github.com/nette/utils.git",
"reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede" "reference": "505a30ad386daa5211f08a318e47015b501cad30"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nette/utils/zipball/c930ca4e3cf4f17dcfb03037703679d2396d2ede", "url": "https://api.github.com/repos/nette/utils/zipball/505a30ad386daa5211f08a318e47015b501cad30",
"reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede", "reference": "505a30ad386daa5211f08a318e47015b501cad30",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8155,9 +8153,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/nette/utils/issues", "issues": "https://github.com/nette/utils/issues",
"source": "https://github.com/nette/utils/tree/v4.0.8" "source": "https://github.com/nette/utils/tree/v4.0.9"
}, },
"time": "2025-08-06T21:43:34+00:00" "time": "2025-10-31T00:45:47+00:00"
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
@ -8528,16 +8526,16 @@
}, },
{ {
"name": "open-telemetry/api", "name": "open-telemetry/api",
"version": "1.7.0", "version": "1.7.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/opentelemetry-php/api.git", "url": "https://github.com/opentelemetry-php/api.git",
"reference": "610b79ad9d6d97e8368bcb6c4d42394fbb87b522" "reference": "45bda7efa8fcdd9bdb0daa2f26c8e31f062f49d4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/opentelemetry-php/api/zipball/610b79ad9d6d97e8368bcb6c4d42394fbb87b522", "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/45bda7efa8fcdd9bdb0daa2f26c8e31f062f49d4",
"reference": "610b79ad9d6d97e8368bcb6c4d42394fbb87b522", "reference": "45bda7efa8fcdd9bdb0daa2f26c8e31f062f49d4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8557,7 +8555,7 @@
] ]
}, },
"branch-alias": { "branch-alias": {
"dev-main": "1.7.x-dev" "dev-main": "1.8.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -8590,11 +8588,11 @@
], ],
"support": { "support": {
"chat": "https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V", "chat": "https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V",
"docs": "https://opentelemetry.io/docs/php", "docs": "https://opentelemetry.io/docs/languages/php",
"issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "issues": "https://github.com/open-telemetry/opentelemetry-php/issues",
"source": "https://github.com/open-telemetry/opentelemetry-php" "source": "https://github.com/open-telemetry/opentelemetry-php"
}, },
"time": "2025-10-02T23:44:28+00:00" "time": "2025-10-19T10:49:48+00:00"
}, },
{ {
"name": "open-telemetry/context", "name": "open-telemetry/context",
@ -9480,16 +9478,16 @@
}, },
{ {
"name": "phpdocumentor/type-resolver", "name": "phpdocumentor/type-resolver",
"version": "1.11.1", "version": "1.12.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git", "url": "https://github.com/phpDocumentor/TypeResolver.git",
"reference": "f626740b38009078de0dc8b2b9dc4e7f749c6eba" "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/f626740b38009078de0dc8b2b9dc4e7f749c6eba", "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195",
"reference": "f626740b38009078de0dc8b2b9dc4e7f749c6eba", "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9532,22 +9530,22 @@
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"support": { "support": {
"issues": "https://github.com/phpDocumentor/TypeResolver/issues", "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.11.1" "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0"
}, },
"time": "2025-11-21T11:31:57+00:00" "time": "2025-11-21T15:09:14+00:00"
}, },
{ {
"name": "phpoffice/phpspreadsheet", "name": "phpoffice/phpspreadsheet",
"version": "2.4.1", "version": "2.4.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHPOffice/PhpSpreadsheet.git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
"reference": "096ae6faf94b49b2cf53e92a0073133c941e1f57" "reference": "931ad61fb2c229063fc4e7e665fb52b87249cc56"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/096ae6faf94b49b2cf53e92a0073133c941e1f57", "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/931ad61fb2c229063fc4e7e665fb52b87249cc56",
"reference": "096ae6faf94b49b2cf53e92a0073133c941e1f57", "reference": "931ad61fb2c229063fc4e7e665fb52b87249cc56",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9568,7 +9566,7 @@
"maennchen/zipstream-php": "^2.1 || ^3.0", "maennchen/zipstream-php": "^2.1 || ^3.0",
"markbaker/complex": "^3.0", "markbaker/complex": "^3.0",
"markbaker/matrix": "^3.0", "markbaker/matrix": "^3.0",
"php": "^8.1", "php": ">=8.1.0 <8.6.0",
"psr/http-client": "^1.0", "psr/http-client": "^1.0",
"psr/http-factory": "^1.0", "psr/http-factory": "^1.0",
"psr/simple-cache": "^1.0 || ^2.0 || ^3.0" "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
@ -9577,7 +9575,7 @@
"dealerdirect/phpcodesniffer-composer-installer": "dev-main", "dealerdirect/phpcodesniffer-composer-installer": "dev-main",
"dompdf/dompdf": "^2.0 || ^3.0", "dompdf/dompdf": "^2.0 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.2", "friendsofphp/php-cs-fixer": "^3.2",
"mitoteam/jpgraph": "^10.3", "mitoteam/jpgraph": "^10.5",
"mpdf/mpdf": "^8.1.1", "mpdf/mpdf": "^8.1.1",
"phpcompatibility/php-compatibility": "^9.3", "phpcompatibility/php-compatibility": "^9.3",
"phpstan/phpstan": "^1.1", "phpstan/phpstan": "^1.1",
@ -9588,7 +9586,7 @@
}, },
"suggest": { "suggest": {
"dompdf/dompdf": "Option for rendering PDF with PDF Writer", "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
"ext-intl": "PHP Internationalization Functions", "ext-intl": "PHP Internationalization Functions, required for NumberFormatter Wizard",
"mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
"mpdf/mpdf": "Option for rendering PDF with PDF Writer", "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
"tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
@ -9637,9 +9635,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
"source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/2.4.1" "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/2.4.2"
}, },
"time": "2025-09-01T18:41:37+00:00" "time": "2025-11-24T15:59:19+00:00"
}, },
{ {
"name": "phpoption/phpoption", "name": "phpoption/phpoption",
@ -10913,16 +10911,16 @@
}, },
{ {
"name": "rmccue/requests", "name": "rmccue/requests",
"version": "v2.0.15", "version": "v2.0.16",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/WordPress/Requests.git", "url": "https://github.com/WordPress/Requests.git",
"reference": "877cd66169755899682f1595e057334b40d9d149" "reference": "babd303d2084cf2690db536aeb6eef58326ee3ff"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/WordPress/Requests/zipball/877cd66169755899682f1595e057334b40d9d149", "url": "https://api.github.com/repos/WordPress/Requests/zipball/babd303d2084cf2690db536aeb6eef58326ee3ff",
"reference": "877cd66169755899682f1595e057334b40d9d149", "reference": "babd303d2084cf2690db536aeb6eef58326ee3ff",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -10930,15 +10928,14 @@
"php": ">=5.6" "php": ">=5.6"
}, },
"require-dev": { "require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7", "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.0",
"php-parallel-lint/php-console-highlighter": "^0.5.0", "php-parallel-lint/php-console-highlighter": "^0.5.0",
"php-parallel-lint/php-parallel-lint": "^1.3.1", "php-parallel-lint/php-parallel-lint": "^1.3.1",
"phpcompatibility/php-compatibility": "^9.0", "phpcompatibility/php-compatibility": "^10.0.0@dev",
"requests/test-server": "dev-main", "requests/test-server": "dev-main",
"roave/security-advisories": "dev-latest",
"squizlabs/php_codesniffer": "^3.6", "squizlabs/php_codesniffer": "^3.6",
"wp-coding-standards/wpcs": "^2.0", "wp-coding-standards/wpcs": "^2.0",
"yoast/phpunit-polyfills": "^1.0.0" "yoast/phpunit-polyfills": "^1.1.5"
}, },
"suggest": { "suggest": {
"art4/requests-psr18-adapter": "For using Requests as a PSR-18 HTTP Client", "art4/requests-psr18-adapter": "For using Requests as a PSR-18 HTTP Client",
@ -10996,7 +10993,7 @@
"issues": "https://github.com/WordPress/Requests/issues", "issues": "https://github.com/WordPress/Requests/issues",
"source": "https://github.com/WordPress/Requests" "source": "https://github.com/WordPress/Requests"
}, },
"time": "2025-01-21T10:13:31+00:00" "time": "2025-11-21T23:56:29+00:00"
}, },
{ {
"name": "robrichards/xmlseclibs", "name": "robrichards/xmlseclibs",
@ -11533,16 +11530,16 @@
}, },
{ {
"name": "smalot/pdfparser", "name": "smalot/pdfparser",
"version": "v2.12.1", "version": "v2.12.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/smalot/pdfparser.git", "url": "https://github.com/smalot/pdfparser.git",
"reference": "98d31ba34ef5b5a98897ef4b6c3925d502ea53b1" "reference": "370b7e983fafecb787a9bcfd73baab8038212ad1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/smalot/pdfparser/zipball/98d31ba34ef5b5a98897ef4b6c3925d502ea53b1", "url": "https://api.github.com/repos/smalot/pdfparser/zipball/370b7e983fafecb787a9bcfd73baab8038212ad1",
"reference": "98d31ba34ef5b5a98897ef4b6c3925d502ea53b1", "reference": "370b7e983fafecb787a9bcfd73baab8038212ad1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -11578,9 +11575,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/smalot/pdfparser/issues", "issues": "https://github.com/smalot/pdfparser/issues",
"source": "https://github.com/smalot/pdfparser/tree/v2.12.1" "source": "https://github.com/smalot/pdfparser/tree/v2.12.2"
}, },
"time": "2025-07-31T06:19:56+00:00" "time": "2025-09-04T08:49:09+00:00"
}, },
{ {
"name": "socialiteproviders/apple", "name": "socialiteproviders/apple",
@ -18354,7 +18351,7 @@
}, },
{ {
"name": "illuminate/json-schema", "name": "illuminate/json-schema",
"version": "v12.39.0", "version": "v12.40.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/json-schema.git", "url": "https://github.com/illuminate/json-schema.git",

View File

@ -17,8 +17,8 @@ return [
'require_https' => env('REQUIRE_HTTPS', true), 'require_https' => env('REQUIRE_HTTPS', true),
'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_url' => rtrim(env('APP_URL', ''), '/'),
'app_domain' => env('APP_DOMAIN', 'invoicing.co'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
'app_version' => env('APP_VERSION', '5.12.34'), 'app_version' => env('APP_VERSION', '5.12.35'),
'app_tag' => env('APP_TAG', '5.12.34'), 'app_tag' => env('APP_TAG', '5.12.35'),
'minimum_client_version' => '5.0.16', 'minimum_client_version' => '5.0.16',
'terms_version' => '1.0.1', 'terms_version' => '1.0.1',
'api_secret' => env('API_SECRET', false), 'api_secret' => env('API_SECRET', false),

View File

@ -5663,6 +5663,9 @@ $lang = array(
'invoice_period' => 'Invoice Period', 'invoice_period' => 'Invoice Period',
'invoice_period_help' => 'Defines the time period for which the services were provided.', 'invoice_period_help' => 'Defines the time period for which the services were provided.',
'paused_recurring_invoice_helper' => 'Caution! When restarting a recurring invoice, ensure the next send date is in the future.', 'paused_recurring_invoice_helper' => 'Caution! When restarting a recurring invoice, ensure the next send date is in the future.',
'thank_you_for_feedback' => 'Thank you for your feedback!',
'use_legacy_editor' => 'Use Legacy Wysiwyg Editor',
'use_legacy_editor_help' => 'Use the TinyMCE editor.',
); );
return $lang; return $lang;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

104
public/build/assets/app-eee19136.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -12,7 +12,7 @@
"file": "assets/wait-8f4ae121.js" "file": "assets/wait-8f4ae121.js"
}, },
"resources/js/app.js": { "resources/js/app.js": {
"file": "assets/app-aa93be80.js", "file": "assets/app-eee19136.js",
"imports": [ "imports": [
"_index-08e160a7.js", "_index-08e160a7.js",
"__commonjsHelpers-725317a4.js" "__commonjsHelpers-725317a4.js"
@ -385,7 +385,7 @@
"src": "resources/js/setup/setup.js" "src": "resources/js/setup/setup.js"
}, },
"resources/sass/app.scss": { "resources/sass/app.scss": {
"file": "assets/app-039bd735.css", "file": "assets/app-55cdafc9.css",
"isEntry": true, "isEntry": true,
"src": "resources/sass/app.scss" "src": "resources/sass/app.scss"
} }

View File

@ -1,4 +1,22 @@
<div class="w-full"> <div class="w-full">
@if(!$isReady)
<div class="rounded-lg border bg-card bg-white text-card-foreground shadow-sm overflow-hidden">
<div class="pt-6 px-6 flex flex-row items-start bg-muted/50">
<div class="grid gap-0.5">
<h3 class="font-semibold tracking-tight text-lg">{{ ctrans('texts.invoices') }}</h3>
</div>
</div>
<div class="p-6 flex items-center justify-center min-h-32">
<div class="flex flex-col items-center gap-2">
<svg class="animate-spin h-8 w-8 text-blue" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
</svg>
<p class="text-sm text-muted-foreground">{{ ctrans('texts.loading') }}</p>
</div>
</div>
</div>
@else
<div class="rounded-lg border bg-card bg-white text-card-foreground shadow-sm overflow-hidden" x-chunk="An order details card with order details, shipping information, customer information and payment information."> <div class="rounded-lg border bg-card bg-white text-card-foreground shadow-sm overflow-hidden" x-chunk="An order details card with order details, shipping information, customer information and payment information.">
<div class="pt-6 px-6 flex flex-row items-start bg-muted/50"> <div class="pt-6 px-6 flex flex-row items-start bg-muted/50">
<div class="grid gap-0.5"> <div class="grid gap-0.5">
@ -105,4 +123,5 @@
</div> </div>
</div> </div>
</div> </div>
@endif
</div> </div>

View File

@ -1,6 +1,6 @@
@extends('portal.ninja2020.layout.clean') @section('meta_title', @extends('portal.ninja2020.layout.clean') @section('meta_title',
ctrans('texts.preferences')) @section('body') ctrans('texts.preferences')) @section('body')
<div class="flex h-screen"> <div class="flex h-screen" x-data="{ modalOpen: false, actionType: '' }">
<div class="m-auto md:w-1/3 lg:w-1/5"> <div class="m-auto md:w-1/3 lg:w-1/5">
<div class="flex flex-col items-center"> <div class="flex flex-col items-center">
<img <img
@ -12,15 +12,16 @@ ctrans('texts.preferences')) @section('body')
{{ ctrans('texts.email_preferences') }} {{ ctrans('texts.email_preferences') }}
</h1> </h1>
<form class="my-4 flex flex-col items-center text-center" method="post"> <form id="preferencesForm" class="my-4 flex flex-col items-center text-center" method="post">
@csrf @method('put') @csrf @method('put')
<input type="hidden" name="action" id="actionInput">
@if($receive_emails) @if($receive_emails)
<p>{{ ctrans('texts.subscribe_help') }}</p> <p>{{ ctrans('texts.subscribe_help') }}</p>
<button <button
name="action" type="button"
value="unsubscribe" @click="modalOpen = true; actionType = 'unsubscribe'"
class="button button-secondary mt-4" class="button button-secondary mt-4"
> >
{{ ctrans('texts.unsubscribe') }} {{ ctrans('texts.unsubscribe') }}
@ -29,8 +30,8 @@ ctrans('texts.preferences')) @section('body')
<p>{{ ctrans('texts.unsubscribe_help') }}</p> <p>{{ ctrans('texts.unsubscribe_help') }}</p>
<button <button
name="action" type="button"
value="subscribe" @click="modalOpen = true; actionType = 'subscribe'"
class="button button-secondary mt-4" class="button button-secondary mt-4"
> >
{{ ctrans('texts.subscribe') }} {{ ctrans('texts.subscribe') }}
@ -39,5 +40,54 @@ ctrans('texts.preferences')) @section('body')
</form> </form>
</div> </div>
</div> </div>
<!-- Confirmation Modal -->
<div x-show="modalOpen" class="fixed bottom-0 inset-x-0 px-4 pb-4 sm:inset-0 sm:flex sm:items-center sm:justify-center"
style="display:none;">
<div x-show="modalOpen" x-transition:enter="ease-out duration-300" x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200"
x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"
class="fixed inset-0 transition-opacity" style="display:none;">
<div class="absolute inset-0 bg-gray-500 opacity-75"></div>
</div>
<div x-show="modalOpen" x-transition:enter="ease-out duration-300"
x-transition:enter-start="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
x-transition:enter-end="opacity-100 translate-y-0 sm:scale-100" x-transition:leave="ease-in duration-200"
x-transition:leave-start="opacity-100 translate-y-0 sm:scale-100"
x-transition:leave-end="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
class="bg-white rounded-lg px-4 pt-5 pb-4 overflow-hidden shadow-xl transform transition-all sm:max-w-lg sm:w-full sm:p-6">
<div class="sm:flex sm:items-start">
<div
class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10">
<svg class="h-6 w-6 text-blue-600" stroke="currentColor" fill="none" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
</div>
<div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
<h3 class="text-lg leading-6 font-medium text-gray-900">
<span x-show="actionType === 'unsubscribe'">{{ ctrans('texts.confirm') }}</span>
<span x-show="actionType === 'subscribe'">{{ ctrans('texts.confirm') }}</span>
</h3>
<div class="mt-2">
<p class="text-sm leading-5 text-gray-500">
<span>{{ ctrans('texts.are_you_sure') }}</span>
</p>
</div>
</div>
</div>
<div class="mt-5 sm:mt-4 sm:flex sm:flex-row-reverse">
<button @click="document.getElementById('actionInput').value = actionType; document.getElementById('preferencesForm').submit();"
type="button" class="button button-danger sm:ml-3 sm:w-auto">
<span x-show="actionType === 'unsubscribe'">{{ ctrans('texts.unsubscribe') }}</span>
<span x-show="actionType === 'subscribe'">{{ ctrans('texts.subscribe') }}</span>
</button>
<button @click="modalOpen = false" type="button" class="button button-secondary button-block sm:mt-0 sm:w-auto sm:ml-3">
{{ ctrans('texts.cancel') }}
</button>
</div>
</div>
</div>
</div> </div>
@stop @stop