├── .gitignore ├── src ├── Contracts │ ├── Booking.php │ ├── BookingProduct.php │ ├── BookingProductDefaultSlot.php │ ├── BookingProductEventTicket.php │ ├── BookingProductRentalSlot.php │ ├── BookingProductTableSlot.php │ ├── BookingProductAppointmentSlot.php │ └── BookingProductEventTicketTranslation.php ├── Resources │ ├── assets │ │ ├── fonts │ │ │ └── booking.woff │ │ ├── js │ │ │ └── app.js │ │ └── css │ │ │ └── app.css │ ├── manifest.php │ └── views │ │ ├── components │ │ ├── form │ │ │ ├── control-group │ │ │ │ ├── index.blade.php │ │ │ │ ├── label.blade.php │ │ │ │ ├── error.blade.php │ │ │ │ └── control.blade.php │ │ │ └── index.blade.php │ │ ├── layouts │ │ │ └── style.blade.php │ │ ├── example.blade.php │ │ ├── flat-picker │ │ │ ├── time.blade.php │ │ │ └── datetime.blade.php │ │ └── modal │ │ │ └── index.blade.php │ │ ├── admin │ │ ├── catalog │ │ │ └── products │ │ │ │ └── edit │ │ │ │ ├── inventories.blade.php │ │ │ │ └── types │ │ │ │ └── booking │ │ │ │ └── empty-info.blade.php │ │ └── sales │ │ │ └── bookings │ │ │ └── index.blade.php │ │ └── shop │ │ └── products │ │ └── view │ │ └── types │ │ ├── booking │ │ ├── default.blade.php │ │ ├── event.blade.php │ │ ├── appointment.blade.php │ │ ├── slots.blade.php │ │ └── table.blade.php │ │ └── booking.blade.php ├── Models │ ├── BookingProxy.php │ ├── BookingProductProxy.php │ ├── BookingProductRentalSlotProxy.php │ ├── BookingProductTableSlotProxy.php │ ├── BookingProductDefaultSlotProxy.php │ ├── BookingProductEventTicketProxy.php │ ├── BookingProductAppointmentSlotProxy.php │ ├── BookingProductEventTicketTranslationProxy.php │ ├── BookingProductEventTicketTranslation.php │ ├── BookingProductAppointmentSlot.php │ ├── BookingProductRentalSlot.php │ ├── BookingProductTableSlot.php │ ├── BookingProductDefaultSlot.php │ ├── Booking.php │ ├── BookingProductEventTicket.php │ └── BookingProduct.php ├── Routes │ ├── web.php │ ├── front-routes.php │ └── admin-routes.php ├── Config │ ├── menu.php │ └── product_types.php ├── Helpers │ ├── AppointmentSlot.php │ ├── TableSlot.php │ └── DefaultSlot.php ├── Http │ └── Controllers │ │ ├── Controller.php │ │ ├── Shop │ │ └── BookingProductController.php │ │ └── Admin │ │ └── BookingController.php ├── Repositories │ ├── BookingProductRentalSlotRepository.php │ ├── BookingProductTableSlotRepository.php │ ├── BookingProductDefaultSlotRepository.php │ ├── BookingProductAppointmentSlotRepository.php │ ├── BookingProductEventTicketRepository.php │ └── BookingRepository.php ├── Listeners │ └── Order.php ├── Providers │ ├── ModuleServiceProvider.php │ ├── EventServiceProvider.php │ └── BookingProductServiceProvider.php ├── Database │ ├── Factories │ │ ├── BookingProductEventTicketFactory.php │ │ └── BookingProductFactory.php │ └── Migrations │ │ ├── 2019_07_05_154415_create_booking_product_default_slots_table.php │ │ ├── 2019_07_05_154429_create_booking_product_appointment_slots_table.php │ │ ├── 2019_07_05_154451_create_booking_product_rental_slots_table.php │ │ ├── 2019_07_05_154440_create_booking_product_event_tickets_table.php │ │ ├── 2019_07_05_154502_create_booking_product_table_slots_table.php │ │ ├── 2019_07_02_180307_create_booking_products_table.php │ │ ├── 2020_02_21_121201_create_booking_product_event_ticket_translations_table.php │ │ └── 2020_02_18_165639_create_bookings_table.php ├── Console │ └── Commands │ │ └── Booking.php └── DataGrids │ └── Admin │ ├── Catalog │ └── ProductDataGrid.php │ └── BookingDataGrid.php ├── postcss.config.js ├── publishable └── build │ └── assets │ ├── booking-e486554d.woff │ ├── favicon-a4003609.ico │ ├── bagisto-admin-37c2feba.woff │ ├── customers-199df769.svg │ ├── tax-20f847de.svg │ ├── spinner-08c27ad5.svg │ ├── front-93490c30.svg │ ├── average-orders-71c4bf9a.svg │ ├── settings-26b93165.svg │ ├── ja.es-6a0383c1.js │ ├── next-2-6aace5ca.svg │ ├── ko.es-52b4fe30.js │ ├── he.es-38780c8b.js │ ├── zh-cn.es-b584d7c2.js │ ├── zh-hk.es-3b3b5fba.js │ ├── ar.es-2968a13f.js │ ├── fa.es-b08cd112.js │ ├── bn.es-3f8773a4.js │ ├── tr.es-f57d7128.js │ ├── bg.es-182cdcb3.js │ ├── cs.es-29e50c14.js │ ├── sl.es-886c86bd.js │ ├── sv.es-f0a285bd.js │ ├── de.es-83841cfd.js │ ├── en.es-d28ce695.js │ ├── no.es-8b33619c.js │ ├── sk.es-7894e5cb.js │ ├── sr.es-f3348729.js │ ├── bs.es-47a220af.js │ ├── da.es-eecb0b06.js │ ├── id.es-3e6a36ce.js │ ├── es.es-232cf334.js │ ├── et.es-7e6a3380.js │ ├── fr.es-bb780d19.js │ ├── mn.es-fcd02e46.js │ ├── address-c3d46b29.svg │ ├── it.es-a9d8c123.js │ ├── nl.es-558331c7.js │ ├── ro.es-8080c341.js │ ├── hr.es-fdafdc21.js │ ├── hu.es-3630014a.js │ ├── is.es-a5785bf6.js │ ├── next-1-91bb148a.svg │ ├── pl.es-631374bd.js │ ├── ka.es-75616353.js │ ├── pt-br.es-a39b3c5f.js │ ├── pt-pt.es-a39b3c5f.js │ ├── total-orders-f1b2017e.svg │ ├── fi.es-d164093c.js │ ├── payment-method-10ea91e1.svg │ ├── lt.es-fb2fe7b5.js │ ├── sq.es-600bc51c.js │ ├── ru.es-9e02a02e.js │ ├── vi.es-c0302793.js │ ├── uk.es-0afcf35e.js │ ├── ca.es-47a49a5a.js │ ├── invoice-bbc6d6a8.svg │ ├── el.es-b1c0d142.js │ ├── shipping-ceb1cb37.svg │ ├── zoom-0c75bed3.svg │ ├── unpaid-invoices-6c51662d.svg │ ├── total-sales-5b2c7b58.svg │ ├── store-information-a7d64429.svg │ ├── use-cases-4a33de1a.svg │ ├── theme-f4d870b8.svg │ ├── icon-options-ebfcd268.svg │ ├── order-c8714dda.svg │ ├── checkout-e5efdb8e.svg │ ├── inventory-d69907d8.svg │ ├── magic-ai-2b88cb86.svg │ ├── orders-5dd62d9d.svg │ ├── report-empty-c3bb4a01.svg │ ├── customers-57f8166b.svg │ ├── store-8d27c0df.svg │ ├── size-04e2a252.svg │ ├── product-357134fb.svg │ ├── icon-discount-e37d1aed.svg │ ├── email-5653e8d5.svg │ ├── captcha-061d77ab.svg │ ├── reviews-17309002.svg │ ├── drag-and-drop.es-0df93f71.js │ └── icon-add-product-e3232d62.svg ├── package.json ├── composer.json ├── tailwind.config.js ├── vite.config.js ├── README.md └── CHANGELOG.md /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /npm-debug.log 3 | /package-lock.json 4 | -------------------------------------------------------------------------------- /src/Contracts/Booking.php: -------------------------------------------------------------------------------- 1 | 'Webkul Bagisto Booking Product', 5 | 'version' => core()->version(), 6 | ]; 7 | -------------------------------------------------------------------------------- /src/Resources/views/components/form/control-group/index.blade.php: -------------------------------------------------------------------------------- 1 |
merge(['class' => 'mb-2.5']) }}> 2 | {{ $slot }} 3 |
4 | -------------------------------------------------------------------------------- /publishable/build/assets/bagisto-admin-37c2feba.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bagisto/booking-product/HEAD/publishable/build/assets/bagisto-admin-37c2feba.woff -------------------------------------------------------------------------------- /src/Contracts/BookingProductAppointmentSlot.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'flex gap-1.5 items-center mb-1.5 text-xs text-gray-800 dark:text-white font-medium']) }}> 2 | {{ $slot }} 3 | 4 | -------------------------------------------------------------------------------- /src/Models/BookingProductEventTicketTranslationProxy.php: -------------------------------------------------------------------------------- 1 | type == 'booking') 2 |
3 | @endif 4 | 5 | @pushOnce('scripts') 6 | 9 | @endPushOnce -------------------------------------------------------------------------------- /src/Config/menu.php: -------------------------------------------------------------------------------- 1 | 'sales.bookings', 6 | 'name' => 'booking::app.admin.sales.bookings.title', 7 | 'route' => 'admin.sales.bookings.index', 8 | 'sort' => 6, 9 | 'icon' => '', 10 | ], 11 | ]; 12 | -------------------------------------------------------------------------------- /src/Config/product_types.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'key' => 'booking', 6 | 'name' => 'booking::app.admin.catalog.products.type.booking', 7 | 'class' => 'Webkul\BookingProduct\Type\Booking', 8 | 'sort' => 7, 9 | ], 10 | ]; 11 | -------------------------------------------------------------------------------- /src/Routes/front-routes.php: -------------------------------------------------------------------------------- 1 | ['web', 'theme', 'locale', 'currency']], function () { 7 | Route::get('booking-slots/{id}', [BookingProductController::class, 'index'])->name('booking_product.slots.index'); 8 | }); 9 | -------------------------------------------------------------------------------- /src/Helpers/AppointmentSlot.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/Repositories/BookingProductRentalSlotRepository.php: -------------------------------------------------------------------------------- 1 | '']) 2 | 3 | @if (! empty($controlName)) 4 | 9 |

merge(['class' => 'mt-1 text-red-600 text-xs italic']) }} 11 | v-text="message" 12 | > 13 |

14 |
15 | @endif 16 | -------------------------------------------------------------------------------- /src/Models/BookingProductEventTicketTranslation.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /publishable/build/assets/spinner-08c27ad5.svg: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /publishable/build/assets/front-93490c30.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/Routes/admin-routes.php: -------------------------------------------------------------------------------- 1 | ['web', 'admin'], 'prefix' => config('app.admin_url')], function () { 10 | 11 | Route::controller(BookingController::class)->prefix('sales/bookings')->group(function () { 12 | Route::get('', 'index')->name('admin.sales.bookings.index'); 13 | 14 | Route::get('get', 'get')->name('admin.sales.bookings.get'); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /publishable/build/assets/average-orders-71c4bf9a.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/Resources/views/components/example.blade.php: -------------------------------------------------------------------------------- 1 | {{-- Time Picker --}} 2 | 3 | 4 | @lang('Time') 5 | 6 | 7 | 13 | 14 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /publishable/build/assets/settings-26b93165.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/Models/BookingProductAppointmentSlot.php: -------------------------------------------------------------------------------- 1 | 'array']; 13 | 14 | protected $fillable = [ 15 | 'duration', 16 | 'break_time', 17 | 'same_slot_all_days', 18 | 'slots', 19 | 'booking_product_id', 20 | ]; 21 | } 22 | -------------------------------------------------------------------------------- /src/Models/BookingProductRentalSlot.php: -------------------------------------------------------------------------------- 1 | 'array']; 13 | 14 | protected $fillable = [ 15 | 'renting_type', 16 | 'daily_price', 17 | 'hourly_price', 18 | 'same_slot_all_days', 19 | 'slots', 20 | 'booking_product_id', 21 | ]; 22 | } 23 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bagisto/booking-product", 3 | "license": "MIT", 4 | "description": "Booking Product package", 5 | "authors": [ 6 | { 7 | "name": "Bagisto", 8 | "email": "support@bagisto.com" 9 | } 10 | ], 11 | "require": {}, 12 | "autoload": { 13 | "psr-4": { 14 | "Webkul\\BookingProduct\\": "src/" 15 | } 16 | }, 17 | "extra": { 18 | "laravel": { 19 | "providers": [ 20 | "Webkul\\BookingProduct\\Providers\\BookingProductServiceProvider" 21 | ] 22 | } 23 | }, 24 | "minimum-stability": "dev" 25 | } 26 | -------------------------------------------------------------------------------- /publishable/build/assets/ja.es-6a0383c1.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["月","火","水","木","金","土","日"],a=["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],s="年",d="今年",n="月",o="週",y="日",D="今日",e="イベントなし",r="終日",A="削除",t="イベント作成",E="YYYY年 MMMM D日 (dddd)",l={weekDays:u,months:a,years:"年",year:"今年",month:"月",week:"週",day:"日",today:"今日",noEvent:e,allDay:"終日",deleteEvent:"削除",createEvent:t,dateFormat:E};export{r as allDay,t as createEvent,E as dateFormat,y as day,l as default,A as deleteEvent,n as month,a as months,e as noEvent,D as today,o as week,u as weekDays,d as year,s as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/next-2-6aace5ca.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /publishable/build/assets/ko.es-52b4fe30.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const C=["월","화","수","목","금","토","일"],u=["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],s="년도",A="연간",d="월간",n="주간",o="일간",y="오늘",a="일정 없음",e="하루 종일",r="삭제",D="일정 추가",t="YYYY년 MMMM D일 dddd요일",B={weekDays:C,months:u,years:"년도",year:"연간",month:"월간",week:"주간",day:"일간",today:"오늘",noEvent:a,allDay:e,deleteEvent:"삭제",createEvent:D,dateFormat:t};export{e as allDay,D as createEvent,t as dateFormat,o as day,B as default,r as deleteEvent,d as month,u as months,a as noEvent,y as today,n as week,C as weekDays,A as year,s as years}; 6 | -------------------------------------------------------------------------------- /src/Listeners/Order.php: -------------------------------------------------------------------------------- 1 | bookingRepository->create(['order' => $order]); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Models/BookingProductTableSlot.php: -------------------------------------------------------------------------------- 1 | 'array']; 13 | 14 | protected $fillable = [ 15 | 'price_type', 16 | 'guest_limit', 17 | 'duration', 18 | 'break_time', 19 | 'prevent_scheduling_before', 20 | 'same_slot_all_days', 21 | 'slots', 22 | 'booking_product_id', 23 | ]; 24 | } 25 | -------------------------------------------------------------------------------- /publishable/build/assets/he.es-38780c8b.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["שני","שלישי","רביעי","חמישי","שישי","שבת","ראשון"],D=["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],E="שנים",r="שנה",a="חודש",e="שבוע",l="יום",t="היום",s="אין אירועים",d="כל היום",n="מחיקה",o="צור אירוע",y="dddd D MMMM YYYY",m={weekDays:u,months:D,years:E,year:"שנה",month:a,week:e,day:"יום",today:t,noEvent:s,allDay:d,deleteEvent:n,createEvent:o,dateFormat:y};export{d as allDay,o as createEvent,y as dateFormat,l as day,m as default,n as deleteEvent,a as month,D as months,s as noEvent,t as today,e as week,u as weekDays,r as year,E as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/zh-cn.es-b584d7c2.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["星期一","星期二","星期三","星期四","星期五","星期六","星期日"],a=["一","二","三","四","五","六","日"],e=["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],D="年",F="本年",o="月",y="周",d="日",n="今日",E="暂无活动",r="整天",l="删除",t="新建活动",s="YYYY MMMM D dddd",C={weekDays:u,weekDaysShort:a,months:e,years:"年",year:"本年",month:"月",week:"周",day:"日",today:"今日",noEvent:E,allDay:"整天",deleteEvent:"删除",createEvent:t,dateFormat:s};export{r as allDay,t as createEvent,s as dateFormat,d as day,C as default,l as deleteEvent,o as month,e as months,E as noEvent,n as today,y as week,u as weekDays,a as weekDaysShort,F as year,D as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/zh-hk.es-3b3b5fba.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["星期一","星期二","星期三","星期四","星期五","星期六","星期日"],a=["一","二","三","四","五","六","日"],e=["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],D="年",F="本年",o="月",y="周",d="日",n="今日",E="暫無活動",r="整天",l="刪除",t="新建活動",s="YYYY MMMM D dddd",B={weekDays:u,weekDaysShort:a,months:e,years:"年",year:"本年",month:"月",week:"周",day:"日",today:"今日",noEvent:E,allDay:"整天",deleteEvent:"刪除",createEvent:t,dateFormat:s};export{r as allDay,t as createEvent,s as dateFormat,d as day,B as default,l as deleteEvent,o as month,e as months,E as noEvent,n as today,y as week,u as weekDays,a as weekDaysShort,F as year,D as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/ar.es-2968a13f.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت","الأحد"],a=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر"," ديسمبر"],e="سنوات",y="سنة",D="شهر",t="أسبوع",r="يوم",s="اليوم",A="لا حدث",d="طوال اليوم",l="حذف",n="إنشاء حدث",o="dddd D MMMM YYYY",E={weekDays:u,months:a,years:e,year:"سنة",month:"شهر",week:t,day:"يوم",today:s,noEvent:A,allDay:d,deleteEvent:"حذف",createEvent:n,dateFormat:o};export{d as allDay,n as createEvent,o as dateFormat,r as day,E as default,l as deleteEvent,D as month,a as months,A as noEvent,s as today,t as week,u as weekDays,y as year,e as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/fa.es-b08cd112.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["دوشنبه","سه شنبه","چهار شنبه","پنج شنبه","جمعه","شنبه","یک شنبه"],a=["ژانویه","فوریه","مارس","آوریل","می","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],e="سالها",y="سال",r="ماه",C="هفته",A="روز",t="امروز",s="رویدادی نیست",d="تمام روز",E="حذف",n="ایجاد یک رویداد",o="dddd D MMMM YYYY",F={weekDays:u,months:a,years:e,year:"سال",month:"ماه",week:C,day:"روز",today:t,noEvent:s,allDay:d,deleteEvent:"حذف",createEvent:n,dateFormat:o};export{d as allDay,n as createEvent,o as dateFormat,A as day,F as default,E as deleteEvent,r as month,a as months,s as noEvent,t as today,C as week,u as weekDays,y as year,e as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/bn.es-3f8773a4.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি","রবি"],B=["জানুয়ারি","ফেব্ুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","অগাস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],D="বছর",s="বছর",F="মাস",C="সপ্তাহ",d="দিন",n="আজ",A="কার্যসূচী",a="সারাদিন",e="মুছুন",E="কার্যসূচী তৈরি করুন",t="dddd D MMMM YYYY",o={weekDays:u,months:B,years:"বছর",year:"বছর",month:"মাস",week:C,day:"দিন",today:"আজ",noEvent:A,allDay:a,deleteEvent:e,createEvent:E,dateFormat:t};export{a as allDay,E as createEvent,t as dateFormat,d as day,o as default,e as deleteEvent,F as month,B as months,A as noEvent,n as today,C as week,u as weekDays,s as year,D as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/tr.es-f57d7128.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const a=["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"],e=["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],t="Yıllar",m="Yıl",o="Ay",s="Hafta",d="Gün",n="Bugün",l="Etkinlik Yok",r="Tüm gün",k="Sil",u="Etkinlik ekle",y="dddd D MMMM YYYY",i={weekDays:a,months:e,years:t,year:"Yıl",month:"Ay",week:s,day:"Gün",today:n,noEvent:l,allDay:r,deleteEvent:"Sil",createEvent:u,dateFormat:y};export{r as allDay,u as createEvent,y as dateFormat,d as day,i as default,k as deleteEvent,o as month,e as months,l as noEvent,n as today,s as week,a as weekDays,m as year,t as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/bg.es-182cdcb3.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота","Неделя"],a=["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],e="Години",t="Година",s="Месец",D="Седмица",F="Ден",E="Днес",d="Няма събития",n="Цял ден",o="Изтрий",y="Създай събитие",A="dddd D MMMM YYYY",r={weekDays:u,months:a,years:e,year:t,month:s,week:D,day:"Ден",today:E,noEvent:d,allDay:n,deleteEvent:o,createEvent:y,dateFormat:A};export{n as allDay,y as createEvent,A as dateFormat,F as day,r as default,o as deleteEvent,s as month,a as months,d as noEvent,E as today,D as week,u as weekDays,t as year,e as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/cs.es-29e50c14.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota","Neděle"],a=["Leden","Únor","Březen","Duben","Květen","Červen","Červenec","Srpen","Září","Říjen","Listopad","Prosinec"],t="Roky",y="Rok",n="Měsíc",s="Týden",E="Den",o="Dnes",d="Bez událostí",D="Celý den",r="Odstranit",u="Vytvořit událost",x="dddd D. MMMM YYYY",l={weekDays:e,months:a,years:t,year:"Rok",month:n,week:s,day:"Den",today:o,noEvent:d,allDay:D,deleteEvent:r,createEvent:u,dateFormat:x};export{D as allDay,u as createEvent,x as dateFormat,E as day,l as default,r as deleteEvent,n as month,a as months,d as noEvent,o as today,s as week,e as weekDays,y as year,t as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/sl.es-886c86bd.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota","Nedelja"],a=["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],t="Leta",s="Leto",o="Mesec",d="Teden",m="Dan",r="Danes",n="Ni dogodkov",l="Cel dan",y="Odstrani",k="Ustvari dogodek",v="dddd MMMM D, YYYY",D={weekDays:e,months:a,years:t,year:s,month:o,week:d,day:"Dan",today:r,noEvent:n,allDay:l,deleteEvent:y,createEvent:k,dateFormat:v};export{l as allDay,k as createEvent,v as dateFormat,m as day,D as default,y as deleteEvent,o as month,a as months,n as noEvent,r as today,d as week,e as weekDays,s as year,t as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/sv.es-f0a285bd.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const a=["Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag","Söndag"],e=["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],y="År",x="År",s="Månad",t="Vecka",m="Dag",d="Idag",r="Ingen händelse",n="Heldag",o="Ta bort",g="Skapa händelse",l="dddd den D MMMM YYYY",E={weekDays:a,months:e,years:"År",year:"År",month:s,week:t,day:"Dag",today:d,noEvent:r,allDay:n,deleteEvent:o,createEvent:g,dateFormat:l};export{n as allDay,g as createEvent,l as dateFormat,m as day,E as default,o as deleteEvent,s as month,e as months,r as noEvent,d as today,t as week,a as weekDays,x as year,y as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/de.es-83841cfd.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"],a=["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],t="Jahre",n="Jahr",s="Monat",r="Woche",h="Tag",o="Heute",d="Keine Events",y="Ganztägig",g="Löschen",l="Event erstellen",m="dddd D MMMM YYYY",i={weekDays:e,months:a,years:t,year:n,month:s,week:r,day:"Tag",today:o,noEvent:d,allDay:y,deleteEvent:g,createEvent:l,dateFormat:m};export{y as allDay,l as createEvent,m as dateFormat,h as day,i as default,g as deleteEvent,s as month,a as months,d as noEvent,o as today,r as week,e as weekDays,n as year,t as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/en.es-d28ce695.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],a=["January","February","March","April","May","June","July","August","September","October","November","December"],t="Years",y="Year",s="Month",r="Week",v="Day",d="Today",n="No Event",o="All day",l="Delete",u="Create an event",m="dddd MMMM D{S}, YYYY",D={weekDays:e,months:a,years:t,year:y,month:s,week:r,day:"Day",today:d,noEvent:n,allDay:o,deleteEvent:l,createEvent:u,dateFormat:m};export{o as allDay,u as createEvent,m as dateFormat,v as day,D as default,l as deleteEvent,s as month,a as months,n as noEvent,d as today,r as week,e as weekDays,y as year,t as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/no.es-8b33619c.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag","Søndag"],a=["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],s="Velg år",y="År",t="Måned",m="Uke",M="Dag",r="Idag",d="Ingen hendelse",n="Hele dagen",o="Ta bort",g="Ny hendelse",l="dddd, D. MMMM YYYY",u={weekDays:e,months:a,years:s,year:"År",month:t,week:"Uke",day:"Dag",today:r,noEvent:d,allDay:n,deleteEvent:o,createEvent:g,dateFormat:l};export{n as allDay,g as createEvent,l as dateFormat,M as day,u as default,o as deleteEvent,t as month,a as months,d as noEvent,r as today,m as week,e as weekDays,y as year,s as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/sk.es-7894e5cb.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota","Nedeľa"],a=["Január","Február","Marec","Apríl","Máj","Jún","Júl","August","September","Október","November","December"],t="Roky",k="Rok",o="Mesiac",s="Týždeň",D="Deň",r="Dnes",d="Bez udalosti",n="Celý deň",u="Odstrániť",y="Vytvoriť udalosť",l="dddd D. MMMM YYYY",E={weekDays:e,months:a,years:t,year:"Rok",month:o,week:s,day:"Deň",today:r,noEvent:d,allDay:n,deleteEvent:u,createEvent:y,dateFormat:l};export{n as allDay,y as createEvent,l as dateFormat,D as day,E as default,u as deleteEvent,o as month,a as months,d as noEvent,r as today,s as week,e as weekDays,k as year,t as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/sr.es-f3348729.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const a=["Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota","Nedelja"],e=["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],t="Godine",r="Godina",s="Mesec",d="Sedmica",k="Dan",n="Danas",o="Nema događaja",l="Celi dan",y="Obriši",m="Kreiraj događaj",u="dddd D MMMM YYYY",v={weekDays:a,months:e,years:t,year:r,month:s,week:d,day:"Dan",today:n,noEvent:o,allDay:l,deleteEvent:y,createEvent:m,dateFormat:u};export{l as allDay,m as createEvent,u as dateFormat,k as day,v as default,y as deleteEvent,s as month,e as months,o as noEvent,n as today,d as week,a as weekDays,r as year,t as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/bs.es-47a220af.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const a=["Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota","Nedjelja"],e=["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],t="Godine",r="Godina",s="Mjesec",d="Sedmica",i="Dan",n="Danas",o="Nema događaja",l="Cijeli dan",y="Obriši",j="Kreiraj događaj",m="dddd D MMMM YYYY",u={weekDays:a,months:e,years:t,year:r,month:s,week:d,day:"Dan",today:n,noEvent:o,allDay:l,deleteEvent:y,createEvent:j,dateFormat:m};export{l as allDay,j as createEvent,m as dateFormat,i as day,u as default,y as deleteEvent,s as month,e as months,o as noEvent,n as today,d as week,a as weekDays,r as year,t as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/da.es-eecb0b06.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag","Søndag"],a=["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],t="År (flertal)",y="År",r="Måned",m="Uge",v="Dag",s="I dag",d="Ingen begivenhed",n="Hele dagen",g="Slet",o="Opret et event",l="dddd D MMMM YYYY",M={weekDays:e,months:a,years:t,year:"År",month:r,week:"Uge",day:"Dag",today:s,noEvent:d,allDay:n,deleteEvent:g,createEvent:o,dateFormat:l};export{n as allDay,o as createEvent,l as dateFormat,v as day,M as default,g as deleteEvent,r as month,a as months,d as noEvent,s as today,m as week,e as weekDays,y as year,t as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/id.es-3e6a36ce.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const a=["Senin","Selasa","Rabu","Kamis","Jumat","Sabtu","Minggu"],e=["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],t="Tahunan",n="Tahun",s="Bulan",r="Minggu",i="Hari",u="Hari Ini",d="Tidak Ada Kegiatan",o="Sepanjang Hari",m="Hapus",y="Tambah Kegiatan",l="dddd, D MMMM YYYY",b={weekDays:a,months:e,years:t,year:n,month:s,week:r,day:i,today:u,noEvent:d,allDay:o,deleteEvent:m,createEvent:y,dateFormat:l};export{o as allDay,y as createEvent,l as dateFormat,i as day,b as default,m as deleteEvent,s as month,e as months,d as noEvent,u as today,r as week,a as weekDays,n as year,t as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/es.es-232cf334.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Lunes","Martes","Miércoles","Jueves","Viernes","Sábado","Domingo"],a=["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],o="Años",l="Año",m="Mes",s="Semana",D="Día",E="Hoy",t="No hay evento",r="Todo el día",n="Borrar",d="Crear un evento",y="dddd D MMMM YYYY",i={weekDays:e,months:a,years:o,year:"Año",month:"Mes",week:s,day:"Día",today:"Hoy",noEvent:t,allDay:r,deleteEvent:n,createEvent:d,dateFormat:y};export{r as allDay,d as createEvent,y as dateFormat,D as day,i as default,n as deleteEvent,m as month,a as months,t as noEvent,E as today,s as week,e as weekDays,l as year,o as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/et.es-7e6a3380.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev","Pühapäev"],a=["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],s="Aastad",t="Aasta",l="Kuu",u="Nädal",d="Päev",r="Täna",n="Sündmus puudub",o="Terve päev",E="Kustuta",v="Loo sündmus",x="dddd D MMMM YYYY",m={weekDays:e,months:a,years:s,year:t,month:"Kuu",week:u,day:d,today:r,noEvent:n,allDay:o,deleteEvent:E,createEvent:v,dateFormat:x};export{o as allDay,v as createEvent,x as dateFormat,d as day,m as default,E as deleteEvent,l as month,a as months,n as noEvent,r as today,u as week,e as weekDays,t as year,s as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/fr.es-bb780d19.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"],a=["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],n="Années",r="Année",t="Mois",s="Semaine",d="Jour",o="Aujourd'hui",i="Aucun événement",m="Jour entier",u="Supprimer",E="Créer un événement",v="dddd D MMMM YYYY",y={weekDays:e,months:a,years:n,year:r,month:t,week:s,day:d,today:o,noEvent:i,allDay:m,deleteEvent:u,createEvent:E,dateFormat:v};export{m as allDay,E as createEvent,v as dateFormat,d as day,y as default,u as deleteEvent,t as month,a as months,i as noEvent,o as today,s as week,e as weekDays,r as year,n as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/mn.es-fcd02e46.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["Даваа","Мягмар","Лхавга","Пүрэв","Баасан","Бямба","Ням"],a=["1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар"],e="Жилүүд",F="Жил",r="Сар",t="Долоо хоног",s="Өдөр",E="Өнөөдөр",D="Тэмдэглэлгүй",d="Бүх өдөр",n="Устгах",o="Шинэ тэмдэглэл",y="dddd D MMMM YYYY",B={weekDays:u,months:a,years:e,year:"Жил",month:"Сар",week:t,day:s,today:E,noEvent:D,allDay:d,deleteEvent:n,createEvent:o,dateFormat:y};export{d as allDay,o as createEvent,y as dateFormat,s as day,B as default,n as deleteEvent,r as month,a as months,D as noEvent,E as today,t as week,u as weekDays,F as year,e as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/address-c3d46b29.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /publishable/build/assets/it.es-a9d8c123.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato","Domenica"],a=["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],t="Anni",o="Anno",n="Mese",s="Settimana",r="Giorno",d="Oggi",i="Nessun evento",l="Tutto il giorno",y="Cancella",m="Crea evento",v="dddd D MMMM YYYY",E={weekDays:e,months:a,years:t,year:o,month:n,week:s,day:r,today:d,noEvent:i,allDay:l,deleteEvent:y,createEvent:m,dateFormat:v};export{l as allDay,m as createEvent,v as dateFormat,r as day,E as default,y as deleteEvent,n as month,a as months,i as noEvent,d as today,s as week,e as weekDays,o as year,t as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/nl.es-558331c7.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const a=["Maandag","Dinsdag","Woensdag","Donderdag","Vrijdag","Zaterdag","Zondag"],e=["Januari","Februari","Maart","April","Mei","Juni","Juli","Augustus","September","Oktober","November","December"],n="Jaren",t="Jaar",r="Maand",s="Week",D="Dag",d="Vandaag",o="Geen afspraken",g="Hele dag",y="Verwijderen",i="Nieuwe afspraak aanmaken",l="dddd D MMMM YYYY",k={weekDays:a,months:e,years:n,year:t,month:r,week:s,day:"Dag",today:d,noEvent:o,allDay:g,deleteEvent:y,createEvent:i,dateFormat:l};export{g as allDay,i as createEvent,l as dateFormat,D as day,k as default,y as deleteEvent,r as month,e as months,o as noEvent,d as today,s as week,a as weekDays,t as year,n as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/ro.es-8080c341.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Luni","Marți","Miercuri","Joi","Vineri","Sâmbăta","Duminică"],a=["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],d="Ani",m="An",i="Lună",t="Săptămână",y="Zi",c="Azi",n="Nici o interacțiune",u="Toată ziua",r="Șterge",s="Adaugă un eveniment",o="dddd D MMMM YYYY",A={weekDays:e,months:a,years:"Ani",year:"An",month:i,week:t,day:"Zi",today:"Azi",noEvent:n,allDay:u,deleteEvent:r,createEvent:s,dateFormat:o};export{u as allDay,s as createEvent,o as dateFormat,y as day,A as default,r as deleteEvent,i as month,a as months,n as noEvent,c as today,t as week,e as weekDays,m as year,d as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/hr.es-fdafdc21.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const a=["Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota","Nedjelja"],e=["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],n="Godine",t="Godina",d="Mjesec",o="Tjedan",y="Dan",s="Današnji dan",j="Nema događaja",r="Cijeli dan",i="Obriši",l="Kreiraj događaj",u="dddd D MMMM YYYY",v={weekDays:a,months:e,years:n,year:t,month:d,week:o,day:"Dan",today:s,noEvent:j,allDay:r,deleteEvent:i,createEvent:l,dateFormat:u};export{r as allDay,l as createEvent,u as dateFormat,y as day,v as default,i as deleteEvent,d as month,e as months,j as noEvent,s as today,o as week,a as weekDays,t as year,n as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/hu.es-3630014a.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Hétfo","Kedd","Szerda","Csütörtök","Péntek","Szombat","Vasárnap"],a=["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],s="Évek",y="Év",t="Hónap",m="Hét",l="Nap",x="Mai nap",n="Nincs esemény",r="Egész nap",E="Esemény törlese",d="Esemény létrehozása",o="dddd D MMMM YYYY",u={weekDays:e,months:a,years:s,year:"Év",month:t,week:"Hét",day:"Nap",today:x,noEvent:n,allDay:r,deleteEvent:E,createEvent:d,dateFormat:o};export{r as allDay,d as createEvent,o as dateFormat,l as day,u as default,E as deleteEvent,t as month,a as months,n as noEvent,x as today,m as week,e as weekDays,y as year,s as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/is.es-a5785bf6.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const a=["Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur","Sunnudagur"],e=["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],g="Ár",y="Ár",r="Mánuður",t="Vika",x="Dagur",n="Í dag",s="Enginn atburður",u="Allan daginn",d="Eyða",F="Búðu til viðburð",E="dddd D MMMM YYYY",l={weekDays:a,months:e,years:"Ár",year:"Ár",month:r,week:t,day:x,today:n,noEvent:s,allDay:u,deleteEvent:d,createEvent:F,dateFormat:E};export{u as allDay,F as createEvent,E as dateFormat,x as day,l as default,d as deleteEvent,r as month,e as months,s as noEvent,n as today,t as week,a as weekDays,y as year,g as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/next-1-91bb148a.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /publishable/build/assets/pl.es-631374bd.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota","Niedziela"],a=["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],t="Lata",k="Rok",s="Miesiąc",i="Tydzień",d="Dzień",r="Dzisiaj",o="Brak wydarzeń",u="Cały dzień",y="Usuń",n="Utwórz wydarzenie",z="dddd, D MMMM YYYY",w={weekDays:e,months:a,years:t,year:"Rok",month:s,week:i,day:d,today:r,noEvent:o,allDay:u,deleteEvent:y,createEvent:n,dateFormat:z};export{u as allDay,n as createEvent,z as dateFormat,d as day,w as default,y as deleteEvent,s as month,a as months,o as noEvent,r as today,i as week,e as weekDays,k as year,t as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/ka.es-75616353.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი","კვირა"],D=["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],E="წლები",a="წელი",B="თვე",e="კვირა",r="დღე",t="დღეს",s="ღონისძიება არ არის",d="მთელი დღე",n="წაშლა",o="შექმენით ღონისძიება",y="dddd D MMMM YYYY",C={weekDays:u,months:D,years:E,year:a,month:"თვე",week:e,day:"დღე",today:t,noEvent:s,allDay:d,deleteEvent:n,createEvent:o,dateFormat:y};export{d as allDay,o as createEvent,y as dateFormat,r as day,C as default,n as deleteEvent,B as month,D as months,s as noEvent,t as today,e as week,u as weekDays,a as year,E as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/pt-br.es-a39b3c5f.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado","Domingo"],a=["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],o="Anos",y="Ano",v="Mês",t="Semana",D="Dia",r="Hoje",s="Sem eventos",n="Dia inteiro",i="Remover",d="Criar um evento",m="dddd D MMMM YYYY",E={weekDays:e,months:a,years:o,year:"Ano",month:"Mês",week:t,day:"Dia",today:r,noEvent:s,allDay:n,deleteEvent:i,createEvent:d,dateFormat:m};export{n as allDay,d as createEvent,m as dateFormat,D as day,E as default,i as deleteEvent,v as month,a as months,s as noEvent,r as today,t as week,e as weekDays,y as year,o as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/pt-pt.es-a39b3c5f.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado","Domingo"],a=["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],o="Anos",y="Ano",v="Mês",t="Semana",D="Dia",r="Hoje",s="Sem eventos",n="Dia inteiro",i="Remover",d="Criar um evento",m="dddd D MMMM YYYY",E={weekDays:e,months:a,years:o,year:"Ano",month:"Mês",week:t,day:"Dia",today:r,noEvent:s,allDay:n,deleteEvent:i,createEvent:d,dateFormat:m};export{n as allDay,d as createEvent,m as dateFormat,D as day,E as default,i as deleteEvent,v as month,a as months,s as noEvent,r as today,t as week,e as weekDays,y as year,o as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/total-orders-f1b2017e.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /publishable/build/assets/fi.es-d164093c.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const a=["Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai","Sunnuntai"],u=["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],e="Vuodet",t="Vuosi",s="Kuukausi",o="Viikko",i="Päivä",k="Tänään",n="Ei tapahtumia",E="Koko päivä",d="Poista tapahtuma",y="Luo tapahtuma",r="dddd, D MMMM YYYY",m={weekDays:a,months:u,years:e,year:t,month:s,week:o,day:i,today:k,noEvent:n,allDay:E,deleteEvent:d,createEvent:y,dateFormat:r};export{E as allDay,y as createEvent,r as dateFormat,i as day,m as default,d as deleteEvent,s as month,u as months,n as noEvent,k as today,o as week,a as weekDays,t as year,e as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/payment-method-10ea91e1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /publishable/build/assets/lt.es-fb2fe7b5.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const a=["Pirmadienis","Antradienis","Trečiadienis","Ketvirtadienis","Penktadienis","Šeštadienis","Sekmadienis"],e=["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],s="Metų pasirinkimas",i="Metai",t="Mėnesis",n="Savaitė",u="Diena",d="Šiandien",r="Jokių įvykių",o="Visa diena",y="Ištrinti",k="Sukurti įvykį",v="dddd, D MMMM YYYY",l={weekDays:a,months:e,years:s,year:i,month:t,week:n,day:u,today:d,noEvent:r,allDay:o,deleteEvent:y,createEvent:k,dateFormat:v};export{o as allDay,k as createEvent,v as dateFormat,u as day,l as default,y as deleteEvent,t as month,e as months,r as noEvent,d as today,n as week,a as weekDays,i as year,s as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/sq.es-600bc51c.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const a=["E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtunë","E Diel"],e=["Hë","Ma","Mr","Enj","Pr","Sh","D"],t=["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],r="Vitet",s="Viti",E="Muaji",n="Java",o="Dita",i="Sot",d="Nuk ka event",h="Tërë ditën",y="Fshijë",x="Krijo një event",B="dddd D MMMM YYYY",k={weekDays:a,weekDaysShort:e,months:t,years:r,year:s,month:E,week:n,day:o,today:"Sot",noEvent:d,allDay:h,deleteEvent:y,createEvent:x,dateFormat:B};export{h as allDay,x as createEvent,B as dateFormat,o as day,k as default,y as deleteEvent,E as month,t as months,d as noEvent,i as today,n as week,a as weekDays,e as weekDaysShort,s as year,r as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/ru.es-9e02a02e.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["Понедельник","Вторник","Среда","Четверг","Пятница","Суббота","Воскресенье"],a=["Пн","Вт","Ср","Чт","Пт","Сб","Вс"],e=["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],t="Годы",r="Год",s="Месяц",D="Неделя",E="День",C="Сегодня",o="Нет событий",y="Весь день",F="Удалить",d="Создать событие",n="dddd D MMMM YYYY",B={weekDays:u,weekDaysShort:a,months:e,years:t,year:"Год",month:s,week:D,day:E,today:C,noEvent:o,allDay:y,deleteEvent:F,createEvent:d,dateFormat:n};export{y as allDay,d as createEvent,n as dateFormat,E as day,B as default,F as deleteEvent,s as month,e as months,o as noEvent,C as today,D as week,u as weekDays,a as weekDaysShort,r as year,t as years}; 6 | -------------------------------------------------------------------------------- /src/Providers/ModuleServiceProvider.php: -------------------------------------------------------------------------------- 1 | 4 | * @license MIT 5 | */const a=["Thứ hai","Thứ ba","Thứ tư","Thứ năm","Thứ sáu","Thứ bảy","Chủ nhật"],E=["T2","T3","T4","T5","T6","T7","CN"],e=["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],o="Năm",n="Năm nay",h="Tháng",t="Tuần",T="Ngày",s="Hôm nay",x="NKhông có Event",u="Cả ngày",d="Xóa",y="Tạo event",g="dddd MMMM D YYYY",m={weekDays:a,weekDaysShort:E,months:e,years:"Năm",year:n,month:h,week:t,day:T,today:s,noEvent:x,allDay:u,deleteEvent:"Xóa",createEvent:y,dateFormat:g};export{u as allDay,y as createEvent,g as dateFormat,T as day,m as default,d as deleteEvent,h as month,e as months,x as noEvent,s as today,t as week,a as weekDays,E as weekDaysShort,n as year,o as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/uk.es-0afcf35e.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["Понеділок","Вівторок","Середа","Четвер","П'ятниця","Субота","Неділя"],a=["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],e=["Пн","Вт","Ср","Чт","Пт","Сб","Нд"],D="Роки",r="Рік",t="Місяць",s="Тиждень",E="День",C="Сьогодні",o="Немає подій",y="Весь день",F="Видалити",d="Створити подію",n="dddd D MMMM YYYY",l={weekDays:u,months:a,weekDaysShort:e,years:D,year:"Рік",month:t,week:s,day:E,today:C,noEvent:o,allDay:y,deleteEvent:F,createEvent:d,dateFormat:n};export{y as allDay,d as createEvent,n as dateFormat,E as day,l as default,F as deleteEvent,t as month,a as months,o as noEvent,C as today,s as week,u as weekDays,e as weekDaysShort,r as year,D as years}; 6 | -------------------------------------------------------------------------------- /publishable/build/assets/ca.es-47a49a5a.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const e=["Dilluns","Dimarts","Dimecres","Dijous","Divendres","Dissabte","Diumenge"],a=["Dl","Dt","Dc","Dj","Dv","Ds","Dg"],s=["Gener","Febrer","Març","Abril","Maig","Juny","Juliol","Agost","Setembre","Octubre","Novembre","Desembre"],t="Anys",m="Any",l="Mes",n="Setmana",v="Dia",r="Avui",D="No hi ha esdeveniments",o="Tot el dia",i="Eliminar",y="Crear un esdeveniment",d="dddd D MMMM YYYY",u={weekDays:e,weekDaysShort:a,months:s,years:t,year:"Any",month:"Mes",week:n,day:"Dia",today:r,noEvent:D,allDay:o,deleteEvent:i,createEvent:y,dateFormat:d};export{o as allDay,y as createEvent,d as dateFormat,v as day,u as default,i as deleteEvent,l as month,s as months,D as noEvent,r as today,n as week,e as weekDays,a as weekDaysShort,m as year,t as years}; 6 | -------------------------------------------------------------------------------- /src/Resources/views/shop/products/view/types/booking/default.blade.php: -------------------------------------------------------------------------------- 1 |
2 | @if ($bookingProduct->default_slot->duration) 3 |
4 | 5 | 6 |
7 |

8 | @lang('booking::app.shop.products.view.types.booking.slot-duration') : 9 |

10 | 11 |
12 | @lang('booking::app.shop.products.view.types.booking.slot-duration-in-minutes', ['minutes' => $bookingProduct->default_slot->duration]) 13 |
14 |
15 |
16 | @endif 17 | 18 | @include('booking::shop.products.view.types.booking.slots', ['bookingProduct' => $bookingProduct]) 19 |
-------------------------------------------------------------------------------- /src/Models/BookingProductDefaultSlot.php: -------------------------------------------------------------------------------- 1 | 'array']; 15 | 16 | protected $fillable = [ 17 | 'booking_type', 18 | 'duration', 19 | 'break_time', 20 | 'slots', 21 | 'booking_product_id', 22 | ]; 23 | 24 | /** 25 | * Get the product that owns the attribute value. 26 | */ 27 | public function booking_product() 28 | { 29 | return $this->belongsTo(BookingProductProxy::modelClass()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Database/Factories/BookingProductEventTicketFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->randomFloat(4, 3, 900), 23 | 'qty' => $this->faker->numberBetween(100, 1000), 24 | 'booking_product_id' => BookingProduct::factory(), 25 | ]; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /publishable/build/assets/invoice-bbc6d6a8.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ["./src/Resources/**/*.blade.php"], 4 | 5 | theme: { 6 | container: { 7 | center: true, 8 | 9 | screens: { 10 | "2xl": "1920px", 11 | }, 12 | 13 | padding: { 14 | DEFAULT: "16px", 15 | }, 16 | }, 17 | 18 | screens: { 19 | sm: "525px", 20 | md: "768px", 21 | lg: "1024px", 22 | xl: "1240px", 23 | "2xl": "1920px", 24 | }, 25 | 26 | extend: { 27 | colors: { 28 | darkGreen: '#40994A', 29 | darkBlue: '#0044F2', 30 | darkPink: '#F85156', 31 | }, 32 | 33 | fontFamily: { 34 | inter: ['Inter'], 35 | icon: ['icomoon'] 36 | } 37 | }, 38 | }, 39 | 40 | darkMode: 'class', 41 | 42 | plugins: [], 43 | }; 44 | -------------------------------------------------------------------------------- /publishable/build/assets/el.es-b1c0d142.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */const u=["Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο","Κυριακή"],B=["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],C=["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"],y="Έτη",F="Έτος",A="Μήνα",a="Εβδομάδα",e="Ημέρα",D="Σήμερα",t="Κανένα συμβάν",s="Ημερήσιο συμβάν",n="Διαγραφή",o="Δημιουργία συμβάντος",d="dddd D MMMMG YYYY",E="π.μ.",m="μ.μ.",r={weekDays:u,months:B,monthsGenitive:C,years:"Έτη",year:F,month:A,week:a,day:e,today:D,noEvent:t,allDay:s,deleteEvent:n,createEvent:o,dateFormat:d,am:E,pm:m};export{s as allDay,E as am,o as createEvent,d as dateFormat,e as day,r as default,n as deleteEvent,A as month,B as months,C as monthsGenitive,t as noEvent,m as pm,D as today,a as week,u as weekDays,F as year,y as years}; 6 | -------------------------------------------------------------------------------- /src/Database/Factories/BookingProductFactory.php: -------------------------------------------------------------------------------- 1 | $bookingTypes[array_rand(['event'])], 26 | 'qty' => $this->faker->randomNumber(2), 27 | 'available_from' => Carbon::yesterday(), 28 | 'available_to' => Carbon::tomorrow(), 29 | 'product_id' => Product::factory(['type' => 'booking']), 30 | ]; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /publishable/build/assets/shipping-ceb1cb37.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/Models/Booking.php: -------------------------------------------------------------------------------- 1 | belongsTo(OrderProxy::modelClass()); 30 | } 31 | 32 | /** 33 | * Get the child item record associated with the order item. 34 | */ 35 | public function order_item() 36 | { 37 | return $this->hasOne(OrderItemProxy::modelClass()); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /publishable/build/assets/zoom-0c75bed3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/Helpers/TableSlot.php: -------------------------------------------------------------------------------- 1 | bookingProductRepository->findOneByField('product_id', $cartItem['product_id']); 15 | 16 | $bookedQty = $this->getBookedQuantity($cartItem); 17 | 18 | $tableSlot = $bookingProduct->table_slot; 19 | 20 | $requestedQty = $cartItem['quantity']; 21 | 22 | if ($tableSlot->price_type == 'table') { 23 | $requestedQty *= $tableSlot->guest_limit; 24 | $bookedQty *= $tableSlot->guest_limit; 25 | } 26 | 27 | if ( 28 | $bookingProduct->qty - $bookedQty < $requestedQty 29 | || $this->isSlotExpired($cartItem) 30 | ) { 31 | return false; 32 | } 33 | 34 | return true; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /publishable/build/assets/unpaid-invoices-6c51662d.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/Resources/views/components/form/index.blade.php: -------------------------------------------------------------------------------- 1 | {{-- 2 | If a component has the `as` attribute, it indicates that it uses 3 | the ajaxified form or some customized slot form. 4 | --}} 5 | @if ($attributes->has('as')) 6 | 7 | {{ $slot }} 8 | 9 | 10 | {{-- 11 | Otherwise, a traditional form will be provided with a minimal 12 | set of configurations. 13 | --}} 14 | @else 15 | @props([ 16 | 'method' => 'POST', 17 | ]) 18 | 19 | @php 20 | $method = strtoupper($method); 21 | @endphp 22 | 23 | 29 | @unless(in_array($method, ['HEAD', 'GET', 'OPTIONS'])) 30 | @csrf 31 | @endunless 32 | 33 | @if (! in_array($method, ['GET', 'POST'])) 34 | @method($method) 35 | @endif 36 | 37 | {{ $slot }} 38 | 39 | @endif -------------------------------------------------------------------------------- /src/Console/Commands/Booking.php: -------------------------------------------------------------------------------- 1 | info('Step: Running database migrations...'); 29 | $this->call('migrate'); 30 | 31 | $this->info('Step: Clearing cached optimization files...'); 32 | $this->call('optimize:clear'); 33 | 34 | $this->info('Step: Publishing vendor assets...'); 35 | $this->call('vendor:publish', [ 36 | '--provider' => \Webkul\BookingProduct\Providers\BookingProductServiceProvider::class, 37 | ]); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/Models/BookingProductEventTicket.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('booking_type'); 19 | $table->integer('duration')->nullable(); 20 | $table->integer('break_time')->nullable(); 21 | $table->json('slots')->nullable(); 22 | 23 | $table->integer('booking_product_id')->unsigned(); 24 | $table->foreign('booking_product_id')->references('id')->on('booking_products')->onDelete('cascade'); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('booking_product_default_slots'); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /publishable/build/assets/total-sales-5b2c7b58.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /publishable/build/assets/store-information-a7d64429.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/Database/Migrations/2019_07_05_154429_create_booking_product_appointment_slots_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->integer('duration')->nullable(); 19 | $table->integer('break_time')->nullable(); 20 | $table->boolean('same_slot_all_days')->nullable(); 21 | $table->json('slots')->nullable(); 22 | 23 | $table->integer('booking_product_id')->unsigned(); 24 | $table->foreign('booking_product_id')->references('id')->on('booking_products')->onDelete('cascade'); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('booking_product_appointment_slots'); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /src/Database/Migrations/2019_07_05_154451_create_booking_product_rental_slots_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('renting_type'); 19 | $table->decimal('daily_price', 12, 4)->default(0)->nullable(); 20 | $table->decimal('hourly_price', 12, 4)->default(0)->nullable(); 21 | $table->boolean('same_slot_all_days')->nullable(); 22 | $table->json('slots')->nullable(); 23 | 24 | $table->integer('booking_product_id')->unsigned(); 25 | $table->foreign('booking_product_id')->references('id')->on('booking_products')->onDelete('cascade'); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | * 32 | * @return void 33 | */ 34 | public function down() 35 | { 36 | Schema::dropIfExists('booking_product_rental_slots'); 37 | } 38 | }; 39 | -------------------------------------------------------------------------------- /src/Database/Migrations/2019_07_05_154440_create_booking_product_event_tickets_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->decimal('price', 12, 4)->default(0)->nullable(); 19 | $table->integer('qty')->default(0)->nullable(); 20 | 21 | $table->decimal('special_price', 12, 4)->nullable(); 22 | $table->dateTime('special_price_from')->nullable(); 23 | $table->dateTime('special_price_to')->nullable(); 24 | 25 | $table->integer('booking_product_id')->unsigned(); 26 | $table->foreign('booking_product_id')->references('id')->on('booking_products')->onDelete('cascade'); 27 | }); 28 | } 29 | 30 | /** 31 | * Reverse the migrations. 32 | * 33 | * @return void 34 | */ 35 | public function down() 36 | { 37 | Schema::dropIfExists('booking_product_event_tickets'); 38 | } 39 | }; 40 | -------------------------------------------------------------------------------- /publishable/build/assets/use-cases-4a33de1a.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig, loadEnv } from "vite"; 2 | import vue from '@vitejs/plugin-vue' 3 | import laravel from "laravel-vite-plugin"; 4 | import path from "path"; 5 | 6 | export default defineConfig(({ mode }) => { 7 | const envDir = "../../../"; 8 | 9 | Object.assign(process.env, loadEnv(mode, envDir)); 10 | 11 | return { 12 | build: { 13 | emptyOutDir: true, 14 | }, 15 | 16 | envDir, 17 | 18 | server: { 19 | host: process.env.VITE_HOST || "localhost", 20 | port: process.env.VITE_PORT || 5173, 21 | }, 22 | 23 | plugins: [ 24 | vue(), 25 | 26 | laravel({ 27 | hotFile: "../../../public/booking-vite.hot", 28 | publicDirectory: "publishable", 29 | input: [ 30 | "src/Resources/assets/css/app.css", 31 | "src/Resources/assets/js/app.js", 32 | ], 33 | refresh: true, 34 | }), 35 | ], 36 | 37 | experimental: { 38 | renderBuiltUrl(filename, { hostId, hostType, type }) { 39 | if (hostType === "css") { 40 | return path.basename(filename); 41 | } 42 | }, 43 | }, 44 | }; 45 | }); -------------------------------------------------------------------------------- /src/Database/Migrations/2019_07_05_154502_create_booking_product_table_slots_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('price_type'); 19 | $table->integer('guest_limit')->default(0); 20 | $table->integer('duration'); 21 | $table->integer('break_time'); 22 | $table->integer('prevent_scheduling_before'); 23 | $table->boolean('same_slot_all_days')->nullable(); 24 | $table->json('slots')->nullable(); 25 | 26 | $table->integer('booking_product_id')->unsigned(); 27 | $table->foreign('booking_product_id')->references('id')->on('booking_products')->onDelete('cascade'); 28 | }); 29 | } 30 | 31 | /** 32 | * Reverse the migrations. 33 | * 34 | * @return void 35 | */ 36 | public function down() 37 | { 38 | Schema::dropIfExists('booking_product_table_slots'); 39 | } 40 | }; 41 | -------------------------------------------------------------------------------- /src/Database/Migrations/2019_07_02_180307_create_booking_products_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('type'); 19 | $table->integer('qty')->default(0)->nullable(); 20 | $table->string('location')->nullable(); 21 | $table->boolean('show_location')->default(0); 22 | $table->boolean('available_every_week')->nullable(); 23 | $table->datetime('available_from')->nullable(); 24 | $table->datetime('available_to')->nullable(); 25 | 26 | $table->integer('product_id')->unsigned(); 27 | $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); 28 | $table->timestamps(); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('booking_products'); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /src/Database/Migrations/2020_02_21_121201_create_booking_product_event_ticket_translations_table.php: -------------------------------------------------------------------------------- 1 | bigIncrements('id'); 18 | $table->string('locale'); 19 | $table->text('name')->nullable(); 20 | $table->text('description')->nullable(); 21 | $table->integer('booking_product_event_ticket_id')->unsigned(); 22 | $table->unique(['booking_product_event_ticket_id', 'locale'], 'booking_product_event_ticket_translations_locale_unique'); 23 | $table->foreign('booking_product_event_ticket_id', 'booking_product_event_ticket_translations_locale_foreign')->references('id')->on('booking_product_event_tickets')->onDelete('cascade'); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('booking_product_event_ticket_translations'); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /publishable/build/assets/theme-f4d870b8.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/Database/Migrations/2020_02_18_165639_create_bookings_table.php: -------------------------------------------------------------------------------- 1 | bigIncrements('id'); 18 | $table->integer('qty')->default(0)->nullable(); 19 | $table->integer('from')->nullable(); 20 | $table->integer('to')->nullable(); 21 | 22 | $table->integer('order_item_id')->unsigned()->nullable(); 23 | 24 | $table->integer('booking_product_event_ticket_id')->unsigned()->nullable(); 25 | 26 | $table->integer('order_id')->unsigned()->nullable(); 27 | $table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade'); 28 | 29 | $table->integer('product_id')->unsigned()->nullable(); 30 | $table->foreign('product_id')->references('id')->on('products')->onDelete('set null'); 31 | }); 32 | } 33 | 34 | /** 35 | * Reverse the migrations. 36 | * 37 | * @return void 38 | */ 39 | public function down() 40 | { 41 | Schema::dropIfExists('bookings'); 42 | } 43 | }; 44 | -------------------------------------------------------------------------------- /publishable/build/assets/icon-options-ebfcd268.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /publishable/build/assets/order-c8714dda.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/Resources/views/admin/catalog/products/edit/types/booking/empty-info.blade.php: -------------------------------------------------------------------------------- 1 | @pushOnce('scripts') 2 | 33 | 34 | 41 | @endpushOnce -------------------------------------------------------------------------------- /publishable/build/assets/checkout-e5efdb8e.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Booking-product 2 | 3 |

Booking Product API facilitates seamless integration with the Booking Product functionality within your Bagisto system. It provides endpoints and methods to interact with and harness the capabilities of a comprehensive booking system, enabling smooth communication and utilization of booking-related features in your applications.

4 | 5 | ### Requirements: 6 | 7 | - **Bagisto**: v2.2.x 8 | 9 | ### Installation: 10 | 11 | To install the Booking Product Extension, follow these steps: 12 | 13 | ##### 1. Unzip the respective extension zip and then merge "packages/Webkul" folders into project root directory. 14 | 15 | ##### 2. Open the composer.json file and add the following line under the 'psr-4' section: 16 | 17 | ~~~ 18 | "Webkul\\BookingProduct\\": "packages/Webkul/BookingProduct/src" 19 | ~~~ 20 | 21 | ##### 3. In the config/app.php file, add the following line under the 'providers' section: 22 | 23 | ~~~ 24 | Webkul\BookingProduct\Providers\BookingProductServiceProvider::class, 25 | ~~~ 26 | 27 | ##### 4. In the config/bagisto-vite.php file, add the following line under the 'viters' section: 28 | 29 | ~~~ 30 | 'booking' => [ 31 | 'hot_file' => 'booking-vite.hot', 32 | 'build_directory' => 'themes/booking/build', 33 | 'package_assets_directory' => 'src/Resources/assets', 34 | ], 35 | ~~~ 36 | 37 | ##### 5. Run the following commands to complete the setup: 38 | 39 | ~~~ 40 | composer dump-autoload 41 | ~~~ 42 | 43 | ~~~ 44 | php artisan booking-product:install 45 | ~~~ 46 | 47 | After following these steps, the Booking Product Extension should be successfully installed and ready for use in your Bagisto v2.1.x project. 48 | -------------------------------------------------------------------------------- /src/Resources/views/components/flat-picker/time.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{ $slot }} 3 | 4 | 5 | @pushOnce('scripts') 6 | 13 | 14 | 56 | @endPushOnce 57 | -------------------------------------------------------------------------------- /publishable/build/assets/inventory-d69907d8.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/Http/Controllers/Shop/BookingProductController.php: -------------------------------------------------------------------------------- 1 | bookingHelpers = [ 32 | 'default' => $this->defaultSlotHelper, 33 | 'appointment' => $this->appointmentSlotHelper, 34 | 'rental' => $this->rentalSlotHelper, 35 | 'event' => $this->eventTicketHelper, 36 | 'table' => $this->tableSlotHelper, 37 | ]; 38 | } 39 | 40 | /** 41 | * Get available slots for the given product and the date. 42 | */ 43 | public function index(int $id): JsonResource 44 | { 45 | $bookingProduct = $this->bookingProductRepository->find($id); 46 | 47 | return new JsonResource([ 48 | 'data' => $this->bookingHelpers[$bookingProduct->type]->getSlotsByDate($bookingProduct, request()->date), 49 | ]); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/Resources/assets/css/app.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @font-face { 6 | font-family: "booking"; 7 | src: url("../fonts/booking.woff") format("woff"); 8 | font-weight: bold; 9 | font-style: normal; 10 | font-display: block; 11 | } 12 | 13 | @layer components { 14 | [class^="icon-"], 15 | [class*=" icon-"] { 16 | /* use !important to prevent issues with browser extensions that change fonts */ 17 | font-family: "booking" !important; 18 | speak: never; 19 | font-style: normal; 20 | font-weight: normal; 21 | font-variant: normal; 22 | text-transform: none; 23 | line-height: 1; 24 | color: #6b7280; 25 | 26 | /* Better Font Rendering =========== */ 27 | -webkit-font-smoothing: antialiased; 28 | -moz-osx-font-smoothing: grayscale; 29 | line-height: 1 !important; 30 | } 31 | 32 | html.dark [class^="icon-"], 33 | html.dark [class*=" icon-"] { 34 | color: #d1d5db; 35 | } 36 | 37 | .icon-phone-number:before { 38 | content: "\e955"; 39 | } 40 | 41 | .icon-list:before { 42 | content: "\e953"; 43 | } 44 | .icon-clock:before { 45 | content: "\e952"; 46 | } 47 | 48 | .primary-button { 49 | @apply flex gap-x-1 items-center px-3 py-1.5 bg-blue-600 border border-blue-700 rounded-md text-gray-50 font-semibold cursor-pointer transition-all hover:opacity-[0.9] focus:opacity-[0.9]; 50 | } 51 | } 52 | 53 | .ltr\:pl-\[286px\]:where([dir="ltr"], [dir="ltr"] *) { 54 | padding-left: 286px; 55 | } 56 | .sidebar-collapsed 57 | .group-\[\.sidebar-collapsed\]\/container\:ltr\:pl-\[85px\]:where( 58 | [dir="ltr"], 59 | [dir="ltr"] * 60 | ) { 61 | padding-left: 85px !important; 62 | } 63 | .ltr\:pl-\[286px\]:where([dir="rtl"], [dir="rtl"] *) { 64 | padding-right: 286px; 65 | } 66 | .sidebar-collapsed 67 | .group-\[\.sidebar-collapsed\]\/container\:ltr\:pl-\[85px\]:where( 68 | [dir="rtl"], 69 | [dir="rtl"] * 70 | ) { 71 | padding-right: 85px !important; 72 | } -------------------------------------------------------------------------------- /publishable/build/assets/magic-ai-2b88cb86.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/Providers/EventServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 19 | 'Webkul\BookingProduct\Listeners\Order@afterPlaceOrder', 20 | ], 21 | ]; 22 | 23 | /** 24 | * Bootstrap services. 25 | * 26 | * @return void 27 | */ 28 | public function boot() 29 | { 30 | parent::boot(); 31 | 32 | /** 33 | * Styles loading. 34 | */ 35 | Event::listen('bagisto.admin.layout.head', function ($viewRenderEventManager) { 36 | $viewRenderEventManager->addTemplate('booking::components.layouts.style'); 37 | }); 38 | 39 | Event::listen('bagisto.admin.catalog.product.edit.form.videos.after', static function (ViewRenderEventManager $viewRenderEventManager) { 40 | if (View::exists('booking::admin.catalog.products.edit.types.booking')) { 41 | $viewRenderEventManager->addTemplate('booking::admin.catalog.products.edit.types.booking'); 42 | } 43 | }); 44 | 45 | Event::listen('bagisto.shop.products.short_description.after', static function (ViewRenderEventManager $viewRenderEventManager) { 46 | if (View::exists('booking::shop.products.view.types.booking')) { 47 | $viewRenderEventManager->addTemplate('booking::shop.products.view.types.booking'); 48 | } 49 | }); 50 | 51 | Event::listen('bagisto.admin.catalog.product.edit.form.inventories.controls.before', static function (ViewRenderEventManager $viewRenderEventManager) { 52 | if (View::exists('booking::admin.catalog.products.edit.inventories')) { 53 | $viewRenderEventManager->addTemplate('booking::admin.catalog.products.edit.inventories'); 54 | } 55 | }); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /publishable/build/assets/orders-5dd62d9d.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/Resources/views/shop/products/view/types/booking.blade.php: -------------------------------------------------------------------------------- 1 | @if ( 2 | $product->type == 'booking' 3 | && $bookingProduct = app('\Webkul\BookingProduct\Repositories\BookingProductRepository')->findOneByField('product_id', $product->id) 4 | ) 5 | 6 | 7 | 8 | @pushOnce('scripts') 9 | 43 | 44 | 50 | @endpushOnce 51 | @endif 52 | -------------------------------------------------------------------------------- /src/Http/Controllers/Admin/BookingController.php: -------------------------------------------------------------------------------- 1 | ajax()) { 27 | return app(BookingDataGrid::class)->toJson(); 28 | } 29 | 30 | return view('booking::admin.sales.bookings.index'); 31 | } 32 | 33 | /** 34 | * Returns a listing of the resource. 35 | * 36 | * @return \Illuminate\Http\Response 37 | */ 38 | public function get() 39 | { 40 | if (! request('view_type')) { 41 | return app(BookingDataGrid::class)->toJson(); 42 | } 43 | 44 | $startDate = request()->get('startDate') 45 | ? Carbon::createFromTimeString(request()->get('startDate').' 00:00:01') 46 | : Carbon::now()->startOfWeek()->format('Y-m-d H:i:s'); 47 | 48 | $endDate = request()->get('endDate') 49 | ? Carbon::createFromTimeString(request()->get('endDate').' 23:59:59') 50 | : Carbon::now()->endOfWeek()->format('Y-m-d H:i:s'); 51 | 52 | $bookings = $this->bookingRepository->getBookings([strtotime($startDate), strtotime($endDate)]) 53 | ->map(function ($booking) { 54 | $booking['start'] = Carbon::createFromTimestamp($booking->start)->format('Y-m-d h:i A'); 55 | 56 | $booking['end'] = Carbon::createFromTimestamp($booking->end)->format('Y-m-d h:i A'); 57 | 58 | $booking->total = core()->formatBasePrice($booking->total); 59 | 60 | return $booking; 61 | }); 62 | 63 | return response()->json([ 64 | 'bookings' => $bookings, 65 | ]); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /publishable/build/assets/report-empty-c3bb4a01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/Providers/BookingProductServiceProvider.php: -------------------------------------------------------------------------------- 1 | loadRoutesFrom(__DIR__.'/../Routes/web.php'); 19 | 20 | $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations'); 21 | 22 | $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'booking'); 23 | 24 | $this->loadViewsFrom(__DIR__.'/../Resources/views', 'booking'); 25 | 26 | Blade::anonymousComponentPath(__DIR__.'/../Resources/views/components', 'booking'); 27 | 28 | $this->app->bind(BaseProductDataGrid::class, ProductDataGrid::class); 29 | 30 | $this->app->register(EventServiceProvider::class); 31 | 32 | $this->app->register(ModuleServiceProvider::class); 33 | 34 | $this->publishAssets(); 35 | } 36 | 37 | /** 38 | * Register services. 39 | */ 40 | public function register(): void 41 | { 42 | $this->registerCommands(); 43 | 44 | $this->mergeConfigFrom( 45 | dirname(__DIR__).'/Config/product_types.php', 46 | 'product_types' 47 | ); 48 | 49 | $this->mergeConfigFrom( 50 | dirname(__DIR__).'/Config/menu.php', 51 | 'menu.admin' 52 | ); 53 | } 54 | 55 | /** 56 | * Register the Booking Product Command of this package. 57 | */ 58 | protected function registerCommands(): void 59 | { 60 | if ($this->app->runningInConsole()) { 61 | $this->commands([ 62 | BookingCommand::class, 63 | ]); 64 | } 65 | } 66 | 67 | /** 68 | * publishing Assets. 69 | */ 70 | protected function publishAssets(): void 71 | { 72 | $this->publishes([ 73 | __DIR__.'/../../publishable/build' => public_path('themes/booking/build'), 74 | ], 'public'); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /publishable/build/assets/customers-57f8166b.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /publishable/build/assets/store-8d27c0df.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /publishable/build/assets/size-04e2a252.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/Resources/views/components/flat-picker/datetime.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{ $slot }} 3 | 4 | 5 | @pushOnce('scripts') 6 | 13 | 14 | 80 | @endPushOnce 81 | -------------------------------------------------------------------------------- /publishable/build/assets/product-357134fb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /publishable/build/assets/icon-discount-e37d1aed.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Repositories/BookingProductEventTicketRepository.php: -------------------------------------------------------------------------------- 1 | $data, 'bookingProduct' => $bookingProduct]); 28 | 29 | $previousTicketIds = $bookingProduct->event_tickets()->pluck('id'); 30 | 31 | if (isset($data['tickets'])) { 32 | foreach ($data['tickets'] as $ticketId => &$ticketInputs) { 33 | $this->sanitizeInput('special_price', $ticketInputs); 34 | 35 | $this->sanitizeInput('special_price_from', $ticketInputs); 36 | 37 | $this->sanitizeInput('special_price_to', $ticketInputs); 38 | 39 | if (Str::contains($ticketId, 'ticket_')) { 40 | $ticket = $this->create(array_merge([ 41 | 'booking_product_id' => $bookingProduct->id, 42 | ], $ticketInputs)); 43 | } else { 44 | if (is_numeric($index = $previousTicketIds->search($ticketId))) { 45 | $previousTicketIds->forget($index); 46 | } 47 | 48 | $ticket = $this->update($ticketInputs, $ticketId); 49 | } 50 | 51 | $savedTickets[$ticketId]['ticket'] = $ticket; 52 | 53 | $savedTickets[$ticketId]['ticketInputs'] = $ticketInputs; 54 | } 55 | 56 | Event::dispatch('booking_product.booking.event-ticket.save.after', ['tickets' => $savedTickets]); 57 | } 58 | 59 | foreach ($previousTicketIds as $previousTicketId) { 60 | $this->delete($previousTicketId); 61 | } 62 | } 63 | 64 | // Function to sanitize the inputs 65 | private function sanitizeInput($fieldName, &$inputs) 66 | { 67 | $fieldValue = $inputs[$fieldName] ?? null; 68 | 69 | if ( 70 | ! isset($fieldValue) 71 | || empty($fieldValue) 72 | || $fieldValue === '0.0000' 73 | || $fieldValue === '0000-00-00 00:00:00' 74 | ) { 75 | $inputs[$fieldName] = null; 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/Resources/views/admin/sales/bookings/index.blade.php: -------------------------------------------------------------------------------- 1 | @push('styles') 2 | @bagistoVite([ 3 | 'src/Resources/assets/css/app.css', 4 | 'src/Resources/assets/js/app.js' 5 | ], 'booking') 6 | @endpush 7 | 8 | 9 | 10 | 11 | @lang('booking::app.admin.sales.bookings.index.title') 12 | 13 | 14 | 15 | 16 | @pushOnce('scripts') 17 | 59 | 60 | 71 | @endPushOnce 72 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG for v1.x.x 2 | 3 | This changelog consists of the bug & security fixes and new features being included in the releases listed below. 4 | 5 | ## **v1.1.0 (16th of September 2024)** - *Release* 6 | 7 | ### **Code Quality Improvements:** 8 | Enhanced code structure and optimized performance for better maintainability and efficiency. 9 | 10 | ### **Product Quantity System:** 11 | 12 | Updated the product quantity management system for more accurate and reliable inventory tracking. 13 | 14 | ### **UI Enhancements:** 15 | 16 | Refined the user interface for improved usability and a more seamless user experience. 17 | 18 | 19 | ## **v1.0.0 (13th of September 2024)** - *Release* 20 | 21 | * #2 [Fixed] - Update Readme file -> Remove Storage folder details. 22 | 23 | * #4 [Fixed] - Default Booking -> Slots adding in One Booking for many -> Cross Icon is having UI issue. 24 | 25 | * #7 [Fixed] - Please add complete translation in the Default Booking Slots Type. 26 | 27 | * #8 [Fixed] - Slot Delete warning message should appear for all booking types. 28 | 29 | * #9 [Fixed] - Unable to Delete the Default Booking Product - Many For One Booking slots. 30 | 31 | * #12 [Fixed] - Date saving issue is appearing in Default Booking Product - One For Many. 32 | 33 | * #14 [Fixed] - Unable to edit the slots in the Appointment Booking which are already created. 34 | 35 | * #15 [Fixed] - We are able to save the time slots with empty entries. 36 | 37 | * #29 [Fixed] - Update Readme. 38 | 39 | * #32 [Fixed] - Shop Front -> View on Map button is having UI issue. 40 | 41 | * #33 [Fixed] - After saving the details in Default booking there it was found that the Date From time format is not appropriate. 42 | 43 | * #35 [Fixed] - We are unable to add multiple slots in default booking for the One for Many Bookings. 44 | 45 | * #36 [Fixed] - Default Booking -> Many For One bookings -> Correct Spelling for Unavailable Slots. 46 | 47 | * #43 [Fixed] - Unable to See the booking information in Admin End Grid View. 48 | 49 | * #44 [Fixed] - After saving default booking without slots and then again editing them and adding slots we are getting console errors. 50 | 51 | * #45 [Fixed] - Appointment Booking -> Same Slot For All days -> Unable to see slots in front end. 52 | 53 | * #46 [Fixed] - Event Booking -> Tickets Valid from and to Dates are not working. Unable to enter the dates. 54 | 55 | * #47 [Fixed] - Event Booking after saving the details and again editing it, we are unable to see the Event Dates in Admin End. 56 | 57 | * #49 [Fixed] - Event Booking -> We should not be selecting dates of tickets outside the Event Date. 58 | 59 | * #50 [Fixed] - Ticket Special Price Entry is not visible when we check the ticket details in edit section. 60 | 61 | * #68 [Fixed] - In Booking Product Module we are unable to see cross sell, up sell and related product details. 62 | 63 | * #76 [Fixed] - Default Booking - One Booking for Many Days -> Unable to save multuiple slots in same day. 64 | 65 | * #80 [Fixed] - Unable to checkout Booking Products, Exceptional Error appearing. 66 | -------------------------------------------------------------------------------- /src/Models/BookingProduct.php: -------------------------------------------------------------------------------- 1 | 'datetime', 37 | 'available_to' => 'datetime', 38 | ]; 39 | 40 | /** 41 | * The Product Default Booking that belong to the product booking. 42 | */ 43 | public function default_slot(): \Illuminate\Database\Eloquent\Relations\HasOne 44 | { 45 | return $this->hasOne(BookingProductDefaultSlotProxy::modelClass()); 46 | } 47 | 48 | /** 49 | * The Product Appointment Booking that belong to the product booking. 50 | */ 51 | public function appointment_slot(): \Illuminate\Database\Eloquent\Relations\HasOne 52 | { 53 | return $this->hasOne(BookingProductAppointmentSlotProxy::modelClass()); 54 | } 55 | 56 | /** 57 | * The Product Event Booking that belong to the product booking. 58 | */ 59 | public function event_tickets(): \Illuminate\Database\Eloquent\Relations\HasMany 60 | { 61 | return $this->hasMany(BookingProductEventTicketProxy::modelClass()); 62 | } 63 | 64 | /** 65 | * The Product Rental Booking that belong to the product booking. 66 | */ 67 | public function rental_slot(): \Illuminate\Database\Eloquent\Relations\HasOne 68 | { 69 | return $this->hasOne(BookingProductRentalSlotProxy::modelClass()); 70 | } 71 | 72 | /** 73 | * The Product Table Booking that belong to the product booking. 74 | */ 75 | public function table_slot(): \Illuminate\Database\Eloquent\Relations\HasOne 76 | { 77 | return $this->hasOne(BookingProductTableSlotProxy::modelClass()); 78 | } 79 | 80 | /** 81 | * Create a new factory instance for the model. 82 | */ 83 | protected static function newFactory(): Factory 84 | { 85 | return BookingProductFactory::new(); 86 | } 87 | 88 | /** 89 | * The Product belong to the product booking. 90 | */ 91 | public function product(): \Illuminate\Database\Eloquent\Relations\BelongsTo 92 | { 93 | return $this->belongsTo(ProductProxy::modelClass()); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /src/Resources/views/components/form/control-group/control.blade.php: -------------------------------------------------------------------------------- 1 | @props([ 2 | 'type' => 'text', 3 | 'name' => '', 4 | ]) 5 | 6 | @switch($type) 7 | @case('hidden') 8 | only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} 12 | > 13 | except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'flex w-full min-h-[39px] py-2 px-3 border rounded-md text-sm text-gray-600 dark:text-gray-300 transition-all hover:border-gray-400 dark:hover:border-gray-400 dark:hover:border-gray-400 focus:border-gray-400 dark:focus:border-gray-400 dark:focus:border-gray-400 dark:bg-gray-900 dark:border-gray-800']) }} 19 | > 20 | 21 | 22 | @break 23 | @case('datetime') 24 | only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} 28 | > 29 | 30 | except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'flex w-full min-h-[39px] py-2 px-3 border rounded-md text-sm text-gray-600 dark:text-gray-300 transition-all hover:border-gray-400 dark:hover:border-gray-400 dark:hover:border-gray-400 focus:border-gray-400 dark:focus:border-gray-400 dark:focus:border-gray-400 dark:bg-gray-900 dark:border-gray-800']) }} 35 | autocomplete="off" 36 | > 37 | 38 | 39 | @break 40 | 41 | @case('time') 42 | only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} 46 | > 47 | 48 | except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'flex w-full min-h-[39px] py-2.5 px-3 border rounded-md text-sm text-gray-600 dark:text-gray-300 transition-all hover:border-gray-400 dark:hover:border-gray-400 focus:border-gray-400 dark:focus:border-gray-400 dark:bg-gray-900 dark:border-gray-800']) }} 54 | autocomplete="off" 55 | > 56 | 57 | 58 | @break 59 | @endswitch -------------------------------------------------------------------------------- /publishable/build/assets/email-5653e8d5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /publishable/build/assets/captcha-061d77ab.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/DataGrids/Admin/Catalog/ProductDataGrid.php: -------------------------------------------------------------------------------- 1 | distinct() 24 | ->leftJoin('attribute_families as af', 'product_flat.attribute_family_id', '=', 'af.id') 25 | ->leftJoin('product_inventories', 'product_flat.product_id', '=', 'product_inventories.product_id') 26 | ->leftJoin('product_images', 'product_flat.product_id', '=', 'product_images.product_id') 27 | ->leftJoin('product_categories as pc', 'product_flat.product_id', '=', 'pc.product_id') 28 | ->leftJoin('category_translations as ct', function ($leftJoin) { 29 | $leftJoin->on('pc.category_id', '=', 'ct.category_id') 30 | ->where('ct.locale', app()->getLocale()); 31 | }) 32 | ->leftJoin('booking_products', function ($join) { 33 | $join->on('product_flat.product_id', '=', 'booking_products.product_id') 34 | ->where('product_flat.type', 'booking'); 35 | }) 36 | ->leftJoin('booking_product_event_tickets', function ($join) { 37 | $join->on('booking_products.id', '=', 'booking_product_event_tickets.booking_product_id') 38 | ->where('booking_products.type', 'event'); 39 | }) 40 | ->select( 41 | 'product_flat.locale', 42 | 'product_flat.channel', 43 | 'product_images.path as base_image', 44 | 'pc.category_id', 45 | 'ct.name as category_name', 46 | 'product_flat.product_id', 47 | 'product_flat.sku', 48 | 'product_flat.name', 49 | 'product_flat.type', 50 | 'product_flat.status', 51 | 'product_flat.price', 52 | 'product_flat.url_key', 53 | 'product_flat.visible_individually', 54 | 'af.name as attribute_family', 55 | DB::raw('COUNT(DISTINCT '.$tablePrefix.'product_images.id) as images_count'), 56 | DB::raw('IF( 57 | product_flat.type = "booking", 58 | IF(booking_products.type = "event", 59 | SUM(booking_product_event_tickets.qty), 60 | booking_products.qty 61 | ), 62 | SUM(DISTINCT product_inventories.qty) 63 | ) as quantity') 64 | ) 65 | ->where('product_flat.locale', app()->getLocale()) 66 | ->groupBy('product_flat.product_id'); 67 | 68 | $this->addFilter('product_id', 'product_flat.product_id'); 69 | $this->addFilter('channel', 'product_flat.channel'); 70 | $this->addFilter('locale', 'product_flat.locale'); 71 | $this->addFilter('name', 'product_flat.name'); 72 | $this->addFilter('type', 'product_flat.type'); 73 | $this->addFilter('status', 'product_flat.status'); 74 | $this->addFilter('attribute_family', 'af.id'); 75 | 76 | return $queryBuilder; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /publishable/build/assets/reviews-17309002.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/Helpers/DefaultSlot.php: -------------------------------------------------------------------------------- 1 | typeRepositories[$bookingProduct->type]->findOneByField('booking_product_id', $bookingProduct->id); 30 | 31 | if (empty($bookingProductSlot->slots)) { 32 | return []; 33 | } 34 | 35 | $requestedDate = Carbon::createFromTimeString($date.' 00:00:00'); 36 | 37 | $availableFrom = ! $bookingProduct->available_every_week && $bookingProduct->available_from 38 | ? Carbon::createFromTimeString($bookingProduct->available_from) 39 | : Carbon::now()->copy()->startOfDay(); 40 | 41 | $availableTo = ! $bookingProduct->available_every_week && $bookingProduct->available_from 42 | ? Carbon::createFromTimeString($bookingProduct->available_to) 43 | : Carbon::createFromTimeString('2080-01-01 00:00:00'); 44 | 45 | if ( 46 | $requestedDate < $availableFrom 47 | || $requestedDate > $availableTo 48 | ) { 49 | return []; 50 | } 51 | 52 | return $bookingProductSlot->booking_type == 'one' 53 | ? $this->getOneBookingForManyDaysSlots($bookingProductSlot, $requestedDate) 54 | : $this->getManyBookingsForOneDaySlots($bookingProductSlot, $requestedDate); 55 | } 56 | 57 | /** 58 | * Returns slots for One Booking For Many Days 59 | * 60 | * @param \Webkul\BookingProduct\Contracts\BookingProductTableSlot $bookingProductSlot 61 | * @return array 62 | */ 63 | public function getOneBookingForManyDaysSlots($bookingProductSlot, object $requestedDate) 64 | { 65 | $slots = []; 66 | 67 | foreach ($bookingProductSlot->slots as $key => $timeDuration) { 68 | if ($requestedDate->dayOfWeek != $timeDuration['from_day']) { 69 | continue; 70 | } 71 | 72 | $startDate = clone $requestedDate->modify('this '.$this->daysOfWeek[$timeDuration['from_day']]); 73 | 74 | $endDate = clone $requestedDate->modify('this '.$this->daysOfWeek[$timeDuration['to_day']]); 75 | 76 | $startDate = Carbon::createFromTimeString($startDate->format('Y-m-d').' '.$timeDuration['from'].':00'); 77 | 78 | $endDate = Carbon::createFromTimeString($endDate->format('Y-m-d').' '.$timeDuration['to'].':00'); 79 | 80 | $slots[] = [ 81 | 'from' => $startDate->format('h:i A'), 82 | 'to' => $endDate->format('h:i A'), 83 | 'timestamp' => $startDate->getTimestamp().'-'.$endDate->getTimestamp(), 84 | ]; 85 | } 86 | 87 | return $slots; 88 | } 89 | 90 | /** 91 | * Returns slots for Many Bookings for One Day 92 | * 93 | * @param \Webkul\BookingProduct\Contracts\BookingProductTableSlot $bookingProductSlot 94 | * @return array 95 | */ 96 | public function getManyBookingsForOneDaySlots($bookingProductSlot, object $requestedDate) 97 | { 98 | return $this->slotsCalculation($bookingProductSlot->booking_product, $requestedDate, $bookingProductSlot); 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /src/Repositories/BookingRepository.php: -------------------------------------------------------------------------------- 1 | items()->get() as $item) { 30 | if ($item->type != 'booking') { 31 | continue; 32 | } 33 | 34 | Event::dispatch('booking_product.booking.save.before', $item); 35 | 36 | $from = $to = null; 37 | 38 | $bookingItem = $item->additional['booking']; 39 | 40 | if (isset($bookingItem['slot'])) { 41 | if (isset($bookingItem['slot']['from'], $bookingItem['slot']['to'])) { 42 | $from = $bookingItem['slot']['from']; 43 | 44 | $to = $bookingItem['slot']['to']; 45 | } else { 46 | $timestamps = explode('-', $bookingItem['slot']); 47 | 48 | $from = $timestamps[0]; 49 | 50 | $to = $timestamps[1]; 51 | } 52 | } elseif (isset($bookingItem['date_from'], $bookingItem['date_to'])) { 53 | $from = Carbon::createFromTimeString($bookingItem['date_from'].' 00:00:00')->getTimestamp(); 54 | 55 | $to = Carbon::createFromTimeString($bookingItem['date_to'].' 23:59:59')->getTimestamp(); 56 | } 57 | 58 | $booking = parent::create([ 59 | 'qty' => $item->qty_ordered, 60 | 'from' => $from, 61 | 'to' => $to, 62 | 'order_id' => $order->id, 63 | 'order_item_id' => $item->id, 64 | 'product_id' => $item->product_id, 65 | 'booking_product_event_ticket_id' => $bookingItem['ticket_id'] ?? null, 66 | ]); 67 | 68 | Event::dispatch('booking_product.booking.save.after', $booking); 69 | } 70 | } 71 | 72 | /** 73 | * Get all bookings for the given date and time range. 74 | */ 75 | public function getBookings(array $dateRange): Collection 76 | { 77 | return $this->select( 78 | 'bookings.id', 79 | 'bookings.order_id', 80 | 'bookings.from as start', 81 | 'bookings.to as end', 82 | 'orders.status as status', 83 | 'orders.customer_email as email', 84 | 'orders.grand_total as total', 85 | 'orders.created_at as created_at', 86 | 'addresses.address as address', 87 | 'addresses.phone as contact', 88 | 'addresses.city as city', 89 | 'addresses.state as state', 90 | 'addresses.country as country', 91 | 'addresses.postcode as postcode', 92 | ) 93 | ->addSelect(DB::raw('CONCAT(orders.customer_first_name, " ", orders.customer_last_name) as full_name')) 94 | ->leftJoin('orders', 'bookings.order_id', '=', 'orders.id') 95 | ->leftJoin('addresses', 'bookings.order_id', '=', 'addresses.order_id') 96 | ->whereBetween('bookings.from', $dateRange) 97 | ->distinct() 98 | ->get(); 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /src/Resources/views/shop/products/view/types/booking/event.blade.php: -------------------------------------------------------------------------------- 1 | @inject ('bookingSlotHelper', 'Webkul\BookingProduct\Helpers\EventTicket') 2 | 3 |
4 |
5 | 6 | 7 |
8 |

9 | @lang('booking::app.shop.products.view.types.booking.event-on') : 10 |

11 | 12 |
13 | {!! $bookingSlotHelper->getEventDate($bookingProduct) !!} 14 |
15 |
16 |
17 | 18 | 19 | 20 |
21 | 22 | @pushOnce('scripts') 23 | 85 | 86 | 103 | @endpushOnce -------------------------------------------------------------------------------- /src/Resources/views/shop/products/view/types/booking/appointment.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 |
6 |

7 | @lang('booking::app.shop.products.view.types.booking.slot-duration') : 8 |

9 | 10 |
11 | @lang('booking::app.shop.products.view.types.booking.slot-duration-in-minutes', [ 12 | 'minutes' => $bookingProduct->appointment_slot->duration 13 | ]) 14 |
15 |
16 |
17 | 18 | @inject ('bookingSlotHelper', 'Webkul\BookingProduct\Helpers\AppointmentSlot') 19 | 20 |
21 | 22 | 23 |
24 |
25 |

26 | @lang('booking::app.shop.products.view.types.booking.appointment.today-availability') 27 |

28 | 29 | 30 | {!! $bookingSlotHelper->getTodaySlotsHtml($bookingProduct) !!} 31 | 32 |
33 | 34 | 35 | 36 |
37 |
38 | 39 | @include ('booking::shop.products.view.types.booking.slots', ['bookingProduct' => $bookingProduct]) 40 |
41 | 42 | @pushOnce('scripts') 43 | 90 | 91 | 104 | @endpushOnce -------------------------------------------------------------------------------- /src/DataGrids/Admin/BookingDataGrid.php: -------------------------------------------------------------------------------- 1 | leftJoin('orders', 'bookings.order_id', '=', 'orders.id') 20 | ->select('bookings.id as id', 'orders.increment_id as order_id', 'bookings.from as from', 'bookings.to as to', 'bookings.qty as qty', 'orders.created_at as created_at'); 21 | 22 | $this->addFilter('id', 'bookings.id'); 23 | $this->addFilter('order_id', 'orders.increment_id'); 24 | $this->addFilter('qty', 'bookings.qty'); 25 | $this->addFilter('created_at', 'orders.created_at'); 26 | 27 | return $queryBuilder; 28 | } 29 | 30 | /** 31 | * Add columns. 32 | * 33 | * @return void 34 | */ 35 | public function prepareColumns() 36 | { 37 | $this->addColumn([ 38 | 'index' => 'id', 39 | 'label' => trans('booking::app.admin.sales.bookings.index.datagrid.id'), 40 | 'type' => 'string', 41 | 'searchable' => false, 42 | 'sortable' => true, 43 | 'filterable' => true, 44 | ]); 45 | 46 | $this->addColumn([ 47 | 'index' => 'order_id', 48 | 'label' => trans('booking::app.admin.sales.bookings.index.datagrid.order-id'), 49 | 'type' => 'string', 50 | 'searchable' => true, 51 | 'sortable' => true, 52 | 'filterable' => true, 53 | ]); 54 | 55 | $this->addColumn([ 56 | 'index' => 'qty', 57 | 'label' => trans('booking::app.admin.sales.bookings.index.datagrid.qty'), 58 | 'type' => 'string', 59 | 'searchable' => true, 60 | 'sortable' => true, 61 | 'filterable' => true, 62 | ]); 63 | 64 | $this->addColumn([ 65 | 'index' => 'from', 66 | 'label' => trans('booking::app.admin.sales.bookings.index.datagrid.from'), 67 | 'type' => 'string', 68 | 'searchable' => true, 69 | 'sortable' => true, 70 | 'filterable' => false, 71 | 'closure' => function ($value) { 72 | return Carbon::createFromTimestamp($value->from)->format('d M, Y H:iA'); 73 | }, 74 | ]); 75 | 76 | $this->addColumn([ 77 | 'index' => 'to', 78 | 'label' => trans('booking::app.admin.sales.bookings.index.datagrid.to'), 79 | 'type' => 'string', 80 | 'searchable' => true, 81 | 'sortable' => true, 82 | 'filterable' => false, 83 | 'closure' => function ($value) { 84 | return Carbon::createFromTimestamp($value->to)->format('d M, Y H:iA'); 85 | }, 86 | ]); 87 | 88 | $this->addColumn([ 89 | 'index' => 'created_at', 90 | 'label' => trans('booking::app.admin.sales.bookings.index.datagrid.created-date'), 91 | 'type' => 'datetime', 92 | 'searchable' => true, 93 | 'sortable' => true, 94 | 'filterable' => true, 95 | ]); 96 | } 97 | 98 | /** 99 | * Prepare actions. 100 | * 101 | * @return void 102 | */ 103 | public function prepareActions() 104 | { 105 | $this->addAction([ 106 | 'icon' => 'icon-view', 107 | 'title' => trans('booking::app.admin.sales.bookings.index.datagrid.view'), 108 | 'method' => 'GET', 109 | 'url' => function ($row) { 110 | return route('admin.sales.orders.view', $row->order_id); 111 | }, 112 | ]); 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /publishable/build/assets/drag-and-drop.es-0df93f71.js: -------------------------------------------------------------------------------- 1 | var E=Object.defineProperty,S=(t,e,l)=>e in t?E(t,e,{enumerable:!0,configurable:!0,writable:!0,value:l}):t[e]=l,V=(t,e,l)=>(S(t,typeof e!="symbol"?e+"":e,l),l);/** 2 | * vue-cal v4.9.0 3 | * (c) 2024 Antoni Andre 4 | * @license MIT 5 | */let o=null,c=null,v={id:null,date:null},_=!1,m=!0,u={el:null,cell:null,timeout:null};const r={_eid:null,fromVueCal:null,toVueCal:null},C=class{constructor(t){V(this,"_vuecal"),this._vuecal=t}_getEventStart(t){const{timeStep:e,timeCellHeight:l,timeFrom:i,utils:n}=this._vuecal;let{y:a}=n.cell.getPosition(t);return a-=1*t.dataTransfer.getData("cursor-grab-at"),Math.round(a*e/parseInt(l)+i)}_updateEventStartEnd(t,e,l,i){const n=1*l.duration||e.endTimeMinutes-e.startTimeMinutes;let a=Math.max(this._getEventStart(t),0);if(this._vuecal.snapToTime){const d=a+this._vuecal.snapToTime/2;a=d-d%this._vuecal.snapToTime}e.startTimeMinutes=a,e.start=new Date(new Date(i).setMinutes(a)),e.endTimeMinutes=Math.min(a+n,1440),e.end=new Date(new Date(i).setMinutes(e.endTimeMinutes))}eventDragStart(t,e){if(t.target.nodeType===3)return t.preventDefault();t.dataTransfer.dropEffect="move",t.dataTransfer.setData("event",JSON.stringify(e)),t.dataTransfer.setData("cursor-grab-at",t.offsetY);const{clickHoldAnEvent:l}=this._vuecal.domEvents;setTimeout(()=>{l._eid=null,clearTimeout(l.timeoutId),e.deleting=!1},0),this._vuecal.domEvents.dragAnEvent._eid=e._eid,r._eid=e._eid,r.fromVueCal=this._vuecal._.uid,e.dragging=!0,setTimeout(()=>e.draggingStatic=!0,0),_=!1,v={id:this._vuecal.view.id,date:this._vuecal.view.startDate},m=!0}eventDragEnd(t){this._vuecal.domEvents.dragAnEvent._eid=null,r._eid=null,t.dragging=!1,t.draggingStatic=!1;const{fromVueCal:e,toVueCal:l}=r;l&&e!==l&&this._vuecal.utils.event.deleteAnEvent(t),r.fromVueCal=null,r.toVueCal=null,_&&m&&v.id&&this._vuecal.switchView(v.id,v.date,!0)}cellDragEnter(t,e,l){const i=t.currentTarget;if(!t.currentTarget.contains(t.relatedTarget)){if(i===u.el||!i.className.includes("vuecal__cell-content"))return!1;u.el&&(u.cell.highlighted=!1),u={el:i,cell:e,timeout:clearTimeout(u.timeout)},e.highlighted=!0,["years","year","month"].includes(this._vuecal.view.id)&&(u.timeout=setTimeout(()=>this._vuecal.switchToNarrowerView(l),2e3))}}cellDragOver(t,e,l,i){t.preventDefault(),e.highlighted=!0,(i||i===0)&&(e.highlightedSplit=i)}cellDragLeave(t,e){t.preventDefault(),t.currentTarget.contains(t.relatedTarget)||(e.highlightedSplit=!1,u.cell===e&&(clearTimeout(u.timeout),u={el:null,cell:null,timeout:null},e.highlighted=!1))}cellDragDrop(t,e,l,i){t.preventDefault(),clearTimeout(u.timeout),u={el:null,cell:null,timeout:null};const n=JSON.parse(t.dataTransfer.getData("event")||"{}");let a,d;if(r.fromVueCal!==this._vuecal._.uid){const{_eid:s,start:p,end:D,duration:g,...w}=n;a=this._vuecal.utils.event.createAnEvent(l,g,{...w,split:i})}else if(a=this._vuecal.view.events.find(s=>s._eid===r._eid),a||(a=this._vuecal.mutableEvents.find(s=>s._eid===r._eid),d=!!a),!a){const s=n.endTimeMinutes-n.startTimeMinutes,{start:p,end:D,...g}=n;a=this._vuecal.utils.event.createAnEvent(l,s,{...g,split:i})}const{start:T,split:f}=a;this._updateEventStartEnd(t,a,n,l),d&&this._vuecal.addEventsToView([a]),a.dragging=!1,(i||i===0)&&(a.split=i),e.highlighted=!1,e.highlightedSplit=null,m=!1,r.toVueCal=this._vuecal._.uid;const h={event:this._vuecal.cleanupEvent(a),oldDate:T,newDate:a.start,...(i||i===0)&&{oldSplit:f,newSplit:i},originalEvent:this._vuecal.cleanupEvent(n),external:!r.fromVueCal};this._vuecal.$emit("event-drop",h),this._vuecal.$emit("event-change",{event:h.event,originalEvent:h.originalEvent}),setTimeout(()=>{r._eid&&this.eventDragEnd(a)},300)}viewSelectorDragEnter(t,e,l){t.currentTarget.contains(t.relatedTarget)||(l.highlightedControl=e,clearTimeout(o),o=setTimeout(()=>{if(["previous","next"].includes(e))this._vuecal[e](),clearInterval(c),c=setInterval(this._vuecal[e],800);else if(e==="today"){let i;clearInterval(c),this._vuecal.view.id.includes("year")&&(i=this._vuecal.enabledViews.filter(n=>!n.includes("year"))[0]),this._vuecal.switchView(i||this._vuecal.view.id,new Date(new Date().setHours(0,0,0,0)),!0)}else this._vuecal.switchView(e,null,!0);_=!0},800))}viewSelectorDragLeave(t,e,l){t.currentTarget.contains(t.relatedTarget)||l.highlightedControl===e&&(l.highlightedControl=null,o&&(o=clearTimeout(o)),c&&(c=clearInterval(c)))}};export{C as DragAndDrop}; 6 | -------------------------------------------------------------------------------- /src/Resources/views/components/modal/index.blade.php: -------------------------------------------------------------------------------- 1 | @props([ 2 | 'isActive' => false, 3 | ]) 4 | 5 | 9 | @isset($open) 10 | 13 | @endisset 14 | 15 | @isset($header) 16 | 27 | @endisset 28 | 29 | @isset($content) 30 | 35 | @endisset 36 | 37 | @isset($footer) 38 | 43 | @endisset 44 | 45 | 46 | @pushOnce('scripts') 47 | 101 | 102 | 135 | @endPushOnce -------------------------------------------------------------------------------- /src/Resources/views/shop/products/view/types/booking/slots.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | @pushOnce('scripts') 4 | 70 | 71 | 107 | @endpushOnce 108 | -------------------------------------------------------------------------------- /src/Resources/views/shop/products/view/types/booking/table.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 |
6 |

7 | @lang('booking::app.shop.products.view.types.booking.slot-duration') : 8 |

9 | 10 |
11 | @lang('booking::app.shop.products.view.types.booking.slot-duration-in-minutes', ['minutes' => $bookingProduct->table_slot->duration]) 12 |
13 |
14 |
15 | 16 | @inject ('bookingSlotHelper', 'Webkul\BookingProduct\Helpers\TableSlot') 17 | 18 |
19 | 20 | 21 |
22 |
23 |

24 | @lang('booking::app.shop.products.view.types.booking.table.today-availability') 25 |

26 | 27 | 28 | {!! $bookingSlotHelper->getTodaySlotsHtml($bookingProduct) !!} 29 | 30 |
31 | 32 | 33 | 34 |
35 |
36 | 37 | @include ('booking::shop.products.view.types.booking.slots', [ 38 | 'bookingProduct' => $bookingProduct, 39 | 'title' => trans('booking::app.shop.products.view.types.booking.table.book-a-table') 40 | ]) 41 | 42 | 43 | 44 | 45 | @lang('booking::app.shop.products.view.types.booking.table.special-notes') 46 | 47 | 48 | 56 | 57 | 58 | 59 |
60 | 61 | @pushOnce('scripts') 62 | 107 | 108 | 121 | @endpushOnce -------------------------------------------------------------------------------- /publishable/build/assets/icon-add-product-e3232d62.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | --------------------------------------------------------------------------------