Explorar el Código

Merge remote-tracking branch 'origin/master'

KrisVos130 hace 9 años
padre
commit
08dbc07775

+ 23 - 4
app/client/app.css

@@ -1381,13 +1381,11 @@ nav form input[type="image"]{
     letter-spacing: inherit;
     -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
     box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+    background-color: #51BCA3;
 }
 
 #header-dropdown li:hover {
-    background-color: white;
-}
-#header-dropdown li:hover > a {
-    color: #1C39B2 !important;
+    background-color: #3A8876;
 }
 #ban-icon {
     font-size: 20em;
@@ -1487,6 +1485,27 @@ input[type="checkbox"]:checked + #two-label:after {
     background-color: orange;
 }
 
+.profile-action{
+    float: right;
+}
+
+#submit-name{
+    margin-left: 10px;
+}
+
+#submit-username{
+    margin-left: 10px;
+}
+
+.settings-option{
+    margin: 5px 0;
+    font-size: 1.2em;
+}
+
+.settings-input {
+    margin-bottom: 10px;
+}
+
 .disabled {
     cursor: not-allowed;
     opacity: 1;

+ 104 - 2
app/client/client.js

@@ -92,10 +92,98 @@ function getSpotifyInfo(title, cb, artist) {
 Template.settings.events({
     "click #save-settings": function() {
         Meteor.call("updateSettings", $("#showRating").is(":checked"));
+    },
+    "click #delete-account": function(){
+        $("#delete-account").text("Click to confirm");
+        $("#delete-account").click(function(){
+            var bool = confirm("Are you sure you want to delete your account?");
+            if(bool) {
+                Meteor.call("deleteAccount", Meteor.userId());
+            }
+        })
+    },
+    "click #change-password": function(){
+        var oldPassword = $("#old-password").val();
+        var newPassword= $("#new-password").val();
+        var confirmPassword = $("#confirm-password").val();
+        if(newPassword === confirmPassword){
+            Accounts.changePassword(oldPassword, newPassword, function(err){
+                if(err){
+                    $("#old-password").val("");
+                    $("#new-password").val("");
+                    $("#confirm-password").val("");
+                    $("<div class='alert alert-danger alert-dismissible' role='alert' style='margin-bottom: 0'><button type='button' class='close' data-dismiss='alert' aria-label='Close'><span aria-hidden='true'><i class='fa fa-times'></i></span></button><strong>Oh Snap! </strong>" + err.reason + "</div>").prependTo($("#head")).delay(7000).fadeOut(1000, function() { $(this).remove(); });
+                } else {
+                    $("#old-password").val("");
+                    $("#new-password").val("");
+                    $("#confirm-password").val("");
+                    $("<div class='alert alert-success alert-dismissible' role='alert' style='margin-bottom: 0'><button type='button' class='close' data-dismiss='alert' aria-label='Close'><span aria-hidden='true'><i class='fa fa-times'></i></span></button><strong>Hooray!</strong> You changed your password successfully.</div>").prependTo($("#head")).delay(7000).fadeOut(1000, function() { $(this).remove(); });
+                }
+            });
+        }
     }
 });
 
+Template.profile.events({
+    //Edit reak name
+    "click #edit-name": function(){
+        $("#name").hide();
+        $("#name-div").show();
+        $("#edit-name").hide();
+        $("#cancel-edit").show();
+    },
+    "click #submit-name": function(){
+        var user = Meteor.user();
+        $("#name").show();
+        $("#name-div").hide();
+        $("#edit-name").show();
+        $("#cancel-edit").hide();
+        var realname = $("#input-name").val();
+        var username = user.profile.username;
+        $("#name").text("Name: " + realname);
+        $("#input-name").val("")
+        Meteor.call("updateRealName", username, realname);
+    },
+    "click #cancel-edit": function(){
+        $("#name").show();
+        $("#name-div").hide();
+        $("#edit-name").show();
+        $("#cancel-edit").hide();
+        $("#input-name").val("");
+    },
+    //Edit username
+    "click #edit-username": function(){
+        $("#username").hide();
+        $("#username-div").show();
+        $("#edit-username").hide();
+        $("#cancel-username").show();
+    },
+    "click #submit-username": function(){
+        var user = Meteor.user()
+        $("#username").show();
+        $("#username-div").hide();
+        $("#edit-username").show();
+        $("#cancel-username").hide();
+        var username = user.username;
+        var newUserName = $("#input-username").val();
+        $("#profile-name").text(newUserName)
+        $("#username").text("Username: " + newUserName);
+        $("#input-username").val("")
+        Meteor.call("updateUserName", username, newUserName);
+    },
+    "click #cancel-username": function(){
+        $("#username").show();
+        $("#username-div").hide();
+        $("#edit-username").show();
+        $("#cancel-username").hide();
+        $("#input-username").val("");
+    }
+})
+
 Template.profile.helpers({
+    "real_name": function(){
+        return Session.get("real_name");
+    },
     "username": function() {
         return Session.get("username")
     },
@@ -145,6 +233,13 @@ Template.profile.helpers({
             return "";
         }
     },
+    isUser: function(){
+        var parts = Router.current().url.split('/');
+        var username = parts.pop();
+        if(username === Meteor.user().profile.username){
+            return true;
+        }
+    }
 });
 
 Template.profile.onCreated(function() {
@@ -156,6 +251,7 @@ Template.profile.onCreated(function() {
             window.location = "/";
         } else {
             var data = Meteor.users.findOne({"profile.usernameL": username.toLowerCase()});
+            Session.set("real_name", data.profile.realname);
             Session.set("username", data.profile.username);
             Session.set("first_joined", data.createdAt);
             Session.set("rank", data.profile.rank);
@@ -205,7 +301,7 @@ Template.settings.onCreated(function() {
 curPath=function(){var c=window.location.pathname;var b=c.slice(0,-1);var a=c.slice(-1);if(b==""){return"/"}else{if(a=="/"){return b}else{return c}}};
 
 Handlebars.registerHelper('active', function(path) {
-    return curPath() == path ? 'active' : '';
+        return curPath() == path ? 'active' : '';
 });
 
 Template.header.helpers({
@@ -305,7 +401,9 @@ Template.register.events({
     },
 
     "click #github-login": function(){
-        Meteor.loginWithGithub({loginStyle: "redirect"});
+        Meteor.loginWithGithub({loginStyle: "redirect"}, function(err, res) {
+            console.log(err, res);
+        });
     }
 });
 
@@ -1108,6 +1206,10 @@ Template.admin.helpers({
       return Session.get("userNum");
   },
   allUsers: function(){
+      Meteor.call("getTotalUsers", function(err, num){
+          Session.set("allUsers", num);
+      })
+      return Session.get("allUsers");
   },
   playlists: function() {
       var playlists = Playlists.find({}).fetch();

+ 1 - 1
app/client/templates/admin.html

@@ -33,7 +33,7 @@
                 <h1>Site statistics</h1>
               </div>
               <p>Total Users Online: {{usersOnline}}</p>
-              <p>Total Registered Users: </p>
+              <p>Total Registered Users: {{allUsers}}</p>
               <a href="/admin/queues">Edit the queues</a>
             </div>
           </div>

+ 18 - 2
app/client/templates/profile.html

@@ -12,8 +12,24 @@
                     <div class="panel-heading">Basic Info</div>
                     <div class="panel-body">
                         <ul>
-                            <li class="user-stat"><b>Joined: </b>{{first_joined}}</li>
-                            <li class="user-stat"><b>Rank: </b>{{rank}}</li>
+                            {{#if isUser}}
+                                <a href="#" id="edit-name" class="profile-action">Edit</a>
+                                <a href="#" id="cancel-edit" class="profile-action" style="display:none;">Cancel</a>
+                            {{/if}}
+                            <li class="user-stat" id="name">Name: {{real_name}}</li>
+                            <div id="name-div" style="display: none">
+                                <input type="text" id="input-name"><button id="submit-name" class="btn btn-primary btn-sm">Submit</button>
+                            </div>
+                            {{#if isUser}}
+                                <a href="#" id="edit-username" class="profile-action">Edit</a>
+                                <a href="#" id="cancel-username" class="profile-action" style="display:none;">Cancel</a>
+                            {{/if}}
+                            <li class="user-stat" id="username">Username: {{username}}</li>
+                            <div id="username-div" style="display: none">
+                                <input type="text" id="input-username"><button id="submit-username" class="btn btn-primary btn-sm">Submit</button>
+                            </div>
+                            <li class="user-stat">Joined: {{first_joined}}</li>
+                            <li class="user-stat">Rank: {{rank}}</li>
                         </ul>
                     </div>
                 </div>

+ 11 - 2
app/client/templates/settings.html

@@ -1,19 +1,28 @@
 <template name="settings">
+    <div id="head"></div>
     {{> header}}
     <div class="row">
         <h1 id="profile-name">{{username}}</h1>
         <div class="col-md-4 col-md-offset-4">
             <div class="panel panel-primary">
-                <div class="panel-heading">Basic Info</div>
+                <div class="panel-heading">General Settings</div>
                 <div class="panel-body">
                     <!--h3 class="text text-warning text-center">Unfortunately, there is currently nothing for you to edit.</h3-->
+                    <p class="settings-option">Liked & disliked songs</p>
                     <div class="checkbox">
                         <input class="checkbox-box" type="checkbox" id="showRating">
                         <label for="showRating" class="settings-label">
                             Show your likes/dislikes on your public profile
                         </label>
                     </div>
-                    <button class="btn btn-warning btn-block" id="save-settings">Save</button>
+                    <button class="btn btn-success btn-block" id="save-settings">Save</button>
+                    <p class="settings-option">Change Password</p>
+                    <input type="password" id="old-password" class="form-control settings-input" placeholder="Old password">
+                    <input type="password" id="new-password" class="form-control settings-input" placeholder="New password">
+                    <input type="password" id="confirm-password" class="form-control settings-input" placeholder="Re-enter new password">
+                    <button class="btn btn-warning btn-block" id="change-password">Change Password</button>
+                    <p class="settings-option">Delete Account</p>
+                    <button class="btn btn-danger btn-block" id="delete-account">Delete</button>
                 </div>
             </div>
         </div>

+ 16 - 3
app/server/server.js

@@ -411,7 +411,7 @@ Accounts.onCreateUser(function(options, user) {
             username = user.username;
         }
     }
-    user.profile = {username: username, usernameL: username.toLowerCase(), rank: "default", liked: [], disliked: [], settings: {showRating: false}};
+    user.profile = {username: username, usernameL: username.toLowerCase(), rank: "default", liked: [], disliked: [], settings: {showRating: false}, realname: ""};
     return user;
 });
 
@@ -456,10 +456,10 @@ Meteor.publish("userProfiles", function(username) {
     if (settings !== undefined && settings.profile.settings) {
         settings = settings.profile.settings;
         if (settings.showRating === true) {
-            return Meteor.users.find({"profile.usernameL": username}, {fields: {"profile.username": 1, "profile.usernameL": 1, "profile.rank": 1, createdAt: 1, "profile.liked": 1, "profile.disliked": 1, "profile.settings": 1}});
+            return Meteor.users.find({"profile.usernameL": username}, {fields: {"profile.username": 1, "profile.usernameL": 1, "profile.rank": 1, createdAt: 1, "profile.liked": 1, "profile.disliked": 1, "profile.settings": 1, "profile.realname": 1}});
         }
     }
-    return Meteor.users.find({"profile.usernameL": username}, {fields: {"profile.username": 1, "profile.usernameL": 1, "profile.rank": 1, createdAt: 1, "profile.settings": 1}});
+    return Meteor.users.find({"profile.usernameL": username}, {fields: {"profile.username": 1, "profile.usernameL": 1, "profile.rank": 1, createdAt: 1, "profile.settings": 1, "profile.realname": 1}});
 });
 
 Meteor.publish("isAdmin", function() {
@@ -990,6 +990,19 @@ Meteor.methods({
         if (!isBanned()) {
             return Object.keys(Meteor.default_server.sessions).length;
         }
+    },
+    getTotalUsers: function(){
+        console.log(Meteor.users.find().count());
+        return Meteor.users.find().count();
+    },
+    updateRealName: function(username, realname){
+        Meteor.users.update({"profile.username": username}, {$set: {"profile.realname": realname}});
+    },
+    updateUserName: function(username, newUserName){
+        Meteor.users.update({"username": username}, {$set: {"username": newUserName, "profile.username": newUserName, "profile.usernameL": newUserName.toLowerCase()}})
+    },
+    deleteAccount: function(userID) {
+        Meteor.users.remove({_id: userID});
     }
 });