User selection widget WIP, grooming.

dev
Luka Vandervelden 2019-12-25 06:57:40 +01:00
parent 93fc0ac859
commit e8546bbf5c
2 changed files with 79 additions and 20 deletions

View File

@ -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

View File

@ -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: Well 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