From c7a29e51f9747a9caf8544de679ad4abd83e56b4 Mon Sep 17 00:00:00 2001 From: Matias De lellis Date: Mon, 15 Jun 2020 23:07:31 -0300 Subject: [PATCH] Add dialog to share with users --- js/qn-dialogs.js | 110 ++++++++++++++++++++++++++++++ js/script.js | 46 ++++++++++++- js/templates/note-item.handlebars | 24 ++----- js/templates/notes.handlebars | 20 +++--- js/templates/shares.handlebars | 5 +- 5 files changed, 170 insertions(+), 35 deletions(-) diff --git a/js/qn-dialogs.js b/js/qn-dialogs.js index 360c115..3470b48 100644 --- a/js/qn-dialogs.js +++ b/js/qn-dialogs.js @@ -56,6 +56,9 @@ const QnDialogs = { data.push({id: item.id, text: item.name}); }); return data; + }, + formatNoMatches: function() { + return t('quicknotes', 'No tags found'); } }); @@ -125,6 +128,113 @@ const QnDialogs = { $('.select2-input').focus(); }); }, + shares: function (availableUsers, selectedUsers, callback) { + return $.when(this._getMessageTemplate()).then(function ($tmpl) { + var dialogName = 'qn-dialog-content'; + var dialogId = '#' + dialogName; + var $dlg = $tmpl.octemplate({ + dialog_name: dialogName, + title: t('quicknotes', 'Share note'), + message: t('quicknotes', 'Select the users to share'), + type: 'none' + }); + + var input = $(''); + input.attr('type', 'text'); + input.attr('id', dialogName + '-input'); + input.attr('multiple', 'multiple'); + + $dlg.append(input); + $('body').append($dlg); + + input.select2({ + placeholder: t('quicknotes', 'Select the users to share'), + multiple: true, + allowClear: true, + toggleSelect: true, + createSearchChoice: function(params) { + return undefined; + }, + tags: function () { + var data = []; + availableUsers.forEach(function (item, index) { + // Select2 expect id, text. + data.push({id: item, text: item}); + }); + return data; + }, + formatNoMatches: function() { + return t('quicknotes', 'No user found'); + } + }); + + input.val(selectedUsers.map(function (value) { return value.name })); + input.trigger("change"); + + $('.select2-input').on("keyup", function (event) { + if (event.keyCode === 27) { + event.preventDefault(); + event.stopPropagation(); + input.select2('close'); + if (callback !== undefined) { + callback(false, []); + } + $(dialogId).ocdialog('close'); + } + }); + + // wrap callback in _.once(): + // only call callback once and not twice (button handler and close + // event) but call it for the close event, if ESC or the x is hit + if (callback !== undefined) { + callback = _.once(callback); + } + + var buttonlist = [{ + text: t('quicknotes', 'Cancel'), + click: function () { + input.select2('close'); + if (callback !== undefined) { + callback(false, []); + } + $(dialogId).ocdialog('close'); + } + }, { + text: t('quicknotes', 'Done'), + click: function () { + input.select2('close'); + if (callback !== undefined) { + var users = []; + // Quicknotes shares expect id, shared_user + newUsers = input.select2("data"); + newUsers.forEach(function (item) { + item['shared_user'] = item.text; + users.push(item); + }); + callback(true, users); + } + $(dialogId).ocdialog('close'); + }, + defaultButton: true + } + ]; + + $(dialogId).ocdialog({ + closeOnEscape: false, + modal: true, + buttons: buttonlist, + close: function () { + input.select2("close"); + // callback is already fired if Yes/No is clicked directly + if (callback !== undefined) { + callback(false, input.val()); + } + } + }); + + $('.select2-input').focus(); + }); + }, _getMessageTemplate: function () { var defer = $.Deferred(); if (!this.$messageTemplate) { diff --git a/js/script.js b/js/script.js index e07930e..c68c93b 100644 --- a/js/script.js +++ b/js/script.js @@ -29,6 +29,9 @@ var Notes = function (baseUrl) { this._baseUrl = baseUrl; this._notes = []; this._loaded = false; + + this._usersSharing = []; + this._loadUsersSharing(); }; Notes.prototype = { @@ -71,6 +74,9 @@ Notes.prototype = { }); return Ccolors; }, + getUsersSharing: function () { + return this._usersSharing; + }, // Get the tags used in the notes getTags: function () { var tags = []; @@ -136,6 +142,23 @@ Notes.prototype = { deferred.reject(); }); return deferred.promise(); + }, + // Get the users to share in the notes + _loadUsersSharing: function () { + var self = this; + $.get(OC.linkToOCS('apps/files_sharing/api/v1/', 1) + 'sharees', { + format: 'json', + itemType: 'principals' + }).done(function (shares) { + var users = []; + console.log(shares); + $.each(shares.ocs.data.exact.users, function(index, user) { + users.push(user.value.shareWith); + }); + self._usersSharing = users; + }).fail(function () { + console.error("Could not get users to share."); + }); } }; @@ -164,7 +187,7 @@ View.prototype = { this._editableContent(note.content); this._editablePinned(note.ispinned); this._editableColor(note.color); - this._editableShares(note.shared_by, note.shared_with); + this._editableShares(note.shared_with, note.shared_by); this._editableTags(note.tags); this._editableAttachts(note.attachts); @@ -455,6 +478,23 @@ View.prototype = { $('#modal-note-div #tag-button').trigger( "click"); }); + // handle tags button. + $('#modal-note-div #share-button').click(function (event) { + event.stopPropagation(); + QnDialogs.shares( + self._notes.getUsersSharing(), + self._editableShares(), + function(result, newShares) { + if (result === true) { + self._editableShares(newShares, []); + } + }, + true, + t('quicknotes', 'Shares'), + false + ); + }); + // handle attach button. $('#modal-note-div #attach-button').click(function (event) { event.stopPropagation(); @@ -731,11 +771,11 @@ View.prototype = { $("#modal-note-div .quicknote").css("background-color", color); } }, - _editableShares: function(shared_by, shared_with) { + _editableShares: function(shared_with, shared_by) { if (shared_with === undefined) { return $("#modal-note-div .slim-share").toArray().map(function (value) { return { - id: value.getAttribute('tag-id'), + id: value.getAttribute('share-id'), name: value.textContent.trim() }; }); diff --git a/js/templates/note-item.handlebars b/js/templates/note-item.handlebars index 517acf9..bfa9706 100644 --- a/js/templates/note-item.handlebars +++ b/js/templates/note-item.handlebars @@ -1,16 +1,5 @@
-
- {{#if isshared}} -
-
-
- {{{ title }}} -
-
-
- {{{ content }}} -
- {{else}} +
{{#each attachts}} @@ -28,11 +17,6 @@
{{/if}}
-
{{{ title }}}
@@ -40,12 +24,16 @@
{{{ content }}}
+
+ {{#each shared_with}} + + {{/each}} +
{{#each tags}}
{{{ name }}}
{{/each}}
- {{/if}}
\ No newline at end of file diff --git a/js/templates/notes.handlebars b/js/templates/notes.handlebars index 9b63dd5..693c6c0 100644 --- a/js/templates/notes.handlebars +++ b/js/templates/notes.handlebars @@ -14,14 +14,17 @@
- {{#unless is_shared}} - {{#if ispinned}} -
+ {{#if is_shared}} +
+
{{else}} -
+ {{#if ispinned}} +
+ {{else}} +
+ {{/if}} +
{{/if}} - {{/unless}} -
{{{ title }}}
@@ -31,10 +34,7 @@
{{#each shared_with}} - - {{/each}} - {{#each shared_by}} - + {{/each}}
diff --git a/js/templates/shares.handlebars b/js/templates/shares.handlebars index 3efea72..ec60989 100644 --- a/js/templates/shares.handlebars +++ b/js/templates/shares.handlebars @@ -1,8 +1,5 @@
{{#each shared_with}} - - {{/each}} - {{#each shared_by}} - + {{/each}}
\ No newline at end of file