From ed722f7385c2fee2007bce739c5514914b63d918 Mon Sep 17 00:00:00 2001 From: yflory Date: Thu, 26 Mar 2020 13:12:41 +0100 Subject: [PATCH] Fix properties and access modal being opened multiple times at once --- www/common/common-ui-elements.js | 859 +------------------------------ www/common/drive-ui.js | 4 +- www/common/inner/access.js | 234 ++------- www/common/inner/common-modal.js | 156 ++++++ www/common/inner/properties.js | 181 +++++++ 5 files changed, 396 insertions(+), 1038 deletions(-) create mode 100644 www/common/inner/common-modal.js create mode 100644 www/common/inner/properties.js diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index fefbba6e1..880c4c354 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -99,857 +99,6 @@ define([ }); }; }; -/* - var getPropertiesData = function (common, cb) { - var data = {}; - NThen(function (waitFor) { - var base = common.getMetadataMgr().getPrivateData().origin; - common.getPadAttribute('', waitFor(function (err, val) { - if (err || !val) { - waitFor.abort(); - return void cb(err || 'EEMPTY'); - } - if (!val.fileType) { - delete val.owners; - delete val.expire; - } - Util.extend(data, val); - if (data.href) { data.href = base + data.href; } - if (data.roHref) { data.roHref = base + data.roHref; } - })); - common.getPadMetadata(null, waitFor(function (obj) { - if (obj && obj.error) { return; } - data.owners = obj.owners; - data.expire = obj.expire; - data.pending_owners = obj.pending_owners; - })); - }).nThen(function () { - cb(void 0, data); - }); - }; -*/ - var getPropertiesData = function (common, opts, cb) { - opts = opts || {}; - var data = {}; - NThen(function (waitFor) { - var base = common.getMetadataMgr().getPrivateData().origin; - common.getPadAttribute('', waitFor(function (err, val) { - if (err || !val) { - waitFor.abort(); - return void cb(err || 'EEMPTY'); - } - if (!val.fileType) { - delete val.owners; - delete val.expire; - } - Util.extend(data, val); - if (data.href) { data.href = base + data.href; } - if (data.roHref) { data.roHref = base + data.roHref; } - }), opts.href); - - // If this is a file, don't try to look for metadata - if (opts.channel && opts.channel.length > 34) { return; } - common.getPadMetadata({ - channel: opts.channel // optional, fallback to current pad - }, waitFor(function (obj) { - if (obj && obj.error) { return; } - data.owners = obj.owners; - data.expire = obj.expire; - data.pending_owners = obj.pending_owners; - })); - }).nThen(function () { - cb(void 0, data); - }); - }; - - -/* - var createOwnerModal = function (common, data) { - var friends = common.getFriends(true); - var sframeChan = common.getSframeChannel(); - var priv = common.getMetadataMgr().getPrivateData(); - var user = common.getMetadataMgr().getUserData(); - var edPublic = priv.edPublic; - var channel = data.channel; - var owners = data.owners || []; - var pending_owners = data.pending_owners || []; - var teams = priv.teams; - var teamOwner = data.teamId; - - var redrawAll = function () {}; - - var div1 = h('div.cp-usergrid-user.cp-share-column.cp-ownership'); - var div2 = h('div.cp-usergrid-user.cp-share-column.cp-ownership'); - var $div1 = $(div1); - var $div2 = $(div2); - - // Remove owner column - var drawRemove = function (pending) { - var _owners = {}; - var o = (pending ? pending_owners : owners) || []; - o.forEach(function (ed) { - var f; - Object.keys(friends).some(function (c) { - if (friends[c].edPublic === ed) { - f = friends[c]; - return true; - } - }); - Object.keys(teams).some(function (id) { - if (teams[id].edPublic === ed) { - f = teams[id]; - f.teamId = id; - } - }); - if (ed === edPublic) { - f = f || user; - if (f.name) { f.edPublic = edPublic; } - } - _owners[ed] = f || { - displayName: Messages._getKey('owner_unknownUser', [ed]), - edPublic: ed, - }; - }); - var msg = pending ? Messages.owner_removePendingText - : Messages.owner_removeText; - var removeCol = UIElements.getUserGrid(msg, { - common: common, - large: true, - data: _owners, - noFilter: true - }, function () { - }); - var $div = $(removeCol.div); - // When clicking on the remove button, we check the selected users. - // If you try to remove yourself, we'll display an additional warning message - var btnMsg = pending ? Messages.owner_removePendingButton : Messages.owner_removeButton; - var removeButton = h('button.no-margin', btnMsg); - $(removeButton).click(function () { - // Check selection - var $sel = $div.find('.cp-usergrid-user.cp-selected'); - var sel = $sel.toArray(); - if (!sel.length) { return; } - var me = false; - var toRemove = sel.map(function (el) { - var ed = $(el).attr('data-ed'); - if (!ed) { return; } - if (teamOwner && teams[teamOwner] && teams[teamOwner].edPublic === ed) { me = true; } - if (ed === edPublic && !teamOwner) { me = true; } - return ed; - }).filter(function (x) { return x; }); - NThen(function (waitFor) { - var msg = me ? Messages.owner_removeMeConfirm : Messages.owner_removeConfirm; - UI.confirm(msg, waitFor(function (yes) { - if (!yes) { - waitFor.abort(); - return; - } - })); - }).nThen(function (waitFor) { - // Send the command - sframeChan.query('Q_SET_PAD_METADATA', { - channel: channel, - command: pending ? 'RM_PENDING_OWNERS' : 'RM_OWNERS', - value: toRemove, - teamId: teamOwner - }, waitFor(function (err, res) { - err = err || (res && res.error); - if (err) { - waitFor.abort(); - redrawAll(); - var text = err === "INSUFFICIENT_PERMISSIONS" ? Messages.fm_forbidden - : Messages.error; - return void UI.warn(text); - } - UI.log(Messages.saved); - })); - }).nThen(function (waitFor) { - sel.forEach(function (el) { - var curve = $(el).attr('data-curve'); - var friend = curve === user.curvePublic ? user : friends[curve]; - if (!friend) { return; } - common.mailbox.sendTo("RM_OWNER", { - channel: channel, - title: data.title, - pending: pending - }, { - channel: friend.notifications, - curvePublic: friend.curvePublic - }, waitFor()); - }); - }).nThen(function () { - redrawAll(); - }); - }); - $div.append(h('p', removeButton)); - return $div; - }; - - // Add owners column - var drawAdd = function () { - var $div = $(h('div.cp-share-column')); - var _friends = JSON.parse(JSON.stringify(friends)); - Object.keys(_friends).forEach(function (curve) { - if (owners.indexOf(_friends[curve].edPublic) !== -1 || - pending_owners.indexOf(_friends[curve].edPublic) !== -1 || - !_friends[curve].notifications) { - delete _friends[curve]; - } - }); - var addCol = UIElements.getUserGrid(Messages.owner_addText, { - common: common, - large: true, - data: _friends - }, function () { - //console.log(arguments); - }); - $div.append(addCol.div); - - var teamsData = Util.tryParse(JSON.stringify(priv.teams)) || {}; - Object.keys(teamsData).forEach(function (id) { - var t = teamsData[id]; - t.teamId = id; - if (owners.indexOf(t.edPublic) !== -1 || pending_owners.indexOf(t.edPublic) !== -1) { - delete teamsData[id]; - } - }); - var teamsList = UIElements.getUserGrid(Messages.owner_addTeamText, { - common: common, - large: true, - noFilter: true, - data: teamsData - }, function () {}); - $div.append(teamsList.div); - - // When clicking on the add button, we get the selected users. - var addButton = h('button.no-margin', Messages.owner_addButton); - $(addButton).click(function () { - // Check selection - var $sel = $div.find('.cp-usergrid-user.cp-selected'); - var sel = $sel.toArray(); - if (!sel.length) { return; } - var toAdd = sel.map(function (el) { - var curve = $(el).attr('data-curve'); - // If the pad is woned by a team, we can transfer ownership to ourselves - if (curve === user.curvePublic && teamOwner) { return priv.edPublic; } - var friend = friends[curve]; - if (!friend) { return; } - return friend.edPublic; - }).filter(function (x) { return x; }); - var toAddTeams = sel.map(function (el) { - var team = teamsData[$(el).attr('data-teamid')]; - if (!team || !team.edPublic) { return; } - return { - edPublic: team.edPublic, - id: $(el).attr('data-teamid') - }; - }).filter(function (x) { return x; }); - - NThen(function (waitFor) { - var msg = Messages.owner_addConfirm; - UI.confirm(msg, waitFor(function (yes) { - if (!yes) { - waitFor.abort(); - return; - } - })); - }).nThen(function (waitFor) { - // Add one of our teams as an owner - if (toAddTeams.length) { - // Send the command - sframeChan.query('Q_SET_PAD_METADATA', { - channel: channel, - command: 'ADD_OWNERS', - value: toAddTeams.map(function (obj) { return obj.edPublic; }), - teamId: teamOwner - }, waitFor(function (err, res) { - err = err || (res && res.error); - if (err) { - waitFor.abort(); - redrawAll(); - var text = err === "INSUFFICIENT_PERMISSIONS" ? - Messages.fm_forbidden : Messages.error; - return void UI.warn(text); - } - var isTemplate = priv.isTemplate || data.isTemplate; - toAddTeams.forEach(function (obj) { - sframeChan.query('Q_STORE_IN_TEAM', { - href: data.href || data.rohref, - password: data.password, - path: isTemplate ? ['template'] : undefined, - title: data.title || '', - teamId: obj.id - }, waitFor(function (err) { - if (err) { return void console.error(err); } - })); - }); - })); - } - }).nThen(function (waitFor) { - // Offer ownership to a friend - if (toAdd.length) { - // Send the command - sframeChan.query('Q_SET_PAD_METADATA', { - channel: channel, - command: 'ADD_PENDING_OWNERS', - value: toAdd, - teamId: teamOwner - }, waitFor(function (err, res) { - err = err || (res && res.error); - if (err) { - waitFor.abort(); - redrawAll(); - var text = err === "INSUFFICIENT_PERMISSIONS" ? Messages.fm_forbidden - : Messages.error; - return void UI.warn(text); - } - })); - } - }).nThen(function (waitFor) { - sel.forEach(function (el) { - var curve = $(el).attr('data-curve'); - var friend = curve === user.curvePublic ? user : friends[curve]; - if (!friend) { return; } - common.mailbox.sendTo("ADD_OWNER", { - channel: channel, - href: data.href, - password: data.password, - title: data.title - }, { - channel: friend.notifications, - curvePublic: friend.curvePublic - }, waitFor()); - }); - }).nThen(function () { - redrawAll(); - UI.log(Messages.saved); - }); - }); - $div.append(h('p', addButton)); - return $div; - }; - - redrawAll = function (md) { - var todo = function (obj) { - if (obj && obj.error) { return; } - owners = obj.owners || []; - pending_owners = obj.pending_owners || []; - $div1.empty(); - $div2.empty(); - $div1.append(drawRemove(false)).append(drawRemove(true)); - $div2.append(drawAdd()); - }; - - if (md) { return void todo(md); } - common.getPadMetadata({ - channel: data.channel - }, todo); - }; - - $div1.append(drawRemove(false)).append(drawRemove(true)); - $div2.append(drawAdd()); - - var handler = sframeChan.on('EV_RT_METADATA', function (md) { - if (!$div1.length) { - return void handler.stop(); - } - owners = md.owners || []; - pending_owners = md.pending_owners || []; - redrawAll(md); - }); - - // Create modal - var link = h('div.cp-share-columns', [ - div1, - div2 - // drawRemove()[0], - //drawAdd()[0] - ]); - var linkButtons = [{ - className: 'cancel', - name: Messages.filePicker_close, - onClick: function () {}, - keys: [27] - }]; - return UI.dialog.customModal(link, {buttons: linkButtons}); - }; -*/ -/* - var getRightsProperties = function (common, data, cb) { - var $div = $('
'); - if (!data) { return void cb(void 0, $div); } - - var draw = function () { - var $d = $('
'); - var priv = common.getMetadataMgr().getPrivateData(); - var user = common.getMetadataMgr().getUserData(); - var edPublic = priv.edPublic; - var owned = false; - var _owners = {}; - if (data.owners && data.owners.length) { - if (data.owners.indexOf(edPublic) !== -1) { - owned = true; - } else { - Object.keys(priv.teams || {}).some(function (id) { - var team = priv.teams[id] || {}; - if (team.viewer) { return; } - if (data.owners.indexOf(team.edPublic) === -1) { return; } - owned = Number(id); - return true; - }); - } - var strangers = 0; - data.owners.forEach(function (ed) { - // If a friend is an owner, add their name to the list - // otherwise, increment the list of strangers - - // Our edPublic? print "Yourself" - if (ed === edPublic) { - _owners[ed] = { - selected: true, - name: user.name, - avatar: user.avatar - }; - return; - } - // One of our teams? print the team name - if (Object.keys(priv.teams || {}).some(function (id) { - var team = priv.teams[id] || {}; - if (team.edPublic !== ed) { return; } - _owners[ed] = { - name: team.name, - avatar: team.avatar - }; - return true; - })) { - return; - } - // One of our friends? print the friend name - if (Object.keys(priv.friends || {}).some(function (c) { - var friend = priv.friends[c] || {}; - if (friend.edPublic !== ed || c === 'me') { return; } - _owners[friend.edPublic] = { - name: friend.displayName, - avatar: friend.avatar - }; - return true; - })) { - return; - } - // Otherwise it's a stranger - strangers++; - }); - if (strangers) { - _owners['stangers'] = { - name: Messages._getKey('properties_unknownUser', [strangers]), - }; - } - } - var _ownersGrid = UIElements.getUserGrid(Messages.creation_owners, { - common: common, - noSelect: true, - data: _owners, - large: true - }, function () {}); - if (_ownersGrid && Object.keys(_owners).length) { - $d.append(_ownersGrid.div); - } else { - $d.append([ - h('label', Messages.creation_owners), - ]); - $d.append(UI.dialog.selectable(Messages.creation_noOwner, { - id: 'cp-app-prop-owners', - })); - - } - - var parsed; - if (data.href || data.roHref) { - parsed = Hash.parsePadUrl(data.href || data.roHref); - } - if (owned && parsed.hashData.type === 'pad') { - var manageOwners = h('button.no-margin', Messages.owner_openModalButton); - $(manageOwners).click(function () { - data.teamId = typeof(owned) !== "boolean" ? owned : undefined; - var modal = createOwnerModal(common, data); - UI.openCustomModal(modal, { - wide: true, - }); - }); - $d.append(h('p', manageOwners)); - } - - if (!data.noExpiration) { - var expire = Messages.creation_expireFalse; - if (data.expire && typeof (data.expire) === "number") { - expire = new Date(data.expire).toLocaleString(); - } - $('