outlet-delivery-area.blade.php 22 KB

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