mirror of https://github.com/CIRCL/AIL-framework
				
				
				
			
		
			
				
	
	
		
			241 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			HTML
		
	
	
			
		
		
	
	
			241 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			HTML
		
	
	
| <table class="table table-striped table-bordered table-hover" id="myTable_{{ moduleName }}">
 | ||
|     <thead>
 | ||
|          <tr>
 | ||
|             <th>#</th>
 | ||
|             <th style="max-width: 800px;">Path</th>
 | ||
|             <th>Date</th>
 | ||
|             <th># of lines</th>
 | ||
|             <th>Action</th>
 | ||
|          </tr>
 | ||
|     </thead>
 | ||
|     <tbody>
 | ||
|       {% set i = 0 %}
 | ||
|       {% for path in all_path %}
 | ||
|       <tr>
 | ||
|           <td> {{ i + 1 }}</td>
 | ||
|           <td><a target="_blank" href="{{ url_for('showsavedpaste') }}?paste={{path}}&num={{i+1}}">{{ path }}</a></td>
 | ||
|           <td>{{ paste_date[i] }}</td>
 | ||
|           <td>{{ paste_linenum[i] }}</td>
 | ||
|           <td><p><span class="glyphicon glyphicon-info-sign" data-toggle="tooltip" data-placement="left" title="{{ content[i] }} "></span> <button type="button" class="btn-link" data-num="{{ i + 1 }}" data-toggle="modal" data-target="#mymodal" data-url="{{ url_for('showsavedpaste') }}?paste={{ path }}&num={{ i+1 }}" data-path="{{ path }}"><span class="fa fa-search-plus"></span></button></p></td>
 | ||
|       </tr>
 | ||
|       {% set i = i + 1 %}
 | ||
|       {%  endfor %}
 | ||
|     </tbody>
 | ||
| </table>
 | ||
| </br>
 | ||
| <div id="nbr_entry" class="alert alert-info">
 | ||
|  
 | ||
| </div>
 | ||
| <div id="div_stil_data">
 | ||
|     <button id="load_more_json_button1" type="button" class="btn btn-default" onclick="add_entries(100)" style="display: none">Load 100 entries</button>
 | ||
|     <button id="load_more_json_button2" type="button" class="btn btn-warning" onclick="add_entries(300)" style="display: none">Load 300 entries</button>
 | ||
|     <img id="loading_gif_browse" src="{{url_for('static', filename='image/loading.gif') }}" heigt="20" width="20" style="margin: 2px;"></div>
 | ||
| </br>
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| <script>
 | ||
| var json_array = [];
 | ||
| var all_data_received = false;
 | ||
| var curr_numElem;
 | ||
| var elem_added = 10; //10 elements are added by default in the page loading
 | ||
| var tot_num_entry = 10; //10 elements are added by default in the page loading
 | ||
| 
 | ||
| function deploy_source() {
 | ||
|     var button_load_more_displayed = false;
 | ||
| 
 | ||
|     if(typeof(EventSource) !== "undefined" && typeof(source) !== "") {
 | ||
|         $("#load_more_json_button1").show();
 | ||
|         $("#load_more_json_button2").show();
 | ||
|         var source = new EventSource("{{ url_for('getImportantPasteByModule') }}"+"?moduleName="+moduleName);
 | ||
|         source.onmessage = function(event) {
 | ||
|             var feed = jQuery.parseJSON( event.data );
 | ||
|             curr_numElem = parseInt($("#myTable_"+moduleName).attr('data-numElem'));
 | ||
|             if (feed.index > curr_numElem & feed.module == moduleName) { // Avoid doubling the pastes
 | ||
|                 json_array.push(feed);
 | ||
|                 tot_num_entry++;
 | ||
|                 $("#nbr_entry").text(tot_num_entry + " entries available, " + (tot_num_entry - elem_added) + " not displayed");
 | ||
| 
 | ||
|                 $("#myTable_"+moduleName).attr('data-numElem', curr_numElem+1);
 | ||
| 
 | ||
|                 if(feed.index > 100 && !button_load_more_displayed) {
 | ||
|                     button_load_more_displayed = true;
 | ||
|                     add_entries_X(20);
 | ||
|                 }
 | ||
|                 if(feed.finished) {
 | ||
|                     $("#loading_gif_browse").hide();
 | ||
|                     source.close();
 | ||
|                     all_data_received = true;
 | ||
|                     add_entries_X(10);
 | ||
|                 }
 | ||
|             }
 | ||
|         };
 | ||
|     } else {
 | ||
|         console.log("Sorry, your browser does not support server-sent events...");
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| function add_entries(iter) { //Used to disable the button before going to the big loop
 | ||
|     $("#load_more_json_button1").attr('disabled','disabled');
 | ||
|     $("#load_more_json_button2").attr('disabled','disabled');
 | ||
|     setTimeout(function() { add_entries_X(iter);}, 50);
 | ||
| }
 | ||
| 
 | ||
| function add_entries_X(to_add) {
 | ||
|     for(i=0; i<to_add; i++) {
 | ||
|         if(json_array.length == 0 && all_data_received) {
 | ||
|             $("#load_more_json_button1").hide();
 | ||
|             $("#load_more_json_button2").hide();
 | ||
|             $("#nbr_entry").hide();
 | ||
|             return false;
 | ||
|         } else {
 | ||
|             var feed = json_array.shift();
 | ||
|             elem_added++;
 | ||
|              search_table.row.add( [
 | ||
|                  feed.index,
 | ||
|                 "<a target=\"_blank\" href=\"{{ url_for('showsavedpaste') }}?paste="+feed.path+"&num="+feed.index+"\"> "+ feed.path +"</a>",
 | ||
|                  feed.date,
 | ||
|                  feed.linenum,
 | ||
|                  "<p><span class=\"glyphicon glyphicon-info-sign\" data-toggle=\"tooltip\" data-placement=\"left\" title=\""+feed.content.replace(/\"/g, "\'").replace(/\r/g, "\'").replace(/\n/g, "\'")+"\"></span> <button type=\"button\" class=\"btn-link\" data-num=\""+feed.index+"\" data-toggle=\"modal\" data-target=\"#mymodal\" data-url=\"{{ url_for('showsavedpaste') }}?paste="+feed.path+"&num="+feed.index+"\" data-path=\""+feed.path+"\"><span class=\"fa fa-search-plus\"></span></button></p>"
 | ||
|              ] ).draw( false );
 | ||
|              $("#myTable_"+moduleName).attr('data-numElem', curr_numElem+1);
 | ||
|         }
 | ||
|     }
 | ||
|     $("#load_more_json_button1").removeAttr('disabled');
 | ||
|     $("#load_more_json_button2").removeAttr('disabled');
 | ||
|     $("#nbr_entry").text(tot_num_entry + " entries available, " + (tot_num_entry - elem_added) + " not displayed");
 | ||
|     return true;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| </script>
 | ||
| 
 | ||
| 
 | ||
| <script>
 | ||
| var moduleName = "{{ moduleName }}";
 | ||
| var search_table;
 | ||
| var last_clicked_paste;
 | ||
| var can_change_modal_content = true;
 | ||
| $("#myTable_"+moduleName).attr('data-numElem', "{{ all_path|length }}");
 | ||
| 
 | ||
| $(document).ready(function(){
 | ||
|     $('[data-toggle="tooltip"]').tooltip();
 | ||
| 
 | ||
|     search_table = $('#myTable_'+moduleName).DataTable({ "order": [[ 2, "desc" ]] });
 | ||
| 
 | ||
|     if( "{{ finished }}" == "True"){
 | ||
|        $("#load_more_json_button1").hide();
 | ||
|        $("#load_more_json_button2").hide();
 | ||
|        $("#nbr_entry").hide();
 | ||
|        $("#loading_gif_browse").hide();
 | ||
|     } else {
 | ||
|         deploy_source();
 | ||
|     }
 | ||
| 
 | ||
| });
 | ||
| </script>
 | ||
| 
 | ||
| <!-- Dynamically update the modal -->
 | ||
| <script type="text/javascript">
 | ||
|     // static data
 | ||
|     var alert_message = '<div class="alert alert-info alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button><strong>No more data.</strong> Full paste displayed.</div>';
 | ||
|     var complete_paste = null;
 | ||
|     var char_to_display = {{ char_to_display }};
 | ||
|     var start_index = 0;
 | ||
| 
 | ||
|     // When the modal goes out, refresh it to normal content
 | ||
|     $("#mymodal").on('hidden.bs.modal', function () {
 | ||
|         can_change_modal_content = true;
 | ||
|         $("#mymodalbody").html("<p>Loading paste information...</p>");
 | ||
|         var loading_gif = "<img id='loading-gif-modal' class='img-center' src=\"{{url_for('static', filename='image/loading.gif') }}\" height='26' width='26' style='margin: 4px;'>";
 | ||
|         $("#mymodalbody").append(loading_gif); // Show the loading GIF
 | ||
|         $("#button_show_path").attr('href', '');
 | ||
|         $("#button_show_path").hide();
 | ||
|         complete_paste = null;
 | ||
|         start_index = 0;
 | ||
|     });
 | ||
| 
 | ||
|    // Update the paste preview in the modal
 | ||
|    function update_preview() {
 | ||
|        if (start_index + char_to_display > complete_paste.length-1){ // end of paste reached
 | ||
|            var final_index = complete_paste.length-1;
 | ||
|            var flag_stop = true;
 | ||
|        } else {
 | ||
|            var final_index = start_index + char_to_display;
 | ||
|        }
 | ||
| 
 | ||
|        if (final_index != start_index){ // still have data to display
 | ||
|            // Append the new content using text() and not append (XSS)
 | ||
|            $("#mymodalbody").find("#paste-holder").text($("#mymodalbody").find("#paste-holder").text()+complete_paste.substring(start_index+1, final_index+1));
 | ||
|            start_index = final_index;
 | ||
|            if (flag_stop)
 | ||
|                nothing_to_display();
 | ||
|        } else {
 | ||
|           nothing_to_display();
 | ||
|       }
 | ||
|    }
 | ||
|    // Update the modal when there is no more data
 | ||
|    function nothing_to_display() {
 | ||
|        var new_content = $(alert_message).hide();
 | ||
|        $("#mymodalbody").find("#panel-body").append(new_content);
 | ||
|        new_content.show('fast');
 | ||
|        $("#load-more-button").hide();
 | ||
|    }
 | ||
| 
 | ||
| 
 | ||
|    // Use to bind the button with the new displayed data
 | ||
|    // (The bind do not happens if the dataTable is in tabs and the clicked data is in another page)
 | ||
| 
 | ||
|    search_table.on( 'draw.dt', function () {
 | ||
|        // Bind tooltip each time we draw a new page
 | ||
|        $('[data-toggle="tooltip"]').tooltip();
 | ||
|        // On click, get html content from url and update the corresponding modal
 | ||
|        $("[data-toggle='modal']").off('click.openmodal').on("click.openmodal", function (event) {
 | ||
|            event.preventDefault();
 | ||
|            var modal=$(this);
 | ||
|            var url = " {{ url_for('showpreviewpaste')  }}?paste=" + $(this).attr('data-path') + "&num=" + $(this).attr('data-num');
 | ||
|            last_clicked_paste =  $(this).attr('data-num');
 | ||
|            $.get(url, function (data) {
 | ||
| 
 | ||
|                // verify that the reveived data is really the current clicked paste. Otherwise, ignore it. 
 | ||
|                var received_num = parseInt(data.split("|num|")[1]);
 | ||
|                if (received_num == last_clicked_paste && can_change_modal_content) {
 | ||
|                    can_change_modal_content = false;
 | ||
| 
 | ||
|                    // clear data by removing html, body, head tags. prevent dark modal background stack bug.
 | ||
|                    var cleared_data = data.split("<body>")[1].split("</body>")[0];
 | ||
|                    $("#mymodalbody").html(cleared_data);
 | ||
| 
 | ||
|                    var button = $('<button type="button" id="load-more-button" class="btn btn-info btn-xs center-block" data-url="' + $(modal).attr('data-path') +'" data-toggle="tooltip" data-placement="bottom" title="Load more content"><span class="glyphicon glyphicon-download"></span></button>');
 | ||
|                    button.tooltip();
 | ||
|                    $("#mymodalbody").children(".panel-default").append(button);
 | ||
|        
 | ||
|                    $("#button_show_path").attr('href', $(modal).attr('data-url'));
 | ||
|                    $("#button_show_path").show('fast');
 | ||
|                    $("#loading-gif-modal").css("visibility", "hidden"); // Hide the loading GIF
 | ||
|                    if ($("[data-initsize]").attr('data-initsize') < char_to_display) { // All the content is displayed
 | ||
|                        nothing_to_display();
 | ||
|                    }
 | ||
|                    // On click, donwload all paste's content
 | ||
|                    $("#load-more-button").on("click", function (event) {
 | ||
|                        if (complete_paste == null) { //Donwload only once
 | ||
|                            $.get("{{ url_for('getmoredata') }}"+"?paste="+$(modal).attr('data-path'), function(data, status){
 | ||
|                                complete_paste = data;
 | ||
|                                update_preview();
 | ||
|                            });
 | ||
|                        } else {
 | ||
|                            update_preview();
 | ||
|                        }
 | ||
|                    });
 | ||
|                } else if (can_change_modal_content) {
 | ||
|                    $("#mymodalbody").html("Ignoring previous not finished query of paste #" + received_num);
 | ||
|                }
 | ||
|            });
 | ||
|        });
 | ||
|    } );
 | ||
| 
 | ||
| </script>
 | ||
| 
 |