<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>