Browse Source

Work on the user account system

Allow a user to modifies its name, username, initials, and password.

Fixes username handling on sandstorm.

Fixes #149.
Maxime Quandalle 10 năm trước cách đây
mục cha
commit
7f6929608c

+ 1 - 0
client/components/boards/boardBody.styl

@@ -21,6 +21,7 @@
 
     &.is-dragging-active
 
+      .list-composer,
       .open-minicard-composer
         display: none
 

+ 16 - 19
client/components/lists/main.styl

@@ -103,25 +103,22 @@
   .ps-scrollbar-y-rail
     transform: translateX(2px)
 
-.open-minicard-composer
-  border-radius: 2px
-  color: #8c8c8c
-  display: block
-  padding: 7px 10px
-  position: relative
-  text-decoration: none
-  animation: fadeIn 0.3s
-
-  i.fa
-    margin-right: 7px
-
-  &:hover
-    background: white
-    color: #222
-    box-shadow: 0 1px 2px rgba(0,0,0,.2)
-
-  &::selection
-    background: transparent
+  .open-minicard-composer
+    border-radius: 2px
+    color: #8c8c8c
+    display: block
+    padding: 7px 10px
+    position: relative
+    text-decoration: none
+    animation: fadeIn 0.3s
+
+    i.fa
+      margin-right: 7px
+
+    &:hover
+      background: #fafafa
+      color: #222
+      box-shadow: 0 1px 2px rgba(0,0,0,.2)
 
 @keyframes fadeIn
   from

+ 7 - 5
client/components/main/header.styl

@@ -47,12 +47,14 @@
     #header-user-bar
       margin: 2px 0
 
-      .member
-        width: 24px
-        height: @width
+      .header-user-bar-avatar
         float: left
-        margin: 0
-        margin-top: 1px
+
+        .member
+          width: 24px
+          height: @width
+          margin: 0
+          margin-top: 1px
 
       .header-user-bar-name
         margin: 4px 8px 0 0

+ 4 - 3
client/components/main/layouts.jade

@@ -5,9 +5,10 @@ head
   link(rel="shortcut icon" href="/favicon.png")
 
 template(name="userFormsLayout")
-  h1.at-form-landing-logo
-    img(src="/logo.png" title="LibreBoard")
-  +yield
+  section.auth-layout
+    h1.at-form-landing-logo
+      img(src="/logo.png" title="LibreBoard")
+    +yield
 
 template(name="defaultLayout")
   #surface

+ 13 - 0
client/components/main/popup.js

@@ -31,6 +31,19 @@ Popup.template.events({
   },
   'click .js-confirm': function() {
     this.__afterConfirmAction.call(this);
+  },
+  // This handler intends to solve a pretty tricky bug with our popup
+  // transition. The transition is implemented using a large container
+  // (.content-container) that is moved on the x-axis (from 0 to n*PopupSize)
+  // inside a wrapper (.container-wrapper) with a hidden overflow. The problem
+  // is that sometimes the wrapper is scrolled -- even if there are no
+  // scrollbars. This happen for instance when the newly opened popup has some
+  // focused field, the browser will automatically scroll the wrapper, resulting
+  // in moving the whole popup container outside of the popup wrapper. To
+  // disable this behavior we have to manually reset the scrollLeft position
+  // whenever it is modified.
+  'scroll .content-wrapper': function(evt) {
+    evt.currentTarget.scrollLeft = 0;
   }
 });
 

+ 14 - 9
client/components/main/popup.styl

@@ -6,8 +6,6 @@
   border: 1px solid #dbdbdb
   border-bottom-color: #c2c2c2
   box-shadow: 0 1px 6px rgba(0, 0, 0, .3)
-  display: none
-  overflow: hidden
   position: absolute
   width: 300px
   z-index: 99999
@@ -20,12 +18,10 @@
   input[type="text"],
   input[type="email"],
   input[type="password"]
+  input[type="file"]
     margin: 4px 0 12px
     width: 100%
 
-  input[type="file"]
-    width: 240px
-
   select
     width: 100%
     margin-bottom: 14px
@@ -35,9 +31,6 @@
     margin: 4px 0 12px
     width: 100%
 
-  img
-    max-width: 270px
-
   .header
     height: 36px
     position: relative
@@ -80,6 +73,7 @@
 
   .content-wrapper
     width: 100%
+    overflow: hidden
 
   .content-container
     width: 5000px
@@ -92,7 +86,7 @@
       float: left
 
       &.no-height
-        height: 0
+        height: 20px
 
   .quiet
     padding: 6px 6px 4px
@@ -113,6 +107,17 @@
         height: 4px
         width: 4px
 
+  .at-form
+    .at-error, .at-result
+      padding: 8px 12px
+      margin: -8px -10px 10px
+
+    .at-error
+      background: #ef9a9a
+
+    .at-result
+      background: #b2dfdb
+
 .select-members-list
   margin-bottom: 8px
 

+ 3 - 2
client/components/main/popup.tpl.jade

@@ -1,8 +1,8 @@
-.pop-over.clearfix(
+.pop-over(
   class="{{#unless title}}miniprofile{{/unless}}"
   class=currentBoard.colorClass
   class="{{#unless title}}no-title{{/unless}}"
-  style="display:block; left:{{offset.left}}px; top:{{offset.top}}px;")
+  style="left:{{offset.left}}px; top:{{offset.top}}px;")
   .header
     a.back-btn.js-back-view(class="{{#unless hasPopupParent}}is-hidden{{/unless}}")
       i.fa.fa-chevron-left
@@ -20,3 +20,4 @@
           Hopefully the @last helper will come soon (or at least @index)
         .content(class="{{#unless $eq popupName ../popupName}}no-height{{/unless}}")
           +Template.dynamic(template=popupName data=dataContext)
+      .clearfix

+ 1 - 1
client/components/main/templates.html

@@ -5,7 +5,7 @@
 <template name='message'>
     <div class="big-message quiet {{ color }}">
         <h1>{{_ label}}</h1>
-        {{#with pathFor route='Login'}}
+        {{#with pathFor route='atSignIn'}}
             <p>{{{_ 'page-maybe-private' this}}}</p>
         {{/with}}
     </div>

+ 2 - 2
client/components/sidebar/sidebarFilters.js

@@ -6,12 +6,12 @@ BlazeComponent.extendComponent({
   events: function() {
     return [{
       'click .js-toggle-label-filter': function(event) {
-        Filter.labelIds.toogle(this._id);
+        Filter.labelIds.toogle(this.currentData()._id);
         Filter.resetExceptions();
         event.preventDefault();
       },
       'click .js-toogle-member-filter': function(event) {
-        Filter.members.toogle(this._id);
+        Filter.members.toogle(this.currentData()._id);
         Filter.resetExceptions();
         event.preventDefault();
       },

+ 2 - 8
client/components/users/router.js

@@ -1,5 +1,5 @@
-_.each(['signIn', 'signUp', 'resetPwd',
-  'forgotPwd', 'enrollAccount', 'changePwd'], function(routeName) {
+_.each(['signIn', 'signUp', 'resetPwd', 'forgotPwd', 'enrollAccount'],
+  function(routeName) {
   AccountsTemplates.configureRoute(routeName, {
     layoutTemplate: 'userFormsLayout'
   });
@@ -20,9 +20,3 @@ Router.route('/profile/:username', {
     };
   }
 });
-
-Router.route('/settings', {
-  name: 'Settings',
-  template: 'settings',
-  layoutTemplate: 'AuthLayout'
-});

+ 47 - 46
client/components/users/userForm.styl

@@ -1,49 +1,50 @@
-.at-form-landing-logo
-  width: 275px
-  margin: auto
-  margin-top: 50px
-  margin-top: 17vh
-
-  img
+.auth-layout
+  .at-form-landing-logo
     width: 275px
+    margin: auto
+    margin-top: 50px
+    margin-top: 17vh
+
+    img
+      width: 275px
 
-.at-form
-  margin: auto
-  width: 275px
-  padding: 25px
-  margin-top: 20px
-  padding-bottom: 10px
-  background: #fff
-  border-radius: 3px
-  border: 1px solid #dbdbdb
-  border-bottom-color: #c2c2c2
-  box-shadow: 0 1px 6px rgba(0, 0, 0, .3)
-
-  .at-link
-    color: darken(#27AE60, 40%)
-
-  label
-    margin-bottom: 3px
-
-  input
-    width: 100%
-
-  .at-title
-    background: #F7F7F7
-    margin: -25px
-    padding: 15px 25px 5px
-    margin-bottom: 20px
-    border-bottom: 1px solid #dcdcdc
-    color: darken(white, 70%)
-    font-weight: bold
-
-  .at-signup-link,
-  .at-signin-link,
-  .at-forgotPwd
-    font-size: 0.9em
-    margin-top: 15px
-    color: darken(white, 70%)
-
-    .at-signUp,
-    .at-signIn
+  .at-form
+    margin: auto
+    width: 275px
+    padding: 25px
+    margin-top: 20px
+    padding-bottom: 10px
+    background: #fff
+    border-radius: 3px
+    border: 1px solid #dbdbdb
+    border-bottom-color: #c2c2c2
+    box-shadow: 0 1px 6px rgba(0, 0, 0, .3)
+
+    .at-link
+      color: darken(#27AE60, 40%)
+
+    label
+      margin-bottom: 3px
+
+    input
+      width: 100%
+
+    .at-title
+      background: #F7F7F7
+      margin: -25px
+      padding: 15px 25px 5px
+      margin-bottom: 20px
+      border-bottom: 1px solid #dcdcdc
+      color: darken(white, 70%)
       font-weight: bold
+
+    .at-signup-link,
+    .at-signin-link,
+    .at-forgotPwd
+      font-size: 0.9em
+      margin-top: 15px
+      color: darken(white, 70%)
+
+      .at-signUp,
+      .at-signIn
+        font-weight: bold

+ 28 - 7
client/components/users/userHeader.jade

@@ -1,23 +1,44 @@
 template(name="headerUserBar")
-  a#header-user-bar.js-open-header-member-menu
-    .header-user-bar-name
+  a#header-user-bar
+    .header-user-bar-name.js-open-header-member-menu
       i.fa.fa-chevron-down
       if currentUser.profile.name
         = currentUser.profile.name
       else
         = currentUser.username
-    +userAvatar(user=currentUser)
+    .header-user-bar-avatar.js-change-avatar
+      +userAvatar(user=currentUser)
 
 template(name="memberMenuPopup")
   ul.pop-over-list
-    li: a(href="{{pathFor route='Profile' username=currentUser.username}}") {{_ 'profile'}}
-    li: a.js-language {{_ 'language'}}
-    li: a(href = "{{pathFor route='Settings'}}") {{_ 'settings'}}
+    with currentUser
+      li: a.js-edit-profile Edit Profile…
+    li: a.js-change-avatar Change Avatar…
+    li: a.js-change-password Change Password…
+    li: a.js-change-language Change Language…
   hr
   ul.pop-over-list
     li: a.js-logout {{_ 'log-out'}}
 
-template(name="setLanguagePopup")
+template(name="editProfilePopup")
+  form
+    label
+      | {{_ "fullname"}}
+      input.js-profile-fullname(type="text" value=profile.name autofocus)
+    label
+      | {{_ "username"}}
+      input.js-profile-username(type="text" value=username)
+    label
+      | Initials
+      input.js-profile-initials(type="text" value=profile.initials)
+    input.primary.wide(type="submit" value="{{_ 'save'}}")
+
+template(name="changeAvatarPopup")
+
+template(name="changePasswordPopup")
+  +atForm(state='changePwd')
+
+template(name="changeLanguagePopup")
   ul.pop-over-list
     each languages
       li(class="{{# if isCurrentLanguage}}active{{/if}}")

+ 59 - 14
client/components/users/userHeader.js

@@ -1,8 +1,64 @@
 Template.headerUserBar.events({
-  'click .js-open-header-member-menu': Popup.open('memberMenu')
+  'click .js-open-header-member-menu': Popup.open('memberMenu'),
+  'click .js-change-avatar': Popup.open('changeAvatar')
 });
 
-Template.setLanguagePopup.helpers({
+Template.memberMenuPopup.events({
+  'click .js-edit-profile': Popup.open('editProfile'),
+  'click .js-change-avatar': Popup.open('changeAvatar'),
+  'click .js-change-password': Popup.open('changePassword'),
+  'click .js-change-language': Popup.open('changeLanguage'),
+  'click .js-logout': function(evt) {
+    evt.preventDefault();
+
+    AccountsTemplates.logout();
+  }
+});
+
+Template.editProfilePopup.events({
+  submit: function(evt, tpl) {
+    evt.preventDefault();
+    var fullname = $.trim(tpl.find('.js-profile-fullname').value);
+    var username = $.trim(tpl.find('.js-profile-username').value);
+    var initials = $.trim(tpl.find('.js-profile-initials').value);
+    Users.update(Meteor.userId(), {$set: {
+      'profile.fullname': fullname,
+      'profile.initials': initials
+    }});
+    // XXX We should report the error to the user.
+    if (username !== Meteor.user().username) {
+      Meteor.call('setUsername', username);
+    }
+    Popup.back();
+  }
+});
+
+// We display the form to change the password in a popup window that already
+// have a title, so we unset the title automatically displayed by useraccounts.
+AccountsTemplates.configure({
+  texts: {
+    title: {
+      changePwd: ''
+    }
+  }
+});
+
+AccountsTemplates.configureRoute('changePwd', {
+  redirect: function() {
+    // XXX We should emit a notification once we have a notification system.
+    // Currently the user has no indication that his modification has been
+    // applied.
+    Popup.back();
+  }
+});
+
+// XXX For some reason the useraccounts autofocus isnt working in this case.
+// See https://github.com/meteor-useraccounts/core/issues/384
+Template.changePasswordPopup.onRendered(function() {
+  this.find('#at-field-current_password').focus();
+});
+
+Template.changeLanguagePopup.helpers({
   languages: function() {
     return _.map(TAPi18n.getLanguages(), function(lang, tag) {
       return {
@@ -16,18 +72,7 @@ Template.setLanguagePopup.helpers({
   }
 });
 
-Template.memberMenuPopup.events({
-  'click .js-language': Popup.open('setLanguage'),
-  'click .js-logout': function(evt) {
-    evt.preventDefault();
-
-    Meteor.logout(function() {
-      Router.go('Home');
-    });
-  }
-});
-
-Template.setLanguagePopup.events({
+Template.changeLanguagePopup.events({
   'click .js-set-language': function(evt) {
     Users.update(Meteor.userId(), {
       $set: {

+ 14 - 30
client/config/accounts.js

@@ -1,35 +1,19 @@
+var passwordField = AccountsTemplates.removeField('password');
+var emailField = AccountsTemplates.removeField('email');
+AccountsTemplates.addFields([{
+  _id: 'username',
+  type: 'text',
+  displayName: 'username',
+  required: true,
+  minLength: 5
+}, emailField, passwordField]);
+
 AccountsTemplates.configure({
   confirmPassword: false,
   enablePasswordChange: true,
   sendVerificationEmail: true,
-  showForgotPasswordLink: true
-});
-
-AccountsTemplates.removeField('password');
-AccountsTemplates.removeField('email');
-AccountsTemplates.addFields([
-  {
-    _id: 'username',
-    type: 'text',
-    displayName: 'username',
-    required: true,
-    minLength: 5
-  },
-  {
-    _id: 'email',
-    type: 'email',
-    required: true,
-    displayName: 'email',
-    re: /.+@(.+){2,}\.(.+){2,}/,
-    errStr: 'Invalid email'
-  },
-  {
-    _id: 'password',
-    type: 'password',
-    placeholder: {
-      signUp: 'At least six characters'
-    },
-    required: true,
-    minLength: 6
+  showForgotPasswordLink: true,
+  onLogoutHook: function() {
+    Router.go('Home');
   }
-]);
+});

+ 2 - 2
client/lib/popup.js

@@ -202,9 +202,9 @@ $(document).on('click', function(evt) {
   }
 });
 
-// Press escape to close the popup.
+// Press escape to go back, or close the popup.
 var bindPopup = function(f) { return _.bind(f, Popup); };
 EscapeActions.register('popup',
-  bindPopup(Popup.close),
+  bindPopup(Popup.back),
   bindPopup(Popup.isOpen)
 );

+ 5 - 3
client/styles/icons.styl

@@ -21,8 +21,10 @@
     &:hover
       color: white
 
-a.fa, a i.fa
-  color: darken(white, 35%)
+a
+  &.fa, i.fa
+    color: darken(white, 35%)
 
   &:hover
-    color: darken(white, 60%)
+    &.fa, i.fa
+      color: darken(white, 60%)

+ 24 - 0
collections/users.js

@@ -41,11 +41,35 @@ Users.helpers({
   }
 });
 
+Meteor.methods({
+  setUsername: function(username) {
+    var nUsersWithUsername = Users.find({username: username}).count();
+    if (nUsersWithUsername > 0) {
+      throw new Meteor.Error('username-already-taken');
+    } else {
+      Users.update(this.userId, {$set: {
+        username: username
+      }});
+    }
+  }
+});
+
 Users.before.insert(function(userId, doc) {
   doc.profile = doc.profile || {};
+
+  if (! doc.username && doc.profile.name) {
+    doc.username = doc.profile.name.toLowerCase().replace(/\s/g, '');
+  }
 });
 
 if (Meteor.isServer) {
+  // Let mongoDB ensure username unicity
+  Meteor.startup(function() {
+    Users._collection._ensureIndex({
+      username: 1
+    }, { unique: true });
+  });
+
   // Each board document contains the de-normalized number of users that have
   // starred it. If the user star or unstar a board, we need to update this
   // counter.

+ 1 - 1
i18n/ar.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "Create Label",
     "deleteLabelPopup-title": "Delete Label?",
     "changePermissionsPopup-title": "Change Permissions",
-    "setLanguagePopup-title": "Change Language",
+    "changeLanguagePopup-title": "Change Language",
     "cardAttachmentsPopup-title": "Attach From…",
     "attachmentDeletePopup-title": "Delete Attachment?"
 }

+ 1 - 1
i18n/br.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "Criar Etiqueta",
     "deleteLabelPopup-title": "Excluir Etiqueta?",
     "changePermissionsPopup-title": "Alterar Permissões",
-    "setLanguagePopup-title": "Alterar Idioma",
+    "changeLanguagePopup-title": "Alterar Idioma",
     "cardAttachmentsPopup-title": "Anexar de…",
     "attachmentDeletePopup-title": "Excluir Anexo?"
 }

+ 1 - 1
i18n/cm.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "Create Label",
     "deleteLabelPopup-title": "Delete Label?",
     "changePermissionsPopup-title": "Change Permissions",
-    "setLanguagePopup-title": "Change Language",
+    "changeLanguagePopup-title": "Change Language",
     "cardAttachmentsPopup-title": "Attach From…",
     "attachmentDeletePopup-title": "Delete Attachment?"
 }

+ 1 - 1
i18n/cn.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "创建标签",
     "deleteLabelPopup-title": "删除标签?",
     "changePermissionsPopup-title": "更改权限",
-    "setLanguagePopup-title": "更改语言",
+    "changeLanguagePopup-title": "更改语言",
     "cardAttachmentsPopup-title": "附加自...",
     "attachmentDeletePopup-title": "删除附件?"
 }

+ 1 - 1
i18n/cs.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "Create Label",
     "deleteLabelPopup-title": "Delete Label?",
     "changePermissionsPopup-title": "Change Permissions",
-    "setLanguagePopup-title": "Change Language",
+    "changeLanguagePopup-title": "Change Language",
     "cardAttachmentsPopup-title": "Attach From…",
     "attachmentDeletePopup-title": "Delete Attachment?"
 }

+ 1 - 1
i18n/de.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "Label erstellen",
     "deleteLabelPopup-title": "Entferne Label?",
     "changePermissionsPopup-title": "Ändere Erlaubnisse",
-    "setLanguagePopup-title": "Ändere Sprache",
+    "changeLanguagePopup-title": "Ändere Sprache",
     "cardAttachmentsPopup-title": "Attach From…",
     "attachmentDeletePopup-title": "Delete Attachment?"
 }

+ 5 - 1
i18n/en.i18n.json

@@ -181,8 +181,12 @@
     "createLabelPopup-title": "Create Label",
     "deleteLabelPopup-title": "Delete Label?",
     "changePermissionsPopup-title": "Change Permissions",
-    "setLanguagePopup-title": "Change Language",
+    "changeLanguagePopup-title": "Change Language",
     "cardAttachmentsPopup-title": "Attach From…",
     "attachmentDeletePopup-title": "Delete Attachment?",
+    "memberMenuPopup-title": "Member Settings",
+    "editProfilePopup-title": "Edit Profile",
+    "changeAvatarPopup-title": "Change Avatar",
+    "changePasswordPopup-title": "Change Password",
     "disambiguateMultiLabelPopup-title": "Disambiguate Label Action"
 }

+ 1 - 1
i18n/es.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "Crear etiqueta",
     "deleteLabelPopup-title": "Borrar etiqueta",
     "changePermissionsPopup-title": "Cambiar permisos",
-    "setLanguagePopup-title": "Cambiar idioma",
+    "changeLanguagePopup-title": "Cambiar idioma",
     "cardAttachmentsPopup-title": "Adjuntar de...",
     "attachmentDeletePopup-title": "¿Borrar adjunto?"
 }

+ 1 - 1
i18n/fi.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "Luo tunniste",
     "deleteLabelPopup-title": "Poista tunniste?",
     "changePermissionsPopup-title": "Vaihda oikeuksia",
-    "setLanguagePopup-title": "Vaihda kieltä",
+    "changeLanguagePopup-title": "Vaihda kieltä",
     "cardAttachmentsPopup-title": "Liitä mistä...",
     "attachmentDeletePopup-title": "Poista liitetiedosto?"
 }

+ 1 - 1
i18n/fr.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "Créer un étiquette",
     "deleteLabelPopup-title": "Supprimer l'étiquette ?",
     "changePermissionsPopup-title": "Changer les permissions",
-    "setLanguagePopup-title": "Changer la langue",
+    "changeLanguagePopup-title": "Changer la langue",
     "cardAttachmentsPopup-title": "Joindre depuis…",
     "attachmentDeletePopup-title": "Supprimer la pièce jointe ?"
 }

+ 1 - 1
i18n/hk.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "Create Label",
     "deleteLabelPopup-title": "Delete Label?",
     "changePermissionsPopup-title": "Change Permissions",
-    "setLanguagePopup-title": "Change Language",
+    "changeLanguagePopup-title": "Change Language",
     "cardAttachmentsPopup-title": "Attach From…",
     "attachmentDeletePopup-title": "Delete Attachment?"
 }

+ 1 - 1
i18n/id.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "Create Label",
     "deleteLabelPopup-title": "Delete Label?",
     "changePermissionsPopup-title": "Change Permissions",
-    "setLanguagePopup-title": "Change Language",
+    "changeLanguagePopup-title": "Change Language",
     "cardAttachmentsPopup-title": "Attach From…",
     "attachmentDeletePopup-title": "Delete Attachment?"
 }

+ 1 - 1
i18n/ja.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "ラベルの作成",
     "deleteLabelPopup-title": "ラベルを削除しますか?",
     "changePermissionsPopup-title": "パーミッションの変更",
-    "setLanguagePopup-title": "言語の変更",
+    "changeLanguagePopup-title": "言語の変更",
     "cardAttachmentsPopup-title": "Attach From…",
     "attachmentDeletePopup-title": "Delete Attachment?"
 }

+ 1 - 1
i18n/ko.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "라벨 생성",
     "deleteLabelPopup-title": "라벨을 삭제합니까?",
     "changePermissionsPopup-title": "권한 변경",
-    "setLanguagePopup-title": "언어 변경",
+    "changeLanguagePopup-title": "언어 변경",
     "cardAttachmentsPopup-title": "첨부할 위치...",
     "attachmentDeletePopup-title": "첨부 파일을 삭제합니까?"
 }

+ 1 - 1
i18n/ru.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "Создать метку",
     "deleteLabelPopup-title": "Удалить метку?",
     "changePermissionsPopup-title": "Изменить настройки доступа",
-    "setLanguagePopup-title": "Сменить язык",
+    "changeLanguagePopup-title": "Сменить язык",
     "cardAttachmentsPopup-title": "Источник",
     "attachmentDeletePopup-title": "Удалить вложение?"
 }

+ 1 - 1
i18n/tr.i18n.json

@@ -169,7 +169,7 @@
     "createLabelPopup-title": "Etiket Oluşturma",
     "deleteLabelPopup-title": "Etiket Silinsin mi?",
     "changePermissionsPopup-title": "Yetkileri Değiştirme",
-    "setLanguagePopup-title": "Dil Değiştir",
+    "changeLanguagePopup-title": "Dil Değiştir",
     "cardAttachmentsPopup-title": "Şuradan Ekle...",
     "attachmentDeletePopup-title": "Ek Dosya Silinsin Mi?"
 }

+ 0 - 4
sandstorm.js

@@ -88,10 +88,6 @@ if (isSandstorm && Meteor.isServer) {
         }
       });
     }
-
-    // The sandstom user package put the username in `profile.name`. We need to
-    // move this field value to follow our schema.
-    Users.update(doc._id, { $rename: { 'profile.name': 'username' }});
   });
 }