todo-webclient/client/project-creation-modal.ls

204 lines
4.1 KiB
Plaintext
Raw Permalink Normal View History

2019-12-06 21:07:39 +01:00
h = require 'maquette' .h
UUID = require "uuid/v4"
Column = require './column.ls'
Modal = require './modal.ls'
bulma = require "./bulma.ls"
2019-12-06 21:07:39 +01:00
2019-12-12 02:30:46 +01:00
{field, control, label, button, tag, input, select} = bulma
2019-12-25 06:57:40 +01:00
{icon} = require "./font-awesome.ls"
2019-12-12 02:30:46 +01:00
2019-12-20 01:34:41 +01:00
deep-copy = (object) ->
JSON.parse JSON.stringify object
2019-12-08 02:17:55 +01:00
2019-12-20 01:34:41 +01:00
const PERMISSION_LEVELS = ["admin", "edit", "read"]
2019-12-20 01:34:41 +01:00
remove-permission = (project, uid) ->
for key, value of project.permissions
project.permissions[key] := value.filter (!= uid)
add-permission = (project, uid, perm) ->
2019-12-25 06:57:40 +01:00
if perm == "none"
return remove-permission project, uid
2019-12-20 01:34:41 +01:00
project.permissions[perm].push uid
2019-12-25 06:57:40 +01:00
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
2019-12-20 01:34:41 +01:00
ProjectCreationModal = (args) ->
2019-12-06 21:07:39 +01:00
self = {
2019-12-20 01:34:41 +01:00
project: if args.project
deep-copy args.project
else
{}
visible: args.visible || true
on-validation: args.on-validation || (project) ->
input : {
# Used when giving permissions to users not currently in the
# list of permissions.
new-user: ""
new-user-permission: \read
}
users-cache: args.users-cache
2019-12-06 21:07:39 +01:00
}
2019-12-25 06:57:40 +01:00
user-input = UserInput args.users-cache
2019-12-20 01:34:41 +01:00
self.project.tasks := void
unless self.project.extra_properties
self.project.extra_properties = {
columns: [
Column "Unassigned" {color: "red"}
Column "Work in Progress"
Column "To be Checked"
Column "Being Checked"
Column "Done" {color: "green"}
]
}
self.modal = Modal {
on-validation: ->
if true # FIXME: Validate project
self.visible := false
2019-12-08 02:17:55 +01:00
2019-12-20 01:34:41 +01:00
args.on-validation self.project
2019-12-20 01:34:41 +01:00
on-cancellation: ->
self.visible := false
2019-12-06 21:07:39 +01:00
2019-12-26 08:18:55 +01:00
validation-label: if self.project.id then "Edit Project" else "Add Project"
validation-classes: {+"is-success", +"is-outlined"}
2019-12-20 01:34:41 +01:00
content-render: -> [
field {key: \title} [
label "Title"
2019-12-20 01:34:41 +01:00
input {
value: self.project.title
oninput: (e) ->
console.log "oninput => ", e.target.value
self.project.title := e.target.value
}
]
if self.project.permissions
field {key: \permissions} [
2019-12-12 02:30:46 +01:00
label "Permissions"
2019-12-20 01:34:41 +01:00
h \table.table.is-fullwidth [
h \thead [
h \th [ "User" ]
h \th [ "Permission" ]
]
2019-12-12 02:30:46 +01:00
h \tbody [
2019-12-20 01:34:41 +01:00
for permission in PERMISSION_LEVELS
[
for uid in self.project.permissions[permission]
h \tr {key: uid} [
h \td [
2019-12-25 16:10:20 +01:00
self.users-cache.render-user uid
]
2019-12-20 01:34:41 +01:00
h \td [ permission ]
2019-12-12 02:30:46 +01:00
]
2019-12-20 01:34:41 +01:00
]
2019-12-12 02:30:46 +01:00
]
]
2019-12-07 18:15:57 +01:00
]
2019-12-20 01:34:41 +01:00
if self.project.permissions
field \.has-addons [
2019-12-25 06:57:40 +01:00
user-input.render!
2019-12-12 02:30:46 +01:00
control [
select {
onchange: (e) ->
2019-12-20 01:34:41 +01:00
self.input.new-user-permission := e.target.value
2019-12-25 06:57:40 +01:00
} (PERMISSION_LEVELS ++ ["none"]).map (perm) ->
2019-12-20 01:34:41 +01:00
h \option {
selected: perm == \read
} [ perm ]
]
2019-12-12 02:30:46 +01:00
control [
2019-12-20 01:34:41 +01:00
h \div.button.is-success.is-outlined {
2019-12-12 02:30:46 +01:00
onclick: ->
2019-12-25 06:57:40 +01:00
uid = user-input.user?.uid
2019-12-20 01:34:41 +01:00
perm = self.input.new-user-permission
2019-12-25 06:57:40 +01:00
user-input.reset!
2019-12-08 02:17:55 +01:00
2019-12-20 01:34:41 +01:00
console.log "Adding new perm? :/", uid, perm
2019-12-08 02:17:55 +01:00
2019-12-20 01:34:41 +01:00
remove-permission self.project, uid
add-permission self.project, uid, perm
2019-12-08 04:08:21 +01:00
2019-12-20 01:34:41 +01:00
console.log self.project.permissions
} [
"+"
]
2019-12-12 21:49:15 +01:00
]
2019-12-08 04:08:21 +01:00
]
2019-12-20 01:34:41 +01:00
]
}
2019-12-06 21:07:39 +01:00
self.render = ->
2019-12-20 01:34:41 +01:00
self.modal.visible = self.visible
self.modal.render!
2019-12-06 21:07:39 +01:00
self
module.exports = ProjectCreationModal