form.html.twig 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. {% extends 'SonataAdminBundle:CRUD:base_edit.html.twig' %}
  2. {% block formactions %}
  3. {{ parent() }}
  4. <script src="{{ asset('bundles/baseadmin') }}/ace_editor/src-noconflict/ace.js" type="text/javascript"
  5. charset="utf-8"></script>
  6. <script src="{{ asset('bundles/baseadmin') }}/ace_editor/textarea-as-ace-editor.js" type="text/javascript"
  7. charset="utf-8"></script>
  8. <style type="text/css" media="screen">
  9. .ace_editor {
  10. height: 450px !important;
  11. border: 1px solid #CCCCCC;
  12. }
  13. </style>
  14. <script type="text/javascript">
  15. var modificacion = false;
  16. $(function () {
  17. // buscar la direccion del cliente y la muestra en el mapa.
  18. var objSelectClient = $('input:hidden[id="{{ admin.uniqid }}_clientId"]');
  19. if (objSelectClient.val() != "" &&
  20. !isNaN(objSelectClient.val()) &&
  21. parseInt(objSelectClient.val()) > 0) {
  22. modificacion = true;
  23. var extradata = $('textarea[id="{{ admin.uniqid }}_extraData"]').val();
  24. try {
  25. extradata = JSON.parse(extradata);
  26. if (extradata.lat == undefined || extradata.lng == undefined) {
  27. extradata = null;
  28. }
  29. } catch (ignore) {
  30. extradata = null;
  31. }
  32. if (extradata) {
  33. drawMap(extradata.lat, extradata.lng);
  34. calcularDistanciaNap();
  35. $('input[class="search-input"]').val(extradata.address);
  36. } else {
  37. // no hay direcciones cargadas, entonces la busco desde el cliente
  38. callbackClientId(objSelectClient.val());
  39. }
  40. } else {
  41. if (_MAP_LATITUDE == 0 && _MAP_LONGITUDE == 0) {
  42. setCoordinatesFromConfig(true);
  43. } else {
  44. drawMap(_MAP_LATITUDE, _MAP_LONGITUDE);
  45. }
  46. $("div[id*='_nap']").find(".select2-chosen").html("");
  47. $("select[id*='_nap']").val(0);
  48. }
  49. $("textarea").asAceEditor();
  50. editor = $('textarea').data('ace-editor');
  51. editor.setTheme("ace/theme/github");
  52. editor.getSession().setMode("ace/mode/json");
  53. editor.setFontSize(14);
  54. editor.setShowInvisibles(true);
  55. editor.getSession().setTabSize(2);
  56. editor.getSession().setUseSoftTabs(true);
  57. editor.getSession().setUseWrapMode(true);
  58. editor.setShowPrintMargin(false);
  59. });
  60. // Al seleccionar una OLT se muestra la config avanzada
  61. // según la marca del modelo
  62. function ajax_olt_model_mark() {
  63. var olt = $('[id="{{ admin.uniqid }}_olt"]').val();
  64. $.ajax({
  65. url: '{{ path('ajax_olt_model_mark') }}',
  66. type: 'POST',
  67. data: {
  68. id: olt
  69. },
  70. success: function (result) {
  71. if(result.mark !== 'ERROR') {
  72. $('.olt_mark').addClass('hidden');
  73. $('.' + result.mark).removeClass('hidden');
  74. $("div." + result.mark + " div div.box-header h4.box-title").html(result.mark);
  75. // FiberHome and FiberLink have vlans but in FiberHome vlans is required (at least vlanid_data)
  76. if(result.mark === 'FiberHome') {
  77. $('#{{ admin.uniqid ~ "_vlans" }}').attr('required',true)
  78. $("label[for='{{ admin.uniqid ~ '_vlans' }}']").addClass('required');
  79. } else {
  80. $('#{{ admin.uniqid ~ "_vlans" }}').attr('required',false)
  81. $("label[for='{{ admin.uniqid ~ '_vlans' }}']").removeClass('required');
  82. }
  83. $('.zte_v4').addClass('hidden');
  84. // El modelo de OLT es ZTE V4, entonces muestro los campos
  85. if (result.name.includes('ZTE') && result.name.includes('V4')) {
  86. $('.zte_v4').removeClass('hidden');
  87. }
  88. }
  89. }
  90. });
  91. }
  92. // ajax_olt_model_mark();
  93. {#$('[id="{{ admin.uniqid }}_olt"]').on('click', ajax_olt_model_mark);#}
  94. {# Se chequea la position si esta libre, según el nap seleccionado #}
  95. $('#{{ admin.uniqid ~ "_position" }}').on('change', checkPosition);
  96. function checkPosition() {
  97. $('#{{ admin.uniqid ~ "_position" }}').parent().find('#error_position').remove();
  98. var $position = $('#{{ admin.uniqid ~ "_position" }}').val();
  99. var $nap = $('#{{ admin.uniqid ~ "_nap" }}').val();
  100. if ($position && $nap) {
  101. $.ajax({
  102. url: '{{ path('ajax_check_position') }}',
  103. type: 'POST',
  104. data: {
  105. position: $position,
  106. nap: $nap,
  107. },
  108. async: false,
  109. success: function (data) {
  110. if (data.result === 'error') {
  111. message = '{{ 'error_onu_position'|trans({}, 'FTTHBundle') }}';
  112. div = '<div id="error_position" class="alert alert-danger alert-dismissable">\
  113. <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>'
  114. + message + '</div>'
  115. $('#{{ admin.uniqid ~ "_position" }}').parent().append(div);
  116. }
  117. }
  118. });
  119. }
  120. }
  121. function callbackClientId(clientId) {
  122. $.ajax({
  123. url: '{{ path('ajax_client_data') }}',
  124. dataType: 'json',
  125. delay: 250,
  126. data: {
  127. q: clientId
  128. }
  129. }).done(function (data) {
  130. var extradata = null;
  131. if (data.results[0].location) {
  132. try {
  133. extradata = JSON.parse(data.results[0].location.extraData);
  134. if (extradata.lat == undefined || extradata.lng == undefined) {
  135. extradata = null;
  136. }
  137. } catch (ignore) {
  138. }
  139. }
  140. if (extradata === null) {
  141. googleSearchDirectionAndShowMaps(data.results[0].address);
  142. } else {
  143. $('input[class="search-input"]').val(data.results[0].address);
  144. drawMap(extradata.lat, extradata.lng);
  145. }
  146. calcularDistanciaNap();
  147. });
  148. }
  149. /**
  150. * funcion que busca una direccion y la muestra en el mapa.
  151. * @param address Contiene la direccion.
  152. */
  153. function googleSearchDirectionAndShowMaps(address) {
  154. $('input[class="search-input"]').val(address);
  155. $.ajax({
  156. url: "https://maps.googleapis.com/maps/api/geocode/json?address='" + address + "'&key=AIzaSyDYPe_h1T_5ThFNZukx05FJY21IAejj_LA",
  157. type: "POST"
  158. }).done(function (res) {
  159. if (res != undefined && res.status == google.maps.GeocoderStatus.OK) {
  160. drawMap(res.results[0].geometry.location.lat, res.results[0].geometry.location.lng);
  161. } else {
  162. // direccion no encontrada por google
  163. var msg = "{{ 'error.address_not_found'|trans({}, 'FTTHBundle') }}";
  164. showError(msg.replace('%client_address%', address));
  165. }
  166. }).error(function (res) {
  167. // direccion no encontrada por google, esto se puede deber a la cantidad de consultas que se
  168. // realizan al webservice de google
  169. });
  170. }
  171. /**
  172. * Funcion que dibuja el mapa.
  173. * @param lat
  174. * @param lng
  175. */
  176. function drawMap(lat, lng) {
  177. loc = new L.latLng(lat, lng);
  178. drawMarker();
  179. setDataValue();
  180. }
  181. /**
  182. * Busca y calcula la distancia a los nap y la cantidad de puertos libres.
  183. */
  184. function calcularDistanciaNap() {
  185. var origin = null;
  186. try {
  187. origin = JSON.parse($("input[id*='_location_extraData']").attr('value'));
  188. } catch (ignore) {
  189. }
  190. if (origin != null) {
  191. $.ajax({
  192. url: '{{ path('ajax_distance_nap_onu') }}',
  193. dataType: 'json',
  194. type: "GET",
  195. data: {
  196. lat: origin.lat,
  197. lng: origin.lng,
  198. napId: modificacion ? $("select[id*='_nap']").val() : 0
  199. }
  200. }).done(function (res) {
  201. var select = $("select[id*='_nap']");
  202. var span = $("div[id*='_nap']").find(".select2-chosen");
  203. var codigoNap = select.val(), nap = "";
  204. span.html("");
  205. select.find("option").remove().end();
  206. $.each(res, function (i, obj) {
  207. obj = JSON.parse(obj);
  208. for (var i = 0; i < obj.length; i++) {
  209. if (obj[i].distance != -1) {
  210. var tmp = obj[i].name +
  211. " ({{ 'Free Port'|trans({}, 'FTTHBundle') }}: " + obj[i].freePort + " - " +
  212. "OLT: " + obj[i].olt + " - " +
  213. "Slot: " + obj[i].slot + " - " +
  214. "Link: " + obj[i].link + " - " +
  215. "{{ 'Distance'|trans({}, 'FTTHBundle') }}: " + obj[i].distance + " KM. - " +
  216. "{{ 'Address'|trans({}, 'FTTHBundle') }}: " + obj[i].address + " )";
  217. select.append(
  218. '<option value="' + obj[i].id + '" >' + tmp +
  219. '</option>'
  220. );
  221. if (codigoNap == obj[i].id) {
  222. nap = tmp;
  223. }
  224. }
  225. }
  226. for (var i = 0; i < obj.length; i++) {
  227. if (obj[i].distance == -1) {
  228. var tmp = obj[i].name + " ({{ 'Free Port'|trans({}, 'FTTHBundle') }}: " + obj[i].freePort + " - ";
  229. tmp +=
  230. "OLT: " + obj[i].olt + " - " +
  231. "Slot: " + obj[i].slot + " - " +
  232. "Link: " + obj[i].link + " - ";
  233. tmp += "{{ 'Distance'|trans({}, 'FTTHBundle') }}: " + obj[i].distanceMessage;
  234. if (obj[i].address != null && obj[i].address.length > 0) {
  235. tmp += " - {{ 'Address'|trans({}, 'FTTHBundle') }}: " + obj[i].address;
  236. }
  237. tmp += ")";
  238. select.append(
  239. '<option value="' + obj[i].id + '" >' + tmp +
  240. '</option>'
  241. );
  242. if (codigoNap == obj[i].id) {
  243. nap = tmp;
  244. }
  245. }
  246. }
  247. });
  248. span.html(nap);
  249. select.val(codigoNap);
  250. });
  251. }
  252. }
  253. // Al cambiar un valor de ONU Template se envía como parámetro el id
  254. // y se recarga la página
  255. function onuTemplateReloadPage() {
  256. if ($('#{{ admin.uniqid ~ "_onuTemplate" }}')) {
  257. var onuTemplateId = $('#{{ admin.uniqid ~ "_onuTemplate" }}').val();
  258. var url = '{{ path('admin_ftth_onu_create') }}';
  259. if (onuTemplateId) {
  260. var parameters = ['onu_template=' + onuTemplateId];
  261. if (window.location.href.includes('?')) {
  262. var pieces = window.location.href.split('?');
  263. var parametersSplit = pieces[1].split('&');
  264. for (var i = 0; i < parametersSplit.length; i++) {
  265. var parameter = parametersSplit[i].split('=');
  266. if (parameter[0] != 'onu_template') {
  267. parameters.push(parametersSplit[i]);
  268. }
  269. }
  270. }
  271. window.location = url + '?' + parameters.join('&');
  272. }
  273. }
  274. }
  275. $('#{{ admin.uniqid ~ "_onuTemplate" }}').on('change', onuTemplateReloadPage);
  276. // Al seleccionar un NAP se selecciona la OLT y se debe cargar la configuracion avanzada
  277. function ajax_nap_olt() {
  278. var nap = $('[id="{{ admin.uniqid }}_nap"]').val();
  279. $.ajax({
  280. url: '{{ path('ajax_nap_olt') }}',
  281. dataType: 'json',
  282. type: "GET",
  283. data: {
  284. id: nap
  285. },
  286. success: function (result) {
  287. if (result && result.result > 0) {
  288. $('[id="{{ admin.uniqid }}_olt"]').val(result.result);
  289. ajax_olt_model_mark();
  290. } else {
  291. var msg = "{{ 'error.nap_relation_olt_not_found'|trans({}, 'FTTHBundle') }}";
  292. showError(msg);
  293. }
  294. }
  295. });
  296. }
  297. $('[id="{{ admin.uniqid }}_nap"]').on('click', ajax_nap_olt);
  298. ajax_nap_olt();
  299. ajax_olt_model_mark();
  300. function checkLengthPonSerialNumber() {
  301. var obj = $('[id="{{ admin.uniqid }}_ponSerialNumber"]');
  302. var objClas = $('[required="required"][class*="form-group"][id*="ponSerialNumber"]');
  303. var pon = obj.val();
  304. var claseError = " has-error";
  305. var clas = objClas.attr('class');
  306. if (pon && (pon.length == 12 || pon.length == 16)) {
  307. objClas.attr('class', objClas.attr('class').replace(claseError, ""));
  308. } else {
  309. // addClassError(id, claseError);
  310. if (clas.indexOf(claseError) === -1) {
  311. objClas.attr('class', clas + claseError);
  312. }
  313. }
  314. }
  315. $('[id="{{ admin.uniqid }}_ponSerialNumber"]').on('blur', checkLengthPonSerialNumber);
  316. function addAddressToExtraData(){
  317. var address = $('input[class="search-input"]').val();
  318. var extradata = $('textarea[id="{{ admin.uniqid }}_extraData"]').val();
  319. try {
  320. extradata = JSON.parse(extradata);
  321. extradata.address = address;
  322. $('textarea[id="{{ admin.uniqid }}_extraData"]').val(JSON.stringify(extradata));
  323. } catch (ignore) {
  324. }
  325. }
  326. $('#{{ admin.uniqid ~ "_radiusAuth" }}').on('change', function() {
  327. validateMac();
  328. });
  329. $('#{{ admin.uniqid ~ "_mac" }}').on('change', function() {
  330. validateMac();
  331. });
  332. function validateMac() {
  333. let uniqid = '{{ admin.uniqid }}';
  334. let radiusAuth = $(`#${uniqid}_radiusAuth`).val();
  335. let macObj = $(`#${uniqid}_mac`);
  336. let macLabel = $(`label[for=${uniqid}_mac]`);
  337. let macDiv = $(`#sonata-ba-field-container-${uniqid}_mac`);
  338. macObj.attr('placeholder','cafecafecafe');
  339. if(radiusAuth === 'mac') {
  340. if(macObj.val().length != 12) {
  341. macDiv.addClass("has-error");
  342. } else {
  343. macDiv.removeClass("has-error");
  344. }
  345. macObj.attr('maxlength',12);
  346. macObj.attr('minlength',12);
  347. macObj.attr('required','required');
  348. macDiv.attr('required','required');
  349. macLabel.addClass('required');
  350. } else {
  351. macObj.removeAttr("maxlength");
  352. macObj.removeAttr("minlength");
  353. macObj.removeAttr("required");
  354. macDiv.removeAttr("required");
  355. macLabel.removeClass('required');
  356. }
  357. }
  358. validateMac();
  359. </script>
  360. {% endblock %}