浏览代码

Merge branch 'thuanpq-devel' into devel

User Admin to Admin Panel: List users.
Change: is user admin, name, fullname, email address, is user active.
Not changing password yet. Thanks to thuanpq and xet7 ! Related #802
Lauri Ojansivu 7 年之前
父节点
当前提交
0ea96fca3f

+ 1 - 0
.gitignore

@@ -5,6 +5,7 @@
 tmp/
 node_modules/
 .vscode/
+.idea/
 .build/*
 packages/kadira-flow-router/
 packages/meteor-useraccounts-core/

+ 2 - 1
CHANGELOG.md

@@ -3,6 +3,7 @@
 This release adds the following new features:
 
 * [Markdown in card/minicard/checlist titles and checklist items. Next line: Shift+Enter. Submit: Enter.](https://github.com/wekan/wekan/pull/1334);
+* [User Admin to Admin Panel: List users. Change: is user admin, name, fullname, email address, is user active. Not changing password yet.](https://github.com/wekan/wekan/pull/1325).
 
 and fixes the following bugs:
 
@@ -10,7 +11,7 @@ and fixes the following bugs:
 * [Fix: Codeblocks should not be scanned for emoji](https://github.com/wekan/wekan/issues/643);
 * [Fix: Whitespace trimming breaks Markdown code block indentation](https://github.com/wekan/wekan/issues/1288).
 
-Thanks to Github user brooksbecton for contributions.
+Thanks to Github users brooksbecton, thuanpq and xet7 for their contributions.
 
 # v0.54 2017-11-02 Wekan release
 

+ 89 - 0
client/components/settings/peopleBody.jade

@@ -0,0 +1,89 @@
+template(name="people")
+  .setting-content
+    unless currentUser.isAdmin
+      | {{_ 'error-notAuthorized'}}
+    else
+      .content-title
+        span {{_ 'people'}}
+      .content-body
+        .side-menu
+          ul
+            li.active
+              a.js-setting-menu(data-id="people-setting") {{_ 'people'}}
+        .main-body
+          if loading.get
+            +spinner
+          else if people.get
+            +peopleGeneral
+
+template(name="peopleGeneral")
+  table
+    tbody
+      tr
+        th {{_ 'username'}}
+        th {{_ 'fullname'}}
+        th {{_ 'admin'}}
+        th {{_ 'email'}}
+        th {{_ 'verified'}}
+        th {{_ 'createdAt'}}
+        th {{_ 'active'}}
+        th
+      each user in peopleList
+        +peopleRow(userId=user._id)
+
+template(name="peopleRow")
+  tr
+    td.username {{ userData.username }}
+    td {{ userData.profile.fullname }}
+    td
+      if userData.isAdmin
+        | {{_ 'yes'}}
+      else
+        | {{_ 'no'}}
+    td {{ userData.emails.[0].address }}
+    td
+      if userData.emails.[0].verified
+        | {{_ 'yes'}}
+      else
+        | {{_ 'no'}}
+    td {{ moment userData.createdAt 'LLL' }}
+    td
+      if userData.loginDisabled
+        | {{_ 'no'}}
+      else
+        | {{_ 'yes'}}
+    td
+      a.edit-user
+        | {{_ 'edit'}}
+
+template(name="editUserPopup")
+  form
+    label.hide.userId(type="text" value=user._id)
+    label
+      | {{_ 'fullname'}}
+      input.js-profile-fullname(type="text" value=user.profile.fullname autofocus)
+    label
+      | {{_ 'username'}}
+      span.error.hide.username-taken
+        | {{_ 'error-username-taken'}}
+      input.js-profile-username(type="text" value=user.username)
+    label
+      | {{_ 'initials'}}
+      input.js-profile-initials(type="text" value=user.profile.initials)
+    label
+      | {{_ 'email'}}
+      span.error.hide.email-taken
+        | {{_ 'error-email-taken'}}
+      input.js-profile-email(type="email" value="{{user.emails.[0].address}}")
+    label
+      | {{_ 'admin'}}
+      select.select-role.js-profile-isadmin
+        option(value="false") {{_ 'no'}}
+        option(value="true" selected="{{user.isAdmin}}") {{_ 'yes'}}
+    label
+      | {{_ 'active'}}
+      select.select-active.js-profile-isactive
+        option(value="false") {{_ 'yes'}}
+        option(value="true" selected="{{user.loginDisabled}}") {{_ 'no'}}
+
+    input.primary.wide(type="submit" value="{{_ 'save'}}")

+ 156 - 0
client/components/settings/peopleBody.js

@@ -0,0 +1,156 @@
+const usersPerPage = 25;
+
+BlazeComponent.extendComponent({
+  mixins() {
+    return [Mixins.InfiniteScrolling];
+  },
+  onCreated() {
+    this.error = new ReactiveVar('');
+    this.loading = new ReactiveVar(false);
+    this.people = new ReactiveVar(true);
+
+    this.page = new ReactiveVar(1);
+    this.loadNextPageLocked = false;
+    this.callFirstWith(null, 'resetNextPeak');
+    this.autorun(() => {
+      const limit = this.page.get() * usersPerPage;
+
+      this.subscribe('people', limit, () => {
+        this.loadNextPageLocked = false;
+        const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
+        this.calculateNextPeak();
+        const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
+        if (nextPeakBefore === nextPeakAfter) {
+          this.callFirstWith(null, 'resetNextPeak');
+        }
+      });
+    });
+  },
+  loadNextPage() {
+    if (this.loadNextPageLocked === false) {
+      this.page.set(this.page.get() + 1);
+      this.loadNextPageLocked = true;
+    }
+  },
+  calculateNextPeak() {
+    const element = this.find('.main-body');
+    if (element) {
+      const altitude = element.scrollHeight;
+      this.callFirstWith(this, 'setNextPeak', altitude);
+    }
+  },
+  reachNextPeak() {
+    this.loadNextPage();
+  },
+  setError(error) {
+    this.error.set(error);
+  },
+  setLoading(w) {
+    this.loading.set(w);
+  },
+  peopleList() {
+    return Users.find({}, {
+      fields: {_id: true},
+    });
+  },
+}).register('people');
+
+Template.peopleRow.helpers({
+  userData() {
+    const userCollection = this.esSearch ? ESSearchResults : Users;
+    return userCollection.findOne(this.userId);
+  },
+});
+
+Template.editUserPopup.helpers({
+  user() {
+    return Users.findOne(this.userId);
+  },
+});
+
+BlazeComponent.extendComponent({
+  onCreated() {
+  },
+  user() {
+    return Users.findOne(this.userId);
+  },
+  events() {
+    return [{
+      'click a.edit-user': Popup.open('editUser'),
+    }];
+  },
+}).register('peopleRow');
+
+Template.editUserPopup.events({
+  submit(evt, tpl) {
+    evt.preventDefault();
+    const user = Users.findOne(this.userId);
+    const fullname = tpl.find('.js-profile-fullname').value.trim();
+    const username = tpl.find('.js-profile-username').value.trim();
+    const initials = tpl.find('.js-profile-initials').value.trim();
+    const isAdmin = tpl.find('.js-profile-isadmin').value.trim();
+    const isActive = tpl.find('.js-profile-isactive').value.trim();
+    const email = tpl.find('.js-profile-email').value.trim();
+    let isChangeUserName = false;
+    let isChangeEmail = false;
+
+    Users.update(this.userId, {
+      $set: {
+        'profile.fullname': fullname,
+        'profile.initials': initials,
+        'isAdmin': isAdmin === 'true',
+        'loginDisabled': isActive === 'true',
+      },
+    });
+
+    isChangeUserName = username !== user.username;
+    isChangeEmail = email.toLowerCase() !== user.emails[0].address.toLowerCase();
+
+    if (isChangeUserName && isChangeEmail) {
+      Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), this.userId, function (error) {
+        const usernameMessageElement = tpl.$('.username-taken');
+        const emailMessageElement = tpl.$('.email-taken');
+        if (error) {
+          const errorElement = error.error;
+          if (errorElement === 'username-already-taken') {
+            usernameMessageElement.show();
+            emailMessageElement.hide();
+          } else if (errorElement === 'email-already-taken') {
+            usernameMessageElement.hide();
+            emailMessageElement.show();
+          }
+        } else {
+          usernameMessageElement.hide();
+          emailMessageElement.hide();
+          Popup.close();
+        }
+      });
+    } else if (isChangeUserName) {
+      Meteor.call('setUsername', username, this.userId, function (error) {
+        const usernameMessageElement = tpl.$('.username-taken');
+        if (error) {
+          const errorElement = error.error;
+          if (errorElement === 'username-already-taken') {
+            usernameMessageElement.show();
+          }
+        } else {
+          usernameMessageElement.hide();
+          Popup.close();
+        }
+      });
+    } else if (isChangeEmail) {
+      Meteor.call('setEmail', email.toLowerCase(), this.userId, function (error) {
+        const emailMessageElement = tpl.$('.email-taken');
+        if (error) {
+          const errorElement = error.error;
+          if (errorElement === 'email-already-taken') {
+            emailMessageElement.show();
+          }
+        } else {
+          emailMessageElement.hide();
+          Popup.close();
+        }
+      });
+    } else Popup.close();
+  },
+});

+ 15 - 0
client/components/settings/peopleBody.styl

@@ -0,0 +1,15 @@
+.main-body
+  overflow: scroll;
+
+table
+  font-family: arial, sans-serif;
+  border-collapse: collapse;
+  width: 100%;
+
+  td, th
+    border: 1px solid #d2d0d0;
+    text-align: left;
+    padding: 8px;
+
+  tr:nth-child(even)
+    background-color: #dddddd;

+ 5 - 4
client/components/settings/settingHeader.jade

@@ -9,13 +9,14 @@ template(name="settingHeaderBar")
           a.setting-header-btn.settings(href="{{pathFor 'setting'}}")
             i.fa(class="fa-cog")
             span {{_ 'settings'}}
+
+          a.setting-header-btn.people(href="{{pathFor 'people'}}")
+            i.fa(class="fa-users")
+            span {{_ 'people'}}
+
           a.setting-header-btn.informations(href="{{pathFor 'information'}}")
             i.fa(class="fa-info-circle")
             span {{_ 'info'}}
-//TODO
-//          a.setting-header-btn.people
-//            i.fa(class="fa-users")
-//            span {{_ 'people'}}
 
         else
           a.setting-header-btn.js-log-in(

+ 5 - 5
client/components/users/userHeader.js

@@ -42,7 +42,7 @@ Template.editProfilePopup.events({
     isChangeUserName = username !== Meteor.user().username;
     isChangeEmail = email.toLowerCase() !== Meteor.user().emails[0].address.toLowerCase();
     if (isChangeUserName && isChangeEmail) {
-      Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), function(error) {
+      Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), Meteor.userId(), function (error) {
         const usernameMessageElement = tpl.$('.username-taken');
         const emailMessageElement = tpl.$('.email-taken');
         if (error) {
@@ -61,7 +61,7 @@ Template.editProfilePopup.events({
         }
       });
     } else if (isChangeUserName) {
-      Meteor.call('setUsername', username, function(error) {
+      Meteor.call('setUsername', username, Meteor.userId(), function (error) {
         const messageElement = tpl.$('.username-taken');
         if (error) {
           messageElement.show();
@@ -71,7 +71,7 @@ Template.editProfilePopup.events({
         }
       });
     } else if (isChangeEmail) {
-      Meteor.call('setEmail', email.toLowerCase(), function(error) {
+      Meteor.call('setEmail', email.toLowerCase(), Meteor.userId(), function (error) {
         const messageElement = tpl.$('.email-taken');
         if (error) {
           messageElement.show();
@@ -105,7 +105,7 @@ Template.editNotificationPopup.events({
 
 // 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() {
+Template.changePasswordPopup.onRendered(function () {
   this.find('#at-field-current_password').focus();
 });
 
@@ -116,7 +116,7 @@ Template.changeLanguagePopup.helpers({
         tag: code,
         name: lang.name === 'br' ? 'Brezhoneg' : lang.name,
       };
-    }).sort(function(a, b) {
+    }).sort(function (a, b) {
       if (a.name === b.name) {
         return 0;
       } else {

+ 20 - 0
config/router.js

@@ -140,6 +140,26 @@ FlowRouter.route('/information', {
   },
 });
 
+FlowRouter.route('/people', {
+  name: 'people',
+  triggersEnter: [
+    AccountsTemplates.ensureSignedIn,
+    () => {
+      Session.set('currentBoard', null);
+      Session.set('currentCard', null);
+
+      Filter.reset();
+      EscapeActions.executeAll();
+    },
+  ],
+  action() {
+    BlazeLayout.render('defaultLayout', {
+      headerBar: 'settingHeaderBar',
+      content: 'people',
+    });
+  },
+});
+
 FlowRouter.notFound = {
   action() {
     BlazeLayout.render('defaultLayout', { content: 'notFound' });

+ 4 - 1
i18n/ar.i18n.json

@@ -404,5 +404,8 @@
     "yes": "نعم",
     "no": "لا",
     "accounts": "الحسابات",
-    "accounts-allowEmailChange": "السماح بتغيير البريد الإلكتروني"
+    "accounts-allowEmailChange": "السماح بتغيير البريد الإلكتروني",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/br.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/ca.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Si",
     "no": "No",
     "accounts": "Comptes",
-    "accounts-allowEmailChange": "Permet modificar correu electrònic"
+    "accounts-allowEmailChange": "Permet modificar correu electrònic",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/cs.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Ano",
     "no": "Ne",
     "accounts": "Účty",
-    "accounts-allowEmailChange": "Povolit změnu Emailu"
+    "accounts-allowEmailChange": "Povolit změnu Emailu",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 12 - 9
i18n/de.i18n.json

@@ -72,7 +72,7 @@
     "archived-items": "Archivierte Einträge",
     "archived-boards": "Achivierte Boards",
     "restore-board": "Board wiederherstellen",
-    "no-archived-boards": "keine archivierten Boards",
+    "no-archived-boards": "Keine archivierten Boards",
     "archives": "Archive",
     "assign-member": "Mitglied zuweisen",
     "attached": "angehängt",
@@ -88,7 +88,7 @@
     "board-not-found": "Board nicht gefunden",
     "board-private-info": "Dieses Board wird <strong>privat</strong> sein.",
     "board-public-info": "Dieses Board wird <strong>öffentlich</strong> sein.",
-    "boardChangeColorPopup-title": "Boardfarbe ändern",
+    "boardChangeColorPopup-title": "Farbe des Boards ändern",
     "boardChangeTitlePopup-title": "Board umbenennen",
     "boardChangeVisibilityPopup-title": "Sichtbarkeit ändern",
     "boardChangeWatchPopup-title": "Beobachtung ändern",
@@ -97,7 +97,7 @@
     "bucket-example": "z.B. \"Löffelliste\"",
     "cancel": "Abbrechen",
     "card-archived": "Diese Karte wurde archiviert.",
-    "card-comments-title": "Diese Karte hat %s Kommentare.",
+    "card-comments-title": "Diese Karte hat %s Kommentar(e).",
     "card-delete-notice": "Löschen ist unwiderruflich. Alle Aktionen die dieser Karte zugeordnet sind werden ebenfalls gelöscht.",
     "card-delete-pop": "Alle Aktionen werden vom Aktivitätsfeed entfernt und die Karte kann nicht mehr geöffnet werden. Das Löschen kann nicht widerrufen werden!",
     "card-delete-suggest-archive": "Sie können eine Karte archivieren, um sie von dem Board zu entfernen und die Aktivitäten zu behalten.",
@@ -172,7 +172,7 @@
     "edit-avatar": "Profilbild ändern",
     "edit-profile": "Profil ändern",
     "edit-wip-limit": "WIP-Limit bearbeiten",
-    "soft-wip-limit": "Soft WIP Limit",
+    "soft-wip-limit": "Soft WIP-Limit",
     "editCardStartDatePopup-title": "Startdatum ändern",
     "editCardDueDatePopup-title": "Enddatum ändern",
     "editLabelPopup-title": "Label ändern",
@@ -229,7 +229,7 @@
     "import-board-instruction-wekan": "Gehen Sie in Ihrem Wekan board auf 'Menü', und dann auf 'Board exportieren'. Kopieren Sie anschließend den Text aus der heruntergeladenen Datei.",
     "import-json-placeholder": "Fügen Sie die korrekten JSON-Daten hier ein",
     "import-map-members": "Mitglieder zuordnen",
-    "import-members-map": "Das importierte Board hat einige Mitglieder. Bitte ordnen Sie die Mitglieder, die importiert werden sollen, Wekan-Nutzern zu",
+    "import-members-map": "Das importierte Board hat Mitglieder. Bitte ordnen Sie jene, die importiert werden sollen, vorhandenen Wekan-Nutzern zu",
     "import-show-user-mapping": "Mitgliederzuordnung überprüfen",
     "import-user-select": "Wählen Sie den Wekan-Nutzer aus, der dieses Mitglied sein soll",
     "importMapMembersAddPopup-title": "Wekan-Nutzer auswählen",
@@ -268,13 +268,13 @@
     "menu": "Menü",
     "move-selection": "Auswahl verschieben",
     "moveCardPopup-title": "Karte verschieben",
-    "moveCardToBottom-title": "Zum Ende verschieben",
+    "moveCardToBottom-title": "Ans Ende verschieben",
     "moveCardToTop-title": "Zum Anfang verschieben",
     "moveSelectionPopup-title": "Auswahl verschieben",
     "multi-selection": "Mehrfachauswahl",
     "multi-selection-on": "Mehrfachauswahl ist aktiv",
     "muted": "Stumm",
-    "muted-info": "Sie werden über keine Änderung in diesem Board benachrichtigt",
+    "muted-info": "Sie werden nicht über Änderungen auf diesem Board benachrichtigt",
     "my-boards": "Meine Boards",
     "name": "Name",
     "no-archived-cards": "Keine archivierten Karten.",
@@ -283,7 +283,7 @@
     "normal": "Normal",
     "normal-desc": "Kann Karten anschauen und bearbeiten, aber keine Einstellungen ändern.",
     "not-accepted-yet": "Die Einladung wurde noch nicht angenommen",
-    "notify-participate": "Benachrichtigungen über alle Karten erhalten, bei denen Sie als Ersteller oder Mitglied teilnehmen",
+    "notify-participate": "Benachrichtigungen zu allen Karten erhalten, an denen Sie teilnehmen",
     "notify-watch": "Benachrichtigungen über alle Boards, Listen oder Karten erhalten, die Sie beobachten",
     "optional": "optional",
     "or": "oder",
@@ -404,5 +404,8 @@
     "yes": "Ja",
     "no": "Nein",
     "accounts": "Konten",
-    "accounts-allowEmailChange": "Zulassen E-Mail ändern"
+    "accounts-allowEmailChange": "E-Mail ändern zulassen",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/en-GB.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/en.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/eo.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/es-AR.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Si",
     "no": "No",
     "accounts": "Cuentas",
-    "accounts-allowEmailChange": "Permitir Cambio de Email"
+    "accounts-allowEmailChange": "Permitir Cambio de Email",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/es.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Sí",
     "no": "No",
     "accounts": "Cuentas",
-    "accounts-allowEmailChange": "Permitir cambiar el correo electrónico"
+    "accounts-allowEmailChange": "Permitir cambiar el correo electrónico",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/eu.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Bai",
     "no": "Ez",
     "accounts": "Kontuak",
-    "accounts-allowEmailChange": "Baimendu e-mail aldaketa"
+    "accounts-allowEmailChange": "Baimendu e-mail aldaketa",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/fa.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/fi.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Kyllä",
     "no": "Ei",
     "accounts": "Tilit",
-    "accounts-allowEmailChange": "Salli sähköpostiosoitteen muuttaminen"
+    "accounts-allowEmailChange": "Salli sähköpostiosoitteen muuttaminen",
+    "createdAt": "Luotu",
+    "verified": "Varmistettu",
+    "active": "Aktiivinen"
 }

+ 5 - 2
i18n/fr.i18n.json

@@ -172,7 +172,7 @@
     "edit-avatar": "Modifier l'avatar",
     "edit-profile": "Modifier le profil",
     "edit-wip-limit": "Éditer la limite WIP",
-    "soft-wip-limit": "Soft WIP Limit",
+    "soft-wip-limit": "Limite Soft WIP",
     "editCardStartDatePopup-title": "Modifier la date de début",
     "editCardDueDatePopup-title": "Modifier la date d'échéance",
     "editLabelPopup-title": "Modifier l'étiquette",
@@ -404,5 +404,8 @@
     "yes": "Oui",
     "no": "Non",
     "accounts": "Comptes",
-    "accounts-allowEmailChange": "Autoriser le changement d'adresse mail"
+    "accounts-allowEmailChange": "Autoriser le changement d'adresse mail",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/gl.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 5 - 2
i18n/he.i18n.json

@@ -172,7 +172,7 @@
     "edit-avatar": "החלפת תמונת משתמש",
     "edit-profile": "עריכת פרופיל",
     "edit-wip-limit": "עריכת מגבלת „בעבודה”",
-    "soft-wip-limit": "Soft WIP Limit",
+    "soft-wip-limit": "מגבלת „בעבודה” רכה",
     "editCardStartDatePopup-title": "שינוי מועד התחלה",
     "editCardDueDatePopup-title": "שינוי מועד סיום",
     "editLabelPopup-title": "שינוי תווית",
@@ -404,5 +404,8 @@
     "yes": "כן",
     "no": "לא",
     "accounts": "חשבונות",
-    "accounts-allowEmailChange": "אפשר שינוי דוא\"ל"
+    "accounts-allowEmailChange": "אפשר שינוי דוא\"ל",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 293 - 290
i18n/hu.i18n.json

@@ -1,264 +1,264 @@
 {
-    "accept": "Elfogad",
+    "accept": "Elfogadás",
     "act-activity-notify": "[Wekan] Tevékenység értesítés",
-    "act-addAttachment": "attached __attachment__ to __card__",
-    "act-addChecklist": "added checklist __checklist__ to __card__",
-    "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
-    "act-addComment": "commented on __card__: __comment__",
-    "act-createBoard": "created __board__",
-    "act-createCard": "added __card__ to __list__",
-    "act-createList": "added __list__ to __board__",
-    "act-addBoardMember": "added __member__ to __board__",
-    "act-archivedBoard": "archived __board__",
-    "act-archivedCard": "archived __card__",
-    "act-archivedList": "archived __list__",
-    "act-importBoard": "imported __board__",
-    "act-importCard": "imported __card__",
-    "act-importList": "imported __list__",
-    "act-joinMember": "added __member__ to __card__",
-    "act-moveCard": "moved __card__ from __oldList__ to __list__",
-    "act-removeBoardMember": "removed __member__ from __board__",
-    "act-restoredCard": "restored __card__ to __board__",
-    "act-unjoinMember": "removed __member__ from __card__",
+    "act-addAttachment": "__attachment__ mellékletet csatolt a kártyához: __card__",
+    "act-addChecklist": "__checklist__ ellenőrzőlistát adott hozzá a kártyához: __card__",
+    "act-addChecklistItem": "__checklistItem__ elemet adott hozzá a(z) __checklist__ ellenőrzőlistához ezen a kártyán: __card__",
+    "act-addComment": "hozzászólt a(z) __card__ kártyán: __comment__",
+    "act-createBoard": "létrehozta a táblát: __board__",
+    "act-createCard": "__card__ kártyát adott hozzá a listához: __list__",
+    "act-createList": "__list__ listát adott hozzá a táblához: __board__",
+    "act-addBoardMember": "__member__ tagot hozzáadta a táblához: __board__",
+    "act-archivedBoard": "archiválta a táblát: __board__",
+    "act-archivedCard": "archiválta a kártyát: __card__",
+    "act-archivedList": "archiválta a listát: __list__",
+    "act-importBoard": "importálta a táblát: __board__",
+    "act-importCard": "importálta a kártyát: __card__",
+    "act-importList": "importálta a listát: __list__",
+    "act-joinMember": "__member__ tagot hozzáadta a kártyához: __card__",
+    "act-moveCard": "áthelyezte a(z) __card__ kártyát: __oldList__ → __list__",
+    "act-removeBoardMember": "eltávolította __member__ tagot a tábláról: __board__",
+    "act-restoredCard": "visszaállította a(z) __card__ kártyát ide: __board__",
+    "act-unjoinMember": "eltávolította __member__ tagot a kártyáról: __card__",
     "act-withBoardTitle": "[Wekan] __board__",
     "act-withCardTitle": "[__board__] __card__",
     "actions": "Műveletek",
     "activities": "Tevékenységek",
     "activity": "Tevékenység",
-    "activity-added": "added %s to %s",
-    "activity-archived": "archiválva %s",
-    "activity-attached": "attached %s to %s",
-    "activity-created": "létrehozva %s",
-    "activity-excluded": "excluded %s from %s",
-    "activity-imported": "imported %s into %s from %s",
-    "activity-imported-board": "imported %s from %s",
+    "activity-added": "%s hozzáadva ehhez: %s",
+    "activity-archived": "%s archiválva",
+    "activity-attached": "%s mellékletet csatolt a kártyához: %s",
+    "activity-created": "%s létrehozva",
+    "activity-excluded": "%s kizárva innen: %s",
+    "activity-imported": "%s importálva ebbe: %s, innen: %s",
+    "activity-imported-board": "%s importálva innen: %s",
     "activity-joined": "%s csatlakozott",
-    "activity-moved": "moved %s from %s to %s",
-    "activity-on": "on %s",
-    "activity-removed": "removed %s from %s",
-    "activity-sent": "sent %s to %s",
+    "activity-moved": "%s áthelyezve: %s → %s",
+    "activity-on": "ekkor: %s",
+    "activity-removed": "%s eltávolítva innen: %s",
+    "activity-sent": "%s elküldve ide: %s",
     "activity-unjoined": "%s kilépett a csoportból",
-    "activity-checklist-added": "added checklist to %s",
-    "activity-checklist-item-added": "added checklist item to '%s' in %s",
-    "add": "Hozzáad",
-    "add-attachment": "Add Attachment",
-    "add-board": "Add Board",
-    "add-card": "Add Card",
-    "add-checklist": "Add Checklist",
-    "add-checklist-item": "Elem hozzáadása a feladatlistához",
-    "add-cover": "Új borító",
-    "add-label": "Add Label",
-    "add-list": "Add List",
+    "activity-checklist-added": "ellenőrzőlista hozzáadva ehhez: %s",
+    "activity-checklist-item-added": "ellenőrzőlista elem hozzáadva ehhez: „%s”, ebben: %s",
+    "add": "Hozzáadás",
+    "add-attachment": "Melléklet hozzáadása",
+    "add-board": "Tábla hozzáadása",
+    "add-card": "Kártya hozzáadása",
+    "add-checklist": "Ellenőrzőlista hozzáadása",
+    "add-checklist-item": "Elem hozzáadása az ellenőrzőlistához",
+    "add-cover": "Borító hozzáadása",
+    "add-label": "Címke hozzáadása",
+    "add-list": "Lista hozzáadása",
     "add-members": "Tagok hozzáadása",
     "added": "Hozzáadva",
     "addMemberPopup-title": "Tagok",
     "admin": "Adminisztrátor",
-    "admin-desc": "Lehet szerkeszteni a lapot, tagokat távolíthat el, és és a fórumon-beállításainak módosítása.",
-    "admin-announcement": "Announcement",
-    "admin-announcement-active": "Active System-Wide Announcement",
-    "admin-announcement-title": "Announcement from Administrator",
+    "admin-desc": "Megtekintheti és szerkesztheti a kártyákat, eltávolíthat tagokat, valamint megváltoztathatja a tábla beállításait.",
+    "admin-announcement": "Bejelentés",
+    "admin-announcement-active": "Bekapcsolt rendszerszintű bejelentés",
+    "admin-announcement-title": "Bejelentés az adminisztrátortól",
     "all-boards": "Összes tábla",
-    "and-n-other-card": "And __count__ other card",
-    "and-n-other-card_plural": "And __count__ other cards",
+    "and-n-other-card": "És __count__ egyéb kártya",
+    "and-n-other-card_plural": "És __count__ egyéb kártya",
     "apply": "Alkalmaz",
-    "app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
-    "archive": "Archív",
-    "archive-all": "Összes archivált",
-    "archive-board": "Archívált tábla",
-    "archive-card": "Archívált kártya",
-    "archive-list": "Archive List",
-    "archive-selection": "Archiváld a megjelölteket",
-    "archiveBoardPopup-title": "Archiváljuk a táblát?",
+    "app-is-offline": "A Wekan betöltés alatt van, kérem várjon. Az oldal újratöltése adatvesztést okoz. Ha a Wekan nem töltődik be, akkor ellenőrizze, hogy a Wekan kiszolgáló nem állt-e le.",
+    "archive": "Archiválás",
+    "archive-all": "Összes archiválása",
+    "archive-board": "Tábla archiválása",
+    "archive-card": "Kártya archiválása",
+    "archive-list": "Lista archiválása",
+    "archive-selection": "Kijelölés archiválása",
+    "archiveBoardPopup-title": "Archiválja a táblát?",
     "archived-items": "Archivált elemek",
-    "archived-boards": "Archived Boards",
-    "restore-board": "Restore Board",
-    "no-archived-boards": "No Archived Boards.",
+    "archived-boards": "Archivált táblák",
+    "restore-board": "Tábla visszaállítása",
+    "no-archived-boards": "Nincsenek archivált táblák.",
     "archives": "Archívumok",
     "assign-member": "Tag hozzárendelése",
     "attached": "csatolva",
-    "attachment": "Csatolmány",
-    "attachment-delete-pop": "A csatolmány törlése végeleges. Nincs visszaállítás.",
-    "attachmentDeletePopup-title": "Törli a csatolmányt?",
-    "attachments": "Csatolmányok",
-    "auto-watch": "Automatically watch boards when they are created",
-    "avatar-too-big": "The avatar is too large (70KB max)",
+    "attachment": "Melléklet",
+    "attachment-delete-pop": "A melléklet törlése végeleges. Nincs visszaállítás.",
+    "attachmentDeletePopup-title": "Törli a mellékletet?",
+    "attachments": "Mellékletek",
+    "auto-watch": "Táblák automatikus megtekintése, amikor létrejönnek",
+    "avatar-too-big": "Az avatár túl nagy (legfeljebb 70 KB)",
     "back": "Vissza",
-    "board-change-color": "Szín módosítása",
-    "board-nb-stars": "%s stars",
+    "board-change-color": "Szín megváltoztatása",
+    "board-nb-stars": "%s csillag",
     "board-not-found": "A tábla nem található",
-    "board-private-info": "Eza tábla legyen <strong>privát</strong>.",
-    "board-public-info": "Ez a tábla legyen <strong>publikus</strong>.",
-    "boardChangeColorPopup-title": "A tábla háttérszínének módosítása",
+    "board-private-info": "Ez a tábla legyen <strong>személyes</strong>.",
+    "board-public-info": "Ez a tábla legyen <strong>nyilvános</strong>.",
+    "boardChangeColorPopup-title": "Tábla hátterének megváltoztatása",
     "boardChangeTitlePopup-title": "Tábla átnevezése",
-    "boardChangeVisibilityPopup-title": "Láthatóság módosítása",
-    "boardChangeWatchPopup-title": "Óra módosítása",
+    "boardChangeVisibilityPopup-title": "Láthatóság megváltoztatása",
+    "boardChangeWatchPopup-title": "Megfigyelés megváltoztatása",
     "boardMenuPopup-title": "Tábla menü",
     "boards": "Táblák",
-    "bucket-example": "Like “Bucket List” for example",
-    "cancel": "Mégsem",
-    "card-archived": "Ez a kártya archivált.",
+    "bucket-example": "Mint például „Bakancslista”",
+    "cancel": "Mégse",
+    "card-archived": "Ez a kártya archiválva van.",
     "card-comments-title": "Ez a kártya %s hozzászólást tartalmaz.",
-    "card-delete-notice": "A törlés végleges. Az összes eseményt elveszíti ami ehhez a kártyához tartozik.",
-    "card-delete-pop": "Minden esemény eltávolításra kerül a tevékenység listájából és többé nem lehet újra nyitni ezt a kártyát. Nincs visszaállítási lehetőség.",
-    "card-delete-suggest-archive": "Archiválhatod a kártyákat hogy eltávolítsd a tábláról és és megőrizheted az eseményt.",
-    "card-due": "Eddig",
-    "card-due-on": "Ebben az időpontban",
-    "card-edit-attachments": "Csatolmányok szerkesztése",
-    "card-edit-labels": "Cimkék szerkesztése",
+    "card-delete-notice": "A törlés végleges. Az összes műveletet elveszíti, amely ehhez a kártyához tartozik.",
+    "card-delete-pop": "Az összes művelet el lesz távolítva a tevékenységlistából, és nem lesz képes többé újra megnyitni a kártyát. Nincs visszaállítási lehetőség.",
+    "card-delete-suggest-archive": "Archiválhat egy kártyát, hogy eltávolítsa a tábláról, és megőrizze a tevékenységet.",
+    "card-due": "Esedékes",
+    "card-due-on": "Esedékes ekkor",
+    "card-edit-attachments": "Mellékletek szerkesztése",
+    "card-edit-labels": "Címkék szerkesztése",
     "card-edit-members": "Tagok szerkesztése",
-    "card-labels-title": "A kártya cimkéjének módosítása",
-    "card-members-title": "Adj hozzá vagy távolítsd el a tagokat a táblákról és a kártyáról",
-    "card-start": "Start",
-    "card-start-on": "Kezdődik",
+    "card-labels-title": "A kártya címkéinek megváltoztatása.",
+    "card-members-title": "A tábla tagjainak hozzáadása vagy eltávolítása a kártyáról.",
+    "card-start": "Kezdés",
+    "card-start-on": "Kezdés ekkor",
     "cardAttachmentsPopup-title": "Innen csatolva",
-    "cardDeletePopup-title": "Kártya törlése?",
-    "cardDetailsActionsPopup-title": "Kártya események",
-    "cardLabelsPopup-title": "Cimkék",
+    "cardDeletePopup-title": "Törli a kártyát?",
+    "cardDetailsActionsPopup-title": "Kártyaműveletek",
+    "cardLabelsPopup-title": "Címkék",
     "cardMembersPopup-title": "Tagok",
     "cardMorePopup-title": "Több",
     "cards": "Kártyák",
-    "change": "Módosít",
-    "change-avatar": "Avatar módosítása",
-    "change-password": "Jelszó módosítása",
-    "change-permissions": "Hozzáférések módosítása",
-    "change-settings": "Beállítások módosítása",
-    "changeAvatarPopup-title": "Avatar módosítása",
-    "changeLanguagePopup-title": "Nyelv módosítása",
-    "changePasswordPopup-title": "Change Password",
-    "changePermissionsPopup-title": "Hozzáférések módosítása",
-    "changeSettingsPopup-title": "Beállítások módosítása",
-    "checklists": "Ellenőrzőlista ",
-    "click-to-star": "Kattints a csillagra és add a kiemeltekhez ezt a táblát.",
-    "click-to-unstar": "Kattints a csillagra hogy eltávolítsd a kiemeltek közül.",
-    "clipboard": "Vágólap vagy húzd és dobd",
-    "close": "Bezár",
+    "change": "Változtatás",
+    "change-avatar": "Avatár megváltoztatása",
+    "change-password": "Jelszó megváltoztatása",
+    "change-permissions": "Jogosultságok megváltoztatása",
+    "change-settings": "Beállítások megváltoztatása",
+    "changeAvatarPopup-title": "Avatár megváltoztatása",
+    "changeLanguagePopup-title": "Nyelv megváltoztatása",
+    "changePasswordPopup-title": "Jelszó megváltoztatása",
+    "changePermissionsPopup-title": "Jogosultságok megváltoztatása",
+    "changeSettingsPopup-title": "Beállítások megváltoztatása",
+    "checklists": "Ellenőrzőlisták",
+    "click-to-star": "Kattintson a tábla csillagozásához.",
+    "click-to-unstar": "Kattintson a tábla csillagának eltávolításához.",
+    "clipboard": "Vágólap vagy fogd és vidd",
+    "close": "Bezárás",
     "close-board": "Tábla bezárása",
-    "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.",
+    "close-board-pop": "Lehetősége lesz visszaállítani a táblát a kezdőlap fejlécében lévő „Archívumok” gombra kattintva.",
     "color-black": "fekete",
     "color-blue": "kék",
     "color-green": "zöld",
-    "color-lime": "lime",
+    "color-lime": "citrus",
     "color-orange": "narancssárga",
     "color-pink": "rózsaszín",
     "color-purple": "lila",
     "color-red": "piros",
-    "color-sky": "világos kék",
+    "color-sky": "égszínkék",
     "color-yellow": "sárga",
     "comment": "Megjegyzés",
-    "comment-placeholder": "Write Comment",
-    "comment-only": "Comment only",
-    "comment-only-desc": "Can comment on cards only.",
+    "comment-placeholder": "Megjegyzés írása",
+    "comment-only": "Csak megjegyzés",
+    "comment-only-desc": "Csak megjegyzést írhat a kártyákhoz.",
     "computer": "Számítógép",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
-    "copy-card-link-to-clipboard": "Copy card link to clipboard",
-    "copyCardPopup-title": "Copy Card",
-    "create": "Létrehoz",
-    "createBoardPopup-title": "Új tábla",
-    "chooseBoardSourcePopup-title": "Import board",
-    "createLabelPopup-title": "Új cimke",
-    "current": "aktuális",
+    "confirm-checklist-delete-dialog": "Biztosan törölni szeretné az ellenőrzőlistát?",
+    "copy-card-link-to-clipboard": "Kártya hivatkozásának másolása a vágólapra",
+    "copyCardPopup-title": "Kártya másolása",
+    "create": "Létrehozás",
+    "createBoardPopup-title": "Tábla létrehozása",
+    "chooseBoardSourcePopup-title": "Tábla importálása",
+    "createLabelPopup-title": "Címke létrehozása",
+    "current": "jelenlegi",
     "date": "Dátum",
-    "decline": "Elutasít",
-    "default-avatar": "Alapértelmezett avatar",
-    "delete": "Töröl",
-    "deleteLabelPopup-title": "Cimke törlése?",
+    "decline": "Elutasítás",
+    "default-avatar": "Alapértelmezett avatár",
+    "delete": "Törlés",
+    "deleteLabelPopup-title": "Törli a címkét?",
     "description": "Leírás",
-    "disambiguateMultiLabelPopup-title": "Cimke értelmező esemény",
-    "disambiguateMultiMemberPopup-title": "Tag értelmező esemény",
-    "discard": "Elutasít",
+    "disambiguateMultiLabelPopup-title": "Címkeművelet egyértelműsítése",
+    "disambiguateMultiMemberPopup-title": "Tagművelet egyértelműsítése",
+    "discard": "Eldobás",
     "done": "Kész",
     "download": "Letöltés",
-    "edit": "Szerkeszt",
-    "edit-avatar": "Avatar módosítása",
+    "edit": "Szerkesztés",
+    "edit-avatar": "Avatár megváltoztatása",
     "edit-profile": "Profil szerkesztése",
-    "edit-wip-limit": "Edit WIP Limit",
-    "soft-wip-limit": "Soft WIP Limit",
-    "editCardStartDatePopup-title": "Kezdő dátum módosítása",
-    "editCardDueDatePopup-title": "Lejárati dátum módosítása",
-    "editLabelPopup-title": "Cimke módosítása",
+    "edit-wip-limit": "WIP korlát szerkesztése",
+    "soft-wip-limit": "Gyenge WIP korlát",
+    "editCardStartDatePopup-title": "Kezdődátum megváltoztatása",
+    "editCardDueDatePopup-title": "Esedékesség dátumának megváltoztatása",
+    "editLabelPopup-title": "Címke megváltoztatása",
     "editNotificationPopup-title": "Értesítés szerkesztése",
-    "editProfilePopup-title": "Edit Profile",
-    "email": "Email",
-    "email-enrollAccount-subject": "A fiókodat létrehozták a __siteName__ oldalon",
-    "email-enrollAccount-text": "Üdvözöljük __user__,\n\nA rendszer használatának megkezdéséhez Egyszerűen kattintson az alábbi linkre.\n\n__url__\n\nKöszönjük.",
-    "email-fail": "Email küldése sikertelen",
-    "email-invalid": "Nem megfelelő email cím",
-    "email-invite": "Meghívás Emailben",
-    "email-invite-subject": "__inviter__ küldött neked egy meghívót",
-    "email-invite-text": "Üdvözöljük __user__,\n\n__inviter__ meghívott téged közreműködésre az alábbi táblába \"__board__\".\n\nKérjük kattints az alábbi linkre:\n\n__url__\n\nKöszönjük.",
-    "email-resetPassword-subject": "Jelszó visszaállítása a __siteName__ oldalon",
-    "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.",
-    "email-sent": "Email elküldve",
-    "email-verifyEmail-subject": "Igazold vissza az email címedet a __siteName__ oldalon",
-    "email-verifyEmail-text": "Üdvözöljük __user__,\n\nAz Email címe ellenőrzéséhez kérjük kattintson az alábbi linkre.\n\n__url__\n\nKöszönjük.",
-    "enable-wip-limit": "Enable WIP Limit",
+    "editProfilePopup-title": "Profil szerkesztése",
+    "email": "E-mail",
+    "email-enrollAccount-subject": "Létrejött a profilja a következő oldalon: __siteName__",
+    "email-enrollAccount-text": "Kedves __user__!\n\nA szolgáltatás használatának megkezdéséhez egyszerűen kattintson a lenti hivatkozásra.\n\n__url__\n\nKöszönjük.",
+    "email-fail": "Az e-mail küldése nem sikerült",
+    "email-invalid": "Érvénytelen e-mail",
+    "email-invite": "Meghívás e-mailben",
+    "email-invite-subject": "__inviter__ egy meghívást küldött Önnek",
+    "email-invite-text": "Kedves __user__!\n\n__inviter__ meghívta Önt, hogy csatlakozzon a(z) „__board__” táblán történő együttműködéshez.\n\nKattintson az alábbi hivatkozásra:\n\n__url__\n\nKöszönjük.",
+    "email-resetPassword-subject": "Jelszó visszaállítása ezen az oldalon: __siteName__",
+    "email-resetPassword-text": "Kedves __user__!\n\nA jelszava visszaállításához egyszerűen kattintson a lenti hivatkozásra.\n\n__url__\n\nKöszönjük.",
+    "email-sent": "E-mail elküldve",
+    "email-verifyEmail-subject": "Igazolja vissza az e-mail címét a következő oldalon: __siteName__",
+    "email-verifyEmail-text": "Kedves __user__!\n\nAz e-mail fiókjának visszaigazolásához egyszerűen kattintson a lenti hivatkozásra.\n\n__url__\n\nKöszönjük.",
+    "enable-wip-limit": "WIP korlát engedélyezése",
     "error-board-doesNotExist": "Ez a tábla nem létezik",
-    "error-board-notAdmin": "Adminisztrátor joggal kell rendelkezned hogy megtehesd ezen a táblán",
-    "error-board-notAMember": "Az tábla tagjának kell lenned, hogy megtehesd",
-    "error-json-malformed": "Your text is not valid JSON",
-    "error-json-schema": "Your JSON data does not include the proper information in the correct format",
+    "error-board-notAdmin": "A tábla adminisztrátorának kell lennie, hogy ezt megtehesse",
+    "error-board-notAMember": "A tábla tagjának kell lennie, hogy ezt megtehesse",
+    "error-json-malformed": "A szöveg nem érvényes JSON",
+    "error-json-schema": "A JSON adatok nem a helyes formátumban tartalmazzák a megfelelő információkat",
     "error-list-doesNotExist": "Ez a lista nem létezik",
     "error-user-doesNotExist": "Ez a felhasználó nem létezik",
-    "error-user-notAllowSelf": "You can not invite yourself",
-    "error-user-notCreated": "Ez a felhasználó nem jött létre",
+    "error-user-notAllowSelf": "Nem hívhatja meg saját magát",
+    "error-user-notCreated": "Ez a felhasználó nincs létrehozva",
     "error-username-taken": "Ez a felhasználónév már foglalt",
-    "error-email-taken": "Email has already been taken",
+    "error-email-taken": "Az e-mail már foglalt",
     "export-board": "Tábla exportálása",
     "filter": "Szűrő",
     "filter-cards": "Kártyák szűrése",
-    "filter-clear": "Szürő törlése",
-    "filter-no-label": "Nincs cimke",
-    "filter-no-member": "Nincsenek tagok",
+    "filter-clear": "Szűrő törlése",
+    "filter-no-label": "Nincs címke",
+    "filter-no-member": "Nincs tag",
     "filter-on": "Szűrő bekapcsolva",
-    "filter-on-desc": "Éppen kártyákat szűrsz ezen a táblán. Kattints ide a szűrő szerkesztéséhez.",
-    "filter-to-selection": "Szűrő beállítása a kijelölés szerint",
+    "filter-on-desc": "A kártyaszűrés be van kapcsolva ezen a táblán. Kattintson ide a szűrő szerkesztéséhez.",
+    "filter-to-selection": "Szűrés a kijelöléshez",
     "fullname": "Teljes név",
-    "header-logo-title": "Vissza a táblák oldaladra.",
+    "header-logo-title": "Vissza a táblák oldalára.",
     "hide-system-messages": "Rendszerüzenetek elrejtése",
-    "headerBarCreateBoardPopup-title": "Új tábla",
+    "headerBarCreateBoardPopup-title": "Tábla létrehozása",
     "home": "Kezdőlap",
     "import": "Importálás",
-    "import-board": "import board",
-    "import-board-c": "Import board",
-    "import-board-title-trello": "Tábla importálása a Trello-ról",
-    "import-board-title-wekan": "Import board from Wekan",
-    "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
-    "from-trello": "From Trello",
-    "from-wekan": "From Wekan",
-    "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
-    "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
-    "import-json-placeholder": "Paste your valid JSON data here",
-    "import-map-members": "Tagok megjelenítése",
-    "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users",
-    "import-show-user-mapping": "Review members mapping",
-    "import-user-select": "Pick the Wekan user you want to use as this member",
-    "importMapMembersAddPopup-title": "Select Wekan member",
-    "info": "Version",
+    "import-board": "tábla importálása",
+    "import-board-c": "Tábla importálása",
+    "import-board-title-trello": "Tábla importálása a Trello oldalról",
+    "import-board-title-wekan": "Tábla importálása a Wekan oldalról",
+    "import-sandstorm-warning": "Az importált tábla törölni fogja a táblán lévő összes meglévő adatot, és kicseréli az importált táblával.",
+    "from-trello": "A Trello oldalról",
+    "from-wekan": "A Wekan oldalról",
+    "import-board-instruction-trello": "A Trello tábláján menjen a „Menü”, majd a „Több”, „Nyomtatás és exportálás”, „JSON exportálása” menüpontokra, és másolja ki az eredményül kapott szöveget.",
+    "import-board-instruction-wekan": "A Wekan tábláján menjen a „Menü”, majd a „Tábla exportálás” menüpontra, és másolja ki a letöltött fájlban lévő szöveget.",
+    "import-json-placeholder": "Illessze be ide az érvényes JSON adatokat",
+    "import-map-members": "Tagok leképezése",
+    "import-members-map": "Az importált táblának van néhány tagja. Képezze le a tagokat, akiket importálni szeretne a Wekan felhasználókba.",
+    "import-show-user-mapping": "Tagok leképezésének vizsgálata",
+    "import-user-select": "Válassza ki a Wekan felhasználót, akit ezen tagként használni szeretne",
+    "importMapMembersAddPopup-title": "Wekan tag kiválasztása",
+    "info": "Verzió",
     "initials": "Kezdőbetűk",
-    "invalid-date": "Hibás dátum",
-    "joined": "becsatlakozott",
-    "just-invited": "Éppen most hívtak meg erre a táblára",
+    "invalid-date": "Érvénytelen dátum",
+    "joined": "csatlakozott",
+    "just-invited": "Éppen most hívták meg erre a táblára",
     "keyboard-shortcuts": "Gyorsbillentyűk",
-    "label-create": "Új cimke",
-    "label-default": "%s cimke (alapértelmezett)",
-    "label-delete-pop": "Nincsen visszaállítás. Ez el fogja távolítani ezt a cimkét az összes kártyáról és törli az előzményeket.",
-    "labels": "Cimkék",
+    "label-create": "Címke létrehozása",
+    "label-default": "%s címke (alapértelmezett)",
+    "label-delete-pop": "Nincs visszavonás. Ez el fogja távolítani ezt a címkét az összes kártyáról, és törli az előzményeit.",
+    "labels": "Címkék",
     "language": "Nyelv",
-    "last-admin-desc": "You can’t change roles because there must be at least one admin.",
+    "last-admin-desc": "Nem változtathatja meg a szerepeket, mert legalább egy adminisztrátora szükség van.",
     "leave-board": "Tábla elhagyása",
-    "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
-    "leaveBoardPopup-title": "Leave Board ?",
-    "link-card": "Kapcsolja ehhez a kártyához",
-    "list-archive-cards": "Archiváld az összes kártyát ezen a listán.",
-    "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.",
-    "list-move-cards": "Move all cards in this list",
-    "list-select-cards": "Válaszd ki az összes kártyát ezen a listán",
-    "listActionPopup-title": "Események megjelenítése",
+    "leave-board-pop": "Biztosan el szeretné hagyni ezt a táblát: __boardTitle__? El lesz távolítva a táblán lévő összes kártyáról.",
+    "leaveBoardPopup-title": "Elhagyja a táblát?",
+    "link-card": "Összekapcsolás ezzel a kártyával",
+    "list-archive-cards": "Az összes kártya archiválása ezen a listán",
+    "list-archive-cards-pop": "Ez el fogja távolítani a listán lévő összes kártyát a tábláról. Az archivált kártyák megtekintéséhez, és azok visszahozásához a táblára, kattintson a „Menü” → „Archivált elemek” menüpontra.",
+    "list-move-cards": "A listán lévő összes kártya áthelyezése",
+    "list-select-cards": "A listán lévő összes kártya kiválasztása",
+    "listActionPopup-title": "Műveletek felsorolása",
     "listImportCardPopup-title": "Trello kártya importálása",
     "listMorePopup-title": "Több",
-    "link-list": "Link to this list",
-    "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
-    "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+    "link-list": "Összekapcsolás ezzel a listával",
+    "list-delete-pop": "Az összes művelet el lesz távolítva a tevékenységlistából, és nem lesz lehetősége visszaállítani a listát. Nincs visszavonás.",
+    "list-delete-suggest-archive": "Archiválhat egy listát, hogy eltávolítsa a tábláról, és megőrizze a tevékenységet.",
     "lists": "Listák",
     "log-out": "Kijelentkezés",
     "log-in": "Bejelentkezés",
@@ -266,73 +266,73 @@
     "memberMenuPopup-title": "Tagok beállításai",
     "members": "Tagok",
     "menu": "Menü",
-    "move-selection": "Kijelöltek mozgatása",
-    "moveCardPopup-title": "Kártya mozgatása",
-    "moveCardToBottom-title": "Mozgatás az aljára",
-    "moveCardToTop-title": "Mozgatás a tetejére",
-    "moveSelectionPopup-title": "Kijelöltek mozgatása",
-    "multi-selection": "Kijelöltek mozgatása",
+    "move-selection": "Kijelölés áthelyezése",
+    "moveCardPopup-title": "Kártya áthelyezése",
+    "moveCardToBottom-title": "Áthelyezés az aljára",
+    "moveCardToTop-title": "Áthelyezés a tetejére",
+    "moveSelectionPopup-title": "Kijelölés áthelyezése",
+    "multi-selection": "Többszörös kijelölés",
     "multi-selection-on": "Többszörös kijelölés bekapcsolva",
-    "muted": "Elnémítva",
-    "muted-info": "Soha nem leszel értesítve ennek a táblának a módosításairól.",
+    "muted": "Némítva",
+    "muted-info": "Soha sem lesz értesítve a táblán lévő semmilyen változásról.",
     "my-boards": "Saját tábláim",
     "name": "Név",
     "no-archived-cards": "Nincsenek archivált kártyák.",
     "no-archived-lists": "Nincsenek archivált listák.",
-    "no-results": "Nincs eredmény",
+    "no-results": "Nincs találat",
     "normal": "Normál",
-    "normal-desc": "Megtekinthet és szerkeszthet kártyákat. Nem módosíthatja a beállításokat.",
-    "not-accepted-yet": "A meghívást még nem fogadták el",
-    "notify-participate": "Receive updates to any cards you participate as creater or member",
-    "notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
+    "normal-desc": "Megtekintheti és szerkesztheti a kártyákat. Nem változtathatja meg a beállításokat.",
+    "not-accepted-yet": "A meghívás még nincs elfogadva",
+    "notify-participate": "Frissítések fogadása bármely kártyánál, amelynél létrehozóként vagy tagként vesz részt",
+    "notify-watch": "Frissítések fogadása bármely táblánál, listánál vagy kártyánál, amelyet megtekint",
     "optional": "opcionális",
     "or": "vagy",
-    "page-maybe-private": "Ez az oldal privát. A megtekintéshez jelentkezz be itt: <a href='%s'>bejelentkezés</a>.",
+    "page-maybe-private": "Ez az oldal személyes lehet. Esetleg megtekintheti, ha <a href='%s'>bejelentkezik</a>.",
     "page-not-found": "Az oldal nem található.",
     "password": "Jelszó",
-    "paste-or-dragdrop": "illeszd be, vagy húzd ide a kép fájlt (csak képeket)",
-    "participating": "Résztvevő",
+    "paste-or-dragdrop": "illessze be, vagy fogd és vidd módon húzza ide a képfájlt (csak képeket)",
+    "participating": "Részvétel",
     "preview": "Előnézet",
     "previewAttachedImagePopup-title": "Előnézet",
     "previewClipboardImagePopup-title": "Előnézet",
-    "private": "Privát",
-    "private-desc": "Ez a tábla privát. Csak a táblához hozzáadott emberek tekinthetik meg és szerkeszthetik.",
+    "private": "Személyes",
+    "private-desc": "Ez a tábla személyes. Csak a táblához hozzáadott emberek tekinthetik meg és szerkeszthetik.",
     "profile": "Profil",
-    "public": "Publikus",
-    "public-desc": "Ez a tábla publikus. A link birtokában bárki megtekintheti és látszik a keresőkben mint a Google. Csak azok az emberek szerkeszthetik akiket hozzáadtak.",
-    "quick-access-description": "Emeled ki a táblát hogy létrehozz egy parancsikont ezen a sávon.",
+    "public": "Nyilvános",
+    "public-desc": "Ez a tábla nyilvános. A hivatkozás birtokában bárki számára látható, és megjelenik az olyan keresőmotorokban, mint például a Google. Csak a táblához hozzáadott emberek szerkeszthetik.",
+    "quick-access-description": "Csillagozzon meg egy táblát egy gyors hivatkozás hozzáadásához ebbe a sávba.",
     "remove-cover": "Borító eltávolítása",
     "remove-from-board": "Eltávolítás a tábláról",
-    "remove-label": "Remove Label",
-    "listDeletePopup-title": "Delete List ?",
+    "remove-label": "Címke eltávolítása",
+    "listDeletePopup-title": "Törli a listát?",
     "remove-member": "Tag eltávolítása",
     "remove-member-from-card": "Eltávolítás a kártyáról",
-    "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.",
+    "remove-member-pop": "Eltávolítja __name__ (__username__) felhasználót a tábláról: __boardTitle__? A tag el lesz távolítva a táblán lévő összes kártyáról. Értesítést fog kapni erről.",
     "removeMemberPopup-title": "Eltávolítja a tagot?",
-    "rename": "Átnevez",
+    "rename": "Átnevezés",
     "rename-board": "Tábla átnevezése",
-    "restore": "Visszaállít",
+    "restore": "Visszaállítás",
     "save": "Mentés",
     "search": "Keresés",
-    "select-color": "Select Color",
-    "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
-    "setWipLimitPopup-title": "Set WIP Limit",
-    "shortcut-assign-self": "Add hozzá magad az aktuális kártyához",
-    "shortcut-autocomplete-emoji": "Automatikus emoji kiegészítés",
-    "shortcut-autocomplete-members": "Automatikus tag név kiegészítés",
+    "select-color": "Szín kiválasztása",
+    "set-wip-limit-value": "Korlát beállítása a listán lévő feladatok legnagyobb számához",
+    "setWipLimitPopup-title": "WIP korlát beállítása",
+    "shortcut-assign-self": "Önmaga hozzárendelése a jelenlegi kártyához",
+    "shortcut-autocomplete-emoji": "Emodzsi automatikus kiegészítése",
+    "shortcut-autocomplete-members": "Tagok automatikus kiegészítése",
     "shortcut-clear-filters": "Összes szűrő törlése",
-    "shortcut-close-dialog": "Beszélgetés bezárása",
+    "shortcut-close-dialog": "Párbeszédablak bezárása",
     "shortcut-filter-my-cards": "Kártyáim szűrése",
-    "shortcut-show-shortcuts": "Hozd létre ezt a hivatkozási listát",
-    "shortcut-toggle-filterbar": "Szűrő oldalsáv kényszerítése",
-    "shortcut-toggle-sidebar": "Tábla oldalsáv kényszerítése",
-    "show-cards-minimum-count": "Mutasd a kártyák számát ha a lista többet tartalmaz mint",
-    "sidebar-open": "Oldalsáv megjelenítése",
-    "sidebar-close": "Oldalsáv elrejtése",
+    "shortcut-show-shortcuts": "A hivatkozási lista előre hozása",
+    "shortcut-toggle-filterbar": "Szűrő oldalsáv ki- és bekapcsolása",
+    "shortcut-toggle-sidebar": "Tábla oldalsáv ki- és bekapcsolása",
+    "show-cards-minimum-count": "Kártyaszámok megjelenítése, ha a lista többet tartalmaz mint",
+    "sidebar-open": "Oldalsáv megnyitása",
+    "sidebar-close": "Oldalsáv bezárása",
     "signupPopup-title": "Fiók létrehozása",
-    "star-board-title": "Kattints a tábla kiemeléséhez. Megjelenik a táblák lista tetején.",
-    "starred-boards": "Kiemelt táblák",
-    "starred-boards-description": "A kiemelt táblák megjelennek a táblák lista tetején.",
+    "star-board-title": "Kattintson a tábla csillagozásához. Meg fog jelenni a táblalistája tetején.",
+    "starred-boards": "Csillagozott táblák",
+    "starred-boards-description": "A csillagozott táblák megjelennek a táblalistája tetején.",
     "subscribe": "Feliratkozás",
     "team": "Csapat",
     "this-board": "ez a tábla",
@@ -340,69 +340,72 @@
     "time": "Idő",
     "title": "Cím",
     "tracking": "Követés",
-    "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
-    "unassign-member": "Tag eltávolítása",
-    "unsaved-description": "Van egy elmentetlen leírásod.",
-    "unwatch": "Figyelés leállítása",
-    "upload": "Feltölt",
-    "upload-avatar": "Tölts fel egy avatart",
-    "uploaded-avatar": "Feltöltött egy avatart",
+    "tracking-info": "Értesítve lesz az összes olyan kártya változásáról, amelyen létrehozóként vagy tagként vesz részt.",
+    "unassign-member": "Tag hozzárendelésének megszüntetése",
+    "unsaved-description": "Van egy mentetlen leírása.",
+    "unwatch": "Megfigyelés megszüntetése",
+    "upload": "Feltöltés",
+    "upload-avatar": "Egy avatár feltöltése",
+    "uploaded-avatar": "Egy avatár feltöltve",
     "username": "Felhasználónév",
     "view-it": "Megtekintés",
-    "warn-list-archived": "figyelem: ez a kártya szerepel az egyik archiv listán",
-    "watch": "Figyel",
-    "watching": "Megfigyelt",
-    "watching-info": "Értesítve leszel minden módosításról ebben a táblában.",
+    "warn-list-archived": "figyelmeztetés: ez a kártya egy archivált listán van",
+    "watch": "Megfigyelés",
+    "watching": "Megfigyelés",
+    "watching-info": "Értesítve lesz a táblán lévő összes változásról",
     "welcome-board": "Üdvözlő tábla",
     "welcome-list1": "Alapok",
     "welcome-list2": "Speciális",
-    "what-to-do": "Mit akarsz csinálni?",
-    "wipLimitErrorPopup-title": "Invalid WIP Limit",
-    "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
-    "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
-    "admin-panel": "Adminisztrációs felület",
+    "what-to-do": "Mit szeretne tenni?",
+    "wipLimitErrorPopup-title": "Érvénytelen WIP korlát",
+    "wipLimitErrorPopup-dialog-pt1": "A listán lévő feladatok száma magasabb a meghatározott WIP korlátnál.",
+    "wipLimitErrorPopup-dialog-pt2": "Helyezzen át néhány feladatot a listáról, vagy állítson be magasabb WIP korlátot.",
+    "admin-panel": "Adminisztrációs panel",
     "settings": "Beállítások",
-    "people": "Ember",
+    "people": "Emberek",
     "registration": "Regisztráció",
-    "disable-self-registration": "Egyéni regisztráció kikapcsolva",
+    "disable-self-registration": "Önregisztráció letiltása",
     "invite": "Meghívás",
     "invite-people": "Emberek meghívása",
-    "to-boards": "Táblá(k)hoz",
-    "email-addresses": "Email címek",
-    "smtp-host-description": "A levelezésed SMTP szerverének IP címe.",
-    "smtp-port-description": "Az SMTP szervered portja a kimenő levelekhez.",
-    "smtp-tls-description": "Enable TLS support for SMTP server",
+    "to-boards": "Táblákhoz",
+    "email-addresses": "E-mail címek",
+    "smtp-host-description": "Az SMTP kiszolgáló címe, amely az e-maileket kezeli.",
+    "smtp-port-description": "Az SMTP kiszolgáló által használt port a kimenő e-mailekhez.",
+    "smtp-tls-description": "TLS támogatás engedélyezése az SMTP kiszolgálónál",
     "smtp-host": "SMTP kiszolgáló",
     "smtp-port": "SMTP port",
     "smtp-username": "Felhasználónév",
     "smtp-password": "Jelszó",
-    "smtp-tls": "TLS support",
-    "send-from": "Tól",
-    "invitation-code": "Meghívó kód",
-    "email-invite-register-subject": "__inviter__ küldött neked egy meghívót",
-    "email-invite-register-text": "Kedves __user__,\n\n__inviter__ meghívott közreműködésre a Wekanba.\n\nKérlek kövesd az alábbi linket:\n__url__\n\nA meghívókódod: __icode__\n\nKöszönjük.",
-    "error-invitation-code-not-exist": "A meghívó kódja nem érvényes",
-    "error-notAuthorized": "You are not authorized to view this page.",
-    "outgoing-webhooks": "Outgoing Webhooks",
-    "outgoingWebhooksPopup-title": "Outgoing Webhooks",
-    "new-outgoing-webhook": "New Outgoing Webhook",
-    "no-name": "(Unknown)",
-    "Wekan_version": "Wekan version",
-    "Node_version": "Node version",
-    "OS_Arch": "OS Arch",
-    "OS_Cpus": "OS CPU Count",
-    "OS_Freemem": "OS Free Memory",
-    "OS_Loadavg": "OS Load Average",
-    "OS_Platform": "OS Platform",
-    "OS_Release": "OS Release",
-    "OS_Totalmem": "OS Total Memory",
-    "OS_Type": "OS Type",
-    "OS_Uptime": "OS Uptime",
-    "hours": "hours",
-    "minutes": "minutes",
-    "seconds": "seconds",
-    "yes": "Yes",
-    "no": "No",
-    "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "smtp-tls": "TLS támogatás",
+    "send-from": "Feladó",
+    "invitation-code": "Meghívási kód",
+    "email-invite-register-subject": "__inviter__ egy meghívás küldött Önnek",
+    "email-invite-register-text": "Kedves __user__!\n\n__inviter__ meghívta Önt közreműködésre a Wekan oldalra.\n\nKövesse a lenti hivatkozást:\n__url__\n\nÉs a meghívási kódja: __icode__\n\nKöszönjük.",
+    "error-invitation-code-not-exist": "A meghívási kód nem létezik",
+    "error-notAuthorized": "Nincs jogosultsága az oldal megtekintéséhez.",
+    "outgoing-webhooks": "Kimenő webhurkok",
+    "outgoingWebhooksPopup-title": "Kimenő webhurkok",
+    "new-outgoing-webhook": "Új kimenő webhurok",
+    "no-name": "(Ismeretlen)",
+    "Wekan_version": "Wekan verzió",
+    "Node_version": "Node verzió",
+    "OS_Arch": "Operációs rendszer architektúrája",
+    "OS_Cpus": "Operációs rendszer CPU száma",
+    "OS_Freemem": "Operációs rendszer szabad memóriája",
+    "OS_Loadavg": "Operációs rendszer átlagos terhelése",
+    "OS_Platform": "Operációs rendszer platformja",
+    "OS_Release": "Operációs rendszer kiadása",
+    "OS_Totalmem": "Operációs rendszer összes memóriája",
+    "OS_Type": "Operációs rendszer típusa",
+    "OS_Uptime": "Operációs rendszer üzemideje",
+    "hours": "óra",
+    "minutes": "perc",
+    "seconds": "másodperc",
+    "yes": "Igen",
+    "no": "Nem",
+    "accounts": "Fiókok",
+    "accounts-allowEmailChange": "E-mail megváltoztatásának engedélyezése",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/id.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 5 - 2
i18n/it.i18n.json

@@ -172,7 +172,7 @@
     "edit-avatar": "Cambia avatar",
     "edit-profile": "Modifica profilo",
     "edit-wip-limit": "Modifica limite di work in progress",
-    "soft-wip-limit": "Soft WIP Limit",
+    "soft-wip-limit": "Limite Work in progress soft",
     "editCardStartDatePopup-title": "Cambia data di inizio",
     "editCardDueDatePopup-title": "Cambia data di scadenza",
     "editLabelPopup-title": "Cambia etichetta",
@@ -404,5 +404,8 @@
     "yes": "Sì",
     "no": "No",
     "accounts": "Profili",
-    "accounts-allowEmailChange": "Permetti modifica dell'email"
+    "accounts-allowEmailChange": "Permetti modifica dell'email",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/ja.i18n.json

@@ -404,5 +404,8 @@
     "yes": "はい",
     "no": "いいえ",
     "accounts": "アカウント",
-    "accounts-allowEmailChange": "メールアドレスの変更を許可"
+    "accounts-allowEmailChange": "メールアドレスの変更を許可",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/ko.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/nb.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/nl.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Ja",
     "no": "Nee",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Sta E-mailadres wijzigingen toe"
+    "accounts-allowEmailChange": "Sta E-mailadres wijzigingen toe",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/pl.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Tak",
     "no": "Nie",
     "accounts": "Konto",
-    "accounts-allowEmailChange": "Zezwól na zmianę adresu email"
+    "accounts-allowEmailChange": "Zezwól na zmianę adresu email",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/pt-BR.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Sim",
     "no": "Não",
     "accounts": "Contas",
-    "accounts-allowEmailChange": "Permitir Mudança de Email"
+    "accounts-allowEmailChange": "Permitir Mudança de Email",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/ro.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/ru.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/sr.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 17 - 14
i18n/sv.i18n.json

@@ -54,9 +54,9 @@
     "addMemberPopup-title": "Medlemmar",
     "admin": "Adminstratör",
     "admin-desc": "Kan visa och redigera kort, ta bort medlemmar och ändra inställningarna för anslagstavlan.",
-    "admin-announcement": "Announcement",
-    "admin-announcement-active": "Active System-Wide Announcement",
-    "admin-announcement-title": "Announcement from Administrator",
+    "admin-announcement": "Meddelande",
+    "admin-announcement-active": "Aktivt system-brett meddelande",
+    "admin-announcement-title": "Meddelande från administratör",
     "all-boards": "Alla anslagstavlor",
     "and-n-other-card": "Och __count__ annat kort",
     "and-n-other-card_plural": "Och __count__ andra kort",
@@ -171,8 +171,8 @@
     "edit": "Redigera",
     "edit-avatar": "Ändra avatar",
     "edit-profile": "Redigera profil",
-    "edit-wip-limit": "Edit WIP Limit",
-    "soft-wip-limit": "Soft WIP Limit",
+    "edit-wip-limit": "Redigera WIP-gränsen",
+    "soft-wip-limit": "Mjuk WIP-gräns",
     "editCardStartDatePopup-title": "Ändra startdatum",
     "editCardDueDatePopup-title": "Ändra förfallodatum",
     "editLabelPopup-title": "Ändra etikett",
@@ -191,7 +191,7 @@
     "email-sent": "E-post skickad",
     "email-verifyEmail-subject": "Verifiera din e-post adress på __siteName__",
     "email-verifyEmail-text": "Hej __user__,\n\nFör att verifiera din konto e-post, klicka på länken nedan.\n\n__url__\n\nTack.",
-    "enable-wip-limit": "Enable WIP Limit",
+    "enable-wip-limit": "Aktivera WIP-gräns",
     "error-board-doesNotExist": "Denna anslagstavla finns inte",
     "error-board-notAdmin": "Du måste vara administratör för denna anslagstavla för att göra det",
     "error-board-notAMember": "Du måste vara medlem i denna anslagstavla för att göra det",
@@ -246,8 +246,8 @@
     "language": "Språk",
     "last-admin-desc": "Du kan inte ändra roller för det måste finnas minst en administratör.",
     "leave-board": "Lämna anslagstavla",
-    "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
-    "leaveBoardPopup-title": "Leave Board ?",
+    "leave-board-pop": "Är du säker på att du vill lämna __boardTitle__? Du kommer att tas bort från alla kort på den här anslagstavlan.",
+    "leaveBoardPopup-title": "Lämna anslagstavla ?",
     "link-card": "Länka till detta kort",
     "list-archive-cards": "Arkivera alla kort i denna lista",
     "list-archive-cards-pop": "Detta tar bort alla kort i denna lista från anslagstavlan. Om du se arkiverade kort och få dem tillbaka till anslagstavlan, klicka på ”Meny” > ”Arkiverade objekt”.",
@@ -315,8 +315,8 @@
     "save": "Spara",
     "search": "Sök",
     "select-color": "Välj färg",
-    "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
-    "setWipLimitPopup-title": "Set WIP Limit",
+    "set-wip-limit-value": "Ange en gräns för det maximala antalet uppgifter i den här listan",
+    "setWipLimitPopup-title": "Ställ in WIP-gräns",
     "shortcut-assign-self": "Tilldela dig nuvarande kort",
     "shortcut-autocomplete-emoji": "Komplettera automatiskt emoji",
     "shortcut-autocomplete-members": "Komplettera automatiskt medlemmar",
@@ -357,9 +357,9 @@
     "welcome-list1": "Grunderna",
     "welcome-list2": "Avancerad",
     "what-to-do": "Vad vill du göra?",
-    "wipLimitErrorPopup-title": "Invalid WIP Limit",
-    "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
-    "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+    "wipLimitErrorPopup-title": "Ogiltig WIP-gräns",
+    "wipLimitErrorPopup-dialog-pt1": "Antalet uppgifter i den här listan är högre än WIP-gränsen du har definierat.",
+    "wipLimitErrorPopup-dialog-pt2": "Flytta några uppgifter ur listan, eller ställ in en högre WIP-gräns.",
     "admin-panel": "Administratörspanel ",
     "settings": "Inställningar",
     "people": "Personer",
@@ -404,5 +404,8 @@
     "yes": "Ja",
     "no": "Nej",
     "accounts": "Konton",
-    "accounts-allowEmailChange": "Tillåt e-poständring"
+    "accounts-allowEmailChange": "Tillåt e-poständring",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/ta.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/th.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 13 - 10
i18n/tr.i18n.json

@@ -6,7 +6,7 @@
     "act-addChecklistItem": "__checklistItem__ öğesini __card__ kartındaki __checklist__ yapılacak listesine ekledi",
     "act-addComment": "__card__ kartına bir yorum bıraktı: __comment__",
     "act-createBoard": "__board__ panosunu oluşturdu",
-    "act-createCard": "__card__ kartını ___list__ listesine ekledi.",
+    "act-createCard": "__card__ kartını ___list__ listesine ekledi",
     "act-createList": "__list__ listesini __board__ panosuna ekledi",
     "act-addBoardMember": "__member__ kullanıcısını __board__ panosuna ekledi",
     "act-archivedBoard": "__board__ panosunu arşivledi",
@@ -172,7 +172,7 @@
     "edit-avatar": "Avatar Değiştir",
     "edit-profile": "Profili Düzenle",
     "edit-wip-limit": "Devam Eden İş Sınırını Düzenle",
-    "soft-wip-limit": "Soft WIP Limit",
+    "soft-wip-limit": "Zayıf Devam Eden İş Sınırı",
     "editCardStartDatePopup-title": "Başlangıç tarihini değiştir",
     "editCardDueDatePopup-title": "Bitiş tarihini değiştir",
     "editLabelPopup-title": "Etiket Değiştir",
@@ -390,19 +390,22 @@
     "Wekan_version": "Wekan sürümü",
     "Node_version": "Node sürümü",
     "OS_Arch": "İşletim Sistemi Mimarisi",
-    "OS_Cpus": "İS İşlemci Sayısı",
-    "OS_Freemem": "İŞ Kullanılmayan Bellek",
-    "OS_Loadavg": "İŞ Ortalama Yük",
-    "OS_Platform": "İŞ Platformu",
+    "OS_Cpus": "İşletim Sistemi İşlemci Sayısı",
+    "OS_Freemem": "İşletim Sistemi Kullanılmayan Bellek",
+    "OS_Loadavg": "İşletim Sistemi Ortalama Yük",
+    "OS_Platform": "İşletim Sistemi Platformu",
     "OS_Release": "İşletim Sistemi Sürümü",
-    "OS_Totalmem": "İŞ Toplam Belleği",
-    "OS_Type": "İŞ Tipi",
-    "OS_Uptime": "İŞ Toplam Açık Kalınan Süre",
+    "OS_Totalmem": "İşletim Sistemi Toplam Belleği",
+    "OS_Type": "İşletim Sistemi Tipi",
+    "OS_Uptime": "İşletim Sistemi Toplam Açık Kalınan Süre",
     "hours": "saat",
     "minutes": "dakika",
     "seconds": "saniye",
     "yes": "Evet",
     "no": "Hayır",
     "accounts": "Hesaplar",
-    "accounts-allowEmailChange": "E-posta Değiştirmeye İzin Ver"
+    "accounts-allowEmailChange": "E-posta Değiştirmeye İzin Ver",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/uk.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/vi.i18n.json

@@ -404,5 +404,8 @@
     "yes": "Yes",
     "no": "No",
     "accounts": "Accounts",
-    "accounts-allowEmailChange": "Allow Email Change"
+    "accounts-allowEmailChange": "Allow Email Change",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/zh-CN.i18n.json

@@ -404,5 +404,8 @@
     "yes": "是",
     "no": "否",
     "accounts": "账号",
-    "accounts-allowEmailChange": "允许邮箱变更"
+    "accounts-allowEmailChange": "允许邮箱变更",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 4 - 1
i18n/zh-TW.i18n.json

@@ -404,5 +404,8 @@
     "yes": "是",
     "no": "否",
     "accounts": "帳號",
-    "accounts-allowEmailChange": "准許變更電子信箱"
+    "accounts-allowEmailChange": "准許變更電子信箱",
+    "createdAt": "Created at",
+    "verified": "Verified",
+    "active": "Active"
 }

+ 65 - 51
models/users.js

@@ -118,6 +118,13 @@ Users.attachSchema(new SimpleSchema({
   },
 }));
 
+Users.allow({
+  update(userId) {
+    const user = Users.findOne(userId);
+    return user && Meteor.user().isAdmin;
+  },
+});
+
 // Search a user in the complete server database by its name or username. This
 // is used for instance to add a new user to a board.
 const searchInFields = ['username', 'profile.fullname'];
@@ -152,36 +159,36 @@ if (Meteor.isClient) {
 
 Users.helpers({
   boards() {
-    return Boards.find({ userId: this._id });
+    return Boards.find({userId: this._id});
   },
 
   starredBoards() {
-    const { starredBoards = [] } = this.profile;
-    return Boards.find({ archived: false, _id: { $in: starredBoards } });
+    const {starredBoards = []} = this.profile;
+    return Boards.find({archived: false, _id: {$in: starredBoards}});
   },
 
   hasStarred(boardId) {
-    const { starredBoards = [] } = this.profile;
+    const {starredBoards = []} = this.profile;
     return _.contains(starredBoards, boardId);
   },
 
   invitedBoards() {
-    const { invitedBoards = [] } = this.profile;
-    return Boards.find({ archived: false, _id: { $in: invitedBoards } });
+    const {invitedBoards = []} = this.profile;
+    return Boards.find({archived: false, _id: {$in: invitedBoards}});
   },
 
   isInvitedTo(boardId) {
-    const { invitedBoards = [] } = this.profile;
+    const {invitedBoards = []} = this.profile;
     return _.contains(invitedBoards, boardId);
   },
 
   hasTag(tag) {
-    const { tags = [] } = this.profile;
+    const {tags = []} = this.profile;
     return _.contains(tags, tag);
   },
 
   hasNotification(activityId) {
-    const { notifications = [] } = this.profile;
+    const {notifications = []} = this.profile;
     return _.contains(notifications, activityId);
   },
 
@@ -191,7 +198,7 @@ Users.helpers({
   },
 
   getEmailBuffer() {
-    const { emailBuffer = [] } = this.profile;
+    const {emailBuffer = []} = this.profile;
     return emailBuffer;
   },
 
@@ -316,22 +323,22 @@ Users.mutations({
   },
 
   setAvatarUrl(avatarUrl) {
-    return { $set: { 'profile.avatarUrl': avatarUrl } };
+    return {$set: {'profile.avatarUrl': avatarUrl}};
   },
 
   setShowCardsCountAt(limit) {
-    return { $set: { 'profile.showCardsCountAt': limit } };
+    return {$set: {'profile.showCardsCountAt': limit}};
   },
 });
 
 Meteor.methods({
-  setUsername(username) {
+  setUsername(username, userId) {
     check(username, String);
-    const nUsersWithUsername = Users.find({ username }).count();
+    const nUsersWithUsername = Users.find({username}).count();
     if (nUsersWithUsername > 0) {
       throw new Meteor.Error('username-already-taken');
     } else {
-      Users.update(this.userId, { $set: { username } });
+      Users.update(userId, {$set: {username}});
     }
   },
   toggleSystemMessages() {
@@ -342,13 +349,13 @@ Meteor.methods({
     check(limit, Number);
     Meteor.user().setShowCardsCountAt(limit);
   },
-  setEmail(email) {
+  setEmail(email, userId) {
     check(email, String);
-    const existingUser = Users.findOne({ 'emails.address': email }, { fields: { _id: 1 } });
+    const existingUser = Users.findOne({'emails.address': email}, {fields: {_id: 1}});
     if (existingUser) {
       throw new Meteor.Error('email-already-taken');
     } else {
-      Users.update(this.userId, {
+      Users.update(userId, {
         $set: {
           emails: [{
             address: email,
@@ -358,11 +365,12 @@ Meteor.methods({
       });
     }
   },
-  setUsernameAndEmail(username, email) {
+  setUsernameAndEmail(username, email, userId) {
     check(username, String);
     check(email, String);
-    Meteor.call('setUsername', username);
-    Meteor.call('setEmail', email);
+    check(userId, String);
+    Meteor.call('setUsername', username, userId);
+    Meteor.call('setEmail', email, userId);
   },
 });
 
@@ -379,8 +387,8 @@ if (Meteor.isServer) {
         board &&
         board.members &&
         _.contains(_.pluck(board.members, 'userId'), inviter._id) &&
-        _.where(board.members, { userId: inviter._id })[0].isActive &&
-        _.where(board.members, { userId: inviter._id })[0].isAdmin;
+        _.where(board.members, {userId: inviter._id})[0].isActive &&
+        _.where(board.members, {userId: inviter._id})[0].isAdmin;
       if (!allowInvite) throw new Meteor.Error('error-board-notAMember');
 
       this.unblock();
@@ -388,9 +396,9 @@ if (Meteor.isServer) {
       const posAt = username.indexOf('@');
       let user = null;
       if (posAt >= 0) {
-        user = Users.findOne({ emails: { $elemMatch: { address: username } } });
+        user = Users.findOne({emails: {$elemMatch: {address: username}}});
       } else {
-        user = Users.findOne(username) || Users.findOne({ username });
+        user = Users.findOne(username) || Users.findOne({username});
       }
       if (user) {
         if (user._id === inviter._id) throw new Meteor.Error('error-user-notAllowSelf');
@@ -400,7 +408,7 @@ if (Meteor.isServer) {
         // Set in lowercase email before creating account
         const email = username.toLowerCase();
         username = email.substring(0, posAt);
-        const newUserId = Accounts.createUser({ username, email });
+        const newUserId = Accounts.createUser({username, email});
         if (!newUserId) throw new Meteor.Error('error-user-notCreated');
         // assume new user speak same language with inviter
         if (inviter.profile && inviter.profile.language) {
@@ -434,7 +442,7 @@ if (Meteor.isServer) {
       } catch (e) {
         throw new Meteor.Error('email-fail', e.message);
       }
-      return { username: user.username, email: user.emails[0].address };
+      return {username: user.username, email: user.emails[0].address};
     },
   });
   Accounts.onCreateUser((options, user) => {
@@ -457,11 +465,15 @@ if (Meteor.isServer) {
     if (!options || !options.profile) {
       throw new Meteor.Error('error-invitation-code-blank', 'The invitation code is required');
     }
-    const invitationCode = InvitationCodes.findOne({ code: options.profile.invitationcode, email: options.email, valid: true });
+    const invitationCode = InvitationCodes.findOne({
+      code: options.profile.invitationcode,
+      email: options.email,
+      valid: true,
+    });
     if (!invitationCode) {
       throw new Meteor.Error('error-invitation-code-not-exist', 'The invitation code doesn\'t exist');
     } else {
-      user.profile = { icode: options.profile.invitationcode };
+      user.profile = {icode: options.profile.invitationcode};
     }
 
     return user;
@@ -473,7 +485,7 @@ if (Meteor.isServer) {
   Meteor.startup(() => {
     Users._collection._ensureIndex({
       username: 1,
-    }, { unique: true });
+    }, {unique: true});
   });
 
   // Each board document contains the de-normalized number of users that have
@@ -492,6 +504,7 @@ if (Meteor.isServer) {
     function getStarredBoardsIds(doc) {
       return doc.profile && doc.profile.starredBoards;
     }
+
     const oldIds = getStarredBoardsIds(this.previous);
     const newIds = getStarredBoardsIds(user);
 
@@ -500,9 +513,10 @@ if (Meteor.isServer) {
     // direction and then in the other.
     function incrementBoards(boardsIds, inc) {
       boardsIds.forEach((boardId) => {
-        Boards.update(boardId, { $inc: { stars: inc } });
+        Boards.update(boardId, {$inc: {stars: inc}});
       });
     }
+
     incrementBoards(_.difference(oldIds, newIds), -1);
     incrementBoards(_.difference(newIds, oldIds), +1);
   });
@@ -529,7 +543,7 @@ if (Meteor.isServer) {
         }, fakeUser, (err, boardId) => {
 
           ['welcome-list1', 'welcome-list2'].forEach((title) => {
-            Lists.insert({ title: TAPi18n.__(title), boardId }, fakeUser);
+            Lists.insert({title: TAPi18n.__(title), boardId}, fakeUser);
           });
         });
       });
@@ -545,14 +559,14 @@ if (Meteor.isServer) {
       // the disableRegistration check.
       // Issue : https://github.com/wekan/wekan/issues/1232
       // PR    : https://github.com/wekan/wekan/pull/1251
-      Users.update(doc._id, { $set: { createdThroughApi: '' } });
+      Users.update(doc._id, {$set: {createdThroughApi: ''}});
       return;
     }
 
     //invite user to corresponding boards
     const disableRegistration = Settings.findOne().disableRegistration;
     if (disableRegistration) {
-      const invitationCode = InvitationCodes.findOne({ code: doc.profile.icode, valid: true });
+      const invitationCode = InvitationCodes.findOne({code: doc.profile.icode, valid: true});
       if (!invitationCode) {
         throw new Meteor.Error('error-invitation-code-not-exist');
       } else {
@@ -564,8 +578,8 @@ if (Meteor.isServer) {
           doc.profile = {};
         }
         doc.profile.invitedBoards = invitationCode.boardsToBeInvited;
-        Users.update(doc._id, { $set: { profile: doc.profile } });
-        InvitationCodes.update(invitationCode._id, { $set: { valid: false } });
+        Users.update(doc._id, {$set: {profile: doc.profile}});
+        InvitationCodes.update(invitationCode._id, {$set: {valid: false}});
       }
     }
   });
@@ -574,9 +588,9 @@ if (Meteor.isServer) {
 
 // USERS REST API
 if (Meteor.isServer) {
-  JsonRoutes.add('GET', '/api/user', function(req, res, next) {
+  JsonRoutes.add('GET', '/api/user', function (req, res, next) {
     Authentication.checkLoggedIn(req.userId);
-    const data = Meteor.users.findOne({ _id: req.userId});
+    const data = Meteor.users.findOne({_id: req.userId});
     delete data.services;
     JsonRoutes.sendResult(res, {
       code: 200,
@@ -585,33 +599,33 @@ if (Meteor.isServer) {
   });
 
   JsonRoutes.add('GET', '/api/users', function (req, res, next) {
-    Authentication.checkUserId( req.userId);
+    Authentication.checkUserId(req.userId);
     JsonRoutes.sendResult(res, {
       code: 200,
       data: Meteor.users.find({}).map(function (doc) {
-        return { _id: doc._id, username: doc.username };
+        return {_id: doc._id, username: doc.username};
       }),
     });
   });
   JsonRoutes.add('GET', '/api/users/:id', function (req, res, next) {
-    Authentication.checkUserId( req.userId);
+    Authentication.checkUserId(req.userId);
     const id = req.params.id;
     JsonRoutes.sendResult(res, {
       code: 200,
-      data: Meteor.users.findOne({ _id: id }),
+      data: Meteor.users.findOne({_id: id}),
     });
   });
   JsonRoutes.add('PUT', '/api/users/:id', function (req, res, next) {
-    Authentication.checkUserId( req.userId);
+    Authentication.checkUserId(req.userId);
     const id = req.params.id;
     const action = req.body.action;
-    let data = Meteor.users.findOne({ _id: id });
+    let data = Meteor.users.findOne({_id: id});
     if (data !== undefined) {
       if (action === 'takeOwnership') {
         data = Boards.find({
           'members.userId': id,
           'members.isAdmin': true,
-        }).map(function(board) {
+        }).map(function (board) {
           if (board.hasMember(req.userId)) {
             board.removeMember(req.userId);
           }
@@ -623,11 +637,11 @@ if (Meteor.isServer) {
         });
       } else {
         if ((action === 'disableLogin') && (id !== req.userId)) {
-          Users.update({ _id: id }, { $set: { loginDisabled: true, 'services.resume.loginTokens': '' } });
+          Users.update({_id: id}, {$set: {loginDisabled: true, 'services.resume.loginTokens': ''}});
         } else if (action === 'enableLogin') {
-          Users.update({ _id: id }, { $set: { loginDisabled: '' } });
+          Users.update({_id: id}, {$set: {loginDisabled: ''}});
         }
-        data = Meteor.users.findOne({ _id: id });
+        data = Meteor.users.findOne({_id: id});
       }
     }
     JsonRoutes.sendResult(res, {
@@ -636,7 +650,7 @@ if (Meteor.isServer) {
     });
   });
   JsonRoutes.add('POST', '/api/users/', function (req, res, next) {
-    Authentication.checkUserId( req.userId);
+    Authentication.checkUserId(req.userId);
     const id = Accounts.createUser({
       username: req.body.username,
       email: req.body.email,
@@ -653,9 +667,9 @@ if (Meteor.isServer) {
   });
 
   JsonRoutes.add('DELETE', '/api/users/:id', function (req, res, next) {
-    Authentication.checkUserId( req.userId);
+    Authentication.checkUserId(req.userId);
     const id = req.params.id;
-    Meteor.users.remove({ _id: id });
+    Meteor.users.remove({_id: id});
     JsonRoutes.sendResult(res, {
       code: 200,
       data: {

+ 7 - 0
server/publications/people.js

@@ -0,0 +1,7 @@
+Meteor.publish('people', (limit) => {
+  check(limit, Number);
+  return Users.find({}, {
+    limit,
+    sort: {createdAt: -1},
+  });
+});