Improve share modal UI

This commit is contained in:
yflory 2019-09-12 18:51:03 +02:00
parent 306fc6cdb9
commit 353da76808
5 changed files with 132 additions and 94 deletions

View File

@ -314,6 +314,16 @@
&::-moz-focus-inner { &::-moz-focus-inner {
border: 0; border: 0;
} }
&:disabled {
cursor: not-allowed !important;
background-color: @colortheme_alertify-disabled;
color: @colortheme_alertify-disabled-text;
border-color: @colortheme_alertify-disabled-border;
&:hover, &:active {
background-color: @colortheme_alertify-disabled;
}
}
} }
button.btn { button.btn {
@ -430,6 +440,15 @@
& > .cp-share-column { & > .cp-share-column {
width: 50%; width: 50%;
padding: 0 10px; padding: 0 10px;
position: relative;
&.contains-nav {
padding-bottom: 50px;
}
nav {
position: absolute;
bottom: 0;
right: 0;
}
} }
} }
.cp-share-grid, .cp-share-list { .cp-share-grid, .cp-share-list {

View File

@ -51,6 +51,9 @@
@colortheme_alertify-primary: @colortheme_form-bg; @colortheme_alertify-primary: @colortheme_form-bg;
@colortheme_alertify-primary-text: @colortheme_form-color; @colortheme_alertify-primary-text: @colortheme_form-color;
@colortheme_alertify-primary-border: transparent; @colortheme_alertify-primary-border: transparent;
@colortheme_alertify-disabled: #6c757d;
@colortheme_alertify-disabled-text: #ffffff;
@colortheme_alertify-disabled-border: #6c757d;
@colortheme_alertify-cancel: @colortheme_modal-bg; @colortheme_alertify-cancel: @colortheme_modal-bg;
@colortheme_alertify-cancel-border: #ccc; @colortheme_alertify-cancel-border: #ccc;

View File

@ -159,13 +159,21 @@ define([
dialog.frame = function (content, opt) { dialog.frame = function (content, opt) {
opt = opt || {}; opt = opt || {};
var cls = opt.wide ? '.wide' : ''; var cls = opt.wide ? '.wide' : '';
return $(h('div.alertify', { var frame = h('div.alertify', {
tabindex: 1, tabindex: 1,
}, [ }, [
h('div.dialog', [ h('div.dialog', [
h('div'+cls, content), h('div'+cls, content),
]) ])
])).click(function (e) { ]);
var $frame = $(frame);
frame.closeModal = function (cb) {
$frame.fadeOut(150, function () {
$frame.detach();
cb();
});
};
return $frame.click(function (e) {
e.stopPropagation(); e.stopPropagation();
})[0]; })[0];
}; };
@ -329,6 +337,28 @@ define([
return tagger; return tagger;
}; };
dialog.getButtons = function (buttons, onClose) {
if (!Array.isArray(buttons)) { return void console.error('Not an array'); }
var navs = [];
buttons.forEach(function (b) {
if (!b.name || !b.onClick) { return; }
var button = h('button', { tabindex: '1', 'class': b.className || '' }, b.name);
$(button).click(function () {
b.onClick();
var $modal = $(button).parents('.alertify').first();
if ($modal.length && $modal[0].closeModal) {
$modal[0].closeModal(function () {
if (onClose) {
onClose();
}
});
}
});
if (b.keys && b.keys.length) { $(button).attr('data-keys', JSON.stringify(b.keys)); }
navs.push(button);
});
return dialog.nav(navs);
};
dialog.customModal = function (msg, opt) { dialog.customModal = function (msg, opt) {
var force = false; var force = false;
if (typeof(opt) === 'object') { if (typeof(opt) === 'object') {
@ -350,29 +380,9 @@ define([
message = dialog.message(msg); message = dialog.message(msg);
} }
var close = function (el) {
var $el = $(el).fadeOut(150, function () {
$el.detach();
if (opt.onClose) {
opt.onClose();
}
});
};
var navs = [];
opt.buttons.forEach(function (b) {
if (!b.name || !b.onClick) { return; }
var button = h('button', { tabindex: '1', 'class': b.className || '' }, b.name);
$(button).click(function () {
b.onClick();
close($(button).parents('.alertify').first());
});
if (b.keys && b.keys.length) { $(button).attr('data-keys', JSON.stringify(b.keys)); }
navs.push(button);
});
var frame = h('div', [ var frame = h('div', [
message, message,
dialog.nav(navs), dialog.getButtons(opt.buttons, opt.onClose)
]); ]);
if (opt.forefront) { $(frame).addClass('forefront'); } if (opt.forefront) { $(frame).addClass('forefront'); }

View File

@ -646,7 +646,7 @@ define([
return h('div.cp-share-friend', { return h('div.cp-share-friend', {
'data-ed': data.edPublic, 'data-ed': data.edPublic,
'data-curve': data.curvePublic, 'data-curve': data.curvePublic,
'data-name': name, 'data-name': name.toLowerCase(),
'data-order': i, 'data-order': i,
title: name, title: name,
style: 'order:'+i+';' style: 'order:'+i+';'
@ -691,7 +691,7 @@ define([
// Hide friends when they are filtered using the text input // Hide friends when they are filtered using the text input
var redraw = function () { var redraw = function () {
var name = $(inputFilter).val().trim().replace(/"/g, ''); var name = $(inputFilter).val().trim().replace(/"/g, '').toLowerCase();
$div.find('.cp-share-friend').show(); $div.find('.cp-share-friend').show();
if (name) { if (name) {
$div.find('.cp-share-friend:not(.cp-selected):not([data-name*="'+name+'"])').hide(); $div.find('.cp-share-friend:not(.cp-selected):not([data-name*="'+name+'"])').hide();
@ -746,11 +746,26 @@ define([
// Also create the "share with friends" button if it doesn't exist // Also create the "share with friends" button if it doesn't exist
var refreshButtons = function () { var refreshButtons = function () {
var $nav = $div.parents('.alertify').find('nav'); var $nav = $div.parents('.alertify').find('nav');
if (!$nav.find('.cp-share-with-friends').length) {
var button = h('button.primary.cp-share-with-friends', { var friendMode = $div.find('.cp-share-friend.cp-selected').length;
'data-keys': '[13]' console.log(friendMode, Boolean(friendMode));
}, Messages.share_withFriends); if (friendMode) {
$(button).click(function () { $nav.find('button.cp-share-with-friends').prop('disabled', '');
} else {
$nav.find('button.cp-share-with-friends').prop('disabled', 'disabled');
}
};
var friendsList = UIElements.getFriendsList(Messages.share_linkFriends, config, refreshButtons);
var div = friendsList.div;
$div = $(div);
$div.addClass('contains-nav');
var others = friendsList.others;
var shareButtons = [{
className: 'primary cp-share-with-friends',
name: Messages.share_withFriends,
onClick: function () {
var href = Hash.getRelativeHref($('#cp-share-link-preview').val()); var href = Hash.getRelativeHref($('#cp-share-link-preview').val());
var $friends = $div.find('.cp-share-friend.cp-selected'); var $friends = $div.find('.cp-share-friend.cp-selected');
$friends.each(function (i, el) { $friends.each(function (i, el) {
@ -788,24 +803,9 @@ define([
if (onShare) { if (onShare) {
onShare.fire(); onShare.fire();
} }
}); },
$nav.append(button); keys: [13]
} }];
var friendMode = $div.find('.cp-share-friend.cp-selected').length;
if (friendMode) {
$nav.find('button.primary[data-keys]').hide();
$nav.find('button.cp-share-with-friends').show();
} else {
$nav.find('button.primary[data-keys]').show();
$nav.find('button.cp-share-with-friends').hide();
}
};
var friendsList = UIElements.getFriendsList(Messages.share_linkFriends, config, refreshButtons);
var div = friendsList.div;
$div = $(div);
var others = friendsList.others;
common.getAttribute(['general', 'share-friends'], function (err, val) { common.getAttribute(['general', 'share-friends'], function (err, val) {
order = val || []; order = val || [];
@ -830,6 +830,7 @@ define([
}); });
// Display them // Display them
$div.append(h('div.cp-share-grid', others)); $div.append(h('div.cp-share-grid', others));
$div.append(UI.dialog.getButtons(shareButtons, config.onClose));
$div.find('.cp-share-friend').click(function () { $div.find('.cp-share-friend').click(function () {
var sel = $(this).hasClass('cp-selected'); var sel = $(this).hasClass('cp-selected');
if (!sel) { if (!sel) {
@ -841,6 +842,7 @@ define([
} }
refreshButtons(); refreshButtons();
}); });
refreshButtons();
}); });
return div; return div;
}; };
@ -859,8 +861,7 @@ define([
var friendsList = hasFriends ? createShareWithFriends(config, onFriendShare) : undefined; var friendsList = hasFriends ? createShareWithFriends(config, onFriendShare) : undefined;
var friendsUIClass = hasFriends ? '.cp-share-columns' : ''; var friendsUIClass = hasFriends ? '.cp-share-columns' : '';
var link = h('div.cp-share-modal' + friendsUIClass, [ var mainShareColumn = h('div.cp-share-column.contains-nav', [
h('div.cp-share-column', [
hasFriends ? h('p', Messages.share_description) : undefined, hasFriends ? h('p', Messages.share_description) : undefined,
h('label', Messages.share_linkAccess), h('label', Messages.share_linkAccess),
h('br'), h('br'),
@ -875,9 +876,8 @@ define([
UI.createCheckbox('cp-share-present', Messages.share_linkPresent, false, { mark: {tabindex:1} }), UI.createCheckbox('cp-share-present', Messages.share_linkPresent, false, { mark: {tabindex:1} }),
h('br'), h('br'),
UI.dialog.selectable('', { id: 'cp-share-link-preview', tabindex: 1 }), UI.dialog.selectable('', { id: 'cp-share-link-preview', tabindex: 1 }),
]),
friendsList
]); ]);
var link = h('div.cp-share-modal' + friendsUIClass);
if (!hashes.editHash) { if (!hashes.editHash) {
$(link).find('#cp-share-editable-false').attr('checked', true); $(link).find('#cp-share-editable-false').attr('checked', true);
$(link).find('#cp-share-editable-true').removeAttr('checked').attr('disabled', true); $(link).find('#cp-share-editable-true').removeAttr('checked').attr('disabled', true);
@ -913,7 +913,8 @@ define([
name: Messages.cancel, name: Messages.cancel,
onClick: function () {}, onClick: function () {},
keys: [27] keys: [27]
}, { }];
var shareButtons = [{
className: 'primary', className: 'primary',
name: Messages.share_linkCopy, name: Messages.share_linkCopy,
onClick: function () { onClick: function () {
@ -933,6 +934,11 @@ define([
}, },
keys: [[13, 'ctrl']] keys: [[13, 'ctrl']]
}]; }];
var $link = $(link);
$(mainShareColumn).append(UI.dialog.getButtons(shareButtons, config.onClose)).appendTo($link);
$(friendsList).appendTo($link);
var frameLink = UI.dialog.customModal(link, { var frameLink = UI.dialog.customModal(link, {
buttons: linkButtons, buttons: linkButtons,
onClose: config.onClose, onClose: config.onClose,

View File

@ -1068,7 +1068,7 @@
"notification_padShared": "{0} a partagé un pad avec vous : <b>{1}</b>", "notification_padShared": "{0} a partagé un pad avec vous : <b>{1}</b>",
"notification_fileShared": "{0} a partagé un fichier avec vous : <b>{1}</b>", "notification_fileShared": "{0} a partagé un fichier avec vous : <b>{1}</b>",
"notification_folderShared": "{0} a partagé un dossier avec vous : <b>{1}</b>", "notification_folderShared": "{0} a partagé un dossier avec vous : <b>{1}</b>",
"share_selectAll": "Tout sélectionner", "share_selectAll": "Tout",
"share_deselectAll": "Aucun", "share_deselectAll": "Aucun",
"share_filterFriend": "Rechercher par nom", "share_filterFriend": "Rechercher par nom",
"share_linkFriends": "Partager avec des amis", "share_linkFriends": "Partager avec des amis",