add: polls
This commit is contained in:
parent
4dfa09207e
commit
6555324650
29 changed files with 339 additions and 56 deletions
|
@ -222,6 +222,9 @@
|
|||
(text "{%- endif %} {%- endif %}"))
|
||||
(text "{{ self::post_media(upload_ids=post.uploads) }}")))
|
||||
(text "{%- endif %}")
|
||||
|
||||
(text "{% if poll -%} {{ self::poll(post=post, poll=poll) }} {%- endif %}")
|
||||
|
||||
(div
|
||||
("class" "flex flex-wrap gap-2 fade")
|
||||
(text "{% for tag in post.context.tags %}")
|
||||
|
@ -1205,6 +1208,14 @@
|
|||
(div
|
||||
("class" "flex gap-2")
|
||||
(text "{{ components::emoji_picker(element_id=\"content\", render_dialog=true) }} {% if not quoting -%} {% if is_supporter -%} {{ components::file_picker(files_list_id=\"files_list\") }} {%- endif %} {%- endif %}")
|
||||
|
||||
(button
|
||||
("class" "small square quaternary")
|
||||
("title" "Add poll")
|
||||
("onclick" "document.getElementById('poll_options_dialog').showModal()")
|
||||
("type" "button")
|
||||
(text "{{ icon \"list-todo\" }}"))
|
||||
|
||||
(button
|
||||
("class" "small square quaternary")
|
||||
("title" "More options")
|
||||
|
@ -1323,4 +1334,155 @@
|
|||
}
|
||||
};"))))
|
||||
|
||||
; poll data manager function and dialog
|
||||
;
|
||||
; `get_poll_data` returns `[bool, string | PollData]`, where the string in arg 1
|
||||
; represents an error message if arg 0 is `false`
|
||||
(script
|
||||
(text "window.POLL_OPTION_A = \"\";
|
||||
window.POLL_OPTION_B = \"\";
|
||||
window.POLL_OPTION_C = \"\";
|
||||
window.POLL_OPTION_D = \"\";
|
||||
|
||||
window.get_poll_data = () => {
|
||||
if (!POLL_OPTION_A && !POLL_OPTION_B) {
|
||||
return [true, null];
|
||||
}
|
||||
|
||||
if (POLL_OPTION_A && !POLL_OPTION_B || POLL_OPTION_B && !POLL_OPTION_A) {
|
||||
return [false, \"At least 2 options are required for a poll\"];
|
||||
}
|
||||
|
||||
return [true, {
|
||||
option_a: POLL_OPTION_A,
|
||||
option_b: POLL_OPTION_B,
|
||||
option_c: POLL_OPTION_C,
|
||||
option_d: POLL_OPTION_D
|
||||
}];
|
||||
}"))
|
||||
|
||||
(dialog
|
||||
("id" "poll_options_dialog")
|
||||
(div
|
||||
("class" "inner flex flex-col gap-2")
|
||||
(div
|
||||
("id" "poll_options")
|
||||
("class" "flex flex-col gap-2")
|
||||
|
||||
(b (text "Attach poll"))
|
||||
|
||||
(div
|
||||
("class" "card flex flex-col gap-2")
|
||||
(span
|
||||
(b (text "Option A "))
|
||||
(span ("class" "fade red") (text "(required)")))
|
||||
|
||||
(input ("type" "text") ("placeholder" "option A") ("onchange" "window.POLL_OPTION_A = event.target.value")))
|
||||
|
||||
(div
|
||||
("class" "card flex flex-col gap-2")
|
||||
(span
|
||||
(b (text "Option B "))
|
||||
(span ("class" "fade red") (text "(required)")))
|
||||
|
||||
(input ("type" "text") ("placeholder" "option B") ("onchange" "window.POLL_OPTION_B = event.target.value")))
|
||||
|
||||
(div
|
||||
("class" "card flex flex-col gap-2")
|
||||
(b (text "Option C"))
|
||||
(input ("type" "text") ("placeholder" "option A") ("onchange" "window.POLL_OPTION_C = event.target.value")))
|
||||
|
||||
(div
|
||||
("class" "card flex flex-col gap-2")
|
||||
(b (text "Option D"))
|
||||
(input ("type" "text") ("placeholder" "option D") ("onchange" "window.POLL_OPTION_D = event.target.value"))))
|
||||
(hr)
|
||||
(div
|
||||
("class" "flex justify-between")
|
||||
(div)
|
||||
(div
|
||||
("class" "flex gap-2")
|
||||
(button
|
||||
("class" "bold red quaternary")
|
||||
("onclick" "document.getElementById('poll_options_dialog').close()")
|
||||
("type" "button")
|
||||
(text "{{ icon \"x\" }} {{ text \"dialog:action.close\" }}"))))))
|
||||
|
||||
(text "{%- endmacro %}")
|
||||
(text "{% macro poll(post, poll) -%}")
|
||||
(div
|
||||
("class" "card tertiary w-full flex flex-col gap-2")
|
||||
(text "{% set total = poll[0].votes_a + poll[0].votes_b + poll[0].votes_c + poll[0].votes_d %}")
|
||||
|
||||
(text "{% if poll[1] -%}")
|
||||
; already voted, show results
|
||||
(span ("class" "fade") (text "You've already voted!"))
|
||||
|
||||
; option a
|
||||
(div
|
||||
("class" "card w-full flex flex-col gap-2")
|
||||
(span (text "{{ poll[0].option_a }} ({{ poll[0].votes_a }} votes)"))
|
||||
(div ("class" "poll_bar") ("style" "width: {{ (poll[0].votes_a / total) * 100 }}%")))
|
||||
|
||||
; option b
|
||||
(div
|
||||
("class" "card w-full flex flex-col gap-2")
|
||||
(span (text "{{ poll[0].option_b }} ({{ poll[0].votes_b }} votes)"))
|
||||
(div ("class" "poll_bar") ("style" "width: {{ (poll[0].votes_b / total) * 100 }}%")))
|
||||
|
||||
; option c
|
||||
(text "{% if poll[0].option_c -%}")
|
||||
(div
|
||||
("class" "card w-full flex flex-col gap-2")
|
||||
(span (text "{{ poll[0].option_c }} ({{ poll[0].votes_c }} votes)"))
|
||||
(div ("class" "poll_bar") ("style" "width: {{ (poll[0].votes_c / total) * 100 }}%")))
|
||||
(text "{%- endif %}")
|
||||
|
||||
; option d
|
||||
(text "{% if poll[0].option_d -%}")
|
||||
(div
|
||||
("class" "card w-full flex flex-col gap-2")
|
||||
(span (text "{{ poll[0].option_d }} ({{ poll[0].votes_d }} votes)"))
|
||||
(div ("class" "poll_bar") ("style" "width: {{ (poll[0].votes_d / total) * 100 }}%")))
|
||||
(text "{%- endif %}")
|
||||
(text "{% else %}")
|
||||
; not voted yet, just show options so user can vote
|
||||
|
||||
; option a
|
||||
(button
|
||||
("class" "hover_left_bar tertiary justify-start w-full")
|
||||
("onclick" "trigger('me::vote', ['{{ post.id }}', 'A'])")
|
||||
(icon (text "tally-1"))
|
||||
(text "{{ poll[0].option_a }}"))
|
||||
|
||||
; option b
|
||||
(button
|
||||
("class" "hover_left_bar tertiary justify-start w-full")
|
||||
("onclick" "trigger('me::vote', ['{{ post.id }}', 'B'])")
|
||||
(icon (text "tally-2"))
|
||||
(text "{{ poll[0].option_b }}"))
|
||||
|
||||
; option c
|
||||
(text "{% if poll[0].option_c -%}")
|
||||
(button
|
||||
("class" "hover_left_bar tertiary justify-start w-full")
|
||||
("onclick" "trigger('me::vote', ['{{ post.id }}', 'C'])")
|
||||
(icon (text "tally-3"))
|
||||
(text "{{ poll[0].option_c }}"))
|
||||
(text "{%- endif %}")
|
||||
|
||||
; option d
|
||||
(text "{% if poll[0].option_d -%}")
|
||||
(button
|
||||
("class" "hover_left_bar tertiary justify-start w-full")
|
||||
("onclick" "trigger('me::vote', ['{{ post.id }}', 'D'])")
|
||||
(icon (text "tally-4"))
|
||||
(text "{{ poll[0].option_d }}"))
|
||||
(text "{%- endif %}")
|
||||
(text "{%- endif %}")
|
||||
|
||||
; show expiration date + totals
|
||||
(div
|
||||
("class" "flex w-full flex-wrap gap-2")
|
||||
(span ("class" "notification chip") (text "{{ total }} votes"))))
|
||||
(text "{%- endmacro %}")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue