PHP Classes

File: public/file-list-multi.php

Recommend this page to a friend!
  Classes of Joseluis Laso   Asynchronous Long Server Tasks   public/file-list-multi.php   Download  
File: public/file-list-multi.php
Role: Example script
Content type: text/plain
Description: new example third part
Class: Asynchronous Long Server Tasks
Start background tasks and query progress status
Author: By
Last change:
Date: 9 years ago
Size: 6,348 bytes
 

Contents

Class file image Download
<html>

<head>

    <style>
        body{
            height: 100%;
            width: 100%;
            background: lightcyan repeat;
            margin: 0;
            padding: 0;
        }
        #container{
            position: relative;
            width: 100%;
            height: 40%;
        }
        #content{
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
        }
        #status{
            position: fixed;
            overflow: auto;
            height: 50%;
            bottom: 0;
            width: 100%;
            border: 1px solid black;
            padding: 0;
            margin: 0;
        }
        .loader{
            display: none;
        }
        table#file-list td{
            padding: 3px 12px 3px 12px;
        }
        table#file-list,
        table#file-list td {
            border: 1px solid black;
        }
        td.percent{
            background-image: url("/img/progress.gif");
            background-repeat: no-repeat;
            background-size: 100% 100%;
            background-position-x: -100px;
            width: 79px;
            text-align: right;
        }
        div.center {
            width: 100%;
            text-align: center;
        }
    </style>
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
</head>

<body>

<div class="center">
    <h2>Copying multiple files demo</h2>
    <h3><a href="http://www.phpclasses.org/blog/package/9383/">Take a look on the blog of this class</a></h3>
</div>

<div id="container">
    <div id="content">
        <table id="file-list">
            <thead>
                <tr>
                    <td>(i)</td>
                    <td>File</td>
                    <td>Size</td>
                </tr>
            </thead>
            <tbody></tbody>
        </table>
        <input id="start-task" type="button" value="Start copy" task="1">
    </div>
</div>

<div id="status">

</div>

</body>

<script>

    var fileList = []; // contains the list of files that user has in our server

    function logMessage(message){
        if ($("#status").html().length > 1000) {
            $("#status").html(message+"<br/>");
        }else{
            $("#status").append(message+"<br/>");
        }

    }

    function updateFileList(){
        // fetch the list from the server, here simulating some random data
        <?php for($i=0;$i<3;$i++) echo "\t".'fileList.push({ name:"'.uniqid('file-').'.ext", pending: true, size: '.(100*rand(200,300)).'});'."\n"; ?>

        var content = "";
        for(var i=0;i<fileList.length; i++){
            var file = fileList[i];
            content += '<tr id="file-'+i+'">'+
                    '<td><img src="img/loader.gif" class="loader"/></td>'+
                    '<td>'+file.name+'</td>'+
                    '<td class="percent">'+file.size+'</td>'+
                '</tr>';
        }
        $("#file-list tbody").html(content);
    }

    function requestStatusOfFiles() {
        var ids = "";
        for(var i=0;i<fileList.length; i++){
            if (fileList[i].pending) {
                ids += i + ",";
            }
        }
        $.ajax({
            url: '/status-copy-multi.php',
            data: {
                ids: ids,
                _task: "copy-multi"
            },
            cache: false,
            scope: this,
            type: "POST",
            success: function(data) {
                if (data.result){
                    var pending = 0;
                    for (var i=0; i<data.info.length; i++){
                        var info = data.info[i];
                        info.id = parseInt(info.id);
                        switch (info.status) {
                            case "done":
                                updateRowId(info.id, "checkmark", null);
                                fileList[info.id].pending = false;
                                break;
                            case "error":
                                updateRowId(info.id, "alert", null);
                                break;
                            default:
                                pending++;
                                updateRowId(info.id, null, parseInt(info.percent));
                                break;
                        }
                    }
                    console.log("pending = "+pending);
                    if (pending > 0) {
                        setTimeout(function () { requestStatusOfFiles(); }, 800);
                    }
                }else{
                    logMessage(data.reason);
                }
            }
        })
    }

    function updateRowId(id, img, percent) {
        if (img != null) $("#file-" + id + " .loader").attr("src", "/img/"+img+".png");
        if (percent == null) percent = 100; else percent = 100-percent;
        $("#file-" + id +" td.percent").css("background-position-x", "-"+percent+"px");
    }

    function requestCopyOfFile(id){
        logMessage("requesting copy of file "+fileList[id].name);
        $.ajax({
            url: '/copy-multi.php',
            data: {
                id: id,
                file: fileList[id],
                _task: "copy-multi"
            },
            cache: false,
            scope: this,
            type: "POST",
            success: function(data) {
                if (data.result) {
                    $("#file-" + id + " .loader").show();
                    if (id == 0) {
                        setTimeout(function () { requestStatusOfFiles(); }, 500);
                    }
                }else {
                    logMessage(data.reason);
                }
            },
            error: function(){
                logMessage("some error happened trying to start task");
            }
        });
    }

    var interval = 0;
    var id = 0;

    $(function(){
        logMessage("Welcome to asynchronous server side task demo");

        updateFileList();

        $("#start-task").click(function(e){
            e.preventDefault();

            $(this).hide();

            console.log("starting copy...");

            for(var i=0; i<fileList.length; i++) {
                requestCopyOfFile(i);
            }

            return false;
        })
    })
</script>

</html>