From e8546bbf5cb90bf66887cb1c815196d6d5fd6a91 Mon Sep 17 00:00:00 2001 From: Luka Vandervelden Date: Wed, 25 Dec 2019 06:57:40 +0100 Subject: [PATCH] User selection widget WIP, grooming. --- client/project-creation-modal.ls | 72 +++++++++++++++++++++++++------- client/users-cache.ls | 27 +++++++++--- 2 files changed, 79 insertions(+), 20 deletions(-) diff --git a/client/project-creation-modal.ls b/client/project-creation-modal.ls index 0ff8365..e29e87e 100644 --- a/client/project-creation-modal.ls +++ b/client/project-creation-modal.ls @@ -7,6 +7,7 @@ Modal = require './modal.ls' bulma = require "./bulma.ls" {field, control, label, button, tag, input, select} = bulma +{icon} = require "./font-awesome.ls" deep-copy = (object) -> JSON.parse JSON.stringify object @@ -18,8 +19,58 @@ remove-permission = (project, uid) -> project.permissions[key] := value.filter (!= uid) add-permission = (project, uid, perm) -> + if perm == "none" + return remove-permission project, uid + project.permissions[perm].push uid +UserInput = (users-cache) -> + self = {} + self.input = "" + self.timer = void + + timeout-handler = -> + self.user = users-cache.get-user self.input + + self.reset = -> + self.input = "" + window.clear-timeout self.timer + self.user = void + self.timer = void + + self.render = -> + control \.is-expanded.has-icons-right [ + # FIXME: Replace by a “user search input” as soon + # as one is available. + input { + classes: { + "is-danger": self.input.length > 0 && ! self.user + } + value: self.input + oninput: (e) -> + self.input := e.target.value + + login = e.target.value + uid = parse-int e.target.value + + user = users-cache.get-user login, false + + if user + self.user = user + else + self.user = void + + if timer = self.timer + window.clear-timeout timer + + self.timer := window.set-timeout timeout-handler, 200 + } + + if self.user + icon \.is-right, \check + ] + self + ProjectCreationModal = (args) -> self = { project: if args.project @@ -40,6 +91,8 @@ ProjectCreationModal = (args) -> users-cache: args.users-cache } + user-input = UserInput args.users-cache + self.project.tasks := void unless self.project.extra_properties @@ -105,21 +158,13 @@ ProjectCreationModal = (args) -> if self.project.permissions field \.has-addons [ - control \.is-expanded [ - # FIXME: Replace by a “user search input” as soon - # as one is available. - input { - value: self.input.new-user - oninput: (e) -> - self.input.new-user := e.target.value - } - ] + user-input.render! control [ select { onchange: (e) -> self.input.new-user-permission := e.target.value - } PERMISSION_LEVELS.map (perm) -> + } (PERMISSION_LEVELS ++ ["none"]).map (perm) -> h \option { selected: perm == \read } [ perm ] @@ -128,12 +173,11 @@ ProjectCreationModal = (args) -> control [ h \div.button.is-success.is-outlined { onclick: -> - uid = (parse-int self.input.new-user) || self.input.new-user + uid = user-input.user?.uid + perm = self.input.new-user-permission - self.input.new-user := "" - # FIXME: Really? :thonk: - #self.input.new-user-permission := \read + user-input.reset! console.log "Adding new perm? :/", uid, perm diff --git a/client/users-cache.ls b/client/users-cache.ls index 107555c..87d98ef 100644 --- a/client/users-cache.ls +++ b/client/users-cache.ls @@ -4,22 +4,37 @@ UsersCache = (authd-ws, on-user) -> on-user ||= (user) -> - # uid => user + # uid => user | "request sent" + # FIXME: "request sent" stays forever that way on failure. self.users = {} + # TODO: We’ll probably want to handle “no such user” errors. authd-ws.add-event-listener \user, (message) -> user = message.user self.users[user.uid] := user + self.users[user.login] := user on-user user - self.get-user = (uid) -> - if user = self.users[uid] - user + authd-ws.add-event-listener \error, (message) -> + if message.reason == "user not found" + console.log "warning: got a “user not found” error" + + # Note: uid may also be a login. + self.get-user = (uid, request-if-missing = true) -> + switch user = self.users[uid] + when void + if request-if-missing + console.log "Sending request for #{uid}" + self.users[uid] = "request sent" + authd-ws.get-user uid + + void + when "request sent" + void else - console.log "Sending request for #{uid}" - authd-ws.get-user uid + user self