Skip to content

Commit

Permalink
Merge pull request NginxProxyManager#1822 from ivankristianto/add-sea…
Browse files Browse the repository at this point in the history
…rch-feature-redirection

Add Search Feature To Backend Administration
  • Loading branch information
jc21 authored Feb 17, 2022
2 parents 7281ed5 + 8eb44c4 commit 14b889a
Show file tree
Hide file tree
Showing 18 changed files with 490 additions and 203 deletions.
10 changes: 5 additions & 5 deletions backend/internal/certificate.js
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ const internalCertificate = {
zipFiles(source, out) {
const archive = archiver('zip', { zlib: { level: 9 } });
const stream = fs.createWriteStream(out);

return new Promise((resolve, reject) => {
source
.map((fl) => {
Expand All @@ -399,7 +399,7 @@ const internalCertificate = {
archive
.on('error', (err) => reject(err))
.pipe(stream);

stream.on('close', () => resolve());
archive.finalize();
});
Expand Down Expand Up @@ -477,7 +477,7 @@ const internalCertificate = {
// Query is used for searching
if (typeof search_query === 'string') {
query.where(function () {
this.where('name', 'like', '%' + search_query + '%');
this.where('nice_name', 'like', '%' + search_query + '%');
});
}

Expand Down Expand Up @@ -1140,7 +1140,7 @@ const internalCertificate = {
if (domains.length === 0) {
throw new error.InternalValidationError('No domains provided');
}

// Create a test challenge file
const testChallengeDir = '/data/letsencrypt-acme-challenge/.well-known/acme-challenge';
const testChallengeFile = testChallengeDir + '/test-challenge';
Expand Down Expand Up @@ -1215,7 +1215,7 @@ const internalCertificate = {

// Remove the test challenge file
fs.unlinkSync(testChallengeFile);

return results;
}
};
Expand Down
10 changes: 10 additions & 0 deletions frontend/js/app/audit-log/main.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,16 @@
<div class="card-status bg-teal"></div>
<div class="card-header">
<h3 class="card-title"><%- i18n('audit-log', 'title') %></h3>
<div class="card-options">
<form class="search-form" role="search">
<div class="input-icon">
<span class="input-icon-addon">
<i class="fe fe-search"></i>
</span>
<input name="source-query" type="text" value="" class="form-control form-control-sm" placeholder="<%- i18n('audit-log', 'search') %>" aria-label="<%- i18n('audit-log', 'search') %>">
</div>
</form>
</div>
</div>
<div class="card-body no-padding min-100">
<div class="dimmer active">
Expand Down
65 changes: 47 additions & 18 deletions frontend/js/app/audit-log/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,39 +12,68 @@ module.exports = Mn.View.extend({

ui: {
list_region: '.list-region',
dimmer: '.dimmer'
dimmer: '.dimmer',
search: '.search-form',
query: 'input[name="source-query"]'
},

fetch: App.Api.AuditLog.getAll,

showData: function(response) {
this.showChildView('list_region', new ListView({
collection: new AuditLogModel.Collection(response)
}));
},

showError: function(err) {
this.showChildView('list_region', new ErrorView({
code: err.code,
message: err.message,
retry: function () {
App.Controller.showAuditLog();
}
}));

console.error(err);
},

showEmpty: function() {
this.showChildView('list_region', new EmptyView({
title: App.i18n('audit-log', 'empty'),
subtitle: App.i18n('audit-log', 'empty-subtitle')
}));
},

regions: {
list_region: '@ui.list_region'
},

events: {
'submit @ui.search': function (e) {
e.preventDefault();
let query = this.ui.query.val();

this.fetch(['user'], query)
.then(response => this.showData(response))
.catch(err => {
this.showError(err);
});
}
},

onRender: function () {
let view = this;

App.Api.AuditLog.getAll(['user'])
view.fetch(['user'])
.then(response => {
if (!view.isDestroyed() && response && response.length) {
view.showChildView('list_region', new ListView({
collection: new AuditLogModel.Collection(response)
}));
view.showData(response);
} else {
view.showChildView('list_region', new EmptyView({
title: App.i18n('audit-log', 'empty'),
subtitle: App.i18n('audit-log', 'empty-subtitle')
}));
view.showEmpty();
}
})
.catch(err => {
view.showChildView('list_region', new ErrorView({
code: err.code,
message: err.message,
retry: function () {
App.Controller.showAuditLog();
}
}));

console.error(err);
view.showError(err);
})
.then(() => {
view.ui.dimmer.removeClass('active');
Expand Down
8 changes: 8 additions & 0 deletions frontend/js/app/nginx/access/main.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
<div class="card-header">
<h3 class="card-title"><%- i18n('access-lists', 'title') %></h3>
<div class="card-options">
<form class="search-form" role="search">
<div class="input-icon">
<span class="input-icon-addon">
<i class="fe fe-search"></i>
</span>
<input name="source-query" type="text" value="" class="form-control form-control-sm" placeholder="<%- i18n('access-lists', 'search') %>" aria-label="<%- i18n('access-lists', 'search') %>">
</div>
</form>
<a href="#" class="btn btn-outline-secondary btn-sm ml-2 help"><i class="fe fe-help-circle"></i></a>
<% if (showAddButton) { %>
<a href="#" class="btn btn-outline-teal btn-sm ml-2 add-item"><%- i18n('access-lists', 'add') %></a>
Expand Down
79 changes: 53 additions & 26 deletions frontend/js/app/nginx/access/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,44 @@ module.exports = Mn.View.extend({
list_region: '.list-region',
add: '.add-item',
help: '.help',
dimmer: '.dimmer'
dimmer: '.dimmer',
search: '.search-form',
query: 'input[name="source-query"]'
},

fetch: App.Api.Nginx.AccessLists.getAll,

showData: function(response) {
this.showChildView('list_region', new ListView({
collection: new AccessListModel.Collection(response)
}));
},

showError: function(err) {
this.showChildView('list_region', new ErrorView({
code: err.code,
message: err.message,
retry: function () {
App.Controller.showNginxAccess();
}
}));

console.error(err);
},

showEmpty: function() {
let manage = App.Cache.User.canManage('access_lists');

this.showChildView('list_region', new EmptyView({
title: App.i18n('access-lists', 'empty'),
subtitle: App.i18n('all-hosts', 'empty-subtitle', {manage: manage}),
link: manage ? App.i18n('access-lists', 'add') : null,
btn_color: 'teal',
permission: 'access_lists',
action: function () {
App.Controller.showNginxAccessListForm();
}
}));
},

regions: {
Expand All @@ -30,6 +67,17 @@ module.exports = Mn.View.extend({
'click @ui.help': function (e) {
e.preventDefault();
App.Controller.showHelp(App.i18n('access-lists', 'help-title'), App.i18n('access-lists', 'help-content'));
},

'submit @ui.search': function (e) {
e.preventDefault();
let query = this.ui.query.val();

this.fetch(['owner', 'items', 'clients'], query)
.then(response => this.showData(response))
.catch(err => {
this.showError(err);
});
}
},

Expand All @@ -40,39 +88,18 @@ module.exports = Mn.View.extend({
onRender: function () {
let view = this;

App.Api.Nginx.AccessLists.getAll(['owner', 'items', 'clients'])
view.fetch(['owner', 'items', 'clients'])
.then(response => {
if (!view.isDestroyed()) {
if (response && response.length) {
view.showChildView('list_region', new ListView({
collection: new AccessListModel.Collection(response)
}));
view.showData(response);
} else {
let manage = App.Cache.User.canManage('access_lists');

view.showChildView('list_region', new EmptyView({
title: App.i18n('access-lists', 'empty'),
subtitle: App.i18n('all-hosts', 'empty-subtitle', {manage: manage}),
link: manage ? App.i18n('access-lists', 'add') : null,
btn_color: 'teal',
permission: 'access_lists',
action: function () {
App.Controller.showNginxAccessListForm();
}
}));
view.showEmpty();
}
}
})
.catch(err => {
view.showChildView('list_region', new ErrorView({
code: err.code,
message: err.message,
retry: function () {
App.Controller.showNginxAccess();
}
}));

console.error(err);
view.showError(err);
})
.then(() => {
view.ui.dimmer.removeClass('active');
Expand Down
8 changes: 8 additions & 0 deletions frontend/js/app/nginx/certificates/main.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
<div class="card-header">
<h3 class="card-title"><%- i18n('certificates', 'title') %></h3>
<div class="card-options">
<form class="search-form" role="search">
<div class="input-icon">
<span class="input-icon-addon">
<i class="fe fe-search"></i>
</span>
<input name="source-query" type="text" value="" class="form-control form-control-sm" placeholder="<%- i18n('certificates', 'search') %>" aria-label="<%- i18n('certificates', 'search') %>">
</div>
</form>
<a href="#" class="btn btn-outline-secondary btn-sm ml-2 help"><i class="fe fe-help-circle"></i></a>
<% if (showAddButton) { %>
<div class="dropdown">
Expand Down
79 changes: 53 additions & 26 deletions frontend/js/app/nginx/certificates/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,44 @@ module.exports = Mn.View.extend({
list_region: '.list-region',
add: '.add-item',
help: '.help',
dimmer: '.dimmer'
dimmer: '.dimmer',
search: '.search-form',
query: 'input[name="source-query"]'
},

fetch: App.Api.Nginx.Certificates.getAll,

showData: function(response) {
this.showChildView('list_region', new ListView({
collection: new CertificateModel.Collection(response)
}));
},

showError: function(err) {
this.showChildView('list_region', new ErrorView({
code: err.code,
message: err.message,
retry: function () {
App.Controller.showNginxCertificates();
}
}));

console.error(err);
},

showEmpty: function() {
let manage = App.Cache.User.canManage('certificates');

this.showChildView('list_region', new EmptyView({
title: App.i18n('certificates', 'empty'),
subtitle: App.i18n('all-hosts', 'empty-subtitle', {manage: manage}),
link: manage ? App.i18n('certificates', 'add') : null,
btn_color: 'pink',
permission: 'certificates',
action: function () {
App.Controller.showNginxCertificateForm();
}
}));
},

regions: {
Expand All @@ -31,6 +68,17 @@ module.exports = Mn.View.extend({
'click @ui.help': function (e) {
e.preventDefault();
App.Controller.showHelp(App.i18n('certificates', 'help-title'), App.i18n('certificates', 'help-content'));
},

'submit @ui.search': function (e) {
e.preventDefault();
let query = this.ui.query.val();

this.fetch(['owner'], query)
.then(response => this.showData(response))
.catch(err => {
this.showError(err);
});
}
},

Expand All @@ -41,39 +89,18 @@ module.exports = Mn.View.extend({
onRender: function () {
let view = this;

App.Api.Nginx.Certificates.getAll(['owner'])
view.fetch(['owner'])
.then(response => {
if (!view.isDestroyed()) {
if (response && response.length) {
view.showChildView('list_region', new ListView({
collection: new CertificateModel.Collection(response)
}));
view.showData(response);
} else {
let manage = App.Cache.User.canManage('certificates');

view.showChildView('list_region', new EmptyView({
title: App.i18n('certificates', 'empty'),
subtitle: App.i18n('all-hosts', 'empty-subtitle', {manage: manage}),
link: manage ? App.i18n('certificates', 'add') : null,
btn_color: 'pink',
permission: 'certificates',
action: function () {
App.Controller.showNginxCertificateForm();
}
}));
view.showEmpty();
}
}
})
.catch(err => {
view.showChildView('list_region', new ErrorView({
code: err.code,
message: err.message,
retry: function () {
App.Controller.showNginxCertificates();
}
}));

console.error(err);
view.showError(err);
})
.then(() => {
view.ui.dimmer.removeClass('active');
Expand Down
Loading

0 comments on commit 14b889a

Please sign in to comment.