-
Jordan Wright committed with GitHub 5 years ago1 parent faadf0c8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
static/css/dist/gophish.cssUnable to diff as some line is too long.
-
-
1 + var groups=[];function save(e){var t=[];$.each($("#targetsTable").DataTable().rows().data(),function(e,a){t.push({first_name:unescapeHtml(a[0]),last_name:unescapeHtml(a[1]),email:unescapeHtml(a[2]),position:unescapeHtml(a[3])})});var a={name:$("#name").val(),targets:t};-1!=e?(a.id=e,api.groupId.put(a).success(function(e){successFlash("Group updated successfully!"),load(),dismiss(),$("#modal").modal("hide")}).error(function(e){modalError(e.responseJSON.message)})):api.groups.post(a).success(function(e){successFlash("Group added successfully!"),load(),dismiss(),$("#modal").modal("hide")}).error(function(e){modalError(e.responseJSON.message)})}function dismiss(){$("#targetsTable").dataTable().DataTable().clear().draw(),$("#name").val(""),$("#modal\\.flashes").empty()}function edit(e){if(targets=$("#targetsTable").dataTable({destroy:!0,columnDefs:[{orderable:!1,targets:"no-sort"}]}),$("#modalSubmit").unbind("click").click(function(){save(e)}),-1==e);else api.groupId.get(e).success(function(e){$("#name").val(e.name),$.each(e.targets,function(e,a){targets.DataTable().row.add([escapeHtml(a.first_name),escapeHtml(a.last_name),escapeHtml(a.email),escapeHtml(a.position),'<span style="cursor:pointer;"><i class="fa fa-trash-o"></i></span>']).draw()})}).error(function(){errorFlash("Error fetching group")});$("#csvupload").fileupload({url:"/api/import/group",dataType:"json",beforeSend:function(e){e.setRequestHeader("Authorization","Bearer "+user.api_key)},add:function(e,a){$("#modal\\.flashes").empty();var t=a.originalFiles[0].name;if(t&&!/(csv|txt)$/i.test(t.split(".").pop()))return modalError("Unsupported file extension (use .csv or .txt)"),!1;a.submit()},done:function(e,a){$.each(a.result,function(e,a){addTarget(a.first_name,a.last_name,a.email,a.position)}),targets.DataTable().draw()}})}var downloadCSVTemplate=function(){var e="group_template.csv",a=Papa.unparse([{"First Name":"Example","Last Name":"User",Email:"[email protected]",Position:"Systems Administrator"}],{}),t=new Blob([a],{type:"text/csv;charset=utf-8;"});if(navigator.msSaveBlob)navigator.msSaveBlob(t,e);else{var s=window.URL.createObjectURL(t),o=document.createElement("a");o.href=s,o.setAttribute("download",e),document.body.appendChild(o),o.click(),document.body.removeChild(o)}},deleteGroup=function(s){var e=groups.find(function(e){return e.id===s});e&&swal({title:"Are you sure?",text:"This will delete the group. This can't be undone!",type:"warning",animation:!1,showCancelButton:!0,confirmButtonText:"Delete "+escapeHtml(e.name),confirmButtonColor:"#428bca",reverseButtons:!0,allowOutsideClick:!1,preConfirm:function(){return new Promise(function(a,t){api.groupId.delete(s).success(function(e){a()}).error(function(e){t(e.responseJSON.message)})})}}).then(function(){swal("Group Deleted!","This group has been deleted!","success"),$('button:contains("OK")').on("click",function(){location.reload()})})};function addTarget(e,a,t,s){var o=escapeHtml(t).toLowerCase(),r=[escapeHtml(e),escapeHtml(a),o,escapeHtml(s),'<span style="cursor:pointer;"><i class="fa fa-trash-o"></i></span>'],n=targets.DataTable(),i=n.column(2,{order:"index"}).data().indexOf(o);0<=i?n.row(i,{order:"index"}).data(r):n.row.add(r)}function load(){$("#groupTable").hide(),$("#emptyMessage").hide(),$("#loading").show(),api.groups.summary().success(function(e){if($("#loading").hide(),0<e.total){groups=e.groups,$("#emptyMessage").hide(),$("#groupTable").show();var t=$("#groupTable").DataTable({destroy:!0,columnDefs:[{orderable:!1,targets:"no-sort"}]});t.clear(),$.each(groups,function(e,a){t.row.add([escapeHtml(a.name),escapeHtml(a.num_targets),moment(a.modified_date).format("MMMM Do YYYY, h:mm:ss a"),"<div class='pull-right'><button class='btn btn-primary' data-toggle='modal' data-backdrop='static' data-target='#modal' onclick='edit("+a.id+")'> <i class='fa fa-pencil'></i> </button> <button class='btn btn-danger' onclick='deleteGroup("+a.id+")'> <i class='fa fa-trash-o'></i> </button></div>"]).draw()})}else $("#emptyMessage").show()}).error(function(){errorFlash("Error fetching groups")})}$(document).ready(function(){load(),$("#targetForm").submit(function(){return addTarget($("#firstName").val(),$("#lastName").val(),$("#email").val(),$("#position").val()),targets.DataTable().draw(),$("#targetForm>div>input").val(""),$("#firstName").focus(),!1}),$("#targetsTable").on("click","span>i.fa-trash-o",function(){targets.DataTable().row($(this).parents("tr")).remove().draw()}),$("#modal").on("hide.bs.modal",function(){dismiss()}),$("#csv-template").click(downloadCSVTemplate)}); -
1 - var groups=[];function save(e){var t=[];$.each($("#targetsTable").DataTable().rows().data(),function(e,a){t.push({first_name:unescapeHtml(a[0]),last_name:unescapeHtml(a[1]),email:unescapeHtml(a[2]),position:unescapeHtml(a[3])})});var a={name:$("#name").val(),targets:t};-1!=e?(a.id=e,api.groupId.put(a).success(function(e){successFlash("Group updated successfully!"),load(),dismiss(),$("#modal").modal("hide")}).error(function(e){modalError(e.responseJSON.message)})):api.groups.post(a).success(function(e){successFlash("Group added successfully!"),load(),dismiss(),$("#modal").modal("hide")}).error(function(e){modalError(e.responseJSON.message)})}function dismiss(){$("#targetsTable").dataTable().DataTable().clear().draw(),$("#name").val(""),$("#modal\\.flashes").empty()}function edit(e){if(targets=$("#targetsTable").dataTable({destroy:!0,columnDefs:[{orderable:!1,targets:"no-sort"}]}),$("#modalSubmit").unbind("click").click(function(){save(e)}),-1==e);else api.groupId.get(e).success(function(e){$("#name").val(e.name),$.each(e.targets,function(e,a){targets.DataTable().row.add([escapeHtml(a.first_name),escapeHtml(a.last_name),escapeHtml(a.email),escapeHtml(a.position),'<span style="cursor:pointer;"><i class="fa fa-trash-o"></i></span>']).draw()})}).error(function(){errorFlash("Error fetching group")});$("#csvupload").fileupload({url:"/api/import/group",dataType:"json",beforeSend:function(e){e.setRequestHeader("Authorization","Bearer "+user.api_key)},add:function(e,a){$("#modal\\.flashes").empty();var t=a.originalFiles[0].name;if(t&&!/(csv|txt)$/i.test(t.split(".").pop()))return modalError("Unsupported file extension (use .csv or .txt)"),!1;a.submit()},done:function(e,a){$.each(a.result,function(e,a){addTarget(a.first_name,a.last_name,a.email,a.position)}),targets.DataTable().draw()}})}var downloadCSVTemplate=function(){var e="group_template.csv",a=Papa.unparse([{"First Name":"Example","Last Name":"User",Email:"[email protected]",Position:"Systems Administrator"}],{}),t=new Blob([a],{type:"text/csv;charset=utf-8;"});if(navigator.msSaveBlob)navigator.msSaveBlob(t,e);else{var s=window.URL.createObjectURL(t),o=document.createElement("a");o.href=s,o.setAttribute("download",e),document.body.appendChild(o),o.click(),document.body.removeChild(o)}},deleteGroup=function(s){var e=groups.find(function(e){return e.id===s});e&&swal({title:"Are you sure?",text:"This will delete the group. This can't be undone!",type:"warning",animation:!1,showCancelButton:!0,confirmButtonText:"Delete "+escapeHtml(e.name),confirmButtonColor:"#428bca",reverseButtons:!0,allowOutsideClick:!1,preConfirm:function(){return new Promise(function(a,t){api.groupId.delete(s).success(function(e){a()}).error(function(e){t(e.responseJSON.message)})})}}).then(function(){swal("Group Deleted!","This group has been deleted!","success"),$('button:contains("OK")').on("click",function(){location.reload()})})};function addTarget(e,a,t,s){var o=escapeHtml(t).toLowerCase(),r=[escapeHtml(e),escapeHtml(a),o,escapeHtml(s),'<span style="cursor:pointer;"><i class="fa fa-trash-o"></i></span>'],n=targets.DataTable(),i=n.column(2,{order:"index"}).data().indexOf(o);0<=i?n.row(i,{order:"index"}).data(r):n.row.add(r)}function load(){$("#groupTable").hide(),$("#emptyMessage").hide(),$("#loading").show(),api.groups.summary().success(function(e){if($("#loading").hide(),0<e.total){groups=e.groups,$("#emptyMessage").hide(),$("#groupTable").show();var t=$("#groupTable").DataTable({destroy:!0,columnDefs:[{orderable:!1,targets:"no-sort"}]});t.clear(),$.each(groups,function(e,a){t.row.add([escapeHtml(a.name),escapeHtml(a.num_targets),moment(a.modified_date).format("MMMM Do YYYY, h:mm:ss a"),"<div class='pull-right'><button class='btn btn-primary' data-toggle='modal' data-backdrop='static' data-target='#modal' onclick='edit("+a.id+")'> <i class='fa fa-pencil'></i> </button> <button class='btn btn-danger' onclick='deleteGroup("+a.id+")'> <i class='fa fa-trash-o'></i> </button></div>"]).draw()})}else $("#emptyMessage").show()}).error(function(){errorFlash("Error fetching groups")})}$(document).ready(function(){load(),$("#targetForm").submit(function(){return addTarget($("#firstName").val(),$("#lastName").val(),$("#email").val(),$("#position").val()),targets.DataTable().draw(),$("#targetForm>div>input").val(""),$("#firstName").focus(),!1}),$("#targetsTable").on("click","span>i.fa-trash-o",function(){targets.DataTable().row($(this).parents("tr")).remove().draw()}),$("#modal").on("hide.bs.modal",function(){dismiss()}),$("#csv-template").click(downloadCSVTemplate)}); 1 + !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t){var r=[],n=function(){$("#username").val(""),$("#password").val(""),$("#confirm_password").val(""),$("#role").val(""),$("#modal\\.flashes").empty()},o=function(e){$("#modalSubmit").unbind("click").click(function(){!function(e){if($("#password").val()===$("#confirm_password").val()){var t={username:$("#username").val(),password:$("#password").val(),role:$("#role").val()};-1!=e?(t.id=e,api.userId.put(t).success(function(e){successFlash("User ".concat(t.username," updated successfully!")),s(),n(),$("#modal").modal("hide")}).error(function(e){modalError(e.responseJSON.message)})):api.users.post(t).success(function(e){successFlash("User ".concat(t.username," registered successfully!")),s(),n(),$("#modal").modal("hide")}).error(function(e){modalError(e.responseJSON.message)})}else modalError("Passwords must match.")}(e)}),$("#role").select2(),-1==e?($("#role").val("user"),$("#role").trigger("change")):api.userId.get(e).success(function(e){$("#username").val(e.username),$("#role").val(e.role.slug),$("#role").trigger("change")}).error(function(){errorFlash("Error fetching user")})},s=function(){$("#userTable").hide(),$("#loading").show(),api.users.get().success(function(e){r=e,$("#loading").hide(),$("#userTable").show();var t=$("#userTable").DataTable({destroy:!0,columnDefs:[{orderable:!1,targets:"no-sort"}]});t.clear(),$.each(r,function(e,r){t.row.add([escapeHtml(r.username),escapeHtml(r.role.name),"<div class='pull-right'><button class='btn btn-primary edit_button' data-toggle='modal' data-backdrop='static' data-target='#modal' data-user-id='"+r.id+"'> <i class='fa fa-pencil'></i> </button> <button class='btn btn-danger delete_button' data-user-id='"+r.id+"'> <i class='fa fa-trash-o'></i> </button></div>"]).draw()})}).error(function(){errorFlash("Error fetching users")})};$(document).ready(function(){s(),$("#modal").on("hide.bs.modal",function(){n()}),$.fn.select2.defaults.set("width","100%"),$.fn.select2.defaults.set("dropdownParent",$("#role-select")),$.fn.select2.defaults.set("theme","bootstrap"),$.fn.select2.defaults.set("sorter",function(e){return e.sort(function(e,t){return e.text.toLowerCase()>t.text.toLowerCase()?1:e.text.toLowerCase()<t.text.toLowerCase()?-1:0})}),$("#new_button").on("click",function(){o(-1)}),$("#userTable").on("click",".edit_button",function(e){o($(this).attr("data-user-id"))}),$("#userTable").on("click",".delete_button",function(e){var t,n;t=$(this).attr("data-user-id"),(n=r.find(function(e){return e.id==t}))&&swal({title:"Are you sure?",text:"This will delete the account for ".concat(n.username," as well as all of the objects they have created.\n\nThis can't be undone!"),type:"warning",animation:!1,showCancelButton:!0,confirmButtonText:"Delete",confirmButtonColor:"#428bca",reverseButtons:!0,allowOutsideClick:!1,preConfirm:function(){return new Promise(function(e,r){api.userId.delete(t).success(function(t){e()}).error(function(e){r(e.responseJSON.message)})})}}).then(function(){swal("User Deleted!","The user account for ".concat(n.username," and all associated objects have been deleted!"),"success"),$('button:contains("OK")').on("click",function(){location.reload()})})})})}]); -
-
1 + var groups = [] 2 + 3 + // Save attempts to POST or PUT to /groups/ 4 + function save(id) { 5 + var targets = [] 6 + $.each($("#targetsTable").DataTable().rows().data(), function (i, target) { 7 + targets.push({ 8 + first_name: unescapeHtml(target[0]), 9 + last_name: unescapeHtml(target[1]), 10 + email: unescapeHtml(target[2]), 11 + position: unescapeHtml(target[3]) 12 + }) 13 + }) 14 + var group = { 15 + name: $("#name").val(), 16 + targets: targets 17 + } 18 + // Submit the group 19 + if (id != -1) { 20 + // If we're just editing an existing group, 21 + // we need to PUT /groups/:id 22 + group.id = id 23 + api.groupId.put(group) 24 + .success(function (data) { 25 + successFlash("Group updated successfully!") 26 + load() 27 + dismiss() 28 + $("#modal").modal('hide') 29 + }) 30 + .error(function (data) { 31 + modalError(data.responseJSON.message) 32 + }) 33 + } else { 34 + // Else, if this is a new group, POST it 35 + // to /groups 36 + api.groups.post(group) 37 + .success(function (data) { 38 + successFlash("Group added successfully!") 39 + load() 40 + dismiss() 41 + $("#modal").modal('hide') 42 + }) 43 + .error(function (data) { 44 + modalError(data.responseJSON.message) 45 + }) 46 + } 47 + } 48 + 49 + function dismiss() { 50 + $("#targetsTable").dataTable().DataTable().clear().draw() 51 + $("#name").val("") 52 + $("#modal\\.flashes").empty() 53 + } 54 + 55 + function edit(id) { 56 + targets = $("#targetsTable").dataTable({ 57 + destroy: true, // Destroy any other instantiated table - http://datatables.net/manual/tech-notes/3#destroy 58 + columnDefs: [{ 59 + orderable: false, 60 + targets: "no-sort" 61 + }] 62 + }) 63 + $("#modalSubmit").unbind('click').click(function () { 64 + save(id) 65 + }) 66 + if (id == -1) { 67 + var group = {} 68 + } else { 69 + api.groupId.get(id) 70 + .success(function (group) { 71 + $("#name").val(group.name) 72 + $.each(group.targets, function (i, record) { 73 + targets.DataTable() 74 + .row.add([ 75 + escapeHtml(record.first_name), 76 + escapeHtml(record.last_name), 77 + escapeHtml(record.email), 78 + escapeHtml(record.position), 79 + '<span style="cursor:pointer;"><i class="fa fa-trash-o"></i></span>' 80 + ]).draw() 81 + }); 82 + 83 + }) 84 + .error(function () { 85 + errorFlash("Error fetching group") 86 + }) 87 + } 88 + // Handle file uploads 89 + $("#csvupload").fileupload({ 90 + url: "/api/import/group", 91 + dataType: "json", 92 + beforeSend: function (xhr) { 93 + xhr.setRequestHeader('Authorization', 'Bearer ' + user.api_key); 94 + }, 95 + add: function (e, data) { 96 + $("#modal\\.flashes").empty() 97 + var acceptFileTypes = /(csv|txt)$/i; 98 + var filename = data.originalFiles[0]['name'] 99 + if (filename && !acceptFileTypes.test(filename.split(".").pop())) { 100 + modalError("Unsupported file extension (use .csv or .txt)") 101 + return false; 102 + } 103 + data.submit(); 104 + }, 105 + done: function (e, data) { 106 + $.each(data.result, function (i, record) { 107 + addTarget( 108 + record.first_name, 109 + record.last_name, 110 + record.email, 111 + record.position); 112 + }); 113 + targets.DataTable().draw(); 114 + } 115 + }) 116 + } 117 + 118 + var downloadCSVTemplate = function () { 119 + var csvScope = [{ 120 + 'First Name': 'Example', 121 + 'Last Name': 'User', 122 + 'Email': '[email protected]', 123 + 'Position': 'Systems Administrator' 124 + }] 125 + var filename = 'group_template.csv' 126 + var csvString = Papa.unparse(csvScope, {}) 127 + var csvData = new Blob([csvString], { 128 + type: 'text/csv;charset=utf-8;' 129 + }); 130 + if (navigator.msSaveBlob) { 131 + navigator.msSaveBlob(csvData, filename); 132 + } else { 133 + var csvURL = window.URL.createObjectURL(csvData); 134 + var dlLink = document.createElement('a'); 135 + dlLink.href = csvURL; 136 + dlLink.setAttribute('download', filename) 137 + document.body.appendChild(dlLink) 138 + dlLink.click(); 139 + document.body.removeChild(dlLink) 140 + } 141 + } 142 + 143 + 144 + var deleteGroup = function (id) { 145 + var group = groups.find(function (x) { 146 + return x.id === id 147 + }) 148 + if (!group) { 149 + return 150 + } 151 + swal({ 152 + title: "Are you sure?", 153 + text: "This will delete the group. This can't be undone!", 154 + type: "warning", 155 + animation: false, 156 + showCancelButton: true, 157 + confirmButtonText: "Delete " + escapeHtml(group.name), 158 + confirmButtonColor: "#428bca", 159 + reverseButtons: true, 160 + allowOutsideClick: false, 161 + preConfirm: function () { 162 + return new Promise(function (resolve, reject) { 163 + api.groupId.delete(id) 164 + .success(function (msg) { 165 + resolve() 166 + }) 167 + .error(function (data) { 168 + reject(data.responseJSON.message) 169 + }) 170 + }) 171 + } 172 + }).then(function () { 173 + swal( 174 + 'Group Deleted!', 175 + 'This group has been deleted!', 176 + 'success' 177 + ); 178 + $('button:contains("OK")').on('click', function () { 179 + location.reload() 180 + }) 181 + }) 182 + } 183 + 184 + function addTarget(firstNameInput, lastNameInput, emailInput, positionInput) { 185 + // Create new data row. 186 + var email = escapeHtml(emailInput).toLowerCase(); 187 + var newRow = [ 188 + escapeHtml(firstNameInput), 189 + escapeHtml(lastNameInput), 190 + email, 191 + escapeHtml(positionInput), 192 + '<span style="cursor:pointer;"><i class="fa fa-trash-o"></i></span>' 193 + ]; 194 + 195 + // Check table to see if email already exists. 196 + var targetsTable = targets.DataTable(); 197 + var existingRowIndex = targetsTable 198 + .column(2, { 199 + order: "index" 200 + }) // Email column has index of 2 201 + .data() 202 + .indexOf(email); 203 + // Update or add new row as necessary. 204 + if (existingRowIndex >= 0) { 205 + targetsTable 206 + .row(existingRowIndex, { 207 + order: "index" 208 + }) 209 + .data(newRow); 210 + } else { 211 + targetsTable.row.add(newRow); 212 + } 213 + } 214 + 215 + function load() { 216 + $("#groupTable").hide() 217 + $("#emptyMessage").hide() 218 + $("#loading").show() 219 + api.groups.summary() 220 + .success(function (response) { 221 + $("#loading").hide() 222 + if (response.total > 0) { 223 + groups = response.groups 224 + $("#emptyMessage").hide() 225 + $("#groupTable").show() 226 + var groupTable = $("#groupTable").DataTable({ 227 + destroy: true, 228 + columnDefs: [{ 229 + orderable: false, 230 + targets: "no-sort" 231 + }] 232 + }); 233 + groupTable.clear(); 234 + $.each(groups, function (i, group) { 235 + groupTable.row.add([ 236 + escapeHtml(group.name), 237 + escapeHtml(group.num_targets), 238 + moment(group.modified_date).format('MMMM Do YYYY, h:mm:ss a'), 239 + "<div class='pull-right'><button class='btn btn-primary' data-toggle='modal' data-backdrop='static' data-target='#modal' onclick='edit(" + group.id + ")'>\ 240 + <i class='fa fa-pencil'></i>\ 241 + </button>\ 242 + <button class='btn btn-danger' onclick='deleteGroup(" + group.id + ")'>\ 243 + <i class='fa fa-trash-o'></i>\ 244 + </button></div>" 245 + ]).draw() 246 + }) 247 + } else { 248 + $("#emptyMessage").show() 249 + } 250 + }) 251 + .error(function () { 252 + errorFlash("Error fetching groups") 253 + }) 254 + } 255 + 256 + $(document).ready(function () { 257 + load() 258 + // Setup the event listeners 259 + // Handle manual additions 260 + $("#targetForm").submit(function () { 261 + addTarget( 262 + $("#firstName").val(), 263 + $("#lastName").val(), 264 + $("#email").val(), 265 + $("#position").val()); 266 + targets.DataTable().draw(); 267 + 268 + // Reset user input. 269 + $("#targetForm>div>input").val(''); 270 + $("#firstName").focus(); 271 + return false; 272 + }); 273 + // Handle Deletion 274 + $("#targetsTable").on("click", "span>i.fa-trash-o", function () { 275 + targets.DataTable() 276 + .row($(this).parents('tr')) 277 + .remove() 278 + .draw(); 279 + }); 280 + $("#modal").on("hide.bs.modal", function () { 281 + dismiss(); 282 + }); 283 + $("#csv-template").click(downloadCSVTemplate) 284 + }); -
1 - var groups = [] 1 + let users = [] 2 2 3 - // Save attempts to POST or PUT to /groups/ 4 - function save(id) { 5 - var targets = [] 6 - $.each($("#targetsTable").DataTable().rows().data(), function (i, target) { 7 - targets.push({ 8 - first_name: unescapeHtml(target[0]), 9 - last_name: unescapeHtml(target[1]), 10 - email: unescapeHtml(target[2]), 11 - position: unescapeHtml(target[3]) 12 - }) 13 - }) 14 - var group = { 15 - name: $("#name").val(), 16 - targets: targets 3 + // Save attempts to POST or PUT to /users/ 4 + const save = (id) => { 5 + // Validate that the passwords match 6 + if ($("#password").val() !== $("#confirm_password").val()) { 7 + modalError("Passwords must match.") 8 + return 17 9 } 18 - // Submit the group 10 + let user = { 11 + username: $("#username").val(), 12 + password: $("#password").val(), 13 + role: $("#role").val() 14 + } 15 + // Submit the user 19 16 if (id != -1) { 20 - // If we're just editing an existing group, 21 - // we need to PUT /groups/:id 22 - group.id = id 23 - api.groupId.put(group) 17 + // If we're just editing an existing user, 18 + // we need to PUT /user/:id 19 + user.id = id 20 + api.userId.put(user) 24 21 .success(function (data) { 25 - successFlash("Group updated successfully!") 22 + successFlash(`User ${user.username} updated successfully!`) 26 23 load() 27 24 dismiss() 28 25 $("#modal").modal('hide') skipped 2 lines 31 28 modalError(data.responseJSON.message) 32 29 }) 33 30 } else { 34 - // Else, if this is a new group, POST it 35 - // to /groups 36 - api.groups.post(group) 31 + // Else, if this is a new user, POST it 32 + // to /user 33 + api.users.post(user) 37 34 .success(function (data) { 38 - successFlash("Group added successfully!") 35 + successFlash(`User ${user.username} registered successfully!`) 39 36 load() 40 37 dismiss() 41 38 $("#modal").modal('hide') skipped 4 lines 46 43 } 47 44 } 48 45 49 - function dismiss() { 50 - $("#targetsTable").dataTable().DataTable().clear().draw() 51 - $("#name").val("") 46 + const dismiss = () => { 47 + $("#username").val("") 48 + $("#password").val("") 49 + $("#confirm_password").val("") 50 + $("#role").val("") 52 51 $("#modal\\.flashes").empty() 53 52 } 54 53 55 - function edit(id) { 56 - targets = $("#targetsTable").dataTable({ 57 - destroy: true, // Destroy any other instantiated table - http://datatables.net/manual/tech-notes/3#destroy 58 - columnDefs: [{ 59 - orderable: false, 60 - targets: "no-sort" 61 - }] 62 - }) 63 - $("#modalSubmit").unbind('click').click(function () { 54 + const edit = (id) => { 55 + $("#modalSubmit").unbind('click').click(() => { 64 56 save(id) 65 57 }) 58 + $("#role").select2() 66 59 if (id == -1) { 67 - var group = {} 60 + $("#role").val("user") 61 + $("#role").trigger("change") 68 62 } else { 69 - api.groupId.get(id) 70 - .success(function (group) { 71 - $("#name").val(group.name) 72 - $.each(group.targets, function (i, record) { 73 - targets.DataTable() 74 - .row.add([ 75 - escapeHtml(record.first_name), 76 - escapeHtml(record.last_name), 77 - escapeHtml(record.email), 78 - escapeHtml(record.position), 79 - '<span style="cursor:pointer;"><i class="fa fa-trash-o"></i></span>' 80 - ]).draw() 81 - }); 82 - 63 + api.userId.get(id) 64 + .success(function (user) { 65 + $("#username").val(user.username) 66 + $("#role").val(user.role.slug) 67 + $("#role").trigger("change") 83 68 }) 84 69 .error(function () { 85 - errorFlash("Error fetching group") 70 + errorFlash("Error fetching user") 86 71 }) 87 72 } 88 - // Handle file uploads 89 - $("#csvupload").fileupload({ 90 - url: "/api/import/group", 91 - dataType: "json", 92 - beforeSend: function (xhr) { 93 - xhr.setRequestHeader('Authorization', 'Bearer ' + user.api_key); 94 - }, 95 - add: function (e, data) { 96 - $("#modal\\.flashes").empty() 97 - var acceptFileTypes = /(csv|txt)$/i; 98 - var filename = data.originalFiles[0]['name'] 99 - if (filename && !acceptFileTypes.test(filename.split(".").pop())) { 100 - modalError("Unsupported file extension (use .csv or .txt)") 101 - return false; 102 - } 103 - data.submit(); 104 - }, 105 - done: function (e, data) { 106 - $.each(data.result, function (i, record) { 107 - addTarget( 108 - record.first_name, 109 - record.last_name, 110 - record.email, 111 - record.position); 112 - }); 113 - targets.DataTable().draw(); 114 - } 115 - }) 116 73 } 117 74 118 - var downloadCSVTemplate = function () { 119 - var csvScope = [{ 120 - 'First Name': 'Example', 121 - 'Last Name': 'User', 122 - 'Email': '[email protected]', 123 - 'Position': 'Systems Administrator' 124 - }] 125 - var filename = 'group_template.csv' 126 - var csvString = Papa.unparse(csvScope, {}) 127 - var csvData = new Blob([csvString], { 128 - type: 'text/csv;charset=utf-8;' 129 - }); 130 - if (navigator.msSaveBlob) { 131 - navigator.msSaveBlob(csvData, filename); 132 - } else { 133 - var csvURL = window.URL.createObjectURL(csvData); 134 - var dlLink = document.createElement('a'); 135 - dlLink.href = csvURL; 136 - dlLink.setAttribute('download', filename) 137 - document.body.appendChild(dlLink) 138 - dlLink.click(); 139 - document.body.removeChild(dlLink) 140 - } 141 - } 142 - 143 - 144 - var deleteGroup = function (id) { 145 - var group = groups.find(function (x) { 146 - return x.id === id 147 - }) 148 - if (!group) { 75 + const deleteUser = (id) => { 76 + var user = users.find(x => x.id == id) 77 + if (!user) { 149 78 return 150 79 } 151 80 swal({ 152 81 title: "Are you sure?", 153 - text: "This will delete the group. This can't be undone!", 82 + text: `This will delete the account for ${user.username} as well as all of the objects they have created.\n\nThis can't be undone!`, 154 83 type: "warning", 155 84 animation: false, 156 85 showCancelButton: true, 157 - confirmButtonText: "Delete " + escapeHtml(group.name), 86 + confirmButtonText: "Delete", 158 87 confirmButtonColor: "#428bca", 159 88 reverseButtons: true, 160 89 allowOutsideClick: false, 161 90 preConfirm: function () { 162 - return new Promise(function (resolve, reject) { 163 - api.groupId.delete(id) 164 - .success(function (msg) { 91 + return new Promise((resolve, reject) => { 92 + api.userId.delete(id) 93 + .success((msg) => { 165 94 resolve() 166 95 }) 167 - .error(function (data) { 96 + .error((data) => { 168 97 reject(data.responseJSON.message) 169 98 }) 170 99 }) 171 100 } 172 101 }).then(function () { 173 102 swal( 174 - 'Group Deleted!', 175 - 'This group has been deleted!', 103 + 'User Deleted!', 104 + `The user account for ${user.username} and all associated objects have been deleted!`, 176 105 'success' 177 106 ); 178 107 $('button:contains("OK")').on('click', function () { skipped 2 lines 181 110 }) 182 111 } 183 112 184 - function addTarget(firstNameInput, lastNameInput, emailInput, positionInput) { 185 - // Create new data row. 186 - var email = escapeHtml(emailInput).toLowerCase(); 187 - var newRow = [ 188 - escapeHtml(firstNameInput), 189 - escapeHtml(lastNameInput), 190 - email, 191 - escapeHtml(positionInput), 192 - '<span style="cursor:pointer;"><i class="fa fa-trash-o"></i></span>' 193 - ]; 194 113 195 - // Check table to see if email already exists. 196 - var targetsTable = targets.DataTable(); 197 - var existingRowIndex = targetsTable 198 - .column(2, { 199 - order: "index" 200 - }) // Email column has index of 2 201 - .data() 202 - .indexOf(email); 203 - // Update or add new row as necessary. 204 - if (existingRowIndex >= 0) { 205 - targetsTable 206 - .row(existingRowIndex, { 207 - order: "index" 208 - }) 209 - .data(newRow); 210 - } else { 211 - targetsTable.row.add(newRow); 212 - } 213 - } 214 - 215 - function load() { 216 - $("#groupTable").hide() 217 - $("#emptyMessage").hide() 114 + const load = () => { 115 + $("#userTable").hide() 218 116 $("#loading").show() 219 - api.groups.summary() 220 - .success(function (response) { 117 + api.users.get() 118 + .success((us) => { 119 + users = us 221 120 $("#loading").hide() 222 - if (response.total > 0) { 223 - groups = response.groups 224 - $("#emptyMessage").hide() 225 - $("#groupTable").show() 226 - var groupTable = $("#groupTable").DataTable({ 227 - destroy: true, 228 - columnDefs: [{ 229 - orderable: false, 230 - targets: "no-sort" 231 - }] 232 - }); 233 - groupTable.clear(); 234 - $.each(groups, function (i, group) { 235 - groupTable.row.add([ 236 - escapeHtml(group.name), 237 - escapeHtml(group.num_targets), 238 - moment(group.modified_date).format('MMMM Do YYYY, h:mm:ss a'), 239 - "<div class='pull-right'><button class='btn btn-primary' data-toggle='modal' data-backdrop='static' data-target='#modal' onclick='edit(" + group.id + ")'>\ 121 + $("#userTable").show() 122 + let userTable = $("#userTable").DataTable({ 123 + destroy: true, 124 + columnDefs: [{ 125 + orderable: false, 126 + targets: "no-sort" 127 + }] 128 + }); 129 + userTable.clear(); 130 + $.each(users, (i, user) => { 131 + userTable.row.add([ 132 + escapeHtml(user.username), 133 + escapeHtml(user.role.name), 134 + "<div class='pull-right'><button class='btn btn-primary edit_button' data-toggle='modal' data-backdrop='static' data-target='#modal' data-user-id='" + user.id + "'>\ 240 135 <i class='fa fa-pencil'></i>\ 241 136 </button>\ 242 - <button class='btn btn-danger' onclick='deleteGroup(" + group.id + ")'>\ 137 + <button class='btn btn-danger delete_button' data-user-id='" + user.id + "'>\ 243 138 <i class='fa fa-trash-o'></i>\ 244 139 </button></div>" 245 - ]).draw() 246 - }) 247 - } else { 248 - $("#emptyMessage").show() 249 - } 140 + ]).draw() 141 + }) 250 142 }) 251 - .error(function () { 252 - errorFlash("Error fetching groups") 143 + .error(() => { 144 + errorFlash("Error fetching users") 253 145 }) 254 146 } 255 147 256 148 $(document).ready(function () { 257 149 load() 258 150 // Setup the event listeners 259 - // Handle manual additions 260 - $("#targetForm").submit(function () { 261 - addTarget( 262 - $("#firstName").val(), 263 - $("#lastName").val(), 264 - $("#email").val(), 265 - $("#position").val()); 266 - targets.DataTable().draw(); 267 - 268 - // Reset user input. 269 - $("#targetForm>div>input").val(''); 270 - $("#firstName").focus(); 271 - return false; 272 - }); 273 - // Handle Deletion 274 - $("#targetsTable").on("click", "span>i.fa-trash-o", function () { 275 - targets.DataTable() 276 - .row($(this).parents('tr')) 277 - .remove() 278 - .draw(); 279 - }); 280 151 $("#modal").on("hide.bs.modal", function () { 281 152 dismiss(); 282 153 }); 283 - $("#csv-template").click(downloadCSVTemplate) 154 + // Select2 Defaults 155 + $.fn.select2.defaults.set("width", "100%"); 156 + $.fn.select2.defaults.set("dropdownParent", $("#role-select")); 157 + $.fn.select2.defaults.set("theme", "bootstrap"); 158 + $.fn.select2.defaults.set("sorter", function (data) { 159 + return data.sort(function (a, b) { 160 + if (a.text.toLowerCase() > b.text.toLowerCase()) { 161 + return 1; 162 + } 163 + if (a.text.toLowerCase() < b.text.toLowerCase()) { 164 + return -1; 165 + } 166 + return 0; 167 + }); 168 + }) 169 + $("#new_button").on("click", function () { 170 + edit(-1) 171 + }) 172 + $("#userTable").on('click', '.edit_button', function (e) { 173 + edit($(this).attr('data-user-id')) 174 + }) 175 + $("#userTable").on('click', '.delete_button', function (e) { 176 + deleteUser($(this).attr('data-user-id')) 177 + }) 284 178 }); -
-
-
-
-
-
-
yarn.lockDiff is too large to be displayed.