diff --git a/app/assets/javascripts/meeting.coffee b/app/assets/javascripts/meeting.coffee
new file mode 100644
index 00000000..c99bd888
--- /dev/null
+++ b/app/assets/javascripts/meeting.coffee
@@ -0,0 +1,62 @@
+# Meeting class
+
+_meetingInstance = null
+
+class @Meeting
+ constructor: (@id, @url, @name) ->
+
+ # Gets the current instance or creates a new one
+ @getInstance: ->
+ if _meetingInstance
+ return _meetingInstance
+ id = $(".page-wrapper.rooms").data('room')
+ url = @buildURL()
+ name = $('.meeting-user-name').val()
+ _meetingInstance = new Meeting(id, url, name)
+ return _meetingInstance
+
+ @buildURL: ->
+ return location.protocol +
+ '//' +
+ location.hostname +
+ '/rooms/' +
+ $('.rooms').data('room')
+
+ # Sends the end meeting request
+ # Returns a response object
+ endMeeting: ->
+ return $.ajax({
+ url: @url + "/end",
+ type: 'DELETE'
+ })
+
+ # Makes a call to get the join meeting url
+ # Returns a response object
+ # The response object contains the URL to join the meeting
+ getJoinMeetingResponse: ->
+ return $.get @url + "/join?name=" + @name, ->
+
+
+ getId: ->
+ return @id
+
+ getURL: ->
+ return @url
+
+ getName: ->
+ return @name
+
+ setName: (name) ->
+ @name = name
+
+ getModJoined: ->
+ return @modJoined
+
+ setModJoined: (modJoined) ->
+ @modJoined = modJoined
+
+ getWaitingForMod: ->
+ return @waitingForMod
+
+ setWaitingForMod: (wMod) ->
+ @waitingForMod = wMod
diff --git a/app/assets/javascripts/meeting.js b/app/assets/javascripts/meeting.js
deleted file mode 100644
index 5aea4e02..00000000
--- a/app/assets/javascripts/meeting.js
+++ /dev/null
@@ -1,80 +0,0 @@
-// Meeting class
-
-var _meetingInstance = null;
-
-class Meeting {
- constructor(id, url, name) {
- this.id = id;
- this.url = url;
- this.name = name;
- }
-
- // Gets the current instance or creates a new one
- static getInstance() {
- if (_meetingInstance) {
- return _meetingInstance;
- }
- var id = $(".page-wrapper.rooms").data('room');
- var url = Meeting.buildURL();
- var name = $('.meeting-user-name').val();
- _meetingInstance = new Meeting(id, url, name);
- return _meetingInstance;
- }
-
- static buildURL() {
- return location.protocol +
- '//' +
- location.hostname +
- '/rooms/' +
- $('.rooms').data('room');
- }
-
- // Sends the end meeting request
- // Returns a response object
- endMeeting() {
- return $.ajax({
- url: this.url + "/end",
- type: 'DELETE'
- });
- }
-
- // Makes a call to get the join meeting url
- // Returns a response object
- // The response object contains the URL to join the meeting
- getJoinMeetingResponse() {
- return $.get(this.url + "/join?name=" + this.name, function() {
- });
- };
-
- getId() {
- return this.id;
- }
-
- getURL() {
- return this.url;
- }
-
- getName() {
- return this.name;
- }
-
- setName(name) {
- this.name = name;
- }
-
- getModJoined() {
- return this.modJoined;
- }
-
- setModJoined(modJoined) {
- this.modJoined = modJoined;
- }
-
- getWaitingForMod() {
- return this.waitingForMod;
- }
-
- setWaitingForMod(wMod) {
- this.waitingForMod = wMod;
- }
-}
diff --git a/app/assets/javascripts/recordings.coffee b/app/assets/javascripts/recordings.coffee
new file mode 100644
index 00000000..ce42e3c7
--- /dev/null
+++ b/app/assets/javascripts/recordings.coffee
@@ -0,0 +1,137 @@
+# Recordings class
+
+_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: (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: (data, type, row) ->
+ if type == 'display'
+ str = ''
+ for d in data
+ str += '
'
+ return str
+ return data
+ },
+ {
+ targets: 3,
+ render: (data, type, row) ->
+ if type == 'display'
+ str = ''
+ if row.published
+ for d in data
+ str += ''+d.type+' '
+ return str
+ return data
+ },
+ {
+ targets: -1,
+ render: (data, type, row) ->
+ if type == 'display'
+ roomName = Meeting.getInstance().getId()
+ published = row.published
+ eye = getPublishClass(published)
+ return ' ' +
+ '' +
+ '' +
+ ''
+ return data
+ }
+ ]
+ })
+
+ # Gets the current instance or creates a new one
+ @getInstance: ->
+ if _recordingsInstance && Recordings.initialized()
+ return _recordingsInstance
+ _recordingsInstance = new Recordings()
+ return _recordingsInstance
+
+ @initialize: ->
+ Recordings.getInstance()
+
+ @initialized: ->
+ return $.fn.DataTable.isDataTable('#recordings') && _recordingsInstance
+
+ # refresh the recordings from the server
+ refresh: ->
+ _this = this
+ table_api = this.table.api()
+ $.get "/rooms/"+Meeting.getInstance().getId()+"/recordings", (data) ->
+ if !data.is_owner
+ table_api.column(-1).visible(false)
+ for recording in data.recordings
+ totalMinutes = Math.round((new Date(recording.end_time) - new Date(recording.start_time)) / 1000 / 60)
+ recording.duration = totalMinutes
+ data.recordings.sort (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: ->
+ table_api = this.table.api()
+ this.table.on 'click', '.recording-update', (event) ->
+ btn = $(this)
+ row = table_api.row($(this).closest('tr')).data()
+ url = $('.meeting-url').val()
+ id = row.id
+ published = btn.data('published')
+ btn.prop('disabled', true)
+ $.ajax({
+ method: 'PATCH',
+ url: url+'/recordings/'+id,
+ data: {published: (!published).toString()}
+ }).done((data) ->
+
+ ).fail((data) ->
+ btn.prop('disabled', false)
+ )
+
+ this.table.on 'click', '.recording-delete', (event) ->
+ btn = $(this)
+ row = table_api.row($(this).closest('tr')).data()
+ url = $('.meeting-url').val()
+ id = row.id
+ btn.prop('disabled', true)
+ $.ajax({
+ method: 'DELETE',
+ url: url+'/recordings/'+id
+ }).done((data) ->
+
+ ).fail((data) ->
+ btn.prop('disabled', false)
+ )
diff --git a/app/assets/javascripts/recordings.js b/app/assets/javascripts/recordings.js
deleted file mode 100644
index d3f8837d..00000000
--- a/app/assets/javascripts/recordings.js
+++ /dev/null
@@ -1,163 +0,0 @@
-// 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 += '
';
- }
- 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);
- });
- });
- }
-}