Rev 36668 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<section class="wrapper"><div class="row"><div class="col-lg-12"><h3 class="page-header"><i class="icon_pin_alt"></i> Auth User Base Location</h3><ol class="breadcrumb"><li><i class="fa fa-home"></i><a href="${rc.contextPath}/dashboard">Home</a></li><li><i class="icon_group"></i> Partner Acquisition</li><li><i class="icon_pin_alt"></i> Base Location</li></ol></div></div><div class="row" style="margin-bottom:10px;"><div class="col-lg-12" style="display:flex; gap:10px; align-items:center; flex-wrap:wrap;"><select id="blCategory" class="form-control input-sm" style="width:140px;"><option value="4">Sales</option><option value="20">BGC</option></select><select id="blLevel" class="form-control input-sm" style="width:140px;"><option value="">Level</option>#foreach($e in $escalationTypes)<option value="$e">$e</option>#end</select><select id="blAuthUser" class="form-control input-sm" style="width:240px;"><option value="">Select User</option></select><span id="blCurrent" style="color:#777; font-size:12px; margin-left:8px;"></span></div></div><div class="row"><div class="col-lg-12" style="margin-bottom:10px;"><input id="blSearch" type="text" class="form-control input-sm"placeholder="Search a place..." style="width:60%; display:inline-block;"autocomplete="off"><span style="font-size:11px; color:#888; margin-left:8px;">or click on the map to drop a pin</span></div></div><div class="row"><div class="col-lg-9"><div id="blMap" style="width:100%; height:520px; border-radius:8px; background:#eee;"></div></div><div class="col-lg-3"><div style="padding:10px; background:#f8f9fa; border-radius:6px;"><div style="font-size:12px; color:#555;">Selected:</div><div id="blPicked" style="font-weight:600; margin-top:4px;">-</div><div id="blPickedCoords" style="font-size:11px; color:#888; margin-top:4px;"></div><button id="blSave" class="btn btn-primary" style="width:100%; margin-top:14px;" disabled>Save Base Location</button><div id="blMsg" style="margin-top:10px; font-size:12px;"></div></div></div></div></section><script>// Ensure Google Maps + Places is loaded (works whether page is loaded inline or full)function blEnsureMaps(cb) {if (typeof google !== 'undefined' && google.maps && google.maps.places) {cb();return;}var existing = document.getElementById('gmaps-api-loader');if (existing) {var t = setInterval(function () {if (typeof google !== 'undefined' && google.maps && google.maps.places) {clearInterval(t);cb();}}, 100);return;}var s = document.createElement('script');s.id = 'gmaps-api-loader';s.src = 'https://maps.googleapis.com/maps/api/js?key=AIzaSyAckO0y4Z6WhBOuMjNjioWLSYZDhGEvGBc&libraries=places&v=weekly';s.async = true;s.onload = function () {cb();};document.head.appendChild(s);}blEnsureMaps(function () {var blMap, blMarker, blAutocomplete;var picked = {lat: null, lng: null, name: '', address: ''};function setPicked(lat, lng, name, address) {picked.lat = lat;picked.lng = lng;picked.name = name || '';picked.address = address || name || '';$('#blPicked').text(name || '(unnamed pin)');$('#blPickedCoords').text(lat.toFixed(6) + ', ' + lng.toFixed(6));$('#blSave').prop('disabled', !$('#blAuthUser').val());}function placeMarker(lat, lng) {var pos = new google.maps.LatLng(lat, lng);if (!blMarker) {blMarker = new google.maps.Marker({map: blMap, position: pos, draggable: true});blMarker.addListener('dragend', function (e) {setPicked(e.latLng.lat(), e.latLng.lng(), picked.name, picked.address);});} else {blMarker.setPosition(pos);}blMap.panTo(pos);if (blMap.getZoom() < 12) blMap.setZoom(14);}// Init map (centered on India)blMap = new google.maps.Map(document.getElementById('blMap'), {center: {lat: 22.0, lng: 79.0}, zoom: 5});blMap.addListener('click', function (e) {placeMarker(e.latLng.lat(), e.latLng.lng());setPicked(e.latLng.lat(), e.latLng.lng(), 'Picked location', '');});// Places autocompleteblAutocomplete = new google.maps.places.Autocomplete(document.getElementById('blSearch'),{componentRestrictions: {country: 'in'}});blAutocomplete.addListener('place_changed', function () {var p = blAutocomplete.getPlace();if (!p.geometry) return;var lat = p.geometry.location.lat(), lng = p.geometry.location.lng();placeMarker(lat, lng);setPicked(lat, lng, p.name || p.formatted_address || '', p.formatted_address || '');});// Level change -> load users (direct binding with namespace so re-loading// the page doesn't stack duplicate handlers from previous loads)$('#blLevel').off('change.bl').on('change.bl', function () {var level = $(this).val();$('#blAuthUser').html('<option value="">Select User</option>');$('#blCurrent').text('');$('#blSave').prop('disabled', true);if (!level) return;console.log('[BL] loading users level=' + level + ' cat=' + $('#blCategory').val());$.ajax({url: context + '/beatPlan/getAuthUsers',type: 'GET',dataType: 'json',data: {categoryId: $('#blCategory').val(), escalationType: level},success: function (r) {var data = r.response || r;console.log('[BL] users loaded:', data && data.length);var h = '<option value="">Select User</option>';if (data && data.length) {data.forEach(function (u) {h += '<option value="' + u.id + '">' + u.name + '</option>';});} else {h = '<option value="">No users at this level</option>';}$('#blAuthUser').html(h);},error: function (xhr) {console.error('[BL] getAuthUsers failed', xhr.status, xhr.responseText);$('#blAuthUser').html('<option value="">Error loading users</option>');}});});// Category change resets level + user$('#blCategory').off('change.bl').on('change.bl', function () {$('#blLevel').val('').trigger('change.bl');});// User change -> load current base location (if any)$('#blAuthUser').off('change.bl').on('change.bl', function () {var uid = $(this).val();$('#blCurrent').text('');$('#blSave').prop('disabled', true);if (!uid) return;$.ajax({url: context + '/beatPlan/getBaseLocation',type: 'GET', dataType: 'json',data: {authUserId: uid},success: function (r) {var data = r.response || r;if (data && data.locationName) {$('#blCurrent').html('Current: <strong>' + data.locationName + '</strong> ('+ data.latitude + ', ' + data.longitude + ')');placeMarker(parseFloat(data.latitude), parseFloat(data.longitude));setPicked(parseFloat(data.latitude), parseFloat(data.longitude),data.locationName, data.address || '');} else {$('#blCurrent').html('<em>No base location set yet</em>');$('#blSave').prop('disabled', picked.lat == null);}}});});// Save$('#blSave').off('click.bl').on('click.bl', function () {var uid = $('#blAuthUser').val();if (!uid) {alert('Pick a user');return;}if (picked.lat == null) {alert('Pick a location on the map');return;}var btn = $(this);btn.prop('disabled', true).text('Saving...');$('#blMsg').text('');$.ajax({url: context + '/beatPlan/updateBaseLocation',type: 'POST',data: {authUserId: uid,locationName: picked.name || ('Location ' + picked.lat.toFixed(4) + ',' + picked.lng.toFixed(4)),latitude: String(picked.lat),longitude: String(picked.lng),address: picked.address},success: function (r) {var d = r.response || r;$('#blMsg').html('<span style="color:#2e7d32;">Saved successfully.</span>');btn.prop('disabled', false).text('Save Base Location');// Refresh "Current" line$('#blAuthUser').trigger('change');},error: function (xhr) {var msg = 'Save failed';try {var err = JSON.parse(xhr.responseText);msg = (err.response && err.response.message) || msg;} catch (e) {}$('#blMsg').html('<span style="color:#c62828;">' + msg + '</span>');btn.prop('disabled', false).text('Save Base Location');}});});});</script>