outlet-contactless-dining.blade.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. @extends('layouts.app')
  2. @section('content')
  3. <link href="{!! env('APP_ASSETS') !!}/vendor_components/dropzone/dropzone.css" rel="stylesheet"/>
  4. <link href="{!! env('APP_ASSETS') !!}/vendor_components/bootstrap-tagsinput/dist/bootstrap-tagsinput.css" rel="stylesheet"/>
  5. <link href="{!! env('APP_ASSETS') !!}/css/jquery.timepicker.min.css" rel="stylesheet"/>
  6. <style>
  7. .vtabs .tabs-vertical {
  8. width: 229px;
  9. }
  10. .bootstrap-tagsinput {
  11. min-height: 60px; width: 100%;
  12. }
  13. h4{ margin-top: 40px}
  14. .bootstrap-timepicker-widget table td input{ width: 46px}
  15. .content{
  16. padding: 0;
  17. }
  18. .form-control, .form-select {
  19. height: 46px !important;
  20. border-color: #E4E6EB !important;
  21. border-radius: 7px !important;
  22. }
  23. .payout-details{
  24. background-color: #fff4de;
  25. border-radius: 3px;
  26. padding: 15px;
  27. }
  28. .theme-primary [type=checkbox].filled-in:checked.chk-col-primary + label:after {
  29. border: 2px solid #ffab00;
  30. background-color: #ffab00;
  31. }
  32. .theme-primary .btn-success:hover, .theme-primary .btn-success:active, .theme-primary .btn-success:focus, .theme-primary .btn-success.active {
  33. background-color: #3fd642!important;
  34. border-color: #3fd642!important;
  35. color: #ffffff !important;
  36. }
  37. #output canvas{
  38. width: 100%;
  39. }
  40. </style>
  41. @php
  42. $resto = \Illuminate\Support\Facades\Auth::user()->restaurants;
  43. $lang = $resto->default_lang;
  44. app()->setLocale($lang);
  45. if(session('app_lang') !==null){
  46. $lang = session('app_lang');
  47. app()->setLocale($lang);
  48. }
  49. @endphp
  50. <!-- Content Wrapper. Contains page content -->
  51. <div class="content-wrapper">
  52. <div class="container-full">
  53. <!-- Content Header (Page header) -->
  54. {{-- <div class="content-header">
  55. <div class="d-flex align-items-center">
  56. <div class="me-auto">
  57. <h4 class="page-title">Outlets</h4>
  58. <div class="d-inline-block align-items-center">
  59. <nav>
  60. <ol class="breadcrumb">
  61. <li class="breadcrumb-item"><a href="{!! env('APP_URL') !!}dashboard"><i
  62. class="mdi mdi-home-outline"></i></a></li>
  63. <li class="breadcrumb-item active" aria-current="page">Outlets</li>
  64. </ol>
  65. </nav>
  66. </div>
  67. </div>
  68. </div>
  69. </div>--}}
  70. <!-- Main content -->
  71. <section class="content">
  72. <div class="row">
  73. <div class="col-3" style="padding-right: 0;background-color: #F5F5F5">
  74. @include('outlets.outlet-sidebar')
  75. </div>
  76. <div class="col-9 p-15">
  77. <form id="save-outlet" method="POST" action="{!! env('APP_URL') !!}save/features/outlet" enctype="multipart/form-data">
  78. @csrf
  79. <input type="hidden" name="feature_type" value="contactless_dining" />
  80. <input type="hidden" name="id" value="{!! $outlet->id !!}" />
  81. <div class="p-15">
  82. <div class="d-flex bd-highlight">
  83. <div class="p-2 flex-grow-1 bd-highlight">
  84. <h4 style="margin-top: 0; margin-bottom: 5px">Contactless dining</h4>
  85. <p> Customers can order for dine-in at the outlet </p>
  86. </div>
  87. <div class="p-2 bd-highlight">
  88. <button type="button" class="btn btn-lg btn-toggle btn-success switch @if($outlet->is_contactless_dining=="1") active @endif switch" data-bs-toggle="button" aria-pressed="@if($outlet->is_contactless_dining=="1") true @else false @endif" autocomplete="off">
  89. <div class="handle"></div>
  90. </button>
  91. </div>
  92. </div>
  93. <div class="row">
  94. <div class="col-md-12 payout-details">
  95. <p class="fw-bold">Recieve your payouts</p>
  96. <p>
  97. Fill up your bank details here so we can transfer your money.
  98. Learn more about payout cycles <a href="#!" class="fw-bold">here</a>
  99. </p>
  100. </div>
  101. </div>
  102. <div id="main" @if($outlet->is_contactless_dining=="1") class="active" @endif>
  103. <div class="row">
  104. <div class="col-sm-12 col-md-8">
  105. <div class="disabled"></div>
  106. <h4> Payment Methods</h4>
  107. <p> Select all payment methods accepted on delivery </p>
  108. @php
  109. $payment_methods = [];
  110. if(isset($features) && !empty($features->payment_methods)){
  111. $payment_methods = explode(',',$features->payment_methods);
  112. }
  113. @endphp
  114. <div class="row">
  115. <div class="col-sm-12">
  116. <input type="checkbox" id="card_on_delivery" name="payment_methods[]" @if(in_array('card',$payment_methods)) checked @endif value="card" class="filled-in chk-col-primary" />
  117. <label for="card_on_delivery">Card on delivery</label> <br />
  118. <input type="checkbox" id="cash_on_delivery" name="payment_methods[]" @if(in_array('cash',$payment_methods)) checked @endif value="cash" class="filled-in chk-col-primary" />
  119. <label for="cash_on_delivery">Cash on delivery</label>
  120. </div>
  121. </div>
  122. <h4> Opening hours</h4>
  123. <p> Select all payment methods accepted on delivery </p>
  124. @php
  125. $days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
  126. $existing_days = \App\BranchHours::where('branch_id',$outlet->id)->where('hours_for','contactless_dining')->get();
  127. $day_exists = [];
  128. @endphp
  129. <div class="row mb-3">
  130. <div class="col-sm-2">
  131. <p class="fw-bold">Day</p>
  132. </div>
  133. <div class="col-sm-3"><p class="fw-bold">From</p></div>
  134. <div class="col-sm-3">
  135. <p class="fw-bold">To</p>
  136. </div>
  137. </div>
  138. @if(isset($existing_days) && $existing_days->count() > 0)
  139. @foreach($existing_days as $d)
  140. <div class="row mb-3 hour-section">
  141. <div class="col-sm-2"> @if(!in_array($d->day_name,$day_exists)){!! ucwords($d->day_name) !!}@endif</div>
  142. <div class="col-sm-3 time-show start_time" @if($d->status=="close") style="display: none" @endif >
  143. <div class="bootstrap-timepicker">
  144. <input type="text" name="start_time[{!! strtolower($d->day_name) !!}][]" value="{!! $d->start_time !!}" class=" form-control timepicker">
  145. </div>
  146. </div>
  147. <div class="col-sm-3 time-show end_time position-relative" @if($d->status=="close") style="display: none" @endif>
  148. <div class="bootstrap-timepicker position-relative">
  149. <input type="text" name="end_time[{!! strtolower($d->day_name) !!}][]" value="{!! date('H:i a',strtotime($d->end_time)) !!}" class="form-control timepicker ">
  150. </div>
  151. </div>
  152. <div class="col-sm-2 time-show hours-action" @if($d->status=="close") style="display: none" @endif>
  153. @if(!in_array($d->day_name,$day_exists))
  154. <a href="#!" class="text-primary add-more-hours" data-day="{!! strtolower($d->day_name) !!}"> <i class="fa fa-plus-square-o"></i> Add hours</a>
  155. @endif
  156. @if(in_array($d->day_name,$day_exists))
  157. <a href="#!" class="text-mute remove-hours" data-id="{!! $d->id !!}" data-day="{!! strtolower($d->day_name) !!}"> <i class="fa fa-ban"></i> Remove hours</a>
  158. @endif
  159. </div>
  160. <div class="col-sm-2">
  161. @if(!in_array($d->day_name,$day_exists))
  162. <button type="button" data-on-text="Open" data-off-text="Closed" class="btn btn-toggle btn-sm btn-success update-hour-status @if($d->status=="open") active @endif" data-bs-toggle="button" aria-pressed="@if($d->status=="open") true @else false @endif" autocomplete="off">
  163. <div class="handle"></div>
  164. </button>
  165. <input type="checkbox" name="is_open[{!! strtolower($d->day_name) !!}]" @if($d->status=="open") checked @endif />
  166. @endif
  167. </div>
  168. </div>
  169. @php
  170. $day_exists[] = $d->day_name;
  171. @endphp
  172. @endforeach
  173. @else
  174. @foreach($days as $d)
  175. <div class="row mb-3 hour-section">
  176. <div class="col-sm-2">{!! $d !!}</div>
  177. <div class="col-sm-3 time-show start_time">
  178. <div class="bootstrap-timepicker">
  179. <input type="text" name="start_time[{!! strtolower($d) !!}][]" class="form-control timepicker time">
  180. </div>
  181. </div>
  182. <div class="col-sm-3 time-show end_time position-relative">
  183. <div class="bootstrap-timepicker">
  184. <input type="text" name="end_time[{!! strtolower($d) !!}][]" class="form-control timepicker time">
  185. </div>
  186. </div>
  187. <div class="col-sm-2 time-show hours-action"><a href="#!" class="text-primary add-more-hours" data-day="{!! strtolower($d) !!}"> <i class="fa fa-plus-square-o"></i> Add hours</a></div>
  188. <div class="col-sm-2">
  189. <button type="button" data-on-text="Open" data-off-text="Closed" class="btn btn-toggle btn-sm btn-success active update-hour-status" data-bs-toggle="button" aria-pressed="true" autocomplete="off">
  190. <div class="handle"></div>
  191. </button>
  192. <input type="checkbox" name="is_open[{!! strtolower($d) !!}]" checked />
  193. </div>
  194. </div>
  195. @endforeach
  196. @endif
  197. <!-- <h4> Operation Settings</h4>
  198. <p>Set the default time needed for preparing and delivering orders</p>
  199. <div class="row">
  200. <div class="col-sm-6">
  201. <div class="form-group">
  202. <label>Preparation (minutes)</label>
  203. <input type="text" name="preparation_time" class="form-control" value="{!! isset($features)?$features->preparation_timing:15 !!}" />
  204. </div>
  205. </div>
  206. <div class="col-sm-6">
  207. <div class="form-group">
  208. <label>Preparation + delivery (minutes)</label>
  209. <input type="text" name="preperation_delivery" class="form-control" value="{!! isset($features)?$features->preparation_delivery_time:40 !!}" />
  210. </div>
  211. </div>
  212. </div> -->
  213. <div class="row">
  214. <div class="col-sm-12">
  215. <a href="#!" class="btn btn-primary save-changes mt-4">Save Changes</a>
  216. </div>
  217. </div>
  218. </div>
  219. <div class="col-sm-12 col-md-4">
  220. <div class="card mt-4">
  221. <div class="card-header">Contactless dining QR code</div>
  222. <div class="card-body">
  223. <div id="output"></div>
  224. <a style="width: 100%; margin: 10px 0" class="btn btn-primary download-image ">Download</a>
  225. <p>This is your unique QR code for customers to see the menu and order from this outlet. Print it and leave it on the tables. Customers just need to scan it with a smartphone to place their order.</p>
  226. @php
  227. $resto = \App\Restaurants::find(\App\Helpers\CommonMethods::getRestuarantID());
  228. @endphp
  229. @if($resto->domain_name!="")
  230. <input type="text" class="form-control" readonly name="" value="{!! $resto->domain_name !!}dining/{!! $resto->resto_unique_name !!}/outlet/{!! \Illuminate\Support\Str::slug($outlet->name) !!}">
  231. @else
  232. <input type="text" class="form-control" readonly name="" value="{!! env('QRCODE_HOST') !!}dining/{!! $resto->resto_unique_name !!}/outlet/{!! \Illuminate\Support\Str::slug($outlet->name) !!}">
  233. @endif
  234. </div>
  235. </div>
  236. </div>
  237. </div>
  238. </div>
  239. </div>
  240. </form>
  241. </div>
  242. </div>
  243. </section>
  244. <!-- /.content -->
  245. </div>
  246. <div id="download" style="display: none"></div>
  247. </div>
  248. <!-- /.content-wrapper -->
  249. @endsection
  250. @section('js')
  251. <script src="{!! env('APP_ASSETS') !!}js/jquery.timepicker.min.js"></script>
  252. <script src="{!! env('APP_ASSETS') !!}js/jquery.qrcode.min.js"></script>
  253. <script>
  254. $(function () {
  255. $('#output').qrcode({
  256. render: "canvas",
  257. text: "{!! !empty($resto->domain_name)?$resto->domain_name:env('QRCODE_HOST') !!}dining/{!! $resto->resto_unique_name !!}/outlet/{!! \Illuminate\Support\Str::slug($outlet->name) !!}",
  258. width: 250,
  259. height: 250,
  260. background: "#ffffff",
  261. foreground: "#000000",
  262. /* src: "{!! isset(\Illuminate\Support\Facades\Auth::user()->restaurants) && isset(\Illuminate\Support\Facades\Auth::user()->restaurants->home_images) && !empty(\Illuminate\Support\Facades\Auth::user()->restaurants->home_images->file_name)?\Illuminate\Support\Facades\Auth::user()->restaurants->home_images->file_name:env('APP_URL').'public/layout/img/favicon.png' !!}",
  263. */ imgWidth: 50,
  264. imgHeight: 50
  265. });
  266. $('#download').qrcode({
  267. render: "canvas",
  268. text: "{!! !empty($resto->domain_name)?$resto->domain_name:env('QRCODE_HOST') !!}dining/{!! $resto->resto_unique_name !!}/outlet/{!! \Illuminate\Support\Str::slug($outlet->name) !!}",
  269. width: 2000,
  270. height: 2000,
  271. background: "#ffffff",
  272. foreground: "#000000",
  273. /* src: "{!! isset(\Illuminate\Support\Facades\Auth::user()->restaurants) && isset(\Illuminate\Support\Facades\Auth::user()->restaurants->home_images) && !empty(\Illuminate\Support\Facades\Auth::user()->restaurants->home_images->file_name)?\Illuminate\Support\Facades\Auth::user()->restaurants->home_images->file_name:env('APP_URL').'public/layout/img/favicon.png' !!}",
  274. */ imgWidth: 500,
  275. imgHeight: 500
  276. });
  277. $(".download-image").click(function () {
  278. var canvas = $('#download canvas')[0];
  279. var _this = $(this);
  280. // Change here
  281. $.ajax({
  282. url: "{!! env('APP_URL') !!}download/qrcode",
  283. type: "POST",
  284. data: {
  285. resto:"dining-{!! $resto->resto_unique_name !!}-outlet-{!! \Illuminate\Support\Str::slug($outlet->name) !!}",
  286. data: canvas.toDataURL(),
  287. '_token': "{!! csrf_token() !!}"
  288. },
  289. success: function (response) {
  290. console.log(response);
  291. var link = document.createElement('a');
  292. link.href = response;
  293. link.download = "dining-{!! $resto->resto_unique_name !!}-qrcode.png";
  294. link.click();
  295. }
  296. });
  297. });
  298. $("body").on("click",".remove-hours",function () {
  299. var _id = $(this).data('id');
  300. var _this = $(this);
  301. $.ajax({
  302. url:"{!! env('APP_URL') !!}remove/hour",
  303. type:"POST",
  304. data:{
  305. id:_id,
  306. "_token":"{!! csrf_token() !!}"
  307. },
  308. success:function (response) {
  309. response = $.parseJSON(response);
  310. if(response.type=="success"){
  311. $.toast({
  312. heading: 'Hours',
  313. text: response.message,
  314. position: 'top-right',
  315. loaderBg: '#ff6849',
  316. icon: 'success',
  317. hideAfter: 3000,
  318. stack: 6
  319. });
  320. }else{
  321. $.toast({
  322. heading: 'Hours',
  323. text: response.message,
  324. position: 'top-right',
  325. loaderBg: '#ff6849',
  326. icon: 'danger',
  327. hideAfter: 3000,
  328. stack: 6
  329. });
  330. }
  331. }
  332. });
  333. _this.parents('.hour-section').remove();
  334. });
  335. $("body").on("click",".add-more-hours",function () {
  336. var _hour_section = $(this).parents(".hour-section");
  337. var day = $(this).data('day');
  338. var start_time='<div class="bootstrap-timepicker mt-1">\n' +
  339. ' <input type="text" name="start_time['+day+'][]" class="form-control timepicker time">\n' +
  340. ' </div>';
  341. var end_time='<div class="bootstrap-timepicker mt-1">\n' +
  342. ' <input type="text" name="end_time['+day+'][]" class="form-control timepicker time">\n' +
  343. ' </div><i class="fa fa-ban delete-hour"></i>';
  344. var input_start_time = _hour_section.find('.col-sm-3.time-show.start_time').append(start_time);
  345. var input_end_time = _hour_section.find('.col-sm-3.time-show.end_time').append(end_time);
  346. /* var hour_sections = _hour_section.find('.col-sm-2.time-show.hours-action').append('<div style="margin-top: 37px"><a href="#!" class="text-mute remove-hours" data-id="60" data-day="sunday"> <i class="fa fa-ban"></i> Remove hours</a></div>');
  347. */
  348. $(".timepicker").timepicker({ step:5});
  349. $('.timepicker').on('showTimepicker',function(){
  350. $("#li-11-59").remove();
  351. $("body").find(".ui-timepicker-list").append('<li id="li-11-59" class="ui-timepicker-pm" data-time="86340">11:59pm</li>');
  352. });
  353. });
  354. $("body").on("click",".update-hour-status",function () {
  355. var is_active = $(this).attr("aria-pressed");
  356. is_active = $.trim(is_active);
  357. if(is_active=="false"){
  358. // alert('off');
  359. $(this).parents('.hour-section').find('input[type=checkbox]').prop('checked',false);
  360. $(this).parents('.hour-section').find('.time-show').hide();
  361. }else{
  362. $(this).parents('.hour-section').find('input[type=checkbox]').prop('checked','checked');
  363. $(this).parents('.hour-section').find('.time-show').show();
  364. }
  365. })
  366. /*$("body").on("click",".action-on-off",function () {
  367. var unique_key =
  368. });*/
  369. $(".timepicker").timepicker({ step:5});
  370. $('.timepicker').on('showTimepicker',function(){
  371. $("#li-11-59").remove();
  372. $("body").find(".ui-timepicker-list").append('<li id="li-11-59" class="ui-timepicker-pm" data-time="86340">11:59pm</li>');
  373. });
  374. $("body").on("click",".switch",function () {
  375. var is_active = $(this).attr("aria-pressed");
  376. is_active = $.trim(is_active);
  377. if(is_active=="false"){
  378. $("#main").removeClass('active');
  379. }else{
  380. $("#main").addClass('active');
  381. }
  382. $.ajax({
  383. url:"{!! env('APP_URL') !!}update/outlet/feature/status",
  384. data:{
  385. outletId:"{!! $outlet->id !!}",
  386. feature:'is_contactless_dining',
  387. is_active:is_active,
  388. "_token":"{!! csrf_token() !!}"
  389. },
  390. type:"POST",
  391. success:function () {
  392. }
  393. });
  394. });
  395. $("body").on("click",".save-changes",function () {
  396. /*$.toast({
  397. heading: 'Welcome to my Riday Admin',
  398. text: 'Use the predefined ones, or specify a custom position object.',
  399. position: 'top-right',
  400. loaderBg: '#ff6849',
  401. icon: 'info',
  402. hideAfter: 3000,
  403. stack: 6
  404. });*/
  405. if($("#save-outlet").valid()){
  406. $("#save-outlet").ajaxForm(function (response) {
  407. response = $.parseJSON(response);
  408. if(response.type=="success"){
  409. $.toast({
  410. heading: 'Outlet Update.',
  411. text: response.message,
  412. position: 'top-right',
  413. loaderBg: '#ff6849',
  414. icon: 'success',
  415. hideAfter: 3000,
  416. stack: 1
  417. });
  418. setTimeout(function () {
  419. location.reload();
  420. },2000);
  421. }else{
  422. $.toast({
  423. heading: 'Outlet Update.',
  424. text: response.message,
  425. position: 'top-right',
  426. loaderBg: '#ff6849',
  427. icon: 'error',
  428. hideAfter: 3000,
  429. stack: 1
  430. });
  431. }
  432. }).submit();
  433. }
  434. });
  435. })
  436. </script>
  437. @endsection