diff --git a/api.go b/api.go index dd8f94e..24dfbbc 100644 --- a/api.go +++ b/api.go @@ -541,6 +541,7 @@ func (app *appContext) OmbiUsers(gc *gin.Context) { func (app *appContext) ModifyEmails(gc *gin.Context) { var req map[string]string gc.BindJSON(&req) + fmt.Println(req) app.debug.Println("Email modification requested") users, status, err := app.jf.getUsers(false) if !(status == 200 || status == 204) || err != nil { @@ -550,7 +551,7 @@ func (app *appContext) ModifyEmails(gc *gin.Context) { return } for _, jfUser := range users { - if address, ok := req[jfUser["Name"].(string)]; ok { + if address, ok := req[jfUser["Id"].(string)]; ok { app.storage.emails[jfUser["Id"].(string)] = address } } diff --git a/data/static/accounts.js b/data/static/accounts.js index fd2ca46..5d8d36a 100644 --- a/data/static/accounts.js +++ b/data/static/accounts.js @@ -8,23 +8,105 @@ document.getElementById('selectAll').onclick = function() { function checkCheckboxes() { const defaultsButton = document.getElementById('accountsTabSetDefaults'); + const deleteButton = document.getElementById('accountsTabDelete'); const checkboxes = document.getElementById('accountsList').querySelectorAll('input[type=checkbox]'); - let checked = false; + let checked = 0; for (check of checkboxes) { if (check.checked) { - checked = true; - break; + checked++; } } - if (!checked) { + if (checked == 0) { defaultsButton.classList.add('unfocused'); - } else if (defaultsButton.classList.contains('unfocused')) { - defaultsButton.classList.remove('unfocused'); + deleteButton.classList.add('unfocused'); + } else { + if (defaultsButton.classList.contains('unfocused')) { + defaultsButton.classList.remove('unfocused'); + } + if (deleteButton.classList.contains('unfocused')) { + deleteButton.classList.remove('unfocused'); + } + if (checked == 1) { + deleteButton.textContent = 'Delete User'; + } else { + deleteButton.textContent = 'Delete Users'; + } } } var jfUsers = []; +function validEmail(email) { + const re = /\S+@\S+\.\S+/; + return re.test(email); +} + +function changeEmail(icon, id) { + const iconContent = icon.outerHTML; + icon.setAttribute("class", ""); + const entry = icon.nextElementSibling; + const ogEmail = entry.value; + entry.readOnly = false; + entry.classList.remove('form-control-plaintext'); + entry.classList.add('form-control'); + if (entry.value == "") { + entry.placeholder = 'Address'; + } + const tick = document.createElement('i'); + tick.classList.add("fa", "fa-check", "d-inline-block", "icon-button", "text-success"); + tick.setAttribute('style', 'margin-left: 0.5rem; margin-right: 0.5rem;'); + tick.onclick = function() { + const newEmail = entry.value; + if (!validEmail(newEmail) || newEmail == ogEmail) { + return + } + cross.remove(); + this.outerHTML = ` +
+ Saving... +
`; + //this.remove(); + let send = {}; + send[id] = newEmail; + console.log(send); + let req = new XMLHttpRequest(); + req.open("POST", "/modifyEmails", true); + req.setRequestHeader("Authorization", "Basic " + btoa(window.token + ":")); + req.setRequestHeader('Content-Type', 'application/json; charset=UTF-8'); + req.onreadystatechange = function() { + if (this.readyState == 4) { + if (this.status == 200 || this.status == 204) { + entry.nextElementSibling.remove(); + } else { + entry.value = ogEmail; + } + } + }; + req.send(JSON.stringify(send)); + icon.outerHTML = iconContent; + entry.readOnly = true; + entry.classList.remove('form-control'); + entry.classList.add('form-control-plaintext'); + entry.placeholder = ''; + }; + const cross = document.createElement('i'); + cross.classList.add("fa", "fa-close", "d-inline-block", "icon-button", "text-danger"); + cross.onclick = function() { + tick.remove(); + this.remove(); + icon.outerHTML = iconContent; + entry.readOnly = true; + entry.classList.remove('form-control'); + entry.classList.add('form-control-plaintext'); + entry.placeholder = ''; + entry.value = ogEmail; + }; + icon.parentNode.appendChild(tick); + icon.parentNode.appendChild(cross); +} + + + function populateUsers() { const acList = document.getElementById('accountsList'); acList.innerHTML = ` @@ -35,18 +117,32 @@ function populateUsers() { acList.parentNode.querySelector('thead').classList.add('unfocused'); const accountsList = document.createElement('tbody'); accountsList.id = 'accountsList'; + const generateEmail = function(id, name, email) { + let entry = document.createElement('div'); + // entry.classList.add('py-1'); + entry.id = 'email_' + id; + let emailValue = email; + if (email === undefined) { + emailValue = ""; + } + entry.innerHTML = ` + + + `; + return entry.outerHTML + }; const template = function(id, username, email, lastActive, admin) { let isAdmin = "No"; if (admin) { isAdmin = "Yes"; } return ` - - ${username} - ${email} - ${lastActive} - ${isAdmin} - `; + + ${username} + ${generateEmail(id, name, email)} + ${lastActive} + ${isAdmin} + `; }; let req = new XMLHttpRequest(); diff --git a/data/static/admin.js b/data/static/admin.js index 937b3c3..39517b1 100644 --- a/data/static/admin.js +++ b/data/static/admin.js @@ -886,104 +886,6 @@ if (ombiEnabled) { }; } -document.getElementById('openUsers').onclick = function () { - this.disabled = true; - this.innerHTML = - '' + - 'Loading...'; - let req = new XMLHttpRequest(); - req.open("GET", "/getUsers", true); - req.responseType = 'json'; - req.setRequestHeader("Authorization", "Basic " + btoa(window.token + ":")); - req.onreadystatechange = function() { - if (this.readyState == 4) { - if (this.status == 200) { - let list = document.getElementById('userList'); - list.textContent = ''; - if (document.getElementById('saveUsers')) { - document.getElementById('saveUsers').remove(); - } - let users = req.response['users']; - for (let user of users) { - let entry = document.createElement('div'); - entry.classList.add('form-group', 'list-group-item', 'py-1'); - entry.id = 'user_' + user['name']; - let label = document.createElement('label'); - label.classList.add('d-inline-block'); - label.setAttribute('for', 'address_' + user['email']); - label.textContent = user['name']; - entry.appendChild(label); - let address = document.createElement('input'); - address.setAttribute('type', 'email'); - address.readOnly = true; - address.classList.add('form-control-plaintext', 'text-muted', 'd-inline-block', 'addressText'); - address.id = 'address_' + user['name']; - address.setAttribute('style', 'width: auto; margin-left: 2%;'); - if (typeof(user['email']) != 'undefined') { - address.value = user['email']; - } - let editButton = document.createElement('i'); - editButton.classList.add('fa', 'fa-edit', 'd-inline-block', 'icon-button'); - editButton.setAttribute('style', 'margin-left: 2%;'); - editButton.onclick = function() { - this.classList.remove('fa', 'fa-edit'); - let addressElement = this.parentNode.getElementsByClassName('form-control-plaintext')[0]; - addressElement.classList.remove('form-control-plaintext', 'text-muted'); - addressElement.classList.add('form-control'); - addressElement.readOnly = false; - if (addressElement.value == '') { - addressElement.placeholder = 'Email Address'; - address.setAttribute('style', 'width: auto; margin-left: 2%;'); - } - if (document.getElementById('saveUsers') == null) { - let footer = document.getElementById('userFooter') - let saveUsers = document.createElement('input'); - saveUsers.classList.add('btn', 'btn-primary'); - saveUsers.setAttribute('type', 'button'); - saveUsers.value = 'Save Changes'; - saveUsers.id = 'saveUsers'; - saveUsers.onclick = function() { - let send = {} - let entries = document.getElementById('userList').children; - for (let entry of entries) { - if (typeof(entry.getElementsByTagName('input')[0]) != 'undefined') { - const name = entry.id.replace(/user_/g, ''); - const address = entry.getElementsByTagName('input')[0].value; - send[name] = address; - } - } - send = JSON.stringify(send); - let req = new XMLHttpRequest(); - req.open("POST", "/modifyUsers", true); - req.setRequestHeader("Authorization", "Basic " + btoa(window.token + ":")); - req.setRequestHeader('Content-Type', 'application/json; charset=UTF-8'); - req.onreadystatechange = function() { - if (this.readyState == 4) { - if (this.status == 200 || this.status == 204) { - usersModal.hide(); - } - } - }; - req.send(send); - }; - footer.appendChild(saveUsers); - } - }; - entry.appendChild(editButton); - entry.appendChild(address); - list.appendChild(entry); - }; - let button = document.getElementById('openUsers'); - button.disabled = false; - button.innerHTML = 'Users '; - settingsModal.hide(); - usersModal.show(); - } - } - }; - req.send(); -}; - generateInvites(empty = true); tryLogin("", "", false, callback = function(code){ diff --git a/data/templates/admin.html b/data/templates/admin.html index e982622..ebd1319 100644 --- a/data/templates/admin.html +++ b/data/templates/admin.html @@ -105,9 +105,6 @@ - @@ -334,11 +331,12 @@
-
- Accounts -
- +
+
Accounts
+
+ +
diff --git a/main.go b/main.go index ff59fab..cd7ed05 100644 --- a/main.go +++ b/main.go @@ -440,7 +440,7 @@ func start(asDaemon, firstCall bool) { api.POST("/setNotify", app.SetNotify) api.POST("/deleteInvite", app.DeleteInvite) api.GET("/getUsers", app.GetUsers) - api.POST("/modifyUsers", app.ModifyEmails) + api.POST("/modifyEmails", app.ModifyEmails) api.POST("/setDefaults", app.SetDefaults) api.POST("/applySettings", app.ApplySettings) api.GET("/getConfig", app.GetConfig)