瀏覽代碼

Added a lot of error/success messages, added modal to edit private room and delete private room.

KrisVos130 9 年之前
父節點
當前提交
2594d08c60

+ 174 - 14
app/client/scripts/events.js

@@ -1632,6 +1632,49 @@ Template.room.events({
 });
 
 Template.privateRoom.events({
+    "click #delete_room": function() {
+        var name = Session.get("privateRoomName");
+        Meteor.call("deletePrivateRoom", name, function(err) {
+            if (err) {
+                console.log(err);
+                var $toastContent = $('<span><strong>Room not deleted.</strong> ' + err.reason + '</span>');
+                Materialize.toast($toastContent, 2000);
+            } else {
+                var $toastContent = $('<span><strong>Room deleted.</strong></span>');
+                Materialize.toast($toastContent, 2000);
+            }
+        });
+        $("#edit_room_modal").closeModal();
+    },
+    "click #save_edit_room_changes": function() {
+        var name = Session.get("privateRoomName");
+        var display = $("#edit_room_display").val();
+        var desc = $("#edit_room_description").val();
+        var room = PrivateRooms.findOne({name: name});
+        if (desc !== room.roomDesc) {
+            Meteor.call("changePrivateRoomDescription", name, desc, function (err) {
+                if (err) {
+                    var $toastContent = $('<span><strong>Description not changed.</strong> ' + err.reason + '</span>');
+                    Materialize.toast($toastContent, 2000);
+                } else {
+                    var $toastContent = $('<span><strong>Description changed.</strong></span>');
+                    Materialize.toast($toastContent, 2000);
+                }
+            });
+        }
+        if (display !== room.displayName) {
+            Meteor.call("changePrivateRoomDisplayName", name, display, function (err) {
+                if (err) {
+                    var $toastContent = $('<span><strong>Display Name not changed.</strong> ' + err.reason + '</span>');
+                    Materialize.toast($toastContent, 2000);
+                } else {
+                    var $toastContent = $('<span><strong>Display Name changed.</strong></span>');
+                    Materialize.toast($toastContent, 2000);
+                }
+            });
+        }
+        $("#edit_room_modal").closeModal();
+    },
     "input #volume_slider": function() {
         var volume = Number($("#volume_slider").val());
         localStorage.setItem("volume", volume);
@@ -1656,12 +1699,30 @@ Template.privateRoom.events({
     "click #lock": function () {
         console.log("Lock");
         console.log(Session.get("privateRoomName"));
-        Meteor.call("lockPrivateRoom", Session.get("privateRoomName"));
+        Meteor.call("lockPrivateRoom", Session.get("privateRoomName"), function(err) {
+            if (err) {
+                console.log(err);
+                var $toastContent = $('<span><strong>Room not locked.</strong> ' + err.reason + '</span>');
+                Materialize.toast($toastContent, 2000);
+            } else {
+                var $toastContent = $('<span><strong>Room unlocked.</strong></span>');
+                Materialize.toast($toastContent, 2000);
+            }
+        });
     },
     "click #unlock": function () {
         console.log("Unlock");
         console.log(Session.get("privateRoomName"));
-        Meteor.call("unlockPrivateRoom", Session.get("privateRoomName"));
+        Meteor.call("unlockPrivateRoom", Session.get("privateRoomName"), function(err) {
+            if (err) {
+                console.log(err);
+                var $toastContent = $('<span><strong>Room not unlocked.</strong> ' + err.reason + '</span>');
+                Materialize.toast($toastContent, 2000);
+            } else {
+                var $toastContent = $('<span><strong>Room unlocked.</strong></span>');
+                Materialize.toast($toastContent, 2000);
+            }
+        });
     },
     "click #submit": function () {
         if(Meteor.userId()){
@@ -1693,7 +1754,16 @@ Template.privateRoom.events({
     "click #add-allowed-submit": function (e) {
         if(Meteor.userId()){
             e.preventDefault();
-            Meteor.call("addAllowedToPrivateRoom", Session.get("privateRoomName"), $("#add-allowed").val());
+            Meteor.call("addAllowedToPrivateRoom", Session.get("privateRoomName"), $("#add-allowed").val(), function(err) {
+                if (err) {
+                    console.log(err);
+                    var $toastContent = $('<span><strong>User not added.</strong> ' + err.reason + '</span>');
+                    Materialize.toast($toastContent, 2000);
+                } else {
+                    var $toastContent = $('<span><strong>User added.</strong></span>');
+                    Materialize.toast($toastContent, 2000);
+                }
+            });
             $("#add-allowed").val("");
         } else {
             var $toastContent = $('<span>User not added. You must log in</span>');
@@ -1709,7 +1779,7 @@ Template.privateRoom.events({
         Meteor.call("votePrivateSkip", Session.get("privateRoomName"), function (err, res) {
             $("#vote-skip").addClass("disabled");
             if(err){
-                var $toastContent = $('<span><strong>Vote not submitted</strong> ' + err.reason + '</span>');
+                var $toastContent = $('<span><strong>Vote not submitted.</strong> ' + err.reason + '</span>');
                 Materialize.toast($toastContent, 4000);
             }
         });
@@ -1725,13 +1795,40 @@ Template.privateRoom.events({
         }
     },
     "click #play": function () {
-        Meteor.call("resumePrivateRoom", Session.get("privateRoomName"));
+        Meteor.call("resumePrivateRoom", Session.get("privateRoomName"), function(err) {
+            if (err) {
+                console.log(err);
+                var $toastContent = $('<span><strong>Room not played.</strong> ' + err.reason + '</span>');
+                Materialize.toast($toastContent, 2000);
+            } else {
+                var $toastContent = $('<span><strong>Room played.</strong></span>');
+                Materialize.toast($toastContent, 2000);
+            }
+        });
     },
     "click #pause": function () {
-        Meteor.call("pausePrivateRoom", Session.get("privateRoomName"));
+        Meteor.call("pausePrivateRoom", Session.get("privateRoomName"), function(err) {
+            if (err) {
+                console.log(err);
+                var $toastContent = $('<span><strong>Room not paused.</strong> ' + err.reason + '</span>');
+                Materialize.toast($toastContent, 2000);
+            } else {
+                var $toastContent = $('<span><strong>Room paused.</strong></span>');
+                Materialize.toast($toastContent, 2000);
+            }
+        });
     },
     "click #skip": function () {
-        Meteor.call("skipPrivateSong", Session.get("privateRoomName"));
+        Meteor.call("skipPrivateSong", Session.get("privateRoomName"), function(err) {
+            if (err) {
+                console.log(err);
+                var $toastContent = $('<span><strong>Room not skipped.</strong> ' + err.reason + '</span>');
+                Materialize.toast($toastContent, 2000);
+            } else {
+                var $toastContent = $('<span><strong>Room skipped.</strong></span>');
+                Materialize.toast($toastContent, 2000);
+            }
+        });
     },
     "click #admin-dropdown a": function(){
         Meteor.setTimeout(function(){
@@ -1743,31 +1840,85 @@ Template.privateRoom.events({
         if (user === undefined) {
             user = $(e.target).parent().data("user");
         }
-        Meteor.call("removeAllowedFromPrivateRoom", Session.get("privateRoomName"), user);
+        Meteor.call("removeAllowedFromPrivateRoom", Session.get("privateRoomName"), user, function(err) {
+            if (err) {
+                console.log(err);
+                var $toastContent = $('<span><strong>User not removed.</strong> ' + err.reason + '</span>');
+                Materialize.toast($toastContent, 2000);
+            } else {
+                var $toastContent = $('<span><strong>User removed.</strong></span>');
+                Materialize.toast($toastContent, 2000);
+            }
+        });
     },
     "click .edit-playlist-button": function(e) {
         if ($(e.target).hasClass("edit-playlist-button")) {
-            Session.set("editingPlaylistName", $(e.target).data("playlist"));
+            Session.set("editingPlaylistName", $(e.target).data("playlist"), function(err) {
+                if (err) {
+                    console.log(err);
+                    var $toastContent = $('<span><strong>Playlist name not changed.</strong> ' + err.reason + '</span>');
+                    Materialize.toast($toastContent, 2000);
+                } else {
+                    var $toastContent = $('<span><strong>Playlist name changed.</strong></span>');
+                    Materialize.toast($toastContent, 2000);
+                }
+            });
         }
     },
     "click #add_playlist_video_submit": function() {
         var id = $("#add_playlist_video").val();
         var pp = Session.get("editingPlaylistName");
-        Meteor.call("addVideoToPrivatePlaylist", pp, id);
+        Meteor.call("addVideoToPrivatePlaylist", pp, id, function(err) {
+            if (err) {
+                console.log(err);
+                var $toastContent = $('<span><strong>Video not added.</strong> ' + err.reason + '</span>');
+                Materialize.toast($toastContent, 2000);
+            } else {
+                var $toastContent = $('<span><strong>Video added.</strong></span>');
+                Materialize.toast($toastContent, 2000);
+            }
+        });
         $("#add_playlist_video").val("");
     },
     "click .remove_playlist_button": function(e) {
         var id = $(e.target).data("id");
-        Meteor.call("removeVideoFromPrivatePlaylist", Session.get("editingPlaylistName"), id);
+        Meteor.call("removeVideoFromPrivatePlaylist", Session.get("editingPlaylistName"), id, function(err) {
+            if (err) {
+                console.log(err);
+                var $toastContent = $('<span><strong>Video not deleted.</strong> ' + err.reason + '</span>');
+                Materialize.toast($toastContent, 2000);
+            } else {
+                var $toastContent = $('<span><strong>Video deleted.</strong></span>');
+                Materialize.toast($toastContent, 2000);
+            }
+        });
     },
     "click #delete_playlist": function() {
-        Meteor.call("deletePrivatePlaylist", Session.get("editingPlaylistName"));
+        Meteor.call("deletePrivatePlaylist", Session.get("editingPlaylistName"), function(err) {
+            if (err) {
+                console.log(err);
+                var $toastContent = $('<span><strong>Playlist not deleted.</strong> ' + err.reason + '</span>');
+                Materialize.toast($toastContent, 2000);
+            } else {
+                var $toastContent = $('<span><strong>Playlist deleted.</strong></span>');
+                Materialize.toast($toastContent, 2000);
+            }
+        });
         $("#edit_playlist_modal").closeModal();
     },
     "click #create_playlist_submit": function() {
         var name = $("#create_playlist_name").val();
         var displayName = $("#create_playlist_display_name").val();
-        Meteor.call("createPrivatePlaylist", name, displayName);
+        Meteor.call("createPrivatePlaylist", name, displayName, function(err) {
+            if (err) {
+                console.log(err);
+                var $toastContent = $('<span><strong>Playlist not created.</strong> ' + err.reason + '</span>');
+                Materialize.toast($toastContent, 2000);
+            } else {
+                var $toastContent = $('<span><strong>playlist created.</strong></span>');
+                Materialize.toast($toastContent, 2000);
+            }
+        });
         $("#create_playlist_modal").closeModal();
         $("#create_playlist_name").val("");
         $("#create_playlist_display_name").val("");
@@ -1793,7 +1944,16 @@ Template.home.events({
          var name = $("#create_private_room_name").val();
          var displayName = $("#create_private_room_display_name").val();
          var description = $("#create_private_room_description").val();
-         Meteor.call("createPrivateRoom", name, displayName, true, description);
+         Meteor.call("createPrivateRoom", name, displayName, true, description, function(err) {
+             if (err) {
+                 console.log(err);
+                 var $toastContent = $('<span><strong>Private room not created.</strong> ' + err.reason + '</span>');
+                 Materialize.toast($toastContent, 2000);
+             } else {
+                 var $toastContent = $('<span><strong>Private room created.</strong></span>');
+                 Materialize.toast($toastContent, 2000);
+             }
+         });
          $("#create_private_room_name").val("");
          $("#create_private_room_display_name").val("");
          $("#create_private_room_description").val("");

+ 9 - 1
app/client/scripts/helpers.js

@@ -636,7 +636,7 @@ Template.privateRoom.helpers({
             return 0;
         }
     },
-    usersInRoom: function(){
+    usersInRoom: function() {
         var userList = [];
         var room = PrivateRooms.findOne({name: Session.get("privateRoomName")});
         if (room !== undefined) {
@@ -648,6 +648,14 @@ Template.privateRoom.helpers({
             })
         }
         return userList;
+    },
+    room: function() {
+        var parts = location.href.split('/');
+        var id = parts.pop().toLowerCase();
+        setTimeout(function() {
+            Materialize.updateTextFields();
+        }, 100);
+        return PrivateRooms.findOne({name: id});
     }
 });
 

+ 5 - 0
app/client/scripts/onRendered.js

@@ -101,6 +101,11 @@ Template.privateRoom.onRendered(function() {
     }
     Session.set("rTimeInterval", Meteor.setInterval(function() {
         Session.set("time", new Date().getTime());
+        var parts = location.href.split('/');
+        var id = parts.pop().toLowerCase();
+        if (PrivateRooms.findOne({name: id}) === undefined) {
+            location.href = "/";
+        }
     }, 10000));
     window.setTimeout(function(){
         var volume = (localStorage.getItem("volume") !== undefined) ? localStorage.getItem("volume") : 20;

+ 27 - 0
app/client/templates/privateRoom.html

@@ -152,9 +152,30 @@
         {{else}}
             <li><a id="lock"><i class="material-icons">lock_open</i></a></li>
         {{/if}}
+        <li><a id="edit_room" href="#edit_room_modal"><i class="material-icons">mode_edit</i></a></li>
     </ul>
 
 
+    <!-- Edit Room Modal -->
+    <div id="edit_room_modal" class="modal">
+        <div class="modal-content">
+            <h4>Edit Room</h4>
+            <div class="input-field">
+                <input id="edit_room_description" value={{room.roomDesc}} type="text">
+                <label for="edit_room_description">Description</label>
+            </div>
+            <div class="input-field">
+                <input id="edit_room_display" value={{room.displayName}} type="text">
+                <label for="edit_room_display">Display Name</label>
+            </div>
+            <button class="btn waves-effect waves-light" id="save_edit_room_changes">Save Changes</button>
+            <button class="btn waves-effect waves-light right red" id="delete_room">Delete Room</button>
+        </div>
+        <div class="divider"></div>
+        <div class="modal-footer">
+            <a class="modal-action modal-close waves-effect btn">Close</a>
+        </div>
+    </div>
     <!-- Edit Playlist Modal -->
     <div id="edit_playlist_modal" class="modal">
         <div class="modal-content">
@@ -206,6 +227,12 @@
             in_duration: 500,
             out_duration: 200
         });
+        $("#edit_room").leanModal({
+            dismissible: true,
+            opacity: .5,
+            in_duration: 500,
+            out_duration: 200
+        });
         $(".dropdown-button").dropdown({
             belowOrigin: true
         });

+ 38 - 7
app/server/server.js

@@ -392,13 +392,16 @@ function PrivateStation(name) {
                 usersObj[username]++;
             }
             PrivateRooms.update({name: name}, {$push: {userList: username}});
-            this.onStop(function() {
+            this.onStop(function () {
                 usersObj[username]--;
-                var list = PrivateRooms.findOne({name: name}).userList;
-                var index = list.indexOf(username);
-                if (index >= 0) {
-                    list.splice(index, 1);
-                    PrivateRooms.update({name: name}, {$set: {userList: list}});
+                var room = PrivateRooms.findOne({name: name});
+                if (room !== undefined) {
+                    var list = room.userList;
+                    var index = list.indexOf(username);
+                    if (index >= 0) {
+                        list.splice(index, 1);
+                        PrivateRooms.update({name: name}, {$set: {userList: list}});
+                    }
                 }
             });
         }
@@ -407,7 +410,10 @@ function PrivateStation(name) {
     var self = this;
     var startedAt = Date.now();
     var _room = PrivateRooms.findOne({name: name});
-    var playlist = PrivatePlaylists.findOne({name: _room.playlist, owner: _room.owner});
+    var playlist;
+    if (_room !== undefined) {
+        playlist = PrivatePlaylists.findOne({name: _room.playlist, owner: _room.owner});
+    }
     if (playlist === undefined) {
         playlist = default_private_playlist;
     }
@@ -895,6 +901,31 @@ function isMuted() {
 }
 
 Meteor.methods({
+    deletePrivateRoom: function(roomName) {
+        if ((isAdmin() || isPrivateRoomOwner(roomName)) && !isBanned()) {
+            PrivateRooms.remove({name: roomName});
+            getPrivateStation(roomName, function(room) {
+                room.cancelTimer();
+                delete privateStations[privateStations.indexOf(room)];
+            });
+        } else {
+            throw new Meteor.Error(403, "Invalid permissions.");
+        }
+    },
+    changePrivateRoomDescription: function(roomName, newDescription) {
+        if ((isAdmin() || isPrivateRoomOwner(roomName)) && !isBanned()) {
+            PrivateRooms.update({name: roomName}, {$set: {roomDesc: newDescription}});
+        } else {
+            throw new Meteor.Error(403, "Invalid permissions.");
+        }
+    },
+    changePrivateRoomDisplayName: function(roomName, newDisplayName) {
+        if ((isAdmin() || isPrivateRoomOwner(roomName)) && !isBanned()) {
+            PrivateRooms.update({name: roomName}, {$set: {displayName: newDisplayName}});
+        } else {
+            throw new Meteor.Error(403, "Invalid permissions.");
+        }
+    },
     addVideoToPrivatePlaylist: function(name, id) {
         if (Meteor.userId() && !isBanned()) {
             var pl = PrivatePlaylists.findOne({owner: Meteor.userId(), name: name});