proxy_form.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. 'use strict';
  2. import Mn from 'backbone.marionette';
  3. const _ = require('lodash');
  4. const template = require('./proxy_form.ejs');
  5. const Controller = require('../controller');
  6. const Api = require('../api');
  7. const App = require('../main');
  8. require('jquery-serializejson');
  9. module.exports = Mn.View.extend({
  10. template: template,
  11. ui: {
  12. form: 'form',
  13. buttons: 'form button',
  14. ssl_options: '.ssl_options',
  15. ssl: 'input[name="ssl"]',
  16. letsencrypt_email: 'input[name="letsencrypt_email"]',
  17. accept_tos: 'input[name="accept_tos"]',
  18. access_list_id: 'select[name="access_list_id"]'
  19. },
  20. events: {
  21. 'change @ui.ssl': function (e) {
  22. let inputs = this.ui.letsencrypt_email.add(this.ui.accept_tos);
  23. if (this.ui.ssl.prop('checked')) {
  24. this.ui.ssl_options.show();
  25. inputs.prop('required', true);
  26. } else {
  27. this.ui.ssl_options.hide();
  28. inputs.prop('required', false);
  29. }
  30. },
  31. 'submit @ui.form': function (e) {
  32. e.preventDefault();
  33. let data = _.extend({}, this.ui.form.serializeJSON());
  34. // Change text true's to bools
  35. _.map(data, function (val, key) {
  36. if (val === 'true') {
  37. data[key] = true;
  38. }
  39. });
  40. data.type = 'proxy';
  41. // Port is integer
  42. data.forward_port = parseInt(data.forward_port, 10);
  43. // accept_tos is not required for backend
  44. delete data.accept_tos;
  45. delete data.access_list;
  46. if (!data.ssl) {
  47. delete data.letsencrypt_email;
  48. delete data.force_ssl;
  49. }
  50. this.ui.buttons.prop('disabled', true).addClass('btn-disabled');
  51. let method = Api.Hosts.create;
  52. if (this.model.get('_id')) {
  53. // edit
  54. method = Api.Hosts.update;
  55. data._id = this.model.get('_id');
  56. }
  57. method(data)
  58. .then((/*result*/) => {
  59. App.UI.closeModal();
  60. Controller.showDashboard();
  61. })
  62. .catch((err) => {
  63. alert(err.message);
  64. this.ui.buttons.prop('disabled', false).removeClass('btn-disabled');
  65. });
  66. }
  67. },
  68. onRender: function () {
  69. let view = this;
  70. Api.Access.getAll()
  71. .then(response => {
  72. if (!view.isDestroyed()) {
  73. view.ui.access_list_id.empty().append($('<option>').val('').text('None (Publicly Accessible)'));
  74. if (response && response.length) {
  75. _.map(response, access => {
  76. view.ui.access_list_id.append($('<option>').val(access._id).text(access.name));
  77. });
  78. }
  79. if (this.model.get('access_list_id')) {
  80. view.ui.access_list_id.val(this.model.get('access_list_id'));
  81. }
  82. }
  83. })
  84. .catch(err => {
  85. alert("Error loading Access Lists!\n\n" + err.message);
  86. App.UI.closeModal();
  87. });
  88. }
  89. });