diff --git a/app/assets/javascripts/landing.js b/app/assets/javascripts/landing.js index a718cb74..1422119f 100644 --- a/app/assets/javascripts/landing.js +++ b/app/assets/javascripts/landing.js @@ -1,5 +1,4 @@ (function() { - var recordingsTable = null; var waitForModerator = function(url) { $.get(url + "/wait", function(html) { @@ -94,137 +93,13 @@ var initRooms = function() { displayRoomURL(); - // initialize recordings datatable - recordingsTable = $('#recordings').dataTable({ - data: [], - rowId: 'id', - paging: false, - searching: false, - info: false, - order: [[ 0, "desc" ]], - language: { - emptyTable: " " - }, - columns: [ - { data: "start_time" }, - { data: "previews" }, - { data: "duration" }, - { data: "playbacks" }, - { data: "id" } - ], - columnDefs: [ - { - targets: 1, - render: function(data, type, row) { - if (type === 'display') { - var str = ''; - for(let i in data) { - str += ''+data[i].alt+' '; - } - return str; - } - return data; - } - }, - { - targets: 3, - render: function(data, type, row) { - if (type === 'display') { - var str = ''; - if (row.published) { - for(let i in data) { - str += ''+data[i].type+' '; - } - } - return str; - } - return data; - } - }, - { - targets: -1, - render: function(data, type, row) { - if (type === 'display') { - var roomName = Meeting.getInstance().getId(); - var published = row.published; - var eye = getPublishClass(published); - return ' ' + - '' + - '' + - ''; - } - return data; - } - } - ] - }); - - $('#recordings').on('click', '.recording-update', function(event) { - var btn = $(this); - var row = recordingsTable.api().row($(this).closest('tr')).data(); - var url = $('.meeting-url').val(); - var id = row.id; - var published = btn.data('published'); - btn.prop('disabled', true); - $.ajax({ - method: 'PATCH', - url: url+'/recordings/'+id, - data: {published: (!published).toString()} - }).done(function(data) { - - }).fail(function(data) { - btn.prop('disabled', false); - }); - }); - - $('#recordings').on('click', '.recording-delete', function(event) { - var btn = $(this); - var row = recordingsTable.api().row($(this).closest('tr')).data(); - var url = $('.meeting-url').val(); - var id = row.id; - btn.prop('disabled', true); - $.ajax({ - method: 'DELETE', - url: url+'/recordings/'+id - }).done(function() { - - }).fail(function(data) { - btn.prop('disabled', false); - }); - }); - - refreshRecordings(); + Recordings.getInstance().refresh(); + Recordings.getInstance().setupActionHandlers(); }; - var refreshRecordings = function() { - if (!recordingsTable) { - return; - } - table = recordingsTable.api(); - $.get("/rooms/"+Meeting.getInstance().getId()+"/recordings", function(data) { - if (!data.is_owner) { - table.column(-1).visible( false ); - } - var i; - for (i = 0; i < data.recordings.length; i++) { - var totalMinutes = Math.round((new Date(data.recordings[i].end_time) - new Date(data.recordings[i].start_time)) / 1000 / 60); - data.recordings[i].duration = totalMinutes; - - data.recordings[i].start_time = new Date(data.recordings[i].start_time) - .toLocaleString($('html').attr('lang'), - {month: 'long', day: 'numeric', year: 'numeric', hour12: 'true', hour: '2-digit', minute: '2-digit'}); - } - table.clear(); - table.rows.add(data.recordings); - table.columns.adjust().draw(); - }); - } - $(document).on("turbolinks:load", function() { - init(); if ($("body[data-controller=landing]").get(0)) { + init(); if ($("body[data-action=meetings]").get(0)) { initIndex(); } else if ($("body[data-action=rooms]").get(0)) { diff --git a/app/assets/javascripts/recordings.js b/app/assets/javascripts/recordings.js new file mode 100644 index 00000000..d3f8837d --- /dev/null +++ b/app/assets/javascripts/recordings.js @@ -0,0 +1,163 @@ +// Recordings class + +var _recordingsInstance = null; + +class Recordings { + constructor() { + // configure the datatable for recordings + this.table = $('#recordings').dataTable({ + data: [], + rowId: 'id', + paging: false, + searching: false, + info: false, + order: [[ 0, "desc" ]], + language: { + emptyTable: " " + }, + columns: [ + { data: "start_time" }, + { data: "previews" }, + { data: "duration" }, + { data: "playbacks" }, + { data: "id" } + ], + columnDefs: [ + { + targets: 0, + render: function(data, type, row) { + if (type === 'display') { + return new Date(data) + .toLocaleString($('html').attr('lang'), + {month: 'long', day: 'numeric', year: 'numeric', + hour12: 'true', hour: '2-digit', minute: '2-digit'}); + } + return data; + } + }, + { + targets: 1, + render: function(data, type, row) { + if (type === 'display') { + var str = ''; + for(let i in data) { + str += ''+data[i].alt+' '; + } + return str; + } + return data; + } + }, + { + targets: 3, + render: function(data, type, row) { + if (type === 'display') { + var str = ''; + if (row.published) { + for(let i in data) { + str += ''+data[i].type+' '; + } + } + return str; + } + return data; + } + }, + { + targets: -1, + render: function(data, type, row) { + if (type === 'display') { + var roomName = Meeting.getInstance().getId(); + var published = row.published; + var eye = getPublishClass(published); + return ' ' + + '' + + '' + + ''; + } + return data; + } + } + ] + }); + } + + // Gets the current instance or creates a new one + static getInstance() { + if (_recordingsInstance && Recordings.initialized()) { + return _recordingsInstance; + } + _recordingsInstance = new Recordings(); + return _recordingsInstance; + } + + static initialize() { + Recordings.getInstance(); + } + + static initialized() { + return $.fn.DataTable.isDataTable('#recordings') && _recordingsInstance; + } + + // refresh the recordings from the server + refresh() { + var _this = this; + var table_api = this.table.api(); + $.get("/rooms/"+Meeting.getInstance().getId()+"/recordings", function(data) { + if (!data.is_owner) { + table_api.column(-1).visible(false); + } + var i; + for (i = 0; i < data.recordings.length; i++) { + var totalMinutes = Math.round((new Date(data.recordings[i].end_time) - new Date(data.recordings[i].start_time)) / 1000 / 60); + data.recordings[i].duration = totalMinutes; + } + data.recordings.sort(function(a,b) { + return new Date(b.start_time) - new Date(a.start_time); + }); + table_api.clear(); + table_api.rows.add(data.recordings); + table_api.columns.adjust().draw(); + }); + } + + // setup click handlers for the action buttons + setupActionHandlers() { + var table_api = this.table.api(); + this.table.on('click', '.recording-update', function(event) { + var btn = $(this); + var row = table_api.row($(this).closest('tr')).data(); + var url = $('.meeting-url').val(); + var id = row.id; + var published = btn.data('published'); + btn.prop('disabled', true); + $.ajax({ + method: 'PATCH', + url: url+'/recordings/'+id, + data: {published: (!published).toString()} + }).done(function(data) { + + }).fail(function(data) { + btn.prop('disabled', false); + }); + }); + + this.table.on('click', '.recording-delete', function(event) { + var btn = $(this); + var row = table_api.row($(this).closest('tr')).data(); + var url = $('.meeting-url').val(); + var id = row.id; + btn.prop('disabled', true); + $.ajax({ + method: 'DELETE', + url: url+'/recordings/'+id + }).done(function() { + + }).fail(function(data) { + btn.prop('disabled', false); + }); + }); + } +}