#111: translate templates (wip)

This commit is contained in:
Benjamin Gamard 2017-11-01 19:48:50 +01:00
parent c7b9ec3a4c
commit 198a6d5665
23 changed files with 351 additions and 176 deletions

View File

@ -6,7 +6,7 @@
angular.module('docs').directive('acl', function() { angular.module('docs').directive('acl', function() {
return { return {
restrict: 'E', restrict: 'E',
template: '<span ng-if="data.type"><em>{{ data.type == \'SHARE\' ? \'Shared\' : (data.type == \'USER\' ? \'User\' : \'Group\') }}</em> {{ data.name }}</span>', template: '<span ng-if="data.type"><em>{{ \'acl.\' + data.type | translate }}</em> {{ data.name }}</span>',
replace: true, replace: true,
scope: { scope: {
data: '=' data: '='

View File

@ -3,7 +3,7 @@
/** /**
* Format file sizes. * Format file sizes.
*/ */
angular.module('docs').filter('filesize', function() { angular.module('docs').filter('filesize', function($translate) {
return function(text) { return function(text) {
if (!text) { if (!text) {
return ''; return '';
@ -11,8 +11,8 @@ angular.module('docs').filter('filesize', function() {
var size = parseInt(text); var size = parseInt(text);
if (size > 1000000) { // 1MB if (size > 1000000) { // 1MB
return Math.round(size / 1000000) + 'MB'; return Math.round(size / 1000000) + $translate.instant('filter.filesize.mb');
} }
return Math.round(size / 1000) + 'kB'; return Math.round(size / 1000) + $translate.instant('filter.filesize.kb');
} }
}); });

View File

@ -22,32 +22,124 @@
"logout": "Logout" "logout": "Logout"
}, },
"document": { "document": {
"add_document": "Add a document",
"tags": "Tags",
"no_tags": "No tags",
"no_documents": "No document in the database",
"search": "Search",
"search_empty": "No matches for <strong>\"{{ search }}\"</strong>",
"shared": "Shared",
"title": "Title",
"description": "Description",
"contributors": "Contributors",
"language": "Language",
"creation_date": "Creation date",
"subject": "Subject",
"identifier": "Identifier",
"publisher": "Publisher",
"format": "Format",
"source": "Source",
"type": "Type",
"coverage": "Coverage",
"rights": "Rights",
"relations": "Relations",
"page_size": "Page size",
"page_size_10": "10 per page",
"page_size_20": "20 per page",
"page_size_30": "20 per page",
"upgrade_quota": "To upgrade your quota, ask your administrator",
"quota": "{{ current | number: 0 }}MB ({{ percent | number: 1 }}%) used on {{ total | number: 0 }}MB",
"count": "{{ count }} document{{ count > 1 ? 's' : '' }} found",
"view": { "view": {
"content": {
"delete_file_title": "Delete file",
"delete_file_message": "Do you really want to delete this file?",
"upload_pending": "Pending...",
"upload_progress": "Uploading...",
"upload_error": "Upload error",
"upload_error_quota": "Quota reached"
},
"delete_comment_title": "Delete comment", "delete_comment_title": "Delete comment",
"delete_comment_message": "Do you really want to delete this comment?", "delete_comment_message": "Do you really want to delete this comment?",
"delete_document_title": "Delete document", "delete_document_title": "Delete document",
"delete_document_message": "Do you really want to delete this document?", "delete_document_message": "Do you really want to delete this document?",
"shared_document_title": "Shared document", "shared_document_title": "Shared document",
"shared_document_message": "You can share this document by giving this link. Note that everyone having this link can see the document.<br/><input class=\"form-control share-link\" type=\"text\" readonly=\"readonly\" value=\"{{ link }}\" onclick=\"this.select(); document.execCommand('copy');\" />" "shared_document_message": "You can share this document by giving this link. Note that everyone having this link can see the document.<br/><input class=\"form-control share-link\" type=\"text\" readonly=\"readonly\" value=\"{{ link }}\" onclick=\"this.select(); document.execCommand('copy');\" />",
"not_found": "Document not found",
"forbidden": "Access forbidden",
"download_files": "Download files",
"export_pdf": "Export to PDF",
"by_creator": "by",
"comments": "Comments",
"no_comments": "No comments on this document yet",
"add_comment": "Add a comment",
"error_loading_comments": "Error loading comments",
"content": {
"content": "Content",
"delete_file_title": "Delete file",
"delete_file_message": "Do you really want to delete this file?",
"upload_pending": "Pending...",
"upload_progress": "Uploading...",
"upload_error": "Upload error",
"upload_error_quota": "Quota reached",
"drop_zone": "Drag & drop files here to upload"
},
"permissions": {
"permissions": "Permissions",
"message": "Permissions can be applied directly to this document, or can come from <a href=\"#/tag\">tags</a>.",
"title": "Permissions on this document",
"inherited_tags": "Permissions inherited by tags",
"acl_source": "From",
"acl_target": "For",
"acl_permission": "Permission"
},
"activity": {
"activity": "Activity",
"message": "Every actions on this document are logged here."
}
}, },
"edit": { "edit": {
"document_edited_with_errors": "Document successfully edited but some files cannot be uploaded", "document_edited_with_errors": "Document successfully edited but some files cannot be uploaded",
"document_added_with_errors": "Document successfully added but some files cannot be uploaded", "document_added_with_errors": "Document successfully added but some files cannot be uploaded",
"quota_reached": "Quota reached" "quota_reached": "Quota reached",
"primary_metadata": "Primary metadata",
"title_placeholder": "The nature or genre of the resource",
"description_placeholder": "An account of the resource",
"new_files": "New files",
"orphan_files": "+ {{ count }} file{{ count > 1 ? 's' : '' }}",
"additional_metadata": "Additional metadata",
"subject_placeholder": "The topic of the resource",
"identifier_placeholder": "An unambiguous reference to the resource within a given context",
"publisher_placeholder": "An entity responsible for making the resource available",
"format_placeholder": "The file format, physical medium, or dimensions of the resource",
"source_placeholder": "A related resource from which the described resource is derived",
"uploading_files": "Uploading files..."
}, },
"default": { "default": {
"upload_pending": "Pending...", "upload_pending": "Pending...",
"upload_progress": "Uploading...", "upload_progress": "Uploading...",
"upload_error": "Upload error", "upload_error": "Upload error",
"upload_error_quota": "Quota reached" "upload_error_quota": "Quota reached",
"quick_upload": "Quick upload",
"drop_zone": "Drag & drop files here to upload",
"add_new_document": "Add to new document",
"latest_activity": "Latest activity",
"footer_sismics": "Crafted with <span class=\"glyphicon glyphicon-heart\"></span> by <a href=\"https://www.sismics.com\" target=\"_blank\">Sismics</a>",
"api_documentation": "API Documentation",
"version": "Version:",
"memory": "Memory:"
},
"pdf": {
"export_title": "Export to PDF",
"export_metadata": "Export metadata",
"export_comments": "Export comments",
"fit_to_page": "Fit image to page",
"margin": "Margin",
"millimeter": "mm"
},
"share": {
"title": "Share document",
"message": "Name the sharing if you want to share multiple times the same document.",
"submit": "Share"
}
},
"file": {
"view": {
"previous": "Previous",
"next": "Next",
"not_found": "File not found"
} }
}, },
"tag": { "tag": {
@ -56,6 +148,14 @@
"delete_tag_message": "Do you really want to delete this tag?" "delete_tag_message": "Do you really want to delete this tag?"
} }
}, },
"group": {
"rofile": {
"members": "Members",
"no_members": "No member",
"related_links": "Related links",
"edit_group": "Edit {{ name }} group"
}
},
"settings": { "settings": {
"user": { "user": {
"edit": { "edit": {
@ -74,11 +174,76 @@
} }
}, },
"account": { "account": {
"password": "Password",
"password_confirm": "Password (confirm)",
"updated": "Account successfully updated" "updated": "Account successfully updated"
},
"config": {
"title_guest_access": "Guest <small>access</small>",
"message_guest_access": "Guest access is a mode where anyone can access {{ appName }} without password.<br/>Like a normal user, the guest user can only access its documents and those accessible through permissions.<br/>",
"enable_guest_access": "Enable guest access",
"disable_guest_access": "Disable guest access",
"title_theme": "Theme <small>customization</small>",
"application_name": "Application name",
"main_color": "Main color",
"custom_css": "Custom CSS",
"custom_css_placeholder": "Custom CSS to add after the main stylesheet",
"logo": "Logo (squared size)",
"background_image": "Background image",
"uploading_image": "Uploading the image..."
} }
}, },
"directive": {
"acledit": {
"acl_target": "For",
"acl_permission": "Permission",
"add_permission": "Add a permission",
"search_user_group": "Search a user or group"
},
"auditlog": {
"log_created": "created",
"log_updated": "updated",
"log_deleted": "deleted"
},
"selectrelation": {
"typeahead": "Type a document title"
},
"selecttag": {
"typeahead": "Type a tag"
}
},
"filter": {
"filesize": {
"mb": "MB",
"kb": "kB"
}
},
"acl": {
"READ": "Can read",
"READWRITE": "Can write",
"WRITE": "Can write",
"USER": "User",
"GROUP": "Group",
"SHARE": "Shared"
},
"validation": {
"required": "Required",
"too_short": "Too short",
"too_long": "Too long",
"password_confirm": "Password and password confirmation must match"
},
"ok": "OK", "ok": "OK",
"cancel": "Cancel", "cancel": "Cancel",
"share": "Share",
"unshare": "Unshare", "unshare": "Unshare",
"close": "Close" "close": "Close",
"add": "Add",
"open": "Open",
"see": "See",
"save": "Save",
"export": "Export",
"edit": "Edit",
"delete": "Delete",
"loading": "Loading...",
"send": "Send"
} }

View File

@ -1,8 +1,8 @@
<div> <div>
<table class="table"> <table class="table">
<tr> <tr>
<th style="width: 40%">For</th> <th style="width: 40%">{{ 'directive.acledit.acl_target' | translate }}</th>
<th style="width: 40%">Permission</th> <th style="width: 40%">{{ 'directive.acledit.acl_permission' | translate }}</th>
</tr> </tr>
<tr ng-repeat="(id, acl) in groupedAcls"> <tr ng-repeat="(id, acl) in groupedAcls">
@ -19,14 +19,14 @@
</table> </table>
<div ng-show="writable"> <div ng-show="writable">
<h4>Add a permission</h4> <h4>{{ 'directive.acledit.add_permission' | translate }}</h4>
<form name="aclForm" class="form-horizontal"> <form name="aclForm" class="form-horizontal">
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputTarget">For</label> <label class="col-sm-2 control-label" for="inputTarget">{{ 'directive.acledit.acl_target' | translate }}</label>
<div class="col-sm-3"> <div class="col-sm-3">
<input required ng-maxlength="50" class="form-control" type="text" id="inputTarget" <input required ng-maxlength="50" class="form-control" type="text" id="inputTarget"
placeholder="Search a user or group" name="target" ng-model="acl.target" autocomplete="off" placeholder="{{ 'directive.acledit.search_user_group' | translate }}" name="target" ng-model="acl.target" autocomplete="off"
typeahead="target as target.name for target in getTargetAclTypeahead($viewValue) | filter: $viewValue" typeahead="target as target.name for target in getTargetAclTypeahead($viewValue) | filter: $viewValue"
typeahead-template-url="partial/docs/directive.typeahead.acl.html" typeahead-template-url="partial/docs/directive.typeahead.acl.html"
typeahead-wait-ms="200" /> typeahead-wait-ms="200" />
@ -39,11 +39,11 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class=" col-sm-2 control-label" for="inputPermission">Permission</label> <label class=" col-sm-2 control-label" for="inputPermission">{{ 'directive.acledit.acl_permission' | translate }}</label>
<div class="col-sm-3"> <div class="col-sm-3">
<select class="form-control" ng-model="acl.perm" id="inputPermission"> <select class="form-control" ng-model="acl.perm" id="inputPermission">
<option value="READ">Can read</option> <option value="READ">{{ 'acl.READ' | translate }}</option>
<option value="READWRITE">Can edit</option> <option value="READWRITE">{{ 'acl.READWRITE' | translate }}</option>
</select> </select>
</div> </div>
</div> </div>
@ -52,7 +52,7 @@
<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-disabled="!acl.target.type" ng-click="addAcl()"> <button type="submit" class="btn btn-primary" ng-disabled="!acl.target.type" ng-click="addAcl()">
<span class="glyphicon glyphicon-plus"></span> <span class="glyphicon glyphicon-plus"></span>
Add {{ 'add' | translate }}
</button> </button>
</div> </div>
</div> </div>

View File

@ -10,9 +10,9 @@
<td> <td>
{{ log.class }} {{ log.class }}
<span ng-switch="log.type"> <span ng-switch="log.type">
<span ng-switch-when="CREATE">created</span> <span ng-switch-when="CREATE">{{ 'directive.auditlog.log_created' | translate }}</span>
<span ng-switch-when="UPDATE">updated</span> <span ng-switch-when="UPDATE">{{ 'directive.auditlog.log_updated' | translate }}</span>
<span ng-switch-when="DELETE">deleted</span> <span ng-switch-when="DELETE">{{ 'directive.auditlog.log_deleted' | translate }}</span>
</span> </span>
<span ng-switch="log.class"> <span ng-switch="log.class">
@ -21,11 +21,11 @@
<a ng-href="#/document/view/{{ log.target }}">{{ log.message }}</a> <a ng-href="#/document/view/{{ log.target }}">{{ log.message }}</a>
</span> </span>
<span ng-switch-when="File"> <span ng-switch-when="File">
<a ng-if="log.message" ng-href="#/document/view/{{ log.message }}/content/file/{{ log.target }}">Open</a> <a ng-if="log.message" ng-href="#/document/view/{{ log.message }}/content/file/{{ log.target }}">{{ 'open' | translate }}</a>
<a ng-if="!log.message" ng-href="#/document/file/{{ log.target }}">Open</a> <a ng-if="!log.message" ng-href="#/document/file/{{ log.target }}">{{ 'open' | translate }}</a>
</span> </span>
<span ng-switch-when="Comment"> <span ng-switch-when="Comment">
<a ng-href="#/document/view/{{ log.message }}">See</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 }} {{ log.message }}

View File

@ -6,7 +6,7 @@
</span> </span>
</li> </li>
</ul> </ul>
<input class="form-control" type="text" id="{{ ref }}" placeholder="Type a document title" ng-model="input" ng-disabled="ngDisabled" <input class="form-control" type="text" id="{{ ref }}" placeholder="{{ 'directive.selectrelation.typeahead' | translate }}" ng-model="input" ng-disabled="ngDisabled"
autocomplete="off" typeahead="document.title for document in getDocumentTypeahead($viewValue)" autocomplete="off" typeahead="document.title for document in getDocumentTypeahead($viewValue)"
typeahead-wait-ms="200" typeahead-on-select="addRelation($item)" /> typeahead-wait-ms="200" typeahead-on-select="addRelation($item)" />
</div> </div>

View File

@ -6,6 +6,6 @@
</span> </span>
</li> </li>
</ul> </ul>
<input class="form-control" type="text" id="{{ ref }}" placeholder="Type a tag" ng-model="input" ng-disabled="ngDisabled" <input class="form-control" type="text" id="{{ ref }}" placeholder="{{ 'directive.selecttag.typeahead' | translate }}" ng-model="input" ng-disabled="ngDisabled"
autocomplete="off" typeahead="tag.name for tag in allTags | filter: $viewValue" typeahead-on-select="addTag()" /> autocomplete="off" typeahead="tag.name for tag in allTags | filter: $viewValue" typeahead-on-select="addTag()" />
</div> </div>

View File

@ -2,9 +2,9 @@
<div ng-show="app"> <div ng-show="app">
<div class="well"> <div class="well">
<h3><span class="glyphicon glyphicon-cloud-upload"></span> Quick upload</h3> <h3><span class="glyphicon glyphicon-cloud-upload"></span> {{ 'document.default.quick_upload' | translate }}</h3>
<div class="row upload-zone" ng-model="dropFiles" ng-file-drop drag-over-class="bg-success" <div class="row upload-zone" ng-model="dropFiles" ng-file-drop drag-over-class="bg-success"
ng-multiple="true" allow-dir="false" accept="image/*,application/pdf,application/zip" ng-file-change="fileDropped($files, $event, $rejectedFiles)"> ng-multiple="true" allow-dir="false" ng-file-change="fileDropped($files, $event, $rejectedFiles)">
<div class="col-xs-6 col-sm-4 col-md-3 col-lg-2 text-center" ng-repeat="file in files"> <div class="col-xs-6 col-sm-4 col-md-3 col-lg-2 text-center" ng-repeat="file in files">
<div class="thumbnail" ng-class="{ 'thumbnail-checked': file.checked }" ng-if="file.id"> <div class="thumbnail" ng-class="{ 'thumbnail-checked': file.checked }" ng-if="file.id">
<a ng-click="openFile(file)"> <a ng-click="openFile(file)">
@ -12,7 +12,7 @@
</a> </a>
<div class="caption"> <div class="caption">
<div class="pull-left"> <div class="pull-left">
<input type="checkbox" ng-model="file.checked" style="width: 26px; height: 26px" /> <input type="checkbox" ng-model="file.checked" />
</div> </div>
<div class="pull-right"> <div class="pull-right">
<button class="btn btn-danger" ng-click="deleteFile($event, file)"><span class="glyphicon glyphicon-trash"></span></button> <button class="btn btn-danger" ng-click="deleteFile($event, file)"><span class="glyphicon glyphicon-trash"></span></button>
@ -33,28 +33,28 @@
<p class="text-center well-lg" ng-if="files.length == 0"> <p class="text-center well-lg" ng-if="files.length == 0">
<span class="glyphicon glyphicon-move"></span> <span class="glyphicon glyphicon-move"></span>
Drag &amp; drop files here to upload {{ 'document.default.drop_zone' | translate }}
</p> </p>
</div> </div>
<div class="btn-group" ng-show="checkedFiles().length > 0"> <div class="btn-group" ng-show="checkedFiles().length > 0">
<button class="btn btn-primary" ng-click="addDocument()"><span class="glyphicon glyphicon-plus"></span> Add to new document</button> <button class="btn btn-primary" ng-click="addDocument()"><span class="glyphicon glyphicon-plus"></span> {{ 'document.default.add_new_document' | translate }}</button>
</div> </div>
</div> </div>
<div ui-view="file"></div> <div ui-view="file"></div>
<div> <div>
<h3><span class="glyphicon glyphicon-tasks"></span> Latest activity</h3> <h3><span class="glyphicon glyphicon-tasks"></span> {{ 'document.default.latest_activity' | translate }}</h3>
<audit-log logs="logs" /> <audit-log logs="logs" />
</div> </div>
<div class="text-muted text-right"> <div class="text-muted text-right">
<ul class="list-inline"> <ul class="list-inline">
<li>Crafted with <span class="glyphicon glyphicon-heart"></span> by <a href="https://www.sismics.com" target="_blank">Sismics</a></li> <li translate="document.default.footer_sismics"></li>
<li><a href="apidoc/">API Documentation</a></li> <li><a href="apidoc/">{{ 'document.default.api_documentation' | translate }}</a></li>
<li><strong>Version:</strong> {{ app.current_version }}</li> <li><strong>{{ 'document.default.version' | translate }}</strong> {{ app.current_version }}</li>
<li><strong>Memory:</strong> {{ app.free_memory / 1000000 | number: 0 }}/{{ app.total_memory / 1000000 | number: 0 }} MB</li> <li><strong>{{ 'document.default.memory' | translate }}</strong> {{ app.free_memory / 1000000 | number: 0 }}/{{ app.total_memory / 1000000 | number: 0 }} MB</li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -3,32 +3,32 @@
<div ng-show="document || !isEdit()"> <div ng-show="document || !isEdit()">
<form name="documentForm" class="form-horizontal"> <form name="documentForm" class="form-horizontal">
<fieldset> <fieldset>
<legend>Primary metadata</legend> <legend>{{ 'document.edit.primary_metadata' | translate }}</legend>
<div class="form-group" ng-class="{ 'has-error': !documentForm.title.$valid }"> <div class="form-group" ng-class="{ 'has-error': !documentForm.title.$valid }">
<label class="col-sm-2 control-label" for="inputTitle">Title</label> <label class="col-sm-2 control-label" for="inputTitle">{{ 'document.title' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input required ng-maxlength="100" class="form-control" type="text" id="inputTitle" <input required ng-maxlength="100" class="form-control" type="text" id="inputTitle"
placeholder="The nature or genre of the resource" name="title" ng-model="document.title" autocomplete="off" placeholder="{{ 'document.edit.title_placeholder' | translate }}" name="title" ng-model="document.title" autocomplete="off"
typeahead="document for document in getTitleTypeahead($viewValue)" typeahead="document for document in getTitleTypeahead($viewValue)"
typeahead-wait-ms="200" ng-disabled="fileIsUploading" /> typeahead-wait-ms="200" ng-disabled="fileIsUploading" />
</div> </div>
</div> </div>
<div class="form-group" ng-class="{ 'has-error': !documentForm.description.$valid }"> <div class="form-group" ng-class="{ 'has-error': !documentForm.description.$valid }">
<label class="col-sm-2 control-label" for="inputDescription">Description</label> <label class="col-sm-2 control-label" for="inputDescription">{{ 'document.description' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<textarea ng-maxlength="4000" class="form-control" rows="5" id="inputDescription" placeholder="An account of the resource" <textarea ng-maxlength="4000" class="form-control" rows="5" id="inputDescription" placeholder="{{ 'document.edit.description_placeholder' | translate }}"
name="description" ng-model="document.description" ng-disabled="fileIsUploading"></textarea> name="description" ng-model="document.description" ng-disabled="fileIsUploading"></textarea>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputCreateDate">Creation date</label> <label class="col-sm-2 control-label" for="inputCreateDate">{{ 'document.creation_date' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input type="text" id="inputCreateDate" ng-readonly="true" datepicker-popup="yyyy-MM-dd" class="form-control" <input type="text" id="inputCreateDate" ng-readonly="true" datepicker-popup="yyyy-MM-dd" class="form-control"
ng-model="document.create_date" starting-day="1" show-weeks="false" ng-disabled="fileIsUploading" /> ng-model="document.create_date" starting-day="1" show-weeks="false" ng-disabled="fileIsUploading" />
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputLanguage">Language</label> <label class="col-sm-2 control-label" for="inputLanguage">{{ 'document.language' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<select class="form-control" id="inputLanguage" ng-model="document.language" ng-disabled="fileIsUploading"> <select class="form-control" id="inputLanguage" ng-model="document.language" ng-disabled="fileIsUploading">
<option value="eng">English</option> <option value="eng">English</option>
@ -42,8 +42,8 @@
<option value="ukr">українська</option> <option value="ukr">українська</option>
<option value="ara">العربية</option> <option value="ara">العربية</option>
<option value="hin">हिन्दी</option> <option value="hin">हिन्दी</option>
<option value="chi_sim">官话</option> <option value="chi_sim">简体中文</option>
<option value="chi_tra">官話</option> <option value="chi_tra">繁体中文</option>
<option value="jpn">日本語</option> <option value="jpn">日本語</option>
<option value="tha">ภาษาไทย</option> <option value="tha">ภาษาไทย</option>
<option value="kor">한국어</option> <option value="kor">한국어</option>
@ -51,16 +51,17 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputFiles">New files</label> <label class="col-sm-2 control-label" for="inputFiles">{{ 'document.edit.new_files' | translate }}</label>
<div class="col-sm-6"> <div class="col-sm-6">
<file class="form-control" id="inputFiles" multiple="multiple" ng-model="newFiles" ng-disabled="fileIsUploading"></file> <file class="form-control" id="inputFiles" multiple="multiple" ng-model="newFiles" ng-disabled="fileIsUploading"></file>
</div> </div>
<div class="col-sm-4" ng-if="orphanFiles.length > 0"> <div class="col-sm-4" ng-if="orphanFiles.length > 0">
+ {{ orphanFiles.length }} file{{ orphanFiles.length > 1 ? 's' : '' }} + {{ orphanFiles.length }} file{{ orphanFiles.length > 1 ? 's' : '' }}
{{ 'document.edit.orphan_files' | translate: '{ count: orphanFiles.length }' }}
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputTags">Tags</label> <label class="col-sm-2 control-label" for="inputTags">{{ 'document.tags' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<select-tag tags="document.tags" ref="inputTags" ng-disabled="fileIsUploading"></select-tag> <select-tag tags="document.tags" ref="inputTags" ng-disabled="fileIsUploading"></select-tag>
</div> </div>
@ -68,45 +69,45 @@
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>Additional metadata</legend> <legend>{{ 'document.edit.additional_metadata' | translate }}</legend>
<div class="form-group" ng-class="{ 'has-error': !documentForm.subject.$valid }"> <div class="form-group" ng-class="{ 'has-error': !documentForm.subject.$valid }">
<label class="col-sm-2 control-label" for="inputSubject">Subject</label> <label class="col-sm-2 control-label" for="inputSubject">{{ 'document.subject' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input ng-maxlength="500" class="form-control" type="text" id="inputSubject" <input ng-maxlength="500" class="form-control" type="text" id="inputSubject"
placeholder="The topic of the resource" name="subject" ng-model="document.subject" ng-disabled="fileIsUploading" /> placeholder="{{ 'document.edit.subject_placeholder' | translate }}" name="subject" ng-model="document.subject" ng-disabled="fileIsUploading" />
</div> </div>
</div> </div>
<div class="form-group" ng-class="{ 'has-error': !documentForm.identifier.$valid }"> <div class="form-group" ng-class="{ 'has-error': !documentForm.identifier.$valid }">
<label class="col-sm-2 control-label" for="inputIdentifier">Identifier</label> <label class="col-sm-2 control-label" for="inputIdentifier">{{ 'document.identifier' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input ng-maxlength="500" class="form-control" type="text" id="inputIdentifier" <input ng-maxlength="500" class="form-control" type="text" id="inputIdentifier"
placeholder="An unambiguous reference to the resource within a given context" name="identifier" ng-model="document.identifier" ng-disabled="fileIsUploading" /> placeholder="{{ 'document.edit.identifier_placeholder' | translate }}" name="identifier" ng-model="document.identifier" ng-disabled="fileIsUploading" />
</div> </div>
</div> </div>
<div class="form-group" ng-class="{ 'has-error': !documentForm.publisher.$valid }"> <div class="form-group" ng-class="{ 'has-error': !documentForm.publisher.$valid }">
<label class="col-sm-2 control-label" for="inputPublisher">Publisher</label> <label class="col-sm-2 control-label" for="inputPublisher">{{ 'document.publisher' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input ng-maxlength="500" class="form-control" type="text" id="inputPublisher" <input ng-maxlength="500" class="form-control" type="text" id="inputPublisher"
placeholder="An entity responsible for making the resource available" name="publisher" ng-model="document.publisher" ng-disabled="fileIsUploading" /> placeholder="{{ 'document.edit.publisher_placeholder' | translate }}" name="publisher" ng-model="document.publisher" ng-disabled="fileIsUploading" />
</div> </div>
</div> </div>
<div class="form-group" ng-class="{ 'has-error': !documentForm.format.$valid }"> <div class="form-group" ng-class="{ 'has-error': !documentForm.format.$valid }">
<label class="col-sm-2 control-label" for="inputFormat">Format</label> <label class="col-sm-2 control-label" for="inputFormat">{{ 'document.format' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input ng-maxlength="500" class="form-control" type="text" id="inputFormat" <input ng-maxlength="500" class="form-control" type="text" id="inputFormat"
placeholder="The file format, physical medium, or dimensions of the resource" name="format" ng-model="document.format" ng-disabled="fileIsUploading" /> placeholder="{{ 'document.edit.format_placeholder' | translate }}" name="format" ng-model="document.format" ng-disabled="fileIsUploading" />
</div> </div>
</div> </div>
<div class="form-group" ng-class="{ 'has-error': !documentForm.source.$valid }"> <div class="form-group" ng-class="{ 'has-error': !documentForm.source.$valid }">
<label class="col-sm-2 control-label" for="inputSource">Source</label> <label class="col-sm-2 control-label" for="inputSource">{{ 'document.source' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input ng-maxlength="500" class="form-control" type="text" id="inputSource" <input ng-maxlength="500" class="form-control" type="text" id="inputSource"
placeholder="A related resource from which the described resource is derived" name="source" ng-model="document.source" ng-disabled="fileIsUploading" /> placeholder="{{ 'document.edit.source_placeholder' | translate }}" name="source" ng-model="document.source" ng-disabled="fileIsUploading" />
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputType">Type</label> <label class="col-sm-2 control-label" for="inputType">{{ 'document.type' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<select class="form-control" id="inputType" name="type" ng-model="document.type" ng-disabled="fileIsUploading"> <select class="form-control" id="inputType" name="type" ng-model="document.type" ng-disabled="fileIsUploading">
<option value=""></option> <option value=""></option>
@ -115,7 +116,7 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputCoverage">Coverage</label> <label class="col-sm-2 control-label" for="inputCoverage">{{ 'document.coverage' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<select class="form-control" id="inputCoverage" name="coverage" ng-model="document.coverage" ng-disabled="fileIsUploading"> <select class="form-control" id="inputCoverage" name="coverage" ng-model="document.coverage" ng-disabled="fileIsUploading">
<option value=""></option> <option value=""></option>
@ -124,7 +125,7 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputRights">Rights</label> <label class="col-sm-2 control-label" for="inputRights">{{ 'document.rights' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<select class="form-control" id="inputRights" name="rights" ng-model="document.rights" ng-disabled="fileIsUploading"> <select class="form-control" id="inputRights" name="rights" ng-model="document.rights" ng-disabled="fileIsUploading">
<option value=""></option> <option value=""></option>
@ -133,7 +134,7 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputRelations">Relations</label> <label class="col-sm-2 control-label" for="inputRelations">{{ 'document.relations' | translate }}</label>
<div class="col-sm-10"> <div class="col-sm-10">
<select-relation relations="document.relations" ref="inputRelations" ng-disabled="fileIsUploading"></select-relation> <select-relation relations="document.relations" ref="inputRelations" ng-disabled="fileIsUploading"></select-relation>
</div> </div>
@ -142,14 +143,14 @@
<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-disabled="!documentForm.$valid || fileIsUploading" ng-click="edit()">Save</button> <button type="submit" class="btn btn-primary" ng-disabled="!documentForm.$valid || fileIsUploading" ng-click="edit()">{{ 'save' | translate }}</button>
<button type="submit" class="btn btn-default" ng-click="cancel()" ng-disabled="fileIsUploading">Cancel</button> <button type="submit" class="btn btn-default" ng-click="cancel()" ng-disabled="fileIsUploading">{{ 'cancel' | translate }}</button>
</div> </div>
</div> </div>
</form> </form>
<div class="row" ng-show="fileIsUploading"> <div class="row" ng-show="fileIsUploading">
<h4>Uploading files...</h4> <h4>{{ 'document.edit.uploading_files' | translate }}</h4>
<div class="col-md-6"><progressbar value="fileProgress" class="progress-info active"></progressbar></div> <div class="col-md-6"><progressbar value="fileProgress" class="progress-info active"></progressbar></div>
</div> </div>

View File

@ -2,16 +2,16 @@
<div class="col-md-4"> <div class="col-md-4">
<div class="well"> <div class="well">
<p class="text-center"> <p class="text-center">
<a href="#/document/add" class="btn btn-primary"><span class="glyphicon glyphicon-plus"></span> Add a document</a> <a href="#/document/add" class="btn btn-primary"><span class="glyphicon glyphicon-plus"></span> {{ 'document.add_document' | translate }}</a>
</p> </p>
<div class="row"> <div class="row">
<div class="dropdown col-md-2 tag-tree-dropdown" dropdown> <div class="dropdown col-md-2 tag-tree-dropdown" dropdown>
<button class="btn btn-block btn-default" dropdown-toggle ng-disabled="disabled"> <button class="btn btn-block btn-default" dropdown-toggle ng-disabled="disabled">
Tags <span class="caret"></span> {{ 'document.tags' | translate }} <span class="caret"></span>
</button> </button>
<ul class="dropdown-menu tag-tree"> <ul class="dropdown-menu tag-tree">
<li ng-if="getChildrenTags().length == 0">No tags</li> <li ng-if="getChildrenTags().length == 0">{{ 'document.no_tags' | translate }}</li>
<li ng-repeat="tag in getChildrenTags()" ng-include="'tag-tree-item'"></li> <li ng-repeat="tag in getChildrenTags()" ng-include="'tag-tree-item'"></li>
</ul> </ul>
</div> </div>
@ -29,7 +29,7 @@
lang:fra<br/> lang:fra<br/>
by:user1"></span> by:user1"></span>
</span> </span>
<input type="search" class="form-control" placeholder="Search" ng-model="search" /> <input type="search" class="form-control" placeholder="{{ 'document.search' | translate }}" ng-model="search" />
<span class="input-group-addon"> <span class="input-group-addon">
<span class="glyphicon glyphicon-search" ng-show="search.length == 0"></span> <span class="glyphicon glyphicon-search" ng-show="search.length == 0"></span>
<span class="glyphicon glyphicon-remove" ng-show="search.length > 0" ng-click="search = ''"></span> <span class="glyphicon glyphicon-remove" ng-show="search.length > 0" ng-click="search = ''"></span>
@ -40,9 +40,9 @@
<table class="row table table-striped table-hover table-documents"> <table class="row table table-striped table-hover table-documents">
<thead> <thead>
<tr> <tr>
<th class="col-xs-6" ng-click="sortDocuments(1)"><span class="glyphicon glyphicon-chevron-{{ sortColumn == 1 ? (asc ? 'down' : 'up') : '' }}"></span> Title</th> <th class="col-xs-6" ng-click="sortDocuments(1)"><span class="glyphicon glyphicon-chevron-{{ sortColumn == 1 ? (asc ? 'down' : 'up') : '' }}"></span> {{ 'document.title' | translate }}</th>
<th class="col-xs-3" ng-click="sortDocuments(3)"><span class="glyphicon glyphicon-chevron-{{ sortColumn == 3 ? (asc ? 'down' : 'up') : '' }}"></span> Creation date</th> <th class="col-xs-3" ng-click="sortDocuments(3)"><span class="glyphicon glyphicon-chevron-{{ sortColumn == 3 ? (asc ? 'down' : 'up') : '' }}"></span> {{ 'document.creation_date' | translate }}</th>
<th class="col-xs-3 hidden-xs">Tags</th> <th class="col-xs-3 hidden-xs">{{ 'document.tags' | translate }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -54,15 +54,15 @@
<tr ng-if="totalDocuments == 0"> <tr ng-if="totalDocuments == 0">
<td colspan="3" class="text-center"> <td colspan="3" class="text-center">
<span ng-if="search.length == 0">No document in the database</span> <span ng-if="search.length == 0">{{ 'document.no_documents' | translate }}</span>
<span ng-if="search.length > 0">No matches for <strong>"{{ search }}"</strong></span> <span ng-if="search.length > 0" translate="document.search_empty" translate-values="{ search: search }"></span>
</td> </td>
</tr> </tr>
<tr ng-click="viewDocument(document.id)" ng-repeat="document in documents" ng-class="{ active: $stateParams.id == document.id }"> <tr ng-click="viewDocument(document.id)" ng-repeat="document in documents" ng-class="{ active: $stateParams.id == document.id }">
<td> <td>
{{ document.title }} ({{ document.file_count }}) {{ document.title }} ({{ document.file_count }})
<span class="glyphicon glyphicon-share" ng-if="document.shared" tooltip="Shared"></span> <span class="glyphicon glyphicon-share" ng-if="document.shared" tooltip="{{ 'document.shared' | translate }}"></span>
<a href="#/document/view/{{ document.id }}" target="_blank" ng-click="$event.stopPropagation()"><span class="glyphicon glyphicon-link"></span></a> <a href="#/document/view/{{ document.id }}" target="_blank" ng-click="$event.stopPropagation()"><span class="glyphicon glyphicon-link"></span></a>
</td> </td>
<td>{{ document.create_date | date: 'yyyy-MM-dd' }}</td> <td>{{ document.create_date | date: 'yyyy-MM-dd' }}</td>
@ -79,22 +79,21 @@
<div class="text-center pagination-box"> <div class="text-center pagination-box">
<pagination total-items="totalDocuments" items-per-page="limit" max-size="5" page="currentPage"></pagination> <pagination total-items="totalDocuments" items-per-page="limit" max-size="5" page="currentPage"></pagination>
<label class="sr-only" for="pagesizeSelect">Page size</label> <label class="sr-only" for="pagesizeSelect">{{ 'document.page_size' | translate }}</label>
<select ng-model="limit" id="pagesizeSelect" class="form-control"> <select ng-model="limit" id="pagesizeSelect" class="form-control">
<option value="10">10 per page</option> <option value="10">{{ 'document.page_size_10' | translate }}</option>
<option value="20">20 per page</option> <option value="20">{{ 'document.page_size_20' | translate }}</option>
<option value="30">30 per page</option> <option value="30">{{ 'document.page_size_30' | translate }}</option>
</select> </select>
</div> </div>
<div class="pull-left" title="To upgrade your quota, ask your administrator"> <div class="pull-left" title="{{ 'document.upgrade_quota' | translate }}">
{{ userInfo.storage_current / 1000000 | number: 0 }}MB ({{ userInfo.storage_current / userInfo.storage_quota * 100 | number: 1 }}%) {{ 'document.quota' | translate: '{ current: userInfo.storage_current / 1000000, percent: userInfo.storage_current / userInfo.storage_quota * 100, total: userInfo.storage_quota / 1000000 }' }}
used on {{ userInfo.storage_quota / 1000000 | number: 0 }}MB
</div> </div>
<div class="text-right" > <div class="text-right" >
<span ng-if="totalDocuments"> <span ng-if="totalDocuments">
{{ totalDocuments }} document{{ totalDocuments > 1 ? 's' : '' }} found {{ 'document.count' | translate: '{ count: totalDocuments }' }}
</span> </span>
<span ng-if="!totalDocuments">&nbsp;</span> <span ng-if="!totalDocuments">&nbsp;</span>
</div> </div>

View File

@ -1,5 +1,5 @@
<div class="modal-header"> <div class="modal-header">
<h3>Export to PDF</h3> <h3>{{ 'document.pdf.export_title' | translate }}</h3>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form class="form-horizontal"> <form class="form-horizontal">
@ -7,7 +7,7 @@
<div class="col-sm-offset-2 col-sm-10"> <div class="col-sm-offset-2 col-sm-10">
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" ng-model="export.metadata" /> Export metadata <input type="checkbox" ng-model="export.metadata" /> {{ 'document.pdf.export_metadata' | translate }}
</label> </label>
</div> </div>
</div> </div>
@ -16,7 +16,7 @@
<div class="col-sm-offset-2 col-sm-10"> <div class="col-sm-offset-2 col-sm-10">
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" ng-model="export.comments" /> Export comments <input type="checkbox" ng-model="export.comments" /> {{ 'document.pdf.export_comments' | translate }}
</label> </label>
</div> </div>
</div> </div>
@ -25,21 +25,21 @@
<div class="col-sm-offset-2 col-sm-10"> <div class="col-sm-offset-2 col-sm-10">
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" ng-model="export.fitimagetopage" /> Fit image to page <input type="checkbox" ng-model="export.fitimagetopage" /> {{ 'document.pdf.fit_to_page' | translate }}
</label> </label>
</div> </div>
</div> </div>
</div> </div>
<label for="inputMargin" class="col-sm-2 control-label">Margin</label> <label for="inputMargin" class="col-sm-2 control-label">{{ 'document.pdf.margin' | translate }}</label>
<div class="input-group col-sm-5"> <div class="input-group col-sm-5">
<input type="number" class="form-control" id="inputMargin" ng-model="export.margin" min="0" max="100" step="1"> <input type="number" class="form-control" id="inputMargin" ng-model="export.margin" min="0" max="100" step="1">
<div class="input-group-addon">mm</div> <div class="input-group-addon">{{ 'document.pdf.millimeter' | translate }}</div>
</div> </div>
</form> </form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button ng-click="exportPdf()" class="btn btn-primary"> <button ng-click="exportPdf()" class="btn btn-primary">
<span class="glyphicon glyphicon-save-file"></span> Export <span class="glyphicon glyphicon-save-file"></span> {{ 'export' | translate }}
</button> </button>
<button ng-click="close()" class="btn btn-default">Cancel</button> <button ng-click="close()" class="btn btn-default">{{ 'cancel' | translate }}</button>
</div> </div>

View File

@ -1,15 +1,15 @@
<div class="modal-header"> <div class="modal-header">
<h3>Share document</h3> <h3>{{ 'document.share.title' | translate }}</h3>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p> <p>
<label for="share-result">Name the sharing if you want to share multiple times the same document.</label> <label for="share-result">{{ 'document.share.message' | translate }}</label>
<input class="form-control" type="text" id="share-result" ng-model="name" /> <input class="form-control" type="text" id="share-result" ng-model="name" />
</p> </p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button ng-click="close(name)" class="btn btn-primary"> <button ng-click="close(name)" class="btn btn-primary">
<span class="glyphicon glyphicon-share"></span> Share <span class="glyphicon glyphicon-share"></span> {{ 'document.share.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,3 +1,3 @@
<p class="well-sm">Every actions on this document are logged here.</p> <p class="well-sm">{{ 'document.view.activity.message' | translate }}</p>
<audit-log logs="logs" /> <audit-log logs="logs" />

View File

@ -1,22 +1,22 @@
<p class="well-sm" ng-bind-html="document.description | newline"></p> <p class="well-sm" ng-bind-html="document.description | newline"></p>
<dl class="dl-horizontal"> <dl class="dl-horizontal">
<dt ng-if="document.subject">Subject</dt> <dt ng-if="document.subject">{{ 'document.subject' | translate }}</dt>
<dd ng-if="document.subject">{{ document.subject }}</dd> <dd ng-if="document.subject">{{ document.subject }}</dd>
<dt ng-if="document.identifier">Identifier</dt> <dt ng-if="document.identifier">{{ 'document.identifier' | translate }}</dt>
<dd ng-if="document.identifier">{{ document.identifier }}</dd> <dd ng-if="document.identifier">{{ document.identifier }}</dd>
<dt ng-if="document.publisher">Publisher</dt> <dt ng-if="document.publisher">{{ 'document.publisher' | translate }}</dt>
<dd ng-if="document.publisher">{{ document.publisher }}</dd> <dd ng-if="document.publisher">{{ document.publisher }}</dd>
<dt ng-if="document.format">Format</dt> <dt ng-if="document.format">{{ 'document.format' | translate }}</dt>
<dd ng-if="document.format">{{ document.format }}</dd> <dd ng-if="document.format">{{ document.format }}</dd>
<dt ng-if="document.source">Source</dt> <dt ng-if="document.source">{{ 'document.source' | translate }}</dt>
<dd ng-if="document.source">{{ document.source }}</dd> <dd ng-if="document.source">{{ document.source }}</dd>
<dt ng-if="document.type">Type</dt> <dt ng-if="document.type">{{ 'document.type' | translate }}</dt>
<dd ng-if="document.type">{{ document.type }}</dd> <dd ng-if="document.type">{{ document.type }}</dd>
<dt ng-if="document.coverage">Coverage</dt> <dt ng-if="document.coverage">{{ 'document.coverage' | translate }}</dt>
<dd ng-if="document.coverage">{{ document.coverage }}</dd> <dd ng-if="document.coverage">{{ document.coverage }}</dd>
<dt ng-if="document.rights">rights</dt> <dt ng-if="document.rights">{{ 'document.rights' | translate }}</dt>
<dd ng-if="document.rights">{{ document.rights }}</dd> <dd ng-if="document.rights">{{ document.rights }}</dd>
<dt>Contributors</dt> <dt>{{ 'document.contributors' | translate }}</dt>
<dd> <dd>
<span ng-repeat="contributor in document.contributors"> <span ng-repeat="contributor in document.contributors">
<span class="btn btn-link btn-xs"> <span class="btn btn-link btn-xs">
@ -26,7 +26,7 @@
</span> </span>
</span> </span>
</dd> </dd>
<dt ng-if="document.relations.length > 0">Relations</dt> <dt ng-if="document.relations.length > 0">{{ 'document.relations' | translate }}</dt>
<dd ng-if="document.relations.length > 0"> <dd ng-if="document.relations.length > 0">
<span ng-repeat="relation in document.relations"> <span ng-repeat="relation in document.relations">
<span class="btn btn-link btn-xs"> <span class="btn btn-link btn-xs">
@ -70,7 +70,7 @@
<p class="text-center well-lg" ng-if="files.length == 0"> <p class="text-center well-lg" ng-if="files.length == 0">
<span class="glyphicon glyphicon-move"></span> <span class="glyphicon glyphicon-move"></span>
Drag &amp; drop files here to upload {{ 'document.view.content.drop_zone' | translate }}
</p> </p>
</div> </div>
</div> </div>

View File

@ -3,11 +3,11 @@
<div ng-show="error" class="well-lg"> <div ng-show="error" class="well-lg">
<p class="text-center" ng-show="error.status == 404"> <p class="text-center" ng-show="error.status == 404">
<span class="glyphicon glyphicon-warning-sign"></span> <span class="glyphicon glyphicon-warning-sign"></span>
Document not found {{ 'document.view.not_found' | translate }}
</p> </p>
<p class="text-center" ng-show="error.status == 403"> <p class="text-center" ng-show="error.status == 403">
<span class="glyphicon glyphicon-warning-sign"></span> <span class="glyphicon glyphicon-warning-sign"></span>
Access forbidden {{ 'document.view.forbidden' | translate }}
</p> </p>
</div> </div>
@ -16,25 +16,25 @@
<div class="dropdown btn-export" dropdown ng-class="{ 'btn-group': document.writable }"> <div class="dropdown btn-export" dropdown ng-class="{ 'btn-group': document.writable }">
<button class="btn btn-default" dropdown-toggle> <button class="btn btn-default" dropdown-toggle>
<span class="glyphicon glyphicon-export"></span> <span class="glyphicon glyphicon-export"></span>
Export {{ 'export' | translate }}
<span class="caret"></span> <span class="caret"></span>
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li> <li>
<a ng-href="../api/file/zip?id={{ document.id }}" title="Download all files"> <a ng-href="../api/file/zip?id={{ document.id }}" title="Download all files">
<span class="glyphicon glyphicon glyphicon-compressed"></span> <span class="glyphicon glyphicon glyphicon-compressed"></span>
Download files {{ 'document.view.download_files' | translate }}
</a> </a>
</li> </li>
<li> <li>
<a ng-click="exportPdf()" title="Export document to PDF" class="pointer"> <a ng-click="exportPdf()" title="Export document to PDF" class="pointer">
<span class="glyphicon glyphicon glyphicon-save-file"></span> <span class="glyphicon glyphicon glyphicon-save-file"></span>
Export to PDF {{ 'document.view.export_pdf' | translate }}
</a> </a>
</li> </li>
</ul> </ul>
<button class="btn btn-danger" ng-show="document.writable" ng-click="deleteDocument(document)"><span class="glyphicon glyphicon-trash"></span> Delete</button> <button class="btn btn-danger" ng-show="document.writable" ng-click="deleteDocument(document)"><span class="glyphicon glyphicon-trash"></span> {{ 'delete' | translate }}</button>
<a href="#/document/edit/{{ document.id }}" ng-show="document.writable" class="btn btn-primary"><span class="glyphicon glyphicon-pencil"></span> Edit</a> <a href="#/document/edit/{{ document.id }}" ng-show="document.writable" class="btn btn-primary"><span class="glyphicon glyphicon-pencil"></span> {{ 'edit' | translate }}</a>
</div> </div>
</div> </div>
@ -42,12 +42,12 @@
<h1> <h1>
{{ document.title }} {{ document.title }}
<small>{{ document.create_date | date: 'yyyy-MM-dd' }} <small>{{ document.create_date | date: 'yyyy-MM-dd' }}
by <a href="#/user/{{ document.creator }}">{{ document.creator }}</a></small> {{ 'document.view.by_creator' | translate }} <a href="#/user/{{ document.creator }}">{{ document.creator }}</a></small>
</h1> </h1>
<p ng-show="document.writable"> <p ng-show="document.writable">
<button class="btn btn-sm btn-info" ng-click="share()"> <button class="btn btn-sm btn-info" ng-click="share()">
<span class="glyphicon glyphicon-share"></span> Share <span class="glyphicon glyphicon-share"></span> {{ 'share' | translate }}
</button> </button>
<span ng-repeat="share in document.acls | filter: { 'type': 'SHARE' }"> <span ng-repeat="share in document.acls | filter: { 'type': 'SHARE' }">
@ -69,17 +69,17 @@
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
<li ng-class="{ active: $state.current.name == 'document.view.content' }"> <li ng-class="{ active: $state.current.name == 'document.view.content' }">
<a href="#/document/view/{{ document.id }}/content"> <a href="#/document/view/{{ document.id }}/content">
<span class="glyphicon glyphicon-file"></span> Content <span class="glyphicon glyphicon-file"></span> {{ 'document.view.content' | translate }}
</a> </a>
</li> </li>
<li ng-class="{ active: $state.current.name == 'document.view.permissions' }"> <li ng-class="{ active: $state.current.name == 'document.view.permissions' }">
<a href="#/document/view/{{ document.id }}/permissions"> <a href="#/document/view/{{ document.id }}/permissions">
<span class="glyphicon glyphicon-user"></span> Permissions <span class="glyphicon glyphicon-user"></span> {{ 'document.view.permissions' | translate }}
</a> </a>
</li> </li>
<li ng-class="{ active: $state.current.name == 'document.view.activity' }"> <li ng-class="{ active: $state.current.name == 'document.view.activity' }">
<a href="#/document/view/{{ document.id }}/activity"> <a href="#/document/view/{{ document.id }}/activity">
<span class="glyphicon glyphicon-tasks"></span> Activity <span class="glyphicon glyphicon-tasks"></span> {{ 'document.view.activity' | translate }}
</a> </a>
</li> </li>
</ul> </ul>
@ -88,14 +88,14 @@
<div class="col-md-3"> <div class="col-md-3">
<p class="page-header"> <p class="page-header">
<span class="glyphicon glyphicon-comment"></span> <span class="glyphicon glyphicon-comment"></span>
Comments {{ 'document.view.comments' | translate }}
</p> </p>
<div ng-show="!comments || comments.length == 0" class="text-center text-muted"> <div ng-show="!comments || comments.length == 0" class="text-center text-muted">
<h1 class="glyphicon glyphicon-comment"></h1> <h1 class="glyphicon glyphicon-comment"></h1>
<p ng-show="!comments && !commentsError">Loading...</p> <p ng-show="!comments && !commentsError">{{ 'loading' | translate }}</p>
<p ng-show="comments.length == 0">No comments on this document yet</p> <p ng-show="comments.length == 0">{{ 'document.view.no_comments' | translate }}</p>
<p ng-show="!comments && commentsError">Error loading comments</p> <p ng-show="!comments && commentsError">{{ 'document.view.error_loading_comments' | translate }}</p>
</div> </div>
<div ng-repeat="comment in comments" class="media" style="overflow: hidden"> <div ng-repeat="comment in comments" class="media" style="overflow: hidden">
@ -109,15 +109,15 @@
<span class="text-muted">{{ comment.create_date | date: 'yyyy-MM-dd' }}</span> <span class="text-muted">{{ comment.create_date | date: 'yyyy-MM-dd' }}</span>
<span class="text-muted pull-right btn-link pointer" <span class="text-muted pull-right btn-link pointer"
ng-show="document.writable || userInfo.username == comment.creator" ng-show="document.writable || userInfo.username == comment.creator"
ng-click="deleteComment(comment)">Delete</span> ng-click="deleteComment(comment)">{{ 'delete' | translate }}</span>
</p> </p>
</div> </div>
</div> </div>
<form ng-submit="addComment()"> <form ng-submit="addComment()">
<div class="form-group"> <div class="form-group">
<label class="sr-only" for="commentInput">Email address</label> <label class="sr-only" for="commentInput">{{ 'document.view.add_comment' | translate }}</label>
<input type="text" class="form-control" id="commentInput" ng-model="comment" placeholder="Add a comment"> <input type="text" class="form-control" id="commentInput" ng-model="comment" placeholder="{{ 'document.view.add_comment' | translate }}">
</div> </div>
</form> </form>
</div> </div>

View File

@ -1,7 +1,7 @@
<p class="well-sm">Permissions can be applied directly to this document, or can come from <a href="#/tag">tags</a>.</p> <p class="well-sm" translate="document.view.permissions.message"></p>
<div class="well"> <div class="well">
<h3>Permissions on this document</h3> <h3>{{ 'document.view.permissions.title' | translate }}</h3>
<acl-edit source="document.id" <acl-edit source="document.id"
acls="document.acls" acls="document.acls"
@ -10,13 +10,13 @@
</div> </div>
<div class="well" ng-show="document.inherited_acls.length > 0"> <div class="well" ng-show="document.inherited_acls.length > 0">
<h3>Permissions inherited by tags</h3> <h3>{{ 'document.view.permissions.inherited_tags' | translate }}</h3>
<table class="table"> <table class="table table-permissions">
<tr> <tr>
<th style="width: 30%">From</th> <th style="width: 30%">{{ 'document.view.permissions.acl_source' | translate }}</th>
<th style="width: 30%">For</th> <th style="width: 30%">{{ 'document.view.permissions.acl_target' | translate }}</th>
<th style="width: 30%">Permission</th> <th style="width: 30%">{{ 'document.view.permissions.acl_permission' | translate }}</th>
</tr> </tr>
<tr ng-repeat="(id, acl) in inheritedAcls"> <tr ng-repeat="(id, acl) in inheritedAcls">
@ -28,8 +28,8 @@
</td> </td>
<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 label-acl" ng-repeat="a in acl | orderBy: 'perm'">
{{ a.perm }} {{ 'acl.' + a.perm | translate }}
</span> </span>
</td> </td>
</tr> </tr>

View File

@ -6,8 +6,8 @@
</div> </div>
<div class="btn-group"> <div class="btn-group">
<button type="button" class="btn btn-default" ng-click="previousFile()">Previous</button> <button type="button" class="btn btn-default" ng-click="previousFile()">{{ 'file.view.previous' | translate }}</button>
<button type="button" class="btn btn-default" ng-click="nextFile()">Next</button> <button type="button" class="btn btn-default" ng-click="nextFile()">{{ 'file.view.next' | translate }}</button>
</div> </div>
<div class="btn-group pull-right"> <div class="btn-group pull-right">
@ -28,6 +28,6 @@
ng-show="!error" /> ng-show="!error" />
<p class="well-lg" ng-show="error"> <p class="well-lg" ng-show="error">
<span class="glyphicon glyphicon-warning-sign"></span> <span class="glyphicon glyphicon-warning-sign"></span>
File not found {{ 'file.view.not_found' | translate }}
</p> </p>
</div> </div>

View File

@ -2,20 +2,20 @@
<h1>{{ group.name }}</h1> <h1>{{ group.name }}</h1>
</div> </div>
<h4>Members</h4> <h4>{{ 'group.profile.members' | translate }}</h4>
<ul> <ul>
<li ng-repeat="member in group.members"> <li ng-repeat="member in group.members">
<a href="#/user/{{ member }}">{{ member }}</a> <a href="#/user/{{ member }}">{{ member }}</a>
</li> </li>
<li ng-if="group.members.length == 0">No member</li> <li ng-if="group.members.length == 0">{{ 'group.profile.no_members' | translate }}</li>
</ul> </ul>
<div ng-if="userInfo.base_functions.indexOf('ADMIN') != -1"> <div ng-if="userInfo.base_functions.indexOf('ADMIN') != -1">
<h4>Related links</h4> <h4>{{ 'group.profile.related_links' | translate }}</h4>
<ul> <ul>
<li> <li>
<a ng-href="#/settings/group/edit/{{ group.name }}"> <a ng-href="#/settings/group/edit/{{ group.name }}">
Edit {{ group.name }} group {{ 'group.profile.edit_group' | translate: '{ name: group.name }' }}
</a> </a>
</li> </li>
</ul> </ul>

View File

@ -1,3 +1,3 @@
<div class="container"> <div class="container">
<h4 class="text-center">Loading...</h4> <h4 class="text-center">{{ 'loading' | translate }}</h4>
</div> </div>

View File

@ -1,34 +1,34 @@
<h1>User <small>account</small></h1> <h1>User <small>account</small></h1>
<form class="form-horizontal" name="editUserForm" novalidate> <form class="form-horizontal" name="editUserForm" novalidate>
<div class="form-group" ng-class="{ 'has-error': !editUserForm.password.$valid, success: editUserForm.password.$valid }"> <div class="form-group" ng-class="{ 'has-error': !editUserForm.password.$valid, success: editUserForm.password.$valid }">
<label class="col-sm-2 control-label" for="inputPassword">Password</label> <label class="col-sm-2 control-label" for="inputPassword">{{ 'settings.account.password' | translate }}</label>
<div class="col-sm-7"> <div class="col-sm-7">
<input name="password" type="password" id="inputPassword" required class="form-control" <input name="password" type="password" id="inputPassword" required class="form-control"
ng-minlength="8" ng-maxlength="50" placeholder="Password" ng-model="user.password" /> ng-minlength="8" ng-maxlength="50" placeholder="{{ 'settings.account.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-class="{ 'has-error': !editUserForm.passwordconfirm.$valid, success: editUserForm.passwordconfirm.$valid }"> <div class="form-group" ng-class="{ 'has-error': !editUserForm.passwordconfirm.$valid, success: editUserForm.passwordconfirm.$valid }">
<label class="col-sm-2 control-label" for="inputPasswordConfirm">Password (confirm)</label> <label class="col-sm-2 control-label" for="inputPasswordConfirm">{{ 'settings.account.password_confirm' | translate }}</label>
<div class="col-sm-7"> <div class="col-sm-7">
<input name="passwordconfirm" type="password" id="inputPasswordConfirm" required class="form-control" <input name="passwordconfirm" type="password" id="inputPasswordConfirm" required 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.account.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="editUser()" ng-disabled="!editUserForm.$valid"> <button type="submit" class="btn btn-primary" ng-click="editUser()" ng-disabled="!editUserForm.$valid">
<span class="glyphicon glyphicon-pencil"></span> Edit <span class="glyphicon glyphicon-pencil"></span> {{ 'edit' | translate }}
</button> </button>
</div> </div>
</div> </div>

View File

@ -1,22 +1,20 @@
<h1> <h1>
Guest <small>access</small> <span translate="settings.config.title_guest_access"></span>
<span class="label" ng-class="{ 'label-success': app.guest_login, 'label-danger': !app.guest_login }"> <span class="label" ng-class="{ 'label-success': app.guest_login, 'label-danger': !app.guest_login }">
{{ app.guest_login ? 'Enabled' : 'Disabled' }} {{ app.guest_login ? 'Enabled' : 'Disabled' }}
</span> </span>
</h1> </h1>
<p> <p translate="settings.config.message_guest_access" translate-values="{ appName: appName }">
Guest access is a mode where anyone can access {{ appName }} without password.<br/>
Like a normal user, the guest user can only access its documents and those accessible through permissions.<br/>
</p> </p>
<div ng-if="app"> <div ng-if="app">
<button ng-if="!app.guest_login" class="btn btn-primary" ng-click="changeGuestLogin(true)">Enable guest access</button> <button ng-if="!app.guest_login" class="btn btn-primary" ng-click="changeGuestLogin(true)">{{ 'settings.config.enable_guest_access' | translate }}</button>
<button ng-if="app.guest_login" class="btn btn-danger" ng-click="changeGuestLogin(false)">Disable guest access</button> <button ng-if="app.guest_login" class="btn btn-danger" ng-click="changeGuestLogin(false)">{{ 'settings.config.disable_guest_access' | translate }}</button>
</div> </div>
<h1>Theme <small>customization</small></h1> <h1 translate="settings.config.title_theme"></h1>
<form class="form-horizontal" name="editColorForm" novalidate> <form class="form-horizontal" name="editColorForm" novalidate>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputName">Application name</label> <label class="col-sm-2 control-label" for="inputName">{{ 'settings.config.application_name' | translate }}</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input type="text" class="form-control" <input type="text" class="form-control"
id="inputName" ng-model="theme.name" ng-blur="update()" /> id="inputName" ng-model="theme.name" ng-blur="update()" />
@ -24,7 +22,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputColor">Main color</label> <label class="col-sm-2 control-label" for="inputColor">{{ 'settings.config.main_color' | translate }}</label>
<div class="col-sm-1"> <div class="col-sm-1">
<span colorpicker class="btn btn-default" id="inputColor" on-hide="update()" <span colorpicker class="btn btn-default" id="inputColor" on-hide="update()"
data-color="" ng-model="theme.color" ng-style="{ 'background': theme.color }">&nbsp;&nbsp;&nbsp;</span> data-color="" ng-model="theme.color" ng-style="{ 'background': theme.color }">&nbsp;&nbsp;&nbsp;</span>
@ -32,15 +30,15 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputCss">Custom CSS</label> <label class="col-sm-2 control-label" for="inputCss">{{ 'settings.config.custom_css' | translate }}</label>
<div class="col-sm-8"> <div class="col-sm-8">
<textarea class="form-control" rows="6" placeholder="Custom CSS to add after the main stylesheet" <textarea class="form-control" rows="6" placeholder="{{ 'settings.config.custom_css_placeholder' | translate }}"
id="inputCss" ng-model="theme.css" ng-blur="update()"></textarea> id="inputCss" ng-model="theme.css" ng-blur="update()"></textarea>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputLogo">Logo</label> <label class="col-sm-2 control-label" for="inputLogo">{{ 'settings.config.logo' | translate }}</label>
<div class="col-sm-2"> <div class="col-sm-2">
<file accept="image/gif,image/png,image/jpg,image/jpeg" <file accept="image/gif,image/png,image/jpg,image/jpeg"
class="form-control" id="inputLogo" ng-model="logo" ng-disabled="sendingImage" /> class="form-control" id="inputLogo" ng-model="logo" ng-disabled="sendingImage" />
@ -48,13 +46,13 @@
<div class="col-sm-2"> <div class="col-sm-2">
<button class="btn btn-default" ng-click="sendImage('logo', logo)" ng-disabled="sendingImage || !logo"> <button class="btn btn-default" ng-click="sendImage('logo', logo)" ng-disabled="sendingImage || !logo">
<span class="glyphicon glyphicon-save"></span> <span class="glyphicon glyphicon-save"></span>
Send {{ 'send' | translate }}
</button> </button>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label" for="inputBackground">Background image</label> <label class="col-sm-2 control-label" for="inputBackground">{{ 'settings.config.background_image' | translate }}</label>
<div class="col-sm-2"> <div class="col-sm-2">
<file accept="image/gif,image/png,image/jpg,image/jpeg" <file accept="image/gif,image/png,image/jpg,image/jpeg"
class="form-control" id="inputLogo" ng-model="background" ng-disabled="sendingImage" /> class="form-control" id="inputLogo" ng-model="background" ng-disabled="sendingImage" />
@ -62,7 +60,7 @@
<div class="col-sm-2"> <div class="col-sm-2">
<button class="btn btn-default" ng-click="sendImage('background', background)" ng-disabled="sendingImage || !background"> <button class="btn btn-default" ng-click="sendImage('background', background)" ng-disabled="sendingImage || !background">
<span class="glyphicon glyphicon-save"></span> <span class="glyphicon glyphicon-save"></span>
Send {{ 'send' | translate }}
</button> </button>
</div> </div>
</div> </div>
@ -71,7 +69,7 @@
<label class="col-sm-2 control-label"></label> <label class="col-sm-2 control-label"></label>
<div class="col-sm-10"> <div class="col-sm-10">
<p class="form-control-static text-info" ng-if="sendingImage"> <p class="form-control-static text-info" ng-if="sendingImage">
Uploading the image... {{ 'settings.config.uploading_image' | translate }}
</p> </p>
</div> </div>
</div> </div>

View File

@ -1 +0,0 @@
<h1>Settings</h1>

View File

@ -113,6 +113,11 @@
} }
// File thumbnails // File thumbnails
.thumbnail input[type="checkbox"] {
width: 26px;
height: 26px;
}
.thumbnail-file { .thumbnail-file {
cursor: pointer; cursor: pointer;
} }
@ -132,6 +137,13 @@
display: block; display: block;
} }
// Permissions table
.table-permissions {
.label-acl {
margin-right: 6px;
}
}
// Fields bound to datepicker // Fields bound to datepicker
input[readonly][datepicker-popup] { input[readonly][datepicker-popup] {
cursor: pointer; cursor: pointer;
@ -249,6 +261,7 @@ input[readonly].share-link {
// Login // Login
.login-box-container { .login-box-container {
background: url('../../api/theme/image/background') no-repeat center; background: url('../../api/theme/image/background') no-repeat center;
background-size: cover;
} }
.login-box { .login-box {