new logic of adding posts - add user's balance
This commit is contained in:
parent
76b1b65a57
commit
b1de3a66ae
|
|
@ -34,12 +34,6 @@ class OfferForm extends ComponentBase
|
|||
*/
|
||||
public $countries;
|
||||
|
||||
const REGISTRATION_URI = 'register.do';
|
||||
|
||||
const STATUS_URI = 'getOrderStatus.do';
|
||||
|
||||
const API_URL = 'https://mpi.gov.tm/payment/rest/';
|
||||
|
||||
public function componentDetails() {
|
||||
return [
|
||||
'name' => 'Offer Form',
|
||||
|
|
@ -47,36 +41,7 @@ class OfferForm extends ComponentBase
|
|||
];
|
||||
}
|
||||
|
||||
public function onInput() {
|
||||
$query = Input::get('query');
|
||||
$locale = Session::get('rainlab.translate.locale');
|
||||
|
||||
if($query != '') {
|
||||
if($locale == 'tm') {
|
||||
// user enters product name
|
||||
$products = Product
|
||||
::where('name', 'like', "%${query}%")
|
||||
->where('status','approved')
|
||||
->get()->toArray();
|
||||
} else {
|
||||
$queryString = $query;
|
||||
|
||||
// user enters product name on ru, en
|
||||
$products = Product::whereHas('translations', function ($query) use ($locale,$queryString) {
|
||||
$query->where('locale', $locale)->where('attribute_data', 'like', "%${queryString}%");
|
||||
})->where('status','approved')->get()->toArray();
|
||||
}
|
||||
} else {
|
||||
$products = [];
|
||||
}
|
||||
|
||||
$this->page['products'] = $products;
|
||||
|
||||
return [
|
||||
'#suggestions' => $this->renderPartial('@suggestions')
|
||||
];
|
||||
}
|
||||
|
||||
// step1
|
||||
public function onSave() {
|
||||
$data = post();
|
||||
|
||||
|
|
@ -92,22 +57,22 @@ class OfferForm extends ComponentBase
|
|||
|
||||
$this->validateForm($data, $rules);
|
||||
|
||||
$category = Category::find(Input::get('category_id'));
|
||||
$category = Category::find($data['category_id']);
|
||||
|
||||
$product = new Product;
|
||||
$product->name = Input::get('name_tm');
|
||||
$product->name = $data['name_tm'];
|
||||
// Sets a single translated attribute for a language
|
||||
$product->setAttributeTranslated('name', Input::get('name_ru'), 'ru');
|
||||
$product->setAttributeTranslated('name', Input::get('name_en'), 'en');
|
||||
$product->setAttributeTranslated('name', $data['name_ru'], 'ru');
|
||||
$product->setAttributeTranslated('name', $data['name_en'], 'en');
|
||||
// Sets a single translated attribute for a language
|
||||
$product->setAttributeTranslated('slug', Str::slug(Input::get('name_ru'),'-'), 'ru');
|
||||
$product->setAttributeTranslated('slug', Str::slug(Input::get('name_en'),'-'), 'en');
|
||||
$product->setAttributeTranslated('slug', Str::slug($data['name_ru'],'-'), 'ru');
|
||||
$product->setAttributeTranslated('slug', Str::slug($data['name_en'],'-'), 'en');
|
||||
|
||||
$product->slug = Str::slug(Input::get('name_tm'),'-');
|
||||
$product->slug = Str::slug($data['name_tm'],'-');
|
||||
$product->status = 'draft';
|
||||
$product->mark = Input::get('mark');
|
||||
$product->manufacturer = Input::get('manufacturer');
|
||||
$product->country_id = Input::get('country_id');
|
||||
$product->mark = $data['mark'];
|
||||
$product->manufacturer = $data['manufacturer'];
|
||||
$product->country_id = $data['country_id'];
|
||||
|
||||
$category->products()->save($product);
|
||||
|
||||
|
|
@ -124,6 +89,7 @@ class OfferForm extends ComponentBase
|
|||
|
||||
}
|
||||
|
||||
// step 2
|
||||
public function onOfferFill() {
|
||||
$data = input();
|
||||
|
||||
|
|
@ -134,7 +100,7 @@ class OfferForm extends ComponentBase
|
|||
'description_tm' => 'required',
|
||||
'description_en' => 'required',
|
||||
'description_ru' => 'required',
|
||||
'ends_at' => 'required|date',
|
||||
// 'ends_at' => 'required|date',
|
||||
'payment_term_id' => 'required',
|
||||
'packaging' => 'required',
|
||||
'delivery_term_id' => 'required',
|
||||
|
|
@ -142,7 +108,6 @@ class OfferForm extends ComponentBase
|
|||
'measure_id' => 'required',
|
||||
'new_img' => 'required'
|
||||
];
|
||||
|
||||
$this->validateForm($data, $rules);
|
||||
|
||||
// seaparate validation for file type
|
||||
|
|
@ -160,150 +125,46 @@ class OfferForm extends ComponentBase
|
|||
$attachedProduct = Product::find($data['product_id']);
|
||||
|
||||
$attachedProduct = $this->fillProduct($data,$attachedProduct);
|
||||
|
||||
|
||||
// add images to completely new product
|
||||
foreach($data['new_img'] as $key => $img) {
|
||||
// add images to completely new product
|
||||
$attachedProduct->images = $img;
|
||||
$attachedProduct->save();
|
||||
}
|
||||
|
||||
$draft_offers = \Auth::user()->products()
|
||||
->where('status','draft')
|
||||
->orderBy('created_at', 'desc')->get();
|
||||
// $draft_offers = \Auth::user()->products()
|
||||
// ->where('status','draft')
|
||||
// ->orderBy('created_at', 'desc')->get();
|
||||
|
||||
$this->page['draft_offers'] = $draft_offers;
|
||||
$this->page['draft_offers_count'] = count($draft_offers);
|
||||
// $this->page['draft_offers'] = $draft_offers;
|
||||
// $this->page['draft_offers_count'] = count($draft_offers);
|
||||
$this->page['fee'] = Settings::getValue('fee');
|
||||
|
||||
$this->page['product'] = $attachedProduct;
|
||||
|
||||
return [
|
||||
'#form-steps' => $this->renderPartial('@basket')
|
||||
'#form-steps' => $this->renderPartial('@third_step_form')
|
||||
];
|
||||
}
|
||||
|
||||
public function onDeleteOfferFromBasket() {
|
||||
// delete offer from basket, from db
|
||||
$offer = Product::find(Input::get('offer_id'));
|
||||
$offer->images()->delete();
|
||||
$offer->translations()->delete();
|
||||
$offer->delete();
|
||||
|
||||
// then display the rest of offers
|
||||
$draft_offers = \Auth::user()->products()
|
||||
->where('status','draft')
|
||||
->orderBy('created_at', 'desc')->get();
|
||||
|
||||
$this->page['draft_offers'] = $draft_offers;
|
||||
$this->page['draft_offers_count'] = count($draft_offers);
|
||||
$this->page['fee'] = Settings::getValue('fee');
|
||||
|
||||
|
||||
return [
|
||||
'#form-steps' => $this->renderPartial('@basket')
|
||||
];
|
||||
}
|
||||
|
||||
public function onStartToPay() {
|
||||
$data = input();
|
||||
|
||||
$rules = [
|
||||
'pay_type' => 'required',
|
||||
];
|
||||
|
||||
$this->validateForm($data, $rules);
|
||||
|
||||
$pay_type = $data['pay_type'];
|
||||
if($pay_type == "bank") {
|
||||
return [
|
||||
'#form-steps' => $this->renderPartial('@bank_transfer_pay')
|
||||
];
|
||||
// step3
|
||||
public function onPublish() {
|
||||
$user = \Auth::user();
|
||||
if($user->balance - Settings::getValue('fee') < 0) {
|
||||
// ... message about not enough money
|
||||
} else {
|
||||
$url = $this->payOnline();
|
||||
if(!$url) {
|
||||
$this->page['err_message'] = 'Не удается подключиться к сервисам банка. Попробуйте позже';
|
||||
return [
|
||||
'#form-steps' => $this->renderPartial('@message')
|
||||
];
|
||||
}
|
||||
$user->balance = $user->balance - Settings::getValue('fee');
|
||||
$user->save();
|
||||
|
||||
$product = Product::find(Input::get('product_id'));
|
||||
$product->status = 'new';
|
||||
$product->save();
|
||||
|
||||
$this->page['url'] = $url;
|
||||
return [
|
||||
'#form-steps' => $this->renderPartial('@redirect')
|
||||
'#form-steps' => $this->renderPartial('@message')
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
protected function payOnline() {
|
||||
$payment = $this->createNewPayment(false, 'online');
|
||||
|
||||
$response = $this->registerOrder($payment);
|
||||
|
||||
$result = json_decode($response->body,true);
|
||||
|
||||
if($result['errorCode'] == 0){
|
||||
$payment->order_id = $result['orderId'];
|
||||
|
||||
$payment->save();
|
||||
|
||||
return $result['formUrl'];
|
||||
}
|
||||
else{
|
||||
return false;
|
||||
// dd($result['formUrl']);
|
||||
// throw new AjaxException(
|
||||
// $result
|
||||
// );
|
||||
}
|
||||
}
|
||||
|
||||
public function onPayByBankTransfer() {
|
||||
$data = input();
|
||||
|
||||
$rules = [
|
||||
'bank_file' => 'required|mimes:pdf,jpg,png',
|
||||
];
|
||||
|
||||
$this->validateForm($data, $rules);
|
||||
|
||||
$this->createNewPayment(Input::file('bank_file'), 'bank');
|
||||
|
||||
return [
|
||||
'#form-steps' => $this->renderPartial('@message')
|
||||
];
|
||||
}
|
||||
|
||||
protected function createNewPayment($bankFile, $payMethod) {
|
||||
$newPayment = new Payment;
|
||||
$newPayment->user_id = \Auth::user()->id;
|
||||
$newPayment->created_at = Carbon::now('Asia/Ashgabat');
|
||||
|
||||
$draft_offers = \Auth::user()->products()
|
||||
->where('status','draft')
|
||||
->get();
|
||||
$newPayment->amount = count($draft_offers) * Settings::getValue('fee');
|
||||
|
||||
$newPayment->payment_type = $payMethod;
|
||||
$newPayment->status = "new";
|
||||
$newPayment->save();
|
||||
$newPaymentId = $newPayment->id;
|
||||
|
||||
DB::transaction(function() use ($draft_offers, $newPaymentId) {
|
||||
foreach($draft_offers as $df) {
|
||||
$df->payment_id = $newPaymentId;
|
||||
$df->status = 'new';
|
||||
$df->save();
|
||||
}
|
||||
});
|
||||
|
||||
// attach file to payment
|
||||
if($bankFile) {
|
||||
$newPayment->bank_file = $bankFile;
|
||||
$newPayment->save();
|
||||
}
|
||||
|
||||
return $newPayment;
|
||||
}
|
||||
|
||||
protected function validateFileType($data, $rules) {
|
||||
$validator = Validator::make($data, $rules);
|
||||
|
||||
|
|
@ -328,40 +189,13 @@ class OfferForm extends ComponentBase
|
|||
}
|
||||
}
|
||||
|
||||
protected function makeInsertionArray($attachedProduct,$newOffer) { //for binding images
|
||||
$insertionArray = array();
|
||||
|
||||
$i = 0;
|
||||
|
||||
foreach($attachedProduct->images as $img) {
|
||||
$insertionArray[] = [
|
||||
'disk_name' => $img->disk_name,
|
||||
'file_name' => $img->file_name,
|
||||
'file_size' => $img->file_size,
|
||||
'content_type' => $img->content_type,
|
||||
'field' => $img->field,
|
||||
'attachment_id' => $newOffer->id,
|
||||
'attachment_type' => 'TPS\Birzha\Models\Offer',
|
||||
'is_public' => $img->is_public
|
||||
];
|
||||
|
||||
$i++;
|
||||
|
||||
if($i == 3) break; //only three first photos
|
||||
}
|
||||
|
||||
return $insertionArray;
|
||||
}
|
||||
|
||||
protected function fillProduct($data,$attachedProduct) {
|
||||
// $newOffer = new Offer;
|
||||
// $newOffer->product_id = $attachedProduct->id;
|
||||
|
||||
$attachedProduct->vendor_id = \Auth::user()->id;
|
||||
$attachedProduct->description = $data['description_tm'];
|
||||
// Sets a single translated attribute for a language
|
||||
$attachedProduct->setAttributeTranslated('description', $data['description_ru'], 'ru');
|
||||
$attachedProduct->setAttributeTranslated('description', $data['description_en'], 'en');
|
||||
|
||||
$attachedProduct->quantity = $data['quantity'];
|
||||
$attachedProduct->price = $data['price'];
|
||||
$attachedProduct->measure_id = $data['measure_id'];
|
||||
|
|
@ -369,10 +203,9 @@ class OfferForm extends ComponentBase
|
|||
$attachedProduct->delivery_term_id = $data['delivery_term_id'];
|
||||
$attachedProduct->packaging = $data['packaging'];
|
||||
$attachedProduct->place = $data['place'];
|
||||
// $attachedProduct->name = $attachedProduct->name;
|
||||
$attachedProduct->currency_id = $data['currency_id'];
|
||||
$attachedProduct->created_at = Carbon::now('Asia/Ashgabat');
|
||||
$attachedProduct->ends_at = $data['ends_at'];
|
||||
// $attachedProduct->ends_at = $data['ends_at'];
|
||||
$attachedProduct->save();
|
||||
|
||||
return $attachedProduct;
|
||||
|
|
@ -382,33 +215,4 @@ class OfferForm extends ComponentBase
|
|||
$this->countries = Country::all();
|
||||
$this->categories = Category::select('id','name','status')->where('status',1)->get();
|
||||
}
|
||||
|
||||
// payment
|
||||
protected function registerOrder($payment) {
|
||||
$client = self::getClient(self::REGISTRATION_URI);
|
||||
|
||||
$url = $this->controller->pageUrl('bank_result.htm', ['payment_id' => $payment->id]);
|
||||
|
||||
$client->data([
|
||||
'amount' => $payment->amount * 100,//multiply by 100 to obtain tenge
|
||||
'currency' => 934,
|
||||
'description' => 'Kart üçin döwlet pajy.',
|
||||
'orderNumber' => strtoupper(str_random(5)) . date('jn'),
|
||||
|
||||
'failUrl' => $url . '?status=success',
|
||||
'returnUrl' => $url . '?status=failed',
|
||||
|
||||
]);
|
||||
|
||||
$client->setOption(CURLOPT_POSTFIELDS,$client->getRequestData());
|
||||
// dd($client);
|
||||
return $client->send();
|
||||
}
|
||||
|
||||
private static function getClient($url){
|
||||
return Http::make(self::API_URL.$url, Http::METHOD_POST)->data([
|
||||
'userName' => Settings::getValue('api_login'),
|
||||
'password' => Settings::getValue('api_password'),
|
||||
])->timeout(120);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
<div class="contact_title">
|
||||
Bank transfer payment
|
||||
</div>
|
||||
<form class="post_form"
|
||||
data-request="onPayByBankTransfer"
|
||||
data-request-validate
|
||||
data-request-flash
|
||||
data-request-files>
|
||||
<div class="post_upload_box">
|
||||
<div class="post_upload_item">
|
||||
<div class="post_input">
|
||||
<label>Загрузить файл<span>*</span></label>
|
||||
<span data-validate-for="bank_file" style="color: red;"></span>
|
||||
<div class="upload_group">
|
||||
<label for="file-1">Загрузить файл</label>
|
||||
<div class="form_group">
|
||||
<label class="additional">
|
||||
<span>Ничего не выбранo</span>
|
||||
</label>
|
||||
<input type="file"
|
||||
name="bank_file"
|
||||
id="file-1" class="inputfile inputfile-1"
|
||||
data-multiple-caption="{count} files selected"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="btn_bg">
|
||||
<button class="post_btn" type="submit">
|
||||
Отправить на биржу
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script src="{{ 'assets/js/custom-file-input.js'|theme }}"></script>
|
||||
<script src="{{ 'assets/js/scrollTopOnSteps.js'|theme }}"></script>
|
||||
|
|
@ -1,112 +0,0 @@
|
|||
<div class="contact_title">
|
||||
Корзина
|
||||
</div>
|
||||
|
||||
|
||||
<div class="basket_box">
|
||||
<div class="basket_data">
|
||||
<div class="basket_table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Лот №:</th>
|
||||
<th>Изображение</th>
|
||||
<th>Товар</th>
|
||||
<th>Действие</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for offer in draft_offers %}
|
||||
<tr>
|
||||
<td>
|
||||
№ {{offer.id}}
|
||||
</td>
|
||||
<td>
|
||||
<div class="basket_img">
|
||||
<img src="{{ offer.images[0].thumb(165,95,{'mode':'crop'}) }}" alt="cat_photo">
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="basket_item_title">
|
||||
{{offer.name}}
|
||||
</div>
|
||||
<div class="basket_item_text">
|
||||
{{offer.name}}
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<a href="#"
|
||||
data-request="onDeleteOfferFromBasket"
|
||||
data-request-data="offer_id: {{ offer.id }}"
|
||||
class="basket_delete">
|
||||
<img src="{{ 'assets/images/svg/garbage.svg'|theme }}" alt="delete-icon">
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<form data-request="onStartToPay"
|
||||
data-request-validate
|
||||
data-request-flash
|
||||
class="basket_info">
|
||||
<div class="basket_info_title">
|
||||
Стоимость
|
||||
</div>
|
||||
<div class="basket_info_item">
|
||||
<div class="basket_info_box">
|
||||
<div class="basket_info_name">
|
||||
Цена за один пост:
|
||||
</div>
|
||||
<div class="basket_info_cash">
|
||||
{{fee}} TMT
|
||||
</div>
|
||||
</div>
|
||||
<div class="basket_info_box">
|
||||
<div class="basket_info_name">
|
||||
Количество постов:
|
||||
</div>
|
||||
<div class="basket_info_cash">
|
||||
{{draft_offers_count}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="basket_info_item">
|
||||
<div class="basket_info_box">
|
||||
<div class="basket_info_name">
|
||||
Итоговая сумма
|
||||
</div>
|
||||
<div class="basket_info_cash">
|
||||
{{draft_offers_count * fee}} TMT
|
||||
</div>
|
||||
</div>
|
||||
<div class="basket_info_select">
|
||||
<label>Метод оплаты <span>*</span> <span data-validate-for="pay_type" style="color: red;"></span></label>
|
||||
<div class="my-select">
|
||||
<select class="category-select" name="pay_type">
|
||||
<option value="">Method</option>
|
||||
<option value="bank">Bank transfer</option>
|
||||
<option value="online">Online payment</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="btn_bg">
|
||||
<button class="post_btn" type="submit" data-attach-loading>
|
||||
Отправить на биржу
|
||||
</button>
|
||||
</div>
|
||||
<a href="{{ 'kabinet/add_offer'|page }}" class="add_post_btn">
|
||||
<div class="post_icon">
|
||||
<img src="{{'assets/images/svg/add.svg'|theme}}" alt="">
|
||||
</div>
|
||||
<div class="post_text">
|
||||
Добавить объявление
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script src="{{ 'assets/js/scrollTopOnSteps.js'|theme }}"></script>
|
||||
|
|
@ -76,7 +76,7 @@
|
|||
|
||||
<div class="btn_bg">
|
||||
<button class="post_btn" type="submit" data-attach-loading>
|
||||
Отправить на биржу
|
||||
Шаг 2
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,18 +1,14 @@
|
|||
<section class="thanks">
|
||||
<div class="auto_container">
|
||||
<div class="thanks_wrap">
|
||||
{% if err_message is defined %}
|
||||
<div class="thanks_text">
|
||||
{{err_message}}
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
<div class="thanks_title">
|
||||
Спасибо за оставленный вами запрос
|
||||
</div>
|
||||
<div class="thanks_text">
|
||||
После проверки нашим Админом ваш лот будет размещен на нашем сайте!
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
<script>
|
||||
window.location.href = "{{url}}";
|
||||
</script>
|
||||
<!-- <div>
|
||||
<h1>{{url}}</h1>
|
||||
</div> -->
|
||||
|
|
@ -9,7 +9,6 @@
|
|||
data-request-files
|
||||
>
|
||||
<input type="hidden" name="product_id" value="{{product.id}}">
|
||||
<!-- <input type="hidden" name="product_exists" value="{{ product_exists }}"> -->
|
||||
|
||||
<div class="post_input">
|
||||
<label>Единицы измерения <span>*</span> <span data-validate-for="measure_id" style="color: red;"></span></label>
|
||||
|
|
@ -88,11 +87,11 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="post_input">
|
||||
<!-- <div class="post_input">
|
||||
<label for="good-cost">Ends at <span>*</span> </label>
|
||||
<input type="datetime-local" name="ends_at">
|
||||
<span data-validate-for="ends_at" style="color: red;"></span>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<div class="post_comment">
|
||||
<label for="description_ru">Описание (RU) <span>*</span></label>
|
||||
|
|
@ -141,7 +140,7 @@
|
|||
|
||||
<div class="btn_bg">
|
||||
<button class="post_btn" type="submit">
|
||||
Отправить на биржу
|
||||
Шаг 3
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
<div class="contact_title">
|
||||
Добавить объявление (Step 3)
|
||||
</div>
|
||||
|
||||
<form action="#" class="post_form" enctype="multipart/form-data"
|
||||
data-request="onPublish"
|
||||
>
|
||||
<input type="hidden" name="product_id" value="{{product.id}}">
|
||||
|
||||
|
||||
<div class="thanks_title">
|
||||
За публикацию с вашего баланса будет снято {{fee}} TMT
|
||||
</div>
|
||||
|
||||
<div class="btn_bg">
|
||||
<button class="post_btn" type="submit">
|
||||
Опубликовать
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="add_post_text">
|
||||
Пункты отмеченные ( <span>*</span> ) обязательны для заполнения
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
<script src="{{ 'assets/js/custom-file-input.js'|theme }}"></script>
|
||||
<script src="{{ 'assets/js/scrollTopOnSteps.js'|theme }}"></script>
|
||||
|
|
@ -48,7 +48,7 @@ fields:
|
|||
span: auto
|
||||
type: relation
|
||||
price:
|
||||
label: Number
|
||||
label: Price
|
||||
span: auto
|
||||
type: number
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ code = "main-top"
|
|||
<img src="{{'assets/images/svg/user-plus.svg'|theme}}" alt="">
|
||||
</div>
|
||||
<div class="profile_text">
|
||||
{{user.name}}
|
||||
{{user.name}} Balance: {{user.balance}} TMT
|
||||
</div>
|
||||
<div class="prodile_arrow">
|
||||
<img src="{{'assets/images/svg/arrow-down.svg'|theme}}" alt="">
|
||||
|
|
|
|||
Loading…
Reference in New Issue