diff --git a/www/plugins/es/i18n/locale-en-GB.json b/www/plugins/es/i18n/locale-en-GB.json index 7aca05813f2fa3def50ec237a5b543c0a1cfd311..479cd428326aa5568319031f5e4798d120ee919b 100644 --- a/www/plugins/es/i18n/locale-en-GB.json +++ b/www/plugins/es/i18n/locale-en-GB.json @@ -134,7 +134,11 @@ "LIST": { "INBOX": "Inbox", "OUTBOX": "Outbox", + "LAST_INBOX": "New messages", + "LAST_OUTBOX": "Sent messages", + "BTN_LAST_MESSAGES": "Recent messages", "TITLE": "Private messages", + "SEARCH_HELP": "Search in messages", "POPOVER_ACTIONS": { "TITLE": "Options", "DELETE_ALL": "Delete all messages" diff --git a/www/plugins/es/i18n/locale-en.json b/www/plugins/es/i18n/locale-en.json index 7aca05813f2fa3def50ec237a5b543c0a1cfd311..479cd428326aa5568319031f5e4798d120ee919b 100644 --- a/www/plugins/es/i18n/locale-en.json +++ b/www/plugins/es/i18n/locale-en.json @@ -134,7 +134,11 @@ "LIST": { "INBOX": "Inbox", "OUTBOX": "Outbox", + "LAST_INBOX": "New messages", + "LAST_OUTBOX": "Sent messages", + "BTN_LAST_MESSAGES": "Recent messages", "TITLE": "Private messages", + "SEARCH_HELP": "Search in messages", "POPOVER_ACTIONS": { "TITLE": "Options", "DELETE_ALL": "Delete all messages" diff --git a/www/plugins/es/i18n/locale-es-ES.json b/www/plugins/es/i18n/locale-es-ES.json index 8ba8b4a9fb053f8649c4362de9c3d4abf9a8a775..7b663445b0c028ef3a9e9d91573ba6eb72afd3f7 100644 --- a/www/plugins/es/i18n/locale-es-ES.json +++ b/www/plugins/es/i18n/locale-es-ES.json @@ -134,7 +134,11 @@ "LIST": { "INBOX": "Bandeja de entrada", "OUTBOX": "Mensajes mandados", + "LAST_INBOX": "Nuevos mensajes", + "LAST_OUTBOX": "Mensajes enviados", + "BTN_LAST_MESSAGES": "Mensajes recientes", "TITLE": "Mensajes", + "SEARCH_HELP": "Buscar en mensajes", "POPOVER_ACTIONS": { "TITLE": "Opciónes", "DELETE_ALL": "Suprimir todos los mensajes" @@ -156,7 +160,8 @@ "TITLE": "Mensaje", "SENDER": "Mandado por", "RECIPIENT": "Mandado a", - "NO_CONTENT": "Mensaje vacÃo" + "NO_CONTENT": "Mensaje vacÃo", + "DELETE": "Eliminar el mensaje" }, "CONFIRM": { "REMOVE": "Está usted segura/o querer <b>suprimir este mensaje</b> ?<br/><br/>Esta operación es ireversible.", @@ -279,14 +284,16 @@ "BTN_ADVANCED_SEARCH": "búsqueda avanzada", "BTN_OPTIONS": "Búsqueda avanzada", "TYPE": "Tipo de página", - "LOCATION": "Localización", "LOCATION_HELP": "Ciudad", "RESULTS": "Resultados", "RESULT_COUNT_LOCATION": "{{count}} Resultado{{count>0?'s':''}}, cerca de {{location}}", "RESULT_COUNT": "{{count}} resultado{{count>0?'s':''}}", "LAST_RECORDS": "Páginas recientes", "LAST_RECORD_COUNT_LOCATION": "{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}, cerca de {{location}}", - "LAST_RECORD_COUNT": "{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}" + "LAST_RECORD_COUNT": "{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}", + "POPOVER_FILTERS": { + "BTN_ADVANCED_SEARCH": "Opciones avanzadas?" + } }, "VIEW": { "TITLE": "Anuario", @@ -346,6 +353,8 @@ "NO_PROFILE_DEFINED": "Ningún perfil Cesium+", "BTN_ADD": "Ingresar mi perfil", "BTN_EDIT": "Editar mi perfil", + "BTN_DELETE": "Eliminar mi perfil", + "BTN_REORDER": "Reordenar", "UID": "Seudónimo", "TITLE": "Nombre, Apellido", "TITLE_HELP": "Nombre, Apellido", @@ -362,13 +371,18 @@ "RESIZE_HELP": "<b>Encuadra la imagen</b>, si es necesario. Un clic mantenido sobre la imagen permite desplazarla. Hace un clic sobre la zona abajo a la izquierda para hacer zoom.", "RESULT_HELP": "<b>Aquà está el resultado</b> tal como está visible sobre su perfil :" }, + "CONFIRM": { + "DELETE": "¿Estás seguro de que quieres <b>eliminar tu perfil Cesium+?</b><br/><br/>Esta operación es irreversible." + }, "ERROR": { + "REMOVE_PROFILE_FAILED": "Error de eliminación de perfil", "LOAD_PROFILE_FAILED": "Fracaso en la carga del perfil usuario.", "SAVE_PROFILE_FAILED": "Fracaso durante el respaldo", "INVALID_SOCIAL_NETWORK_FORMAT": "Formato no tomado en cuenta : por favor, indica una dirección válida.<br/><br/>Ejemplos :<ul><li>- Una página Facebook (https://www.facebook.com/user)</li><li>- Una página web (http://www.misitio.es)</li><li>- Una dirección email (joe@dalton.com)</li></ul>", "IMAGE_RESIZE_FAILED": "Fracaso durante el redimensionamiento de la imagen" }, "INFO": { + "PROFILE_REMOVED": "Perfil eliminado", "PROFILE_SAVED": "Perfil respaldado" }, "HELP": { @@ -490,6 +504,9 @@ "UPDATE_REPLY_COMMENT": "<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> ha modificado la repuesta a su comentario sobre el referencia : <b>{{params[2]}}</b>" } }, + "CONFIRM": { + "ES_USE_FALLBACK_NODE": "Nodo de datos <b> {{old}} </ b> dirección inalcanzable o no válida.<br/><br/>¿Desea utilizar temporalmente el nodo de datos <b>{{new}}</b>?" + }, "ERROR": { "ES_CONNECTION_ERROR": "Nodo de datos <b>{{server}}</b> dirección inalcanzable o no válida.<br/><br/>Cesium continuará funcionando, <b>sin la extensión Cesium+</b> (perfiles de usuario, mensajes privados), mapas y gráficos).<br/><br/>Verifique su conexión a Internet, o cambie el nodo de datos en <a class=\"positive\" ng-click=\"doQuickFix('settings')\"> configuración de extensión </a>.", "ES_MAX_UPLOAD_BODY_SIZE": "El volumen de datos a enviar excede el lÃmite establecido por el servidor.<br/><br/>Por favor, inténtelo de nuevo después, por ejemplo, borrando fotos." diff --git a/www/plugins/es/i18n/locale-fr-FR.json b/www/plugins/es/i18n/locale-fr-FR.json index 65d75732216585a4a8e41d448881fd804dee51ec..6dfdfa65cd3c49da41b82d3aede241dcef56f2c1 100644 --- a/www/plugins/es/i18n/locale-fr-FR.json +++ b/www/plugins/es/i18n/locale-fr-FR.json @@ -134,7 +134,11 @@ "LIST": { "INBOX": "Boite de réception", "OUTBOX": "Messages envoyés", + "LAST_INBOX": "Nouveaux messages", + "LAST_OUTBOX": "Messages envoyés", + "BTN_LAST_MESSAGES": "Messages récents", "TITLE": "Messages", + "SEARCH_HELP": "Recherche dans les messages", "POPOVER_ACTIONS": { "TITLE": "Options", "DELETE_ALL": "Supprimer tous les messages" diff --git a/www/plugins/es/js/controllers/message-controllers.js b/www/plugins/es/js/controllers/message-controllers.js index d1efba343373d71fe21ac17ac22ff0ad9d71501f..73f6105b86a88628b2b8495bd35b557100d08039 100644 --- a/www/plugins/es/js/controllers/message-controllers.js +++ b/www/plugins/es/js/controllers/message-controllers.js @@ -117,12 +117,23 @@ angular.module('cesium.es.message.controllers', ['cesium.es.services']) ; -function ESMessageAbstractListController($scope, $state, $translate, $ionicHistory, $ionicPopover, $timeout, +function ESMessageAbstractListController($scope, $state, $translate, $ionicHistory, $ionicPopover, $timeout, $filter, csWallet, esModals, UIUtils, esMessage) { 'ngInject'; - $scope.loading = true; - $scope.messages = []; + var defaultSearchLimit = 40; + + $scope.search = { + loading: true, + results: [], + hasMore : false, + loadingMore : false, + limit: defaultSearchLimit, + type: 'last', + text: null, + options: { + } + }; $scope.fabButtonNewMessageId = undefined; @@ -154,28 +165,39 @@ function ESMessageAbstractListController($scope, $state, $translate, $ionicHisto return $scope.load(undefined, undefined, silent); }; - $scope.load = function(size, offset, silent) { - var options = {}; - options.from = offset || 0; - options.size = size || 20; + $scope.load = function(from, size, silent) { + + var options = angular.copy($scope.search.options); + options.from = options.from || from || 0; + options.size = options.size || size || defaultSearchLimit; options.type = $scope.type; + options.summary = false; + options.filter = ($scope.search.type == 'text' && $scope.search.text && $scope.search.text.trim().length > 0) ? + $scope.search.text : undefined; - $scope.loading = !silent; + $scope.search.loading = !silent; return esMessage.load(options) - .then(function(messages) { - $scope.messages = messages; + .then(function(res) { - UIUtils.loading.hide(); - $scope.loading = false; - - if (messages.length > 0) { - $scope.motion.show({selector: '.view-messages .list .item'}); + if (!options.from) { + $scope.search.results = res || []; + } + else if (res){ + $scope.search.results = $scope.search.results.concat(res); } + + UIUtils.loading.hide(); + $scope.search.loading = false; + $scope.search.hasMore = ($scope.search.results && $scope.search.results.length >= $scope.search.limit); + $scope.updateView(); }) .catch(function(err) { + $scope.search.loading = false; + if (!options.from) { + $scope.search.results = []; + } + $scope.search.hasMore = false; UIUtils.onError('MESSAGE.ERROR.LOAD_MESSAGES_FAILED')(err); - $scope.messages = []; - $scope.loading = false; }); }; @@ -184,16 +206,39 @@ function ESMessageAbstractListController($scope, $state, $translate, $ionicHisto $scope.load(); }; + $scope.updateView = function() { + if ($scope.motion && $scope.motion.ionListClass && $scope.search.results.length) { + $scope.motion.show({selector: '.view-messages .list .item'}); + } + }; + + $scope.showMore = function() { + $scope.search.limit = $scope.search.limit || defaultSearchLimit; + $scope.search.limit += defaultSearchLimit; + if ($scope.search.limit < defaultSearchLimit) { + $scope.search.limit = defaultSearchLimit; + } + $scope.search.loadingMore = true; + $scope.load( + $scope.search.results.length, // from + $scope.search.limit, + true /*silent*/) + .then(function() { + $scope.search.loadingMore = false; + $scope.$broadcast('scroll.infiniteScrollComplete'); + }); + }; + $scope.markAllAsRead = function() { $scope.hideActionsPopover(); - if (!$scope.messages || !$scope.messages.length) return; + if (!$scope.search.results || !$scope.search.results.length) return; UIUtils.alert.confirm('MESSAGE.CONFIRM.MARK_ALL_AS_READ') .then(function(confirm) { if (confirm) { esMessage.markAllAsRead() .then(function () { - _.forEach($scope.messages, function(msg){ + _.forEach($scope.search.results, function(msg){ msg.read = true; }); }) @@ -203,7 +248,7 @@ function ESMessageAbstractListController($scope, $state, $translate, $ionicHisto }; $scope.delete = function(index) { - var message = $scope.messages[index]; + var message = $scope.search.results[index]; if (!message) return; UIUtils.alert.confirm('MESSAGE.CONFIRM.REMOVE') @@ -211,7 +256,7 @@ function ESMessageAbstractListController($scope, $state, $translate, $ionicHisto if (confirm) { esMessage.remove(message.id, $scope.type) .then(function () { - $scope.messages.splice(index,1); // remove from messages array + $scope.search.results.splice(index,1); // remove from messages array UIUtils.toast.show('MESSAGE.INFO.MESSAGE_REMOVED'); }) .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_MESSAGE_FAILED')); @@ -221,14 +266,14 @@ function ESMessageAbstractListController($scope, $state, $translate, $ionicHisto $scope.deleteAll = function() { $scope.hideActionsPopover(); - if (!$scope.messages || !$scope.messages.length) return; + if (!$scope.search.results || !$scope.search.results.length) return; UIUtils.alert.confirm('MESSAGE.CONFIRM.REMOVE_ALL') .then(function(confirm) { if (confirm) { esMessage.removeAll($scope.type) .then(function () { - $scope.messages.splice(0,$scope.messages.length); // reset array + $scope.search.results.splice(0,$scope.search.results.length); // reset array UIUtils.toast.show('MESSAGE.INFO.All_MESSAGE_REMOVED'); }) .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_All_MESSAGES_FAILED')); @@ -236,6 +281,26 @@ function ESMessageAbstractListController($scope, $state, $translate, $ionicHisto }); }; + $scope.doSearchLast = function() { + $scope.search.type='last'; + $scope.search.loadingMore=false; + $scope.search.limit = defaultSearchLimit; + return $scope.load(); + }; + + $scope.doSearch = function() { + if (!$scope.search.text || $scope.search.text.length < 3) { + return; + } + $scope.search.type='text'; + $scope.search.loadingMore=false; + $scope.search.results = []; + $scope.search.limit = defaultSearchLimit; + + console.debug('[message] [{0}] Searching for: {1}'.format($scope.type, $scope.search.text)); + return $scope.load(); + }; + /* -- Modals -- */ $scope.showNewMessageModal = function(parameters) { @@ -250,7 +315,7 @@ function ESMessageAbstractListController($scope, $state, $translate, $ionicHisto }; $scope.showReplyModal = function(index) { - var message = $scope.messages[index]; + var message = $scope.search.results[index]; if (!message) return; $translate('MESSAGE.REPLY_TITLE_PREFIX') @@ -301,11 +366,11 @@ function ESMessageAbstractListController($scope, $state, $translate, $ionicHisto // Message deletion $scope.onMessageDelete = function(id) { - var index = _.findIndex($scope.messages, function(msg) { + var index = _.findIndex($scope.search.results, function(msg) { return msg.id == id; }); if (index) { - $scope.messages.splice(index,1); // remove from messages array + $scope.search.results.splice(index,1); // remove from messages array } }; esMessage.api.data.on.delete($scope, $scope.onMessageDelete); @@ -320,7 +385,7 @@ function ESMessageAbstractListController($scope, $state, $translate, $ionicHisto return esMessage.get(id, {type: $scope.type, summary: true}); }, 500 /*waiting ES propagation*/) .then(function(msg) { - $scope.messages.splice(0,0,msg); + $scope.search.results.splice(0,0,msg); $scope.loading = false; $scope.motion.show({selector: '.view-messages .list .item'}); }) @@ -338,12 +403,12 @@ function ESMessageAbstractListController($scope, $state, $translate, $ionicHisto // Load the the message return esMessage.get(notification.id, {type: $scope.type, summary: true}) .then(function(msg) { - $scope.messages.splice(0,0,msg); - $scope.loading = false; + $scope.search.results.splice(0,0,msg); + $scope.search.loading = false; $scope.motion.show({selector: '.view-messages .list .item'}); }) .catch(function() { - $scope.loading = false; + $scope.search.loading = false; }); }; esMessage.api.data.on.new($scope, $scope.onNewInboxMessage); @@ -351,8 +416,8 @@ function ESMessageAbstractListController($scope, $state, $translate, $ionicHisto // Watch unauth $scope.onUnauth = function() { // Reset all data - $scope.messages = undefined; - $scope.loading = false; + $scope.search.results = undefined; + $scope.search.loading = false; $scope.entered = false; }; csWallet.api.data.on.unauth($scope, $scope.onUnauth); diff --git a/www/plugins/es/js/controllers/notification-controllers.js b/www/plugins/es/js/controllers/notification-controllers.js index aa2f290073d8537fb99045db56b091448f8cfb03..f18fcfe5e61678dd291a26cf0befbc15acc57137 100644 --- a/www/plugins/es/js/controllers/notification-controllers.js +++ b/www/plugins/es/js/controllers/notification-controllers.js @@ -77,7 +77,7 @@ function NotificationsController($scope, $rootScope, $ionicPopover, $state, $tim $scope.search.loading = !silent; return esNotification.load(csWallet.data.pubkey, options) .then(function(res) { - if (!from) { + if (!options.from) { $scope.search.results = res || []; } else if (res){ @@ -89,7 +89,7 @@ function NotificationsController($scope, $rootScope, $ionicPopover, $state, $tim }) .catch(function(err) { $scope.search.loading = false; - if (!from) { + if (!options.from) { $scope.search.results = []; } $scope.search.hasMore = false; diff --git a/www/plugins/es/js/services/message-services.js b/www/plugins/es/js/services/message-services.js index 0388e4126ec802a21af3a07a854af2a3f8a380b5..f492d36d8875dcd8d8d8e28cadffe838b58253f5 100644 --- a/www/plugins/es/js/services/message-services.js +++ b/www/plugins/es/js/services/message-services.js @@ -228,8 +228,10 @@ angular.module('cesium.es.message.services', ['ngResource', 'cesium.platform', options.type = options.type || 'inbox'; options._source = fields.commons; options.summary = angular.isDefined(options.summary) ? options.summary : true; + options.filter = angular.isDefined(options.filter) ? options.filter : undefined; + options.from = options.from || 0; - return csWallet.auth() + var promise = csWallet.auth() .then(function(walletData) { // Get encrypted message (with common fields) @@ -249,11 +251,35 @@ angular.module('cesium.es.message.services', ['ngResource', 'cesium.platform', // Update message count .then(function(messages){ - csWallet.data.messages = csWallet.data.messages || {}; - csWallet.data.messages.count = messages.length; + if (messages.length && options.filter){ + var filteredMessages = filterMessages(messages, options.filter); + + // Recursive loop, if need more + if (filteredMessages.length < messages.length) { + options = angular.copy(options); + options.from += options.size; + options.size = messages.length - filteredMessages.length; + return loadMessages(options) + .then(function(messages) { + return filteredMessages.concat(messages); + }); + } + } + + if (options.from === 0 && !options.filter) { + csWallet.data.messages = csWallet.data.messages || {}; + csWallet.data.messages.count = messages.length; + } return messages; }); + + // If filter, apply sorting (only once) + if (options.from === 0 && options.filter) { + promise.then(sortFilteredMessages); + } + + return promise; } function getAndDecrypt(id, options) { @@ -471,6 +497,75 @@ angular.module('cesium.es.message.services', ['ngResource', 'cesium.platform', }); } + // Filter messages (after decryption) searching on [title, content] + function filterMessages(messages, filter) { + if (filter && !filter.trim().length) return messages; + + // Init summary, removing reply content (lines starting with '>') + messages.forEach(function(msg) { + if (msg.content) { + msg.summary = msg.content.replace(/(^|[\n\r]+)\s*>[^\n\r]*/g, '').trim() || ''; + } + }); + + // For each search words + var words = filter.trim().split(' '); + words.forEach(function(word) { + var regexp = new RegExp(word, 'gi'); + messages.forEach(function(msg) { + + // Search on title + var matches = regexp.exec(msg.title); + if (matches) { + msg.title = msg.title.replace(regexp, '<b>$&</b>'); + msg.titleMatch = (msg.titleMatch || 0) + 1; + while(true) { + matches = regexp.exec(msg.title.substring(matches.index + word.length)); + if (!matches || msg.titleMatch >= 10) break; + msg.titleMatch = msg.titleMatch + 1; + } + return; + } + + // Search on summary + matches = regexp.exec(msg.summary); + if (matches) { + if (matches.index > 140) { + msg.summary = '...' + msg.summary.substring(matches.index - 20); + } + msg.summary = msg.summary.replace(regexp, '<b>$&</b>'); + msg.contentMatch = (msg.contentMatch || 0) + 1; + while(true) { + matches = regexp.exec(msg.summary.substring(matches.index + word.length)); + if (!matches || msg.contentMatch >= 10) break; + msg.contentMatch++; + } + if (msg.summary.length > 140) { + msg.summary = msg.summary.substr(0, 137) + '...'; + } + } + }); + }); + + // Keep only matches + messages = _.filter(messages, function(msg) { + return msg.titleMatch || msg.contentMatch; + }); + + return messages; + } + + // Sort filtered messages by matches + function sortFilteredMessages(messages) { + // Sort by matches + return _.sortBy(messages, function(msg) { + return -1 * ( + 1000 * (msg.titleMatch || 0) + + 100 * (msg.contentMatch || 0) + + (msg.time / 10000000000)); + }); + } + // Send message to developers - need for issue #524 function onSendError(message) { var developers = csConfig.developers || [{pubkey: '38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE'/*kimamila*/}]; diff --git a/www/plugins/es/templates/message/list.html b/www/plugins/es/templates/message/list.html index 05ef0c536d6a6eeff45c719b99a01ad3423ab2ea..76ca49ef83f963ae6f559e06f31cddb9ed4f0978 100644 --- a/www/plugins/es/templates/message/list.html +++ b/www/plugins/es/templates/message/list.html @@ -1,17 +1,14 @@ - +<div class="padding gray" ng-if="!search.loading && !search.results.length"> + <span ng-if="search.type=='last'">{{ ('MESSAGE.NO_MESSAGE_' + type) | upper | translate }}</span> + <span ng-if="search.type=='text'" translate>COMMON.SEARCH_NO_RESULT</span> +</div> <ion-list class="{{::motion.ionListClass}}" - can-swipe="$root.device.enable" - > - - <div class="padding gray" ng-if="!messages.length"> - <span ng-if="type=='inbox'" translate>MESSAGE.NO_MESSAGE_INBOX</span> - <span ng-if="type=='outbox'" translate>MESSAGE.NO_MESSAGE_OUTBOX</span> - </div> + can-swipe="$root.device.enable"> <ion-item class="item item-border-large item-avatar item-icon-right ink" - ng-repeat="msg in messages" + ng-repeat="msg in search.results" ui-sref="app.user_view_message({type:type, id:msg.id})"> <i ng-if="::!msg.avatar" class="item-image icon" ng-class="{'ion-person': msg.uid, 'ion-email': !msg.uid}"></i> @@ -35,8 +32,8 @@ {{::msg.issuer|formatPubkey}} </a> </h3> - <h2 ng-class="{'unread': !msg.read}">{{::msg.title}}</h2> - <p>{{::msg.summary||msg.content}}</p> + <h2 ng-class="{'unread': !msg.read}" ng-bind-html="::msg.title"></h2> + <p ng-bind-html="::msg.summary||msg.content"></p> <i class="icon ion-ios-arrow-right "></i> <ion-option-button class="button-stable" ng-click="showReplyModal($index)" @@ -47,3 +44,10 @@ </ion-item> </ion-list> + +<ion-infinite-scroll + ng-if="!search.loading && search.hasMore" + icon="ion-loading-c" + on-infinite="showMore()" + distance="10%"> +</ion-infinite-scroll> diff --git a/www/plugins/es/templates/message/lookup.html b/www/plugins/es/templates/message/lookup.html index 2d38aa3a1ae7d97d1adbb465cadc210d2844bd62..56252f311853daf7bc50172c9c33f88fee31f0e3 100644 --- a/www/plugins/es/templates/message/lookup.html +++ b/www/plugins/es/templates/message/lookup.html @@ -14,5 +14,4 @@ </ion-tabs> - </ion-view> diff --git a/www/plugins/es/templates/message/lookup_lg.html b/www/plugins/es/templates/message/lookup_lg.html index 82e582dc8ad5c936e77305ca4b748760353eb7bf..499b4e910672809df328c87f66435fb8522642a8 100644 --- a/www/plugins/es/templates/message/lookup_lg.html +++ b/www/plugins/es/templates/message/lookup_lg.html @@ -26,14 +26,14 @@ {{'MESSAGE.BTN_COMPOSE' | translate}} </button> - <button class="button button-stable icon-right ink" - ng-click="showActionsPopover($event)"> - <i class="icon ion-android-more-vertical"></i> - {{'COMMON.BTN_OPTIONS' | translate}} + <button class="button button-stable button-small-padding icon ion-android-more-vertical" + ng-click="showActionsPopover($event)" + title="{{'COMMON.POPOVER_ACTIONS_TITLE' | translate}}"> </button> - </div> + </div> + <!-- button tabs --> <div class="buttons-tabs border-bottom hidden-sm hidden-xs"> <div class="pull-right"> @@ -56,16 +56,69 @@ {{'MESSAGE.LIST.OUTBOX' | translate}} </a> </div> + </div> + <div class="item no-padding"> + <div class="item-input "> + <i class="icon ion-search placeholder-icon"></i> + + <input type="text" + class="visible-xs visible-sm" + placeholder="{{'MESSAGE.LIST.SEARCH_HELP'|translate}}" + ng-model="search.text" + ng-model-options="{ debounce: 650 }" + ng-change="doSearch()" + on-return="doSearch()" + select-on-click> + <input type="text" + class="hidden-xs hidden-sm" + placeholder="{{'MESSAGE.LIST.SEARCH_HELP'|translate}}" + ng-model="search.text" + on-return="doSearch()"> + <div class="helptip-anchor-center"> + <a id="helptip-message-search-text"></a> + </div> + </div> </div> + <div class="padding-top hidden-xs" style="display: block; height: 60px;"> + + <div class="pull-left" ng-if="!search.loading"> + <ng-if ng-if="search.type=='last'"> + <h4>{{ ('MESSAGE.LIST.LAST_' + type) | upper | translate}}</h4> + <!--<small class="gray no-padding" ng-if="search.total">{{'WOT.LOOKUP.NEWCOMERS_COUNT'|translate:{count: search.total} }}</small>--> + </ng-if> + <ng-if ng-if="search.type=='text'"> + <h4 translate>COMMON.RESULTS_LIST</h4> + <!--<small class="gray no-padding" ng-if="search.total">{{'WOT.LOOKUP.PENDING_COUNT'|translate:{count: search.total} }}</small>--> + </ng-if> + </div> + + <div class="pull-right hidden-xs hidden-sm"> + <a class="button button-text button-small ink" + ng-class="{'button-text-positive': search.type=='last'}" + ng-click="doSearchLast()"> + <i class="icon ion-clock"></i> + {{'MESSAGE.LIST.BTN_LAST_MESSAGES' | translate}} + </a> + + <!-- Allow extension here --> + <cs-extension-point name="filter-buttons"></cs-extension-point> + + <button class="button button-small button-stable ink" + ng-click="doSearch()"> + {{'COMMON.BTN_SEARCH' | translate}} + </button> + + </div> + </div> - <div class="center padding" ng-if="loading"> + <div class="center padding" ng-if="search.loading"> <ion-spinner icon="android"></ion-spinner> </div> <!-- list --> - <ng-include src="'plugins/es/templates/message/list.html'" ng-hide="loading"></ng-include> + <ng-include src="'plugins/es/templates/message/list.html'"></ng-include> </ion-content> diff --git a/www/plugins/es/templates/message/tabs/tab_list.html b/www/plugins/es/templates/message/tabs/tab_list.html index 6ffbb19d6d96bf116fae5cebe45627b0d0884086..073af86260350e036e013e69017f8a609efae988 100644 --- a/www/plugins/es/templates/message/tabs/tab_list.html +++ b/www/plugins/es/templates/message/tabs/tab_list.html @@ -19,8 +19,8 @@ <!-- list --> <ng-include src="'plugins/es/templates/message/list.html'"></ng-include> - </ion-content> + </ion-content> <!-- fab button --> <div class="visible-xs visible-sm" >