From 1de08b17cff0b4424832963c4efc65d5ca8e55bb Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 3 Feb 2021 12:53:34 +0530 Subject: [PATCH 01/29] Paypal Order Data Captured --- packages/Webkul/Checkout/src/Cart.php | 4 +++ ...adittional_data_to_order_payment_table.php | 32 +++++++++++++++++++ .../Webkul/Sales/src/Models/OrderPayment.php | 5 ++- 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 packages/Webkul/Sales/src/Database/Migrations/2021_02_03_104907_add_adittional_data_to_order_payment_table.php diff --git a/packages/Webkul/Checkout/src/Cart.php b/packages/Webkul/Checkout/src/Cart.php index 42ba51e18..ec3db5ad5 100755 --- a/packages/Webkul/Checkout/src/Cart.php +++ b/packages/Webkul/Checkout/src/Cart.php @@ -897,6 +897,10 @@ class Cart $finalData['items'][] = $this->prepareDataForOrderItem($item); } + if ($finalData['payment']['method'] === 'paypal_smart_button') { + $finalData['payment']['additional'] = request()->get('data'); + } + return $finalData; } diff --git a/packages/Webkul/Sales/src/Database/Migrations/2021_02_03_104907_add_adittional_data_to_order_payment_table.php b/packages/Webkul/Sales/src/Database/Migrations/2021_02_03_104907_add_adittional_data_to_order_payment_table.php new file mode 100644 index 000000000..dabd9d633 --- /dev/null +++ b/packages/Webkul/Sales/src/Database/Migrations/2021_02_03_104907_add_adittional_data_to_order_payment_table.php @@ -0,0 +1,32 @@ +json('additional')->after('order_id')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('order_payment', function (Blueprint $table) { + $table->dropColumn('additional'); + }); + } +} diff --git a/packages/Webkul/Sales/src/Models/OrderPayment.php b/packages/Webkul/Sales/src/Models/OrderPayment.php index 8d142d8ed..23eeccd5f 100755 --- a/packages/Webkul/Sales/src/Models/OrderPayment.php +++ b/packages/Webkul/Sales/src/Models/OrderPayment.php @@ -5,7 +5,6 @@ namespace Webkul\Sales\Models; use Illuminate\Database\Eloquent\Model; use Webkul\Sales\Contracts\OrderPayment as OrderPaymentContract; - class OrderPayment extends Model implements OrderPaymentContract { protected $table = 'order_payment'; @@ -15,4 +14,8 @@ class OrderPayment extends Model implements OrderPaymentContract 'created_at', 'updated_at', ]; + + protected $casts = [ + 'additional' => 'array' + ]; } \ No newline at end of file From b5548f48c67d75ba2bb5189f66ea482b2105f76b Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 3 Feb 2021 17:12:39 +0530 Subject: [PATCH 02/29] Today's Work - Capture ID Pending --- packages/Webkul/Admin/src/Listeners/Order.php | 197 ++---------------- .../src/Providers/EventServiceProvider.php | 10 +- packages/Webkul/Admin/src/Traits/Mails.php | 197 ++++++++++++++++++ .../Webkul/Paypal/src/Payment/SmartButton.php | 14 ++ .../src/Repositories/RefundRepository.php | 10 +- 5 files changed, 243 insertions(+), 185 deletions(-) create mode 100644 packages/Webkul/Admin/src/Traits/Mails.php diff --git a/packages/Webkul/Admin/src/Listeners/Order.php b/packages/Webkul/Admin/src/Listeners/Order.php index 52887d8e7..15f6470eb 100755 --- a/packages/Webkul/Admin/src/Listeners/Order.php +++ b/packages/Webkul/Admin/src/Listeners/Order.php @@ -2,191 +2,30 @@ namespace Webkul\Admin\Listeners; -use Illuminate\Support\Facades\Mail; -use Webkul\Admin\Mail\NewAdminNotification; -use Webkul\Admin\Mail\NewOrderNotification; -use Webkul\Admin\Mail\NewRefundNotification; -use Webkul\Admin\Mail\NewInvoiceNotification; -use Webkul\Admin\Mail\CancelOrderNotification; -use Webkul\Admin\Mail\NewShipmentNotification; -use Webkul\Admin\Mail\OrderCommentNotification; -use Webkul\Admin\Mail\CancelOrderAdminNotification; -use Webkul\Admin\Mail\NewInventorySourceNotification; +use Webkul\Admin\Traits\Mails; +use Webkul\Paypal\Payment\SmartButton; +use PayPalCheckoutSdk\Orders\OrdersGetRequest; +use PayPalCheckoutSdk\Orders\OrdersCaptureRequest; +use PayPalCheckoutSdk\Orders\OrdersAuthorizeRequest; +use PayPalCheckoutSdk\Payments\AuthorizationsCaptureRequest; class Order { - /** - * Send new order Mail to the customer and admin - * - * @param \Webkul\Sales\Contracts\Order $order - * @return void - */ - public function sendNewOrderMail($order) + use Mails; + + public function refundOrder($data) { - $customerLocale = $this->getLocale($order); + $orderID = $data['order']->payment->additional['orderID']; + $payerID = $data['order']->payment->additional['payerID']; + // dd($orderID, $payerID, $data['order']->payment->additional); - try { - /* email to customer */ - $configKey = 'emails.general.notifications.emails.general.notifications.new-order'; - if (core()->getConfigData($configKey)) { - $this->prepareMail($customerLocale, new NewOrderNotification($order)); - } + $smartButton = new SmartButton(); + $client = $smartButton->client(); - /* email to admin */ - $configKey = 'emails.general.notifications.emails.general.notifications.new-admin'; - if (core()->getConfigData($configKey)) { - $this->prepareMail(config('app.locale'), new NewAdminNotification($order)); - } - } catch (\Exception $e) { - report($e); - } - } + /* get order */ + // $response = $client->execute(new OrdersGetRequest($orderID)); + // dd($response); - /** - * Send new invoice mail to the customer - * - * @param \Webkul\Sales\Contracts\Invoice $invoice - * @return void - */ - public function sendNewInvoiceMail($invoice) - { - $customerLocale = $this->getLocale($invoice); - - try { - if ($invoice->email_sent) { - return; - } - - /* email to customer */ - $configKey = 'emails.general.notifications.emails.general.notifications.new-invoice'; - if (core()->getConfigData($configKey)) { - $this->prepareMail($customerLocale, new NewInvoiceNotification($invoice)); - } - } catch (\Exception $e) { - report($e); - } - } - - /** - * Send new refund mail to the customer - * - * @param \Webkul\Sales\Contracts\Refund $refund - * @return void - */ - public function sendNewRefundMail($refund) - { - $customerLocale = $this->getLocale($refund); - - try { - /* email to customer */ - $configKey = 'emails.general.notifications.emails.general.notifications.new-refund'; - if (core()->getConfigData($configKey)) { - $this->prepareMail($customerLocale, new NewRefundNotification($refund)); - } - } catch (\Exception $e) { - report($e); - } - } - - /** - * Send new shipment mail to the customer - * - * @param \Webkul\Sales\Contracts\Shipment $shipment - * @return void - */ - public function sendNewShipmentMail($shipment) - { - $customerLocale = $this->getLocale($shipment); - - try { - if ($shipment->email_sent) { - return; - } - - /* email to customer */ - $configKey = 'emails.general.notifications.emails.general.notifications.new-shipment'; - if (core()->getConfigData($configKey)) { - $this->prepareMail($customerLocale, new NewShipmentNotification($shipment)); - } - - /* email to admin */ - $configKey = 'emails.general.notifications.emails.general.notifications.new-inventory-source'; - if (core()->getConfigData($configKey)) { - $this->prepareMail(config('app.locale'), new NewInventorySourceNotification($shipment)); - } - } catch (\Exception $e) { - report($e); - } - } - - /** - * @param \Webkul\Sales\Contracts\Order $order - * @return void - */ - public function sendCancelOrderMail($order) - { - $customerLocale = $this->getLocale($order); - - try { - /* email to customer */ - $configKey = 'emails.general.notifications.emails.general.notifications.cancel-order'; - if (core()->getConfigData($configKey)) { - $this->prepareMail($customerLocale, new CancelOrderNotification($order)); - } - - /* email to admin */ - $configKey = 'emails.general.notifications.emails.general.notifications.new-admin'; - if (core()->getConfigData($configKey)) { - $this->prepareMail(config('app.locale'), new CancelOrderAdminNotification($order)); - } - } catch (\Exception $e) { - report($e); - } - } - - /** - * @param \Webkul\Sales\Contracts\OrderComment $comment - * @return void - */ - public function sendOrderCommentMail($comment) - { - $customerLocale = $this->getLocale($comment); - - if (! $comment->customer_notified) { - return; - } - - try { - /* email to customer */ - $this->prepareMail($customerLocale, new OrderCommentNotification($comment)); - } catch (\Exception $e) { - report($e); - } - } - - /** - * Get the locale of the customer if somehow item name changes then the english locale will pe provided. - * - * @param object \Webkul\Sales\Contracts\Order|\Webkul\Sales\Contracts\Invoice|\Webkul\Sales\Contracts\Refund|\Webkul\Sales\Contracts\Shipment|\Webkul\Sales\Contracts\OrderComment - * @return string - */ - private function getLocale($object) - { - if ($object instanceof \Webkul\Sales\Contracts\OrderComment) { - $object = $object->order; - } - - $objectFirstItem = $object->items->first(); - return isset($objectFirstItem->additional['locale']) ? $objectFirstItem->additional['locale'] : 'en'; - } - - /** - * Prepare Mail. - * @return void - */ - private function prepareMail($locale, $notification) - { - app()->setLocale($locale); - Mail::queue($notification); + // dd($smartButton->refundOrder($orderID, "{}")); } } diff --git a/packages/Webkul/Admin/src/Providers/EventServiceProvider.php b/packages/Webkul/Admin/src/Providers/EventServiceProvider.php index a890f9de2..6f78c994c 100755 --- a/packages/Webkul/Admin/src/Providers/EventServiceProvider.php +++ b/packages/Webkul/Admin/src/Providers/EventServiceProvider.php @@ -22,12 +22,14 @@ class EventServiceProvider extends ServiceProvider Event::listen('sales.shipment.save.after', 'Webkul\Admin\Listeners\Order@sendNewShipmentMail'); - Event::listen('sales.order.cancel.after','Webkul\Admin\Listeners\Order@sendCancelOrderMail'); + Event::listen('sales.order.cancel.after', 'Webkul\Admin\Listeners\Order@sendCancelOrderMail'); - Event::listen('sales.refund.save.after','Webkul\Admin\Listeners\Order@sendNewRefundMail'); + Event::listen('sales.refund.save.before', 'Webkul\Admin\Listeners\Order@refundOrder'); - Event::listen('sales.order.comment.create.after','Webkul\Admin\Listeners\Order@sendOrderCommentMail'); + Event::listen('sales.refund.save.after', 'Webkul\Admin\Listeners\Order@sendNewRefundMail'); - Event::listen('core.channel.update.after','Webkul\Admin\Listeners\ChannelSettingsChange@checkForMaintenaceMode'); + Event::listen('sales.order.comment.create.after', 'Webkul\Admin\Listeners\Order@sendOrderCommentMail'); + + Event::listen('core.channel.update.after', 'Webkul\Admin\Listeners\ChannelSettingsChange@checkForMaintenaceMode'); } } \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Traits/Mails.php b/packages/Webkul/Admin/src/Traits/Mails.php new file mode 100644 index 000000000..33e142e42 --- /dev/null +++ b/packages/Webkul/Admin/src/Traits/Mails.php @@ -0,0 +1,197 @@ +getLocale($order); + + try { + /* email to customer */ + $configKey = 'emails.general.notifications.emails.general.notifications.new-order'; + if (core()->getConfigData($configKey)) { + $this->prepareMail($customerLocale, new NewOrderNotification($order)); + } + + /* email to admin */ + $configKey = 'emails.general.notifications.emails.general.notifications.new-admin'; + if (core()->getConfigData($configKey)) { + $this->prepareMail(config('app.locale'), new NewAdminNotification($order)); + } + } catch (\Exception $e) { + report($e); + } + } + + /** + * Send new invoice mail to the customer. + * + * @param \Webkul\Sales\Contracts\Invoice $invoice + * @return void + */ + public function sendNewInvoiceMail($invoice) + { + $customerLocale = $this->getLocale($invoice); + + try { + if ($invoice->email_sent) { + return; + } + + /* email to customer */ + $configKey = 'emails.general.notifications.emails.general.notifications.new-invoice'; + if (core()->getConfigData($configKey)) { + $this->prepareMail($customerLocale, new NewInvoiceNotification($invoice)); + } + } catch (\Exception $e) { + report($e); + } + } + + /** + * Send new refund mail to the customer. + * + * @param \Webkul\Sales\Contracts\Refund $refund + * @return void + */ + public function sendNewRefundMail($refund) + { + $customerLocale = $this->getLocale($refund); + + try { + /* email to customer */ + $configKey = 'emails.general.notifications.emails.general.notifications.new-refund'; + if (core()->getConfigData($configKey)) { + $this->prepareMail($customerLocale, new NewRefundNotification($refund)); + } + } catch (\Exception $e) { + report($e); + } + } + + /** + * Send new shipment mail to the customer. + * + * @param \Webkul\Sales\Contracts\Shipment $shipment + * @return void + */ + public function sendNewShipmentMail($shipment) + { + $customerLocale = $this->getLocale($shipment); + + try { + if ($shipment->email_sent) { + return; + } + + /* email to customer */ + $configKey = 'emails.general.notifications.emails.general.notifications.new-shipment'; + if (core()->getConfigData($configKey)) { + $this->prepareMail($customerLocale, new NewShipmentNotification($shipment)); + } + + /* email to admin */ + $configKey = 'emails.general.notifications.emails.general.notifications.new-inventory-source'; + if (core()->getConfigData($configKey)) { + $this->prepareMail(config('app.locale'), new NewInventorySourceNotification($shipment)); + } + } catch (\Exception $e) { + report($e); + } + } + + /** + * Send cancel order mail. + * + * @param \Webkul\Sales\Contracts\Order $order + * @return void + */ + public function sendCancelOrderMail($order) + { + $customerLocale = $this->getLocale($order); + + try { + /* email to customer */ + $configKey = 'emails.general.notifications.emails.general.notifications.cancel-order'; + if (core()->getConfigData($configKey)) { + $this->prepareMail($customerLocale, new CancelOrderNotification($order)); + } + + /* email to admin */ + $configKey = 'emails.general.notifications.emails.general.notifications.new-admin'; + if (core()->getConfigData($configKey)) { + $this->prepareMail(config('app.locale'), new CancelOrderAdminNotification($order)); + } + } catch (\Exception $e) { + report($e); + } + } + + /** + * Send order comment mail. + * + * @param \Webkul\Sales\Contracts\OrderComment $comment + * @return void + */ + public function sendOrderCommentMail($comment) + { + $customerLocale = $this->getLocale($comment); + + if (! $comment->customer_notified) { + return; + } + + try { + /* email to customer */ + $this->prepareMail($customerLocale, new OrderCommentNotification($comment)); + } catch (\Exception $e) { + report($e); + } + } + + /** + * Get the locale of the customer if somehow item name changes then the english locale will pe provided. + * + * @param object \Webkul\Sales\Contracts\Order|\Webkul\Sales\Contracts\Invoice|\Webkul\Sales\Contracts\Refund|\Webkul\Sales\Contracts\Shipment|\Webkul\Sales\Contracts\OrderComment + * @return string + */ + private function getLocale($object) + { + if ($object instanceof \Webkul\Sales\Contracts\OrderComment) { + $object = $object->order; + } + + $objectFirstItem = $object->items->first(); + return isset($objectFirstItem->additional['locale']) ? $objectFirstItem->additional['locale'] : 'en'; + } + + /** + * Prepare Mail. + * + * @return void + */ + private function prepareMail($locale, $notification) + { + app()->setLocale($locale); + Mail::queue($notification); + } +} \ No newline at end of file diff --git a/packages/Webkul/Paypal/src/Payment/SmartButton.php b/packages/Webkul/Paypal/src/Payment/SmartButton.php index c2315cc4f..0866e9063 100644 --- a/packages/Webkul/Paypal/src/Payment/SmartButton.php +++ b/packages/Webkul/Paypal/src/Payment/SmartButton.php @@ -5,6 +5,7 @@ namespace Webkul\Paypal\Payment; use PayPalCheckoutSdk\Core\PayPalHttpClient; use PayPalCheckoutSdk\Core\SandboxEnvironment; use PayPalCheckoutSdk\Core\ProductionEnvironment; +use PayPalCheckoutSdk\Payments\CapturesRefundRequest; class SmartButton extends Paypal { @@ -56,6 +57,19 @@ class SmartButton extends Paypal return new PayPalHttpClient($this->environment()); } + /** + * Refund order. + */ + public function refundOrder($captureId, $body = []) + { + /* generating request */ + $request = new CapturesRefundRequest($captureId); + $request->body = $body; + + /* requesting refund */ + return $this->client()->execute($request); + } + /** * Set up and return PayPal PHP SDK environment with PayPal access credentials. * This sample uses SandboxEnvironment. In production, use LiveEnvironment. diff --git a/packages/Webkul/Sales/src/Repositories/RefundRepository.php b/packages/Webkul/Sales/src/Repositories/RefundRepository.php index a494590c2..d1786b60c 100644 --- a/packages/Webkul/Sales/src/Repositories/RefundRepository.php +++ b/packages/Webkul/Sales/src/Repositories/RefundRepository.php @@ -85,10 +85,16 @@ class RefundRepository extends Repository DB::beginTransaction(); try { - Event::dispatch('sales.refund.save.before', $data); - $order = $this->orderRepository->find($data['order_id']); + /* listener will check for first element */ + Event::dispatch('sales.refund.save.before', [ + [ + 'order' => $order, + 'additional' => $data + ] + ]); + $totalQty = array_sum($data['refund']['items']); $refund = parent::create([ From f04c065edd3d89ea0818b17828d77a76d19f0ae9 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 4 Feb 2021 16:52:28 +0530 Subject: [PATCH 03/29] Full Refund Payment Completed & Partial Pending --- packages/Webkul/Admin/src/Listeners/Order.php | 33 ++++++++++++------- .../Controllers/SmartButtonController.php | 11 ++++--- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/packages/Webkul/Admin/src/Listeners/Order.php b/packages/Webkul/Admin/src/Listeners/Order.php index 15f6470eb..d20270f09 100755 --- a/packages/Webkul/Admin/src/Listeners/Order.php +++ b/packages/Webkul/Admin/src/Listeners/Order.php @@ -5,9 +5,6 @@ namespace Webkul\Admin\Listeners; use Webkul\Admin\Traits\Mails; use Webkul\Paypal\Payment\SmartButton; use PayPalCheckoutSdk\Orders\OrdersGetRequest; -use PayPalCheckoutSdk\Orders\OrdersCaptureRequest; -use PayPalCheckoutSdk\Orders\OrdersAuthorizeRequest; -use PayPalCheckoutSdk\Payments\AuthorizationsCaptureRequest; class Order { @@ -15,17 +12,29 @@ class Order public function refundOrder($data) { - $orderID = $data['order']->payment->additional['orderID']; - $payerID = $data['order']->payment->additional['payerID']; - // dd($orderID, $payerID, $data['order']->payment->additional); + $paymentMethod = $data['order']->payment->method; - $smartButton = new SmartButton(); - $client = $smartButton->client(); + if ($paymentMethod === 'paypal_smart_button') { - /* get order */ - // $response = $client->execute(new OrdersGetRequest($orderID)); - // dd($response); + try { + $orderID = $data['order']->payment->additional['orderID']; - // dd($smartButton->refundOrder($orderID, "{}")); + $smartButton = new SmartButton(); + $client = $smartButton->client(); + + /* get order */ + $orderDetails = $client->execute(new OrdersGetRequest($orderID)); + $captureID = $orderDetails->result->purchase_units[0]->payments->captures[0]->id; + + /* refunding order */ + $response = $smartButton->refundOrder($captureID, "{}"); + } catch (\Exception $e) { + /* reporting error */ + report($e); + + /* now aborting whole process */ + abort(500); + } + } } } diff --git a/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php b/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php index f0d0fba21..fc88d800b 100755 --- a/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php +++ b/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php @@ -7,6 +7,7 @@ use Webkul\Paypal\Payment\SmartButton; use Webkul\Sales\Repositories\OrderRepository; use Webkul\Sales\Repositories\InvoiceRepository; use PayPalCheckoutSdk\Orders\OrdersCreateRequest; +use PayPalCheckoutSdk\Orders\OrdersCaptureRequest; class SmartButtonController extends Controller { @@ -71,6 +72,11 @@ class SmartButtonController extends Controller */ public function saveOrder() { + $orderCreationData = request()->get('data'); + $request = new OrdersCaptureRequest($orderCreationData['orderID']); + $request->prefer('return=representation'); + $this->smartButtonClient->execute($request); + if (Cart::hasError()) { return response()->json(['redirect_url' => route('shop.checkout.cart.index')], 403); } @@ -143,12 +149,7 @@ class SmartButtonController extends Controller ], 'application_context' => [ - 'user_action' => 'PAY_NOW', 'shipping_preference' => 'SET_PROVIDED_ADDRESS', - - 'payment_method' => [ - 'payee_preferred' => 'IMMEDIATE_PAYMENT_REQUIRED', - ] ], 'purchase_units' => [ From b3bc0efa3918bb31f0a7321c5b0f888d8bd6026c Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 4 Feb 2021 19:13:59 +0530 Subject: [PATCH 04/29] Routes Name Enhanced For Better Understanding --- .../Controllers/SmartButtonController.php | 79 ++++++++++--------- packages/Webkul/Paypal/src/Http/routes.php | 5 +- .../onepage/paypal-smart-button.blade.php | 4 +- 3 files changed, 47 insertions(+), 41 deletions(-) diff --git a/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php b/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php index fc88d800b..6d9451a5e 100755 --- a/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php +++ b/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php @@ -53,11 +53,11 @@ class SmartButtonController extends Controller } /** - * Success payment. + * Paypal order creation for approval of client. * * @return \Illuminate\Http\JsonResponse */ - public function details(OrdersCreateRequest $request) + public function createOrder(OrdersCreateRequest $request) { $request->prefer('return=representation'); $request->body = $this->buildRequestBody(); @@ -66,46 +66,17 @@ class SmartButtonController extends Controller } /** - * Save order. + * Capturing order. * * @return \Illuminate\Http\Response */ - public function saveOrder() + public function captureOrder() { $orderCreationData = request()->get('data'); $request = new OrdersCaptureRequest($orderCreationData['orderID']); $request->prefer('return=representation'); $this->smartButtonClient->execute($request); - - if (Cart::hasError()) { - return response()->json(['redirect_url' => route('shop.checkout.cart.index')], 403); - } - - try { - Cart::collectTotals(); - - $this->validateOrder(); - - $order = $this->orderRepository->create(Cart::prepareDataForOrder()); - - $this->orderRepository->update(['status' => 'processing'], $order->id); - - if ($order->canInvoice()) { - $this->invoiceRepository->create($this->prepareInvoiceData($order)); - } - - Cart::deActivateCart(); - - session()->flash('order', $order); - - return response()->json([ - 'success' => true, - ]); - } catch (\Exception $e) { - session()->flash('error', trans('shop::app.common.error')); - - throw $e; - } + return $this->saveOrder(); } /** @@ -187,8 +158,6 @@ class SmartButtonController extends Controller ]; if ($cart->haveStockableItems() && $cart->shipping_address) { - $shippingAddressLines = $this->getAddressLines($cart->shipping_address->address1); - $data['purchase_units'][0] = array_merge($data['purchase_units'][0], [ 'shipping' => [ 'address' => [ @@ -253,6 +222,44 @@ class SmartButtonController extends Controller return $addressLines; } + /** + * Saving order once captured and all formalities done. + * + * @return \Illuminate\Http\Response + */ + protected function saveOrder() + { + if (Cart::hasError()) { + return response()->json(['redirect_url' => route('shop.checkout.cart.index')], 403); + } + + try { + Cart::collectTotals(); + + $this->validateOrder(); + + $order = $this->orderRepository->create(Cart::prepareDataForOrder()); + + $this->orderRepository->update(['status' => 'processing'], $order->id); + + if ($order->canInvoice()) { + $this->invoiceRepository->create($this->prepareInvoiceData($order)); + } + + Cart::deActivateCart(); + + session()->flash('order', $order); + + return response()->json([ + 'success' => true, + ]); + } catch (\Exception $e) { + session()->flash('error', trans('shop::app.common.error')); + + throw $e; + } + } + /** * Prepares order's invoice data for creation. * diff --git a/packages/Webkul/Paypal/src/Http/routes.php b/packages/Webkul/Paypal/src/Http/routes.php index 20818e6eb..5f0b97ab9 100755 --- a/packages/Webkul/Paypal/src/Http/routes.php +++ b/packages/Webkul/Paypal/src/Http/routes.php @@ -2,7 +2,6 @@ Route::group(['middleware' => ['web']], function () { Route::prefix('paypal/standard')->group(function () { - Route::get('/redirect', 'Webkul\Paypal\Http\Controllers\StandardController@redirect')->name('paypal.standard.redirect'); Route::get('/success', 'Webkul\Paypal\Http\Controllers\StandardController@success')->name('paypal.standard.success'); @@ -11,9 +10,9 @@ Route::group(['middleware' => ['web']], function () { }); Route::prefix('paypal/smart-button')->group(function () { - Route::get('/details', 'Webkul\Paypal\Http\Controllers\SmartButtonController@details')->name('paypal.smart_button.details'); + Route::get('/create-order', 'Webkul\Paypal\Http\Controllers\SmartButtonController@createOrder')->name('paypal.smart-button.create-order'); - Route::post('/save-order', 'Webkul\Paypal\Http\Controllers\SmartButtonController@saveOrder')->name('paypal.smart_button.save_order'); + Route::post('/capture-order', 'Webkul\Paypal\Http\Controllers\SmartButtonController@captureOrder')->name('paypal.smart-button.capture-order'); }); }); diff --git a/packages/Webkul/Paypal/src/Resources/views/checkout/onepage/paypal-smart-button.blade.php b/packages/Webkul/Paypal/src/Resources/views/checkout/onepage/paypal-smart-button.blade.php index 79a64bebd..bfdb397d4 100644 --- a/packages/Webkul/Paypal/src/Resources/views/checkout/onepage/paypal-smart-button.blade.php +++ b/packages/Webkul/Paypal/src/Resources/views/checkout/onepage/paypal-smart-button.blade.php @@ -41,7 +41,7 @@ enableStandardCardFields: false, createOrder: function(data, actions) { - return window.axios.get("{{ route('paypal.smart_button.details') }}") + return window.axios.get("{{ route('paypal.smart-button.create-order') }}") .then(function(response) { return response.data.result; }) @@ -54,7 +54,7 @@ onApprove: function(data, actions) { app.showLoader(); - window.axios.post("{{ route('paypal.smart_button.save_order') }}", { + window.axios.post("{{ route('paypal.smart-button.capture-order') }}", { '_token': "{{ csrf_token() }}", 'data' : data }) From 1ef31deeb12f19313a3cb565766ffa820fb06103 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 4 Feb 2021 19:37:42 +0530 Subject: [PATCH 05/29] Some More Key Changed For Understanding --- packages/Webkul/Checkout/src/Cart.php | 2 +- .../Paypal/src/Http/Controllers/SmartButtonController.php | 3 +-- .../views/checkout/onepage/paypal-smart-button.blade.php | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/Webkul/Checkout/src/Cart.php b/packages/Webkul/Checkout/src/Cart.php index ec3db5ad5..2d91f991e 100755 --- a/packages/Webkul/Checkout/src/Cart.php +++ b/packages/Webkul/Checkout/src/Cart.php @@ -898,7 +898,7 @@ class Cart } if ($finalData['payment']['method'] === 'paypal_smart_button') { - $finalData['payment']['additional'] = request()->get('data'); + $finalData['payment']['additional'] = request()->get('orderData'); } return $finalData; diff --git a/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php b/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php index 6d9451a5e..acdeecee8 100755 --- a/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php +++ b/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php @@ -72,8 +72,7 @@ class SmartButtonController extends Controller */ public function captureOrder() { - $orderCreationData = request()->get('data'); - $request = new OrdersCaptureRequest($orderCreationData['orderID']); + $request = new OrdersCaptureRequest(request()->input('orderData.orderID')); $request->prefer('return=representation'); $this->smartButtonClient->execute($request); return $this->saveOrder(); diff --git a/packages/Webkul/Paypal/src/Resources/views/checkout/onepage/paypal-smart-button.blade.php b/packages/Webkul/Paypal/src/Resources/views/checkout/onepage/paypal-smart-button.blade.php index bfdb397d4..207aaf56d 100644 --- a/packages/Webkul/Paypal/src/Resources/views/checkout/onepage/paypal-smart-button.blade.php +++ b/packages/Webkul/Paypal/src/Resources/views/checkout/onepage/paypal-smart-button.blade.php @@ -55,8 +55,8 @@ app.showLoader(); window.axios.post("{{ route('paypal.smart-button.capture-order') }}", { - '_token': "{{ csrf_token() }}", - 'data' : data + _token: "{{ csrf_token() }}", + orderData: data }) .then(function(response) { if (response.data.success) { From 5bbad4dbe289b9391ef7b6ef6c2743b293691e93 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Fri, 5 Feb 2021 12:37:47 +0530 Subject: [PATCH 06/29] Partial Refund Completed --- packages/Webkul/Admin/src/Listeners/Order.php | 21 ++++++++++++------- .../src/Providers/EventServiceProvider.php | 2 +- packages/Webkul/Admin/src/Traits/Mails.php | 2 +- .../src/Repositories/RefundRepository.php | 10 ++------- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/packages/Webkul/Admin/src/Listeners/Order.php b/packages/Webkul/Admin/src/Listeners/Order.php index d20270f09..052e07692 100755 --- a/packages/Webkul/Admin/src/Listeners/Order.php +++ b/packages/Webkul/Admin/src/Listeners/Order.php @@ -10,24 +10,30 @@ class Order { use Mails; - public function refundOrder($data) + public function refundOrder($refund) { - $paymentMethod = $data['order']->payment->method; + $order = $refund->order; - if ($paymentMethod === 'paypal_smart_button') { + if ($order->payment->method === 'paypal_smart_button') { try { - $orderID = $data['order']->payment->additional['orderID']; + $paypalOrderID = $order->payment->additional['orderID']; $smartButton = new SmartButton(); $client = $smartButton->client(); /* get order */ - $orderDetails = $client->execute(new OrdersGetRequest($orderID)); - $captureID = $orderDetails->result->purchase_units[0]->payments->captures[0]->id; + $paypalOrderDetails = $client->execute(new OrdersGetRequest($paypalOrderID)); + $captureID = $paypalOrderDetails->result->purchase_units[0]->payments->captures[0]->id; /* refunding order */ - $response = $smartButton->refundOrder($captureID, "{}"); + $smartButton->refundOrder($captureID, [ + 'amount' => + [ + 'value' => $refund->grand_total, + 'currency_code' => $refund->order_currency_code + ] + ]); } catch (\Exception $e) { /* reporting error */ report($e); @@ -35,6 +41,7 @@ class Order /* now aborting whole process */ abort(500); } + } } } diff --git a/packages/Webkul/Admin/src/Providers/EventServiceProvider.php b/packages/Webkul/Admin/src/Providers/EventServiceProvider.php index 6f78c994c..4f15602af 100755 --- a/packages/Webkul/Admin/src/Providers/EventServiceProvider.php +++ b/packages/Webkul/Admin/src/Providers/EventServiceProvider.php @@ -24,7 +24,7 @@ class EventServiceProvider extends ServiceProvider Event::listen('sales.order.cancel.after', 'Webkul\Admin\Listeners\Order@sendCancelOrderMail'); - Event::listen('sales.refund.save.before', 'Webkul\Admin\Listeners\Order@refundOrder'); + Event::listen('sales.refund.save.after', 'Webkul\Admin\Listeners\Order@refundOrder'); Event::listen('sales.refund.save.after', 'Webkul\Admin\Listeners\Order@sendNewRefundMail'); diff --git a/packages/Webkul/Admin/src/Traits/Mails.php b/packages/Webkul/Admin/src/Traits/Mails.php index 33e142e42..10b56a8a6 100644 --- a/packages/Webkul/Admin/src/Traits/Mails.php +++ b/packages/Webkul/Admin/src/Traits/Mails.php @@ -185,7 +185,7 @@ trait Mails } /** - * Prepare Mail. + * Prepare mail. * * @return void */ diff --git a/packages/Webkul/Sales/src/Repositories/RefundRepository.php b/packages/Webkul/Sales/src/Repositories/RefundRepository.php index d1786b60c..a494590c2 100644 --- a/packages/Webkul/Sales/src/Repositories/RefundRepository.php +++ b/packages/Webkul/Sales/src/Repositories/RefundRepository.php @@ -85,15 +85,9 @@ class RefundRepository extends Repository DB::beginTransaction(); try { - $order = $this->orderRepository->find($data['order_id']); + Event::dispatch('sales.refund.save.before', $data); - /* listener will check for first element */ - Event::dispatch('sales.refund.save.before', [ - [ - 'order' => $order, - 'additional' => $data - ] - ]); + $order = $this->orderRepository->find($data['order_id']); $totalQty = array_sum($data['refund']['items']); From 4d8a6cf0ed02cd5bd52b878f46ccb4d71b8e2c3f Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Fri, 5 Feb 2021 14:44:51 +0530 Subject: [PATCH 07/29] Refactoring Done --- packages/Webkul/Admin/src/Listeners/Order.php | 39 +++---- .../Controllers/SmartButtonController.php | 30 ++--- .../Webkul/Paypal/src/Payment/SmartButton.php | 105 ++++++++++++++---- 3 files changed, 108 insertions(+), 66 deletions(-) diff --git a/packages/Webkul/Admin/src/Listeners/Order.php b/packages/Webkul/Admin/src/Listeners/Order.php index 052e07692..864a4f20e 100755 --- a/packages/Webkul/Admin/src/Listeners/Order.php +++ b/packages/Webkul/Admin/src/Listeners/Order.php @@ -4,7 +4,6 @@ namespace Webkul\Admin\Listeners; use Webkul\Admin\Traits\Mails; use Webkul\Paypal\Payment\SmartButton; -use PayPalCheckoutSdk\Orders\OrdersGetRequest; class Order { @@ -15,33 +14,23 @@ class Order $order = $refund->order; if ($order->payment->method === 'paypal_smart_button') { + /* getting smart button instance */ + $smartButton = new SmartButton; - try { - $paypalOrderID = $order->payment->additional['orderID']; + /* getting paypal oder id */ + $paypalOrderID = $order->payment->additional['orderID']; - $smartButton = new SmartButton(); - $client = $smartButton->client(); - - /* get order */ - $paypalOrderDetails = $client->execute(new OrdersGetRequest($paypalOrderID)); - $captureID = $paypalOrderDetails->result->purchase_units[0]->payments->captures[0]->id; - - /* refunding order */ - $smartButton->refundOrder($captureID, [ - 'amount' => - [ - 'value' => $refund->grand_total, - 'currency_code' => $refund->order_currency_code - ] - ]); - } catch (\Exception $e) { - /* reporting error */ - report($e); - - /* now aborting whole process */ - abort(500); - } + /* getting capture id by paypal order id */ + $captureID = $smartButton->getCaptureId($paypalOrderID); + /* now refunding order on the basis of capture id and refund data */ + $smartButton->refundOrder($captureID, [ + 'amount' => + [ + 'value' => $refund->grand_total, + 'currency_code' => $refund->order_currency_code + ] + ]); } } } diff --git a/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php b/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php index acdeecee8..27056b384 100755 --- a/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php +++ b/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php @@ -6,27 +6,25 @@ use Webkul\Checkout\Facades\Cart; use Webkul\Paypal\Payment\SmartButton; use Webkul\Sales\Repositories\OrderRepository; use Webkul\Sales\Repositories\InvoiceRepository; -use PayPalCheckoutSdk\Orders\OrdersCreateRequest; -use PayPalCheckoutSdk\Orders\OrdersCaptureRequest; class SmartButtonController extends Controller { /** - * SmartButton object + * SmartButton $smartButton * * @var \Webkul\Paypal\Payment\SmartButton */ - protected $smartButtonClient; + protected $smartButton; /** - * OrderRepository object + * OrderRepository $orderRepository * * @var \Webkul\Sales\Repositories\OrderRepository */ protected $orderRepository; /** - * InvoiceRepository object + * InvoiceRepository $invoiceRepository * * @var \Webkul\Sales\Repositories\InvoiceRepository */ @@ -35,21 +33,22 @@ class SmartButtonController extends Controller /** * Create a new controller instance. * + * @param \Webkul\Paypal\Payment\SmartButton $smartButton * @param \Webkul\Attribute\Repositories\OrderRepository $orderRepository * @param \Webkul\Sales\Repositories\InvoiceRepository $invoiceRepository * @return void */ public function __construct( - SmartButton $smartButtonClient, + SmartButton $smartButton, OrderRepository $orderRepository, InvoiceRepository $invoiceRepository ) { + $this->smartButton = $smartButton; + $this->orderRepository = $orderRepository; $this->invoiceRepository = $invoiceRepository; - - $this->smartButtonClient = $smartButtonClient->client(); } /** @@ -57,24 +56,19 @@ class SmartButtonController extends Controller * * @return \Illuminate\Http\JsonResponse */ - public function createOrder(OrdersCreateRequest $request) + public function createOrder() { - $request->prefer('return=representation'); - $request->body = $this->buildRequestBody(); - $response = $this->smartButtonClient->execute($request); - return response()->json($response); + return response()->json($this->smartButton->createOrder($this->buildRequestBody())); } /** - * Capturing order. + * Capturing paypal order after approval. * * @return \Illuminate\Http\Response */ public function captureOrder() { - $request = new OrdersCaptureRequest(request()->input('orderData.orderID')); - $request->prefer('return=representation'); - $this->smartButtonClient->execute($request); + $this->smartButton->captureOrder(request()->input('orderData.orderID')); return $this->saveOrder(); } diff --git a/packages/Webkul/Paypal/src/Payment/SmartButton.php b/packages/Webkul/Paypal/src/Payment/SmartButton.php index 0866e9063..4377b23bf 100644 --- a/packages/Webkul/Paypal/src/Payment/SmartButton.php +++ b/packages/Webkul/Paypal/src/Payment/SmartButton.php @@ -4,7 +4,10 @@ namespace Webkul\Paypal\Payment; use PayPalCheckoutSdk\Core\PayPalHttpClient; use PayPalCheckoutSdk\Core\SandboxEnvironment; +use PayPalCheckoutSdk\Orders\OrdersGetRequest; use PayPalCheckoutSdk\Core\ProductionEnvironment; +use PayPalCheckoutSdk\Orders\OrdersCreateRequest; +use PayPalCheckoutSdk\Orders\OrdersCaptureRequest; use PayPalCheckoutSdk\Payments\CapturesRefundRequest; class SmartButton extends Paypal @@ -38,6 +41,81 @@ class SmartButton extends Paypal $this->initialize(); } + /** + * Returns PayPal HTTP client instance with environment that has access + * credentials context. Use this instance to invoke PayPal APIs, provided the + * credentials have access. + * + * @return PayPalCheckoutSdk\Core\PayPalHttpClient + */ + public function client() + { + return new PayPalHttpClient($this->environment()); + } + + + /** + * Create order for approval of client. + * + * @param array $body + * @return HttpResponse + */ + public function createOrder($body) + { + $request = new OrdersCreateRequest; + $request->prefer('return=representation'); + $request->body = $body; + return $this->client()->execute($request); + } + + /** + * Capture order after approval. + * + * @param string $orderId + * @return HttpResponse + */ + public function captureOrder($orderId) + { + $request = new OrdersCaptureRequest($orderId); + $request->prefer('return=representation'); + $this->client()->execute($request); + } + + /** + * Get order details. + * + * @param string $orderId + * @return HttpResponse + */ + public function getOrder($orderId) + { + return $this->client()->execute(new OrdersGetRequest($orderId)); + } + + /** + * Get capture id. + * + * @param string $orderId + * @return string + */ + public function getCaptureId($orderId) + { + $paypalOrderDetails = $this->getOrder($orderId); + return $paypalOrderDetails->result->purchase_units[0]->payments->captures[0]->id; + } + + /** + * Refund order. + * + * @return HttpResponse + */ + public function refundOrder($captureId, $body = []) + { + $request = new CapturesRefundRequest($captureId); + $request->body = $body; + return $this->client()->execute($request); + } + /** * Return paypal redirect url * @@ -47,32 +125,11 @@ class SmartButton extends Paypal { } - /** - * Returns PayPal HTTP client instance with environment that has access - * credentials context. Use this instance to invoke PayPal APIs, provided the - * credentials have access. - */ - public function client() - { - return new PayPalHttpClient($this->environment()); - } - - /** - * Refund order. - */ - public function refundOrder($captureId, $body = []) - { - /* generating request */ - $request = new CapturesRefundRequest($captureId); - $request->body = $body; - - /* requesting refund */ - return $this->client()->execute($request); - } - /** * Set up and return PayPal PHP SDK environment with PayPal access credentials. * This sample uses SandboxEnvironment. In production, use LiveEnvironment. + * + * @return PayPalCheckoutSdk\Core\SandboxEnvironment|PayPalCheckoutSdk\Core\ProductionEnvironment */ protected function environment() { @@ -87,6 +144,8 @@ class SmartButton extends Paypal /** * Initialize properties. + * + * @return void */ protected function initialize() { From 5bb09dbe9f5cac4940d132d84377cf4dfe63b4ab Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Fri, 5 Feb 2021 15:02:34 +0530 Subject: [PATCH 08/29] Error Handling --- .../src/Http/Controllers/SmartButtonController.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php b/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php index 27056b384..d9cac6d7c 100755 --- a/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php +++ b/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php @@ -58,7 +58,11 @@ class SmartButtonController extends Controller */ public function createOrder() { - return response()->json($this->smartButton->createOrder($this->buildRequestBody())); + try { + return response()->json($this->smartButton->createOrder($this->buildRequestBody())); + } catch (\Exception $e) { + throw $e; + } } /** @@ -68,8 +72,12 @@ class SmartButtonController extends Controller */ public function captureOrder() { - $this->smartButton->captureOrder(request()->input('orderData.orderID')); - return $this->saveOrder(); + try { + $this->smartButton->captureOrder(request()->input('orderData.orderID')); + return $this->saveOrder(); + } catch (\Exception $e) { + throw $e; + } } /** From 363037e72ccd404e62209859d5070460844d47dc Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 10 Feb 2021 14:09:32 +0530 Subject: [PATCH 09/29] Translations Check Added --- .../Webkul/Ui/src/Resources/views/datagrid/table.blade.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php index 02ad124cc..5de56462a 100644 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php +++ b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php @@ -35,7 +35,9 @@ @endforeach From 0ee4cfec08ea362e0f04770b25e59241c3aaba89 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 10 Feb 2021 18:57:50 +0530 Subject: [PATCH 10/29] Fallback Added --- .../Admin/src/Resources/views/configuration/index.blade.php | 2 +- .../marketing/email-marketing/campaigns/create.blade.php | 4 ++-- .../views/marketing/email-marketing/campaigns/edit.blade.php | 4 ++-- .../Webkul/Ui/src/Resources/views/datagrid/table.blade.php | 2 -- .../src/Resources/views/admin/meta-info/meta-data.blade.php | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php b/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php index 0e7068d94..debdb5bb9 100755 --- a/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php @@ -23,7 +23,7 @@ @foreach (core()->getAllChannels() as $channelModel) @endforeach diff --git a/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/create.blade.php b/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/create.blade.php index 98963a669..e0fdca41f 100755 --- a/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/create.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/create.blade.php @@ -93,7 +93,7 @@ @@ -114,7 +114,7 @@ - + {!! view_render_event('bagisto.admin.marketing.templates.create.after') !!} diff --git a/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/edit.blade.php index 662597560..ad1181359 100755 --- a/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/edit.blade.php @@ -97,7 +97,7 @@ @@ -119,7 +119,7 @@ - + {!! view_render_event('bagisto.admin.marketing.templates.create.after') !!} diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php index 5de56462a..a9732fc37 100644 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php +++ b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php @@ -35,8 +35,6 @@ @endforeach diff --git a/packages/Webkul/Velocity/src/Resources/views/admin/meta-info/meta-data.blade.php b/packages/Webkul/Velocity/src/Resources/views/admin/meta-info/meta-data.blade.php index 63c953a22..057395806 100644 --- a/packages/Webkul/Velocity/src/Resources/views/admin/meta-info/meta-data.blade.php +++ b/packages/Webkul/Velocity/src/Resources/views/admin/meta-info/meta-data.blade.php @@ -38,7 +38,7 @@ @endforeach From 7a2e43a2da94d2de27b3032aa484d6cc35b7b476 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 10 Feb 2021 19:08:10 +0530 Subject: [PATCH 11/29] Case Checked With Request Only Rather Then Fallback --- packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php index a9732fc37..968d75785 100644 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php +++ b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php @@ -34,7 +34,7 @@ @foreach ($results['extraFilters']['channels'] as $channelModel) @endforeach From a9b803c7f38c99616b7d23651c528c4538b5a158 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 11 Feb 2021 14:09:25 +0530 Subject: [PATCH 12/29] Reverted One File --- packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php index 968d75785..a9732fc37 100644 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php +++ b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php @@ -34,7 +34,7 @@ @foreach ($results['extraFilters']['channels'] as $channelModel) @endforeach From 8979bad28306ef40db2a9a6210d3b9764b61eeec Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 11 Feb 2021 14:40:34 +0530 Subject: [PATCH 13/29] Fixed -> When you filter admin locale (add new locale and filter from top right corner) and go to product grid https://prnt.sc/z239b3 --- .../Resources/views/datagrid/table.blade.php | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php index a9732fc37..ebe667fd6 100644 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php +++ b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php @@ -1,12 +1,21 @@ @php + /* all locales */ + $locales = core()->getAllLocales(); + + /* request and fallback handling */ $locale = request()->get('locale') ?: app()->getLocale(); $channel = request()->get('channel') ?: (core()->getCurrentChannelCode() ?: core()->getDefaultChannelCode()); $customer_group = request()->get('customer_group'); - if ($channel == 'all') { - $locales = core()->getAllLocales(); - } else { - $locales = app('Webkul\Core\Repositories\ChannelRepository')->findOneByField('code', $channel)->locales; + /* handling cases for new locale if not present in current channel */ + if ($channel !== 'all') { + $channelLocales = app('Webkul\Core\Repositories\ChannelRepository')->findOneByField('code', $channel)->locales; + + if ($channelLocales->contains('code', $locale)) { + $locales = $channelLocales; + } else { + $channel = 'all'; + } } @endphp From 2efb321b1cd42211decd318ab7e5f178e00f10ac Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 11 Feb 2021 14:47:52 +0530 Subject: [PATCH 14/29] Completed: No filteration should be done in channel grid when admin filter new locale https://prnt.sc/z23l9a --- packages/Webkul/Admin/src/DataGrids/ChannelDataGrid.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/Webkul/Admin/src/DataGrids/ChannelDataGrid.php b/packages/Webkul/Admin/src/DataGrids/ChannelDataGrid.php index d757e24ed..f9ec6da21 100755 --- a/packages/Webkul/Admin/src/DataGrids/ChannelDataGrid.php +++ b/packages/Webkul/Admin/src/DataGrids/ChannelDataGrid.php @@ -49,9 +49,11 @@ class ChannelDataGrid extends DataGrid public function prepareQueryBuilder() { $queryBuilder = $this->channelRepository->query() - ->leftJoin('channel_translations', 'channel_translations.channel_id', '=', 'channels.id') - ->addSelect('channels.id', 'channels.code', 'channel_translations.locale', 'channel_translations.name as translated_name', 'channels.hostname') - ->where('channel_translations.locale', '=', $this->locale); + ->leftJoin('channel_translations', function($leftJoin) { + $leftJoin->on('channel_translations.channel_id', '=', 'channels.id') + ->where('channel_translations.locale', $this->locale); + }) + ->addSelect('channels.id', 'channels.code', 'channel_translations.locale', 'channel_translations.name as translated_name', 'channels.hostname'); $this->addFilter('id', 'channels.id'); $this->addFilter('code', 'channels.code'); From 68ab2d8779843d7b30b810685d7af9cd4ace1b94 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 11 Feb 2021 14:55:41 +0530 Subject: [PATCH 15/29] Completed: Channel multiselect option also gets blank https://prnt.sc/z2f9ek --- .../views/catalog/products/accordians/channels.blade.php | 2 +- .../Webkul/Admin/src/Resources/views/cms/create.blade.php | 2 +- packages/Webkul/Admin/src/Resources/views/cms/edit.blade.php | 2 +- .../views/marketing/promotions/cart-rules/create.blade.php | 2 +- .../views/marketing/promotions/cart-rules/edit.blade.php | 4 ++-- .../views/marketing/promotions/catalog-rules/create.blade.php | 2 +- .../views/marketing/promotions/catalog-rules/edit.blade.php | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/channels.blade.php b/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/channels.blade.php index 860997bac..83e3886e1 100644 --- a/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/channels.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/channels.blade.php @@ -14,7 +14,7 @@ diff --git a/packages/Webkul/Admin/src/Resources/views/cms/create.blade.php b/packages/Webkul/Admin/src/Resources/views/cms/create.blade.php index e13bdf235..46836b111 100644 --- a/packages/Webkul/Admin/src/Resources/views/cms/create.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/cms/create.blade.php @@ -48,7 +48,7 @@ diff --git a/packages/Webkul/Admin/src/Resources/views/cms/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/cms/edit.blade.php index b26eaf331..42a933ac4 100644 --- a/packages/Webkul/Admin/src/Resources/views/cms/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/cms/edit.blade.php @@ -66,7 +66,7 @@ diff --git a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/create.blade.php b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/create.blade.php index e3466e33b..794ec0b5b 100644 --- a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/create.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/create.blade.php @@ -71,7 +71,7 @@ @foreach(core()->getAllChannels() as $channel) @endforeach diff --git a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/edit.blade.php index 39bc4a2b4..1e4336d12 100644 --- a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/edit.blade.php @@ -78,7 +78,7 @@ @foreach(core()->getAllChannels() as $channel) @endforeach @@ -783,7 +783,7 @@ }, showModal(id) { - this.$root.$set(this.$root.modalIds, id, true); + this.$root.$set(this.$root.modalIds, id, true); }, } }); diff --git a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/create.blade.php b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/create.blade.php index 167dec0ab..2dd17dcaf 100644 --- a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/create.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/create.blade.php @@ -71,7 +71,7 @@ @foreach(core()->getAllChannels() as $channel) @endforeach diff --git a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/edit.blade.php index ceb1ab15c..99878bcb3 100644 --- a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/edit.blade.php @@ -73,7 +73,7 @@ @foreach(core()->getAllChannels() as $channel) @endforeach From f4ef06af6e922b37dca0add9227a47c6f4318bcc Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 11 Feb 2021 16:43:47 +0530 Subject: [PATCH 16/29] Checked For The Requested Locale In Channel --- .../products/accordians/channels.blade.php | 2 +- .../views/catalog/products/edit.blade.php | 16 +++++++++---- .../src/Resources/views/cms/create.blade.php | 2 +- .../src/Resources/views/cms/edit.blade.php | 2 +- .../views/configuration/index.blade.php | 2 +- .../campaigns/create.blade.php | 2 +- .../email-marketing/campaigns/edit.blade.php | 2 +- .../promotions/cart-rules/create.blade.php | 2 +- .../promotions/cart-rules/edit.blade.php | 2 +- .../promotions/catalog-rules/create.blade.php | 2 +- .../promotions/catalog-rules/edit.blade.php | 2 +- .../Resources/views/datagrid/table.blade.php | 2 +- .../views/admin/meta-info/meta-data.blade.php | 24 ++++++++++++------- 13 files changed, 38 insertions(+), 24 deletions(-) diff --git a/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/channels.blade.php b/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/channels.blade.php index 83e3886e1..a69ca918a 100644 --- a/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/channels.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/channels.blade.php @@ -14,7 +14,7 @@ diff --git a/packages/Webkul/Admin/src/Resources/views/catalog/products/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/catalog/products/edit.blade.php index df4959da4..0f83bdec6 100755 --- a/packages/Webkul/Admin/src/Resources/views/catalog/products/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/catalog/products/edit.blade.php @@ -6,8 +6,16 @@ @section('content')
- get('locale') ?: app()->getLocale(); ?> - get('channel') ?: core()->getDefaultChannelCode(); ?> + @php + $locale = request()->get('locale') ?: app()->getLocale(); + $channel = request()->get('channel') ?: core()->getDefaultChannelCode(); + + $channelLocales = app('Webkul\Core\Repositories\ChannelRepository')->findOneByField('code', $channel)->locales; + + if (! $channelLocales->contains('code', $locale)) { + $locale = config('app.fallback_locale'); + } + @endphp {!! view_render_event('bagisto.admin.catalog.product.edit.before', ['product' => $product]) !!} @@ -29,7 +37,7 @@ @endforeach @@ -38,7 +46,7 @@
@foreach($channels->all() as $channel) - + @endforeach diff --git a/packages/Webkul/Admin/src/Resources/views/cms/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/cms/edit.blade.php index 42a933ac4..896340b8c 100644 --- a/packages/Webkul/Admin/src/Resources/views/cms/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/cms/edit.blade.php @@ -66,7 +66,7 @@ diff --git a/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php b/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php index debdb5bb9..c4d96e6cd 100755 --- a/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php @@ -23,7 +23,7 @@ @foreach (core()->getAllChannels() as $channelModel) @endforeach diff --git a/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/create.blade.php b/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/create.blade.php index e0fdca41f..4863b2791 100755 --- a/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/create.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/create.blade.php @@ -93,7 +93,7 @@ diff --git a/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/edit.blade.php index ad1181359..535e43c33 100755 --- a/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/marketing/email-marketing/campaigns/edit.blade.php @@ -97,7 +97,7 @@ diff --git a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/create.blade.php b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/create.blade.php index 794ec0b5b..05a1bedb1 100644 --- a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/create.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/create.blade.php @@ -71,7 +71,7 @@ @foreach(core()->getAllChannels() as $channel) @endforeach diff --git a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/edit.blade.php index 1e4336d12..2156dea11 100644 --- a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/cart-rules/edit.blade.php @@ -78,7 +78,7 @@ @foreach(core()->getAllChannels() as $channel) @endforeach diff --git a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/create.blade.php b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/create.blade.php index 2dd17dcaf..7b71144cd 100644 --- a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/create.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/create.blade.php @@ -71,7 +71,7 @@ @foreach(core()->getAllChannels() as $channel) @endforeach diff --git a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/edit.blade.php index 99878bcb3..bbd0ad967 100644 --- a/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/marketing/promotions/catalog-rules/edit.blade.php @@ -73,7 +73,7 @@ @foreach(core()->getAllChannels() as $channel) @endforeach diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php index ebe667fd6..df5648d03 100644 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php +++ b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php @@ -44,7 +44,7 @@ @endforeach diff --git a/packages/Webkul/Velocity/src/Resources/views/admin/meta-info/meta-data.blade.php b/packages/Webkul/Velocity/src/Resources/views/admin/meta-info/meta-data.blade.php index 057395806..3bf56a538 100644 --- a/packages/Webkul/Velocity/src/Resources/views/admin/meta-info/meta-data.blade.php +++ b/packages/Webkul/Velocity/src/Resources/views/admin/meta-info/meta-data.blade.php @@ -6,7 +6,13 @@ @php $locale = request()->get('locale') ?: app()->getLocale(); - $channel = request()->get('channel') ?: core()->getCurrentChannelCode(); + $channel = request()->get('channel') ?: core()->getDefaultChannelCode(); + + $channelLocales = app('Webkul\Core\Repositories\ChannelRepository')->findOneByField('code', $channel)->locales; + + if (! $channelLocales->contains('code', $locale)) { + $locale = config('app.fallback_locale'); + } @endphp @section('content') @@ -38,7 +44,7 @@ @endforeach @@ -47,7 +53,7 @@
",m.noCloneChecked=!!he.cloneNode(!0).lastChild.defaultValue,he.innerHTML="",m.option=!!he.lastChild;var ye={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function be(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&O(e,t)?T.merge([e],n):n}function we(e,t){for(var n=0,r=e.length;n",""]);var xe=/<|&#?\w+;/;function _e(e,t,n,r,i){for(var o,a,s,u,l,c,d=t.createDocumentFragment(),f=[],h=0,p=e.length;h-1)i&&i.push(o);else if(l=ae(o),a=be(d.appendChild(o),"script"),l&&we(a),n)for(c=0;o=a[c++];)ge.test(o.type||"")&&n.push(o);return d}var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ke=/^([^.]*)(?:\.(.+)|)/;function Se(){return!0}function Ae(){return!1}function ze(e,t){return e===function(){try{return b.activeElement}catch(e){}}()==("focus"===t)}function Oe(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Oe(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ae;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return T().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=T.guid++)),e.each((function(){T.event.add(this,t,i,r,n)}))}function Ee(e,t,n){n?(K.set(e,t,!1),T.event.add(e,t,{namespace:!1,handler:function(e){var r,i,o=K.get(this,t);if(1&e.isTrigger&&this[t]){if(o.length)(T.event.special[t]||{}).delegateType&&e.stopPropagation();else if(o=s.call(arguments),K.set(this,t,o),r=n(this,t),this[t](),o!==(i=K.get(this,t))||r?K.set(this,t,!1):i={},o!==i)return e.stopImmediatePropagation(),e.preventDefault(),i.value}else o.length&&(K.set(this,t,{value:T.event.trigger(T.extend(o[0],T.Event.prototype),o.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===K.get(e,t)&&T.event.add(e,t,Se)}T.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,d,f,h,p,v,m=K.get(e);if(X(e))for(n.handler&&(n=(o=n).handler,i=o.selector),i&&T.find.matchesSelector(oe,i),n.guid||(n.guid=T.guid++),(u=m.events)||(u=m.events=Object.create(null)),(a=m.handle)||(a=m.handle=function(t){return void 0!==T&&T.event.triggered!==t.type?T.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(I)||[""]).length;l--;)h=v=(s=ke.exec(t[l])||[])[1],p=(s[2]||"").split(".").sort(),h&&(d=T.event.special[h]||{},h=(i?d.delegateType:d.bindType)||h,d=T.event.special[h]||{},c=T.extend({type:h,origType:v,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&T.expr.match.needsContext.test(i),namespace:p.join(".")},o),(f=u[h])||((f=u[h]=[]).delegateCount=0,d.setup&&!1!==d.setup.call(e,r,p,a)||e.addEventListener&&e.addEventListener(h,a)),d.add&&(d.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?f.splice(f.delegateCount++,0,c):f.push(c),T.event.global[h]=!0)},remove:function(e,t,n,r,i){var o,a,s,u,l,c,d,f,h,p,v,m=K.hasData(e)&&K.get(e);if(m&&(u=m.events)){for(l=(t=(t||"").match(I)||[""]).length;l--;)if(h=v=(s=ke.exec(t[l])||[])[1],p=(s[2]||"").split(".").sort(),h){for(d=T.event.special[h]||{},f=u[h=(r?d.delegateType:d.bindType)||h]||[],s=s[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=f.length;o--;)c=f[o],!i&&v!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,d.remove&&d.remove.call(e,c));a&&!f.length&&(d.teardown&&!1!==d.teardown.call(e,p,m.handle)||T.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)T.event.remove(e,h+t[l],n,r,!0);T.isEmptyObject(u)&&K.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=T.event.fix(e),l=(K.get(this,"events")||Object.create(null))[u.type]||[],c=T.event.special[u.type]||{};for(s[0]=u,t=1;t=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:T.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\s*$/g;function Ne(e,t){return O(e,"table")&&O(11!==t.nodeType?t:t.firstChild,"tr")&&T(e).children("tbody")[0]||e}function je(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Pe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Ie(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(K.hasData(e)&&(s=K.get(e).events))for(i in K.remove(t,"handle events"),s)for(n=0,r=s[i].length;n1&&"string"==typeof p&&!m.checkClone&&De.test(p))return e.each((function(i){var o=e.eq(i);v&&(t[0]=p.call(this,i,o.html())),Re(o,t,n,r)}));if(f&&(o=(i=_e(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(a=T.map(be(i,"script"),je)).length;d0&&we(a,!u&&be(e,"script")),s},cleanData:function(e){for(var t,n,r,i=T.event.special,o=0;void 0!==(n=e[o]);o++)if(X(n)){if(t=n[K.expando]){if(t.events)for(r in t.events)i[r]?T.event.remove(n,r):T.removeEvent(n,r,t.handle);n[K.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),T.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return B(this,(function(e){return void 0===e?T.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return Re(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ne(this,e).appendChild(e)}))},prepend:function(){return Re(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Ne(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return Re(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return Re(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(T.cleanData(be(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return T.clone(this,e,t)}))},html:function(e){return B(this,(function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!$e.test(e)&&!ye[(me.exec(e)||["",""])[1].toLowerCase()]){e=T.htmlPrefilter(e);try{for(;n3,oe.removeChild(e)),s}}))}();var Ze=["Webkit","Moz","ms"],Ye=b.createElement("div").style,Xe={};function Ge(e){var t=T.cssProps[e]||Xe[e];return t||(e in Ye?e:Xe[e]=function(e){for(var t=e[0].toUpperCase()+e.slice(1),n=Ze.length;n--;)if((e=Ze[n]+t)in Ye)return e}(e)||e)}var Ke=/^(none|table(?!-c[ea]).+)/,Qe=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},et={letterSpacing:"0",fontWeight:"400"};function tt(e,t,n){var r=re.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function nt(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=T.css(e,n+ie[a],!0,i)),r?("content"===n&&(u-=T.css(e,"padding"+ie[a],!0,i)),"margin"!==n&&(u-=T.css(e,"border"+ie[a]+"Width",!0,i))):(u+=T.css(e,"padding"+ie[a],!0,i),"padding"!==n?u+=T.css(e,"border"+ie[a]+"Width",!0,i):s+=T.css(e,"border"+ie[a]+"Width",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function rt(e,t,n){var r=Fe(e),i=(!m.boxSizingReliable()||n)&&"border-box"===T.css(e,"boxSizing",!1,r),o=i,a=Ue(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(He.test(a)){if(!n)return a;a="auto"}return(!m.boxSizingReliable()&&i||!m.reliableTrDimensions()&&O(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===T.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===T.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+nt(e,t,n||(i?"border":"content"),o,r,a)+"px"}function it(e,t,n,r,i){return new it.prototype.init(e,t,n,r,i)}T.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ue(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=Y(t),u=Qe.test(t),l=e.style;if(u||(t=Ge(s)),a=T.cssHooks[t]||T.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=re.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(T.cssNumber[s]?"":"px")),m.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=Y(t);return Qe.test(t)||(t=Ge(s)),(a=T.cssHooks[t]||T.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Ue(e,t,r)),"normal"===i&&t in et&&(i=et[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),T.each(["height","width"],(function(e,t){T.cssHooks[t]={get:function(e,n,r){if(n)return!Ke.test(T.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?rt(e,t,r):qe(e,Je,(function(){return rt(e,t,r)}))},set:function(e,n,r){var i,o=Fe(e),a=!m.scrollboxSize()&&"absolute"===o.position,s=(a||r)&&"border-box"===T.css(e,"boxSizing",!1,o),u=r?nt(e,t,r,s,o):0;return s&&a&&(u-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-nt(e,t,"border",!1,o)-.5)),u&&(i=re.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=T.css(e,t)),tt(0,n,u)}}})),T.cssHooks.marginLeft=Ve(m.reliableMarginLeft,(function(e,t){if(t)return(parseFloat(Ue(e,"marginLeft"))||e.getBoundingClientRect().left-qe(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),T.each({margin:"",padding:"",border:"Width"},(function(e,t){T.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+ie[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(T.cssHooks[e+t].set=tt)})),T.fn.extend({css:function(e,t){return B(this,(function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Fe(e),i=t.length;a1)}}),T.Tween=it,it.prototype={constructor:it,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||T.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(T.cssNumber[n]?"":"px")},cur:function(){var e=it.propHooks[this.prop];return e&&e.get?e.get(this):it.propHooks._default.get(this)},run:function(e){var t,n=it.propHooks[this.prop];return this.options.duration?this.pos=t=T.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):it.propHooks._default.set(this),this}},it.prototype.init.prototype=it.prototype,it.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=T.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){T.fx.step[e.prop]?T.fx.step[e.prop](e):1!==e.elem.nodeType||!T.cssHooks[e.prop]&&null==e.elem.style[Ge(e.prop)]?e.elem[e.prop]=e.now:T.style(e.elem,e.prop,e.now+e.unit)}}},it.propHooks.scrollTop=it.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},T.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},T.fx=it.prototype.init,T.fx.step={};var ot,at,st=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function lt(){at&&(!1===b.hidden&&n.requestAnimationFrame?n.requestAnimationFrame(lt):n.setTimeout(lt,T.fx.interval),T.fx.tick())}function ct(){return n.setTimeout((function(){ot=void 0})),ot=Date.now()}function dt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ie[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ft(e,t,n){for(var r,i=(ht.tweeners[t]||[]).concat(ht.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each((function(){T.removeAttr(this,e)}))}}),T.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?T.prop(e,t,n):(1===o&&T.isXMLDoc(e)||(i=T.attrHooks[t.toLowerCase()]||(T.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void T.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=T.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!m.radioValue&&"radio"===t&&O(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(I);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?T.removeAttr(e,n):e.setAttribute(n,n),n}},T.each(T.expr.match.bool.source.match(/\w+/g),(function(e,t){var n=vt[t]||T.find.attr;vt[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=vt[a],vt[a]=i,i=null!=n(e,t,r)?a:null,vt[a]=o),i}}));var mt=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function yt(e){return(e.match(I)||[]).join(" ")}function bt(e){return e.getAttribute&&e.getAttribute("class")||""}function wt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(I)||[]}T.fn.extend({prop:function(e,t){return B(this,T.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[T.propFix[e]||e]}))}}),T.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&T.isXMLDoc(e)||(t=T.propFix[t]||t,i=T.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=T.find.attr(e,"tabindex");return t?parseInt(t,10):mt.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(T.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),T.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){T.propFix[this.toLowerCase()]=this})),T.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each((function(t){T(this).addClass(e.call(this,t,bt(this)))}));if((t=wt(e)).length)for(;n=this[u++];)if(i=bt(n),r=1===n.nodeType&&" "+yt(i)+" "){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=yt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each((function(t){T(this).removeClass(e.call(this,t,bt(this)))}));if(!arguments.length)return this.attr("class","");if((t=wt(e)).length)for(;n=this[u++];)if(i=bt(n),r=1===n.nodeType&&" "+yt(i)+" "){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");i!==(s=yt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each((function(n){T(this).toggleClass(e.call(this,n,bt(this),t),t)})):this.each((function(){var t,i,o,a;if(r)for(i=0,o=T(this),a=wt(e);t=a[i++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||((t=bt(this))&&K.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":K.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+yt(bt(n))+" ").indexOf(t)>-1)return!0;return!1}});var xt=/\r/g;T.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=g(e),this.each((function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,T(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=T.map(i,(function(e){return null==e?"":e+""}))),(t=T.valHooks[this.type]||T.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))}))):i?(t=T.valHooks[i.type]||T.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(xt,""):null==n?"":n:void 0}}),T.extend({valHooks:{option:{get:function(e){var t=T.find.attr(e,"value");return null!=t?t:yt(T.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),T.each(["radio","checkbox"],(function(){T.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=T.inArray(T(e).val(),t)>-1}},m.checkOn||(T.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})})),m.focusin="onfocusin"in n;var _t=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};T.extend(T.event,{trigger:function(e,t,r,i){var o,a,s,u,l,c,d,f,p=[r||b],v=h.call(e,"type")?e.type:e,m=h.call(e,"namespace")?e.namespace.split("."):[];if(a=f=s=r=r||b,3!==r.nodeType&&8!==r.nodeType&&!_t.test(v+T.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),l=v.indexOf(":")<0&&"on"+v,(e=e[T.expando]?e:new T.Event(v,"object"==typeof e&&e)).isTrigger=i?2:3,e.namespace=m.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=r),t=null==t?[e]:T.makeArray(t,[e]),d=T.event.special[v]||{},i||!d.trigger||!1!==d.trigger.apply(r,t))){if(!i&&!d.noBubble&&!y(r)){for(u=d.delegateType||v,_t.test(u+v)||(a=a.parentNode);a;a=a.parentNode)p.push(a),s=a;s===(r.ownerDocument||b)&&p.push(s.defaultView||s.parentWindow||n)}for(o=0;(a=p[o++])&&!e.isPropagationStopped();)f=a,e.type=o>1?u:d.bindType||v,(c=(K.get(a,"events")||Object.create(null))[e.type]&&K.get(a,"handle"))&&c.apply(a,t),(c=l&&a[l])&&c.apply&&X(a)&&(e.result=c.apply(a,t),!1===e.result&&e.preventDefault());return e.type=v,i||e.isDefaultPrevented()||d._default&&!1!==d._default.apply(p.pop(),t)||!X(r)||l&&g(r[v])&&!y(r)&&((s=r[l])&&(r[l]=null),T.event.triggered=v,e.isPropagationStopped()&&f.addEventListener(v,Tt),r[v](),e.isPropagationStopped()&&f.removeEventListener(v,Tt),T.event.triggered=void 0,s&&(r[l]=s)),e.result}},simulate:function(e,t,n){var r=T.extend(new T.Event,n,{type:e,isSimulated:!0});T.event.trigger(r,null,t)}}),T.fn.extend({trigger:function(e,t){return this.each((function(){T.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var n=this[0];if(n)return T.event.trigger(e,t,n,!0)}}),m.focusin||T.each({focus:"focusin",blur:"focusout"},(function(e,t){var n=function(e){T.event.simulate(t,e.target,T.event.fix(e))};T.event.special[t]={setup:function(){var r=this.ownerDocument||this.document||this,i=K.access(r,t);i||r.addEventListener(e,n,!0),K.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this.document||this,i=K.access(r,t)-1;i?K.access(r,t,i):(r.removeEventListener(e,n,!0),K.remove(r,t))}}}));var Ct=n.location,kt={guid:Date.now()},St=/\?/;T.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new n.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||T.error("Invalid XML: "+e),t};var At=/\[\]$/,zt=/\r?\n/g,Ot=/^(?:submit|button|image|reset|file)$/i,Et=/^(?:input|select|textarea|keygen)/i;function $t(e,t,n,r){var i;if(Array.isArray(t))T.each(t,(function(t,i){n||At.test(e)?r(e,i):$t(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)}));else if(n||"object"!==_(t))r(e,t);else for(i in t)$t(e+"["+i+"]",t[i],n,r)}T.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!T.isPlainObject(e))T.each(e,(function(){i(this.name,this.value)}));else for(n in e)$t(n,e[n],t,i);return r.join("&")},T.fn.extend({serialize:function(){return T.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=T.prop(this,"elements");return e?T.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!T(this).is(":disabled")&&Et.test(this.nodeName)&&!Ot.test(e)&&(this.checked||!ve.test(e))})).map((function(e,t){var n=T(this).val();return null==n?null:Array.isArray(n)?T.map(n,(function(e){return{name:t.name,value:e.replace(zt,"\r\n")}})):{name:t.name,value:n.replace(zt,"\r\n")}})).get()}});var Dt=/%20/g,Lt=/#.*$/,Nt=/([?&])_=[^&]*/,jt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:GET|HEAD)$/,It=/^\/\//,Mt={},Rt={},Wt="*/".concat("*"),Ht=b.createElement("a");function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(I)||[];if(g(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qt(e,t,n,r){var i={},o=e===Rt;function a(s){var u;return i[s]=!0,T.each(e[s]||[],(function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)})),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function Bt(e,t){var n,r,i=T.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&T.extend(!0,e,r),e}Ht.href=Ct.href,T.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Wt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":T.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Bt(Bt(e,T.ajaxSettings),t):Bt(T.ajaxSettings,e)},ajaxPrefilter:Ft(Mt),ajaxTransport:Ft(Rt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var r,i,o,a,s,u,l,c,d,f,h=T.ajaxSetup({},t),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?T(p):T.event,m=T.Deferred(),g=T.Callbacks("once memory"),y=h.statusCode||{},w={},x={},_="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=jt.exec(o);)a[t[1].toLowerCase()+" "]=(a[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=a[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return l?o:null},setRequestHeader:function(e,t){return null==l&&(e=x[e.toLowerCase()]=x[e.toLowerCase()]||e,w[e]=t),this},overrideMimeType:function(e){return null==l&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)y[t]=[y[t],e[t]];return this},abort:function(e){var t=e||_;return r&&r.abort(t),k(0,t),this}};if(m.promise(C),h.url=((e||h.url||Ct.href)+"").replace(It,Ct.protocol+"//"),h.type=t.method||t.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(I)||[""],null==h.crossDomain){u=b.createElement("a");try{u.href=h.url,u.href=u.href,h.crossDomain=Ht.protocol+"//"+Ht.host!=u.protocol+"//"+u.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=T.param(h.data,h.traditional)),qt(Mt,h,t,C),l)return C;for(d in(c=T.event&&h.global)&&0==T.active++&&T.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Pt.test(h.type),i=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Dt,"+")):(f=h.url.slice(i.length),h.data&&(h.processData||"string"==typeof h.data)&&(i+=(St.test(i)?"&":"?")+h.data,delete h.data),!1===h.cache&&(i=i.replace(Nt,"$1"),f=(St.test(i)?"&":"?")+"_="+kt.guid+++f),h.url=i+f),h.ifModified&&(T.lastModified[i]&&C.setRequestHeader("If-Modified-Since",T.lastModified[i]),T.etag[i]&&C.setRequestHeader("If-None-Match",T.etag[i])),(h.data&&h.hasContent&&!1!==h.contentType||t.contentType)&&C.setRequestHeader("Content-Type",h.contentType),C.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Wt+"; q=0.01":""):h.accepts["*"]),h.headers)C.setRequestHeader(d,h.headers[d]);if(h.beforeSend&&(!1===h.beforeSend.call(p,C,h)||l))return C.abort();if(_="abort",g.add(h.complete),C.done(h.success),C.fail(h.error),r=qt(Rt,h,t,C)){if(C.readyState=1,c&&v.trigger("ajaxSend",[C,h]),l)return C;h.async&&h.timeout>0&&(s=n.setTimeout((function(){C.abort("timeout")}),h.timeout));try{l=!1,r.send(w,k)}catch(e){if(l)throw e;k(-1,e)}}else k(-1,"No Transport");function k(e,t,a,u){var d,f,b,w,x,_=t;l||(l=!0,s&&n.clearTimeout(s),r=void 0,o=u||"",C.readyState=e>0?4:0,d=e>=200&&e<300||304===e,a&&(w=function(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(h,C,a)),!d&&T.inArray("script",h.dataTypes)>-1&&(h.converters["text script"]=function(){}),w=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(h,w,C,d),d?(h.ifModified&&((x=C.getResponseHeader("Last-Modified"))&&(T.lastModified[i]=x),(x=C.getResponseHeader("etag"))&&(T.etag[i]=x)),204===e||"HEAD"===h.type?_="nocontent":304===e?_="notmodified":(_=w.state,f=w.data,d=!(b=w.error))):(b=_,!e&&_||(_="error",e<0&&(e=0))),C.status=e,C.statusText=(t||_)+"",d?m.resolveWith(p,[f,_,C]):m.rejectWith(p,[C,_,b]),C.statusCode(y),y=void 0,c&&v.trigger(d?"ajaxSuccess":"ajaxError",[C,h,d?f:b]),g.fireWith(p,[C,_]),c&&(v.trigger("ajaxComplete",[C,h]),--T.active||T.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return T.get(e,t,n,"json")},getScript:function(e,t){return T.get(e,void 0,t,"script")}}),T.each(["get","post"],(function(e,t){T[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),T.ajax(T.extend({url:e,type:t,dataType:i,data:n,success:r},T.isPlainObject(e)&&e))}})),T.ajaxPrefilter((function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")})),T._evalUrl=function(e,t,n){return T.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){T.globalEval(e,t,n)}})},T.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=T(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return g(e)?this.each((function(t){T(this).wrapInner(e.call(this,t))})):this.each((function(){var t=T(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)}))},wrap:function(e){var t=g(e);return this.each((function(n){T(this).wrapAll(t?e.call(this,n):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){T(this).replaceWith(this.childNodes)})),this}}),T.expr.pseudos.hidden=function(e){return!T.expr.pseudos.visible(e)},T.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},T.ajaxSettings.xhr=function(){try{return new n.XMLHttpRequest}catch(e){}};var Ut={0:200,1223:204},Vt=T.ajaxSettings.xhr();m.cors=!!Vt&&"withCredentials"in Vt,m.ajax=Vt=!!Vt,T.ajaxTransport((function(e){var t,r;if(m.cors||Vt&&!e.crossDomain)return{send:function(i,o){var a,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(a in e.xhrFields)s[a]=e.xhrFields[a];for(a in e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest"),i)s.setRequestHeader(a,i[a]);t=function(e){return function(){t&&(t=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Ut[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=t(),r=s.onerror=s.ontimeout=t("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&n.setTimeout((function(){t&&r()}))},t=t("abort");try{s.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}})),T.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),T.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return T.globalEval(e),e}}}),T.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),T.ajaxTransport("script",(function(e){var t,n;if(e.crossDomain||e.scriptAttrs)return{send:function(r,i){t=T("