Advertisement
Djoin

BasketComponent

Apr 14th, 2022
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <template>
  2.     <section class="cart-page page-bg">
  3.         <div class="container">
  4.             <div class="row">
  5.                 <div class="col-lg-12">
  6.                     <table class="table-products table-products--cart">
  7.                         <thead>
  8.                         <tr>
  9.                             <th colspan="3">Товар</th>
  10.                             <th>Количество</th>
  11.                             <th>Стоимость</th>
  12.                             <th>Сумма</th>
  13.                         </tr>
  14.                         </thead>
  15.                         <tbody>
  16.                         <tr v-for="(item,key) in cart_items" :key="key">
  17.                             <td>
  18.                                 <button class="table-products__del table-products__del--small"
  19.                                         @click="deleteItem(item)"><i class="demo-icon icon-delete"></i></button>
  20.                             </td>
  21.                             <td><a :href="item.url" class="table-products__image"><img :src="'/images/uploads/thumbs/'+item.photo.replace(/^.*[\\\/]/, '')" alt=""></a></td>
  22.                             <td class="table-products__info">
  23.                                 <div class="table-products__article">Артикул: {{ item.article }}</div>
  24.                                 <a :href="item.url" class="table-products__title"> {{ item.title }} </a>
  25.                             </td>
  26.                             <td class="table-products__counts">
  27.                                 <small>Количество</small>
  28.                                 <div class="number">
  29.                                     <button class="number__btn number__btn--minus" @click="minCount(item)"><i
  30.                                             class="demo-icon icon-minus"></i></button>
  31.                                     {{ item.count }}
  32.                                     <input :key="item.count" type="text" v-model.number="item.count" class="number__input">
  33.                                     <button class="number__btn number__btn--plus" @click="addCount(item)"><i
  34.                                             class="demo-icon icon-plus"></i></button>
  35.                                 </div>
  36.                             </td>
  37.                             <td>
  38.                                 <div class="table-products__priceblock">
  39.                                     <small>Стоимость</small>
  40.                                     <div class="table-products__price">{{ item.price | formatNumber }}
  41.                                         <div v-if="item.use_discount" class="table-products__oldprice">
  42.                                             {{ item.pricediscount | formatNumber }}
  43.                                         </div>
  44.                                     </div>
  45.  
  46.                                 </div>
  47.                             </td>
  48.                             <td>
  49.                                 <div class="table-products__sum">
  50.                                     <small>Сумма</small>
  51.                                     {{ item.price * item.count | formatNumber }}
  52.                                 </div>
  53.                             </td>
  54.                         </tr>
  55.                         </tbody>
  56.                     </table>
  57.                     <div class="cart-page__total">
  58.                         <p><b>Всего товаров:</b> {{ this.itemsCount }}</p>
  59.                         <p><b>Сумма заказа:</b> {{ this.itemsSum }} руб.</p>
  60.                     </div>
  61.                     <div class="cart-page__btns">
  62.                         <a href="#one-click" class="btn btn--blue btn--one-click popup-with-form"><i
  63.                                 class="demo-icon icon-buy"></i> Купить в один клик</a>
  64.                         <a href="/checkout" class="btn btn--blue btn--get-order">оформить заказ <i
  65.                                 class="demo-icon icon-next"></i></a>
  66.                     </div>
  67.  
  68.                 </div>
  69.             </div>
  70.             <div class="hidden">
  71.                 <form class="form modal-form modal-form--one-click" id="one-click" @submit.prevent>
  72.                     <h3 class="modal-form__title">Купить в один клик</h3>
  73.                     <div class="modal-form__table">
  74.                         <table class="table table--one-click">
  75.                             <thead>
  76.                             <tr>
  77.                                 <th></th>
  78.                                 <th>Артикул</th>
  79.                                 <th>Наименование</th>
  80.                                 <th>Кол-во</th>
  81.                                 <th colspan>Цена</th>
  82.                                 <th colspan="2">Стоимость</th>
  83.                             </tr>
  84.                             </thead>
  85.                             <tbody>
  86.                             <tr v-for="(item, key ,index) in cart_items" :key="key">
  87.                                 <td data-title="№"><b>{{ index +1 }}.</b></td>
  88.                                 <td data-title="Артикул">{{ item.article }}</td>
  89.                                 <td data-title="Наименование">{{  item.title }}</td>
  90.                                 <td data-title="Кол-во">{{  item.count }}</td>
  91.                                 <td data-title="Цена">{{ item.price | formatNumber }}</td>
  92.                                 <td data-title="Стоимость">{{ item.price | formatNumber }}</td>
  93.                                 <td><button @click="deleteItem(item)" class="table-products__del table-products__del--small"><i class="demo-icon icon-delete"></i></button></td>
  94.                             </tr>
  95.                             </tbody>
  96.                         </table>
  97.                         <div class="cart-page__total">
  98.                             <p><b>Всего товаров:</b> {{ this.itemsCount }}</p>
  99.                             <p><b>Сумма заказа:</b> {{ this.itemsSum }} руб.</p>
  100.                         </div>
  101.                     </div>
  102.  
  103.                     <div class="form__fieldset">
  104.                         <div class="form__row">
  105.                             <div class="form__column form__column--33">
  106.                                 <div class="form__fieldset">
  107.                                     <legend class="form__legend">Ваше имя <span>*</span></legend>
  108.                                     <input type="text" class="form__input form__input--name" v-model="user.name" placeholder="Введите ваше имя">
  109.                                 </div>
  110.                             </div>
  111.                             <div class="form__column form__column--33">
  112.                                 <div class="form__fieldset">
  113.                                     <legend class="form__legend">Номер телефона <span>*</span></legend>
  114.                                     <input type="text" class="form__input form__input--phone" v-model="user.phone" placeholder="+7 (___) ___ __ __">
  115.                                 </div>
  116.                             </div>
  117.                             <div class="form__column form__column--33">
  118.                                 <div class="form__fieldset">
  119.                                     <legend class="form__legend">E-mail  <span>*</span></legend>
  120.                                     <input type="text" class="form__input form__input--email" v-model="user.email" placeholder="email@domen.ru">
  121.                                 </div>
  122.                             </div>
  123.                         </div>
  124.                     </div>
  125.                     <div class="form__fieldset">
  126.                         <button class="btn btn--blue" @click="do_checkout">отправить заявку</button>
  127.                     </div>
  128.                     <div class="form__fieldset">
  129.                         <label class="checkbox">
  130.                             <input type="checkbox" v-model="i_agree" />
  131.                             <div class="checkbox__text">Нажимая на кнопку, я принимаю <a href="">условия соглашения.</a></div>
  132.                             <div v-if="order_error && order_error.i_agree" class="form__subtitle form__subtitle--error">{{ order_error.i_agree }}</div>
  133.                         </label>
  134.                     </div>
  135.                 </form>
  136.             </div>
  137.         </div>
  138.     </section>
  139. </template>
  140.  
  141. <script>
  142.     var numeral = require('numeral');
  143.     numeral.register('locale', 'ru', {
  144.         delimiters: {
  145.             thousands: ' ',
  146.             decimal: ','
  147.         },
  148.         abbreviations: {
  149.             thousand: 'k',
  150.             million: 'm',
  151.             billion: 'b',
  152.             trillion: 't'
  153.         },
  154.         ordinal: function (number) {
  155.             return number === 1 ? 'er' : 'ème';
  156.         },
  157.         currency: {
  158.             symbol: ''
  159.         }
  160.     });
  161.     numeral.locale('ru');
  162.     Vue.filter("formatNumber", function (value) {
  163.         return numeral(value).format("0,0"); // displaying other groupings/separators is possible, look at the docs
  164.     });
  165.  
  166.     export default {
  167.  
  168.         props: {
  169.             items: {
  170.                 type: Object,
  171.                 default: () => ({
  172.  
  173.                 })
  174.             },
  175.             from_base: {
  176.                 default: false,
  177.             },
  178.             prop_user:{
  179.                 type: Object,
  180.                 default: () => ({
  181.  
  182.                 })
  183.             },
  184.             auth: {
  185.                 default: false,
  186.             },
  187.         },
  188.         data() {
  189.             return {
  190.                 cart_items: {},
  191.                 is_auth: this.auth,
  192.                 i_agree: true,
  193.                 fields: {},
  194.                 errors: {},
  195.                 order_error: {},
  196.                 user:this.prop_user,
  197.             }
  198.         },
  199.         computed: {
  200.             itemsCount() {
  201.                 let count = 0;
  202.                 let items = this.cart_items;
  203.                 Object.keys(items).forEach(function (key) {
  204.                     count += items[key].count;
  205.                 });
  206.                 $('.globalCount-Cart').text(count);
  207.                 return count;
  208.             },
  209.             itemsSum() {
  210.                 let sum = 0;
  211.                 let items = this.cart_items;
  212.                 Object.keys(items).forEach(function (key) {
  213.                     sum += items[key].count * items[key].price;
  214.                 });
  215.  
  216.                 sum = String(sum).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1 ')
  217.                 $('.globalSum-Cart').text(sum);
  218.                 return sum;
  219.             }
  220.         },
  221.         methods: {
  222.             do_checkout() {
  223.  
  224.                 this.order_error = {};
  225.                 this.checkout_errors = {};
  226.                 if (this.user.name == '')
  227.                 {
  228.                     this.order_error.customer_name = 'Поле не может быть пустым.';
  229.                 }
  230.  
  231.                 if (this.user.phone == '')
  232.                 {
  233.                     this.order_error.customer_phone = 'Поле не может быть пустым.';
  234.                 }
  235.  
  236.                 if (this.user.email == '')
  237.                 {
  238.                     this.order_error.customer_email = 'Поле не может быть пустым.';
  239.                 }
  240.  
  241.                 if (this.user.address == '')
  242.                 {
  243.                     this.order_error.customer_address = 'Поле не может быть пустым.';
  244.                 }
  245.                 if (this.i_agree == '')
  246.                 {
  247.                     this.order_error.i_agree = 'Вы дожны принять условия.';
  248.                 }
  249.  
  250.                 if (Object.keys(this.order_error).length === 0)
  251.                 {
  252.                     this.created = true;
  253.                     let data = {};
  254.                     data.user = this.user;
  255.                     data.items = this.cart_items;
  256.  
  257.                     axios.post('/checkout_order',data,{
  258.                         headers: {
  259.                             'Content-Type': 'application/json',
  260.                         }
  261.                     }).then(response => {
  262.                         $('#done').find('.modal-form__title').text('Заказ оформлен');
  263.                         $('#done').find('.modal-form__subtitle').text('');
  264.                         $.magnificPopup.open({
  265.                             items: {
  266.                                 src: '#done',
  267.                             },
  268.                             type: 'inline'
  269.                         });
  270.                         //Очищаем корзину
  271.                         localStorage.removeItem('primusCart');
  272.                         $('.globalCount-Cart').text('');
  273.                         $('.globalSum-Cart').text('');
  274.                         $('.globalCount-Cart').hide();
  275.                         $('.footer-cart-badge').hide();
  276.  
  277.                         setTimeout(function(){ window.location = "/profile/orders"; },3000);
  278.  
  279.                     }).catch(error => {
  280.                         if (error.response.status === 422) {
  281.                             this.checkout_errors = error.response.data.errors || {};
  282.  
  283.                         }
  284.                     }).finally(()=> {
  285.                         this.created = false;
  286.                     });
  287.                 }
  288.  
  289.             },
  290.             addCount(item) {
  291.                 item.count = item.count +1;
  292.                 this.saveStorage();
  293.             },
  294.             minCount(item) {
  295.                 if (item.count > 1) {
  296.                     item.count--;
  297.                     this.saveStorage();
  298.                 }
  299.  
  300.             },
  301.             deleteItem(item) {
  302.                 this.$delete(this.cart_items, item.id);
  303.                 this.saveStorage();
  304.             },
  305.             saveStorage() {
  306.                 localStorage.setItem('primusCart', JSON.stringify(this.cart_items));
  307.             },
  308.  
  309.         },
  310.         mounted() {
  311.             if (!this.from_base) {
  312.                 if (localStorage.getItem('primusCart') !== null) {
  313.                     this.cart_items = JSON.parse(localStorage.getItem('primusCart'));
  314.                 }
  315.             }
  316.  
  317.         }
  318.     }
  319. </script>
  320.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement