mirror of
https://github.com/jc21/nginx-proxy-manager.git
synced 2024-08-30 18:22:48 +00:00
Contextual host type colors
This commit is contained in:
parent
54d220a191
commit
0455920355
@ -16,6 +16,7 @@
|
|||||||
"file-loader": "^1.1.11",
|
"file-loader": "^1.1.11",
|
||||||
"imports-loader": "^0.8.0",
|
"imports-loader": "^0.8.0",
|
||||||
"jquery": "^3.3.1",
|
"jquery": "^3.3.1",
|
||||||
|
"jquery-mask-plugin": "^1.14.15",
|
||||||
"jquery-serializejson": "^2.8.1",
|
"jquery-serializejson": "^2.8.1",
|
||||||
"mini-css-extract-plugin": "^0.4.0",
|
"mini-css-extract-plugin": "^0.4.0",
|
||||||
"moment": "^2.22.2",
|
"moment": "^2.22.2",
|
||||||
|
@ -42,7 +42,7 @@ module.exports = {
|
|||||||
/**
|
/**
|
||||||
* User Form
|
* User Form
|
||||||
*
|
*
|
||||||
* @param model
|
* @param [model]
|
||||||
*/
|
*/
|
||||||
showUserForm: function (model) {
|
showUserForm: function (model) {
|
||||||
if (Cache.User.isAdmin()) {
|
if (Cache.User.isAdmin()) {
|
||||||
@ -134,6 +134,19 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Nginx Proxy Host Form
|
||||||
|
*
|
||||||
|
* @param [model]
|
||||||
|
*/
|
||||||
|
showNginxProxyForm: function (model) {
|
||||||
|
if (Cache.User.isAdmin() || Cache.User.canManage('proxy_hosts')) {
|
||||||
|
require(['./main', './nginx/proxy/form'], function (App, View) {
|
||||||
|
App.UI.showModalDialog(new View({model: model}));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Nginx Redirection Hosts
|
* Nginx Redirection Hosts
|
||||||
*/
|
*/
|
||||||
|
@ -7,5 +7,5 @@ if (subtitle) { %>
|
|||||||
<% }
|
<% }
|
||||||
|
|
||||||
if (link) { %>
|
if (link) { %>
|
||||||
<a class="btn btn-teal" href="#"><%- link %></a>
|
<a class="btn btn-<%- btn_color %>" href="#"><%- link %></a>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
@ -7,6 +7,10 @@ module.exports = Mn.View.extend({
|
|||||||
className: 'text-center m-7',
|
className: 'text-center m-7',
|
||||||
template: template,
|
template: template,
|
||||||
|
|
||||||
|
options: {
|
||||||
|
btn_color: 'teal'
|
||||||
|
},
|
||||||
|
|
||||||
ui: {
|
ui: {
|
||||||
action: 'a'
|
action: 'a'
|
||||||
},
|
},
|
||||||
@ -20,10 +24,11 @@ module.exports = Mn.View.extend({
|
|||||||
|
|
||||||
templateContext: function () {
|
templateContext: function () {
|
||||||
return {
|
return {
|
||||||
title: this.getOption('title'),
|
title: this.getOption('title'),
|
||||||
subtitle: this.getOption('subtitle'),
|
subtitle: this.getOption('subtitle'),
|
||||||
link: this.getOption('link'),
|
link: this.getOption('link'),
|
||||||
action: typeof this.getOption('action') === 'function'
|
action: typeof this.getOption('action') === 'function',
|
||||||
|
btn_color: this.getOption('btn_color')
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
|
<div class="card-status bg-danger"></div>
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h3 class="card-title">404 Hosts</h3>
|
<h3 class="card-title">404 Hosts</h3>
|
||||||
<div class="card-options">
|
<div class="card-options">
|
||||||
<a href="#" class="btn btn-outline-teal btn-sm ml-2 add-item">Add 404 Host</a>
|
<a href="#" class="btn btn-outline-danger btn-sm ml-2 add-item">Add 404 Host</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body no-padding min-100">
|
<div class="card-body no-padding min-100">
|
||||||
|
@ -42,10 +42,11 @@ module.exports = Mn.View.extend({
|
|||||||
}));
|
}));
|
||||||
} else {
|
} else {
|
||||||
view.showChildView('list_region', new EmptyView({
|
view.showChildView('list_region', new EmptyView({
|
||||||
title: 'There are no 404 Hosts',
|
title: 'There are no 404 Hosts',
|
||||||
subtitle: 'Why don\'t you create one?',
|
subtitle: 'Why don\'t you create one?',
|
||||||
link: 'Add 404 Host',
|
link: 'Add 404 Host',
|
||||||
action: function () {
|
btn_color: 'danger',
|
||||||
|
action: function () {
|
||||||
Controller.showNginxDeadForm();
|
Controller.showNginxDeadForm();
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
34
src/frontend/js/app/nginx/proxy/form.ejs
Normal file
34
src/frontend/js/app/nginx/proxy/form.ejs
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title"><% if (typeof id !== 'undefined') { %>Edit<% } else { %>New<% } %> Proxy Host</h5>
|
||||||
|
<button type="button" class="close cancel" aria-label="Close" data-dismiss="modal"> </button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<form>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12 col-md-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label">Domain Name <span class="form-required">*</span></label>
|
||||||
|
<input name="domain_name" type="text" class="form-control" placeholder="example.com" value="<%- domain_name %>" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-8 col-md-8">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label">Forward IP <span class="form-required">*</span></label>
|
||||||
|
<input type="text" name="forward_ip" class="form-control" placeholder="000.000.000.000" autocomplete="off" maxlength="15" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-4 col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label">Forward Port <span class="form-required">*</span></label>
|
||||||
|
<input name="forward_port" type="number" class="form-control" placeholder="80" value="<%- forward_port %>" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary cancel" data-dismiss="modal">Cancel</button>
|
||||||
|
<button type="button" class="btn btn-teal save">Save</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
98
src/frontend/js/app/nginx/proxy/form.js
Normal file
98
src/frontend/js/app/nginx/proxy/form.js
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const Mn = require('backbone.marionette');
|
||||||
|
const template = require('./form.ejs');
|
||||||
|
const Controller = require('../../controller');
|
||||||
|
const Cache = require('../../cache');
|
||||||
|
const Api = require('../../api');
|
||||||
|
const App = require('../../main');
|
||||||
|
const ProxyHostModel = require('../../../models/proxy-host');
|
||||||
|
|
||||||
|
require('jquery-serializejson');
|
||||||
|
require('jquery-mask-plugin');
|
||||||
|
|
||||||
|
module.exports = Mn.View.extend({
|
||||||
|
template: template,
|
||||||
|
className: 'modal-dialog',
|
||||||
|
|
||||||
|
ui: {
|
||||||
|
form: 'form',
|
||||||
|
forward_ip: 'input[name="forward_ip"]',
|
||||||
|
buttons: '.modal-footer button',
|
||||||
|
cancel: 'button.cancel',
|
||||||
|
save: 'button.save',
|
||||||
|
error: '.secret-error'
|
||||||
|
},
|
||||||
|
|
||||||
|
events: {
|
||||||
|
|
||||||
|
'click @ui.save': function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.ui.error.hide();
|
||||||
|
let view = this;
|
||||||
|
let data = this.ui.form.serializeJSON();
|
||||||
|
|
||||||
|
// Manipulate
|
||||||
|
data.roles = [];
|
||||||
|
if ((this.model.get('id') === Cache.User.get('id') && this.model.isAdmin()) || (typeof data.is_admin !== 'undefined' && data.is_admin)) {
|
||||||
|
data.roles.push('admin');
|
||||||
|
delete data.is_admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
data.is_disabled = typeof data.is_disabled !== 'undefined' ? !!data.is_disabled : false;
|
||||||
|
this.ui.buttons.prop('disabled', true).addClass('btn-disabled');
|
||||||
|
let method = Api.Users.create;
|
||||||
|
|
||||||
|
if (this.model.get('id')) {
|
||||||
|
// edit
|
||||||
|
method = Api.Users.update;
|
||||||
|
data.id = this.model.get('id');
|
||||||
|
}
|
||||||
|
|
||||||
|
method(data)
|
||||||
|
.then(result => {
|
||||||
|
if (result.id === Cache.User.get('id')) {
|
||||||
|
Cache.User.set(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (view.model.get('id') !== Cache.User.get('id')) {
|
||||||
|
Controller.showUsers();
|
||||||
|
}
|
||||||
|
|
||||||
|
view.model.set(result);
|
||||||
|
App.UI.closeModal(function () {
|
||||||
|
if (method === Api.Users.create) {
|
||||||
|
// Show permissions dialog immediately
|
||||||
|
Controller.showUserPermissions(view.model);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
this.ui.error.text(err.message).show();
|
||||||
|
this.ui.buttons.prop('disabled', false).removeClass('btn-disabled');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onRender: function () {
|
||||||
|
this.ui.forward_ip.mask('099.099.099.099', {
|
||||||
|
clearIfNotMatch: true,
|
||||||
|
placeholder: '000.000.000.000'
|
||||||
|
});
|
||||||
|
/*
|
||||||
|
this.ui.forward_ip.mask('099.099.099.099', {
|
||||||
|
reverse: true,
|
||||||
|
clearIfNotMatch: true,
|
||||||
|
placeholder: '000.000.000.000'
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
},
|
||||||
|
|
||||||
|
initialize: function (options) {
|
||||||
|
if (typeof options.model === 'undefined' || !options.model) {
|
||||||
|
this.model = new ProxyHostModel.Model();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
@ -1,8 +1,9 @@
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
|
<div class="card-status bg-success"></div>
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h3 class="card-title">Proxy Hosts</h3>
|
<h3 class="card-title">Proxy Hosts</h3>
|
||||||
<div class="card-options">
|
<div class="card-options">
|
||||||
<a href="#" class="btn btn-outline-teal btn-sm ml-2 add-item">Add Proxy Host</a>
|
<a href="#" class="btn btn-outline-success btn-sm ml-2 add-item">Add Proxy Host</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body no-padding min-100">
|
<div class="card-body no-padding min-100">
|
||||||
|
@ -42,10 +42,11 @@ module.exports = Mn.View.extend({
|
|||||||
}));
|
}));
|
||||||
} else {
|
} else {
|
||||||
view.showChildView('list_region', new EmptyView({
|
view.showChildView('list_region', new EmptyView({
|
||||||
title: 'There are no Proxy Hosts',
|
title: 'There are no Proxy Hosts',
|
||||||
subtitle: 'Why don\'t you create one?',
|
subtitle: 'Why don\'t you create one?',
|
||||||
link: 'Add Proxy Host',
|
link: 'Add Proxy Host',
|
||||||
action: function () {
|
btn_color: 'success',
|
||||||
|
action: function () {
|
||||||
Controller.showNginxProxyForm();
|
Controller.showNginxProxyForm();
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
|
<div class="card-status bg-yellow"></div>
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h3 class="card-title">Redirection Hosts</h3>
|
<h3 class="card-title">Redirection Hosts</h3>
|
||||||
<div class="card-options">
|
<div class="card-options">
|
||||||
<a href="#" class="btn btn-outline-teal btn-sm ml-2 add-item">Add Redirection Host</a>
|
<a href="#" class="btn btn-outline-yellow btn-sm ml-2 add-item">Add Redirection Host</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body no-padding min-100">
|
<div class="card-body no-padding min-100">
|
||||||
|
@ -42,10 +42,11 @@ module.exports = Mn.View.extend({
|
|||||||
}));
|
}));
|
||||||
} else {
|
} else {
|
||||||
view.showChildView('list_region', new EmptyView({
|
view.showChildView('list_region', new EmptyView({
|
||||||
title: 'There are no Redirection Hosts',
|
title: 'There are no Redirection Hosts',
|
||||||
subtitle: 'Why don\'t you create one?',
|
subtitle: 'Why don\'t you create one?',
|
||||||
link: 'Add Redirection Host',
|
link: 'Add Redirection Host',
|
||||||
action: function () {
|
btn_color: 'yellow',
|
||||||
|
action: function () {
|
||||||
Controller.showNginxRedirectionForm();
|
Controller.showNginxRedirectionForm();
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
|
<div class="card-status bg-blue"></div>
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h3 class="card-title">Streams</h3>
|
<h3 class="card-title">Streams</h3>
|
||||||
<div class="card-options">
|
<div class="card-options">
|
||||||
<a href="#" class="btn btn-outline-teal btn-sm ml-2 add-item">Add Stream</a>
|
<a href="#" class="btn btn-outline-blue btn-sm ml-2 add-item">Add Stream</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body no-padding min-100">
|
<div class="card-body no-padding min-100">
|
||||||
|
@ -42,10 +42,11 @@ module.exports = Mn.View.extend({
|
|||||||
}));
|
}));
|
||||||
} else {
|
} else {
|
||||||
view.showChildView('list_region', new EmptyView({
|
view.showChildView('list_region', new EmptyView({
|
||||||
title: 'There are no Streams',
|
title: 'There are no Streams',
|
||||||
subtitle: 'Why don\'t you create one?',
|
subtitle: 'Why don\'t you create one?',
|
||||||
link: 'Add Stream',
|
link: 'Add Stream',
|
||||||
action: function () {
|
btn_color: 'blue',
|
||||||
|
action: function () {
|
||||||
Controller.showNginxStreamForm();
|
Controller.showNginxStreamForm();
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
@ -12,8 +12,8 @@ const model = Backbone.Model.extend({
|
|||||||
owner: null,
|
owner: null,
|
||||||
domain_name: '',
|
domain_name: '',
|
||||||
forward_ip: '',
|
forward_ip: '',
|
||||||
forward_port: 0,
|
forward_port: null,
|
||||||
access_list_id: 0,
|
access_list_id: null,
|
||||||
ssl_enabled: false,
|
ssl_enabled: false,
|
||||||
ssl_provider: false,
|
ssl_provider: false,
|
||||||
ssl_forced: false,
|
ssl_forced: false,
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
$teal: #2bcbba;
|
$teal: #2bcbba;
|
||||||
|
$yellow: #f1c40f;
|
||||||
|
$blue: #467fcf;
|
||||||
|
|
||||||
/* For Card bodies where I don't want padding */
|
/* For Card bodies where I don't want padding */
|
||||||
.card-body.no-padding {
|
.card-body.no-padding {
|
||||||
@ -25,6 +27,48 @@ $teal: #2bcbba;
|
|||||||
border-color: $teal;
|
border-color: $teal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Yellow Outline Buttons */
|
||||||
|
.btn-outline-yellow {
|
||||||
|
color: $yellow;
|
||||||
|
background-color: transparent;
|
||||||
|
background-image: none;
|
||||||
|
border-color: $yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline-yellow:hover {
|
||||||
|
color: #fff;
|
||||||
|
background-color: $yellow;
|
||||||
|
border-color: $yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline-yellow:not(:disabled):not(.disabled):active, .btn-outline-yellow:not(:disabled):not(.disabled).active, .show > .btn-outline-yellow.dropdown-toggle {
|
||||||
|
color: #fff;
|
||||||
|
background-color: $yellow;
|
||||||
|
border-color: $yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Blue Outline Buttons */
|
||||||
|
.btn-outline-blue {
|
||||||
|
color: $blue;
|
||||||
|
background-color: transparent;
|
||||||
|
background-image: none;
|
||||||
|
border-color: $blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline-blue:hover {
|
||||||
|
color: #fff;
|
||||||
|
background-color: $blue;
|
||||||
|
border-color: $blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline-blue:not(:disabled):not(.disabled):active, .btn-outline-blue:not(:disabled):not(.disabled).active, .show > .btn-outline-blue.dropdown-toggle {
|
||||||
|
color: #fff;
|
||||||
|
background-color: $blue;
|
||||||
|
border-color: $blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* dimmer */
|
||||||
|
|
||||||
.dimmer .loader {
|
.dimmer .loader {
|
||||||
margin-top: 50px;
|
margin-top: 50px;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user