#111: translate templates

This commit is contained in:
bgamard 2017-11-02 15:39:50 +01:00
parent 4822b8bf23
commit e49d002941
21 changed files with 263 additions and 158 deletions

View File

@ -12,7 +12,7 @@ angular.module('docs').controller('SettingsSecurity', function($scope, User, $di
* Enable TOTP. * Enable TOTP.
*/ */
$scope.enableTotp = function() { $scope.enableTotp = function() {
var title = $translate.instant('settings.security.enable_totp_title'); var title = $translate.instant('settings.security.enable_totp');
var msg = $translate.instant('settings.security.enable_totp_message'); var msg = $translate.instant('settings.security.enable_totp_message');
var btns = [ var btns = [
{ result:'cancel', label: $translate.instant('cancel') }, { result:'cancel', label: $translate.instant('cancel') },

View File

@ -143,34 +143,117 @@
} }
}, },
"tag": { "tag": {
"new_tag": "New tag",
"search": "Search",
"edit_tag": "Edit tag",
"default": {
"title": "Tags",
"message_1": "<strong>Tags</strong> are labels associated to documents.",
"message_2": "A document can be tagged by multiple tags, and a tag can be applied to multiple documents.",
"message_3": "Using the <span class=\"glyphicon glyphicon-pencil\"></span> button, you can edit permissions on a tag.",
"message_4": "If a tag can be read by another user or group, associated documents can also be read by those people.",
"message_5": "For example, tag your company documents with a tag <span class=\"label label-info\">MyCompany</span> and add the permission <strong>Read</strong> to a group <span class=\"btn btn-default\">employees</span>"
},
"edit": { "edit": {
"delete_tag_title": "Delete tag", "delete_tag_title": "Delete tag",
"delete_tag_message": "Do you really want to delete this tag?" "delete_tag_message": "Do you really want to delete this tag?",
"name": "Name",
"color": "Color",
"parent": "Parent",
"info": "Permissions on this tag will also be applied to documents tagged <span class=\"label label-info\" ng-style=\"{ 'background': color }\">{{ name }}</span>"
} }
}, },
"group": { "group": {
"rofile": { "profile": {
"members": "Members", "members": "Members",
"no_members": "No member", "no_members": "No member",
"related_links": "Related links", "related_links": "Related links",
"edit_group": "Edit {{ name }} group" "edit_group": "Edit {{ name }} group"
} }
}, },
"settings": {
"user": { "user": {
"profile": {
"groups": "Groups",
"quota_used": "Quota used",
"percent_used": "{{ percent | number: 0 }}% Used",
"related_links": "Related links",
"document_created": "Documents created by {{ username }}",
"edit_user": "Edit {{ username }} user"
}
},
"usergroup": {
"search_groups": "Search in groups",
"search_users": "Search in users",
"you": "It's you!",
"default": {
"title": "Users & Groups",
"message": "Here you can view informations about users and groups."
}
},
"settings": {
"menu_personal_settings": "Personal settings",
"menu_user_account": "User account",
"menu_two_factor_auth": "Two-factor authentication",
"menu_opened_sessions": "Opened sessions",
"menu_general_settings": "General settings",
"menu_users": "Users",
"menu_groups": "Groups",
"menu_vocabularies": "Vocabularies",
"menu_configuration": "Configuration",
"menu_server_logs": "Server logs",
"user": {
"title": "Users <small>management</small>",
"add_user": "Add a user",
"username": "Username",
"create_date": "Create date",
"edit": { "edit": {
"delete_user_title": "Delete user", "delete_user_title": "Delete user",
"delete_user_message": "Do you really want to delete this user? All associated documents, files and tags will be deleted" "delete_user_message": "Do you really want to delete this user? All associated documents, files and tags will be deleted",
"edit_user_title": "Edit <small>\"{{ username }}\"</small>",
"add_user_title": "Add <small>user</small>",
"username": "Username",
"email": "E-mail",
"groups": "Groups",
"storage_quota": "Storage quota",
"storage_quota_placeholder": "Storage quota (in MB)",
"password": "Password",
"password_confirm": "Password (confirm)"
} }
}, },
"security": { "security": {
"enable_totp_title": "Enable two-factor authentication", "enable_totp": "Enable two-factor authentication",
"enable_totp_message": "Make sure you have a TOTP-compatible application on your phone ready to add a new account" "enable_totp_message": "Make sure you have a TOTP-compatible application on your phone ready to add a new account",
"title": "Two-factor <small>authentication</small>",
"message_1": "Two-factor authentication allows you to add a layer of security on your <strong>{{ appName }}</strong> account.<br/>Before activating this feature, make sure you have a TOTP-compatible app on your phone:",
"message_google_authenticator": "For Android, iOS, and Blackberry: <a href=\"https://support.google.com/accounts/answer/1066447\" target=\"_blank\">Google Authenticator</a>",
"message_duo_mobile": "For Android and iOS: <a href=\"https://guide.duo.com/third-party-accounts\" target=\"_blank\">Duo Mobile</a>",
"message_authenticator": "For Windows Phone: <a href=\"https://www.microsoft.com/en-US/store/apps/Authenticator/9WZDNCRFJ3RJ\" target=\"_blank\">Authenticator</a>",
"message_2": "Those applications automatically generate a validation code that changes after a certain period of time.<br/>You will be required to enter this validation code each time you login on <strong>{{ appName }}</strong>.",
"secret_key": "Your secret key is: <strong>{{ secret }}</strong>",
"secret_key_warning": "Configure your TOTP app on your phone with this secret key now, you will not be able to access it later.",
"totp_enabled_message": "Two-factor authentication is enabled on your account.<br/>Each time you login on <strong>{{ appName }}</strong>, you will be asked a validation code from your configured phone app.<br/>If you loose your phone, you will not be able to login into your account but active sessions will allow you to regenerate a secrey key.",
"disable_totp": {
"disable_totp": "Disable two-factor authentication",
"message": "Your account will not be protected by the two-factor authentication anymore.",
"confirm_password": "Confirm your password",
"submit": "Disable two-factor authentication"
}
}, },
"group": { "group": {
"title": "Groups <small>management</small>",
"add_group": "Add a group",
"name": "Name",
"edit": { "edit": {
"delete_group_title": "Delete group", "delete_group_title": "Delete group",
"delete_group_message": "Do you really want to delete this group?" "delete_group_message": "Do you really want to delete this group?",
"edit_group_title": "Edit <small>\"{{ name }}\"</small>",
"add_group_title": "Add <small>group</small>",
"name": "Name",
"parent_group": "Parent group",
"search_group": "Search a group",
"members": "Members",
"new_member": "New member",
"search_user": "Search a user"
} }
}, },
"account": { "account": {
@ -191,6 +274,31 @@
"logo": "Logo (squared size)", "logo": "Logo (squared size)",
"background_image": "Background image", "background_image": "Background image",
"uploading_image": "Uploading the image..." "uploading_image": "Uploading the image..."
},
"log": {
"title": "Server <small>logs</small>",
"date": "Date",
"tag": "Tag",
"message": "Message"
},
"session": {
"title": "Opened <small>sessions</small>",
"created_date": "Created date",
"last_connection_date": "Last connection date",
"user_agent": "From",
"current": "Current",
"current_session": "This is the current session",
"clear_message": "All other devices connected to this account will be disconnected",
"clear": "Clear all other sessions"
},
"vocabulary": {
"title": "Vocabulary <small>entries</small>",
"choose_vocabulary": "Choose a vocabulary to edit",
"type": "Type",
"coverage": "Coverage",
"rights": "Rights",
"value": "Value",
"order": "Order"
} }
}, },
"directive": { "directive": {
@ -230,7 +338,10 @@
"required": "Required", "required": "Required",
"too_short": "Too short", "too_short": "Too short",
"too_long": "Too long", "too_long": "Too long",
"password_confirm": "Password and password confirmation must match" "email": "Must be a valid e-mail",
"password_confirm": "Password and password confirmation must match",
"number": "Number required",
"no_space": "Space are not allowed"
}, },
"ok": "OK", "ok": "OK",
"cancel": "Cancel", "cancel": "Cancel",

View File

@ -9,7 +9,7 @@
<td><acl data="acl[0]"></acl></td> <td><acl data="acl[0]"></acl></td>
<td> <td>
<span class="label label-default" style="margin-right: 6px;" ng-repeat="a in acl | orderBy: 'perm'"> <span class="label label-default" style="margin-right: 6px;" ng-repeat="a in acl | orderBy: 'perm'">
{{ a.perm }} {{ 'acl.' + a.perm | translate }}
<span ng-show="(creator != a.name && a.type == 'USER' || a.type != 'USER') && writable" <span ng-show="(creator != a.name && a.type == 'USER' || a.type != 'USER') && writable"
class="glyphicon glyphicon-remove pointer" class="glyphicon glyphicon-remove pointer"
ng-click="deleteAcl(a)"></span> ng-click="deleteAcl(a)"></span>

View File

@ -28,7 +28,7 @@
<a ng-href="#/document/view/{{ log.message }}">{{ 'see' | translate }}</a> <a ng-href="#/document/view/{{ log.message }}">{{ 'see' | translate }}</a>
</span> </span>
<span ng-switch-when="Acl"> <span ng-switch-when="Acl">
{{ log.message }} {{ 'acl.' + log.message | translate }}
</span> </span>
<span ng-switch-when="Tag"> <span ng-switch-when="Tag">
<a href="#/tag">{{ log.message }}</a> <a href="#/tag">{{ log.message }}</a>

View File

@ -1,33 +1,29 @@
<img src="img/loader.gif" ng-show="!group && isEdit()" /> <img src="img/loader.gif" ng-show="!group && isEdit()" />
<div ng-show="group || !isEdit()"> <div ng-show="group || !isEdit()">
<h2 ng-show="isEdit()">Edit <h2 ng-show="isEdit()" translate="settings.group.edit.edit_group_title" translate-values="{ name: group.name }"></h2>
<small>"{{ group.name }}"</small> <h2 ng-show="!isEdit()" translate="settings.group.edit.add_group_title"></h2>
</h2>
<h2 ng-show="!isEdit()">Add
<small>group</small>
</h2>
<form class="form-horizontal" name="editGroupForm" novalidate> <form class="form-horizontal" name="editGroupForm" novalidate>
<div class="form-group" ng-class="{ 'has-error': !editGroupForm.name.$valid, success: editGroupForm.name.$valid }"> <div class="form-group" ng-class="{ 'has-error': !editGroupForm.name.$valid, success: editGroupForm.name.$valid }">
<label class="col-sm-2 control-label" for="inputName">Name</label> <label class="col-sm-2 control-label" for="inputName">{{ 'settings.group.edit.name' | translate }}</label>
<div class="col-sm-7"> <div class="col-sm-7">
<input name="name" type="text" id="inputName" required class="form-control" <input name="name" type="text" id="inputName" required class="form-control"
ng-minlength="3" ng-maxlength="50" placeholder="Name" ng-model="group.name"/> ng-minlength="3" ng-maxlength="50" placeholder="{{ 'settings.group.edit.name' | translate }}" ng-model="group.name"/>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<span class="help-block" ng-show="editGroupForm.name.$error.required">Required</span> <span class="help-block" ng-show="editGroupForm.name.$error.required">{{ 'validation.required' | translate }}</span>
<span class="help-block" ng-show="editGroupForm.name.$error.minlength">Too short</span> <span class="help-block" ng-show="editGroupForm.name.$error.minlength">{{ 'validation.too_short' | translate }}</span>
<span class="help-block" ng-show="editGroupForm.name.$error.maxlength">Too long</span> <span class="help-block" ng-show="editGroupForm.name.$error.maxlength">{{ 'validation.too_long' | translate }}</span>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputName">Parent group</label> <label class="col-sm-2 control-label" for="inputName">{{ 'settings.group.edit.parent_group' | translate }}</label>
<div class="col-sm-7"> <div class="col-sm-7">
<input name="name" type="text" id="inputParent" class="form-control" autocomplete="off" <input name="name" type="text" id="inputParent" class="form-control" autocomplete="off"
placeholder="Search a group" ng-model="group.parent" placeholder="{{ 'settings.group.edit.search_group' | translate }}" ng-model="group.parent"
typeahead="group for group in getGroupTypeahead($viewValue)" typeahead="group for group in getGroupTypeahead($viewValue)"
typeahead-wait-ms="200" typeahead-editable="false" /> typeahead-wait-ms="200" typeahead-editable="false" />
</div> </div>
@ -35,29 +31,30 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-offset-2 col-sm-10"> <div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary" ng-click="edit()" ng-disabled="!editGroupForm.$valid"> <button type="submit" class="btn btn-primary" ng-click="edit()" ng-disabled="!editGroupForm.$valid">
<span class="glyphicon glyphicon-pencil"></span> {{ isEdit() ? 'Edit' : 'Add' }} <span class="glyphicon glyphicon-pencil"></span> {{ isEdit() ? 'edit' : 'add' | translate }}
</button> </button>
<button type="button" class="btn btn-danger" ng-click="remove()" ng-show="isEdit()"> <button type="button" class="btn btn-danger" ng-click="remove()" ng-show="isEdit()">
<span class="glyphicon glyphicon-trash"></span> Delete <span class="glyphicon glyphicon-trash"></span> {{ 'delete' | translate }}
</button> </button>
</div> </div>
</div> </div>
</form> </form>
<div ng-show="isEdit()"> <div ng-show="isEdit()">
<h3>Members</h3> <h3>{{ 'settings.group.edit.members' | translate }}</h3>
<form class="form-horizontal" novalidate> <form class="form-horizontal" novalidate>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputMember">New member</label> <label class="col-sm-2 control-label" for="inputMember">{{ 'settings.group.edit.new_member' | translate }}</label>
<div class="col-sm-7"> <div class="col-sm-7">
<input name="member" type="text" id="inputMember" class="form-control" ng-model="member" placeholder="Search a user" <input name="member" type="text" id="inputMember" class="form-control" ng-model="member"
placeholder="{{ 'settings.group.edit.search_user' | translate }}"
typeahead="user for user in getUserTypeahead($viewValue)" typeahead-on-select="addMember($item)" typeahead="user for user in getUserTypeahead($viewValue)" typeahead-on-select="addMember($item)"
typeahead-wait-ms="200" typeahead-editable="false" autocomplete="off" /> typeahead-wait-ms="200" typeahead-editable="false" autocomplete="off" />
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label">Members</label> <label class="col-sm-2 control-label">{{ 'settings.group.edit.members' | translate }}</label>
<div class="col-sm-7"> <div class="col-sm-7">
<span ng-repeat="member in group.members"> <span ng-repeat="member in group.members">
<span class="btn btn-default" <span class="btn btn-default"

View File

@ -1,11 +1,14 @@
<h1>Groups <small>management</small> <a class="btn btn-primary" href="#/settings/group/add">Add a group</a></h1> <h1>
<span translate="settings.group.title"></span>
<a class="btn btn-primary" href="#/settings/group/add">{{ 'settings.group.add_group' | translate }}</a>
</h1>
<div class="row"> <div class="row">
<div class="col-md-4 well"> <div class="col-md-4 well">
<table class="table table-striped table-hover table-users"> <table class="table table-striped table-hover table-users">
<thead> <thead>
<tr> <tr>
<th>Name</th> <th>{{ 'settings.group.name' | translate }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

View File

@ -1,22 +1,22 @@
<div class="row"> <div class="row">
<div class="col-md-3"> <div class="col-md-3">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"><strong>Personal settings</strong></div> <div class="panel-heading"><strong>{{ 'settings.menu_personal_settings' | translate }}</strong></div>
<ul class="list-group"> <ul class="list-group">
<a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/account" href="#/settings/account">User account</a> <a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/account" href="#/settings/account">{{ 'settings.menu_user_account' | translate }}</a>
<a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/security" href="#/settings/security">Two-factor authentication</a> <a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/security" href="#/settings/security">{{ 'settings.menu_two_factor_auth' | translate }}</a>
<a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/session" href="#/settings/session">Opened sessions</a> <a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/session" href="#/settings/session">{{ 'settings.menu_opened_sessions' | translate }}</a>
</ul> </ul>
</div> </div>
<div class="panel panel-default" ng-show="isAdmin"> <div class="panel panel-default" ng-show="isAdmin">
<div class="panel-heading"><strong>General settings</strong></div> <div class="panel-heading"><strong>{{ 'settings.menu_general_settings' | translate }}</strong></div>
<ul class="list-group"> <ul class="list-group">
<a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/user.*" href="#/settings/user">Users</a> <a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/user.*" href="#/settings/user">{{ 'settings.menu_users' | translate }}</a>
<a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/group.*" href="#/settings/group">Groups</a> <a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/group.*" href="#/settings/group">{{ 'settings.menu_groups' | translate }}</a>
<a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/vocabulary.*" href="#/settings/vocabulary">Vocabularies</a> <a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/vocabulary.*" href="#/settings/vocabulary">{{ 'settings.menu_vocabularies' | translate }}</a>
<a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/config" href="#/settings/config">Configuration</a> <a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/config" href="#/settings/config">{{ 'settings.menu_configuration' | translate }}</a>
<a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/log" href="#/settings/log">Server logs</a> <a class="list-group-item" ng-class="{active: $uiRoute}" ui-route="/settings/log" href="#/settings/log">{{ 'settings.menu_server_logs' | translate }}</a>
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -1,10 +1,10 @@
<h1>Server <small>logs</small></h1> <h1 translate="settings.log.title"></h1>
<table class="table table-striped table-hover table-logs"> <table class="table table-striped table-hover table-logs">
<thead> <thead>
<tr> <tr>
<th>Date</th> <th>{{ 'settings.log.date' | translate }}</th>
<th>Tag</th> <th>{{ 'settings.log.tag' | translate }}</th>
<th>Message</th> <th>{{ 'settings.log.message' | translate }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

View File

@ -1,18 +1,18 @@
<div class="modal-header"> <div class="modal-header">
<h3>Disable two-factor authentication</h3> <h3>{{ 'settings.security.disable_totp' | translate }}</h3>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p class="text-danger"> <p class="text-danger">
Your account will not be protected by the two-factor authentication anymore. {{ 'settings.security.disable_totp.message' | translate }}
</p> </p>
<p> <p>
<label for="password">Confirm your password</label> <label for="password">{{ 'settings.security.disable_totp.confirm_password' | translate }}</label>
<input class="form-control" type="password" id="password" ng-model="password" /> <input class="form-control" type="password" id="password" ng-model="password" />
</p> </p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button ng-click="close(password)" class="btn btn-warning"> <button ng-click="close(password)" class="btn btn-warning">
Disable two-factor authentication {{ 'settings.security.disable_totp.submit' | translate }}
</button> </button>
<button ng-click="close(null)" class="btn btn-default">Cancel</button> <button ng-click="close(null)" class="btn btn-default">{{ 'cancel' | translate }}</button>
</div> </div>

View File

@ -1,43 +1,33 @@
<h1> <h1>
Two-factor <small>authentication</small> <span translate="settings.security.title"></span>
<span class="label" ng-class="{ 'label-success': user.totp_enabled, 'label-danger': !user.totp_enabled }"> <span class="label" ng-class="{ 'label-success': user.totp_enabled, 'label-danger': !user.totp_enabled }">
{{ user.totp_enabled ? 'Enabled' : 'Disabled' }} {{ user.totp_enabled ? 'Enabled' : 'Disabled' }}
</span> </span>
</h1> </h1>
<div ng-if="!user.totp_enabled"> <div ng-if="!user.totp_enabled">
<p> <p translate="settings.security.message_1" translate-values="{ appName: appName }"></p>
Two-factor authentication allows you to add a layer of security on your <strong>{{ appName }}</strong> account.<br/>
Before activating this feature, make sure you have a TOTP-compatible app on your phone:
</p>
<ul> <ul>
<li>For Android, iOS, and Blackberry: <a href="https://support.google.com/accounts/answer/1066447" target="_blank">Google Authenticator</a></li> <li translate="settings.security.message_google_authenticator"></li>
<li>For Android and iOS: <a href="https://guide.duo.com/third-party-accounts" target="_blank">Duo Mobile</a></li> <li translate="settings.security.message_duo_mobile"></li>
<li>For Windows Phone: <a href="https://www.microsoft.com/en-US/store/apps/Authenticator/9WZDNCRFJ3RJ" target="_blank">Authenticator</a></li> <li translate="settings.security.message_authenticator"></li>
</ul> </ul>
<p translate="settings.security.message_2" translate-values="{ appName: appName }"></p>
<p> <p>
Those applications automatically generate a validation code that changes after a certain period of time.<br/> <button class="btn btn-primary" ng-click="enableTotp()">{{ 'settings.security.enable_totp' | translate }}</button>
You will be required to enter this validation code each time you login on <strong>{{ appName }}</strong>.
</p>
<p>
<button class="btn btn-primary" ng-click="enableTotp()">Enable two-factor authentication</button>
</p> </p>
</div> </div>
<div ng-if="user.totp_enabled"> <div ng-if="user.totp_enabled">
<div ng-if="secret"> <div ng-if="secret">
<p>Your secret key is: <strong>{{ secret }}</strong></p> <p translate="settings.security.secret_key" translate-values="{ secret: secret }"></p>
<qrcode data="otpauth://totp/Sismics%20Docs?secret={{ secret }}" size="200"></qrcode> <qrcode data="otpauth://totp/Sismics%20Docs?secret={{ secret }}" size="200"></qrcode>
<p class="text-danger"> <p class="text-danger">
<strong>Configure your TOTP app on your phone with this secret key now, you will not be able to access it later.</strong> <strong>{{ 'settings.security.secret_key_warning' | translate }}</strong>
</p> </p>
</div> </div>
<p translate="settings.security.totp_enabled_message" translate-values="{ appName: appName }"></p>
<p> <p>
Two-factor authentication is enabled on your account.<br/> <button class="btn btn-warning" ng-click="disableTotp()">{{ 'settings.security.disable_totp' | translate }}</button>
Each time you login on <strong>{{ appName }}</strong>, you will be asked a validation code from your configured phone app.<br/>
If you loose your phone, you will not be able to login into your account but active sessions will allow you to regenerate a secrey key.
</p>
<p>
<button class="btn btn-warning" ng-click="disableTotp()">Disable two-factor authentication</button>
</p> </p>
</div> </div>

View File

@ -1,11 +1,11 @@
<h1>Opened <small>sessions</small></h1> <h1 translate="settings.session.title"></h1>
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead> <thead>
<tr> <tr>
<th>Created date</th> <th>{{ 'settings.session.created_date' | translate }}</th>
<th>Last connection date</th> <th>{{ 'settings.session.last_connection_date' | translate }}</th>
<th>From</th> <th>{{ 'settings.session.user_agent' | translate }}</th>
<th>Current</th> <th>{{ 'settings.session.current' | translate }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -14,11 +14,14 @@
<td>{{ session.last_connection_date | date: 'yyyy-MM-dd HH:mm' }}</td> <td>{{ session.last_connection_date | date: 'yyyy-MM-dd HH:mm' }}</td>
<td title="{{ session.user_agent }}">{{ session.ip }}</td> <td title="{{ session.user_agent }}">{{ session.ip }}</td>
<td> <td>
<span ng-show="session.current" class="glyphicon glyphicon-ok" title="This is the current session"></span> <span ng-show="session.current" class="glyphicon glyphicon-ok"
title="{{ 'settings.session.current_session' | translate }}"></span>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div class="form-actions"> <div class="form-actions">
<button type="submit" class="btn btn-warning" title="All other devices connected to this account will be disconnected" ng-click="deleteSession()">Clear all other sessions</button> <button type="submit" class="btn btn-warning"
title="{{ 'settings.session.clear_message' | translate }}"
ng-click="deleteSession()">{{ 'settings.session.clear' | translate }}</button>
</div> </div>

View File

@ -1,45 +1,41 @@
<img src="img/loader.gif" ng-show="!user && isEdit()" /> <img src="img/loader.gif" ng-show="!user && isEdit()" />
<div ng-show="user || !isEdit()"> <div ng-show="user || !isEdit()">
<h2 ng-show="isEdit()">Edit <h2 ng-show="isEdit()" translate="settings.user.edit.edit_user_title" translate-values="{ username: user.username }"></h2>
<small>"{{ user.username }}"</small> <h2 ng-show="!isEdit()" translate="settings.user.edit.add_user_title"></h2>
</h2>
<h2 ng-show="!isEdit()">Add
<small>user</small>
</h2>
<form class="form-horizontal" name="editUserForm" novalidate> <form class="form-horizontal" name="editUserForm" novalidate>
<div class="form-group" ng-class="{ 'has-error': !editUserForm.username.$valid, success: editUserForm.username.$valid }"> <div class="form-group" ng-class="{ 'has-error': !editUserForm.username.$valid, success: editUserForm.username.$valid }">
<label class="col-sm-2 control-label" for="inputUsername">Username</label> <label class="col-sm-2 control-label" for="inputUsername">{{ 'settings.user.edit.username' | translate }}</label>
<div class="col-sm-7"> <div class="col-sm-7">
<input name="username" type="text" id="inputUsername" required ng-disabled="isEdit()" class="form-control" <input name="username" type="text" id="inputUsername" required ng-disabled="isEdit()" class="form-control"
ng-minlength="3" ng-maxlength="50" placeholder="Username" ng-model="user.username"/> ng-minlength="3" ng-maxlength="50" placeholder="{{ 'settings.user.edit.username' | translate }}" ng-model="user.username"/>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<span class="help-block" ng-show="editUserForm.username.$error.required">Required</span> <span class="help-block" ng-show="editUserForm.username.$error.required">{{ 'validation.required' | translate }}</span>
<span class="help-block" ng-show="editUserForm.username.$error.minlength">Too short</span> <span class="help-block" ng-show="editUserForm.username.$error.minlength">{{ 'validation.too_short' | translate }}</span>
<span class="help-block" ng-show="editUserForm.username.$error.maxlength">Too long</span> <span class="help-block" ng-show="editUserForm.username.$error.maxlength">{{ 'validation.too_long' | translate }}</span>
</div> </div>
</div> </div>
<div class="form-group" ng-class="{ 'has-error': !editUserForm.email.$valid, success: editUserForm.email.$valid }">
<label class="col-sm-2 control-label" for="inputEmail">E-mail</label>
<div class="form-group" ng-class="{ 'has-error': !editUserForm.email.$valid, success: editUserForm.email.$valid }">
<label class="col-sm-2 control-label" for="inputEmail">{{ 'settings.user.edit.email' | translate }}</label>
<div class="col-sm-7"> <div class="col-sm-7">
<input name="email" type="email" id="inputEmail" required class="form-control" <input name="email" type="email" id="inputEmail" required class="form-control"
ng-minlength="1" ng-maxlength="100" placeholder="E-mail" ng-model="user.email"/> ng-minlength="1" ng-maxlength="100" placeholder="{{ 'settings.user.edit.username' | translate }}" ng-model="user.email"/>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<span class="help-block" ng-show="editUserForm.email.$error.required">Required</span> <span class="help-block" ng-show="editUserForm.email.$error.required">{{ 'validation.required' | translate }}</span>
<span class="help-block" ng-show="editUserForm.email.$error.email">Must be a valid e-mail</span> <span class="help-block" ng-show="editUserForm.email.$error.email">{{ 'validation.email' | translate }}</span>
<span class="help-block" ng-show="editUserForm.email.$error.minlength">Too short</span> <span class="help-block" ng-show="editUserForm.email.$error.minlength">{{ 'validation.too_short' | translate }}</span>
<span class="help-block" ng-show="editUserForm.email.$error.maxlength">Too long</span> <span class="help-block" ng-show="editUserForm.email.$error.maxlength">{{ 'validation.too_long' | translate }}</span>
</div> </div>
</div> </div>
<div class="form-group" ng-if="user.groups.length > 0">
<label class="col-sm-2 control-label">Groups</label>
<div class="form-group" ng-if="user.groups.length > 0">
<label class="col-sm-2 control-label">{{ 'settings.user.edit.groups' | translate }}</label>
<div class="col-sm-7"> <div class="col-sm-7">
<span ng-repeat="group in user.groups"> <span ng-repeat="group in user.groups">
<a class="btn btn-default" <a class="btn btn-default"
@ -47,55 +43,56 @@
</span> </span>
</div> </div>
</div> </div>
<div class="form-group" ng-class="{ 'has-error': !editUserForm.storage_quota.$valid, success: editUserForm.storage_quota.$valid }">
<label class="col-sm-2 control-label" for="inputQuota">Storage quota</label>
<div class="form-group" ng-class="{ 'has-error': !editUserForm.storage_quota.$valid, success: editUserForm.storage_quota.$valid }">
<label class="col-sm-2 control-label" for="inputQuota">{{ 'settings.user.edit.storage_quota' | translate }}</label>
<div class="col-sm-7"> <div class="col-sm-7">
<div class="input-group"> <div class="input-group">
<input name="storage_quota" type="number" id="inputQuota" required class="form-control" <input name="storage_quota" type="number" id="inputQuota" required class="form-control"
ng-pattern="/[0-9]*/" placeholder="Storage quota (in MB)" ng-model="user.storage_quota"/> ng-pattern="/[0-9]*/" placeholder="{{ 'settings.user.edit.storage_quota_placeholder' | translate }}" ng-model="user.storage_quota"/>
<div class="input-group-addon">MB</div> <div class="input-group-addon">{{ 'filter.filesize.mb' | translate }}</div>
</div> </div>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<span class="help-block" ng-show="editUserForm.storage_quota.$error.pattern">Number required</span> <span class="help-block" ng-show="editUserForm.storage_quota.$error.pattern">{{ 'validation.number' | translate }}</span>
</div> </div>
</div> </div>
<div class="form-group" ng-if="user.username != 'guest'" ng-class="{ 'has-error': !editUserForm.password.$valid, success: editUserForm.password.$valid }">
<label class="col-sm-2 control-label" for="inputPassword">Password</label>
<div class="form-group" ng-if="user.username != 'guest'" ng-class="{ 'has-error': !editUserForm.password.$valid, success: editUserForm.password.$valid }">
<label class="col-sm-2 control-label" for="inputPassword">{{ 'settings.user.edit.password' | translate }}</label>
<div class="col-sm-7"> <div class="col-sm-7">
<input name="password" type="password" id="inputPassword" ng-required="!isEdit()" class="form-control" <input name="password" type="password" id="inputPassword" ng-required="!isEdit()" class="form-control"
ng-minlength="8" ng-maxlength="50" placeholder="Password" ng-model="user.password"/> ng-minlength="8" ng-maxlength="50" placeholder="{{ 'settings.user.edit.password' | translate }}" ng-model="user.password"/>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<span class="help-block" ng-show="editUserForm.password.$error.required">Required</span> <span class="help-block" ng-show="editUserForm.password.$error.required">{{ 'validation.required' | translate }}</span>
<span class="help-block" ng-show="editUserForm.password.$error.minlength">Too short</span> <span class="help-block" ng-show="editUserForm.password.$error.minlength">{{ 'validation.too_short' | translate }}</span>
<span class="help-block" ng-show="editUserForm.password.$error.maxlength">Too long</span> <span class="help-block" ng-show="editUserForm.password.$error.maxlength">{{ 'validation.too_long' | translate }}</span>
</div> </div>
</div> </div>
<div class="form-group" ng-if="user.username != 'guest'" ng-class="{ 'has-error': !editUserForm.passwordconfirm.$valid, success: editUserForm.passwordconfirm.$valid }">
<label class="col-sm-2 -label" for="inputPasswordConfirm">Password (confirm)</label>
<div class="form-group" ng-if="user.username != 'guest'" ng-class="{ 'has-error': !editUserForm.passwordconfirm.$valid, success: editUserForm.passwordconfirm.$valid }">
<label class="col-sm-2 -label" for="inputPasswordConfirm">{{ 'settings.user.edit.password_confirm' | translate }}</label>
<div class="col-sm-7"> <div class="col-sm-7">
<input name="passwordconfirm" type="password" id="inputPasswordConfirm" ng-required="!isEdit()" class="form-control" <input name="passwordconfirm" type="password" id="inputPasswordConfirm" ng-required="!isEdit()" class="form-control"
ui-validate="'$value == user.password'" ui-validate-watch="'user.password'" ui-validate="'$value == user.password'" ui-validate-watch="'user.password'"
placeholder="Password (confirm)" ng-model="user.passwordconfirm"/> placeholder="{{ 'settings.user.edit.password_confirm' | translate }}" ng-model="user.passwordconfirm"/>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<span class="help-block" ng-show="editUserForm.passwordconfirm.$error.validator">Password and password confirmation must match</span> <span class="help-block" ng-show="editUserForm.passwordconfirm.$error.validator">{{ 'validation.password_confirm' | translate }}</span>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-offset-2 col-sm-10"> <div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary" ng-click="edit()" ng-disabled="!editUserForm.$valid"> <button type="submit" class="btn btn-primary" ng-click="edit()" ng-disabled="!editUserForm.$valid">
<span class="glyphicon glyphicon-pencil"></span> {{ isEdit() ? 'Edit' : 'Add' }} <span class="glyphicon glyphicon-pencil"></span> {{ isEdit() ? 'edit' : 'add' | translate }}
</button> </button>
<button type="button" class="btn btn-danger" ng-click="remove()" ng-show="isEdit() && user.username != 'guest'"> <button type="button" class="btn btn-danger" ng-click="remove()" ng-show="isEdit() && user.username != 'guest'">
<span class="glyphicon glyphicon-trash"></span> Delete <span class="glyphicon glyphicon-trash"></span> {{ 'delete' | translate }}
</button> </button>
</div> </div>
</div> </div>

View File

@ -1,12 +1,15 @@
<h1>Users <small>management</small> <a class="btn btn-primary" href="#/settings/user/add">Add a user</a></h1> <h1>
<span translate="settings.user.title"></span>
<a class="btn btn-primary" href="#/settings/user/add">{{ 'settings.user.add_user' | translate }}</a>
</h1>
<div class="row"> <div class="row">
<div class="col-md-4 well"> <div class="col-md-4 well">
<table class="table table-striped table-hover table-users"> <table class="table table-striped table-hover table-users">
<thead> <thead>
<tr> <tr>
<th>Username</th> <th>{{ 'settings.user.username' | translate }}</th>
<th>Create date</th> <th>{{ 'settings.user.create_date' | translate }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

View File

@ -1,13 +1,13 @@
<h1>Vocabulary <small>entries</small></h1> <h1 translate="settings.vocabulary.title"></h1>
<div class="row"> <div class="row">
<form class="form-inline"> <form class="form-inline">
<div class="form-group"> <div class="form-group">
<label for="inputVocabulary">Choose a vocabulary to edit</label> <label for="inputVocabulary">{{ 'settings.vocabulary.choose_vocabulary' | translate }}</label>
<select class="form-control" id="inputVocabulary" ng-model="vocabulary" ng-init="vocabulary = 'type'"> <select class="form-control" id="inputVocabulary" ng-model="vocabulary" ng-init="vocabulary = 'type'">
<option value="type">Type</option> <option value="type">{{ 'settings.vocabulary.type' | translate }}</option>
<option value="coverage">Coverage</option> <option value="coverage">{{ 'settings.vocabulary.coverage' | translate }}</option>
<option value="rights">Rights</option> <option value="rights">{{ 'settings.vocabulary.rights' | translate }}</option>
</select> </select>
</div> </div>
</form> </form>
@ -15,8 +15,8 @@
<table class="table table-striped" ng-show="entries"> <table class="table table-striped" ng-show="entries">
<thead> <thead>
<tr> <tr>
<th width="70%">Value</th> <th width="70%">{{ 'settings.vocabulary.value' | translate }}</th>
<th width="20%">Order</th> <th width="20%">{{ 'settings.vocabulary.order' | translate }}</th>
<th width="10%"></th> <th width="10%"></th>
</tr> </tr>
</thead> </thead>

View File

@ -1,6 +1,6 @@
<h1>Tags</h1> <h1>{{ 'tag.default.title' | translate }}</h1>
<p><strong>Tags</strong> are labels associated to documents.</p> <p translate="tag.default.message_1"></p>
<p>A document can be tagged by multiple tags, and a tag can be applied to multiple documents.</p> <p translate="tag.default.message_2"></p>
<p>Using the <span class="glyphicon glyphicon-pencil"></span> button, you can edit permissions on a tag.</p> <p translate="tag.default.message_3"></p>
<p>If a tag can be read by another user or group, associated documents can also be read by those people.</p> <p translate="tag.default.message_4"></p>
<p>For example, tag your company documents with a tag <span class="label label-info">MyCompany</span> and add the permission <strong>Read</strong> to a group <span class="btn btn-default">employees</span></p> <p translate="tag.default.message_5"></p>

View File

@ -1,5 +1,5 @@
<div class="pull-right" ng-show="tag.writable"> <div class="pull-right" ng-show="tag.writable">
<button class="btn btn-danger" ng-click="deleteTag(tag)"><span class="glyphicon glyphicon-trash"></span> Delete</button> <button class="btn btn-danger" ng-click="deleteTag(tag)"><span class="glyphicon glyphicon-trash"></span> {{ 'delete' | translate }}</button>
</div> </div>
<div class="page-header"> <div class="page-header">
@ -9,7 +9,7 @@
<div class="well col-lg-8" ng-show="tag.writable"> <div class="well col-lg-8" ng-show="tag.writable">
<form class="form-horizontal" name="editTagForm" novalidate> <form class="form-horizontal" name="editTagForm" novalidate>
<div class="form-group" ng-class="{ 'has-error': !editTagForm.name.$valid, success: editTagForm.name.$valid }"> <div class="form-group" ng-class="{ 'has-error': !editTagForm.name.$valid, success: editTagForm.name.$valid }">
<label class="col-sm-2 control-label" for="inputName">Name</label> <label class="col-sm-2 control-label" for="inputName">{{ 'tag.edit.name' | translate }}</label>
<div class="col-sm-6"> <div class="col-sm-6">
<input type="text" name="name" class="form-control" id="inputName" <input type="text" name="name" class="form-control" id="inputName"
@ -18,7 +18,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputColor">Color</label> <label class="col-sm-2 control-label" for="inputColor">{{ 'tag.edit.color' | translate }}</label>
<div class="col-sm-2"> <div class="col-sm-2">
<span colorpicker class="btn" data-color="" id="inputColor" <span colorpicker class="btn" data-color="" id="inputColor"
@ -27,7 +27,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputParent">Parent</label> <label class="col-sm-2 control-label" for="inputParent">{{ 'tag.edit.parent' | translate }}</label>
<div class="col-sm-6"> <div class="col-sm-6">
<select class="form-control" ng-model="tag.parent" id="inputParent"> <select class="form-control" ng-model="tag.parent" id="inputParent">
@ -43,7 +43,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-offset-2 col-sm-10"> <div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary" ng-click="edit()" ng-disabled="!editTagForm.$valid"> <button type="submit" class="btn btn-primary" ng-click="edit()" ng-disabled="!editTagForm.$valid">
<span class="glyphicon glyphicon-pencil"></span> Save <span class="glyphicon glyphicon-pencil"></span> {{ 'save' | translate }}
</button> </button>
</div> </div>
</div> </div>
@ -51,7 +51,7 @@
</div> </div>
<div class="well col-lg-8"> <div class="well col-lg-8">
<p>Permissions on this tag will also be applied to documents tagged <span class="label label-info" ng-style="{ 'background': tag.color }">{{ tag.name }}</span></p> <p translate="tag.edit.info" translate-values="{ name: tag.name, color: tag.color }"></p>
<acl-edit source="tag.id" <acl-edit source="tag.id"
acls="tag.acls" acls="tag.acls"

View File

@ -4,16 +4,16 @@
<form name="tagForm" novalidate> <form name="tagForm" novalidate>
<p class="input-group" ng-class="{ 'has-error': !tagForm.name.$valid }"> <p class="input-group" ng-class="{ 'has-error': !tagForm.name.$valid }">
<span colorpicker class="input-group-addon btn btn-default" data-color="#3a87ad" ng-model="tag.color" ng-style="{ 'background': tag.color }">&nbsp;</span> <span colorpicker class="input-group-addon btn btn-default" data-color="#3a87ad" ng-model="tag.color" ng-style="{ 'background': tag.color }">&nbsp;</span>
<input type="text" name="name" placeholder="New tag" class="form-control" <input type="text" name="name" placeholder="{{ 'tag.new_tag' | translate }}" class="form-control"
ng-maxlength="36" required ng-model="tag.name" ui-validate="{ space: '!$value || $value.indexOf(\' \') == -1' }"> ng-maxlength="36" required ng-model="tag.name" ui-validate="{ space: '!$value || $value.indexOf(\' \') == -1' }">
<span class="input-group-addon btn btn-primary" ng-disabled="!tagForm.$valid" ng-click="addTag()">Add</span> <span class="input-group-addon btn btn-primary" ng-disabled="!tagForm.$valid" ng-click="addTag()">{{ 'add' | translate }}</span>
</p> </p>
<span class="help-block" ng-show="tagForm.name.$error.space">Space are not allowed</span> <span class="help-block" ng-show="tagForm.name.$error.space">{{ 'validation.no_space' | translate }}</span>
</form> </form>
<p class="input-group"> <p class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-search"></span></span> <span class="input-group-addon"><span class="glyphicon glyphicon-search"></span></span>
<input type="search" class="form-control" placeholder="Search" ng-model="search.name"> <input type="search" class="form-control" placeholder="{{ 'tag.search' | translate }}" ng-model="search.name">
</p> </p>
<table class="row table table-striped table-hover table-tags"> <table class="row table table-striped table-hover table-tags">
@ -25,7 +25,7 @@
<span class="label label-info" ng-style="{ 'background': tag.color }">{{ tag.name }}</span> <span class="label label-info" ng-style="{ 'background': tag.color }">{{ tag.name }}</span>
</td> </td>
<td class="col-xs-1"> <td class="col-xs-1">
<a href="#/tag/{{ tag.id }}" class="btn btn-primary pull-right" title="Edit tag"> <a href="#/tag/{{ tag.id }}" class="btn btn-primary pull-right" title="{{ 'tag.edit_tag' | translate }}">
<span class="glyphicon glyphicon-pencil"></span> <span class="glyphicon glyphicon-pencil"></span>
</a> </a>
</td> </td>

View File

@ -2,34 +2,34 @@
<h1>{{ user.username }} <small>{{ user.email }}</small></h1> <h1>{{ user.username }} <small>{{ user.email }}</small></h1>
</div> </div>
<h4 ng-if="user.groups.length > 0">Groups</h4> <h4 ng-if="user.groups.length > 0">{{ 'user.profile.groups' | translate }}</h4>
<ul ng-if="user.groups.length > 0"> <ul ng-if="user.groups.length > 0">
<li ng-repeat="group in user.groups"> <li ng-repeat="group in user.groups">
<a href="#/group/{{ group }}">{{ group }}</a> <a href="#/group/{{ group }}">{{ group }}</a>
</li> </li>
</ul> </ul>
<h4>Quota used</h4> <h4>{{ 'user.profile.quota_used' | translate }}</h4>
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<div class="progress" title="{{(user.storage_current / user.storage_quota * 100) | number: 0}}% Used"> <div class="progress" title="{{ 'user.profile.percent_used' | translate: '{ percent: user.storage_current / user.storage_quota * 100 }' }}">
<div class="progress-bar" ng-style="{ 'width': (user.storage_current / user.storage_quota * 100) + '%' }"> <div class="progress-bar" ng-style="{ 'width': (user.storage_current / user.storage_quota * 100) + '%' }">
<span class="sr-only">{{ (user.storage_current / user.storage_quota * 100) }}% Used</span> <span class="sr-only">{{ 'user.profile.percent_used' | translate: '{ percent: user.storage_current / user.storage_quota * 100 }' }}</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<h4>Related links</h4> <h4>{{ 'user.profile.related_links' | translate }}</h4>
<ul> <ul>
<li> <li>
<a ng-href="#/document/search/by:{{ user.username }}"> <a ng-href="#/document/search/by:{{ user.username }}">
Documents created by {{ user.username }} {{ 'user.profile.document_created' | translate: '{ username: user.username }' }}
</a> </a>
</li> </li>
<li ng-if="userInfo.base_functions.indexOf('ADMIN') != -1"> <li ng-if="userInfo.base_functions.indexOf('ADMIN') != -1">
<a ng-href="#/settings/user/edit/{{ user.username }}"> <a ng-href="#/settings/user/edit/{{ user.username }}">
Edit {{ user.username }} user {{ 'user.profile.edit_user' | translate: '{ username: user.username }' }}
</a> </a>
</li> </li>
</ul> </ul>

View File

@ -1,2 +1,2 @@
<h1>Users & Groups</h1> <h1>{{ 'usergroup.default.title' | translate }}</h1>
<p>Here you can view informations about users and groups.</p> <p>{{ 'usergroup.default.message' | translate }}</p>

View File

@ -3,7 +3,7 @@
<div class="well"> <div class="well">
<p class="input-group"> <p class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-search"></span></span> <span class="input-group-addon"><span class="glyphicon glyphicon-search"></span></span>
<input type="search" class="form-control" placeholder="Search in groups" ng-model="searchGroup"> <input type="search" class="form-control" placeholder="{{ 'usergroup.search_groups' | translate }}" ng-model="searchGroup">
</p> </p>
<table class="row table table-striped table-hover"> <table class="row table table-striped table-hover">
@ -21,7 +21,7 @@
<div class="well"> <div class="well">
<p class="input-group"> <p class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-search"></span></span> <span class="input-group-addon"><span class="glyphicon glyphicon-search"></span></span>
<input type="search" class="form-control" placeholder="Search in users" ng-model="searchUser"> <input type="search" class="form-control" placeholder="{{ 'usergroup.search_users' | translate }}" ng-model="searchUser">
</p> </p>
<table class="row table table-striped table-hover"> <table class="row table table-striped table-hover">
@ -31,7 +31,7 @@
<td class="col-xs-4"> <td class="col-xs-4">
<span class="glyphicon glyphicon-user"></span> <span class="glyphicon glyphicon-user"></span>
{{ user.username }} {{ user.username }}
<span class="text-muted" ng-if="userInfo.username == user.username">It's you!</span> <span class="text-muted" ng-if="userInfo.username == user.username">{{ 'usergroup.you' | translate }}</span>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -36,6 +36,7 @@
.table-documents { .table-documents {
thead th { thead th {
cursor: pointer; cursor: pointer;
white-space: nowrap;
} }
tbody tr { tbody tr {