@extends('layout.default') @section('title') My URL Shortener @endsection @section('subtitle') List all of your own URL Shortener @endsection @section('content') <div class="box box-info"> <div class="box-header"> <h3 class="box-title"></h3> <div class="box-tools"></div> </div> <!-- /.box-header --> <div class="box-body"> <table class="table table-bordered"> <thead> <tr> <th style="width:10px;text-align: center;">No</th> <th>Destination</th> <th>Short URL</th> <th style="text-align:center;">Click</th> <th>Expired Date</th> <th>Protection</th> <th>Action</th> </tr> </thead> <tbody id="table-url-address-body"> <tr> <td colspan="6" style="text-align:center;color:#777;"> <i class="fa fa-spinner fa-spin"></i> </td> </tr> </tbody> </table> </div> <!-- /.box-body --> <div class="box-footer"> Page <span id="current-page">1</span>, Showing <span id="range-start-data">0</span> to <span id="range-end-data">0</span> of <span id="total-entries">0</span> entries <ul class="pagination pagination-sm no-margin pull-right" id="pagination-button"></ul> </div> </div> <!-- /.box --> @endsection @section('js') <script type="application/javascript"> const clipboard = new ClipboardJS('.btn'); let page = 1; let canPageNext = false; let canPagePrevious = false; let perPage = 15; $(document).ready(function () { clipboard.on('success', function (e) { toastr.success("URL Copied"); e.clearSelection(); }); clipboard.on('error', function (e) { toastr.failed("Cannot Copy URL"); }); const loadURLAddress = function () { $.ajax({ type: "GET", url: "/web/url/address/list?page=" + page, headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'), }, contentType: "application/json", async: true, beforeSend: function () { $("#table-url-address-body").html("<tr>\n" + " <td colspan=\"7\" style=\"text-align:center;color:#777;\">\n" + " <i class=\"fa fa-spinner fa-spin\"></i>\n" + " </td>\n" + " </tr>"); }, success: function (result) { rebuildPagination(result); if (result.data.length !== 0) { $("#table-url-address-body").html(result.data.map((m, i) => urlAddressRowComponent(m, i))); } else { $("#table-url-address-body").html("<tr>\n" + " <td colspan=\"7\" style=\"text-align:center;color:#777;\">\n" + " <span>You don't have any shorten url address</span>\n" + " </td>\n" + " </tr>"); } }, error: function (result) { toastr.error(result.responseJSON.message); } }); } const deleteURLAddress = function (id) { $.ajax({ type: "DELETE", url: "/web/url/address/delete/" + id, headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'), }, contentType: "application/json", async: true, success: function (result) { toastr.success(result.message); loadURLAddress(); }, error: function (result) { toastr.error(result.responseJSON.message); } }); } const urlAddressRowComponent = function (urlAddressData, i) { let expiredStatus = "<label class=\"label label-info\">Never</label>"; if (urlAddressData.date_expired != null && urlAddressData.date_expired !== "") { expiredStatus = "<label class=\"label " + (urlAddressData.is_expired ? "label-danger" : "label-success") + "\">2020-02-20</label>"; } const protectionStatus = "<label class=\"label " + (urlAddressData.password != null ? "label-success" : "label-danger") + "\">" + (urlAddressData.password != null ? "Yes" : "No") + "</label>"; const destination = urlAddressData.full_url_destination; const generatedURL = "{{$url}}/s/" + urlAddressData.path_generated; const row = "<tr>\n" + " <td style=\"text-align:center;\">" + ((page !== 1 ? (page - 1) * perPage : 0) + (i + 1)) + "</td>\n" + " <td><a href=\"" + destination + "\" target=\"_blank\">" + destination + "</a></td>\n" + " <td><a href=\"" + generatedURL + "\" target=\"_blank\">" + generatedURL + "</a></td>\n" + " <td align=\"center\">" + urlAddressData.click + "</td>\n" + " <td>" + expiredStatus + "</td>\n" + " <td>" + protectionStatus + "</td>\n" + " <td>\n" + " <button class=\"btn btn-danger btn-xs url-address-delete\"><i class=\"fa fa-trash\"></i></button>\n" + " </td>\n" + " </tr>"; return $(row).on('click', 'button.url-address-delete', function () { deleteURLAddress(urlAddressData.id); }); } const rebuildPagination = function (paginationData) { const totalData = paginationData.data.length; if (totalData === 0 && page !== 1) { page -= 1; loadURLAddress(); } $("#range-start-data").html(paginationData.from != null ? paginationData.from : 0); $("#range-end-data").html(paginationData.to != null ? paginationData.to : 0); $("#total-entries").html(paginationData.total); const canPageNext = (paginationData.next_page_url != null && paginationData.next_page_url !== ""); const canPagePrevious = paginationData.prev_page_url != null && paginationData.prev_page_url !== "" let buttonElements = []; if (canPagePrevious) { buttonElements.push($("<li><a href='#' id='pagination-button-prev'>«</a></li>").click(function () { page -= 1; loadURLAddress(); })); } if (totalData !== 0) { for (let i = 1; i <= paginationData.last_page; i++) { buttonElements.push($("<li><a href='#'>" + i + "</a></li>").click(function () { page = i; loadURLAddress(); })); } } if (canPageNext) { buttonElements.push($("<li><a href='#' id='pagination-button-next'>»</a></li>").click(function () { page += 1; loadURLAddress(); })); } $("#pagination-button").html(buttonElements); } // Initialize loadURLAddress(); }); </script> @endsection