diff --git a/docker-compose.yml b/docker-compose.yml index aeca697..657bc61 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,7 @@ services: - ./lumi2/ldap.py:/app/lumi2/ldap.py:ro - ./lumi2/usermodel.py:/app/lumi2/usermodel.py:ro - ./lumi2/usermanager.py:/app/lumi2/usermanager.py:ro + - ./lumi2/static/js:/app/lumi2/static/js:ro - ./lumi2/static/css:/app/lumi2/static/css:ro - ./lumi2/static/images/base:/app/lumi2/static/images/base:ro - ./lumi2/static/images/default:/app/lumi2/static/images/default:ro diff --git a/lumi2/__init__.py b/lumi2/__init__.py index f9f63c3..46571eb 100644 --- a/lumi2/__init__.py +++ b/lumi2/__init__.py @@ -44,4 +44,7 @@ def create_app(test_config=None): app.register_blueprint(usermanager.bp) app.add_url_rule('/', endpoint='index') + # TODO create OUs + # TODO create static files + return app diff --git a/lumi2/static/js/groupEdit.js b/lumi2/static/js/groupEdit.js new file mode 100644 index 0000000..ba81020 --- /dev/null +++ b/lumi2/static/js/groupEdit.js @@ -0,0 +1,122 @@ +class AbstractUserEntry { + constructor(username, tableRow) { + this.username = username; + this.tableRow = tableRow; + this.membershipToggleButton = tableRow.querySelector(".toggleMembershipButton"); + this.membershipToggleButton.addEventListener("click", this.onButtonPress.bind(this)); + }; +}; + +function removeUserFromFormField(username) { + let formField = document.getElementById("updated_members"); + let oldMembersList = JSON.parse(formField.value); + let newMembersList = Array(); + for (let member of oldMembersList) { + if (member != username) { + newMembersList.push(member); + } + } + formField.value = JSON.stringify(newMembersList); +}; + +function addUserToFormField(username) { + let formField = document.getElementById("updated_members"); + let oldMembersList = JSON.parse(formField.value); + oldMembersList.push(username); + formField.value = JSON.stringify(oldMembersList); +}; + +class MemberEntry extends AbstractUserEntry { + onButtonPress() { + this.tableRow.remove(); + createRemovedMemberRow(this.username); + removeUserFromFormField(this.username); + }; +}; + +class NonMemberEntry extends AbstractUserEntry { + onButtonPress() { + this.tableRow.remove(); + createAddedMemberRow(this.username); + addUserToFormField(this.username); + }; +}; + +function createRemovedMemberRow(username) { + let newTableRow = nonMembersTable.querySelector("tbody").insertRow(0); + newTableRow.className = "userEntry text-center bg-danger bg-gradient"; + newTableRow.id = username; + + let newTableHeader = document.createElement("th"); + newTableHeader.scope = "row"; + let newImage = document.createElement("img"); + newImage.src = `/static/images/users/${username}/thumbnail.jpg`; + newImage.alt = `Profile picture for user ${username}.`; + newImage.className = "img-fluid rounded"; + newImage.style = "max-width: 50px"; + newTableHeader.appendChild(newImage); + newTableRow.appendChild(newTableHeader); + + let newTableDataUsername = document.createElement("td"); + let newUsernameAnchor = document.createElement("a"); + newUsernameAnchor.href = `/users/view/${username}`; + newUsernameAnchor.textContent = username; + newTableDataUsername.appendChild(newUsernameAnchor); + newTableRow.appendChild(newTableDataUsername); + + + let newTableDataButton = document.createElement("td"); + let newTableButton = document.createElement("button"); + newTableButton.type = "button"; + newTableButton.className = "toggleMembershipButton btn btn-outline-light"; + newTableButton.disabled = true; + newTableButton.textContent = "Being removed..."; + newTableDataButton.appendChild(newTableButton); + newTableRow.appendChild(newTableDataButton); +}; + +function createAddedMemberRow(username) { + let newTableRow = membersTable.querySelector("tbody").insertRow(0); + newTableRow.className = "userEntry text-center bg-success bg-gradient"; + newTableRow.id = username; + + let newTableHeader = document.createElement("th"); + newTableHeader.scope = "row"; + let newImage = document.createElement("img"); + newImage.src = `/static/images/users/${username}/thumbnail.jpg`; + newImage.alt = `Profile picture for user ${username}.`; + newImage.className = "img-fluid rounded"; + newImage.style = "max-width: 50px"; + newTableHeader.appendChild(newImage); + newTableRow.appendChild(newTableHeader); + + let newTableDataUsername = document.createElement("td"); + let newUsernameAnchor = document.createElement("a"); + newUsernameAnchor.href = `/users/view/${username}`; + newUsernameAnchor.textContent = username; + newTableDataUsername.appendChild(newUsernameAnchor); + newTableRow.appendChild(newTableDataUsername); + + + let newTableDataButton = document.createElement("td"); + let newTableButton = document.createElement("button"); + newTableButton.type = "button"; + newTableButton.className = "toggleMembershipButton btn btn-outline-light"; + newTableButton.disabled = true; + newTableButton.textContent = "Being added..."; + newTableDataButton.appendChild(newTableButton); + newTableRow.appendChild(newTableDataButton); +}; + +const membersTable = document.getElementById("groupMembers"); +const nonMembersTable = document.getElementById("groupNonMembers"); +let memberEntries = new Set(); +let nonMemberEntries = new Set(); + +for (let userEntry of document.body.querySelectorAll(".userEntry")) { + if (userEntry.parentElement.parentElement.id === "groupMembers") { + memberEntries.add(new MemberEntry(userEntry.id, userEntry)); + } else if (userEntry.parentElement.parentElement.id === "groupNonMembers") { + nonMemberEntries.add(new NonMemberEntry(userEntry.id, userEntry)); + } +} diff --git a/lumi2/templates/usermanager/group_edit.html b/lumi2/templates/usermanager/group_edit.html index 02a6832..564f9fd 100644 --- a/lumi2/templates/usermanager/group_edit.html +++ b/lumi2/templates/usermanager/group_edit.html @@ -3,44 +3,82 @@ {% block content %}