mirror of
				https://github.com/NginxProxyManager/nginx-proxy-manager.git
				synced 2025-10-31 15:53:33 +00:00 
			
		
		
		
	v2.1.0 (#293)
* Fix wrapping when too many hosts are shown (#207) * Update npm packages, fixes CVE-2019-10757 * Revert some breaking packages * Major overhaul - Docker buildx support in CI - Cypress API Testing in CI - Restructured folder layout (insert clean face meme) - Added Swagger documentation and validate API against that (to be completed) - Use common base image for all supported archs, which includes updated nginx with ipv6 support - Updated certbot and changes required for it - Large amount of Hosts names will wrap in UI - Updated packages for frontend - Version bump 2.1.0 * Updated documentation * Fix JWT expire time going crazy. Now set to 1day * Backend JS formatting rules * Remove v1 importer, I doubt anyone is using v1 anymore * Added backend formatting rules and enforce them in Jenkins builds * Fix CI, doesn't need a tty * Thanks bcrypt. Why can't you just be normal. * Cleanup after syntax check Co-authored-by: Marcelo Castagna <margaale@users.noreply.github.com>
This commit is contained in:
		
							
								
								
									
										52
									
								
								frontend/js/app/nginx/stream/list/item.ejs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								frontend/js/app/nginx/stream/list/item.ejs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| <td class="text-center"> | ||||
|     <div class="avatar d-block" style="background-image: url(<%- owner.avatar || '/images/default-avatar.jpg' %>)" title="Owned by <%- owner.name %>"> | ||||
|         <span class="avatar-status <%- owner.is_disabled ? 'bg-red' : 'bg-green' %>"></span> | ||||
|     </div> | ||||
| </td> | ||||
| <td> | ||||
|     <div class="text-monospace"> | ||||
|         <%- incoming_port %> | ||||
|     </div> | ||||
|     <div class="small text-muted"> | ||||
|         <%- i18n('str', 'created-on', {date: formatDbDate(created_on, 'Do MMMM YYYY')}) %> | ||||
|     </div> | ||||
| </td> | ||||
| <td> | ||||
|     <div class="text-monospace"><%- forward_ip %>:<%- forwarding_port %></div> | ||||
| </td> | ||||
| <td> | ||||
|     <div> | ||||
|         <% if (tcp_forwarding) { %> | ||||
|             <span class="tag"><%- i18n('streams', 'tcp') %></span> | ||||
|         <% } | ||||
|         if (udp_forwarding) { %> | ||||
|             <span class="tag"><%- i18n('streams', 'udp') %></span> | ||||
|         <% } %> | ||||
|     </div> | ||||
| </td> | ||||
| <td> | ||||
|     <% | ||||
|     var o = isOnline(); | ||||
|     if (!enabled) { %> | ||||
|         <span class="status-icon bg-warning"></span> <%- i18n('str', 'disabled') %> | ||||
|     <% } else if (o === true) { %> | ||||
|         <span class="status-icon bg-success"></span> <%- i18n('str', 'online') %> | ||||
|     <% } else if (o === false) { %> | ||||
|         <span title="<%- getOfflineError() %>"><span class="status-icon bg-danger"></span> <%- i18n('str', 'offline') %></span> | ||||
|     <% } else { %> | ||||
|         <span class="status-icon bg-warning"></span> <%- i18n('str', 'unknown') %> | ||||
|     <% } %> | ||||
| </td> | ||||
| <% if (canManage) { %> | ||||
| <td class="text-right"> | ||||
|     <div class="item-action dropdown"> | ||||
|         <a href="#" data-toggle="dropdown" class="icon"><i class="fe fe-more-vertical"></i></a> | ||||
|         <div class="dropdown-menu dropdown-menu-right"> | ||||
|             <a href="#" class="edit dropdown-item"><i class="dropdown-icon fe fe-edit"></i> <%- i18n('str', 'edit') %></a> | ||||
|             <a href="#" class="able dropdown-item"><i class="dropdown-icon fe fe-power"></i> <%- i18n('str', enabled ? 'disable' : 'enable') %></a> | ||||
|             <div class="dropdown-divider"></div> | ||||
|             <a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a> | ||||
|         </div> | ||||
|     </div> | ||||
| </td> | ||||
| <% } %> | ||||
							
								
								
									
										54
									
								
								frontend/js/app/nginx/stream/list/item.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								frontend/js/app/nginx/stream/list/item.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| const Mn       = require('backbone.marionette'); | ||||
| const App      = require('../../../main'); | ||||
| const template = require('./item.ejs'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|     tagName:  'tr', | ||||
|  | ||||
|     ui: { | ||||
|         able:   'a.able', | ||||
|         edit:   'a.edit', | ||||
|         delete: 'a.delete' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'click @ui.able': function (e) { | ||||
|             e.preventDefault(); | ||||
|             let id = this.model.get('id'); | ||||
|             App.Api.Nginx.Streams[this.model.get('enabled') ? 'disable' : 'enable'](id) | ||||
|                 .then(() => { | ||||
|                     return App.Api.Nginx.Streams.get(id) | ||||
|                         .then(row => { | ||||
|                             this.model.set(row); | ||||
|                         }); | ||||
|                 }); | ||||
|         }, | ||||
|  | ||||
|         'click @ui.edit': function (e) { | ||||
|             e.preventDefault(); | ||||
|             App.Controller.showNginxStreamForm(this.model); | ||||
|         }, | ||||
|  | ||||
|         'click @ui.delete': function (e) { | ||||
|             e.preventDefault(); | ||||
|             App.Controller.showNginxStreamDeleteConfirm(this.model); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     templateContext: { | ||||
|         canManage: App.Cache.User.canManage('streams'), | ||||
|  | ||||
|         isOnline: function () { | ||||
|             return typeof this.meta.nginx_online === 'undefined' ? null : this.meta.nginx_online; | ||||
|         }, | ||||
|  | ||||
|         getOfflineError: function () { | ||||
|             return this.meta.nginx_err || ''; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     initialize: function () { | ||||
|         this.listenTo(this.model, 'change', this.render); | ||||
|     } | ||||
| }); | ||||
							
								
								
									
										13
									
								
								frontend/js/app/nginx/stream/list/main.ejs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								frontend/js/app/nginx/stream/list/main.ejs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| <thead> | ||||
|     <th width="30"> </th> | ||||
|     <th><%- i18n('streams', 'incoming-port') %></th> | ||||
|     <th><%- i18n('str', 'destination') %></th> | ||||
|     <th><%- i18n('streams', 'protocol') %></th> | ||||
|     <th><%- i18n('str', 'status') %></th> | ||||
|     <% if (canManage) { %> | ||||
|     <th> </th> | ||||
|     <% } %> | ||||
| </thead> | ||||
| <tbody> | ||||
|     <!-- items --> | ||||
| </tbody> | ||||
							
								
								
									
										32
									
								
								frontend/js/app/nginx/stream/list/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								frontend/js/app/nginx/stream/list/main.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| const Mn       = require('backbone.marionette'); | ||||
| const App      = require('../../../main'); | ||||
| const ItemView = require('./item'); | ||||
| const template = require('./main.ejs'); | ||||
|  | ||||
| const TableBody = Mn.CollectionView.extend({ | ||||
|     tagName:   'tbody', | ||||
|     childView: ItemView | ||||
| }); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     tagName:   'table', | ||||
|     className: 'table table-hover table-outline table-vcenter card-table', | ||||
|     template:  template, | ||||
|  | ||||
|     regions: { | ||||
|         body: { | ||||
|             el:             'tbody', | ||||
|             replaceElement: true | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     templateContext: { | ||||
|         canManage: App.Cache.User.canManage('streams') | ||||
|     }, | ||||
|  | ||||
|     onRender: function () { | ||||
|         this.showChildView('body', new TableBody({ | ||||
|             collection: this.collection | ||||
|         })); | ||||
|     } | ||||
| }); | ||||
		Reference in New Issue
	
	Block a user