diff --git a/.jshintignore b/.jshintignore index b7a1c570e..45b4087f5 100644 --- a/.jshintignore +++ b/.jshintignore @@ -2,6 +2,7 @@ node_modules/ www/bower_components/ www/common/pdfjs/ www/common/tippy/ +www/common/jquery-ui/ server.js www/common/media-tag.js @@ -14,6 +15,8 @@ www/pad/wysiwygarea-plugin.js www/pad/mediatag-plugin.js www/pad/mediatag-plugin-dialog.js +www/kanban/jkanban.js + www/common/media-tag-nacl.min.js customize/ diff --git a/customize.dist/loading.js b/customize.dist/loading.js index c08b82681..2bc0ec420 100644 --- a/customize.dist/loading.js +++ b/customize.dist/loading.js @@ -45,8 +45,7 @@ define([], function () { flex-shrink: 0; display: flex; flex-flow: column; - justify-content: center; - justify-content: space-evenly; + justify-content: space-around; align-items: center; } @media screen and (max-height: 800px) { diff --git a/customize.dist/pages.js b/customize.dist/pages.js index 281bdc585..1cd3d5f7c 100644 --- a/customize.dist/pages.js +++ b/customize.dist/pages.js @@ -1,10 +1,11 @@ define([ '/api/config', '/common/hyperscript.js', + '/common/common-language.js', '/customize/messages.js', 'jquery', '/customize/application_config.js', -], function (Config, h, Msg, $, AppConfig) { +], function (Config, h, Language, Msg, $, AppConfig) { var Pages = {}; var urlArgs = Config.requireConf.urlArgs; @@ -13,6 +14,26 @@ define([ return e; }; + var languageSelector = function () { + var options = []; + var languages = Msg._languages; + var selected = Msg._languageUsed; + var keys = Object.keys(languages).sort(); + keys.forEach(function (l) { + var attr = { value: l }; + if (selected === l) { attr.selected = 'selected'; } + options.push(h('option', attr, languages[l])); + }); + var select = h('select', {}, options); + $(select).change(function () { + Language.setLanguage($(select).val() || '', null, function () { + window.location.reload(); + }); + }); + return select; + }; + languageSelector = languageSelector; // jshint + var footerCol = function (title, L, literal) { return h('div.col-6.col-sm-3', [ h('ul.list-unstyled', [ @@ -47,7 +68,8 @@ define([ h('div.row', [ footerCol(null, [ h('div.cp-bio-foot', [ - h('p', Msg.main_footerText) + h('p', Msg.main_footerText), + //languageSelector() ]) ], ''), footerCol('footer_applications', [ @@ -56,6 +78,7 @@ define([ footLink('/code/', 'main_code'), footLink('/slide/', 'main_slide'), footLink('/poll/', 'main_poll'), + footLink('/kanban/', 'main_kanban'), footLink('/whiteboard/', null, Msg.type.whiteboard) ]), footerCol('footer_aboutUs', [ @@ -72,7 +95,7 @@ define([ ]) ]) ]), - h('div.cp-version-footer', "CryptPad v2.1.0 (Badger)") + h('div.cp-version-footer', "CryptPad v2.2.0 (Coati)") ]); }; @@ -129,8 +152,8 @@ define([ h('div.container-fluid.cp-about-intro', [ h('div.container', [ h('center', [ - h('h1', Msg.about), - setHTML(h('p'), 'CryptPad is created inside of the Research Team at XWiki SAS, a small business located in Paris France and Iasi Romania. There are 3 core team members working on CryptPad plus a number of contributors both inside and outside of XWiki SAS.'), + h('h1', Msg.about), + setHTML(h('p'), Msg.about_intro), ]), ]), ]), @@ -138,7 +161,7 @@ define([ h('div.row', [ h('div.cp-develop-about.col-12',[ h('div.cp-icon-cent'), - h('h2.text-center', 'Core Developers') + h('h2.text-center', Msg.about_core) ]), ]), h('div.row.align-items-center', [ @@ -189,7 +212,7 @@ define([ h('div.row', [ h('div.cp-develop-about.col-12.cp-contrib',[ h('div.cp-icon-cent'), - h('h2.text-center', 'Key Contributors') + h('h2.text-center', Msg.about_contributors) ]), ]), h('div.row.align-items-center', [ @@ -566,6 +589,7 @@ define([ [ 'code', '/code/', Msg.main_codePad, 'fa-file-code-o' ], [ 'slide', '/slide/', Msg.main_slidePad, 'fa-file-powerpoint-o' ], [ 'poll', '/poll/', Msg.main_pollPad, 'fa-calendar' ], + [ 'kanban', '/kanban/', Msg.main_kanbanPad, 'fa-calendar' ], [ 'whiteboard', '/whiteboard/', Msg.main_whiteboardPad, 'fa-paint-brush' ], [ 'recent', '/drive/', Msg.main_localPads, 'fa-hdd-o' ] ].filter(function (x) { diff --git a/customize.dist/src/less2/include/colortheme.less b/customize.dist/src/less2/include/colortheme.less index 6a0293ae8..b6862c3f4 100644 --- a/customize.dist/src/less2/include/colortheme.less +++ b/customize.dist/src/less2/include/colortheme.less @@ -115,6 +115,10 @@ @colortheme_todo-color: #000; @colortheme_todo-warn: #cd2532; +@colortheme_kanban-bg: #8C4; +@colortheme_kanban-color: #000; +@colortheme_kanban-warn: #e6385d; + // Sidebar layout (profile / settings) @colortheme_sidebar-active: #fff; @colortheme_sidebar-left-bg: #eee; @@ -131,6 +135,7 @@ @cryptpad_color_grey: #999999; @cryptpad_header_col: #1E1F1F; @cryptpad_text_col: #3F4141; +@cryptpad_color_light_blue: #00b7d8; @colortheme_checkmark-back0: @colortheme_form-bg-alt; @colortheme_checkmark-back0-active: @colortheme_form-border; diff --git a/customize.dist/src/less2/include/creation.less b/customize.dist/src/less2/include/creation.less index 57509455e..e2115288a 100644 --- a/customize.dist/src/less2/include/creation.less +++ b/customize.dist/src/less2/include/creation.less @@ -103,7 +103,7 @@ flex-flow: column; align-items: center; flex: 1 0 auto; - justify-content: space-evenly; + justify-content: space-around; & > div { width: 400px; max-width: 100%; diff --git a/customize.dist/src/less2/include/help.less b/customize.dist/src/less2/include/help.less index 90f23119b..0e6e90d87 100644 --- a/customize.dist/src/less2/include/help.less +++ b/customize.dist/src/less2/include/help.less @@ -14,7 +14,7 @@ right: 5px; } .cp-help-text { - color: @color; + color: contrast(lighten(@bg-color, 15%), #fff, #000); //@color; margin: 0; padding: 15px; a { diff --git a/customize.dist/src/less2/include/icon-colors.less b/customize.dist/src/less2/include/icon-colors.less index b787fee1c..283626cfd 100644 --- a/customize.dist/src/less2/include/icon-colors.less +++ b/customize.dist/src/less2/include/icon-colors.less @@ -13,6 +13,7 @@ .cp-icon-color-profile { color: @colortheme_settings-bg; } .cp-icon-color-default { color: @colortheme_default-bg; } .cp-icon-color-todo { color: @colortheme_todo-bg; } + .cp-icon-color-kanban { color: @colortheme_kanban-bg; } .cp-border-color-pad { border-color: @colortheme_pad-bg !important; } .cp-border-color-code { border-color: @colortheme_code-bg !important; } @@ -26,5 +27,6 @@ .cp-border-color-profile { border-color: @colortheme_settings-bg !important; } .cp-border-color-default { border-color: @colortheme_default-bg !important; } .cp-border-color-todo { border-color: @colortheme_todo-bg !important; } + .cp-border-color-kanban { border-color: @colortheme_kanban-bg !important; } } diff --git a/customize.dist/src/less2/include/infopages.less b/customize.dist/src/less2/include/infopages.less index 4282b3499..131877a65 100644 --- a/customize.dist/src/less2/include/infopages.less +++ b/customize.dist/src/less2/include/infopages.less @@ -170,9 +170,8 @@ .nav-link { padding: 0.5em 0.7em; &:hover { - font-size: 1.05em; - //transform: scale(1.05); - }; + color: @cryptpad_color_light_blue; + } } .cp-register-btn { border: 2px solid #4591C4; diff --git a/customize.dist/src/less2/include/tokenfield.less b/customize.dist/src/less2/include/tokenfield.less index 6604b4481..5e518f08c 100644 --- a/customize.dist/src/less2/include/tokenfield.less +++ b/customize.dist/src/less2/include/tokenfield.less @@ -1,25 +1,31 @@ @import (once) "./tools.less"; .tokenfield_main () { + .ui-autocomplete { + z-index: 100001; // alertify + 1 + } .tokenfield { .tools_unselectable(); + display: flex; + flex-wrap: wrap; + justify-content: space-around; height: auto; min-height: 34px; padding-bottom: 0px; background-color: unset; border: none; - display: flex; - flex-wrap: wrap; - align-items: center; - padding: 0 10px; + margin: 0 10px; + padding: 0; + width: ~"calc(100% - 20px)"; .token { box-sizing: border-box; border-radius: 3px; - display: inline-block; + display: inline-flex; + align-items: center; border: 1px solid #d9d9d9; background-color: #ededed; white-space: nowrap; - margin: 10px 5px; + margin: 2px 0; height: 24px; vertical-align: middle; cursor: default; @@ -50,7 +56,7 @@ .close { font-family: Arial; display: inline-block; - line-height: 24px; + line-height: 1.49em; font-size: 1.1em; margin-left: 5px; float: none; @@ -73,6 +79,8 @@ margin: 0 !important; // Override alertify box-shadow: none; max-width: 100%; + width: 100%; + min-width: 100% !important; &:focus { border-color: transparent; outline: 0; diff --git a/customize.dist/src/less2/include/tools.less b/customize.dist/src/less2/include/tools.less index 9fd2df5bc..b8c36cbcd 100644 --- a/customize.dist/src/less2/include/tools.less +++ b/customize.dist/src/less2/include/tools.less @@ -19,6 +19,7 @@ } .tools_unselectable () { + user-select: none; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; diff --git a/customize.dist/src/less2/main.less b/customize.dist/src/less2/main.less index dadbef539..1186465da 100644 --- a/customize.dist/src/less2/main.less +++ b/customize.dist/src/less2/main.less @@ -40,4 +40,5 @@ body.cp-app-profile { @import "../../../profile/app-profile.less"; } body.cp-app-settings { @import "../../../settings/app-settings.less"; } body.cp-app-debug { @import "../../../debug/app-debug.less"; } body.cp-app-worker { @import "../../../worker/app-worker.less"; } +body.cp-app-kanban { @import "../../../kanban/app-kanban.less"; } diff --git a/customize.dist/src/less2/pages/page-index.less b/customize.dist/src/less2/pages/page-index.less index 55671f913..b0a6d124e 100644 --- a/customize.dist/src/less2/pages/page-index.less +++ b/customize.dist/src/less2/pages/page-index.less @@ -80,6 +80,7 @@ body { } .nav-link { &:hover { + color: inherit; transform: scale(1.05); }; } @@ -154,6 +155,7 @@ h4 { .cp-callout-code .fa { background-color: @colortheme_code-bg; } .cp-callout-slide .fa { background-color: @colortheme_slide-bg; } .cp-callout-poll .fa { background-color: @colortheme_poll-bg; } +.cp-callout-kanban .fa { background-color: @colortheme_kanban-bg; } .cp-callout-whiteboard .fa { background-color: @colortheme_whiteboard-bg; } .cp-callout-recent .fa { background-color: @colortheme_drive-bg; } .cp-hidden { display: none !important; } diff --git a/customize.dist/translations/messages.fr.js b/customize.dist/translations/messages.fr.js index cf7ddcf8c..b11bc2e17 100644 --- a/customize.dist/translations/messages.fr.js +++ b/customize.dist/translations/messages.fr.js @@ -2,12 +2,12 @@ define(function () { var out = {}; out.main_title = "CryptPad : Éditeur collaboratif en temps réel, zero knowledge"; - out.main_slogan = "L'unité est la force, la collaboration est la clé"; out.type = {}; out.type.pad = 'Texte'; out.type.code = 'Code'; out.type.poll = 'Sondage'; + out.type.kanban = 'Kanban'; out.type.slide = 'Présentation'; out.type.drive = 'CryptDrive'; out.type.whiteboard = "Tableau Blanc"; @@ -21,6 +21,7 @@ define(function () { out.button_newpoll = 'Nouveau sondage'; out.button_newslide = 'Nouvelle présentation'; out.button_newwhiteboard = 'Nouveau tableau blanc'; + out.button_newkanban = 'Nouveau kanban'; out.updated_0_common_connectionLost = "Connexion au serveur perdue
Vous êtes désormais en mode lecture seule jusqu'au retour de la connexion."; out.common_connectionLost = out.updated_0_common_connectionLost; @@ -246,6 +247,17 @@ define(function () { out.pad_mediatagWidth = "Largeur (px)"; out.pad_mediatagHeight = "Hauteur (px)"; + // Kanban + out.kanban_newBoard = "Nouveau tableau"; + out.kanban_item = "Élément {0}"; // Item number for initial content + out.kanban_todo = "À faire"; + out.kanban_done = "Terminé"; + out.kanban_working = "En cours"; + out.kanban_deleteBoard = "Êtes-vous sûr de vouloir supprimer ce tableau ?"; + out.kanban_addBoard = "Ajouter un tableau"; + out.kanban_removeItem = "Supprimer cet élément"; + out.kanban_removeItemConfirm = "Êtes-vous sûr de vouloir supprimer cet élément ?"; + // Polls out.poll_title = "Sélecteur de date Zero Knowledge"; @@ -367,6 +379,7 @@ define(function () { out.fm_searchName = "Recherche"; out.fm_recentPadsName = "Pads récents"; out.fm_ownedPadsName = "Pads en votre possession"; + out.fm_tagsName = "Mots-clés"; out.fm_searchPlaceholder = "Rechercher..."; out.fm_newButton = "Nouveau"; out.fm_newButtonTitle = "Créer un nouveau pad ou un dossier, importer un fichier dans le dossier courant"; @@ -429,6 +442,8 @@ define(function () { out.fm_padIsOwned = "Vous êtes le propriétaire de ce pad"; out.fm_padIsOwnedOther = "Ce pad est la propriété d'un autre utilisateur"; out.fm_deletedPads = "Ces pads n'existent plus sur le serveur, ils ont été supprimés de votre CryptDrive: {0}"; + out.fm_tags_name = "Mot-clé"; + out.fm_tags_used = "Nombre d'utilisations"; // File - Context menu out.fc_newfolder = "Nouveau dossier"; out.fc_rename = "Renommer"; @@ -633,38 +648,24 @@ define(function () { // index.html //about.html - out.main_p2 = 'Ce projet utilise l\'éditeur visuel (WYSIWYG) CKEditor, l\'éditeur de code source CodeMirror, et le moteur temps-réel ChainPad.'; - out.main_howitworks_p1 = 'CryptPad utilise une variante de l\'algorithme d\'Operational transformation qui est capable de trouver un consensus distribué en utilisant une chaîne de bloc Nakamoto, un outil popularisé par le Bitcoin. De cette manière, l\'algorithme évite la nécessité d\'utiliser un serveur central pour résoudre les conflits d\'édition de l\'Operational Transformation, et sans ce besoin de résolution des conflits le serveur peut rester ignorant du contenu qui est édité dans le pad.'; + out.about_intro = 'CryptPad est développé au sein de l\'équipe Recherche d\'XWiki SAS, une petite entreprise située à Paris en France et à Iasi en Roumanie. Il y a 3 développeurs principaux qui travaillent sur CryptPad, ainsi que quelques contributeurs à la fois dans et en dehors d\'XWiki SAS'; + out.about_core = 'Développeurs principaux'; + out.about_contributors = 'Contributeurs clés'; + //contact.html - out.main_about_p2 = 'Si vous avez des questions ou commentaires, vous pouvez nous tweeter, ouvrir une issue sur GitHub, venir dire bonjour sur notre salle Matrix ou IRC (#cryptpad sur irc.freenode.net), ou bien encore nous envoyer un email.'; out.main_about_p22 = 'Tweetez nous'; out.main_about_p23 = 'Ouvrez un ticket (GitHub)'; out.main_about_p24 = 'Dites Bonjour (Matrix)'; out.main_about_p25 = 'Envoyez-nous un email'; out.main_about_p26 = 'Si vous avez une question ou des remarques, n\'hésitez pas à nous contacter !'; - out.main_info = "

Collaborez avec confiance


Développez vos idées en groupe avec des documents partagés; la technologie Zero Knowledge sécurise vos données."; out.main_catch_phrase = "Le Cloud Zero Knowledge"; - out.main_howitworks = 'Comment ça fonctionne'; - out.main_zeroKnowledge = 'Zero Knowledge'; - out.main_zeroKnowledge_p = "Vous n'avez pas besoin de croire que nous n'allons pas regarder vos pads. Avec la technologie Zero Knowledge de CryptPad, nous ne pouvons pas le faire. Apprenez-en plus sur notre manière de protéger vos données."; - out.main_writeItDown = 'Prenez-en note'; - out.main_writeItDown_p = "Les plus grands projets naissent des plus petites idées. Prenez note de vos moments d'inspiration et de vos idées inattendues car vous ne savez pas lesquels seront des découvertes capitales."; - out.main_share = 'Partagez le lien, partagez le pad'; - out.main_share_p = "Faites croître vos idées à plusieurs : réalisez des réunions efficaces, collaborez sur vos listes de tâches et réalisez des présentations rapides avec tous vos amis sur tous vos appareils."; - out.main_organize = 'Soyez organisé'; - out.main_organize_p = "Avec CryptDrive, vous pouvez garder vos vues sur ce qui est important. Les dossiers vous permettent de garder la trace de vos projets et d'avoir une vision globale du travail effectué."; - out.tryIt = 'Essayez-le !'; out.main_richText = 'Éditeur de texte'; - out.main_richText_p = 'Éditez des documents texte collaborativement avec notre application CkEditor temps-réel et Zero Knowledge.'; out.main_code = 'Éditeur de code'; - out.main_code_p = 'Modifiez votre code collaborativement grâce à notre application CodeMirror temps-réel et Zero Knowledge.'; out.main_slide = 'Présentations'; - out.main_slide_p = 'Créez vos présentations en syntaxe Markdown collaborativement de manière sécurisée et affichez les dans votre navigateur.'; out.main_poll = 'Sondages'; - out.main_poll_p = 'Planifiez vos réunions ou évènements, ou votez pour la meilleure solution concernant votre problème.'; out.main_drive = 'CryptDrive'; out.main_richTextPad = 'Pad de Texte Riche'; @@ -719,7 +720,7 @@ define(function () { out.policy_whatwetell = 'Ce que nous dévoilons à d\'autres à propos de vous'; out.policy_whatwetell_p1 = 'Nous ne fournissons aucune information que nous récoltons ou que vous nous fournissez à des tierces parties à moins d\'y être contraints par la loi.'; out.policy_links = 'Liens vers d\'autres sites'; - out.policy_links_p1 = 'Ce site contient des liens vers d\'autres sites, certains étant produits par d\'autres organisations. Nous ne sommes responsables des pratiques de confidentialité ou du contenu d\'aucun site externe. De manière générale, les liens vers des sites externes sont lancés dans une nouvelle fenêtre (ou onglet) du navigateur, pour rendre clair le fait que vous quittez CryptpPad.fr.'; + out.policy_links_p1 = 'Ce site contient des liens vers d\'autres sites, certains étant produits par d\'autres organisations. Nous ne sommes responsables des pratiques de confidentialité ou du contenu d\'aucun site externe. De manière générale, les liens vers des sites externes sont lancés dans une nouvelle fenêtre (ou onglet) du navigateur, pour rendre clair le fait que vous quittez CryptPad.fr.'; out.policy_ads = 'Publicité'; out.policy_ads_p1 = 'Nous n\'affichons pas de publicité en ligne, bien que nous puissions afficher des liens vers les sites des organisations qui financent nos recherches.'; out.policy_choices = 'Vos choix'; @@ -1001,6 +1002,11 @@ define(function () { embed: 'Intégrez des images de votre disque ou de votre CryptDrive et exporter le contenu en tant que PNG sur votre disque ou votre CryptDrive ' }; + out.help.kanban = { + add: 'Ajoutez un tableau en utilisant le bouton dans le coin supérieur-droit', + task: 'Déplacez les éléments en les faisant glisser d\'un tableau à l\'autre', + color: 'Modifiez les couleurs en cliquant sur les parties colorées à côté du titre de chaque tableau' + }; out.initialState = [ '

', diff --git a/customize.dist/translations/messages.js b/customize.dist/translations/messages.js index 18e295a4c..225965b42 100644 --- a/customize.dist/translations/messages.js +++ b/customize.dist/translations/messages.js @@ -2,12 +2,12 @@ define(function () { var out = {}; out.main_title = "CryptPad: Zero Knowledge, Collaborative Real Time Editing"; - out.main_slogan = "Unity is Strength - Collaboration is Key"; // TODO remove? out.type = {}; out.type.pad = 'Rich text'; out.type.code = 'Code'; out.type.poll = 'Poll'; + out.type.kanban = 'Kanban'; out.type.slide = 'Presentation'; out.type.drive = 'CryptDrive'; out.type.whiteboard = 'Whiteboard'; @@ -21,6 +21,7 @@ define(function () { out.button_newpoll = 'New Poll'; out.button_newslide = 'New Presentation'; out.button_newwhiteboard = 'New Whiteboard'; + out.button_newkanban = 'New Kanban'; // NOTE: Remove updated_0_ if we need an updated_1_ out.updated_0_common_connectionLost = "Server Connection Lost
You're now in read-only mode until the connection is back."; @@ -248,6 +249,17 @@ define(function () { out.pad_mediatagWidth = "Width (px)"; out.pad_mediatagHeight = "Height (px)"; + // Kanban + out.kanban_newBoard = "New board"; + out.kanban_item = "Item {0}"; // Item number for initial content + out.kanban_todo = "To Do"; + out.kanban_done = "Done"; + out.kanban_working = "Working"; + out.kanban_deleteBoard = "Are you sure you want to delete this board?"; + out.kanban_addBoard = "Add a board"; + out.kanban_removeItem = "Remove this item"; + out.kanban_removeItemConfirm = "Are you sure you want to delete this item?"; + // Polls out.poll_title = "Zero Knowledge Date Picker"; @@ -368,6 +380,7 @@ define(function () { out.fm_searchName = "Search"; out.fm_recentPadsName = "Recent pads"; out.fm_ownedPadsName = "Owned"; + out.fm_tagsName = "Tags"; out.fm_searchPlaceholder = "Search..."; out.fm_newButton = "New"; out.fm_newButtonTitle = "Create a new pad or folder, import a file in the current folder"; @@ -430,6 +443,8 @@ define(function () { out.fm_padIsOwned = "You are the owner of this pad"; out.fm_padIsOwnedOther = "This pad is owned by another user"; out.fm_deletedPads = "These pads no longer exist on the server, they've been removed from your CryptDrive: {0}"; + out.fm_tags_name = "Tag name"; + out.fm_tags_used = "Number of uses"; // File - Context menu out.fc_newfolder = "New folder"; out.fc_rename = "Rename"; @@ -638,11 +653,11 @@ define(function () { //about.html - out.main_p2 = 'This project uses the CKEditor Visual Editor, CodeMirror, and the ChainPad realtime engine.'; - out.main_howitworks_p1 = 'CryptPad uses a variant of the Operational transformation algorithm which is able to find distributed consensus using a Nakamoto Blockchain, a construct popularized by Bitcoin. This way the algorithm can avoid the need for a central server to resolve Operational Transform Edit Conflicts and without the need for resolving conflicts, the server can be kept unaware of the content which is being edited on the pad.'; + out.about_intro = 'CryptPad is created inside of the Research Team at XWiki SAS, a small business located in Paris France and Iasi Romania. There are 3 core team members working on CryptPad plus a number of contributors both inside and outside of XWiki SAS.'; + out.about_core = 'Core Developers'; + out.about_contributors = 'Key Contributors'; // contact.html - out.main_about_p2 = 'If you have any questions or comments, feel free to reach out!
You can tweet us, open an issue on GitHub. Come say hi on our Matrix channel or IRC (#cryptpad on irc.freenode.net), or send us an email.'; out.main_about_p22 = 'Tweet us'; out.main_about_p23 = 'open an issue on GitHub'; out.main_about_p24 = 'say Hello (Matrix)'; @@ -652,25 +667,10 @@ define(function () { out.main_info = "

Collaborate in Confidence

Grow your ideas together with shared documents while Zero Knowledge technology secures your privacy; even from us."; out.main_catch_phrase = "The Zero Knowledge Cloud"; - out.main_howitworks = 'How It Works'; - out.main_zeroKnowledge = 'Zero Knowledge'; - out.main_zeroKnowledge_p = "You don't have to trust that we won't look at your pads, with CryptPad's revolutionary Zero Knowledge Technology we can't. Learn more about how we protect your Privacy and Security."; - out.main_writeItDown = 'Write it down'; - - out.main_writeItDown_p = "The greatest projects come from the smallest ideas. Take down the moments of inspiration and unexpected ideas because you never know which one might be a breakthrough."; - out.main_share = 'Share the link, share the pad'; - out.main_share_p = "Grow your ideas together: conduct efficient meetings, collaborate on TODO lists and make quick presentations with all your friends and all your devices."; - out.main_organize = 'Get organized'; - out.main_organize_p = "With CryptPad Drive, you can keep your sights on what's important. Folders allow you to keep track of your projects and have a global vision of where things are going."; - out.tryIt = 'Try it out!'; out.main_richText = 'Rich Text editor'; - out.main_richText_p = 'Edit rich text pads collaboratively with our realtime Zero Knowledge CkEditor application.'; out.main_code = 'Code editor'; - out.main_code_p = 'Edit code from your software collaboratively with our realtime Zero Knowledge CodeMirror application.'; out.main_slide = 'Slide editor'; - out.main_slide_p = 'Create your presentations using the Markdown syntax, and display them in your browser.'; out.main_poll = 'Polls'; - out.main_poll_p = 'Plan your meeting or your event, or vote for the best solution regarding your problem.'; out.main_drive = 'CryptDrive'; out.main_richTextPad = 'Rich Text Pad'; @@ -1045,6 +1045,11 @@ define(function () { embed: 'Embed images from your disk or your CryptDrive and export them as PNG to your disk or your CryptDrive ' }; + out.help.kanban = { + add: 'Add new boards using the button in the top-right corner', + task: 'Move items by dragging and dropping them from one board to another', + color: 'Change the colors by clicking on the colored part next to the board titles', + }; out.initialState = [ '

', diff --git a/package.json b/package.json index e0ea88e95..7ad861062 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cryptpad", "description": "realtime collaborative visual editor with zero knowlege server", - "version": "2.1.1", + "version": "2.2.0", "license": "AGPL-3.0-or-later", "dependencies": { "chainpad-server": "^2.0.0", diff --git a/www/common/application_config_internal.js b/www/common/application_config_internal.js index f6760f897..0ab300721 100644 --- a/www/common/application_config_internal.js +++ b/www/common/application_config_internal.js @@ -9,7 +9,7 @@ define(function() { /* Select the buttons displayed on the main page to create new collaborative sessions * Existing types : pad, code, poll, slide */ - config.availablePadTypes = ['drive', 'pad', 'code', 'slide', 'poll', 'whiteboard', 'file', 'todo', 'contacts']; + config.availablePadTypes = ['drive', 'pad', 'code', 'slide', 'poll', 'kanban', 'whiteboard', 'file', 'todo', 'contacts']; config.registeredOnlyTypes = ['file', 'contacts']; /* Cryptpad apps use a common API to display notifications to users @@ -81,6 +81,7 @@ define(function() { whiteboard: 'fa-paint-brush', todo: 'fa-tasks', contacts: 'fa-users', + kanban: 'fa-list-alt', }; // Ability to create owned pads and expiring pads through a new pad creation screen. diff --git a/www/common/common-hash.js b/www/common/common-hash.js index 5ba9ec5b3..3aaa7719b 100644 --- a/www/common/common-hash.js +++ b/www/common/common-hash.js @@ -117,12 +117,12 @@ Version 1 var hashArr = fixDuplicateSlashes(hash).split('/'); if (['media', 'file', 'user', 'invite'].indexOf(type) === -1) { parsed.type = 'pad'; + parsed.getHash = function () { return hash; }; if (hash.slice(0,1) !== '/' && hash.length >= 56) { // Version 0 // Old hash parsed.channel = hash.slice(0, 32); parsed.key = hash.slice(32, 56); parsed.version = 0; - parsed.getHash = function () { return hash; }; return parsed; } var options; diff --git a/www/common/common-interface.js b/www/common/common-interface.js index 7f318dfae..0592d859a 100644 --- a/www/common/common-interface.js +++ b/www/common/common-interface.js @@ -12,8 +12,10 @@ define([ '/customize/loading.js', '/common/test.js', + '/common/jquery-ui/jquery-ui.min.js', '/bower_components/bootstrap-tokenfield/dist/bootstrap-tokenfield.js', 'css!/common/tippy/tippy.css', + 'css!/common/jquery-ui/jquery-ui.min.css' ], function ($, Messages, Util, Hash, Notifier, AppConfig, Alertify, Tippy, Pages, h, Loading, Test) { var UI = {}; @@ -183,11 +185,17 @@ define([ ]); }; - UI.tokenField = function (target) { + UI.tokenField = function (target, autocomplete) { var t = { element: target || h('input'), }; - var $t = t.tokenfield = $(t.element).tokenfield(); + var $t = t.tokenfield = $(t.element).tokenfield({ + autocomplete: { + source: autocomplete, + delay: 100 + }, + showAutocompleteOnFocus: false + }); t.getTokens = function (ignorePending) { var tokens = $t.tokenfield('getTokens').map(function (token) { @@ -210,10 +218,17 @@ define([ t.preventDuplicates = function (cb) { $t.on('tokenfield:createtoken', function (ev) { + // Close the suggest list when a token is added because we're going to wipe the input + var $input = $t.closest('.tokenfield').find('.token-input'); + $input.autocomplete('close'); + var val; ev.attrs.value = ev.attrs.value.toLowerCase(); if (t.getTokens(true).some(function (t) { - if (t === ev.attrs.value) { return ((val = t)); } + if (t === ev.attrs.value) { + ev.preventDefault(); + return ((val = t)); + } })) { ev.preventDefault(); if (typeof(cb) === 'function') { cb(val); } @@ -241,7 +256,7 @@ define([ return t; }; - dialog.tagPrompt = function (tags, cb) { + dialog.tagPrompt = function (tags, existing, cb) { var input = dialog.textInput(); var tagger = dialog.frame([ @@ -255,7 +270,7 @@ define([ dialog.nav(), ]); - var field = UI.tokenField(input).preventDuplicates(function (val) { + var field = UI.tokenField(input, existing).preventDuplicates(function (val) { UI.warn(Messages._getKey('tags_duplicate', [val])); }); @@ -396,7 +411,7 @@ define([ stopListening(listener); cb(); }); - listener = listenForKeys(close, close, ok); + listener = listenForKeys(close, close); var $ok = $(ok).click(close); document.body.appendChild(frame); diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 2e4dfacbc..18f38aae0 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -23,20 +23,27 @@ define([ } UIElements.updateTags = function (common, href) { - var sframeChan = common.getSframeChannel(); - sframeChan.query('Q_TAGS_GET', href || null, function (err, res) { - if (err || res.error) { - if (res.error === 'NO_ENTRY') { - UI.alert(Messages.tags_noentry); + var existing, tags; + NThen(function(waitFor) { + common.getSframeChannel().query("Q_GET_ALL_TAGS", null, waitFor(function(err, res) { + if (err || res.error) { return void console.error(err || res.error); } + existing = Object.keys(res.tags).sort(); + })); + }).nThen(function (waitFor) { + common.getPadAttribute('tags', waitFor(function (err, res) { + if (err) { + if (err === 'NO_ENTRY') { + UI.alert(Messages.tags_noentry); + } + waitFor.abort(); + return void console.error(err); } - return void console.error(err || res.error); - } - UI.dialog.tagPrompt(res.data, function (tags) { - if (!Array.isArray(tags)) { return; } - sframeChan.event('EV_TAGS_SET', { - tags: tags, - href: href, - }); + tags = res || []; + }), href); + }).nThen(function () { + UI.dialog.tagPrompt(tags, existing, function (newTags) { + if (!Array.isArray(newTags)) { return; } + common.setPadAttribute('tags', newTags, null, href); }); }); }; @@ -303,7 +310,7 @@ define([ var embed = initValue ? val.embed : Util.isChecked($(link).find('#cp-share-embed')); var present = initValue ? val.present : Util.isChecked($(link).find('#cp-share-present')); - var hash = (edit && hashes.editHash) ? hashes.editHash : hashes.viewHash; + var hash = (!hashes.viewHash || (edit && hashes.editHash)) ? hashes.editHash : hashes.viewHash; var href = origin + pathname + '#' + hash; var parsed = Hash.parsePadUrl(href); return origin + parsed.getUrl({embed: embed, present: present}); @@ -387,8 +394,11 @@ define([ val = val || {}; if (val.edit === false) { $(link).find('#cp-share-editable-false').prop('checked', true); + $(link).find('#cp-share-editable-true').prop('checked', false); + } else { + $(link).find('#cp-share-editable-true').prop('checked', true); + $(link).find('#cp-share-editable-false').prop('checked', false); } - else { $(link).find('#cp-share-editable-true').prop('checked', true); } if (val.embed) { $(link).find('#cp-share-embed').prop('checked', true); } if (val.present) { $(link).find('#cp-share-present').prop('checked', true); } $(link).find('#cp-share-link-preview').val(getLinkValue(val)); diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index 4f8f69a1b..5faffc5c9 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -578,7 +578,7 @@ define([ } var parsed = Hash.parsePadUrl(window.location.href); if (!parsed.type || !parsed.hashData) { return void cb('E_INVALID_HREF'); } - if (parsed.type === 'file') { secret.channel = Util.base64ToHex(secret.channel); } + if (parsed.type === 'file' && typeof(parsed.channel) === 'string') { secret.channel = Util.base64ToHex(secret.channel); } hashes = Hash.getHashes(secret); if (secret.version === 0) { @@ -594,6 +594,7 @@ define([ postMessage("GET_STRONGER_HASH", { href: window.location.href, + channel: secret.channel, password: secret.password }, function (hash) { if (hash) { hashes.editHash = hash; } diff --git a/www/common/jquery-ui/jquery-ui.min.css b/www/common/jquery-ui/jquery-ui.min.css new file mode 100644 index 000000000..1ff50449e --- /dev/null +++ b/www/common/jquery-ui/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.12.1 - 2018-05-15 +* http://jqueryui.com +* Includes: core.css, autocomplete.css, menu.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} \ No newline at end of file diff --git a/www/common/jquery-ui/jquery-ui.min.js b/www/common/jquery-ui/jquery-ui.min.js new file mode 100644 index 000000000..d17a46a44 --- /dev/null +++ b/www/common/jquery-ui/jquery-ui.min.js @@ -0,0 +1,6 @@ +/*! jQuery UI - v1.12.1 - 2018-05-15 +* http://jqueryui.com +* Includes: widget.js, position.js, keycode.js, unique-id.js, widgets/autocomplete.js, widgets/menu.js +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){t.ui=t.ui||{},t.ui.version="1.12.1";var e=0,i=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},l=e.split(".")[0];e=e.split(".")[1];var h=l+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][h.toLowerCase()]=function(e){return!!t.data(e,h)},t[l]=t[l]||{},n=t[l][e],o=t[l][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:l,widgetName:e,widgetFullName:h}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var s,n,o=i.call(arguments,1),a=0,r=o.length;r>a;a++)for(s in o[a])n=o[a][s],o[a].hasOwnProperty(s)&&void 0!==n&&(e[s]=t.isPlainObject(n)?t.isPlainObject(e[s])?t.widget.extend({},e[s],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,s){var n=s.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=i.call(arguments,1),l=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(l=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):l=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new s(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"

",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,l=/top|center|bottom/,h=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};h>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),l.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-r-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-r-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.widget("ui.menu",{version:"1.12.1",defaultElement:"