User selection widget WIP, grooming.
parent
93fc0ac859
commit
e8546bbf5c
|
@ -7,6 +7,7 @@ Modal = require './modal.ls'
|
||||||
bulma = require "./bulma.ls"
|
bulma = require "./bulma.ls"
|
||||||
|
|
||||||
{field, control, label, button, tag, input, select} = bulma
|
{field, control, label, button, tag, input, select} = bulma
|
||||||
|
{icon} = require "./font-awesome.ls"
|
||||||
|
|
||||||
deep-copy = (object) ->
|
deep-copy = (object) ->
|
||||||
JSON.parse JSON.stringify object
|
JSON.parse JSON.stringify object
|
||||||
|
@ -18,8 +19,58 @@ remove-permission = (project, uid) ->
|
||||||
project.permissions[key] := value.filter (!= uid)
|
project.permissions[key] := value.filter (!= uid)
|
||||||
|
|
||||||
add-permission = (project, uid, perm) ->
|
add-permission = (project, uid, perm) ->
|
||||||
|
if perm == "none"
|
||||||
|
return remove-permission project, uid
|
||||||
|
|
||||||
project.permissions[perm].push 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) ->
|
ProjectCreationModal = (args) ->
|
||||||
self = {
|
self = {
|
||||||
project: if args.project
|
project: if args.project
|
||||||
|
@ -40,6 +91,8 @@ ProjectCreationModal = (args) ->
|
||||||
users-cache: args.users-cache
|
users-cache: args.users-cache
|
||||||
}
|
}
|
||||||
|
|
||||||
|
user-input = UserInput args.users-cache
|
||||||
|
|
||||||
self.project.tasks := void
|
self.project.tasks := void
|
||||||
|
|
||||||
unless self.project.extra_properties
|
unless self.project.extra_properties
|
||||||
|
@ -105,21 +158,13 @@ ProjectCreationModal = (args) ->
|
||||||
|
|
||||||
if self.project.permissions
|
if self.project.permissions
|
||||||
field \.has-addons [
|
field \.has-addons [
|
||||||
control \.is-expanded [
|
user-input.render!
|
||||||
# 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
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
control [
|
control [
|
||||||
select {
|
select {
|
||||||
onchange: (e) ->
|
onchange: (e) ->
|
||||||
self.input.new-user-permission := e.target.value
|
self.input.new-user-permission := e.target.value
|
||||||
} PERMISSION_LEVELS.map (perm) ->
|
} (PERMISSION_LEVELS ++ ["none"]).map (perm) ->
|
||||||
h \option {
|
h \option {
|
||||||
selected: perm == \read
|
selected: perm == \read
|
||||||
} [ perm ]
|
} [ perm ]
|
||||||
|
@ -128,12 +173,11 @@ ProjectCreationModal = (args) ->
|
||||||
control [
|
control [
|
||||||
h \div.button.is-success.is-outlined {
|
h \div.button.is-success.is-outlined {
|
||||||
onclick: ->
|
onclick: ->
|
||||||
uid = (parse-int self.input.new-user) || self.input.new-user
|
uid = user-input.user?.uid
|
||||||
|
|
||||||
perm = self.input.new-user-permission
|
perm = self.input.new-user-permission
|
||||||
|
|
||||||
self.input.new-user := ""
|
user-input.reset!
|
||||||
# FIXME: Really? :thonk:
|
|
||||||
#self.input.new-user-permission := \read
|
|
||||||
|
|
||||||
console.log "Adding new perm? :/", uid, perm
|
console.log "Adding new perm? :/", uid, perm
|
||||||
|
|
||||||
|
|
|
@ -4,22 +4,37 @@ UsersCache = (authd-ws, on-user) ->
|
||||||
|
|
||||||
on-user ||= (user) ->
|
on-user ||= (user) ->
|
||||||
|
|
||||||
# uid => user
|
# uid => user | "request sent"
|
||||||
|
# FIXME: "request sent" stays forever that way on failure.
|
||||||
self.users = {}
|
self.users = {}
|
||||||
|
|
||||||
|
# TODO: We’ll probably want to handle “no such user” errors.
|
||||||
authd-ws.add-event-listener \user, (message) ->
|
authd-ws.add-event-listener \user, (message) ->
|
||||||
user = message.user
|
user = message.user
|
||||||
|
|
||||||
self.users[user.uid] := user
|
self.users[user.uid] := user
|
||||||
|
self.users[user.login] := user
|
||||||
|
|
||||||
on-user user
|
on-user user
|
||||||
|
|
||||||
self.get-user = (uid) ->
|
authd-ws.add-event-listener \error, (message) ->
|
||||||
if user = self.users[uid]
|
if message.reason == "user not found"
|
||||||
user
|
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
|
else
|
||||||
console.log "Sending request for #{uid}"
|
user
|
||||||
authd-ws.get-user uid
|
|
||||||
|
|
||||||
self
|
self
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue