aboutsummaryrefslogtreecommitdiffstats
path: root/web_src/js/features/comp/ReactionSelector.js
diff options
context:
space:
mode:
Diffstat (limited to 'web_src/js/features/comp/ReactionSelector.js')
-rw-r--r--web_src/js/features/comp/ReactionSelector.js48
1 files changed, 48 insertions, 0 deletions
diff --git a/web_src/js/features/comp/ReactionSelector.js b/web_src/js/features/comp/ReactionSelector.js
new file mode 100644
index 0000000000..d11c9667b9
--- /dev/null
+++ b/web_src/js/features/comp/ReactionSelector.js
@@ -0,0 +1,48 @@
+const {csrf} = window.config;
+
+export function initCompReactionSelector(parent) {
+ let reactions = '';
+ if (!parent) {
+ parent = $(document);
+ reactions = '.reactions > ';
+ }
+
+ parent.find(`${reactions}a.label`).popup({position: 'bottom left', metadata: {content: 'title', title: 'none'}});
+
+ parent.find(`.select-reaction > .menu > .item, ${reactions}a.label`).on('click', function (e) {
+ e.preventDefault();
+
+ if ($(this).hasClass('disabled')) return;
+
+ const actionURL = $(this).hasClass('item') ? $(this).closest('.select-reaction').data('action-url') : $(this).data('action-url');
+ const url = `${actionURL}/${$(this).hasClass('blue') ? 'unreact' : 'react'}`;
+ $.ajax({
+ type: 'POST',
+ url,
+ data: {
+ _csrf: csrf,
+ content: $(this).data('content')
+ }
+ }).done((resp) => {
+ if (resp && (resp.html || resp.empty)) {
+ const content = $(this).closest('.content');
+ let react = content.find('.segment.reactions');
+ if ((!resp.empty || resp.html === '') && react.length > 0) {
+ react.remove();
+ }
+ if (!resp.empty) {
+ react = $('<div class="ui attached segment reactions"></div>');
+ const attachments = content.find('.segment.bottom:first');
+ if (attachments.length > 0) {
+ react.insertBefore(attachments);
+ } else {
+ react.appendTo(content);
+ }
+ react.html(resp.html);
+ react.find('.dropdown').dropdown();
+ initCompReactionSelector(react);
+ }
+ }
+ });
+ });
+}