templates/data.twig line 1

Open in your IDE?
  1. {% extends "base.twig" %}
  2. {% block modal %}
  3.     <!-- Add dictionary modal content -->
  4.     <div id="addDataModal" class="modal fade" role="dialog" aria-labelledby="addDataModalLabel">
  5.         <div class="modal-dialog">
  6.             <div class="modal-content">
  7.                 <div class="modal-header">
  8.                     <h4 class="modal-title" id="addDataModalLabel">Add Dictionary</h4>
  9.                     <button type="button" class="close" data-dismiss="modal">&times;</button>
  10.                 </div>
  11.                 <!-- /.modal-header -->
  12.                 <div class="modal-body">
  13.                     <form class="form-horizontal" role="form">
  14.                         <div class="form-group row has-feedback">
  15.                             <label class="col-sm-3 control-label" for="username">Username</label>
  16.                             <div class="col-sm-9">
  17.                                 <input type="text" class="form-control" name="username" id="username" placeholder="Username">
  18.                             </div>
  19.                             <!-- col-12 col-sm-9 -->
  20.                         </div>
  21.                         <!-- form-group -->
  22.                         <div class="form-group row has-feedback">
  23.                             <label class="col-sm-3 control-label" for="firstname">First Name</label>
  24.                             <div class="col-sm-9">
  25.                                 <input type="text" class="form-control" name="firstname" id="firstname" placeholder="First Name">
  26.                             </div>
  27.                             <!-- col-12 col-sm-9 -->
  28.                         </div>
  29.                         <!-- form-group -->
  30.                         <div class="form-group row has-feedback">
  31.                             <label class="col-sm-3 control-label" for="lastname">Last Name</label>
  32.                             <div class="col-sm-9">
  33.                                 <input type="text" class="form-control" name="lastname" id="lastname" placeholder="Last Name">
  34.                             </div>
  35.                             <!-- col-12 col-sm-9 -->
  36.                         </div>
  37.                         <!-- form-group -->
  38.                         <div class="form-group row has-feedback">
  39.                             <label class="col-sm-3 control-label" for="password">Password</label>
  40.                             <div class="col-sm-9">
  41.                                 <input type="text" class="form-control" name="password" id="password" placeholder="Password">
  42.                             </div>
  43.                             <!-- col-12 col-sm-9 -->
  44.                         </div>
  45.                         <!-- form-group -->
  46.                         <div class="form-group row">
  47.                             <div class="col-sm-9 offset-sm-3">
  48.                                 <button type="submit" class="btn btn-primary">Add</button>
  49.                                 <button type="button" class="btn btn-danger" data-dismiss="modal">Cancel</button>
  50.                             </div>
  51.                             <!-- col-12 col-sm-10 -->
  52.                         </div>
  53.                         <!-- form-group -->
  54.                     </form>
  55.                     <!-- form-horizontal -->
  56.                 </div>
  57.                 <!-- /.modal-body -->
  58.             </div>
  59.             <!-- /.modal-content -->
  60.         </div>
  61.         <!-- /.modal-dialog -->
  62.     </div>
  63.     <!-- /.addDataModal -->
  64.     <!-- Delete modal content -->
  65.     <div id="delete-modal" class="modal fade" role="dialog" aria-labelledby="delete-modal-label">
  66.         <div class="modal-dialog">
  67.             <div class="modal-content">
  68.                 <div class="modal-header">
  69.                     <h4 class="modal-title" id="delete-user-modal-title">Delete</h4>
  70.                     <button type="button" class="close" data-dismiss="modal">&times;</button>
  71.                 </div>
  72.                 <!-- /.modal-header -->
  73.                 <div class="modal-body">
  74.                     <p>Delete Dictionary or Data? </p>
  75.                 </div>
  76.                 <!-- /.modal-body -->
  77.                 <div class="modal-footer">
  78.                     <button type="button" class="btn btn-danger"  id="chose-delete-dictionary-button">Delete Dictionary</button>
  79.                     <button type="button" class="btn btn-danger"  id="chose-delete-data-button">Delete Data</button>
  80.                     <button type="button" class="btn btn-primary" data-dismiss="modal">Cancel</button>
  81.                 </div>
  82.             </div>
  83.         </div>
  84.         <!-- /.modal-dialog -->
  85.     </div>
  86.     <!-- /.delete-modal -->
  87.     <!-- Import progress modal -->
  88.     <div id="main-progress-modal" class="modal" data-keyboard="false" data-backdrop="static">
  89.         <div class="modal-dialog">
  90.             <div class="modal-content">
  91.                 <div class="modal-header"><h4>Processing....</h4>
  92.                     <div class="progress">
  93.                         <div style="width:0%" class="progress-bar progress-bar-striped progress-bar-animated" 
  94.                              role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="2">
  95.                             <div class="progressText">0% Complete</div>
  96.                         </div>
  97.                     </div>
  98.                     <!-- /.progress -->
  99.                 </div>
  100.                 <!-- /.modal-header -->
  101.             </div>
  102.             <!-- /.modal-content -->
  103.         </div>
  104.         <!-- /.modal-dialog -->
  105.     </div>
  106.     <!-- /.main-progress-modal -->
  107.     <!-- Import area names modal content -->
  108.     <div id="import-area-names-modal" class="modal fade" role="dialog" aria-labelledby="import-area-names-modal-label">
  109.         <div class="modal-dialog">
  110.             <div class="modal-content">
  111.                 <div class="modal-header">
  112.                     <h4 class="modal-title" id="import-area-names-modal-label">Import Report Labels</h4>
  113.                     <button type="button" class="close" data-dismiss="modal">&times;</button>
  114.                 </div>
  115.                 <!-- /.modal-header -->
  116.                 <div class="modal-body">
  117.                     <form class="form-vertical" id="import-user-form" role="form">
  118.                         <div class="row">
  119.                             <div class="col-12">
  120.                                 <div id="import-modal-alert" class='alert-placeholder-cspro alert-margin-cspro' ></div>
  121.                                 <!-- /.alert -->
  122.                             </div>
  123.                             <!-- /.col-12 -->
  124.                         </div>
  125.                         <!-- /.row -->
  126.                         <div class="form-group row" >
  127.                             <label for="import-file-name" class="control-label">Import File:</label>
  128.                             <div class="input-group">
  129.                                 <input type="text" class="form-control" id="import-file-name" readonly>
  130.                                 <label class="input-group-append">
  131.                                     <span class="btn btn-primary">
  132.                                         Browse&hellip; <input type="file" id="import-file" style="display: none;" accept=".csv">
  133.                                     </span>
  134.                                 </label>
  135.                             </div>
  136.                             <!-- /.input-group -->
  137.                         </div>
  138.                         <!-- /.form-group -->
  139.                         <div class="form-group row">
  140.                             <div>
  141.                                 <div class="checkbox">
  142.                                     <label>
  143.                                         <input id="import-header-flag" type="checkbox"> CSV file has a header row
  144.                                     </label>
  145.                                 </div>
  146.                                 <!-- /.checkbox -->
  147.                             </div>
  148.                         </div>
  149.                         <!-- /.form-group -->
  150.                     </form>
  151.                     <!-- /.form-vertical -->
  152.                 </div>
  153.                 <!-- /.modal-body -->
  154.                 <div class="form-group">
  155.                     <div class="modal-footer">
  156.                         <button type="submit" class="btn btn-primary" id="import-button">Import</button>
  157.                         <button type="button" class="btn btn-danger" data-dismiss="modal">Cancel</button>
  158.                         <button type="button" class="btn btn-primary" id="import-help-button">Help</button>
  159.                     </div>
  160.                     <!-- /.modal-footer -->
  161.                 </div>
  162.                 <!-- /.form-group -->
  163.             </div>
  164.             <!-- /.modal-content -->
  165.         </div>
  166.         <!-- /.modal-dialog -->
  167.     </div>
  168.     <!-- /.import-area-names-modal -->
  169.     <!-- Delete area names modal content -->
  170.     <div id="delete-area-names-modal" class="modal fade" role="dialog" aria-labelledby="delete-area-names-modal-label">
  171.         <div class="modal-dialog">
  172.             <div class="modal-content">
  173.                 <div class="modal-header">
  174.                     <h4 class="modal-title" id="delete-area-names-modal-title">Delete Report Labels</h4>
  175.                     <button type="button" class="close" data-dismiss="modal">&times;</button>
  176.                 </div>
  177.                 <!-- /.modal-header -->
  178.                 <div class="modal-body">
  179.                     <p>Are you sure you want to delete the labels used in the report?</p>
  180.                 </div>
  181.                 <!-- /.modal-body -->
  182.                 <div class="modal-footer">
  183.                     <button type="button" class="btn btn-danger"  id="delete-area-names-yes-button">Yes</button>
  184.                     <button type="button" class="btn btn-primary" data-dismiss="modal">No</button>
  185.                 </div>
  186.             </div>
  187.             <!-- /.modal-content -->
  188.         </div>
  189.         <!-- /.modal-dialog -->
  190.     </div>
  191.     <!-- /.delete-area-names-modal -->
  192. {% endblock %}
  193. {# modal #}
  194. {% block helps %}
  195. <li class="nav-item mx-1" >
  196.     <a href="https://www.csprousers.org/help/CSWeb/accessing_data.html" target="_blank" class="nav-text-cspro"><i class="far fa-question-circle"></i> Help</a>
  197. </li>
  198. {% endblock %}
  199. {# helps #}
  200. {% block content %}
  201.     <div class="row">
  202.         <div class="col-12">
  203.             <div id="alert" class="alert-placeholder-cspro alert-margin-cspro">
  204.             </div>
  205.             <!-- /.alert -->
  206.         </div>
  207.         <!-- /.col-12 -->
  208.     </div>
  209.     <!-- /.row -->
  210.     <div class="row">
  211.         <div class="col-12">
  212.             <div class="card shadow mb-4">
  213.                 <div class="card-header py-2">
  214.                     <i class="fas fa-database fa-fw"></i> Data
  215.                     <div class="btn-toolbar float-right">
  216.                         <label class="btn btn-primary btn-sm btn-file float-right m-1">
  217.                             Add Dictionary <input type="file" id="fileInput" accept=".dcf" style="display: none;"/>
  218.                         </label>
  219.                         <button type="button" class="btn btn-primary btn-sm float-right m-1" id="import-area-names-button">Import Report Labels</button>
  220.                         <button type="button" class="btn btn-danger btn-sm float-right m-1" id="delete-area-names-button">Delete Report Labels</button>
  221.                     </div>
  222.                 </div>
  223.                 <!-- /.panel-heading -->
  224.                 <div class="card-body">
  225.                 <div class="table-responsive">
  226.                     <table id="dictionary-data-table" class="table table-striped table-bordered table-hover">
  227.                         <thead>
  228.                             <tr>
  229.                                 <th class="col-4">Dictionary Label</th>
  230.                                 <th class="col-4">Dictionary Name</th>
  231.                                 <th class="col-2">Cases</th>
  232.                                 <th style="text-align: center" class="col-1">Download</th>
  233.                                 <th style="text-align: center" class="col-1">Delete</th>
  234.                             </tr>
  235.                         </thead>
  236.                         <tbody>
  237.                             {% for dict in dictionaries %}
  238.                                 <tr data-dictname={{ dict.name}} data-dictlabel="{{ dict.label}}">
  239.                                     <td>{{ dict.label}}</td>
  240.                                     <td>{{ dict.name}}</td>
  241.                                     <td class="caseCount">{{ dict.caseCount}}</td>
  242.                                     <td style="text-align: center"><a href="{{path('downloadDictionary',{'dictname':dict.name}, true)}}"><i class="fas fa-download fa-fw"></i></a></td>
  243.                                     <td style="text-align: center"><a href="javascript:;" class="delete-button-class"><i class="fas fa-trash-alt fa-fw"></i></a></td>
  244.                                 </tr>
  245.                             {% endfor %}
  246.                         </tbody>
  247.                     </table>
  248.                 </div>
  249.                 </div>
  250.                 <!-- /.table-responsive -->
  251.             </div>
  252.             <!-- /.panel -->
  253.         </div>
  254.         <!-- /.col-12 -->
  255.     </div>
  256.     <!-- /.row -->
  257. {% endblock %}
  258. {# content #}
  259. {% block scripts %}
  260.     <!-- Page-Level Scripts -->
  261.     <script>
  262.         "use strict";
  263.         $(document).ready(function () {
  264.             $("#data-nav-item").removeClass('nav-item');
  265.             $("#data-nav-item").addClass('nav-item active');
  266.             
  267.             if (sessionStorage.getItem("add-dict-success")) {
  268.                 ui.showAlert(sessionStorage.getItem("add-dict-success"), "alert alert-success");
  269.                 sessionStorage.clear();
  270.             } else if (sessionStorage.getItem("add-dict-failure")) {
  271.                 ui.showAlert(sessionStorage.getItem("add-dict-failure"), "alert alert-danger");
  272.                 sessionStorage.clear();
  273.             }
  274.             $('#dictionary-data-table').DataTable({
  275.                 columnDefs: [{
  276.                     orderable: false,
  277.                     targets: [3,4]
  278.                     }]
  279.             });
  280.             $("#fileInput").change(db.uploadDict);
  281.             // Delete Dictionary OR Data functionality
  282.             (function () {
  283.                 var tr;
  284.                 $(".delete-button-class").on("click", function (event) {
  285.                     tr = $(event.target).closest("tr");
  286.                     var dictionaryName = $(tr).data("dictname");
  287.                     var dictionaryLabel = $(tr).data("dictlabel");
  288.                     var modalText = 'Do you want to delete the "' + dictionaryLabel + ' (' + dictionaryName + ')" dictionary, or the data in it?';
  289.                     $("#delete-modal").find('.modal-body').text(modalText);
  290.                     $("#delete-modal").modal("show");
  291.                 });
  292.                 $("#chose-delete-data-button").on("click", function (event) {
  293.                     event.preventDefault();
  294.                     $("#delete-modal").modal("hide");
  295.                     // get the user name of the nearest row
  296.                     var dictionaryName = $(tr).data("dictname");
  297.                     var dictionaryLabel = $(tr).data("dictlabel");
  298.                     $.ajax({
  299.                         type: "DELETE",
  300.                         url: "{{ path('dashboard') }}" + "/dictionaries/" + dictionaryName + "/data",
  301.                         dataType: "json",
  302.                         success: function (response) {
  303.                             if (response.code === 200) {
  304.                                 var alertMsg = 'Delete data for the dictionary "' + dictionaryLabel + ' (' + dictionaryName + ')" successful';
  305.                                 ui.showAlert(alertMsg, "alert alert-success");
  306.                                 // alw - update UI to show 0 for count cases immediately. future refreshes will use value from dict.caseCount.
  307.                                 $(tr).find("td.caseCount").html('0');
  308.                             } else {
  309.                                 var alertMsg = 'Failed to delete data for the dictionary "' + dictionaryLabel + ' (' + dictionaryName + ')"';
  310.                                 alertMsg += " " + response.code + " " + response.Message;
  311.                                 ui.showAlert(alertMsg, "alert alert-danger");
  312.                             }
  313.                         },
  314.                         error: function (response) {
  315.                             if (response.status === 401 || response.status === 405) {
  316.                                 window.location.href = "{{ path('logout') }}";
  317.                             }
  318.                         },
  319.                         failure: function (errMsg) {
  320.                             alert("error!");
  321.                         }
  322.                     });
  323.                 });
  324.                 $("#chose-delete-dictionary-button").on("click", function (event) {
  325.                     event.preventDefault();
  326.                     $("#delete-modal").modal("hide");
  327.                     // get the user name of the nearest row
  328.                     var dictionaryName = $(tr).data("dictname");
  329.                     var dictionaryLabel = $(tr).data("dictlabel");
  330.                     $.ajax({
  331.                         type: "DELETE",
  332.                         url: "{{ path('dashboard') }}" + "/dictionaries/" + dictionaryName,
  333.                         dataType: "json",
  334.                         success: function (response) {
  335.                             if (response.code === 200) {
  336.                                 var alertMsg = 'Delete dictionary "' + dictionaryLabel + ' (' + dictionaryName + ')" successful';
  337.                                 ui.showAlert(alertMsg, "alert alert-success");
  338.                                 $(tr).remove();
  339.                             } else {
  340.                                 var alertMsg = 'Failed to delete dictionary "' + dictionaryLabel + ' (' + dictionaryName + ')"';
  341.                                 alertMsg += " " + response.code + " " + response.Message;
  342.                                 ui.showAlert(alertMsg, "alert alert-danger");
  343.                             }
  344.                         },
  345.                         error: function (response) {
  346.                             if (response.status === 401 || response.status === 405) {
  347.                                 window.location.href = "{{ path('logout') }}";
  348.                             }
  349.                         },
  350.                         failure: function (errMsg) {
  351.                             alert("error!");
  352.                         }
  353.                     });
  354.                 });
  355.             })();
  356.             // Import/delete report labels
  357.             $("#import-area-names-button").click(function () {
  358.                 var $input = $("#import-file");
  359.                 $input.replaceWith($input.val('').clone(true));
  360.                 $("#import-header-flag").removeAttr('checked'); //reset the checkbox header flag
  361.                 $("#import-file-name").val('');
  362.                 $("#import-modal-alert").hide();
  363.                 $("#import-area-names-modal").modal("show");
  364.             });
  365.             $("#import-file").change(function () {
  366.                 // Submit the form here;
  367.                 var files = $("#import-file").get(0).files;
  368.                 var numFiles = files ? files.length : 0;
  369.                 var label = $("#import-file").val().replace(/\\/g, '/').replace(/.*\//, '');
  370.                 $("#import-file-name").val(label);
  371.                 //console.log(numFiles);
  372.                 //console.log(label);
  373.                 //$("#import-file-name").val(files.name);
  374.             });
  375.             // Import the selected csv file
  376.             $("#import-button").on("click", function (event) {
  377.                 event.preventDefault();
  378.                 var $modal = $("#import-area-names-modal");
  379.                 var files = $("#import-file").get(0).files;
  380.                 var numFiles = files ? files.length : 0;
  381.                 if (numFiles === 0) {
  382.                     ui.showImportAlert('Please select a file to import', "alert alert-danger");
  383.                 } else {
  384.                     $modal.modal("hide");
  385.                     // Load up a progress modal
  386.                     $('.progress .progressText').text(0 + "% Complete");
  387.                     $('.progress-bar').css('width', 0 + "%");
  388.                     $('.progress-bar').css('aria-valuenow', '1');
  389.                     $("#main-progress-modal").modal('show');
  390.                     // Process the import and show the spinner
  391.                     csv.importAreaNames();
  392.                 }
  393.             });
  394.             $("#import-help-button").on("click", function (event) {
  395.                 event.preventDefault();
  396.                 var msg = '<p>To import report labels a CSV file is needed. The CSV file defines the hierarchical levels of';
  397.                 msg = msg + ' geography and assigns text names to the numeric codes. Each row is a series of';
  398.                 msg = msg + ' code and label pairs.</p>';
  399.                 msg = msg + '<br>CSV Field Rules:';
  400.                 msg = msg + '<ul><li>Each code must be a numeric</li>'
  401.                 msg = msg + '<li>Each label will be displayed in place of its code</li></ul>';
  402.                 msg = msg + '<br>CSV Pair Rules:';
  403.                 msg = msg + '<ul><li>The first pair in the CSV file must define the first dictionary id</li>';
  404.                 msg = msg + '<li>Each following pair must correspond to a dictionary id in consecutive order</li></ul>';
  405.                 msg = msg + '<br>CSV Example Row:';
  406.                 msg = msg + '<ul><li>1, Artesia, 1, Dongo</li></ul>';
  407.                 msg = msg + '<br>';
  408.                 msg = msg + '<p><a href="https://www.csprousers.org/help/CSWeb/sync_report.html" target="_blank">See Viewing Reports for additional information</a></p>';
  409.                 ui.showImportAlert(msg, "alert alert-info");
  410.             });
  411.             $("#delete-area-names-button").on("click", function (event) {
  412.                 $("#delete-area-names-modal").modal("show");
  413.             });
  414.             $("#delete-area-names-yes-button").on("click", function (event) {
  415.                 $("#delete-area-names-modal").modal("hide");
  416.                 db.deleteAreaNames();
  417.             });
  418.             // Spinner functionality
  419.             var $body = $("body");
  420.             $(document).ajaxStart(function (event, request, settings) {
  421.                 $body.addClass("loading");
  422.             });
  423.             $(document).ajaxComplete(function (event, request, settings) {
  424.                 $body.removeClass("loading");
  425.             });
  426.         });
  427.         var db =
  428.                 {
  429.                     uploadDict: function () {
  430.                         var fileInput = $("#fileInput");
  431.                         var file = fileInput.prop('files')[0];
  432.                         var reader = new FileReader();
  433.                         reader.onload = function (e) {
  434.                             var rawBytes = e.target.result;
  435.                             $("#mainSpinner").show();
  436.                             $.ajax({
  437.                                 url: "{{ url('upload') }}",
  438.                                 type: "POST",
  439.                                 contentType: "text/plain",
  440.                                 data: rawBytes,
  441.                                 dataType: "json",
  442.                                 processData: false,
  443.                                 success: function (response) {
  444.                                     if (response.code === 200) {
  445.                                         sessionStorage.setItem("add-dict-success", 'Add dictionary successful');
  446.                                         location.reload();
  447.                                     } else {
  448.                                         var jsonResponse = $.parseJSON(response.responseText);
  449.                                         sessionStorage.setItem("add-dict-failure", "Failed to add dictionary. " + jsonResponse.message);
  450.                                         ui.showAlert(sessionStorage.getItem("add-dict-failure"), "alert alert-danger");
  451.                                     }
  452.                                 },
  453.                                 error: function (response) {
  454.                                     try {
  455.                                         var jsonResponse = $.parseJSON(response.responseText);
  456.                                         ui.showAlert("Failed to add dictionary. " + jsonResponse.message, "alert alert-danger");
  457.                                     } catch (err) {
  458.                                         ui.showAlert("Failed to add dictionary. " + response.responseText, "alert alert-danger");
  459.                                     }
  460.                                 },
  461.                             });
  462.                         }
  463.                         reader.readAsArrayBuffer(file);
  464.                         var fileInput = $("#fileInput");
  465.                         fileInput.replaceWith(fileInput.val('').clone(true));
  466.                     },
  467.                     deleteAreaNames: function () {
  468.                         // Drop cspro_area_names table
  469.                         return $.ajax({
  470.                             type: "DELETE",
  471.                             url: "{{ url('delete-area-names') }}",
  472.                             dataType: "json"
  473.                         }).then(function (response) {
  474.                             // Done deleteAreaNames
  475.                             if (response.type === "error") {
  476.                                 // Only invalid responses will have a type
  477.                                 ui.showAlert(response.message, "alert alert-danger");
  478.                                 // Convert success to failure
  479.                                 return $.Deferred().reject(response).promise();
  480.                             } else {
  481.                                 ui.showAlert(response, "alert alert-success");
  482.                             }
  483.                         }, function (response) {
  484.                             // Fail deleteAreaNames
  485.                             if (response.status === 405) {
  486.                                 window.location.href = "{{ path('logout') }}";
  487.                             } else {
  488.                                 ui.showAlert(response.message, "alert alert-danger");
  489.                             }
  490.                         });
  491.                     }
  492.                 }
  493.         var ui =
  494.                 {
  495.                     showAlert: function (message, alertStyle) {
  496.                         $("#alert").replaceWith("<div id='alert' class='" + alertStyle + " alert-margin-cspro'>" + message + "</div>");
  497.                         $("#alert").show();
  498.                     },
  499.                     clearAlert: function () {
  500.                         $("#alert").replaceWith("<div id='alert' class='alert-placeholder-cspro alert-margin-cspro'></div>");
  501.                         $("#alert").show();
  502.                     },
  503.                     showImportAlert: function (message, alertStyle) {
  504.                         $("#import-modal-alert").replaceWith("<div id='import-modal-alert' class='" + alertStyle + " alert-margin-cspro'>" + message + "</div>");
  505.                         $("#import-modal-alert").show();
  506.                     }
  507.                 }
  508.         var csv =
  509.                 {
  510.                     importAreaNames: function () {
  511.                         var files = $("#import-file").get(0).files;
  512.                         var file = files[0];
  513.                         var reader = new FileReader();
  514.                         var authToken = '{{ accessToken }}';
  515.                         //console.log("before file read ");
  516.                         reader.onload = function (e) {
  517.                             var rawBytes = e.target.result;
  518.                             // Create an html request to import area names by directly calling the rest api role-area-names url 
  519.                             var xhr = new XMLHttpRequest();
  520.                             xhr.onreadystatechange = function (evt) {
  521.                                 if (xhr.readyState === 4) {
  522.                                     // Done
  523.                                     $("#main-progress-modal").modal('hide');
  524.                                     if (xhr.status === 401) {
  525.                                         window.location.href = "{{ path('logout') }}";
  526.                                     } else if (xhr.status !== 200) {
  527.                                         var responseText = evt.currentTarget.response.toString();
  528.                                         var errResponse = JSON.parse(responseText);
  529.                                         var message = errResponse.message != null ? errResponse.message : responseText;
  530.                                         ui.showAlert(message, "alert alert-danger");
  531.                                         $("#main-progress-modal").modal('hide');
  532.                                     }
  533.                                 }
  534.                             };
  535.                             xhr.addEventListener("progress", function (evt) {
  536.                                 //console.log("The response status " + evt.currentTarget.status);
  537.                                 var lines = evt.currentTarget.response.toString().split("\\n");
  538.                                 // alert(lines[0]);
  539.                                 if (evt.currentTarget.status == 200 && lines.length) {
  540.                                     //console.log("number of lines " + lines.length);
  541.                                     var jsonResponse = lines[lines.length - 1];
  542.                                     //console.log("before :" + jsonResponse);
  543.                                     //remove line feeds for json parser
  544.                                     jsonResponse = jsonResponse.replace(/\\n/g, "");
  545.                                     //console.log("after trime: " + test);
  546.                                     var response = JSON.parse(jsonResponse);
  547.                                     if (response.code == 200 || response.code == 206) {
  548.                                         if (response.progress != 100 && response.code == 206) {
  549.                                             //console.log("percent complete" + response.progress);
  550.                                             $('.progress .progressText').text(response.progress + "% Complete");
  551.                                             $('.progress-bar').css('width', response.progress + "%");
  552.                                             $('.progress-bar').css('aria-valuenow', '1');
  553.                                             $("#main-progress-modal").modal('show');
  554.                                         } else {
  555.                                             $('.progress .progressText').text(response.progress + "% Complete");
  556.                                             $('.progress-bar').css('width', response.progress + "%");
  557.                                             $('.progress-bar').css('aria-valuenow', '1');
  558.                                             $("#main-progress-modal").modal('show');
  559.                                             // Give the progress bar at least 3/4 of a second to display
  560.                                             setTimeout(function () {
  561.                                                 if (response.count == 1) {
  562.                                                     ui.showAlert(response.description + ". " + response.count + " row processed.", "alert alert-success");
  563.                                                 } else {
  564.                                                     ui.showAlert(response.description + ". " + response.count + " rows processed.", "alert alert-success");
  565.                                                 }
  566.                                                 $("#main-progress-modal").modal('hide');
  567.                                             }, 750);
  568.                                         }
  569.                                     } else {
  570.                                         // Error
  571.                                         var responseText = evt.currentTarget.response.toString();
  572.                                         var errResponse = JSON.parse(responseText);
  573.                                         var message = errResponse.message != null ? errResponse.message : responseText;
  574.                                         ui.showAlert(message, "alert alert-danger");
  575.                                         $("#main-progress-modal").modal('hide');
  576.                                     }
  577.                                 } else {
  578.                                     /*var message = response.message != null ? response.message : response.description;
  579.                                      ui.showAlert(message, "alert alert-danger");
  580.                                      $("#main-progress-modal").modal('hide');*/
  581.                                 }
  582.                             }, false);
  583.                             // Send the request to restAPI
  584.                             var areaNamesApiUrl = "{{ apiUrl }}" + "import-area-names";
  585.                             xhr.open('POST', areaNamesApiUrl, true);
  586.                             xhr.setRequestHeader('Authorization', 'Bearer ' + authToken);
  587.                             xhr.setRequestHeader('Content-Type', 'text/plain');
  588.                             xhr.setRequestHeader('Accept', 'application/json');
  589.                             if ($('#import-header-flag').is(':checked')) {
  590.                                 xhr.setRequestHeader('x-csw-data-header', "1");
  591.                             }
  592.                             xhr.send(rawBytes);
  593.                         } // reader.onload
  594.                         reader.readAsArrayBuffer(file);
  595.                     }
  596.                 }
  597.     </script>
  598. {% endblock %}
  599. {# scripts #}