outlet-delivery-area.blade.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  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. #map{
  16. width: 100%; height: 100vh;
  17. }
  18. .delivery-section{
  19. width: 400px;
  20. height: auto;
  21. background: white;
  22. position: absolute;
  23. left: 10px; top: 10px;
  24. z-index: 10; padding: 10px;
  25. }
  26. .input-group input[type=text]{
  27. border-left: 0; padding-left: 0;
  28. }
  29. #pac-input{
  30. position: absolute;
  31. z-index: 9;
  32. top: 26px !important;
  33. right: 20px !important;
  34. width: 300px;
  35. left: inherit !important;
  36. }
  37. .search-location{
  38. position: absolute;
  39. right: 33px;
  40. top: 28px;
  41. z-index: 88;
  42. font-size: 20px;
  43. }
  44. .centerMarker{
  45. position:absolute;
  46. /*url of the marker*/
  47. background:url({!! env('APP_ASSETS') !!}images/marker.png) no-repeat;
  48. /*center the marker*/
  49. top:49%;left:47%;
  50. z-index:1;
  51. /*fix offset when needed*/
  52. margin-left:-10px;
  53. margin-top:-34px;
  54. /*size of the image*/
  55. height:40px;
  56. width:37px;
  57. cursor:pointer;
  58. }
  59. </style>
  60. <!-- Content Wrapper. Contains page content -->
  61. @php
  62. $resto = \App\Restaurants::find(\App\Helpers\CommonMethods::getRestuarantID());
  63. $lang = $resto->default_lang;
  64. app()->setLocale($lang);
  65. if(session('app_lang') !==null){
  66. $lang = session('app_lang');
  67. app()->setLocale($lang);
  68. }
  69. //$resto = \Illuminate\Support\Facades\Auth::user()->restaurants;
  70. $address = isset($resto->places)?$resto->places->place_name:"Baghdad";
  71. $polygons = isset($resto->places)?$resto->places->coordinates:NULL;
  72. if(!empty($outlet->address))
  73. $address = $outlet->address.', '.$outlet->place;
  74. // dd($resto->places->place_name);
  75. @endphp
  76. @php
  77. $restuarant1 = $resto;
  78. $resto_meta = isset($restuarant1->resto_metas)?$restuarant1->resto_metas:null;
  79. if(isset($_GET['debug']))
  80. dump($resto_meta);
  81. //dump($resto_meta);
  82. $resto_metas = [];
  83. $billing = [];
  84. if(isset($resto_meta)){
  85. foreach($resto_meta as $meta){
  86. if($meta->outlet_id!=""){
  87. continue;
  88. }
  89. $index_name = isset($meta->resto_meta_defs->parents)?$meta->resto_meta_defs->parents->meta_def_name:$meta->resto_meta_defs->meta_def_name;
  90. // dump($meta->resto_meta_defs);
  91. if($index_name=="BILLING_GATEWAY"){
  92. // dump($meta->resto_meta_defs->meta_def_name);
  93. // $resto_metas['BILLING_GATEWAY'][] = $meta->meta_val;
  94. $billing[] = array('id'=>$meta->meta_id,'value'=>$meta->meta_val);
  95. }
  96. $resto_metas[$index_name] = $meta->meta_val;
  97. }
  98. }
  99. $resto_metas['BILLING_GATEWAY'] = $billing;
  100. $currency = isset($resto_metas['BUSSINESS_CCY'])?$resto_metas['BUSSINESS_CCY']:"IQD";
  101. $business_type = isset($resto_metas['BUSSINESS_TYPE'])?$resto_metas['BUSSINESS_TYPE']:"Restaurants";
  102. $outlet_meta = isset($outlet->resto_metas)?$outlet->resto_metas:NULL;
  103. $outlet_metas = [];
  104. if(isset($outlet_meta)){
  105. foreach($outlet_meta as $meta){
  106. $index_name = isset($meta->resto_meta_defs->parents)?$meta->resto_meta_defs->parents->meta_def_name:$meta->resto_meta_defs->meta_def_name;
  107. // dump($meta->resto_meta_defs);
  108. if($index_name=="BILLING_GATEWAY"){
  109. // dump($meta->resto_meta_defs->meta_def_name);
  110. // $resto_metas['BILLING_GATEWAY'][] = $meta->meta_val;
  111. $billing[] = array('id'=>$meta->meta_id,'value'=>$meta->meta_val);
  112. }
  113. $outlet_metas[$index_name] = $meta->meta_val;
  114. }
  115. }
  116. $currency = isset($outlet_metas['BUSSINESS_CCY'])?$outlet_metas['BUSSINESS_CCY']:$resto_metas['BUSSINESS_CCY'];
  117. @endphp
  118. <div class="content-wrapper">
  119. <div class="container-full">
  120. <!-- Content Header (Page header) -->
  121. <div class="content-header">
  122. <div class="d-flex align-items-center">
  123. <div class="me-auto">
  124. <h4 class="page-title">Outlets</h4>
  125. <div class="d-inline-block align-items-center">
  126. <nav>
  127. <ol class="breadcrumb">
  128. <li class="breadcrumb-item"><a href="{!! env('APP_URL') !!}dashboard"><i
  129. class="mdi mdi-home-outline"></i></a></li>
  130. <li class="breadcrumb-item active" aria-current="page">Outlets</li>
  131. </ol>
  132. </nav>
  133. </div>
  134. </div>
  135. </div>
  136. </div>
  137. <!-- Main content -->
  138. <section class="content">
  139. <div class="row">
  140. <div class="col-12">
  141. <div class="box">
  142. <div class="box-header with-border">
  143. @if(isset($outlet))
  144. <h4 class="box-title">Update {!! $outlet->name !!}</h4>
  145. @else
  146. <h4 class="box-title">Create new outlet</h4>
  147. @endif{{--{{--
  148. <h6 class="box-subtitle">Use default tab with class <code>vtabs &amp; tabs-vertical</code></h6>--}}
  149. </div>
  150. <!-- /.box-header -->
  151. <div class="box-body">
  152. <!-- Nav tabs -->
  153. <div class="vtabs">
  154. @include('outlets.outlet-sidebar')
  155. <!-- Tab panes -->
  156. <div class="tab-content" style="width: 84%">
  157. <div class="tab-pane active" id="basic-information" role="tabpanel" style="position: relative">
  158. <div class="delivery-section">
  159. <h3>Add delivery area</h3>
  160. <div class="row">
  161. <div class="col-12">
  162. <div class="form-group">
  163. <label>Delivery area name </label>
  164. <input type="text" value="{!! isset($area)?$area->area_name:"" !!}" class="form-control" name="area_name" required/>
  165. </div>
  166. </div>
  167. </div>
  168. <div class="row">
  169. <div class="col-6">
  170. <div class="form-group">
  171. <label>Min. basket value </label>
  172. <div class="input-group" >
  173. <div class="input-group-addon" style="font-size: 13px;position: relative;padding-top: 9px;">
  174. {!! $currency !!}
  175. </div>
  176. <input type="text" value="{!! isset($area)?$area->min_price:"0" !!}" class="form-control" name="min_basket" required/>
  177. </div>
  178. </div>
  179. </div>
  180. <div class="col-6">
  181. <div class="form-group">
  182. <label>Delivery fee </label>
  183. <div class="input-group">
  184. <div class="input-group-addon" style="font-size: 13px;position: relative;padding-top: 9px;">
  185. {!! $currency !!}
  186. </div>
  187. <input type="text" value="{!! isset($area)?$area->delivery_fee:"0" !!}" class="form-control" name="delivery_fee" required/>
  188. </div>
  189. </div>
  190. </div>
  191. </div>
  192. <div class="row">
  193. <div class="col-6">
  194. <button class="btn btn-primary save-delivery-area">Save Delivery Area</button>
  195. </div>
  196. </div>
  197. </div>
  198. <div class="row">
  199. <div class="col-12 position-relative">
  200. <div class="position-relative" >
  201. <div class="form-group position-relative">
  202. <!-- <a href="#!" class="search-location"><i class="fa fa-location-arrow"></i> </a>-->
  203. <input
  204. id="pac-input"
  205. class="form-control"
  206. type="text"
  207. placeholder="Search Box"
  208. />
  209. </div>
  210. </div>
  211. <div id="map"></div>
  212. </div>
  213. </div>
  214. </div>
  215. </div></div>
  216. </div>
  217. <!-- /.box-body -->
  218. </div>
  219. <!-- /.box -->
  220. </div>
  221. </div>
  222. </section>
  223. <!-- /.content -->
  224. </div>
  225. </div>
  226. <!-- /.content-wrapper -->
  227. @endsection
  228. @section('js')
  229. <script>
  230. let map;
  231. var uluru = { lat: 33.325, lng: 44.422 };
  232. var marker_icon = "{!! env('APP_ASSETS') !!}images/marker.png";
  233. var address = "{!! $address !!}";
  234. window.existingArea = {!! !empty($polygons)?$polygons:"1" !!};
  235. var distance_plus = 0.2;
  236. var distance_minus = 0.2;
  237. var polygons = null;
  238. var redCoords = null;
  239. var marker=null;
  240. var map_center = null;
  241. function initMapMeem() {
  242. geocoder = new google.maps.Geocoder();
  243. //codeAddress(address);
  244. geocoder.geocode({ 'address': address }, function (results, status) {
  245. // console.log(results);
  246. uluru = {lat: results[0].geometry.location.lat (), lng: results[0].geometry.location.lng ()};
  247. // console.log (latLng);
  248. if (status == 'OK') {
  249. map = new google.maps.Map(document.getElementById("map"), {
  250. center: uluru,
  251. zoom: 12,
  252. disableDefaultUI: true,
  253. });
  254. // $('<div/>').addClass('centerMarker').appendTo(map.getDiv())
  255. /*marker = new google.maps.Marker({
  256. position: uluru,
  257. map: map,
  258. icon:marker_icon,
  259. draggable:true
  260. });*/
  261. map_center = map.getCenter();
  262. @if(isset($area))
  263. redCoords = {!! str_replace('"','',$area->lat_lag) !!};
  264. @else
  265. /*redCoords = [
  266. { lat: 33.3332, lng: 44.4283 },//North
  267. { lat: 33.2722, lng: 44.4283 },//sound
  268. { lat: 33.2722, lng: 44.3283 },//sound
  269. { lat: 33.3332, lng: 44.3283 },//North
  270. ];*/
  271. var lat_1 = uluru.lat;
  272. var lat_2 = parseFloat(uluru.lat) - 0.0610000;
  273. var lat_3 = lat_2;
  274. var lat_4 = lat_1;
  275. var lng_1 = uluru.lng;
  276. var lng_2 = lng_1;
  277. var lng_3 = parseFloat(uluru.lng) - 0.1000000;
  278. var lng_4 = lng_3;
  279. redCoords = [
  280. { lat: lat_1, lng: lng_1 },//North
  281. { lat: lat_2, lng: lng_2 },//sound
  282. { lat: lat_3, lng: lng_3 },//sound
  283. { lat: lat_4, lng: lng_4 },//North
  284. ];
  285. @endif
  286. // Construct a draggable red triangle with geodesic set to true.
  287. polygons= new google.maps.Polygon({
  288. map,
  289. paths: redCoords,
  290. strokeColor: "#FF0000",
  291. strokeOpacity: 0.8,
  292. strokeWeight: 2,
  293. fillColor: "#FF0000",
  294. fillOpacity: 0.35,
  295. draggable: true,
  296. editable:true,
  297. geodesic: true,
  298. });
  299. @if(isset($areas) && $areas->count() > 0)
  300. @foreach($areas as $a)
  301. polygonss= new google.maps.Polygon({
  302. map,
  303. paths: {!! str_replace('"','',$a->lat_lag) !!},
  304. strokeColor: "#616161",
  305. strokeOpacity: 0.5,
  306. strokeWeight: 1,
  307. fillColor: "#616161",
  308. fillOpacity: 0.35,
  309. draggable: false,
  310. editable:false,
  311. geodesic: true,
  312. });
  313. @endforeach
  314. @endif
  315. const input = document.getElementById("pac-input");
  316. const searchBox = new google.maps.places.SearchBox(input);
  317. map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);
  318. map.addListener("bounds_changed", () => {
  319. searchBox.setBounds(map.getBounds());
  320. });
  321. let markers = [];
  322. searchBox.addListener("places_changed", () => {
  323. const places = searchBox.getPlaces();
  324. //console.log("places");
  325. //console.log(places);
  326. if (places.length == 0) {
  327. return;
  328. }
  329. // Clear out the old markers.
  330. markers.forEach((marker) => {
  331. marker.setMap(null);
  332. });
  333. markers = [];
  334. // For each place, get the icon, name and location.
  335. const bounds = new google.maps.LatLngBounds();
  336. geocoder.geocode({
  337. 'address': places[0].formatted_address
  338. }, function (results, status) {
  339. var sw = results[0].geometry.bounds.getSouthWest();
  340. var ne = results[0].geometry.bounds.getNorthEast();
  341. //console.log('sw');console.log(sw);
  342. var padding = 0.000000001;
  343. var boxCoords = [
  344. new google.maps.LatLng(ne.lat()+padding, ne.lng()+padding),
  345. new google.maps.LatLng(ne.lat()+padding, sw.lng()-padding),
  346. new google.maps.LatLng(sw.lat()-padding, sw.lng()-padding),
  347. new google.maps.LatLng(sw.lat()-padding, ne.lng()+padding),
  348. new google.maps.LatLng(ne.lat()+padding, ne.lng()+padding)
  349. ];
  350. polygons.setMap(null);
  351. polygons= new google.maps.Polygon({
  352. map,
  353. paths: boxCoords,
  354. strokeColor: "#FF0000",
  355. strokeOpacity: 0.8,
  356. strokeWeight: 2,
  357. fillColor: "#FF0000",
  358. fillOpacity: 0.35,
  359. draggable: true,
  360. editable:true,
  361. geodesic: true,
  362. });
  363. });
  364. places.forEach((place) => {
  365. if (!place.geometry || !place.geometry.location) {
  366. console.log("Returned place contains no geometry");
  367. return;
  368. }
  369. const icon = {
  370. url: place.icon,
  371. size: new google.maps.Size(71, 71),
  372. origin: new google.maps.Point(0, 0),
  373. anchor: new google.maps.Point(17, 34),
  374. scaledSize: new google.maps.Size(25, 25),
  375. };
  376. // Create a marker for each place.
  377. /* marker = new google.maps.Marker({
  378. map,
  379. marker_icon,
  380. title: place.name,
  381. position: place.geometry.location,
  382. draggable:true
  383. });
  384. markers.push(
  385. marker
  386. );*/
  387. if (place.geometry.viewport) {
  388. // Only geocodes have viewport.
  389. bounds.union(place.geometry.viewport);
  390. } else {
  391. bounds.extend(place.geometry.location);
  392. }
  393. });
  394. google.maps.event.addListener(map, 'dragend', function(e) {
  395. map_center = map.getCenter();
  396. //geocodePosition(map.getCenter());
  397. var lat = map.getCenter().lat();
  398. var lng = map.getCenter().lng();
  399. $("input[name=lat]").val(lat);
  400. $("input[name=lng]").val(lng);
  401. } );
  402. map.fitBounds(bounds);
  403. map.setZoom(12);
  404. });
  405. } else {
  406. alert('Geocode was not successful for the following reason: ' + status);
  407. }
  408. });
  409. // console.log(uluru);
  410. }
  411. function codeAddress(address) {
  412. geocoder.geocode({ 'address': address }, function (results, status) {
  413. // console.log(results);
  414. uluru = {lat: results[0].geometry.location.lat (), lng: results[0].geometry.location.lng ()};
  415. // console.log (latLng);
  416. if (status == 'OK') {
  417. /* var marker = new google.maps.Marker({
  418. position: uluru,
  419. animation: google.maps.Animation.DROP,
  420. icon:marker_icon,
  421. map: map
  422. });
  423. marker.setMap(map);*/
  424. // console.log (map);
  425. } else {
  426. alert('Geocode was not successful for the following reason: ' + status);
  427. }
  428. });
  429. }
  430. $(function () {
  431. $("body").on("click",".search-location",function () {
  432. if (navigator.geolocation) {
  433. navigator.geolocation.getCurrentPosition(
  434. (position) => {
  435. const pos = {
  436. lat: position.coords.latitude,
  437. lng: position.coords.longitude,
  438. };
  439. marker.setMap(null);
  440. marker = new google.maps.Marker({
  441. position: pos,
  442. map: map,
  443. icon:marker_icon,
  444. draggable:true
  445. });
  446. map.setCenter(pos);
  447. map_center = map.getCenter();
  448. map.setZoom(12);
  449. google.maps.event.addListener(marker, 'dragend', function(e) {
  450. geocodePosition(marker.getPosition());
  451. var lat = marker.getPosition().lat();
  452. var lng = marker.getPosition().lng();
  453. $("input[name=lat]").val(lat);
  454. $("input[name=lng]").val(lng);
  455. } );
  456. },
  457. () => {
  458. // handleLocationError(true, infoWindow, map.getCenter());
  459. }
  460. );
  461. } else {
  462. // Browser doesn't support Geolocation
  463. // handleLocationError(false, infoWindow, map.getCenter());
  464. }
  465. });
  466. $("body").on("click",".save-delivery-area",function () {
  467. var _this = $(this);
  468. _this.attr('disabled','disabled');
  469. var coordinates =polygons.getPath().getArray();
  470. var area_name = $("input[name=area_name]").val();
  471. var min_basket = $("input[name=min_basket]").val();
  472. var delivery_fee = $("input[name=delivery_fee]").val();
  473. if(area_name==""){
  474. $("input[name=area_name]").focus();return;
  475. }
  476. if(min_basket==""){
  477. $("input[name=min_basket]").focus();return;
  478. }
  479. if(delivery_fee==""){
  480. $("input[name=delivery_fee]").focus();return;
  481. }
  482. coordinates = (JSON.stringify(coordinates));
  483. $.ajax({
  484. url:"{!! env('APP_URL') !!}save/outlet/area",
  485. type:"POST",
  486. data:{
  487. coordinates:coordinates,
  488. area_name:area_name,
  489. min_basket:min_basket,
  490. delivery_fee:delivery_fee,
  491. center_radius:uluru,
  492. unique_id:"{!! $outlet->unique_key !!}",
  493. "_token":"{!! csrf_token() !!}",
  494. id:"{!! isset($area)?$area->id:0 !!}"
  495. },success:function (response) {
  496. response = $.parseJSON(response);
  497. if(response.type=="success"){
  498. $.toast({
  499. heading: 'Outlet Area Update.',
  500. text: response.message,
  501. position: 'top-right',
  502. loaderBg: '#ff6849',
  503. icon: 'success',
  504. hideAfter: 3000,
  505. stack: 1
  506. });
  507. setTimeout(function () {
  508. location.reload();
  509. },2000);
  510. }else{
  511. $.toast({
  512. heading: 'Outlet Area Update.',
  513. text: response.message,
  514. position: 'top-right',
  515. loaderBg: '#ff6849',
  516. icon: 'error',
  517. hideAfter: 3000,
  518. stack: 1
  519. });
  520. }
  521. }
  522. });
  523. });
  524. })
  525. </script>
  526. <script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBFh6fzq8G7dgWLfz8kccvTlmPCSI_uWXQ&callback=initMapMeem&libraries=drawing,places&language=ar"></script>
  527. @endsection