From 862908d0eb7ba647922f2b5c3bb34661d73cd951 Mon Sep 17 00:00:00 2001
From: Peter Jaszkowiak
Date: Thu, 8 Dec 2016 19:40:57 -0700
Subject: [PATCH] ACP search and title improvements
- Search uses translated titles if available
- Use `advanced` for `development` route titles
- Remove route title from showing up in results
- Highlight matching part of result title
- Don't show empty result contents when only title is matched
---
public/language/en-GB/admin/menu.json | 1 +
public/src/admin/admin.js | 11 +++++----
public/src/admin/modules/search.js | 26 +++++++++++----------
src/admin/search.js | 33 ++++++++++++++++++++-------
4 files changed, 46 insertions(+), 25 deletions(-)
diff --git a/public/language/en-GB/admin/menu.json b/public/language/en-GB/admin/menu.json
index 1db5c15abf..7a5327f643 100644
--- a/public/language/en-GB/admin/menu.json
+++ b/public/language/en-GB/admin/menu.json
@@ -58,6 +58,7 @@
"advanced/errors": "Errors",
"advanced/cache": "Cache",
"development/logger": "Logger",
+ "development/info": "Info",
"reload-forum": "Reload Forum",
"restart-forum": "Restart Forum",
diff --git a/public/src/admin/admin.js b/public/src/admin/admin.js
index 6dabcb9f38..217438e146 100644
--- a/public/src/admin/admin.js
+++ b/public/src/admin/admin.js
@@ -116,13 +116,14 @@
});
});
- var title;
- if (/admin\/general\/dashboard$/.test(url)) {
+ var title = url;
+ if (/admin\/general\/dashboard$/.test(title)) {
title = '[[admin/menu:general/dashboard]]';
} else {
- title = url.match(/admin\/(.+?)\/(.+?)$/);
- title = '[[admin/menu:section-' + title[1] + ']]' +
- (title[2] ? (' > [[admin/menu:' +
+ title = title.match(/admin\/(.+?)\/(.+?)$/);
+ title = '[[admin/menu:section-' +
+ (title[1] === 'development' ? 'advanced' : title[1]) +
+ ']]' + (title[2] ? (' > [[admin/menu:' +
title[1] + '/' + title[2] + ']]') : '');
}
diff --git a/public/src/admin/modules/search.js b/public/src/admin/modules/search.js
index 4f46898b8e..29379f0dac 100644
--- a/public/src/admin/modules/search.js
+++ b/public/src/admin/modules/search.js
@@ -4,39 +4,41 @@
define('admin/modules/search', ['mousetrap'], function (mousetrap) {
var search = {};
- function nsToTitle(namespace) {
- return namespace.replace('admin/', '').split('/').map(function (str) {
- return str[0].toUpperCase() + str.slice(1);
- }).join(' > ');
- }
-
function find(dict, term) {
var html = dict.filter(function (elem) {
return elem.translations.toLowerCase().includes(term);
}).map(function (params) {
var namespace = params.namespace;
var translations = params.translations;
- var title = params.title == null ? nsToTitle(namespace) : params.title;
+ var title = params.title;
var results = translations
// remove all lines without a match
.replace(new RegExp('^(?:(?!' + term + ').)*$', 'gmi'), '')
- // get up to 25 characaters of context on both sides of the match
+ // remove lines that only match the title
+ .replace(new RegExp('(^|\\n).*?' + title + '.*?(\\n|$)', 'g'), '')
+ // get up to 25 characters of context on both sides of the match
// and wrap the match in a `.search-match` element
.replace(
new RegExp('^[\\s\\S]*?(.{0,25})(' + term + ')(.{0,25})[\\s\\S]*?$', 'gmi'),
'...$1$2$3...
'
)
// collapse whitespace
- .replace(/(?:\n ?)+/g, '\n');
+ .replace(/(?:\n ?)+/g, '\n')
+ .trim();
+
+ title = title.replace(
+ new RegExp('(^.*?)(' + term + ')(.*?$)', 'gi'),
+ '$1$2$3'
+ );
return '' +
'' +
title +
- '
' +
- '' +
+ '
' + (!results ? '' :
+ ('' +
results +
- '' +
+ '')) +
'' +
'';
}).join('');
diff --git a/src/admin/search.js b/src/admin/search.js
index 8f567071bf..0bd140e3ba 100644
--- a/src/admin/search.js
+++ b/src/admin/search.js
@@ -54,7 +54,7 @@ function simplify(translations) {
function nsToTitle(namespace) {
return namespace.replace('admin/', '').split('/').map(function (str) {
return str[0].toUpperCase() + str.slice(1);
- }).join(' > ');
+ }).join(' > ').replace(/[^a-zA-Z> ]/g, ' ');
}
var fallbackCacheInProgress = {};
@@ -67,15 +67,17 @@ function initFallback(namespace, callback) {
}
var template = file.toString();
+ var title = nsToTitle(namespace);
var translations = sanitize(template);
translations = Translator.removePatterns(translations);
translations = simplify(translations);
- translations += '\n' + nsToTitle(namespace);
+ translations += '\n' + title;
callback(null, {
namespace: namespace,
translations: translations,
+ title: title,
});
});
}
@@ -124,17 +126,32 @@ function initDict(language, callback) {
var str = Object.keys(translations).map(function (key) {
return translations[key];
}).join('\n');
+ str = sanitize(str);
- next(null, {
- namespace: namespace,
- translations: str,
- });
- }
+ var title = namespace;
+ if (/admin\/general\/dashboard$/.test(title)) {
+ title = '[[admin/menu:general/dashboard]]';
+ } else {
+ title = title.match(/admin\/(.+?)\/(.+?)$/);
+ title = '[[admin/menu:section-' +
+ (title[1] === 'development' ? 'advanced' : title[1]) +
+ ']]' + (title[2] ? (' > [[admin/menu:' +
+ title[1] + '/' + title[2] + ']]') : '');
+ }
+
+ Translator.create(language).translate(title).then(function (title) {
+ next(null, {
+ namespace: namespace,
+ translations: str + '\n' + title,
+ title: title,
+ });
+ }).catch(err);
+ },
], function (err, params) {
if (err) {
return fallback(namespace, function (err, params) {
if (err) {
- return cb({
+ return cb(null, {
namespace: namespace,
translations: '',
});