aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/comments/.l10nignore3
-rw-r--r--apps/comments/js/comments.js2
-rw-r--r--apps/comments/js/comments.js.map1
-rw-r--r--apps/comments/js/merged.json14
-rw-r--r--apps/comments/lib/AppInfo/Application.php4
-rw-r--r--apps/comments/src/activitytabviewplugin.js (renamed from apps/comments/js/activitytabviewplugin.js)0
-rw-r--r--apps/comments/src/app.js (renamed from apps/comments/js/app.js)0
-rw-r--r--apps/comments/src/commentcollection.js (renamed from apps/comments/js/commentcollection.js)0
-rw-r--r--apps/comments/src/commentmodel.js (renamed from apps/comments/js/commentmodel.js)0
-rw-r--r--apps/comments/src/comments.js18
-rw-r--r--apps/comments/src/commentsmodifymenu.js (renamed from apps/comments/js/commentsmodifymenu.js)0
-rw-r--r--apps/comments/src/commentstabview.js (renamed from apps/comments/js/commentstabview.js)0
-rw-r--r--apps/comments/src/commentsummarymodel.js (renamed from apps/comments/js/commentsummarymodel.js)0
-rw-r--r--apps/comments/src/filesplugin.js (renamed from apps/comments/js/filesplugin.js)0
-rw-r--r--apps/comments/src/search.js (renamed from apps/comments/js/search.js)0
-rw-r--r--apps/comments/src/style/autocomplete.scss (renamed from apps/comments/css/autocomplete.scss)0
-rw-r--r--apps/comments/src/style/comments.scss (renamed from apps/comments/css/comments.scss)0
-rw-r--r--apps/comments/src/templates.js (renamed from apps/comments/js/templates.js)0
-rw-r--r--apps/comments/src/templates/comment.handlebars (renamed from apps/comments/js/templates/comment.handlebars)0
-rw-r--r--apps/comments/src/templates/commentsmodifymenu.handlebars (renamed from apps/comments/js/templates/commentsmodifymenu.handlebars)0
-rw-r--r--apps/comments/src/templates/edit_comment.handlebars (renamed from apps/comments/js/templates/edit_comment.handlebars)0
-rw-r--r--apps/comments/src/templates/filesplugin.handlebars (renamed from apps/comments/js/templates/filesplugin.handlebars)0
-rw-r--r--apps/comments/src/templates/view.handlebars (renamed from apps/comments/js/templates/view.handlebars)0
-rw-r--r--apps/comments/src/vendor/At.js/dist/js/jquery.atwho.min.js (renamed from apps/comments/js/vendor/At.js/dist/js/jquery.atwho.min.js)0
-rw-r--r--apps/comments/src/vendor/Caret.js/dist/jquery.caret.min.js (renamed from apps/comments/js/vendor/Caret.js/dist/jquery.caret.min.js)0
-rw-r--r--apps/comments/webpack.js40
-rw-r--r--apps/dav/l10n/bg.js4
-rw-r--r--apps/dav/l10n/bg.json4
-rw-r--r--apps/encryption/l10n/eo.js59
-rw-r--r--apps/encryption/l10n/eo.json59
-rw-r--r--apps/files/js/file-upload.js41
-rw-r--r--apps/files/js/operationprogressbar.js3
-rw-r--r--apps/files/tests/js/fileUploadSpec.js144
-rw-r--r--apps/files_sharing/appinfo/routes.php5
-rw-r--r--apps/files_sharing/l10n/zh_CN.js1
-rw-r--r--apps/files_sharing/l10n/zh_CN.json1
-rw-r--r--apps/files_sharing/lib/Controller/ShareController.php2
-rw-r--r--apps/files_sharing/lib/Controller/ShareesAPIController.php158
-rw-r--r--apps/files_sharing/templates/public.php16
-rw-r--r--apps/files_sharing/tests/Controller/ShareesAPIControllerTest.php11
-rw-r--r--apps/updatenotification/l10n/ja.js1
-rw-r--r--apps/updatenotification/l10n/ja.json1
-rw-r--r--apps/user_ldap/l10n/cs.js2
-rw-r--r--apps/user_ldap/l10n/cs.json2
-rw-r--r--apps/user_ldap/l10n/de.js2
-rw-r--r--apps/user_ldap/l10n/de.json2
-rw-r--r--apps/user_ldap/l10n/de_DE.js2
-rw-r--r--apps/user_ldap/l10n/de_DE.json2
-rw-r--r--apps/user_ldap/l10n/es_AR.js1
-rw-r--r--apps/user_ldap/l10n/es_AR.json1
-rw-r--r--apps/user_ldap/l10n/gl.js2
-rw-r--r--apps/user_ldap/l10n/gl.json2
-rw-r--r--apps/user_ldap/l10n/it.js1
-rw-r--r--apps/user_ldap/l10n/it.json1
-rw-r--r--apps/user_ldap/l10n/nl.js1
-rw-r--r--apps/user_ldap/l10n/nl.json1
-rw-r--r--apps/user_ldap/l10n/pt_BR.js2
-rw-r--r--apps/user_ldap/l10n/pt_BR.json2
-rw-r--r--apps/user_ldap/l10n/sr.js1
-rw-r--r--apps/user_ldap/l10n/sr.json1
-rw-r--r--apps/user_ldap/l10n/sv.js2
-rw-r--r--apps/user_ldap/l10n/sv.json2
-rw-r--r--apps/user_ldap/l10n/tr.js1
-rw-r--r--apps/user_ldap/l10n/tr.json1
-rw-r--r--apps/user_ldap/templates/settings.php2
-rw-r--r--apps/workflowengine/l10n/de.js11
-rw-r--r--apps/workflowengine/l10n/de.json11
-rw-r--r--apps/workflowengine/l10n/de_DE.js11
-rw-r--r--apps/workflowengine/l10n/de_DE.json11
-rw-r--r--apps/workflowengine/l10n/eo.js1
-rw-r--r--apps/workflowengine/l10n/eo.json1
-rw-r--r--apps/workflowengine/l10n/nl.js1
-rw-r--r--apps/workflowengine/l10n/nl.json1
-rw-r--r--apps/workflowengine/l10n/pl.js1
-rw-r--r--apps/workflowengine/l10n/pl.json1
-rw-r--r--apps/workflowengine/l10n/sk.js1
-rw-r--r--apps/workflowengine/l10n/sk.json1
-rw-r--r--apps/workflowengine/l10n/sr.js1
-rw-r--r--apps/workflowengine/l10n/sr.json1
-rw-r--r--apps/workflowengine/l10n/sv.js1
-rw-r--r--apps/workflowengine/l10n/sv.json1
81 files changed, 521 insertions, 163 deletions
diff --git a/apps/comments/.l10nignore b/apps/comments/.l10nignore
index 8b832897e3f..4137f324255 100644
--- a/apps/comments/.l10nignore
+++ b/apps/comments/.l10nignore
@@ -1,2 +1,3 @@
# compiled vue templates
-js/templates.js
+src/templates.js
+js/comments.js
diff --git a/apps/comments/js/comments.js b/apps/comments/js/comments.js
new file mode 100644
index 00000000000..e9d75bb9835
--- /dev/null
+++ b/apps/comments/js/comments.js
@@ -0,0 +1,2 @@
+!function(t){var e={};function n(o){if(e[o])return e[o].exports;var i=e[o]={i:o,l:!1,exports:{}};return t[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=t,n.c=e,n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:o})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(o,i,function(e){return t[e]}.bind(null,i));return o},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="/js/",n(n.s=3)}([function(t,e){t.exports=jQuery},function(t,e,n){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var n=function(t,e){var n=t[1]||"",o=t[3];if(!o)return n;if(e&&"function"==typeof btoa){var i=(r=o,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+" */"),a=o.sources.map(function(t){return"/*# sourceURL="+o.sourceRoot+t+" */"});return[n].concat(a).concat([i]).join("\n")}var r;return[n].join("\n")}(e,t);return e[2]?"@media "+e[2]+"{"+n+"}":n}).join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var o={},i=0;i<this.length;i++){var a=this[i][0];null!=a&&(o[a]=!0)}for(i=0;i<t.length;i++){var r=t[i];null!=r[0]&&o[r[0]]||(n&&!r[2]?r[2]=n:n&&(r[2]="("+r[2]+") and ("+n+")"),e.push(r))}},e}},function(t,e,n){var o,i,a={},r=(o=function(){return window&&document&&document.all&&!window.atob},function(){return void 0===i&&(i=o.apply(this,arguments)),i}),s=function(t){var e={};return function(t,n){if("function"==typeof t)return t();if(void 0===e[t]){var o=function(t,e){return e?e.querySelector(t):document.querySelector(t)}.call(this,t,n);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(t){o=null}e[t]=o}return e[t]}}(),l=null,c=0,u=[],m=n(18);function h(t,e){for(var n=0;n<t.length;n++){var o=t[n],i=a[o.id];if(i){i.refs++;for(var r=0;r<i.parts.length;r++)i.parts[r](o.parts[r]);for(;r<o.parts.length;r++)i.parts.push(y(o.parts[r],e))}else{var s=[];for(r=0;r<o.parts.length;r++)s.push(y(o.parts[r],e));a[o.id]={id:o.id,refs:1,parts:s}}}}function d(t,e){for(var n=[],o={},i=0;i<t.length;i++){var a=t[i],r=e.base?a[0]+e.base:a[0],s={css:a[1],media:a[2],sourceMap:a[3]};o[r]?o[r].parts.push(s):n.push(o[r]={id:r,parts:[s]})}return n}function p(t,e){var n=s(t.insertInto);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var o=u[u.length-1];if("top"===t.insertAt)o?o.nextSibling?n.insertBefore(e,o.nextSibling):n.appendChild(e):n.insertBefore(e,n.firstChild),u.push(e);else if("bottom"===t.insertAt)n.appendChild(e);else{if("object"!=typeof t.insertAt||!t.insertAt.before)throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");var i=s(t.insertAt.before,n);n.insertBefore(e,i)}}function f(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t);var e=u.indexOf(t);e>=0&&u.splice(e,1)}function g(t){var e=document.createElement("style");if(void 0===t.attrs.type&&(t.attrs.type="text/css"),void 0===t.attrs.nonce){var o=function(){0;return n.nc}();o&&(t.attrs.nonce=o)}return v(e,t.attrs),p(t,e),e}function v(t,e){Object.keys(e).forEach(function(n){t.setAttribute(n,e[n])})}function y(t,e){var n,o,i,a;if(e.transform&&t.css){if(!(a="function"==typeof e.transform?e.transform(t.css):e.transform.default(t.css)))return function(){};t.css=a}if(e.singleton){var r=c++;n=l||(l=g(e)),o=b.bind(null,n,r,!1),i=b.bind(null,n,r,!0)}else t.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(t){var e=document.createElement("link");return void 0===t.attrs.type&&(t.attrs.type="text/css"),t.attrs.rel="stylesheet",v(e,t.attrs),p(t,e),e}(e),o=function(t,e,n){var o=n.css,i=n.sourceMap,a=void 0===e.convertToAbsoluteUrls&&i;(e.convertToAbsoluteUrls||a)&&(o=m(o));i&&(o+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(i))))+" */");var r=new Blob([o],{type:"text/css"}),s=t.href;t.href=URL.createObjectURL(r),s&&URL.revokeObjectURL(s)}.bind(null,n,e),i=function(){f(n),n.href&&URL.revokeObjectURL(n.href)}):(n=g(e),o=function(t,e){var n=e.css,o=e.media;o&&t.setAttribute("media",o);if(t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}.bind(null,n),i=function(){f(n)});return o(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;o(t=e)}else i()}}t.exports=function(t,e){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(e=e||{}).attrs="object"==typeof e.attrs?e.attrs:{},e.singleton||"boolean"==typeof e.singleton||(e.singleton=r()),e.insertInto||(e.insertInto="head"),e.insertAt||(e.insertAt="bottom");var n=d(t,e);return h(n,e),function(t){for(var o=[],i=0;i<n.length;i++){var r=n[i];(s=a[r.id]).refs--,o.push(s)}t&&h(d(t,e),e);for(i=0;i<o.length;i++){var s;if(0===(s=o[i]).refs){for(var l=0;l<s.parts.length;l++)s.parts[l]();delete a[s.id]}}}};var w,C=(w=[],function(t,e){return w[t]=e,w.filter(Boolean).join("\n")});function b(t,e,n,o){var i=n?"":o.css;if(t.styleSheet)t.styleSheet.cssText=C(e,i);else{var a=document.createTextNode(i),r=t.childNodes;r[e]&&t.removeChild(r[e]),r.length?t.insertBefore(a,r[e]):t.appendChild(a)}}},function(t,e,n){"use strict";n.r(e);n(4),n(5),n(6),n(7),n(8),n(9),n(10),n(11),n(12),n(13),n(14),n(15),n(16),n(19);window.OCA.Comments=OCA.Comments},function(t,e){OCA.Comments||(OCA.Comments={})},function(t,e){function n(t){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var o,i;o=Handlebars.template,(i=OCA.Comments.Templates=OCA.Comments.Templates||{}).comment=o({1:function(t,e,n,o,i){return" unread"},3:function(t,e,n,o,i){return" collapsed"},5:function(t,e,n,o,i){return" currentUser"},7:function(t,e,n,o,i){var a;return'data-username="'+t.escapeExpression("function"==typeof(a=null!=(a=n.actorId||(null!=e?e.actorId:e))?a:n.helperMissing)?a.call(null!=e?e:t.nullContext||{},{name:"actorId",hash:{},data:i}):a)+'"'},9:function(t,e,n,o,i){return'\t\t\t<a href="#" class="action more icon icon-more has-tooltip"></a>\n\t\t\t<div class="deleteLoading icon-loading-small hidden"></div>\n'},11:function(t,e,n,o,i){return'\t\t<div class="message-overlay"></div>\n'},compiler:[7,">= 4.0.0"],main:function(t,e,o,i,a){var r,s,l=null!=e?e:t.nullContext||{},c=o.helperMissing,u="function",m=t.escapeExpression;return'<li class="comment'+(null!=(r=o.if.call(l,null!=e?e.isUnread:e,{name:"if",hash:{},fn:t.program(1,a,0),inverse:t.noop,data:a}))?r:"")+(null!=(r=o.if.call(l,null!=e?e.isLong:e,{name:"if",hash:{},fn:t.program(3,a,0),inverse:t.noop,data:a}))?r:"")+'" data-id="'+m(n(s=null!=(s=o.id||(null!=e?e.id:e))?s:c)===u?s.call(l,{name:"id",hash:{},data:a}):s)+'">\n\t<div class="authorRow">\n\t\t<div class="avatar'+(null!=(r=o.if.call(l,null!=e?e.isUserAuthor:e,{name:"if",hash:{},fn:t.program(5,a,0),inverse:t.noop,data:a}))?r:"")+'" '+(null!=(r=o.if.call(l,null!=e?e.actorId:e,{name:"if",hash:{},fn:t.program(7,a,0),inverse:t.noop,data:a}))?r:"")+'> </div>\n\t\t<div class="author'+(null!=(r=o.if.call(l,null!=e?e.isUserAuthor:e,{name:"if",hash:{},fn:t.program(5,a,0),inverse:t.noop,data:a}))?r:"")+'">'+m(n(s=null!=(s=o.actorDisplayName||(null!=e?e.actorDisplayName:e))?s:c)===u?s.call(l,{name:"actorDisplayName",hash:{},data:a}):s)+"</div>\n"+(null!=(r=o.if.call(l,null!=e?e.isUserAuthor:e,{name:"if",hash:{},fn:t.program(9,a,0),inverse:t.noop,data:a}))?r:"")+'\t\t<div class="date has-tooltip live-relative-timestamp" data-timestamp="'+m(n(s=null!=(s=o.timestamp||(null!=e?e.timestamp:e))?s:c)===u?s.call(l,{name:"timestamp",hash:{},data:a}):s)+'" title="'+m(n(s=null!=(s=o.altDate||(null!=e?e.altDate:e))?s:c)===u?s.call(l,{name:"altDate",hash:{},data:a}):s)+'">'+m(n(s=null!=(s=o.date||(null!=e?e.date:e))?s:c)===u?s.call(l,{name:"date",hash:{},data:a}):s)+'</div>\n\t</div>\n\t<div class="message">'+(null!=(r=n(s=null!=(s=o.formattedMessage||(null!=e?e.formattedMessage:e))?s:c)===u?s.call(l,{name:"formattedMessage",hash:{},data:a}):s)?r:"")+"</div>\n"+(null!=(r=o.if.call(l,null!=e?e.isLong:e,{name:"if",hash:{},fn:t.program(11,a,0),inverse:t.noop,data:a}))?r:"")+"</li>\n"},useData:!0}),i.commentsmodifymenu=o({1:function(t,e,o,i,a){var r,s,l=null!=e?e:t.nullContext||{},c=o.helperMissing,u=t.escapeExpression;return'\t\t<li>\n\t\t\t<a href="#" class="menuitem action '+u("function"===n(s=null!=(s=o.name||(null!=e?e.name:e))?s:c)?s.call(l,{name:"name",hash:{},data:a}):s)+' permanent" data-action="'+u("function"===n(s=null!=(s=o.name||(null!=e?e.name:e))?s:c)?s.call(l,{name:"name",hash:{},data:a}):s)+'">\n'+(null!=(r=o.if.call(l,null!=e?e.iconClass:e,{name:"if",hash:{},fn:t.program(2,a,0),inverse:t.program(4,a,0),data:a}))?r:"")+"\t\t\t\t<span>"+u("function"===n(s=null!=(s=o.displayName||(null!=e?e.displayName:e))?s:c)?s.call(l,{name:"displayName",hash:{},data:a}):s)+"</span>\n\t\t\t</a>\n\t\t</li>\n"},2:function(t,e,n,o,i){var a;return'\t\t\t\t\t<span class="icon '+t.escapeExpression("function"==typeof(a=null!=(a=n.iconClass||(null!=e?e.iconClass:e))?a:n.helperMissing)?a.call(null!=e?e:t.nullContext||{},{name:"iconClass",hash:{},data:i}):a)+'"></span>\n'},4:function(t,e,n,o,i){return'\t\t\t\t\t<span class="no-icon"></span>\n'},compiler:[7,">= 4.0.0"],main:function(t,e,n,o,i){var a;return"<ul>\n"+(null!=(a=n.each.call(null!=e?e:t.nullContext||{},null!=e?e.items:e,{name:"each",hash:{},fn:t.program(1,i,0),inverse:t.noop,data:i}))?a:"")+"</ul>\n"},useData:!0}),i.edit_comment=o({1:function(t,e,n,o,i){var a;return'\t\t\t<div class="action-container">\n\t\t\t\t<a href="#" class="action cancel icon icon-close has-tooltip" title="'+t.escapeExpression("function"==typeof(a=null!=(a=n.cancelText||(null!=e?e.cancelText:e))?a:n.helperMissing)?a.call(null!=e?e:t.nullContext||{},{name:"cancelText",hash:{},data:i}):a)+'"></a>\n\t\t\t</div>\n'},compiler:[7,">= 4.0.0"],main:function(t,e,o,i,a){var r,s,l=null!=e?e:t.nullContext||{},c=o.helperMissing,u="function",m=t.escapeExpression;return"<"+m(n(s=null!=(s=o.tag||(null!=e?e.tag:e))?s:c)===u?s.call(l,{name:"tag",hash:{},data:a}):s)+' class="newCommentRow comment" data-id="'+m(n(s=null!=(s=o.id||(null!=e?e.id:e))?s:c)===u?s.call(l,{name:"id",hash:{},data:a}):s)+'">\n\t<div class="authorRow">\n\t\t<div class="avatar currentUser" data-username="'+m(n(s=null!=(s=o.actorId||(null!=e?e.actorId:e))?s:c)===u?s.call(l,{name:"actorId",hash:{},data:a}):s)+'"></div>\n\t\t<div class="author currentUser">'+m(n(s=null!=(s=o.actorDisplayName||(null!=e?e.actorDisplayName:e))?s:c)===u?s.call(l,{name:"actorDisplayName",hash:{},data:a}):s)+"</div>\n"+(null!=(r=o.if.call(l,null!=e?e.isEditMode:e,{name:"if",hash:{},fn:t.program(1,a,0),inverse:t.noop,data:a}))?r:"")+'\t</div>\n\t<form class="newCommentForm">\n\t\t<div contentEditable="true" class="message" data-placeholder="'+m(n(s=null!=(s=o.newMessagePlaceholder||(null!=e?e.newMessagePlaceholder:e))?s:c)===u?s.call(l,{name:"newMessagePlaceholder",hash:{},data:a}):s)+'">'+m(n(s=null!=(s=o.message||(null!=e?e.message:e))?s:c)===u?s.call(l,{name:"message",hash:{},data:a}):s)+'</div>\n\t\t<input class="submit icon-confirm has-tooltip" type="submit" value="" title="'+m(n(s=null!=(s=o.submitText||(null!=e?e.submitText:e))?s:c)===u?s.call(l,{name:"submitText",hash:{},data:a}):s)+'"/>\n\t\t<div class="submitLoading icon-loading-small hidden"></div>\n\t</form>\n</'+m(n(s=null!=(s=o.tag||(null!=e?e.tag:e))?s:c)===u?s.call(l,{name:"tag",hash:{},data:a}):s)+">\n"},useData:!0}),i.filesplugin=o({compiler:[7,">= 4.0.0"],main:function(t,e,o,i,a){var r,s=null!=e?e:t.nullContext||{},l=o.helperMissing,c=t.escapeExpression;return'<a class="action action-comment permanent" title="'+c("function"===n(r=null!=(r=o.countMessage||(null!=e?e.countMessage:e))?r:l)?r.call(s,{name:"countMessage",hash:{},data:a}):r)+'" href="#">\n\t<img class="svg" src="'+c("function"===n(r=null!=(r=o.iconUrl||(null!=e?e.iconUrl:e))?r:l)?r.call(s,{name:"iconUrl",hash:{},data:a}):r)+'"/>\n</a>\n'},useData:!0}),i.view=o({compiler:[7,">= 4.0.0"],main:function(t,e,o,i,a){var r,s=null!=e?e:t.nullContext||{},l=o.helperMissing,c=t.escapeExpression;return'<ul class="comments">\n</ul>\n<div class="emptycontent hidden"><div class="icon-comment"></div>\n\t<p>'+c("function"===n(r=null!=(r=o.emptyResultLabel||(null!=e?e.emptyResultLabel:e))?r:l)?r.call(s,{name:"emptyResultLabel",hash:{},data:a}):r)+'</p></div>\n<input type="button" class="showMore hidden" value="'+c("function"===n(r=null!=(r=o.moreLabel||(null!=e?e.moreLabel:e))?r:l)?r.call(s,{name:"moreLabel",hash:{},data:a}):r)+'" name="show-more" id="show-more" />\n<div class="loading hidden" style="height: 50px"></div>\n'},useData:!0})},function(t,e){!function(t,e){_.extend(t.Files.Client,{PROPERTY_FILEID:"{"+t.Files.Client.NS_OWNCLOUD+"}id",PROPERTY_MESSAGE:"{"+t.Files.Client.NS_OWNCLOUD+"}message",PROPERTY_ACTORTYPE:"{"+t.Files.Client.NS_OWNCLOUD+"}actorType",PROPERTY_ACTORID:"{"+t.Files.Client.NS_OWNCLOUD+"}actorId",PROPERTY_ISUNREAD:"{"+t.Files.Client.NS_OWNCLOUD+"}isUnread",PROPERTY_OBJECTID:"{"+t.Files.Client.NS_OWNCLOUD+"}objectId",PROPERTY_OBJECTTYPE:"{"+t.Files.Client.NS_OWNCLOUD+"}objectType",PROPERTY_ACTORDISPLAYNAME:"{"+t.Files.Client.NS_OWNCLOUD+"}actorDisplayName",PROPERTY_CREATIONDATETIME:"{"+t.Files.Client.NS_OWNCLOUD+"}creationDateTime",PROPERTY_MENTIONS:"{"+t.Files.Client.NS_OWNCLOUD+"}mentions"});var n=t.Backbone.Model.extend({sync:t.Backbone.davSync,defaults:{actorType:"users",objectType:"files"},davProperties:{id:t.Files.Client.PROPERTY_FILEID,message:t.Files.Client.PROPERTY_MESSAGE,actorType:t.Files.Client.PROPERTY_ACTORTYPE,actorId:t.Files.Client.PROPERTY_ACTORID,actorDisplayName:t.Files.Client.PROPERTY_ACTORDISPLAYNAME,creationDateTime:t.Files.Client.PROPERTY_CREATIONDATETIME,objectType:t.Files.Client.PROPERTY_OBJECTTYPE,objectId:t.Files.Client.PROPERTY_OBJECTID,isUnread:t.Files.Client.PROPERTY_ISUNREAD,mentions:t.Files.Client.PROPERTY_MENTIONS},parse:function(t){return{id:t.id,message:t.message,actorType:t.actorType,actorId:t.actorId,actorDisplayName:t.actorDisplayName,creationDateTime:t.creationDateTime,objectType:t.objectType,objectId:t.objectId,isUnread:"true"===t.isUnread,mentions:this._parseMentions(t.mentions)}},_parseMentions:function(t){if(_.isUndefined(t))return{};var e={};for(var n in t){var o=t[n];if(!_.isUndefined(o.localName)&&"mention"===o.localName){e[n]={};for(var i=o.firstChild;i;i=i.nextSibling)!_.isUndefined(i.localName)&&i.localName.startsWith("mention")&&(e[n][i.localName]=i.textContent)}}return e}});e.Comments.CommentModel=n}(OC,OCA)},function(t,e){!function(t,e){var n=t.Backbone.Collection.extend({sync:t.Backbone.davSync,model:e.Comments.CommentModel,_objectType:"files",_objectId:null,_endReached:!1,_limit:20,initialize:function(t,e){(e=e||{}).objectType&&(this._objectType=e.objectType),e.objectId&&(this._objectId=e.objectId)},url:function(){return t.linkToRemote("dav")+"/comments/"+encodeURIComponent(this._objectType)+"/"+encodeURIComponent(this._objectId)+"/"},setObjectId:function(t){this._objectId=t},hasMoreResults:function(){return!this._endReached},reset:function(){return this._endReached=!1,this._summaryModel=null,t.Backbone.Collection.prototype.reset.apply(this,arguments)},fetchNext:function(t){var e=this;if(!this.hasMoreResults())return null;var o='<?xml version="1.0" encoding="utf-8" ?>\n<oc:filter-comments xmlns:D="DAV:" xmlns:oc="http://owncloud.org/ns">\n <oc:limit>'+(this._limit+1)+"</oc:limit>\n <oc:offset>"+this.length+"</oc:offset>\n</oc:filter-comments>\n",i=(t=t||{}).success;return t=_.extend({remove:!1,parse:!0,data:o,davProperties:n.prototype.model.prototype.davProperties,success:function(n){if(n.length<=e._limit?e._endReached=!0:n=_.initial(n),!e.set(n,t))return!1;i&&i.apply(null,arguments),e.trigger("sync","REPORT",e,t)}},t),this.sync("REPORT",this,t)},getSummaryModel:function(){return this._summaryModel||(this._summaryModel=new e.Comments.CommentSummaryModel({id:this._objectId,objectType:this._objectType})),this._summaryModel},updateReadMarker:function(t,e){return e=e||{},this.getSummaryModel().save({readMarker:(t||new Date).toUTCString()},e)}});e.Comments.CommentCollection=n}(OC,OCA)},function(t,e){!function(t,e){_.extend(t.Files.Client,{PROPERTY_READMARKER:"{"+t.Files.Client.NS_OWNCLOUD+"}readMarker"});var n=t.Backbone.Model.extend({sync:t.Backbone.davSync,_objectType:"files",_objectId:null,davProperties:{readMarker:t.Files.Client.PROPERTY_READMARKER},initialize:function(t,e){(e=e||{}).objectType&&(this._objectType=e.objectType)},url:function(){return t.linkToRemote("dav")+"/comments/"+encodeURIComponent(this._objectType)+"/"+encodeURIComponent(this.id)+"/"}});e.Comments.CommentSummaryModel=n}(OC,OCA)},function(e,n){!function(e,n){var o=n.Files.DetailTabView.extend({id:"commentsTabView",className:"tab commentsTabView",_autoCompleteData:void 0,_commentsModifyMenu:void 0,events:{"submit .newCommentForm":"_onSubmitComment","click .showMore":"_onClickShowMore","click .cancel":"_onClickCloseComment","click .comment":"_onClickComment","keyup div.message":"_onTextChange","change div.message":"_onTextChange","input div.message":"_onTextChange","paste div.message":"_onPaste"},_commentMaxLength:1e3,initialize:function(){n.Files.DetailTabView.prototype.initialize.apply(this,arguments),this.collection=new n.Comments.CommentCollection,this.collection.on("request",this._onRequest,this),this.collection.on("sync",this._onEndRequest,this),this.collection.on("add",this._onAddModel,this),this.collection.on("change:message",this._onChangeModel,this),this._commentMaxThreshold=.9*this._commentMaxLength,_.bindAll(this,"_onTypeComment","_initAutoComplete","_onAutoComplete")},template:function(t){var o=e.getCurrentUser();return n.Comments.Templates.view(_.extend({actorId:o.uid,actorDisplayName:o.displayName},t))},editCommentTemplate:function(o){var i=e.getCurrentUser();return n.Comments.Templates.edit_comment(_.extend({actorId:i.uid,actorDisplayName:i.displayName,newMessagePlaceholder:t("comments","New comment …"),submitText:t("comments","Post"),cancelText:t("comments","Cancel"),tag:"li"},o))},commentTemplate:function(o){return"deleted_users"===(o=_.extend({editTooltip:t("comments","Edit comment"),isUserAuthor:e.getCurrentUser().uid===o.actorId,isLong:this._isLong(o.message)},o)).actorType&&(o.actorId=null,o.actorDisplayName=t("comments","[Deleted user]")),n.Comments.Templates.comment(o)},getLabel:function(){return t("comments","Comments")},getIcon:function(){return"icon-comment"},setFileInfo:function(t){t?(this.model=t,this.render(),this._initAutoComplete($("#commentsTabView").find(".newCommentForm .message")),this.collection.setObjectId(this.model.id),this.collection.reset([],{silent:!0}),this.nextPage()):(this.model=null,this.render(),this.collection.reset())},render:function(){this.$el.html(this.template({emptyResultLabel:t("comments","No comments yet, start the conversation!"),moreLabel:t("comments","More comments …")})),this.$el.find(".comments").before(this.editCommentTemplate({tag:"div"})),this.$el.find(".has-tooltip").tooltip(),this.$container=this.$el.find("ul.comments"),this.$el.find(".avatar").avatar(e.getCurrentUser().uid,32),this.delegateEvents(),this.$el.find(".message").on("keydown input change",this._onTypeComment),autosize(this.$el.find(".newCommentRow .message")),this.$el.find(".newCommentForm .message").focus()},_initAutoComplete:function(t){var n=this,o=10;_.isUndefined(e.appConfig.comments)||(o=e.appConfig.comments.maxAutoCompleteResults),t.atwho({at:"@",limit:o,callbacks:{remoteFilter:n._onAutoComplete,highlighter:function(t){var e=$(t);return e.find(".avatar").avatar(void 0,32),e},sorter:function(t,e){return e}},displayTpl:function(t){return'<li><span class="avatar-name-wrapper"><span class="avatar" data-username="'+escapeHTML(t.id)+'" data-user="'+escapeHTML(t.id)+'" data-user-display-name="'+escapeHTML(t.label)+'"></span><strong>'+escapeHTML(t.label)+"</strong></span></li>"},insertTpl:function(t){return'<span class="avatar-name-wrapper"><span class="avatar" data-username="'+escapeHTML(t.id)+'" data-user="'+escapeHTML(t.id)+'" data-user-display-name="'+escapeHTML(t.label)+'"></span><strong>'+escapeHTML(t.label)+"</strong></span>"},searchKey:"label"}),t.on("inserted.atwho",function(t,e){n._postRenderItem($(t.target).find('span[data-username="'+e.find("[data-username]").data("username")+'"]').parent(),!0)})},_onAutoComplete:function(t,n){var o=this;_.isUndefined(this._autoCompleteRequestTimer)||clearTimeout(this._autoCompleteRequestTimer),this._autoCompleteRequestTimer=_.delay(function(){_.isUndefined(this._autoCompleteRequestCall)||this._autoCompleteRequestCall.abort(),this._autoCompleteRequestCall=$.ajax({url:e.linkToOCS("core",2)+"autocomplete/get",data:{search:t,itemType:"files",itemId:o.model.get("id"),sorter:"commenters|share-recipients",limit:e.appConfig.comments.maxAutoCompleteResults},beforeSend:function(t){t.setRequestHeader("Accept","application/json")},success:function(t){n(t.ocs.data)}})},400)},_formatItem:function(t){var n=new Date(t.get("creationDateTime")).getTime();return _.extend({timestamp:n,date:e.Util.relativeModifiedDate(n),altDate:e.Util.formatDate(n),formattedMessage:this._formatMessage(t.get("message"),t.get("mentions"))},t.attributes)},_toggleLoading:function(t){this._loading=t,this.$el.find(".loading").toggleClass("hidden",!t)},_onRequest:function(t){"REPORT"===t&&(this._toggleLoading(!0),this.$el.find(".showMore").addClass("hidden"))},_onEndRequest:function(t){var e=this.model;(this._toggleLoading(!1),this.$el.find(".emptycontent").toggleClass("hidden",!!this.collection.length),this.$el.find(".showMore").toggleClass("hidden",!this.collection.hasMoreResults()),"REPORT"===t)&&(this.collection.findWhere({isUnread:!0})&&this.collection.updateReadMarker(null,{success:function(){e.set("commentsUnread",0)}}),this.$el.find(".newCommentForm .message").focus())},_onAddModel:function(t,e,n){var o=$(this.commentTemplate(this._formatItem(t)));!_.isUndefined(n.at)&&e.length>1?this.$container.find("li").eq(n.at).before(o):this.$container.append(o),this._postRenderItem(o),$("#commentsTabView").find(".newCommentForm div.message").text("").prop("contenteditable",!0);var i=t.get("mentions"),a=this;t.fetch({success:function(t){if(!_.isEqual(i,t.get("mentions"))){var e=$(a.commentTemplate(a._formatItem(t)));o.html(e.html()),a._postRenderItem(o)}}})},_onChangeModel:function(t){if(t.get("message").trim()!==t.previous("message").trim()){var e=this.$container.find('.comment[data-id="'+t.id+'"] form').closest(".comment"),n=e.data("commentEl");if(!_.isUndefined(n)){var o=this;t.fetch({success:function(t){n.removeClass("hidden"),e.remove();var i=n.find(".message");i.html(o._formatMessage(t.get("message"),t.get("mentions"))).find(".avatar").each(function(){$(this).avatar()}),o._postRenderItem(i)}})}}},_postRenderItem:function(t,e){t.find(".has-tooltip").tooltip();var o=t.find(".message .avatar");$(t.context).hasClass("message")&&(o=t.find(".avatar")),o.each(function(){var t=$(this);t.avatar(t.attr("data-username"),16)}),t.find(".authorRow .avatar").each(function(){var t=$(this);t.avatar(t.attr("data-username"),32)});var i=t.find(".avatar").data("username");i!==oc_current_user&&t.find(".authorRow .avatar, .authorRow .author").contactsMenu(i,0,t.find(".authorRow"));var a=t.find(".message");if(0===a.length&&(a=t),!e){var r=this,s=new n.Comments.CommentsModifyMenu;t.find(".authorRow").append(s.$el),t.find(".more").on("click",_.bind(s.show,s)),r.listenTo(s,"select:menu-item-clicked",function(t,e){"edit"===e?r._onClickEditComment(t):"delete"===e&&r._onClickDeleteComment(t)})}this._postRenderMessage(a,e)},_postRenderMessage:function(t,n){n||t.find(".avatar-name-wrapper").each(function(){var t=$(this),n=t.find(".avatar").data("user");n!==e.getCurrentUser().uid&&t.contactsMenu(n,0,t)})},_formatMessage:function(t,e,n){for(var o in t=escapeHTML(t).replace(/\n/g,"<br/>"),e){if(!e.hasOwnProperty(o))return;var i="@"+e[o].mentionId;-1!==e[o].mentionId.indexOf(" ")&&(i=_.escape('@"'+e[o].mentionId+'"')),i=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");var a=new RegExp("(^|\\s)("+i+")\\b","g");-1!==e[o].mentionId.indexOf(" ")&&(a=new RegExp("(^|\\s)("+i+")","g"));var r=this._composeHTMLMention(e[o].mentionId,e[o].mentionDisplayName);t=t.replace(a,function(t,e){return e+r})}return!0!==n&&(t=OCP.Comments.plainToRich(t)),t},_composeHTMLMention:function(t,n){var o='<span class="avatar" data-username="'+_.escape(t)+'" data-user="'+_.escape(t)+'" data-user-display-name="'+_.escape(n)+'"></span>';return'<span class="atwho-inserted" contenteditable="false"><span class="avatar-name-wrapper'+(t===e.getCurrentUser().uid?" currentUser":"")+'">'+o+"<strong>"+_.escape(n)+"</strong></span></span>"},nextPage:function(){!this._loading&&this.collection.hasMoreResults()&&this.collection.fetchNext()},_onClickEditComment:function(e){e.preventDefault();var n=$(e.target).closest(".comment"),o=n.data("id"),i=this.collection.get(o),a=$(this.editCommentTemplate(_.extend({isEditMode:!0,submitText:t("comments","Save")},i.attributes)));n.addClass("hidden").removeClass("collapsed"),n.after(a),a.data("commentEl",n),a.find(".message").on("keydown input change",this._onTypeComment),a.find(".avatar:first").replaceWith(n.find(".avatar:first").clone()),a.find(".has-tooltip").tooltip();var r=a.find(".message");r.html(this._formatMessage(i.get("message"),i.get("mentions"),!0)).find(".avatar").each(function(){$(this).avatar()});return this._postRenderItem(r,!0),autosize(a.find(".message")),this._initAutoComplete(a.find(".message")),!1},_onTypeComment:function(e){var n=$(e.target),o=n.text().length,i=n.data("submitButtonEl");i||(i=n.closest("form").find(".submit"),n.data("submitButtonEl",i)),n.tooltip("hide"),o>this._commentMaxThreshold&&(n.attr("data-original-title",t("comments","Allowed characters {count} of {max}",{count:o,max:this._commentMaxLength})),n.tooltip({trigger:"manual"}),n.tooltip("show"),n.addClass("error"));var a=o>this._commentMaxLength;n.toggleClass("error",a),i.prop("disabled",a),13!==e.keyCode||e.shiftKey||n.atwho("isSelecting")||(i.click(),e.preventDefault())},_onClickComment:function(t){var e=$(t.target);e.is(".comment")||(e=e.closest(".comment")),e.removeClass("collapsed")},_onClickCloseComment:function(t){t.preventDefault();var e=$(t.target).closest(".comment");return e.data("commentEl").removeClass("hidden"),e.remove(),!1},_onClickDeleteComment:function(n){n.preventDefault();var o=$(n.target).closest(".comment"),i=o.data("id"),a=o.find(".deleteLoading"),r=o.find(".more");return o.addClass("disabled"),a.removeClass("hidden"),r.addClass("hidden"),o.data("commentEl",o),this.collection.get(i).destroy({success:function(){o.data("commentEl").remove(),o.remove()},error:function(){a.addClass("hidden"),r.removeClass("hidden"),o.removeClass("disabled"),e.Notification.showTemporary(t("comments","Error occurred while retrieving comment with ID {id}",{id:i}))}}),!1},_onClickShowMore:function(t){t.preventDefault(),this.nextPage()},_onSubmitSuccess:function(t,e){var n=e.find(".submit"),o=e.find(".submitLoading");n.removeClass("hidden"),o.addClass("hidden")},_commentBodyHTML2Plain:function(t){var e,n=t.clone();n.find(".avatar-name-wrapper").each(function(){var t=$(this),e=t.parent(),n=t.find(".avatar").data("username");-1!==n.indexOf(" ")?e.html('@"'+n+'"'):e.html("@"+n)}),n.html(OCP.Comments.richToPlain(n.html()));var o=n.html();do{o=(e=o).replace("<br>","\n")}while(e!==o);return n.html(o),n.text()},_onSubmitComment:function(t){var n=this,o=$(t.target),i=o.closest(".comment").data("id"),a=e.getCurrentUser(),r=o.find(".submit"),s=o.find(".submitLoading"),l=o.find(".message"),c=l.text().trim();if(t.preventDefault(),c.length&&!(c.length>this._commentMaxLength)){if(l.prop("contenteditable",!1),r.addClass("hidden"),s.removeClass("hidden"),c=this._commentBodyHTML2Plain(l),i)this.collection.get(i).save({message:c},{success:function(t){if(n._onSubmitSuccess(t,o),t.get("message").trim()===t.previous("message").trim()){var e=o.closest(".comment");e.data("commentEl").removeClass("hidden"),e.remove()}},error:function(){n._onSubmitError(o,i)}});else this.collection.create({actorId:a.uid,actorDisplayName:a.displayName,actorType:"users",verb:"comment",message:c,creationDateTime:(new Date).toUTCString()},{at:0,wait:!0,success:function(t){n._onSubmitSuccess(t,o)},error:function(){n._onSubmitError(o,void 0)}});return!1}},_onSubmitError:function(n,o){n.find(".submit").removeClass("hidden"),n.find(".submitLoading").addClass("hidden"),n.find(".message").prop("contenteditable",!0),_.isUndefined(o)?e.Notification.show(t("comments","Error occurred while posting comment"),{type:"error"}):e.Notification.show(t("comments","Error occurred while updating comment with id {id}",{id:o}),{type:"error"})},_onTextChange:function(){var t=$("#commentsTabView").find(".newCommentForm div.message");t.text().trim().length||t.empty()},_onPaste:function(t){t.preventDefault();var e=t.originalEvent.clipboardData.getData("text/plain");document.execCommand("insertText",!1,e)},_isLong:function(t){return t.length>250||(t.match(/\n/g)||[]).length>1}});n.Comments.CommentsTabView=o}(OC,OCA)},function(e,n){var o;OC,OCA,o=OC.Backbone.View.extend({tagName:"div",className:"commentsModifyMenu popovermenu bubble menu",_scopes:[{name:"edit",displayName:t("comments","Edit comment"),iconClass:"icon-rename"},{name:"delete",displayName:t("comments","Delete comment"),iconClass:"icon-delete"}],initialize:function(){},events:{"click a.action":"_onClickAction"},_onClickAction:function(t){var e=$(t.currentTarget);e.hasClass("menuitem")||(e=e.closest(".menuitem")),OC.hideMenus(),this.trigger("select:menu-item-clicked",t,e.data("action"))},render:function(){this.$el.html(OCA.Comments.Templates.commentsmodifymenu({items:this._scopes}))},show:function(t){for(var e in this._context=t,this._scopes)this._scopes[e].active=!1;var n=$(t.target),o=n.offset(),i=n.closest(".authorRow").offset(),a={top:o.top-i.top+48,left:"",right:""};a.left=o.left-i.left,a.left>200?(a.left="",a.right=this.$el.closest(".comment").find(".date").width(),this.$el.removeClass("menu-left").addClass("menu-right")):this.$el.removeClass("menu-right").addClass("menu-left"),this.$el.css(a),this.render(),this.$el.removeClass("hidden"),OC.showMenu(null,this.$el)}}),OCA.Comments=OCA.Comments||{},OCA.Comments.CommentsModifyMenu=o},function(e,o){_.extend(OC.Files.Client,{PROPERTY_COMMENTS_UNREAD:"{"+OC.Files.Client.NS_OWNCLOUD+"}comments-unread"}),OCA.Comments=_.extend({},OCA.Comments),OCA.Comments||(OCA.Comments={}),OCA.Comments.FilesPlugin={ignoreLists:["files_trashbin","files.public"],_formatCommentCount:function(t){return OCA.Comments.Templates.filesplugin({count:t,countMessage:n("comments","%n unread comment","%n unread comments",t),iconUrl:OC.imagePath("core","actions/comment")})},attach:function(e){var n=this;if(!(this.ignoreLists.indexOf(e.id)>=0)){e.registerTabView(new OCA.Comments.CommentsTabView("commentsTabView"));var o=e._getWebdavProperties;e._getWebdavProperties=function(){var t=o.apply(this,arguments);return t.push(OC.Files.Client.PROPERTY_COMMENTS_UNREAD),t},e.filesClient.addFileInfoParser(function(t){var e={},n=t.propStat[0].properties[OC.Files.Client.PROPERTY_COMMENTS_UNREAD];return _.isUndefined(n)||""===n||(e.commentsUnread=parseInt(n,10)),e}),e.$el.addClass("has-comments");var i=e._createRow;e._createRow=function(t){var e=i.apply(this,arguments);return t.commentsUnread&&e.attr("data-comments-unread",t.commentsUnread),e},e.fileActions.registerAction({name:"Comment",displayName:t("comments","Comment"),mime:"all",permissions:OC.PERMISSION_READ,type:OCA.Files.FileActions.TYPE_INLINE,render:function(t,e,o){var i=o.$file.data("comments-unread");if(i){var a=$(n._formatCommentCount(i));return o.$file.find("a.name>span.fileactions").append(a),a}return""},actionHandler:function(t,e){e.$file.find(".action-comment").tooltip("hide"),e.fileList.showDetailsView(t,"commentsTabView")}});var a=e.elementToFile;e.elementToFile=function(t){var e=a.apply(this,arguments),n=t.data("comments-unread");return n&&(e.commentsUnread=n),e}}}},OC.Plugins.register("OCA.Files.FileList",OCA.Comments.FilesPlugin)},function(t,e){OCA.Comments.ActivityTabViewPlugin={prepareModelForDisplay:function(t,e,n){if("comments"===t.get("app")&&"comments"===t.get("type")&&"ActivityTabView"===n&&(e.addClass("comment"),t.get("message")&&this._isLong(t.get("message")))){e.addClass("collapsed");var o=$("<div>").addClass("message-overlay");e.find(".activitymessage").after(o),e.on("click",this._onClickCollapsedComment)}},_onClickCollapsedComment:function(t){var e=$(t.target);e.is(".comment")||(e=e.closest(".comment")),e.removeClass("collapsed")},_isLong:function(t){return t.length>250||(t.match(/\n/g)||[]).length>1}},OC.Plugins.register("OCA.Activity.RenderingPlugins",OCA.Comments.ActivityTabViewPlugin)},function(t,e){!function(t,e,n){"use strict";var o=function(){this.initialize()};o.prototype={fileList:null,initialize:function(){var o=this;this.fileAppLoaded=function(){return!!e.Files&&!!e.Files.App},this.renderCommentResult=function(e,o){var i;(i=n(".nofilterresults")).hasClass("hidden")||i.addClass("hidden"),this.updateLegacyMimetype(o);var a=n("<div>").addClass("path").text(o.path),r=n("<div>");r.addClass("avatar").css("display","inline-block").css("vertical-align","middle").css("margin","0 5px 2px 3px"),o.authorName?r.avatar(o.authorId,21,void 0,!1,void 0,o.authorName):r.avatar(o.authorId,21),e.find("td.info div.name").after(a).text(o.comment).prepend(n("<span>").addClass("path").css("margin-right","5px").text(o.authorName)).prepend(r),e.find("td.result a").attr("href",o.link),e.find("td.icon").css("background-image","url("+t.imagePath("core","actions/comment")+")").css("opacity",".4");var s=t.dirname(o.path);return s===o.path&&(s="/"),e.find("td.info a").attr("href",t.generateUrl("/apps/files/?dir={dir}&scrollto={scrollto}",{dir:s,scrollto:o.fileName})),e},this.handleCommentClick=function(e,n,i){return!o.fileAppLoaded()||"files"!==o.fileList.id||(o.fileList.changeDirectory(t.dirname(n.path)),o.fileList.scrollTo(n.name),!1)},this.updateLegacyMimetype=function(t){!t.mime&&t.mime_type&&(t.mime=t.mime_type)},this.setFileList=function(t){this.fileList=t},t.Plugins.register("OCA.Search.Core",this)},attach:function(t){t.setRenderer("comment",this.renderCommentResult.bind(this)),t.setHandler("comment",this.handleCommentClick.bind(this))}},e.Search.comment=new o}(OC,OCA,$)},function(t,e,n){var o,i,a;a=this,o=[n(0)],void 0===(i=function(t){return a.returnExportsGlobal=function(t){"use strict";var e,n,o,i,a,r,s,l;e=function(){function e(t){this.$inputor=t,this.domInputor=this.$inputor[0]}return e.prototype.setPos=function(){return this.domInputor},e.prototype.getIEPosition=function(){return this.getPosition()},e.prototype.getPosition=function(){var t,e;return e=this.getOffset(),t=this.$inputor.offset(),e.left-=t.left,e.top-=t.top,e},e.prototype.getOldIEPos=function(){var t,e;return e=r.selection.createRange(),(t=r.body.createTextRange()).moveToElementText(this.domInputor),t.setEndPoint("EndToEnd",e),t.text.length},e.prototype.getPos=function(){var t,e,n;return(n=this.range())?((t=n.cloneRange()).selectNodeContents(this.domInputor),t.setEnd(n.endContainer,n.endOffset),e=t.toString().length,t.detach(),e):r.selection?this.getOldIEPos():void 0},e.prototype.getOldIEOffset=function(){var t,e;return(t=r.selection.createRange().duplicate()).moveStart("character",-1),{height:(e=t.getBoundingClientRect()).bottom-e.top,left:e.left,top:e.top}},e.prototype.getOffset=function(){var e,n,o,i,a;return s.getSelection&&(o=this.range())?(o.endOffset-1>0&&o.endContainer===!this.domInputor&&((e=o.cloneRange()).setStart(o.endContainer,o.endOffset-1),e.setEnd(o.endContainer,o.endOffset),i=e.getBoundingClientRect(),n={height:i.height,left:i.left+i.width,top:i.top},e.detach()),n&&0!==(null!=n?n.height:void 0)||(e=o.cloneRange(),a=t(r.createTextNode("|")),e.insertNode(a[0]),e.selectNode(a[0]),i=e.getBoundingClientRect(),n={height:i.height,left:i.left,top:i.top},a.remove(),e.detach())):r.selection&&(n=this.getOldIEOffset()),n&&(n.top+=t(s).scrollTop(),n.left+=t(s).scrollLeft()),n},e.prototype.range=function(){var t;if(s.getSelection)return(t=s.getSelection()).rangeCount>0?t.getRangeAt(0):null},e}(),n=function(){function e(t){this.$inputor=t,this.domInputor=this.$inputor[0]}return e.prototype.getIEPos=function(){var t,e,n,o,i,a,s;return e=this.domInputor,a=r.selection.createRange(),i=0,a&&a.parentElement()===e&&(o=e.value.replace(/\r\n/g,"\n"),n=o.length,(s=e.createTextRange()).moveToBookmark(a.getBookmark()),(t=e.createTextRange()).collapse(!1),i=s.compareEndPoints("StartToEnd",t)>-1?n:-s.moveStart("character",-n)),i},e.prototype.getPos=function(){return r.selection?this.getIEPos():this.domInputor.selectionStart},e.prototype.setPos=function(t){var e,n;return e=this.domInputor,r.selection?((n=e.createTextRange()).move("character",t),n.select()):e.setSelectionRange&&e.setSelectionRange(t,t),e},e.prototype.getIEOffset=function(t){var e,n,o,i;return n=this.domInputor.createTextRange(),t||(t=this.getPos()),n.move("character",t),o=n.boundingLeft,i=n.boundingTop,e=n.boundingHeight,{left:o,top:i,height:e}},e.prototype.getOffset=function(e){var n,o,i;return n=this.$inputor,r.selection?((o=this.getIEOffset(e)).top+=t(s).scrollTop()+n.scrollTop(),o.left+=t(s).scrollLeft()+n.scrollLeft(),o):(o=n.offset(),i=this.getPosition(e),o={left:o.left+i.left-n.scrollLeft(),top:o.top+i.top-n.scrollTop(),height:i.height})},e.prototype.getPosition=function(t){var e,n,i,a,r;return e=this.$inputor,i=function(t){return t=t.replace(/<|>|`|"|&/g,"?").replace(/\r\n|\r|\n/g,"<br/>"),/firefox/i.test(navigator.userAgent)&&(t=t.replace(/\s/g,"&nbsp;")),t},void 0===t&&(t=this.getPos()),r=e.val().slice(0,t),n=e.val().slice(t),a="<span style='position: relative; display: inline;'>"+i(r)+"</span>",a+="<span id='caret' style='position: relative; display: inline;'>|</span>",a+="<span style='position: relative; display: inline;'>"+i(n)+"</span>",new o(e).create(a).rect()},e.prototype.getIEPosition=function(t){var e,n,o,i,a;return o=this.getIEOffset(t),n=this.$inputor.offset(),i=o.left-n.left,a=o.top-n.top,e=o.height,{left:i,top:a,height:e}},e}(),o=function(){function e(t){this.$inputor=t}return e.prototype.css_attr=["borderBottomWidth","borderLeftWidth","borderRightWidth","borderTopStyle","borderRightStyle","borderBottomStyle","borderLeftStyle","borderTopWidth","boxSizing","fontFamily","fontSize","fontWeight","height","letterSpacing","lineHeight","marginBottom","marginLeft","marginRight","marginTop","outlineWidth","overflow","overflowX","overflowY","paddingBottom","paddingLeft","paddingRight","paddingTop","textAlign","textOverflow","textTransform","whiteSpace","wordBreak","wordWrap"],e.prototype.mirrorCss=function(){var e,n=this;return e={position:"absolute",left:-9999,top:0,zIndex:-2e4},"TEXTAREA"===this.$inputor.prop("tagName")&&this.css_attr.push("width"),t.each(this.css_attr,function(t,o){return e[o]=n.$inputor.css(o)}),e},e.prototype.create=function(e){return this.$mirror=t("<div></div>"),this.$mirror.css(this.mirrorCss()),this.$mirror.html(e),this.$inputor.after(this.$mirror),this},e.prototype.rect=function(){var t,e,n;return t=this.$mirror.find("#caret"),e=t.position(),n={left:e.left,top:e.top,height:t.height()},this.$mirror.remove(),n},e}(),i={contentEditable:function(t){return!(!t[0].contentEditable||"true"!==t[0].contentEditable)}},a={pos:function(t){return t||0===t?this.setPos(t):this.getPos()},position:function(t){return r.selection?this.getIEPosition(t):this.getPosition(t)},offset:function(t){return this.getOffset(t)}},r=null,s=null,l=function(t){var e;return(e=null!=t?t.iframe:void 0)?(s=e.contentWindow,r=e.contentDocument||s.document):(s=window,r=document)},t.fn.caret=function(o,r,s){var c;return a[o]?(t.isPlainObject(r)?(l(r),r=void 0):l(s),c=i.contentEditable(this)?new e(this):new n(this),a[o].apply(c,[r])):t.error("Method "+o+" does not exist on jQuery.caret")},t.fn.caret.EditableCaret=e,t.fn.caret.InputCaret=n,t.fn.caret.Utils=i,t.fn.caret.apis=a}(t)}.apply(e,o))||(t.exports=i)},function(t,e,n){var o,i;function a(t){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}o=[n(0)],void 0===(i=function(t){return function(t){var e,n,o;n={ESC:27,TAB:9,ENTER:13,CTRL:17,A:65,P:80,N:78,LEFT:37,UP:38,RIGHT:39,DOWN:40,BACKSPACE:8,SPACE:32},e={beforeSave:function(t){return i.arrayToDefaultHash(t)},matcher:function(t,e,n,o){var i,a,r,s;return t=t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),n&&(t="(?:^|\\s)"+t),i=decodeURI("%C3%80"),a=decodeURI("%C3%BF"),s=new RegExp(t+"([A-Za-z"+i+"-"+a+"0-9_"+(o?" ":"")+"'.+-]*)$|"+t+"([^\\x00-\\xff]*)$","gi"),(r=s.exec(e))?r[2]||r[1]:null},filter:function(t,e,n){var o,i,a,r;for(o=[],i=0,r=e.length;r>i;i++)a=e[i],~new String(a[n]).toLowerCase().indexOf(t.toLowerCase())&&o.push(a);return o},remoteFilter:null,sorter:function(t,e,n){var o,i,a,r;if(!t)return e;for(o=[],i=0,r=e.length;r>i;i++)(a=e[i]).atwho_order=new String(a[n]).toLowerCase().indexOf(t.toLowerCase()),a.atwho_order>-1&&o.push(a);return o.sort(function(t,e){return t.atwho_order-e.atwho_order})},tplEval:function(t,e){var n;n=t;try{return"string"!=typeof t&&(n=t(e)),n.replace(/\$\{([^\}]*)\}/g,function(t,n,o){return e[n]})}catch(t){return""}},highlighter:function(t,e){var n;return e?(n=new RegExp(">\\s*([^<]*?)("+e.replace("+","\\+")+")([^<]*)\\s*<","ig"),t.replace(n,function(t,e,n,o){return"> "+e+"<strong>"+n+"</strong>"+o+" <"})):t},beforeInsert:function(t,e,n){return t},beforeReposition:function(t){return t},afterMatchFailed:function(t,e){}},o=function(){function e(e){this.currentFlag=null,this.controllers={},this.aliasMaps={},this.$inputor=t(e),this.setupRootElement(),this.listen()}return e.prototype.createContainer=function(e){var n;return null!=(n=this.$el)&&n.remove(),t(e.body).append(this.$el=t("<div class='atwho-container'></div>"))},e.prototype.setupRootElement=function(e,n){var o,i;if(null==n&&(n=!1),e)this.window=e.contentWindow,this.document=e.contentDocument||this.window.document,this.iframe=e;else{this.document=this.$inputor[0].ownerDocument,this.window=this.document.defaultView||this.document.parentWindow;try{this.iframe=this.window.frameElement}catch(i){if(o=i,this.iframe=null,t.fn.atwho.debug)throw new Error("iframe auto-discovery is failed.\nPlease use `setIframe` to set the target iframe manually.\n"+o)}}return this.createContainer((this.iframeAsRoot=n)?this.document:document)},e.prototype.controller=function(t){var e,n,o,i;if(this.aliasMaps[t])n=this.controllers[this.aliasMaps[t]];else for(o in i=this.controllers)if(e=i[o],o===t){n=e;break}return n||this.controllers[this.currentFlag]},e.prototype.setContextFor=function(t){return this.currentFlag=t,this},e.prototype.reg=function(t,e){var n,o;return o=(n=this.controllers)[t]||(n[t]=this.$inputor.is("[contentEditable]")?new u(this,t):new s(this,t)),e.alias&&(this.aliasMaps[e.alias]=t),o.init(e),this},e.prototype.listen=function(){return this.$inputor.on("compositionstart",(t=this,function(e){var n;return null!=(n=t.controller())&&n.view.hide(),t.isComposing=!0,null})).on("compositionend",function(t){return function(e){return t.isComposing=!1,setTimeout(function(e){return t.dispatch(e)}),null}}(this)).on("keyup.atwhoInner",function(t){return function(e){return t.onKeyup(e)}}(this)).on("keydown.atwhoInner",function(t){return function(e){return t.onKeydown(e)}}(this)).on("blur.atwhoInner",function(t){return function(e){var n;return(n=t.controller())?(n.expectedQueryCBId=null,n.view.hide(e,n.getOpt("displayTimeout"))):void 0}}(this)).on("click.atwhoInner",function(t){return function(e){return t.dispatch(e)}}(this)).on("scroll.atwhoInner",function(t){return function(){var e;return e=t.$inputor.scrollTop(),function(n){var o,i;return o=n.target.scrollTop,e!==o&&null!=(i=t.controller())&&i.view.hide(n),e=o,!0}}}(this)());var t},e.prototype.shutdown=function(){var t,e;for(t in e=this.controllers)e[t].destroy(),delete this.controllers[t];return this.$inputor.off(".atwhoInner"),this.$el.remove()},e.prototype.dispatch=function(t){var e,n,o,i;for(e in o=this.controllers,i=[],o)n=o[e],i.push(n.lookUp(t));return i},e.prototype.onKeyup=function(e){var o;switch(e.keyCode){case n.ESC:e.preventDefault(),null!=(o=this.controller())&&o.view.hide();break;case n.DOWN:case n.UP:case n.CTRL:case n.ENTER:t.noop();break;case n.P:case n.N:e.ctrlKey||this.dispatch(e);break;default:this.dispatch(e)}},e.prototype.onKeydown=function(e){var o,i;if((i=null!=(o=this.controller())?o.view:void 0)&&i.visible())switch(e.keyCode){case n.ESC:e.preventDefault(),i.hide(e);break;case n.UP:e.preventDefault(),i.prev();break;case n.DOWN:e.preventDefault(),i.next();break;case n.P:if(!e.ctrlKey)return;e.preventDefault(),i.prev();break;case n.N:if(!e.ctrlKey)return;e.preventDefault(),i.next();break;case n.TAB:case n.ENTER:case n.SPACE:if(!i.visible())return;if(!this.controller().getOpt("spaceSelectsMatch")&&e.keyCode===n.SPACE)return;if(!this.controller().getOpt("tabSelectsMatch")&&e.keyCode===n.TAB)return;i.highlighted()?(e.preventDefault(),i.choose(e)):i.hide(e);break;default:t.noop()}},e}();var i,r=[].slice;i=function(){function n(e,n){this.app=e,this.at=n,this.$inputor=this.app.$inputor,this.id=this.$inputor[0].id||this.uid(),this.expectedQueryCBId=null,this.setting=null,this.query=null,this.pos=0,this.range=null,0===(this.$el=t("#atwho-ground-"+this.id,this.app.$el)).length&&this.app.$el.append(this.$el=t("<div id='atwho-ground-"+this.id+"'></div>")),this.model=new m(this),this.view=new h(this)}return n.prototype.uid=function(){return(Math.random().toString(16)+"000000000").substr(2,8)+(new Date).getTime()},n.prototype.init=function(e){return this.setting=t.extend({},this.setting||t.fn.atwho.default,e),this.view.init(),this.model.reload(this.setting.data)},n.prototype.destroy=function(){return this.trigger("beforeDestroy"),this.model.destroy(),this.view.destroy(),this.$el.remove()},n.prototype.callDefault=function(){var n,o,i,a;a=arguments[0],n=2<=arguments.length?r.call(arguments,1):[];try{return e[a].apply(this,n)}catch(i){return o=i,t.error(o+" Or maybe At.js doesn't have function "+a)}},n.prototype.trigger=function(t,e){var n,o;return null==e&&(e=[]),e.push(this),n=this.getOpt("alias"),o=n?t+"-"+n+".atwho":t+".atwho",this.$inputor.trigger(o,e)},n.prototype.callbacks=function(t){return this.getOpt("callbacks")[t]||e[t]},n.prototype.getOpt=function(t,e){try{return this.setting[t]}catch(t){return null}},n.prototype.insertContentFor=function(e){var n,o;return o=this.getOpt("insertTpl"),n=t.extend({},e.data("item-data"),{"atwho-at":this.at}),this.callbacks("tplEval").call(this,o,n,"onInsert")},n.prototype.renderView=function(t){var e;return e=this.getOpt("searchKey"),t=this.callbacks("sorter").call(this,this.query.text,t.slice(0,1001),e),this.view.render(t.slice(0,this.getOpt("limit")))},n.arrayToDefaultHash=function(e){var n,o,i,a;if(!t.isArray(e))return e;for(a=[],n=0,i=e.length;i>n;n++)o=e[n],t.isPlainObject(o)?a.push(o):a.push({name:o});return a},n.prototype.lookUp=function(t){var e,n;if((!t||"click"!==t.type||this.getOpt("lookUpOnClick"))&&(!this.getOpt("suspendOnComposing")||!this.app.isComposing))return(e=this.catchQuery(t))?(this.app.setContextFor(this.at),(n=this.getOpt("delay"))?this._delayLookUp(e,n):this._lookUp(e),e):(this.expectedQueryCBId=null,e)},n.prototype._delayLookUp=function(t,e){var n,o;return n=Date.now?Date.now():(new Date).getTime(),this.previousCallTime||(this.previousCallTime=n),(o=e-(n-this.previousCallTime))>0&&e>o?(this.previousCallTime=n,this._stopDelayedCall(),this.delayedCallTimeout=setTimeout(function(e){return function(){return e.previousCallTime=0,e.delayedCallTimeout=null,e._lookUp(t)}}(this),e)):(this._stopDelayedCall(),this.previousCallTime!==n&&(this.previousCallTime=0),this._lookUp(t))},n.prototype._stopDelayedCall=function(){return this.delayedCallTimeout?(clearTimeout(this.delayedCallTimeout),this.delayedCallTimeout=null):void 0},n.prototype._generateQueryCBId=function(){return{}},n.prototype._lookUp=function(e){var n;return n=function(t,e){return t===this.expectedQueryCBId?e&&e.length>0?this.renderView(this.constructor.arrayToDefaultHash(e)):this.view.hide():void 0},this.expectedQueryCBId=this._generateQueryCBId(),this.model.query(e.text,t.proxy(n,this,this.expectedQueryCBId))},n}();var s,l=function(t,e){function n(){this.constructor=t}for(var o in e)c.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},c={}.hasOwnProperty;s=function(e){function n(){return n.__super__.constructor.apply(this,arguments)}return l(n,e),n.prototype.catchQuery=function(){var t,e,n,o,i,a,r;return e=this.$inputor.val(),t=this.$inputor.caret("pos",{iframe:this.app.iframe}),r=e.slice(0,t),i=this.callbacks("matcher").call(this,this.at,r,this.getOpt("startWithSpace"),this.getOpt("acceptSpaceBar")),(o="string"==typeof i)&&i.length<this.getOpt("minLen",0)?void 0:(o&&i.length<=this.getOpt("maxLen",20)?(a=t-i.length,n=a+i.length,this.pos=a,i={text:i,headPos:a,endPos:n},this.trigger("matched",[this.at,i.text])):(i=null,this.view.hide()),this.query=i)},n.prototype.rect=function(){var e,n,o;if(e=this.$inputor.caret("offset",this.pos-1,{iframe:this.app.iframe}))return this.app.iframe&&!this.app.iframeAsRoot&&(n=t(this.app.iframe).offset(),e.left+=n.left,e.top+=n.top),o=this.app.document.selection?0:2,{left:e.left,top:e.top,bottom:e.top+e.height+o}},n.prototype.insert=function(t,e){var n,o,i,a,r;return n=this.$inputor,o=n.val(),i=o.slice(0,Math.max(this.query.headPos-this.at.length,0)),a=""===(a=this.getOpt("suffix"))?a:a||" ",r=""+i+(t+=a)+o.slice(this.query.endPos||0),n.val(r),n.caret("pos",i.length+t.length,{iframe:this.app.iframe}),n.is(":focus")||n.focus(),n.change()},n}(i);var u,m,h,d,l=function(t,e){function n(){this.constructor=t}for(var o in e)c.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},c={}.hasOwnProperty;u=function(e){function o(){return o.__super__.constructor.apply(this,arguments)}return l(o,e),o.prototype._getRange=function(){var t;return(t=this.app.window.getSelection()).rangeCount>0?t.getRangeAt(0):void 0},o.prototype._setRange=function(e,n,o){return null==o&&(o=this._getRange()),o&&n?(n=t(n)[0],"after"===e?(o.setEndAfter(n),o.setStartAfter(n)):(o.setEndBefore(n),o.setStartBefore(n)),o.collapse(!1),this._clearRange(o)):void 0},o.prototype._clearRange=function(t){var e;return null==t&&(t=this._getRange()),e=this.app.window.getSelection(),null==this.ctrl_a_pressed?(e.removeAllRanges(),e.addRange(t)):void 0},o.prototype._movingEvent=function(t){var e;return"click"===t.type||(e=t.which)===n.RIGHT||e===n.LEFT||e===n.UP||e===n.DOWN},o.prototype._unwrap=function(e){var n;return e=t(e).unwrap().get(0),(n=e.nextSibling)&&n.nodeValue&&(e.nodeValue+=n.nodeValue,t(n).remove()),e},o.prototype.catchQuery=function(e){var o,i,a,r,s,l,c,u,m,h,d,p;if((p=this._getRange())&&p.collapsed){if(e.which===n.ENTER)return(i=t(p.startContainer).closest(".atwho-query")).contents().unwrap(),i.is(":empty")&&i.remove(),(i=t(".atwho-query",this.app.document)).text(i.text()).contents().last().unwrap(),void this._clearRange();if(/firefox/i.test(navigator.userAgent)){if(t(p.startContainer).is(this.$inputor))return void this._clearRange();e.which===n.BACKSPACE&&p.startContainer.nodeType===document.ELEMENT_NODE&&(m=p.startOffset-1)>=0?((a=p.cloneRange()).setStart(p.startContainer,m),t(a.cloneContents()).contents().last().is(".atwho-inserted")&&(s=t(p.startContainer).contents().get(m),this._setRange("after",t(s).contents().last()))):e.which===n.LEFT&&p.startContainer.nodeType===document.TEXT_NODE&&(o=t(p.startContainer.previousSibling)).is(".atwho-inserted")&&0===p.startOffset&&this._setRange("after",o.contents().last())}if(t(p.startContainer).closest(".atwho-inserted").addClass("atwho-query").siblings().removeClass("atwho-query"),(i=t(".atwho-query",this.app.document)).length>0&&i.is(":empty")&&0===i.text().length&&i.remove(),this._movingEvent(e)||i.removeClass("atwho-inserted"),i.length>0)switch(e.which){case n.LEFT:return this._setRange("before",i.get(0),p),void i.removeClass("atwho-query");case n.RIGHT:return this._setRange("after",i.get(0).nextSibling,p),void i.removeClass("atwho-query")}if(i.length>0&&(d=i.attr("data-atwho-at-query"))&&(i.empty().html(d).attr("data-atwho-at-query",null),this._setRange("after",i.get(0),p)),(a=p.cloneRange()).setStart(p.startContainer,0),u=this.callbacks("matcher").call(this,this.at,a.toString(),this.getOpt("startWithSpace"),this.getOpt("acceptSpaceBar")),l="string"==typeof u,0===i.length&&l&&(r=p.startOffset-this.at.length-u.length)>=0&&(p.setStart(p.startContainer,r),i=t("<span/>",this.app.document).attr(this.getOpt("editableAtwhoQueryAttrs")).addClass("atwho-query"),p.surroundContents(i.get(0)),(c=i.contents().last().get(0))&&(/firefox/i.test(navigator.userAgent)?(p.setStart(c,c.length),p.setEnd(c,c.length),this._clearRange(p)):this._setRange("after",c,p))),!(l&&u.length<this.getOpt("minLen",0)))return l&&u.length<=this.getOpt("maxLen",20)?(h={text:u,el:i},this.trigger("matched",[this.at,h.text]),this.query=h):(this.view.hide(),this.query={el:i},i.text().indexOf(this.at)>=0&&(this._movingEvent(e)&&i.hasClass("atwho-inserted")?i.removeClass("atwho-query"):!1!==this.callbacks("afterMatchFailed").call(this,this.at,i)&&this._setRange("after",this._unwrap(i.text(i.text()).contents().first()))),null)}},o.prototype.rect=function(){var e,n;return(n=this.query.el.offset())&&this.query.el[0].getClientRects().length?(this.app.iframe&&!this.app.iframeAsRoot&&(e=t(this.app.iframe).offset(),n.left+=e.left-this.$inputor.scrollLeft(),n.top+=e.top-this.$inputor.scrollTop()),n.bottom=n.top+this.query.el.height(),n):void 0},o.prototype.insert=function(t,e){var n,o,i,a,r;return this.$inputor.is(":focus")||this.$inputor.focus(),(o=this.getOpt("functionOverrides")).insert?o.insert.call(this,t,e):(a=""===(a=this.getOpt("suffix"))?a:a||" ",n=e.data("item-data"),this.query.el.removeClass("atwho-query").addClass("atwho-inserted").html(t).attr("data-atwho-at-query",""+n["atwho-at"]+this.query.text).attr("contenteditable","false"),(i=this._getRange())&&(this.query.el.length&&i.setEndAfter(this.query.el[0]),i.collapse(!1),i.insertNode(r=this.app.document.createTextNode(""+a)),this._setRange("after",r,i)),this.$inputor.is(":focus")||this.$inputor.focus(),this.$inputor.change())},o}(i),m=function(){function e(t){this.context=t,this.at=this.context.at,this.storage=this.context.$inputor}return e.prototype.destroy=function(){return this.storage.data(this.at,null)},e.prototype.saved=function(){return this.fetch()>0},e.prototype.query=function(t,e){var n,o,i;return o=this.fetch(),i=this.context.getOpt("searchKey"),o=this.context.callbacks("filter").call(this.context,t,o,i)||[],n=this.context.callbacks("remoteFilter"),o.length>0||!n&&0===o.length?e(o):n.call(this.context,t,e)},e.prototype.fetch=function(){return this.storage.data(this.at)||[]},e.prototype.save=function(t){return this.storage.data(this.at,this.context.callbacks("beforeSave").call(this.context,t||[]))},e.prototype.load=function(t){return!this.saved()&&t?this._load(t):void 0},e.prototype.reload=function(t){return this._load(t)},e.prototype._load=function(e){return"string"==typeof e?t.ajax(e,{dataType:"json"}).done(function(t){return function(e){return t.save(e)}}(this)):this.save(e)},e}(),h=function(){function e(e){this.context=e,this.$el=t("<div class='atwho-view'><ul class='atwho-view-ul'></ul></div>"),this.$elUl=this.$el.children(),this.timeoutID=null,this.context.$el.append(this.$el),this.bindEvent()}return e.prototype.init=function(){var t,e;return e=this.context.getOpt("alias")||this.context.at.charCodeAt(0),(t=this.context.getOpt("headerTpl"))&&1===this.$el.children().length&&this.$el.prepend(t),this.$el.attr({id:"at-view-"+e})},e.prototype.destroy=function(){return this.$el.remove()},e.prototype.bindEvent=function(){var e,n,o;return e=this.$el.find("ul"),n=0,o=0,e.on("mousemove.atwho-view","li",function(i){var a;if((n!==i.clientX||o!==i.clientY)&&(n=i.clientX,o=i.clientY,!(a=t(i.currentTarget)).hasClass("cur")))return e.find(".cur").removeClass("cur"),a.addClass("cur")}).on("click.atwho-view","li",function(n){return function(o){return e.find(".cur").removeClass("cur"),t(o.currentTarget).addClass("cur"),n.choose(o),o.preventDefault()}}(this))},e.prototype.visible=function(){return t.expr.filters.visible(this.$el[0])},e.prototype.highlighted=function(){return this.$el.find(".cur").length>0},e.prototype.choose=function(t){var e,n;return(e=this.$el.find(".cur")).length&&(n=this.context.insertContentFor(e),this.context._stopDelayedCall(),this.context.insert(this.context.callbacks("beforeInsert").call(this.context,n,e,t),e),this.context.trigger("inserted",[e,t]),this.hide(t)),this.context.getOpt("hideWithoutSuffix")?this.stopShowing=!0:void 0},e.prototype.reposition=function(e){var n,o,i,a;return n=this.context.app.iframeAsRoot?this.context.app.window:window,e.bottom+this.$el.height()-t(n).scrollTop()>t(n).height()&&(e.bottom=e.top-this.$el.height()),e.left>(i=t(n).width()-this.$el.width()-5)&&(e.left=i),o={left:e.left,top:e.bottom},null!=(a=this.context.callbacks("beforeReposition"))&&a.call(this.context,o),this.$el.offset(o),this.context.trigger("reposition",[o])},e.prototype.next=function(){var t,e,n,o;return t=this.$el.find(".cur").removeClass("cur"),(e=t.next()).length||(e=this.$el.find("li:first")),e.addClass("cur"),n=e[0],o=n.offsetTop+n.offsetHeight+(n.nextSibling?n.nextSibling.offsetHeight:0),this.scrollTop(Math.max(0,o-this.$el.height()))},e.prototype.prev=function(){var t,e,n,o;return t=this.$el.find(".cur").removeClass("cur"),(n=t.prev()).length||(n=this.$el.find("li:last")),n.addClass("cur"),o=n[0],e=o.offsetTop+o.offsetHeight+(o.nextSibling?o.nextSibling.offsetHeight:0),this.scrollTop(Math.max(0,e-this.$el.height()))},e.prototype.scrollTop=function(t){var e;return(e=this.context.getOpt("scrollDuration"))?this.$elUl.animate({scrollTop:t},e):this.$elUl.scrollTop(t)},e.prototype.show=function(){var t;return this.stopShowing?void(this.stopShowing=!1):(this.visible()||(this.$el.show(),this.$el.scrollTop(0),this.context.trigger("shown")),(t=this.context.rect())?this.reposition(t):void 0)},e.prototype.hide=function(t,e){var n;if(this.visible())return isNaN(e)?(this.$el.hide(),this.context.trigger("hidden",[t])):(n=function(t){return function(){return t.hide()}}(this),clearTimeout(this.timeoutID),this.timeoutID=setTimeout(n,e))},e.prototype.render=function(e){var n,o,i,a,r,s,l;if(t.isArray(e)&&e.length>0){for(this.$el.find("ul").empty(),o=this.$el.find("ul"),l=this.context.getOpt("displayTpl"),i=0,r=e.length;r>i;i++)a=e[i],a=t.extend({},a,{"atwho-at":this.context.at}),s=this.context.callbacks("tplEval").call(this.context,l,a,"onDisplay"),(n=t(this.context.callbacks("highlighter").call(this.context,s,this.context.query.text))).data("item-data",a),o.append(n);return this.show(),this.context.getOpt("highlightFirst")?o.find("li:first").addClass("cur"):void 0}this.hide()},e}(),d={load:function(t,e){var n;return(n=this.controller(t))?n.model.load(e):void 0},isSelecting:function(){var t;return!!(null!=(t=this.controller())?t.view.visible():void 0)},hide:function(){var t;return null!=(t=this.controller())?t.view.hide():void 0},reposition:function(){var t;return(t=this.controller())?t.view.reposition(t.rect()):void 0},setIframe:function(t,e){return this.setupRootElement(t,e),null},run:function(){return this.dispatch()},destroy:function(){return this.shutdown(),this.$inputor.data("atwho",null)}},t.fn.atwho=function(e){var n,i;return n=arguments,i=null,this.filter('textarea, input, [contenteditable=""], [contenteditable=true]').each(function(){var r,s;return(s=(r=t(this)).data("atwho"))||r.data("atwho",s=new o(this)),"object"!=a(e)&&e?d[e]&&s?i=d[e].apply(s,Array.prototype.slice.call(n,1)):t.error("Method "+e+" does not exist on jQuery.atwho"):s.reg(e.at,e)}),null!=i?i:this},t.fn.atwho.default={at:void 0,alias:void 0,data:null,displayTpl:"<li>${name}</li>",insertTpl:"${atwho-at}${name}",headerTpl:null,callbacks:e,functionOverrides:{},searchKey:"name",suffix:void 0,hideWithoutSuffix:!1,startWithSpace:!0,acceptSpaceBar:!1,highlightFirst:!0,limit:5,maxLen:20,minLen:0,displayTimeout:300,delay:null,spaceSelectsMatch:!1,tabSelectsMatch:!0,editableAtwhoQueryAttrs:{},scrollDuration:150,suspendOnComposing:!0,lookUpOnClick:!0},t.fn.atwho.debug=!1}(t)}.apply(e,o))||(t.exports=i)},function(t,e,n){var o=n(17);"string"==typeof o&&(o=[[t.i,o,""]]);var i={hmr:!0,transform:void 0,insertInto:void 0};n(2)(o,i);o.locals&&(t.exports=o.locals)},function(t,e,n){(t.exports=n(1)(!1)).push([t.i,"/**\n * based upon apps/comments/js/vendor/At.js/dist/css/jquery.atwho.css,\n * only changed colors and font-weight\n */\n.atwho-view {\n position: absolute;\n top: 0;\n left: 0;\n display: none;\n margin-top: 18px;\n background: var(--color-main-background);\n color: var(--color-main-text);\n border: 1px solid var(--color-border);\n border-radius: var(--border-radius);\n box-shadow: 0 0 5px var(--color-box-shadow);\n min-width: 120px;\n z-index: 11110 !important; }\n\n.atwho-view .atwho-header {\n padding: 5px;\n margin: 5px;\n cursor: pointer;\n border-bottom: solid 1px var(--color-border);\n color: var(--color-main-text);\n font-size: 11px;\n font-weight: bold; }\n\n.atwho-view .atwho-header .small {\n color: var(--color-main-text);\n float: right;\n padding-top: 2px;\n margin-right: -5px;\n font-size: 12px;\n font-weight: normal; }\n\n.atwho-view .atwho-header:hover {\n cursor: default; }\n\n.atwho-view .cur {\n background: var(--color-primary);\n color: var(--color-primary-text); }\n\n.atwho-view .cur small {\n color: var(--color-primary-text); }\n\n.atwho-view strong {\n color: var(--color-main-text);\n font-weight: normal; }\n\n.atwho-view .cur strong {\n color: var(--color-primary-text);\n font-weight: normal; }\n\n.atwho-view ul {\n /* width: 100px; */\n list-style: none;\n padding: 0;\n margin: auto;\n max-height: 200px;\n overflow-y: auto; }\n\n.atwho-view ul li {\n display: block;\n padding: 5px 10px;\n border-bottom: 1px solid var(--color-border);\n cursor: pointer; }\n\n.atwho-view small {\n font-size: smaller;\n color: var(--color-main-text);\n font-weight: normal; }\n",""])},function(t,e){t.exports=function(t){var e="undefined"!=typeof window&&window.location;if(!e)throw new Error("fixUrls requires window.location");if(!t||"string"!=typeof t)return t;var n=e.protocol+"//"+e.host,o=n+e.pathname.replace(/\/[^\/]*$/,"/");return t.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(t,e){var i,a=e.trim().replace(/^"(.*)"$/,function(t,e){return e}).replace(/^'(.*)'$/,function(t,e){return e});return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(a)?t:(i=0===a.indexOf("//")?a:0===a.indexOf("/")?n+a:o+a.replace(/^\.\//,""),"url("+JSON.stringify(i)+")")})}},function(t,e,n){var o=n(20);"string"==typeof o&&(o=[[t.i,o,""]]);var i={hmr:!0,transform:void 0,insertInto:void 0};n(2)(o,i);o.locals&&(t.exports=o.locals)},function(t,e,n){(t.exports=n(1)(!1)).push([t.i,"/*\n * Copyright (c) 2016\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n#commentsTabView .emptycontent {\n margin-top: 0; }\n\n#commentsTabView .newCommentForm {\n margin-left: 36px;\n position: relative; }\n\n#commentsTabView .newCommentForm .message {\n width: 100%;\n padding: 10px;\n min-height: 44px;\n margin: 0;\n /* Prevent the text from overlapping with the submit button. */\n padding-right: 30px; }\n\n#commentsTabView .newCommentForm .submit,\n#commentsTabView .newCommentForm .submitLoading {\n width: 44px;\n height: 44px;\n margin: 0;\n padding: 13px;\n background-color: transparent;\n border: none;\n opacity: .3;\n position: absolute;\n bottom: 0;\n right: 0; }\n\n#commentsTabView .deleteLoading {\n padding: 14px;\n vertical-align: middle; }\n\n#commentsTabView .newCommentForm .submit:not(:disabled):hover,\n#commentsTabView .newCommentForm .submit:not(:disabled):focus {\n opacity: 1; }\n\n#commentsTabView .newCommentForm div.message {\n resize: none; }\n\n#commentsTabView .newCommentForm div.message:empty:before {\n content: attr(data-placeholder);\n color: grey; }\n\n#commentsTabView .comment {\n position: relative;\n /** padding bottom is little more so that the top and bottom gap look uniform **/\n padding: 10px 0 15px; }\n\n#commentsTabView .comments .comment {\n border-top: 1px solid var(--color-border); }\n\n#commentsTabView .comment .avatar,\n.atwho-view-ul * .avatar {\n width: 32px;\n height: 32px;\n line-height: 32px;\n margin-right: 5px; }\n\n#commentsTabView .comment .message .avatar,\n.atwho-view-ul * .avatar {\n display: inline-block; }\n\n#activityTabView li.comment.collapsed .activitymessage,\n#commentsTabView .comment.collapsed .message {\n white-space: pre-wrap; }\n\n#activityTabView li.comment.collapsed .activitymessage,\n#commentsTabView .comment.collapsed .message {\n max-height: 70px;\n overflow: hidden; }\n\n#activityTabView li.comment .message-overlay,\n#commentsTabView .comment .message-overlay {\n display: none; }\n\n#activityTabView li.comment.collapsed .message-overlay,\n#commentsTabView .comment.collapsed .message-overlay {\n display: block;\n position: absolute;\n z-index: 2;\n height: 50px;\n pointer-events: none;\n left: 0;\n right: 0;\n bottom: 0;\n background: -moz-linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));\n background: -webkit-linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));\n background: -o-linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));\n background: -ms-linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));\n background: linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));\n background-repeat: no-repeat; }\n\n#commentsTabView .hidden {\n display: none !important; }\n\n/** set min-height as 44px to ensure that it fits the button sizes. **/\n#commentsTabView .comment .authorRow {\n min-height: 44px; }\n\n#commentsTabView .comment .authorRow .tooltip {\n /** because of the padding on the element, the tooltip appear too far up,\n\t adding this brings them closer to the element**/\n margin-top: 5px; }\n\n.atwho-view-ul * .avatar-name-wrapper,\n#commentsTabView .comment .authorRow {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 100%; }\n\n#commentsTabView .comment:not(.newCommentRow) .message .avatar-name-wrapper:not(.currentUser),\n#commentsTabView .comment:not(.newCommentRow) .message .avatar-name-wrapper:not(.currentUser) .avatar,\n#commentsTabView .comment:not(.newCommentRow) .message .avatar-name-wrapper:not(.currentUser) .avatar img,\n#commentsTabView .comment .authorRow .avatar:not(.currentUser),\n#commentsTabView .comment .authorRow .author:not(.currentUser) {\n cursor: pointer; }\n\n.atwho-view-ul .avatar-name-wrapper,\n.atwho-view-ul .avatar-name-wrapper .avatar,\n.atwho-view-ul .avatar-name-wrapper .avatar img {\n cursor: pointer; }\n\n#commentsTabView .comments li .message .atwho-inserted .avatar-name-wrapper,\n#commentsTabView .newCommentForm .atwho-inserted .avatar-name-wrapper {\n /* Make the wrapper the positioning context of its child contacts\n\t\t * menu. */\n position: relative;\n display: inline;\n vertical-align: top;\n background-color: var(--color-background-dark);\n border-radius: 50vh;\n padding: 1px 7px 1px 1px;\n /* Ensure that the avatar and the user name will be kept together. */\n white-space: nowrap; }\n #commentsTabView .comments li .message .atwho-inserted .avatar-name-wrapper .avatar,\n #commentsTabView .newCommentForm .atwho-inserted .avatar-name-wrapper .avatar {\n height: 16px;\n width: 16px;\n vertical-align: middle;\n padding: 1px;\n margin-top: -3px;\n margin-left: 0;\n margin-right: 2px; }\n #commentsTabView .comments li .message .atwho-inserted .avatar-name-wrapper .avatar img,\n #commentsTabView .newCommentForm .atwho-inserted .avatar-name-wrapper .avatar img {\n vertical-align: top; }\n #commentsTabView .comments li .message .atwho-inserted .avatar-name-wrapper strong,\n #commentsTabView .newCommentForm .atwho-inserted .avatar-name-wrapper strong {\n /* Ensure that the user name is shown in bold, as different browsers\n\t\t\t * use different font weights for strong elements. */\n font-weight: bold; }\n\n#commentsTabView .comments li .message .atwho-inserted .avatar-name-wrapper.currentUser,\n#commentsTabView .newCommentForm .atwho-inserted .avatar-name-wrapper.currentUser {\n background-color: var(--color-primary);\n color: var(--color-primary-text); }\n\n.atwho-view-ul * .avatar-name-wrapper {\n white-space: nowrap; }\n\n#commentsTabView .comment .author,\n#commentsTabView .comment .date {\n opacity: .5; }\n\n#commentsTabView .comment .author {\n max-width: 210px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap; }\n\n#commentsTabView .comment .date {\n margin-left: auto;\n /** this is to fix the tooltip being too close due to the margin-top applied\n\t to bring the tooltip closer for the action icons **/\n padding: 10px 0px; }\n\n#commentsTabView .comments > li:not(.newCommentRow) .message {\n padding-left: 40px;\n word-wrap: break-word;\n overflow-wrap: break-word; }\n\n#commentsTabView .comment .action {\n opacity: 0.3;\n padding: 14px;\n display: block; }\n\n#commentsTabView .comment .action:hover,\n#commentsTabView .comment .action:focus {\n opacity: 1; }\n\n#commentsTabView .newCommentRow .action-container {\n margin-left: auto; }\n\n#commentsTabView .comment.disabled .message {\n opacity: 0.3; }\n\n#commentsTabView .comment.disabled .action {\n display: none; }\n\n#commentsTabView .message.error {\n color: #e9322d;\n border-color: #e9322d;\n box-shadow: 0 0 6px #f8b9b7; }\n\n.app-files .action-comment {\n padding: 16px 14px; }\n\n#commentsTabView .comment .message .contactsmenu-popover {\n left: -6px;\n top: 24px; }\n",""])}]);
+//# sourceMappingURL=comments.js.map \ No newline at end of file
diff --git a/apps/comments/js/comments.js.map b/apps/comments/js/comments.js.map
new file mode 100644
index 00000000000..919d91a14bb
--- /dev/null
+++ b/apps/comments/js/comments.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"jQuery\"","webpack:///./node_modules/css-loader/dist/runtime/api.js","webpack:///./node_modules/style-loader/lib/addStyles.js","webpack:///./apps/comments/src/comments.js","webpack:///./apps/comments/src/app.js","webpack:///./apps/comments/src/templates.js","webpack:///./apps/comments/src/commentmodel.js","webpack:///./apps/comments/src/commentcollection.js","webpack:///./apps/comments/src/commentsummarymodel.js","webpack:///./apps/comments/src/commentstabview.js","webpack:///./apps/comments/src/commentsmodifymenu.js","webpack:///./apps/comments/src/filesplugin.js","webpack:///./apps/comments/src/activitytabviewplugin.js","webpack:///./apps/comments/src/search.js","webpack:///./apps/comments/src/vendor/Caret.js/dist/jquery.caret.min.js","webpack:///./apps/comments/src/vendor/At.js/dist/js/jquery.atwho.min.js","webpack:///./apps/comments/src/style/autocomplete.scss?dc09","webpack:///./apps/comments/src/style/autocomplete.scss","webpack:///./node_modules/style-loader/lib/urls.js","webpack:///./apps/comments/src/style/comments.scss?1960","webpack:///./apps/comments/src/style/comments.scss"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","jQuery","useSourceMap","list","toString","this","map","item","content","cssMapping","btoa","sourceMapping","sourceMap","unescape","encodeURIComponent","JSON","stringify","sourceURLs","sources","source","sourceRoot","concat","join","cssWithMappingToString","mediaQuery","alreadyImportedModules","length","id","push","fn","memo","stylesInDom","isOldIE","window","document","all","atob","apply","arguments","getElement","target","parent","styleTarget","querySelector","HTMLIFrameElement","contentDocument","head","e","singleton","singletonCounter","stylesInsertedAtTop","fixUrls","addStylesToDom","styles","options","domStyle","refs","j","parts","addStyle","listToStyles","newStyles","base","part","css","media","insertStyleElement","style","insertInto","Error","lastStyleElementInsertedAtTop","insertAt","nextSibling","insertBefore","appendChild","firstChild","before","removeStyleElement","parentNode","removeChild","idx","indexOf","splice","createStyleElement","createElement","undefined","attrs","type","nonce","nc","getNonce","addAttrs","el","keys","forEach","setAttribute","obj","update","remove","result","transform","default","styleIndex","applyToSingletonTag","URL","createObjectURL","revokeObjectURL","Blob","link","rel","createLinkElement","autoFixUrls","convertToAbsoluteUrls","blob","oldSrc","href","styleSheet","cssText","createTextNode","newObj","DEBUG","newList","mayRemove","textStore","replaceText","index","replacement","filter","Boolean","cssNode","childNodes","__webpack_exports__","OCA","Comments","template","templates","Handlebars","Templates","1","container","depth0","helpers","partials","data","3","5","7","helper","escapeExpression","actorId","helperMissing","nullContext","hash","9","11","compiler","main","stack1","alias1","alias2","alias3","alias4","isUnread","program","inverse","noop","isLong","_typeof","isUserAuthor","actorDisplayName","timestamp","altDate","date","formattedMessage","useData","iconClass","displayName","2","4","each","items","cancelText","tag","isEditMode","newMessagePlaceholder","message","submitText","countMessage","iconUrl","emptyResultLabel","moreLabel","OC","_","extend","Files","Client","PROPERTY_FILEID","NS_OWNCLOUD","PROPERTY_MESSAGE","PROPERTY_ACTORTYPE","PROPERTY_ACTORID","PROPERTY_ISUNREAD","PROPERTY_OBJECTID","PROPERTY_OBJECTTYPE","PROPERTY_ACTORDISPLAYNAME","PROPERTY_CREATIONDATETIME","PROPERTY_MENTIONS","CommentModel","Backbone","Model","sync","davSync","defaults","actorType","objectType","davProperties","creationDateTime","objectId","mentions","parse","_parseMentions","isUndefined","mention","localName","child","startsWith","textContent","CommentCollection","Collection","model","_objectType","_objectId","_endReached","_limit","initialize","models","url","linkToRemote","setObjectId","hasMoreResults","reset","_summaryModel","fetchNext","self","body","success","resp","initial","set","trigger","getSummaryModel","CommentSummaryModel","updateReadMarker","save","readMarker","Date","toUTCString","PROPERTY_READMARKER","CommentsTabView","DetailTabView","className","_autoCompleteData","_commentsModifyMenu","events","submit .newCommentForm","click .showMore","click .cancel","click .comment","keyup div.message","change div.message","input div.message","paste div.message","_commentMaxLength","collection","on","_onRequest","_onEndRequest","_onAddModel","_onChangeModel","_commentMaxThreshold","bindAll","params","currentUser","getCurrentUser","uid","editCommentTemplate","commentTemplate","editTooltip","_isLong","getLabel","getIcon","setFileInfo","fileInfo","render","_initAutoComplete","$","find","silent","nextPage","$el","html","tooltip","$container","avatar","delegateEvents","_onTypeComment","autosize","focus","$target","limit","appConfig","comments","maxAutoCompleteResults","atwho","at","callbacks","remoteFilter","_onAutoComplete","highlighter","li","$li","sorter","q","displayTpl","escapeHTML","label","insertTpl","searchKey","je","_postRenderItem","query","callback","_autoCompleteRequestTimer","clearTimeout","delay","_autoCompleteRequestCall","abort","ajax","linkToOCS","search","itemType","itemId","beforeSend","request","setRequestHeader","ocs","_formatItem","commentModel","getTime","Util","relativeModifiedDate","formatDate","_formatMessage","attributes","_toggleLoading","state","_loading","toggleClass","addClass","fileInfoModel","findWhere","$comment","eq","append","text","prop","oldMentions","fetch","isEqual","$updated","trim","previous","$row","closest","removeClass","$message","editionMode","inlineAvatars","context","hasClass","$this","attr","username","oc_current_user","contactsMenu","modifyCommentMenu","CommentsModifyMenu","show","listenTo","ev","action","_onClickEditComment","_onClickDeleteComment","_postRenderMessage","user","editMode","replace","mentionId","escape","regex","RegExp","_composeHTMLMention","mentionDisplayName","match","p1","OCP","plainToRich","preventDefault","commentId","commentToEdit","$formRow","after","replaceWith","clone","$field","len","$submitButton","count","max","limitExceeded","keyCode","shiftKey","click","_onClickComment","is","_onClickCloseComment","$loading","$moreIcon","destroy","error","Notification","showTemporary","_onClickShowMore","_onSubmitSuccess","$form","$submit","_commentBodyHTML2Plain","oldHtml","$inserted","userId","richToPlain","_onSubmitComment","$commentField","_onSubmitError","verb","wait","_onTextChange","empty","_onPaste","originalEvent","clipboardData","getData","execCommand","View","tagName","_scopes","click a.action","_onClickAction","event","currentTarget","hideMenus","_context","active","offsetIcon","offset","offsetContainer","position","top","left","right","width","showMenu","PROPERTY_COMMENTS_UNREAD","FilesPlugin","ignoreLists","_formatCommentCount","imagePath","attach","fileList","registerTabView","oldGetWebdavProperties","_getWebdavProperties","props","filesClient","addFileInfoParser","response","commentsUnread","propStat","properties","parseInt","oldCreateRow","_createRow","fileData","$tr","fileActions","registerAction","mime","permissions","PERMISSION_READ","FileActions","TYPE_INLINE","actionSpec","isDefault","unreadComments","$file","$actionLink","actionHandler","fileName","showDetailsView","oldElementToFile","elementToFile","Plugins","register","ActivityTabViewPlugin","prepareModelForDisplay","view","$overlay","_onClickCollapsedComment","Comment","fileAppLoaded","App","renderCommentResult","$nofilterresults","updateLegacyMimetype","$pathDiv","path","$avatar","authorName","authorId","comment","prepend","dir","dirname","generateUrl","scrollto","handleCommentClick","changeDirectory","scrollTo","mime_type","setFileList","setRenderer","setHandler","Search","a","define","__WEBPACK_AMD_DEFINE_RESULT__","returnExportsGlobal","b","g","h","$inputor","domInputor","setPos","getIEPosition","getPosition","getOffset","getOldIEPos","selection","createRange","createTextRange","moveToElementText","setEndPoint","getPos","range","cloneRange","selectNodeContents","setEnd","endContainer","endOffset","detach","getOldIEOffset","duplicate","moveStart","height","getBoundingClientRect","bottom","f","getSelection","setStart","insertNode","selectNode","scrollTop","scrollLeft","rangeCount","getRangeAt","getIEPos","parentElement","moveToBookmark","getBookmark","collapse","compareEndPoints","selectionStart","move","select","setSelectionRange","getIEOffset","boundingLeft","boundingTop","boundingHeight","test","navigator","userAgent","val","slice","rect","css_attr","mirrorCss","zIndex","$mirror","contentEditable","pos","iframe","contentWindow","caret","isPlainObject","EditableCaret","InputCaret","Utils","apis","__WEBPACK_AMD_DEFINE_ARRAY__","ESC","TAB","ENTER","CTRL","A","P","N","LEFT","UP","RIGHT","DOWN","BACKSPACE","SPACE","beforeSave","arrayToDefaultHash","matcher","decodeURI","exec","String","toLowerCase","atwho_order","sort","tplEval","beforeInsert","beforeReposition","afterMatchFailed","currentFlag","controllers","aliasMaps","setupRootElement","listen","createContainer","ownerDocument","defaultView","parentWindow","frameElement","debug","iframeAsRoot","controller","setContextFor","reg","alias","init","hide","isComposing","setTimeout","dispatch","onKeyup","onKeydown","expectedQueryCBId","getOpt","shutdown","off","lookUp","ctrlKey","visible","prev","next","highlighted","choose","app","setting","u","Math","random","substr","reload","callDefault","insertContentFor","atwho-at","renderView","isArray","catchQuery","_delayLookUp","_lookUp","now","previousCallTime","_stopDelayedCall","delayedCallTimeout","_generateQueryCBId","constructor","proxy","__super__","headPos","endPos","insert","change","_getRange","_setRange","setEndAfter","setStartAfter","setEndBefore","setStartBefore","_clearRange","ctrl_a_pressed","removeAllRanges","addRange","_movingEvent","which","_unwrap","unwrap","nodeValue","collapsed","startContainer","contents","last","nodeType","ELEMENT_NODE","startOffset","cloneContents","TEXT_NODE","previousSibling","siblings","surroundContents","first","getClientRects","storage","saved","load","_load","dataType","done","$elUl","children","timeoutID","bindEvent","charCodeAt","clientX","clientY","expr","filters","stopShowing","reposition","offsetTop","offsetHeight","animate","isNaN","isSelecting","setIframe","run","Array","headerTpl","functionOverrides","suffix","hideWithoutSuffix","startWithSpace","acceptSpaceBar","highlightFirst","maxLen","minLen","displayTimeout","spaceSelectsMatch","tabSelectsMatch","editableAtwhoQueryAttrs","scrollDuration","suspendOnComposing","lookUpOnClick","hmr","locals","location","baseUrl","protocol","host","currentDir","pathname","fullMatch","origUrl","newUrl","unquotedOrigUrl","$1"],"mappings":"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","file":"comments.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/js/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 3);\n","module.exports = jQuery;","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function (useSourceMap) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item, useSourceMap);\n\n if (item[2]) {\n return '@media ' + item[2] + '{' + content + '}';\n } else {\n return content;\n }\n }).join('');\n }; // import a list of modules into the list\n\n\n list.i = function (modules, mediaQuery) {\n if (typeof modules === 'string') {\n modules = [[null, modules, '']];\n }\n\n var alreadyImportedModules = {};\n\n for (var i = 0; i < this.length; i++) {\n var id = this[i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n\n for (i = 0; i < modules.length; i++) {\n var item = modules[i]; // skip already imported module\n // this implementation is not 100% perfect for weird media query combinations\n // when a module is imported multiple times with different media queries.\n // I hope this will never occur (Hey this way we have smaller bundles)\n\n if (item[0] == null || !alreadyImportedModules[item[0]]) {\n if (mediaQuery && !item[2]) {\n item[2] = mediaQuery;\n } else if (mediaQuery) {\n item[2] = '(' + item[2] + ') and (' + mediaQuery + ')';\n }\n\n list.push(item);\n }\n }\n };\n\n return list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n var content = item[1] || '';\n var cssMapping = item[3];\n\n if (!cssMapping) {\n return content;\n }\n\n if (useSourceMap && typeof btoa === 'function') {\n var sourceMapping = toComment(cssMapping);\n var sourceURLs = cssMapping.sources.map(function (source) {\n return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */';\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n }\n\n return [content].join('\\n');\n} // Adapted from convert-source-map (MIT)\n\n\nfunction toComment(sourceMap) {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n return '/*# ' + data + ' */';\n}","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n\nvar stylesInDom = {};\n\nvar\tmemoize = function (fn) {\n\tvar memo;\n\n\treturn function () {\n\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\n\t\treturn memo;\n\t};\n};\n\nvar isOldIE = memoize(function () {\n\t// Test for IE <= 9 as proposed by Browserhacks\n\t// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n\t// Tests for existence of standard globals is to allow style-loader\n\t// to operate correctly into non-standard environments\n\t// @see https://github.com/webpack-contrib/style-loader/issues/177\n\treturn window && document && document.all && !window.atob;\n});\n\nvar getTarget = function (target, parent) {\n if (parent){\n return parent.querySelector(target);\n }\n return document.querySelector(target);\n};\n\nvar getElement = (function (fn) {\n\tvar memo = {};\n\n\treturn function(target, parent) {\n // If passing function in options, then use it for resolve \"head\" element.\n // Useful for Shadow Root style i.e\n // {\n // insertInto: function () { return document.querySelector(\"#foo\").shadowRoot }\n // }\n if (typeof target === 'function') {\n return target();\n }\n if (typeof memo[target] === \"undefined\") {\n\t\t\tvar styleTarget = getTarget.call(this, target, parent);\n\t\t\t// Special case to return head of iframe instead of iframe itself\n\t\t\tif (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n\t\t\t\ttry {\n\t\t\t\t\t// This will throw an exception if access to iframe is blocked\n\t\t\t\t\t// due to cross-origin restrictions\n\t\t\t\t\tstyleTarget = styleTarget.contentDocument.head;\n\t\t\t\t} catch(e) {\n\t\t\t\t\tstyleTarget = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmemo[target] = styleTarget;\n\t\t}\n\t\treturn memo[target]\n\t};\n})();\n\nvar singleton = null;\nvar\tsingletonCounter = 0;\nvar\tstylesInsertedAtTop = [];\n\nvar\tfixUrls = require(\"./urls\");\n\nmodule.exports = function(list, options) {\n\tif (typeof DEBUG !== \"undefined\" && DEBUG) {\n\t\tif (typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n\t}\n\n\toptions = options || {};\n\n\toptions.attrs = typeof options.attrs === \"object\" ? options.attrs : {};\n\n\t// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n\t// tags it will allow on a page\n\tif (!options.singleton && typeof options.singleton !== \"boolean\") options.singleton = isOldIE();\n\n\t// By default, add <style> tags to the <head> element\n if (!options.insertInto) options.insertInto = \"head\";\n\n\t// By default, add <style> tags to the bottom of the target\n\tif (!options.insertAt) options.insertAt = \"bottom\";\n\n\tvar styles = listToStyles(list, options);\n\n\taddStylesToDom(styles, options);\n\n\treturn function update (newList) {\n\t\tvar mayRemove = [];\n\n\t\tfor (var i = 0; i < styles.length; i++) {\n\t\t\tvar item = styles[i];\n\t\t\tvar domStyle = stylesInDom[item.id];\n\n\t\t\tdomStyle.refs--;\n\t\t\tmayRemove.push(domStyle);\n\t\t}\n\n\t\tif(newList) {\n\t\t\tvar newStyles = listToStyles(newList, options);\n\t\t\taddStylesToDom(newStyles, options);\n\t\t}\n\n\t\tfor (var i = 0; i < mayRemove.length; i++) {\n\t\t\tvar domStyle = mayRemove[i];\n\n\t\t\tif(domStyle.refs === 0) {\n\t\t\t\tfor (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j]();\n\n\t\t\t\tdelete stylesInDom[domStyle.id];\n\t\t\t}\n\t\t}\n\t};\n};\n\nfunction addStylesToDom (styles, options) {\n\tfor (var i = 0; i < styles.length; i++) {\n\t\tvar item = styles[i];\n\t\tvar domStyle = stylesInDom[item.id];\n\n\t\tif(domStyle) {\n\t\t\tdomStyle.refs++;\n\n\t\t\tfor(var j = 0; j < domStyle.parts.length; j++) {\n\t\t\t\tdomStyle.parts[j](item.parts[j]);\n\t\t\t}\n\n\t\t\tfor(; j < item.parts.length; j++) {\n\t\t\t\tdomStyle.parts.push(addStyle(item.parts[j], options));\n\t\t\t}\n\t\t} else {\n\t\t\tvar parts = [];\n\n\t\t\tfor(var j = 0; j < item.parts.length; j++) {\n\t\t\t\tparts.push(addStyle(item.parts[j], options));\n\t\t\t}\n\n\t\t\tstylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};\n\t\t}\n\t}\n}\n\nfunction listToStyles (list, options) {\n\tvar styles = [];\n\tvar newStyles = {};\n\n\tfor (var i = 0; i < list.length; i++) {\n\t\tvar item = list[i];\n\t\tvar id = options.base ? item[0] + options.base : item[0];\n\t\tvar css = item[1];\n\t\tvar media = item[2];\n\t\tvar sourceMap = item[3];\n\t\tvar part = {css: css, media: media, sourceMap: sourceMap};\n\n\t\tif(!newStyles[id]) styles.push(newStyles[id] = {id: id, parts: [part]});\n\t\telse newStyles[id].parts.push(part);\n\t}\n\n\treturn styles;\n}\n\nfunction insertStyleElement (options, style) {\n\tvar target = getElement(options.insertInto)\n\n\tif (!target) {\n\t\tthrow new Error(\"Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.\");\n\t}\n\n\tvar lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1];\n\n\tif (options.insertAt === \"top\") {\n\t\tif (!lastStyleElementInsertedAtTop) {\n\t\t\ttarget.insertBefore(style, target.firstChild);\n\t\t} else if (lastStyleElementInsertedAtTop.nextSibling) {\n\t\t\ttarget.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling);\n\t\t} else {\n\t\t\ttarget.appendChild(style);\n\t\t}\n\t\tstylesInsertedAtTop.push(style);\n\t} else if (options.insertAt === \"bottom\") {\n\t\ttarget.appendChild(style);\n\t} else if (typeof options.insertAt === \"object\" && options.insertAt.before) {\n\t\tvar nextSibling = getElement(options.insertAt.before, target);\n\t\ttarget.insertBefore(style, nextSibling);\n\t} else {\n\t\tthrow new Error(\"[Style Loader]\\n\\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\\n Must be 'top', 'bottom', or Object.\\n (https://github.com/webpack-contrib/style-loader#insertat)\\n\");\n\t}\n}\n\nfunction removeStyleElement (style) {\n\tif (style.parentNode === null) return false;\n\tstyle.parentNode.removeChild(style);\n\n\tvar idx = stylesInsertedAtTop.indexOf(style);\n\tif(idx >= 0) {\n\t\tstylesInsertedAtTop.splice(idx, 1);\n\t}\n}\n\nfunction createStyleElement (options) {\n\tvar style = document.createElement(\"style\");\n\n\tif(options.attrs.type === undefined) {\n\t\toptions.attrs.type = \"text/css\";\n\t}\n\n\tif(options.attrs.nonce === undefined) {\n\t\tvar nonce = getNonce();\n\t\tif (nonce) {\n\t\t\toptions.attrs.nonce = nonce;\n\t\t}\n\t}\n\n\taddAttrs(style, options.attrs);\n\tinsertStyleElement(options, style);\n\n\treturn style;\n}\n\nfunction createLinkElement (options) {\n\tvar link = document.createElement(\"link\");\n\n\tif(options.attrs.type === undefined) {\n\t\toptions.attrs.type = \"text/css\";\n\t}\n\toptions.attrs.rel = \"stylesheet\";\n\n\taddAttrs(link, options.attrs);\n\tinsertStyleElement(options, link);\n\n\treturn link;\n}\n\nfunction addAttrs (el, attrs) {\n\tObject.keys(attrs).forEach(function (key) {\n\t\tel.setAttribute(key, attrs[key]);\n\t});\n}\n\nfunction getNonce() {\n\tif (typeof __webpack_nonce__ === 'undefined') {\n\t\treturn null;\n\t}\n\n\treturn __webpack_nonce__;\n}\n\nfunction addStyle (obj, options) {\n\tvar style, update, remove, result;\n\n\t// If a transform function was defined, run it on the css\n\tif (options.transform && obj.css) {\n\t result = typeof options.transform === 'function'\n\t\t ? options.transform(obj.css) \n\t\t : options.transform.default(obj.css);\n\n\t if (result) {\n\t \t// If transform returns a value, use that instead of the original css.\n\t \t// This allows running runtime transformations on the css.\n\t \tobj.css = result;\n\t } else {\n\t \t// If the transform function returns a falsy value, don't add this css.\n\t \t// This allows conditional loading of css\n\t \treturn function() {\n\t \t\t// noop\n\t \t};\n\t }\n\t}\n\n\tif (options.singleton) {\n\t\tvar styleIndex = singletonCounter++;\n\n\t\tstyle = singleton || (singleton = createStyleElement(options));\n\n\t\tupdate = applyToSingletonTag.bind(null, style, styleIndex, false);\n\t\tremove = applyToSingletonTag.bind(null, style, styleIndex, true);\n\n\t} else if (\n\t\tobj.sourceMap &&\n\t\ttypeof URL === \"function\" &&\n\t\ttypeof URL.createObjectURL === \"function\" &&\n\t\ttypeof URL.revokeObjectURL === \"function\" &&\n\t\ttypeof Blob === \"function\" &&\n\t\ttypeof btoa === \"function\"\n\t) {\n\t\tstyle = createLinkElement(options);\n\t\tupdate = updateLink.bind(null, style, options);\n\t\tremove = function () {\n\t\t\tremoveStyleElement(style);\n\n\t\t\tif(style.href) URL.revokeObjectURL(style.href);\n\t\t};\n\t} else {\n\t\tstyle = createStyleElement(options);\n\t\tupdate = applyToTag.bind(null, style);\n\t\tremove = function () {\n\t\t\tremoveStyleElement(style);\n\t\t};\n\t}\n\n\tupdate(obj);\n\n\treturn function updateStyle (newObj) {\n\t\tif (newObj) {\n\t\t\tif (\n\t\t\t\tnewObj.css === obj.css &&\n\t\t\t\tnewObj.media === obj.media &&\n\t\t\t\tnewObj.sourceMap === obj.sourceMap\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tupdate(obj = newObj);\n\t\t} else {\n\t\t\tremove();\n\t\t}\n\t};\n}\n\nvar replaceText = (function () {\n\tvar textStore = [];\n\n\treturn function (index, replacement) {\n\t\ttextStore[index] = replacement;\n\n\t\treturn textStore.filter(Boolean).join('\\n');\n\t};\n})();\n\nfunction applyToSingletonTag (style, index, remove, obj) {\n\tvar css = remove ? \"\" : obj.css;\n\n\tif (style.styleSheet) {\n\t\tstyle.styleSheet.cssText = replaceText(index, css);\n\t} else {\n\t\tvar cssNode = document.createTextNode(css);\n\t\tvar childNodes = style.childNodes;\n\n\t\tif (childNodes[index]) style.removeChild(childNodes[index]);\n\n\t\tif (childNodes.length) {\n\t\t\tstyle.insertBefore(cssNode, childNodes[index]);\n\t\t} else {\n\t\t\tstyle.appendChild(cssNode);\n\t\t}\n\t}\n}\n\nfunction applyToTag (style, obj) {\n\tvar css = obj.css;\n\tvar media = obj.media;\n\n\tif(media) {\n\t\tstyle.setAttribute(\"media\", media)\n\t}\n\n\tif(style.styleSheet) {\n\t\tstyle.styleSheet.cssText = css;\n\t} else {\n\t\twhile(style.firstChild) {\n\t\t\tstyle.removeChild(style.firstChild);\n\t\t}\n\n\t\tstyle.appendChild(document.createTextNode(css));\n\t}\n}\n\nfunction updateLink (link, options, obj) {\n\tvar css = obj.css;\n\tvar sourceMap = obj.sourceMap;\n\n\t/*\n\t\tIf convertToAbsoluteUrls isn't defined, but sourcemaps are enabled\n\t\tand there is no publicPath defined then lets turn convertToAbsoluteUrls\n\t\ton by default. Otherwise default to the convertToAbsoluteUrls option\n\t\tdirectly\n\t*/\n\tvar autoFixUrls = options.convertToAbsoluteUrls === undefined && sourceMap;\n\n\tif (options.convertToAbsoluteUrls || autoFixUrls) {\n\t\tcss = fixUrls(css);\n\t}\n\n\tif (sourceMap) {\n\t\t// http://stackoverflow.com/a/26603875\n\t\tcss += \"\\n/*# sourceMappingURL=data:application/json;base64,\" + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + \" */\";\n\t}\n\n\tvar blob = new Blob([css], { type: \"text/css\" });\n\n\tvar oldSrc = link.href;\n\n\tlink.href = URL.createObjectURL(blob);\n\n\tif(oldSrc) URL.revokeObjectURL(oldSrc);\n}\n","import './app'\nimport './templates'\nimport './commentmodel'\nimport './commentcollection'\nimport './commentsummarymodel'\nimport './commentstabview'\nimport './commentsmodifymenu'\nimport './filesplugin'\nimport './activitytabviewplugin'\nimport './search'\n\nimport './vendor/Caret.js/dist/jquery.caret.min'\nimport './vendor/At.js/dist/js/jquery.atwho.min'\n\nimport './style/autocomplete.scss'\nimport './style/comments.scss'\n\nwindow.OCA.Comments = OCA.Comments;\n","/*\n * Copyright (c) 2016 Vincent Petry <pvince81@owncloud.com>\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\n(function() {\n\tif (!OCA.Comments) {\n\t\t/**\n\t\t * @namespace\n\t\t */\n\t\tOCA.Comments = {};\n\t}\n\n})();\n\n","(function() {\n var template = Handlebars.template, templates = OCA.Comments.Templates = OCA.Comments.Templates || {};\ntemplates['comment'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n return \" unread\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n return \" collapsed\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n return \" currentUser\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \"data-username=\\\"\"\n + container.escapeExpression(((helper = (helper = helpers.actorId || (depth0 != null ? depth0.actorId : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"actorId\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\"\";\n},\"9\":function(container,depth0,helpers,partials,data) {\n return \"\t\t\t<a href=\\\"#\\\" class=\\\"action more icon icon-more has-tooltip\\\"></a>\\n\t\t\t<div class=\\\"deleteLoading icon-loading-small hidden\\\"></div>\\n\";\n},\"11\":function(container,depth0,helpers,partials,data) {\n return \"\t\t<div class=\\\"message-overlay\\\"></div>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"<li class=\\\"comment\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isUnread : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isLong : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\\" data-id=\\\"\"\n + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\">\\n\t<div class=\\\"authorRow\\\">\\n\t\t<div class=\\\"avatar\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isUserAuthor : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\\" \"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.actorId : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"> </div>\\n\t\t<div class=\\\"author\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isUserAuthor : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\\">\"\n + alias4(((helper = (helper = helpers.actorDisplayName || (depth0 != null ? depth0.actorDisplayName : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"actorDisplayName\",\"hash\":{},\"data\":data}) : helper)))\n + \"</div>\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isUserAuthor : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\t\t<div class=\\\"date has-tooltip live-relative-timestamp\\\" data-timestamp=\\\"\"\n + alias4(((helper = (helper = helpers.timestamp || (depth0 != null ? depth0.timestamp : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"timestamp\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\" title=\\\"\"\n + alias4(((helper = (helper = helpers.altDate || (depth0 != null ? depth0.altDate : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"altDate\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\">\"\n + alias4(((helper = (helper = helpers.date || (depth0 != null ? depth0.date : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"date\",\"hash\":{},\"data\":data}) : helper)))\n + \"</div>\\n\t</div>\\n\t<div class=\\\"message\\\">\"\n + ((stack1 = ((helper = (helper = helpers.formattedMessage || (depth0 != null ? depth0.formattedMessage : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"formattedMessage\",\"hash\":{},\"data\":data}) : helper))) != null ? stack1 : \"\")\n + \"</div>\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isLong : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(11, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"</li>\\n\";\n},\"useData\":true});\ntemplates['commentsmodifymenu'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"\t\t<li>\\n\t\t\t<a href=\\\"#\\\" class=\\\"menuitem action \"\n + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n + \" permanent\\\" data-action=\\\"\"\n + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\">\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.iconClass : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.program(4, data, 0),\"data\":data})) != null ? stack1 : \"\")\n + \"\t\t\t\t<span>\"\n + alias4(((helper = (helper = helpers.displayName || (depth0 != null ? depth0.displayName : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"displayName\",\"hash\":{},\"data\":data}) : helper)))\n + \"</span>\\n\t\t\t</a>\\n\t\t</li>\\n\";\n},\"2\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \"\t\t\t\t\t<span class=\\\"icon \"\n + container.escapeExpression(((helper = (helper = helpers.iconClass || (depth0 != null ? depth0.iconClass : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"iconClass\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\"></span>\\n\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n return \"\t\t\t\t\t<span class=\\\"no-icon\\\"></span>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \"<ul>\\n\"\n + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.items : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"</ul>\\n\";\n},\"useData\":true});\ntemplates['edit_comment'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \"\t\t\t<div class=\\\"action-container\\\">\\n\t\t\t\t<a href=\\\"#\\\" class=\\\"action cancel icon icon-close has-tooltip\\\" title=\\\"\"\n + container.escapeExpression(((helper = (helper = helpers.cancelText || (depth0 != null ? depth0.cancelText : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"cancelText\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\"></a>\\n\t\t\t</div>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"<\"\n + alias4(((helper = (helper = helpers.tag || (depth0 != null ? depth0.tag : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"tag\",\"hash\":{},\"data\":data}) : helper)))\n + \" class=\\\"newCommentRow comment\\\" data-id=\\\"\"\n + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\">\\n\t<div class=\\\"authorRow\\\">\\n\t\t<div class=\\\"avatar currentUser\\\" data-username=\\\"\"\n + alias4(((helper = (helper = helpers.actorId || (depth0 != null ? depth0.actorId : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"actorId\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\"></div>\\n\t\t<div class=\\\"author currentUser\\\">\"\n + alias4(((helper = (helper = helpers.actorDisplayName || (depth0 != null ? depth0.actorDisplayName : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"actorDisplayName\",\"hash\":{},\"data\":data}) : helper)))\n + \"</div>\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isEditMode : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\t</div>\\n\t<form class=\\\"newCommentForm\\\">\\n\t\t<div contentEditable=\\\"true\\\" class=\\\"message\\\" data-placeholder=\\\"\"\n + alias4(((helper = (helper = helpers.newMessagePlaceholder || (depth0 != null ? depth0.newMessagePlaceholder : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"newMessagePlaceholder\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\">\"\n + alias4(((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"message\",\"hash\":{},\"data\":data}) : helper)))\n + \"</div>\\n\t\t<input class=\\\"submit icon-confirm has-tooltip\\\" type=\\\"submit\\\" value=\\\"\\\" title=\\\"\"\n + alias4(((helper = (helper = helpers.submitText || (depth0 != null ? depth0.submitText : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"submitText\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\"/>\\n\t\t<div class=\\\"submitLoading icon-loading-small hidden\\\"></div>\\n\t</form>\\n</\"\n + alias4(((helper = (helper = helpers.tag || (depth0 != null ? depth0.tag : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"tag\",\"hash\":{},\"data\":data}) : helper)))\n + \">\\n\";\n},\"useData\":true});\ntemplates['filesplugin'] = template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"<a class=\\\"action action-comment permanent\\\" title=\\\"\"\n + alias4(((helper = (helper = helpers.countMessage || (depth0 != null ? depth0.countMessage : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"countMessage\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\" href=\\\"#\\\">\\n\t<img class=\\\"svg\\\" src=\\\"\"\n + alias4(((helper = (helper = helpers.iconUrl || (depth0 != null ? depth0.iconUrl : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"iconUrl\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\"/>\\n</a>\\n\";\n},\"useData\":true});\ntemplates['view'] = template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"<ul class=\\\"comments\\\">\\n</ul>\\n<div class=\\\"emptycontent hidden\\\"><div class=\\\"icon-comment\\\"></div>\\n\t<p>\"\n + alias4(((helper = (helper = helpers.emptyResultLabel || (depth0 != null ? depth0.emptyResultLabel : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"emptyResultLabel\",\"hash\":{},\"data\":data}) : helper)))\n + \"</p></div>\\n<input type=\\\"button\\\" class=\\\"showMore hidden\\\" value=\\\"\"\n + alias4(((helper = (helper = helpers.moreLabel || (depth0 != null ? depth0.moreLabel : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"moreLabel\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\" name=\\\"show-more\\\" id=\\\"show-more\\\" />\\n<div class=\\\"loading hidden\\\" style=\\\"height: 50px\\\"></div>\\n\";\n},\"useData\":true});\n})();","/*\n * Copyright (c) 2016\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\n(function(OC, OCA) {\n\n\t_.extend(OC.Files.Client, {\n\t\tPROPERTY_FILEID:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}id',\n\t\tPROPERTY_MESSAGE: \t'{' + OC.Files.Client.NS_OWNCLOUD + '}message',\n\t\tPROPERTY_ACTORTYPE:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}actorType',\n\t\tPROPERTY_ACTORID:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}actorId',\n\t\tPROPERTY_ISUNREAD:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}isUnread',\n\t\tPROPERTY_OBJECTID:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}objectId',\n\t\tPROPERTY_OBJECTTYPE:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}objectType',\n\t\tPROPERTY_ACTORDISPLAYNAME:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}actorDisplayName',\n\t\tPROPERTY_CREATIONDATETIME:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}creationDateTime',\n\t\tPROPERTY_MENTIONS: '{' + OC.Files.Client.NS_OWNCLOUD + '}mentions'\n\t});\n\n\t/**\n\t * @class OCA.Comments.CommentModel\n\t * @classdesc\n\t *\n\t * Comment\n\t *\n\t */\n\tvar CommentModel = OC.Backbone.Model.extend(\n\t\t/** @lends OCA.Comments.CommentModel.prototype */ {\n\t\tsync: OC.Backbone.davSync,\n\n\t\tdefaults: {\n\t\t\tactorType: 'users',\n\t\t\tobjectType: 'files'\n\t\t},\n\n\t\tdavProperties: {\n\t\t\t'id':\tOC.Files.Client.PROPERTY_FILEID,\n\t\t\t'message':\tOC.Files.Client.PROPERTY_MESSAGE,\n\t\t\t'actorType':\tOC.Files.Client.PROPERTY_ACTORTYPE,\n\t\t\t'actorId':\tOC.Files.Client.PROPERTY_ACTORID,\n\t\t\t'actorDisplayName':\tOC.Files.Client.PROPERTY_ACTORDISPLAYNAME,\n\t\t\t'creationDateTime':\tOC.Files.Client.PROPERTY_CREATIONDATETIME,\n\t\t\t'objectType':\tOC.Files.Client.PROPERTY_OBJECTTYPE,\n\t\t\t'objectId':\tOC.Files.Client.PROPERTY_OBJECTID,\n\t\t\t'isUnread':\tOC.Files.Client.PROPERTY_ISUNREAD,\n\t\t\t'mentions': OC.Files.Client.PROPERTY_MENTIONS\n\t\t},\n\n\t\tparse: function(data) {\n\t\t\treturn {\n\t\t\t\tid: data.id,\n\t\t\t\tmessage: data.message,\n\t\t\t\tactorType: data.actorType,\n\t\t\t\tactorId: data.actorId,\n\t\t\t\tactorDisplayName: data.actorDisplayName,\n\t\t\t\tcreationDateTime: data.creationDateTime,\n\t\t\t\tobjectType: data.objectType,\n\t\t\t\tobjectId: data.objectId,\n\t\t\t\tisUnread: (data.isUnread === 'true'),\n\t\t\t\tmentions: this._parseMentions(data.mentions)\n\t\t\t};\n\t\t},\n\n\t\t_parseMentions: function(mentions) {\n\t\t\tif(_.isUndefined(mentions)) {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\tvar result = {};\n\t\t\tfor(var i in mentions) {\n\t\t\t\tvar mention = mentions[i];\n\t\t\t\tif(_.isUndefined(mention.localName) || mention.localName !== 'mention') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tresult[i] = {};\n\t\t\t\tfor (var child = mention.firstChild; child; child = child.nextSibling) {\n\t\t\t\t\tif(_.isUndefined(child.localName) || !child.localName.startsWith('mention')) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tresult[i][child.localName] = child.textContent;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t});\n\n\tOCA.Comments.CommentModel = CommentModel;\n})(OC, OCA);\n","/*\n * Copyright (c) 2016\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\n(function(OC, OCA) {\n\n\t/**\n\t * @class OCA.Comments.CommentCollection\n\t * @classdesc\n\t *\n\t * Collection of comments assigned to a file\n\t *\n\t */\n\tvar CommentCollection = OC.Backbone.Collection.extend(\n\t\t/** @lends OCA.Comments.CommentCollection.prototype */ {\n\n\t\tsync: OC.Backbone.davSync,\n\n\t\tmodel: OCA.Comments.CommentModel,\n\n\t\t/**\n\t\t * Object type\n\t\t *\n\t\t * @type string\n\t\t */\n\t\t_objectType: 'files',\n\n\t\t/**\n\t\t * Object id\n\t\t *\n\t\t * @type string\n\t\t */\n\t\t_objectId: null,\n\n\t\t/**\n\t\t * True if there are no more page results left to fetch\n\t\t *\n\t\t * @type bool\n\t\t */\n\t\t_endReached: false,\n\n\t\t/**\n\t\t * Number of comments to fetch per page\n\t\t *\n\t\t * @type int\n\t\t */\n\t\t_limit : 20,\n\n\t\t/**\n\t\t * Initializes the collection\n\t\t *\n\t\t * @param {string} [options.objectType] object type\n\t\t * @param {string} [options.objectId] object id\n\t\t */\n\t\tinitialize: function(models, options) {\n\t\t\toptions = options || {};\n\t\t\tif (options.objectType) {\n\t\t\t\tthis._objectType = options.objectType;\n\t\t\t}\n\t\t\tif (options.objectId) {\n\t\t\t\tthis._objectId = options.objectId;\n\t\t\t}\n\t\t},\n\n\t\turl: function() {\n\t\t\treturn OC.linkToRemote('dav') + '/comments/' +\n\t\t\t\tencodeURIComponent(this._objectType) + '/' +\n\t\t\t\tencodeURIComponent(this._objectId) + '/';\n\t\t},\n\n\t\tsetObjectId: function(objectId) {\n\t\t\tthis._objectId = objectId;\n\t\t},\n\n\t\thasMoreResults: function() {\n\t\t\treturn !this._endReached;\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis._endReached = false;\n\t\t\tthis._summaryModel = null;\n\t\t\treturn OC.Backbone.Collection.prototype.reset.apply(this, arguments);\n\t\t},\n\n\t\t/**\n\t\t * Fetch the next set of results\n\t\t */\n\t\tfetchNext: function(options) {\n\t\t\tvar self = this;\n\t\t\tif (!this.hasMoreResults()) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tvar body = '<?xml version=\"1.0\" encoding=\"utf-8\" ?>\\n' +\n\t\t\t\t'<oc:filter-comments xmlns:D=\"DAV:\" xmlns:oc=\"http://owncloud.org/ns\">\\n' +\n\t\t\t\t// load one more so we know there is more\n\t\t\t\t' <oc:limit>' + (this._limit + 1) + '</oc:limit>\\n' +\n\t\t\t\t' <oc:offset>' + this.length + '</oc:offset>\\n' +\n\t\t\t\t'</oc:filter-comments>\\n';\n\n\t\t\toptions = options || {};\n\t\t\tvar success = options.success;\n\t\t\toptions = _.extend({\n\t\t\t\tremove: false,\n\t\t\t\tparse: true,\n\t\t\t\tdata: body,\n\t\t\t\tdavProperties: CommentCollection.prototype.model.prototype.davProperties,\n\t\t\t\tsuccess: function(resp) {\n\t\t\t\t\tif (resp.length <= self._limit) {\n\t\t\t\t\t\t// no new entries, end reached\n\t\t\t\t\t\tself._endReached = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// remove last entry, for next page load\n\t\t\t\t\t\tresp = _.initial(resp);\n\t\t\t\t\t}\n\t\t\t\t\tif (!self.set(resp, options)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (success) {\n\t\t\t\t\t\tsuccess.apply(null, arguments);\n\t\t\t\t\t}\n\t\t\t\t\tself.trigger('sync', 'REPORT', self, options);\n\t\t\t\t}\n\t\t\t}, options);\n\n\t\t\treturn this.sync('REPORT', this, options);\n\t\t},\n\n\t\t/**\n\t\t * Returns the matching summary model\n\t\t *\n\t\t * @return {OCA.Comments.CommentSummaryModel} summary model\n\t\t */\n\t\tgetSummaryModel: function() {\n\t\t\tif (!this._summaryModel) {\n\t\t\t\tthis._summaryModel = new OCA.Comments.CommentSummaryModel({\n\t\t\t\t\tid: this._objectId,\n\t\t\t\t\tobjectType: this._objectType\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn this._summaryModel;\n\t\t},\n\n\t\t/**\n\t\t * Updates the read marker for this comment thread\n\t\t *\n\t\t * @param {Date} [date] optional date, defaults to now\n\t\t * @param {Object} [options] backbone options\n\t\t */\n\t\tupdateReadMarker: function(date, options) {\n\t\t\toptions = options || {};\n\n\t\t\treturn this.getSummaryModel().save({\n\t\t\t\treadMarker: (date || new Date()).toUTCString()\n\t\t\t}, options);\n\t\t}\n\t});\n\n\tOCA.Comments.CommentCollection = CommentCollection;\n})(OC, OCA);\n\n","/*\n * Copyright (c) 2016\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\n(function(OC, OCA) {\n\n\t_.extend(OC.Files.Client, {\n\t\tPROPERTY_READMARKER:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}readMarker'\n\t});\n\n\t/**\n\t * @class OCA.Comments.CommentSummaryModel\n\t * @classdesc\n\t *\n\t * Model containing summary information related to comments\n\t * like the read marker.\n\t *\n\t */\n\tvar CommentSummaryModel = OC.Backbone.Model.extend(\n\t\t/** @lends OCA.Comments.CommentSummaryModel.prototype */ {\n\t\tsync: OC.Backbone.davSync,\n\n\t\t/**\n\t\t * Object type\n\t\t *\n\t\t * @type string\n\t\t */\n\t\t_objectType: 'files',\n\n\t\t/**\n\t\t * Object id\n\t\t *\n\t\t * @type string\n\t\t */\n\t\t_objectId: null,\n\n\t\tdavProperties: {\n\t\t\t'readMarker': OC.Files.Client.PROPERTY_READMARKER\n\t\t},\n\n\t\t/**\n\t\t * Initializes the summary model\n\t\t *\n\t\t * @param {string} [options.objectType] object type\n\t\t * @param {string} [options.objectId] object id\n\t\t */\n\t\tinitialize: function(attrs, options) {\n\t\t\toptions = options || {};\n\t\t\tif (options.objectType) {\n\t\t\t\tthis._objectType = options.objectType;\n\t\t\t}\n\t\t},\n\n\t\turl: function() {\n\t\t\treturn OC.linkToRemote('dav') + '/comments/' +\n\t\t\t\tencodeURIComponent(this._objectType) + '/' +\n\t\t\t\tencodeURIComponent(this.id) + '/';\n\t\t}\n\t});\n\n\tOCA.Comments.CommentSummaryModel = CommentSummaryModel;\n})(OC, OCA);\n","/*\n * Copyright (c) 2016\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\n/* global Handlebars, escapeHTML */\n\n(function(OC, OCA) {\n\n\t/**\n\t * @memberof OCA.Comments\n\t */\n\tvar CommentsTabView = OCA.Files.DetailTabView.extend(\n\t\t/** @lends OCA.Comments.CommentsTabView.prototype */ {\n\t\tid: 'commentsTabView',\n\t\tclassName: 'tab commentsTabView',\n\t\t_autoCompleteData: undefined,\n\t\t_commentsModifyMenu: undefined,\n\n\t\tevents: {\n\t\t\t'submit .newCommentForm': '_onSubmitComment',\n\t\t\t'click .showMore': '_onClickShowMore',\n\t\t\t'click .cancel': '_onClickCloseComment',\n\t\t\t'click .comment': '_onClickComment',\n\t\t\t'keyup div.message': '_onTextChange',\n\t\t\t'change div.message': '_onTextChange',\n\t\t\t'input div.message': '_onTextChange',\n\t\t\t'paste div.message': '_onPaste'\n\t\t},\n\n\t\t_commentMaxLength: 1000,\n\n\t\tinitialize: function() {\n\t\t\tOCA.Files.DetailTabView.prototype.initialize.apply(this, arguments);\n\t\t\tthis.collection = new OCA.Comments.CommentCollection();\n\t\t\tthis.collection.on('request', this._onRequest, this);\n\t\t\tthis.collection.on('sync', this._onEndRequest, this);\n\t\t\tthis.collection.on('add', this._onAddModel, this);\n\t\t\tthis.collection.on('change:message', this._onChangeModel, this);\n\n\t\t\tthis._commentMaxThreshold = this._commentMaxLength * 0.9;\n\n\t\t\t// TODO: error handling\n\t\t\t_.bindAll(this, '_onTypeComment', '_initAutoComplete', '_onAutoComplete');\n\t\t},\n\n\t\ttemplate: function(params) {\n\t\t\tvar currentUser = OC.getCurrentUser();\n\t\t\treturn OCA.Comments.Templates['view'](_.extend({\n\t\t\t\tactorId: currentUser.uid,\n\t\t\t\tactorDisplayName: currentUser.displayName\n\t\t\t}, params));\n\t\t},\n\n\t\teditCommentTemplate: function(params) {\n\t\t\tvar currentUser = OC.getCurrentUser();\n\t\t\treturn OCA.Comments.Templates['edit_comment'](_.extend({\n\t\t\t\tactorId: currentUser.uid,\n\t\t\t\tactorDisplayName: currentUser.displayName,\n\t\t\t\tnewMessagePlaceholder: t('comments', 'New comment …'),\n\t\t\t\tsubmitText: t('comments', 'Post'),\n\t\t\t\tcancelText: t('comments', 'Cancel'),\n\t\t\t\ttag: 'li'\n\t\t\t}, params));\n\t\t},\n\n\t\tcommentTemplate: function(params) {\n\t\t\tparams = _.extend({\n\t\t\t\teditTooltip: t('comments', 'Edit comment'),\n\t\t\t\tisUserAuthor: OC.getCurrentUser().uid === params.actorId,\n\t\t\t\tisLong: this._isLong(params.message)\n\t\t\t}, params);\n\n\t\t\tif (params.actorType === 'deleted_users') {\n\t\t\t\t// makes the avatar a X\n\t\t\t\tparams.actorId = null;\n\t\t\t\tparams.actorDisplayName = t('comments', '[Deleted user]');\n\t\t\t}\n\n\t\t\treturn OCA.Comments.Templates['comment'](params);\n\t\t},\n\n\t\tgetLabel: function() {\n\t\t\treturn t('comments', 'Comments');\n\t\t},\n\n\t\tgetIcon: function() {\n\t\t\treturn 'icon-comment';\n\t\t},\n\n\t\tsetFileInfo: function(fileInfo) {\n\t\t\tif (fileInfo) {\n\t\t\t\tthis.model = fileInfo;\n\n\t\t\t\tthis.render();\n\t\t\t\tthis._initAutoComplete($('#commentsTabView').find('.newCommentForm .message'));\n\t\t\t\tthis.collection.setObjectId(this.model.id);\n\t\t\t\t// reset to first page\n\t\t\t\tthis.collection.reset([], {silent: true});\n\t\t\t\tthis.nextPage();\n\t\t\t} else {\n\t\t\t\tthis.model = null;\n\t\t\t\tthis.render();\n\t\t\t\tthis.collection.reset();\n\t\t\t}\n\t\t},\n\n\t\trender: function() {\n\t\t\tthis.$el.html(this.template({\n\t\t\t\temptyResultLabel: t('comments', 'No comments yet, start the conversation!'),\n\t\t\t\tmoreLabel: t('comments', 'More comments …')\n\t\t\t}));\n\t\t\tthis.$el.find('.comments').before(this.editCommentTemplate({ tag: 'div'}));\n\t\t\tthis.$el.find('.has-tooltip').tooltip();\n\t\t\tthis.$container = this.$el.find('ul.comments');\n\t\t\tthis.$el.find('.avatar').avatar(OC.getCurrentUser().uid, 32);\n\t\t\tthis.delegateEvents();\n\t\t\tthis.$el.find('.message').on('keydown input change', this._onTypeComment);\n\n\t\t\tautosize(this.$el.find('.newCommentRow .message'))\n\t\t\tthis.$el.find('.newCommentForm .message').focus();\t\n\t\t},\n\n\t\t_initAutoComplete: function($target) {\n\t\t\tvar s = this;\n\t\t\tvar limit = 10;\n\t\t\tif(!_.isUndefined(OC.appConfig.comments)) {\n\t\t\t\tlimit = OC.appConfig.comments.maxAutoCompleteResults;\n\t\t\t}\n\t\t\t$target.atwho({\n\t\t\t\tat: '@',\n\t\t\t\tlimit: limit,\n\t\t\t\tcallbacks: {\n\t\t\t\t\tremoteFilter: s._onAutoComplete,\n\t\t\t\t\thighlighter: function (li) {\n\t\t\t\t\t\t// misuse the highlighter callback to instead of\n\t\t\t\t\t\t// highlighting loads the avatars.\n\t\t\t\t\t\tvar $li = $(li);\n\t\t\t\t\t\t$li.find('.avatar').avatar(undefined, 32);\n\t\t\t\t\t\treturn $li;\n\t\t\t\t\t},\n\t\t\t\t\tsorter: function (q, items) { return items; }\n\t\t\t\t},\n\t\t\t\tdisplayTpl: function (item) {\n\t\t\t\t\treturn '<li>' +\n\t\t\t\t\t\t'<span class=\"avatar-name-wrapper\">' +\n\t\t\t\t\t\t\t'<span class=\"avatar\" ' +\n\t\t\t\t\t\t\t\t\t'data-username=\"' + escapeHTML(item.id) + '\" ' + // for avatars\n\t\t\t\t\t\t\t\t\t'data-user=\"' + escapeHTML(item.id) + '\" ' + // for contactsmenu\n\t\t\t\t\t\t\t\t\t'data-user-display-name=\"' + escapeHTML(item.label) + '\">' +\n\t\t\t\t\t\t\t'</span>' +\n\t\t\t\t\t\t\t'<strong>' + escapeHTML(item.label) + '</strong>' +\n\t\t\t\t\t\t'</span></li>';\n\t\t\t\t},\n\t\t\t\tinsertTpl: function (item) {\n\t\t\t\t\treturn '' +\n\t\t\t\t\t\t'<span class=\"avatar-name-wrapper\">' +\n\t\t\t\t\t\t\t'<span class=\"avatar\" ' +\n\t\t\t\t\t\t\t\t\t'data-username=\"' + escapeHTML(item.id) + '\" ' + // for avatars\n\t\t\t\t\t\t\t\t\t'data-user=\"' + escapeHTML(item.id) + '\" ' + // for contactsmenu\n\t\t\t\t\t\t\t\t\t'data-user-display-name=\"' + escapeHTML(item.label) + '\">' +\n\t\t\t\t\t\t\t'</span>' +\n\t\t\t\t\t\t\t'<strong>' + escapeHTML(item.label) + '</strong>' +\n\t\t\t\t\t\t'</span>';\n\t\t\t\t},\n\t\t\t\tsearchKey: \"label\"\n\t\t\t});\n\t\t\t$target.on('inserted.atwho', function (je, $el) {\n\t\t\t\tvar editionMode = true;\n\t\t\t\ts._postRenderItem(\n\t\t\t\t\t// we need to pass the parent of the inserted element\n\t\t\t\t\t// passing the whole comments form would re-apply and request\n\t\t\t\t\t// avatars from the server\n\t\t\t\t\t$(je.target).find(\n\t\t\t\t\t\t'span[data-username=\"' + $el.find('[data-username]').data('username') + '\"]'\n\t\t\t\t\t).parent(),\n\t\t\t\t\teditionMode\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\n\t\t_onAutoComplete: function(query, callback) {\n\t\t\tvar s = this;\n\t\t\tif(!_.isUndefined(this._autoCompleteRequestTimer)) {\n\t\t\t\tclearTimeout(this._autoCompleteRequestTimer);\n\t\t\t}\n\t\t\tthis._autoCompleteRequestTimer = _.delay(function() {\n\t\t\t\tif(!_.isUndefined(this._autoCompleteRequestCall)) {\n\t\t\t\t\tthis._autoCompleteRequestCall.abort();\n\t\t\t\t}\n\t\t\t\tthis._autoCompleteRequestCall = $.ajax({\n\t\t\t\t\turl: OC.linkToOCS('core', 2) + 'autocomplete/get',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tsearch: query,\n\t\t\t\t\t\titemType: 'files',\n\t\t\t\t\t\titemId: s.model.get('id'),\n\t\t\t\t\t\tsorter: 'commenters|share-recipients',\n\t\t\t\t\t\tlimit: OC.appConfig.comments.maxAutoCompleteResults\n\t\t\t\t\t},\n\t\t\t\t\tbeforeSend: function (request) {\n\t\t\t\t\t\trequest.setRequestHeader('Accept', 'application/json');\n\t\t\t\t\t},\n\t\t\t\t\tsuccess: function (result) {\n\t\t\t\t\t\tcallback(result.ocs.data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}, 400);\n\t\t},\n\n\t\t_formatItem: function(commentModel) {\n\t\t\tvar timestamp = new Date(commentModel.get('creationDateTime')).getTime();\n\t\t\tvar data = _.extend({\n\t\t\t\ttimestamp: timestamp,\n\t\t\t\tdate: OC.Util.relativeModifiedDate(timestamp),\n\t\t\t\taltDate: OC.Util.formatDate(timestamp),\n\t\t\t\tformattedMessage: this._formatMessage(commentModel.get('message'), commentModel.get('mentions'))\n\t\t\t}, commentModel.attributes);\n\t\t\treturn data;\n\t\t},\n\n\t\t_toggleLoading: function(state) {\n\t\t\tthis._loading = state;\n\t\t\tthis.$el.find('.loading').toggleClass('hidden', !state);\n\t\t},\n\n\t\t_onRequest: function(type) {\n\t\t\tif (type === 'REPORT') {\n\t\t\t\tthis._toggleLoading(true);\n\t\t\t\tthis.$el.find('.showMore').addClass('hidden');\n\t\t\t}\n\t\t},\n\n\t\t_onEndRequest: function(type) {\n\t\t\tvar fileInfoModel = this.model;\n\t\t\tthis._toggleLoading(false);\n\t\t\tthis.$el.find('.emptycontent').toggleClass('hidden', !!this.collection.length);\n\t\t\tthis.$el.find('.showMore').toggleClass('hidden', !this.collection.hasMoreResults());\n\n\t\t\tif (type !== 'REPORT') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// find first unread comment\n\t\t\tvar firstUnreadComment = this.collection.findWhere({isUnread: true});\n\t\t\tif (firstUnreadComment) {\n\t\t\t\t// update read marker\n\t\t\t\tthis.collection.updateReadMarker(\n\t\t\t\t\tnull,\n\t\t\t\t\t{\n\t\t\t\t\t\tsuccess: function() {\n\t\t\t\t\t\t\tfileInfoModel.set('commentsUnread', 0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.$el.find('.newCommentForm .message').focus();\t\n\t\t\t\n\t\t},\n\n\t\t/**\n\t\t * takes care of post-rendering after a new comment was added to the\n\t\t * collection\n\t\t *\n\t\t * @param model\n\t\t * @param collection\n\t\t * @param options\n\t\t * @private\n\t\t */\n\t\t_onAddModel: function(model, collection, options) {\n\t\t\t// we need to render it immediately, to ensure that the right\n\t\t\t// order of comments is kept on opening comments tab\n\t\t\tvar $comment = $(this.commentTemplate(this._formatItem(model)));\n\t\t\tif (!_.isUndefined(options.at) && collection.length > 1) {\n\t\t\t\tthis.$container.find('li').eq(options.at).before($comment);\n\t\t\t} else {\n\t\t\t\tthis.$container.append($comment);\n\t\t\t}\n\t\t\tthis._postRenderItem($comment);\n\t\t\t$('#commentsTabView').find('.newCommentForm div.message').text('').prop('contenteditable', true);\n\n\t\t\t// we need to update the model, because it consists of client data\n\t\t\t// only, but the server might add meta data, e.g. about mentions\n\t\t\tvar oldMentions = model.get('mentions');\n\t\t\tvar self = this;\n\t\t\tmodel.fetch({\n\t\t\t\tsuccess: function (model) {\n\t\t\t\t\tif(_.isEqual(oldMentions, model.get('mentions'))) {\n\t\t\t\t\t\t// don't attempt to render if unnecessary, avoids flickering\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tvar $updated = $(self.commentTemplate(self._formatItem(model)));\n\t\t\t\t\t$comment.html($updated.html());\n\t\t\t\t\tself._postRenderItem($comment);\n\t\t\t\t}\n\t\t\t})\n\n\t\t},\n\n\t\t/**\n\t\t * takes care of post-rendering after a new comment was edited\n\t\t *\n\t\t * @param model\n\t\t * @private\n\t\t */\n\t\t_onChangeModel: function (model) {\n\t\t\tif(model.get('message').trim() === model.previous('message').trim()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar $form = this.$container.find('.comment[data-id=\"' + model.id + '\"] form');\n\t\t\tvar $row = $form.closest('.comment');\n\t\t\tvar $target = $row.data('commentEl');\n\t\t\tif(_.isUndefined($target)) {\n\t\t\t\t// ignore noise – this is only set after editing a comment and hitting post\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar self = this;\n\n\t\t\t// we need to update the model, because it consists of client data\n\t\t\t// only, but the server might add meta data, e.g. about mentions\n\t\t\tmodel.fetch({\n\t\t\t\tsuccess: function (model) {\n\t\t\t\t\t$target.removeClass('hidden');\n\t\t\t\t\t$row.remove();\n\n\t\t\t\t\tvar $message = $target.find('.message');\n\t\t\t\t\t$message\n\t\t\t\t\t\t.html(self._formatMessage(model.get('message'), model.get('mentions')))\n\t\t\t\t\t\t.find('.avatar')\n\t\t\t\t\t\t.each(function () { $(this).avatar(); });\n\t\t\t\t\tself._postRenderItem($message);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t_postRenderItem: function($el, editionMode) {\n\t\t\t$el.find('.has-tooltip').tooltip();\n\t\t\tvar inlineAvatars = $el.find('.message .avatar');\n\t\t\tif ($($el.context).hasClass('message')) {\n\t\t\t\tinlineAvatars = $el.find('.avatar');\n\t\t\t}\n\t\t\tinlineAvatars.each(function () {\n\t\t\t\tvar $this = $(this);\n\t\t\t\t$this.avatar($this.attr('data-username'), 16);\n\t\t\t});\n\t\t\t$el.find('.authorRow .avatar').each(function () {\n\t\t\t\tvar $this = $(this);\n\t\t\t\t$this.avatar($this.attr('data-username'), 32);\n\t\t\t});\n\n\t\t\tvar username = $el.find('.avatar').data('username');\n\t\t\tif (username !== oc_current_user) {\n\t\t\t\t$el.find('.authorRow .avatar, .authorRow .author').contactsMenu(\n\t\t\t\t\tusername, 0, $el.find('.authorRow'));\n\t\t\t}\n\n\t\t\tvar $message = $el.find('.message');\n\t\t\tif($message.length === 0) {\n\t\t\t\t// it is the case when writing a comment and mentioning a person\n\t\t\t\t$message = $el;\n\t\t\t}\n\n\n\t\t\tif (!editionMode) {\n\t\t\t\tvar self = this;\n\t\t\t\t// add the dropdown menu to display the edit and delete option\n\t\t\t\tvar modifyCommentMenu = new OCA.Comments.CommentsModifyMenu();\n\t\t\t\t$el.find('.authorRow').append(modifyCommentMenu.$el);\n\t\t\t\t$el.find('.more').on('click', _.bind(modifyCommentMenu.show, modifyCommentMenu));\n\n\t\t\t\tself.listenTo(modifyCommentMenu, 'select:menu-item-clicked', function(ev, action) {\n\t\t\t\t\tif (action === 'edit') {\n\t\t\t\t\t\tself._onClickEditComment(ev);\n\t\t\t\t\t} else if (action === 'delete') {\n\t\t\t\t\t\tself._onClickDeleteComment(ev);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._postRenderMessage($message, editionMode);\n\t\t},\n\n\t\t_postRenderMessage: function($el, editionMode) {\n\t\t\tif (editionMode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$el.find('.avatar-name-wrapper').each(function() {\n\t\t\t\tvar $this = $(this);\n\t\t\t\tvar $avatar = $this.find('.avatar');\n\n\t\t\t\tvar user = $avatar.data('user');\n\t\t\t\tif (user !== OC.getCurrentUser().uid) {\n\t\t\t\t\t$this.contactsMenu(user, 0, $this);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Convert a message to be displayed in HTML,\n\t\t * converts newlines to <br> tags.\n\t\t */\n\t\t_formatMessage: function(message, mentions, editMode) {\n\t\t\tmessage = escapeHTML(message).replace(/\\n/g, '<br/>');\n\n\t\t\tfor(var i in mentions) {\n\t\t\t\tif(!mentions.hasOwnProperty(i)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar mention = '@' + mentions[i].mentionId;\n\t\t\t\tif (mentions[i].mentionId.indexOf(' ') !== -1) {\n\t\t\t\t\tmention = _.escape('@\"' + mentions[i].mentionId + '\"');\n\t\t\t\t}\n\n\t\t\t\t// escape possible regex characters in the name\n\t\t\t\tmention = mention.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\t\t\t\tvar regex = new RegExp(\"(^|\\\\s)(\" + mention + \")\\\\b\", 'g');\n\t\t\t\tif (mentions[i].mentionId.indexOf(' ') !== -1) {\n\t\t\t\t\tregex = new RegExp(\"(^|\\\\s)(\" + mention + \")\", 'g');\n\t\t\t\t}\n\n\t\t\t\tvar displayName = this._composeHTMLMention(mentions[i].mentionId, mentions[i].mentionDisplayName);\n\n\t\t\t\t// replace every mention either at the start of the input or after a whitespace\n\t\t\t\t// followed by a non-word character.\n\t\t\t\tmessage = message.replace(regex,\n\t\t\t\t\tfunction(match, p1) {\n\t\t\t\t\t\t// to get number of whitespaces (0 vs 1) right\n\t\t\t\t\t\treturn p1+displayName;\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\tif(editMode !== true) {\n\t\t\t\tmessage = OCP.Comments.plainToRich(message);\n\t\t\t}\n\t\t\treturn message;\n\t\t},\n\n\t\t_composeHTMLMention: function(uid, displayName) {\n\t\t\tvar avatar = '' +\n\t\t\t\t'<span class=\"avatar\" ' +\n\t\t\t\t\t\t'data-username=\"' + _.escape(uid) + '\" ' +\n\t\t\t\t\t\t'data-user=\"' + _.escape(uid) + '\" ' +\n\t\t\t\t\t\t'data-user-display-name=\"' + _.escape(displayName) + '\">' +\n\t\t\t\t'</span>';\n\n\t\t\tvar isCurrentUser = (uid === OC.getCurrentUser().uid);\n\n\t\t\treturn '' +\n\t\t\t\t'<span class=\"atwho-inserted\" contenteditable=\"false\">' +\n\t\t\t\t\t'<span class=\"avatar-name-wrapper' + (isCurrentUser ? ' currentUser' : '') + '\">' +\n\t\t\t\t\t\tavatar +\n\t\t\t\t\t\t'<strong>' + _.escape(displayName) + '</strong>' +\n\t\t\t\t\t'</span>' +\n\t\t\t\t'</span>';\n\t\t},\n\n\t\tnextPage: function() {\n\t\t\tif (this._loading || !this.collection.hasMoreResults()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.collection.fetchNext();\n\t\t},\n\n\t\t_onClickEditComment: function(ev) {\n\t\t\tev.preventDefault();\n\t\t\tvar $comment = $(ev.target).closest('.comment');\n\t\t\tvar commentId = $comment.data('id');\n\t\t\tvar commentToEdit = this.collection.get(commentId);\n\t\t\tvar $formRow = $(this.editCommentTemplate(_.extend({\n\t\t\t\tisEditMode: true,\n\t\t\t\tsubmitText: t('comments', 'Save')\n\t\t\t}, commentToEdit.attributes)));\n\n\t\t\t$comment.addClass('hidden').removeClass('collapsed');\n\t\t\t// spawn form\n\t\t\t$comment.after($formRow);\n\t\t\t$formRow.data('commentEl', $comment);\n\t\t\t$formRow.find('.message').on('keydown input change', this._onTypeComment);\n\n\t\t\t// copy avatar element from original to avoid flickering\n\t\t\t$formRow.find('.avatar:first').replaceWith($comment.find('.avatar:first').clone());\n\t\t\t$formRow.find('.has-tooltip').tooltip();\n\n\t\t\tvar $message = $formRow.find('.message');\n\t\t\t$message\n\t\t\t\t.html(this._formatMessage(commentToEdit.get('message'), commentToEdit.get('mentions'), true))\n\t\t\t\t.find('.avatar')\n\t\t\t\t.each(function () { $(this).avatar(); });\n\t\t\tvar editionMode = true;\n\t\t\tthis._postRenderItem($message, editionMode);\n\n\t\t\t// Enable autosize\n\t\t\tautosize($formRow.find('.message'));\n\n\t\t\t// enable autocomplete\n\t\t\tthis._initAutoComplete($formRow.find('.message'));\n\n\t\t\treturn false;\n\t\t},\n\n\t\t_onTypeComment: function(ev) {\n\t\t\tvar $field = $(ev.target);\n\t\t\tvar len = $field.text().length;\n\t\t\tvar $submitButton = $field.data('submitButtonEl');\n\t\t\tif (!$submitButton) {\n\t\t\t\t$submitButton = $field.closest('form').find('.submit');\n\t\t\t\t$field.data('submitButtonEl', $submitButton);\n\t\t\t}\n\t\t\t$field.tooltip('hide');\n\t\t\tif (len > this._commentMaxThreshold) {\n\t\t\t\t$field.attr('data-original-title', t('comments', 'Allowed characters {count} of {max}', {count: len, max: this._commentMaxLength}));\n\t\t\t\t$field.tooltip({trigger: 'manual'});\n\t\t\t\t$field.tooltip('show');\n\t\t\t\t$field.addClass('error');\n\t\t\t}\n\n\t\t\tvar limitExceeded = (len > this._commentMaxLength);\n\t\t\t$field.toggleClass('error', limitExceeded);\n\t\t\t$submitButton.prop('disabled', limitExceeded);\n\n\t\t\t// Submits form with Enter, but Shift+Enter is a new line. If the\n\t\t\t// autocomplete popover is being shown Enter does not submit the\n\t\t\t// form either; it will be handled by At.js which will add the\n\t\t\t// currently selected item to the message.\n\t\t\tif (ev.keyCode === 13 && !ev.shiftKey && !$field.atwho('isSelecting')) {\n\t\t\t\t$submitButton.click();\n\t\t\t\tev.preventDefault();\n\t\t\t}\n\t\t},\n\n\t\t_onClickComment: function(ev) {\n\t\t\tvar $row = $(ev.target);\n\t\t\tif (!$row.is('.comment')) {\n\t\t\t\t$row = $row.closest('.comment');\n\t\t\t}\n\t\t\t$row.removeClass('collapsed');\n\t\t},\n\n\t\t_onClickCloseComment: function(ev) {\n\t\t\tev.preventDefault();\n\t\t\tvar $row = $(ev.target).closest('.comment');\n\t\t\t$row.data('commentEl').removeClass('hidden');\n\t\t\t$row.remove();\n\t\t\treturn false;\n\t\t},\n\n\t\t_onClickDeleteComment: function(ev) {\n\t\t\tev.preventDefault();\n\t\t\tvar $comment = $(ev.target).closest('.comment');\n\t\t\tvar commentId = $comment.data('id');\n\t\t\tvar $loading = $comment.find('.deleteLoading');\n\t\t\tvar $moreIcon = $comment.find('.more');\n\n\t\t\t$comment.addClass('disabled');\n\t\t\t$loading.removeClass('hidden');\n\t\t\t$moreIcon.addClass('hidden');\n\n\t\t\t$comment.data('commentEl', $comment);\n\n\t\t\tthis.collection.get(commentId).destroy({\n\t\t\t\tsuccess: function() {\n\t\t\t\t\t$comment.data('commentEl').remove();\n\t\t\t\t\t$comment.remove();\n\t\t\t\t},\n\t\t\t\terror: function() {\n\t\t\t\t\t$loading.addClass('hidden');\n\t\t\t\t\t$moreIcon.removeClass('hidden');\n\t\t\t\t\t$comment.removeClass('disabled');\n\n\t\t\t\t\tOC.Notification.showTemporary(t('comments', 'Error occurred while retrieving comment with ID {id}', {id: commentId}));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn false;\n\t\t},\n\n\t\t_onClickShowMore: function(ev) {\n\t\t\tev.preventDefault();\n\t\t\tthis.nextPage();\n\t\t},\n\n\t\t/**\n\t\t * takes care of updating comment element states after submit (either new\n\t\t * comment or edit).\n\t\t *\n\t\t * @param {OC.Backbone.Model} model\n\t\t * @param {jQuery} $form\n\t\t * @private\n\t\t */\n\t\t_onSubmitSuccess: function(model, $form) {\n\t\t\tvar $submit = $form.find('.submit');\n\t\t\tvar $loading = $form.find('.submitLoading');\n\n\t\t\t$submit.removeClass('hidden');\n\t\t\t$loading.addClass('hidden');\n\t\t},\n\n\t\t_commentBodyHTML2Plain: function($el) {\n\t\t\tvar $comment = $el.clone();\n\n\t\t\t$comment.find('.avatar-name-wrapper').each(function () {\n\t\t\t\tvar $this = $(this),\n\t\t\t\t\t$inserted = $this.parent(),\n\t\t\t\t\tuserId = $this.find('.avatar').data('username');\n\t\t\t\tif (userId.indexOf(' ') !== -1) {\n\t\t\t\t\t$inserted.html('@\"' + userId + '\"');\n\t\t\t\t} else {\n\t\t\t\t\t$inserted.html('@' + userId);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t$comment.html(OCP.Comments.richToPlain($comment.html()));\n\n\t\t\tvar oldHtml;\n\t\t\tvar html = $comment.html();\n\t\t\tdo {\n\t\t\t\t// replace works one by one\n\t\t\t\toldHtml = html;\n\t\t\t\thtml = oldHtml.replace(\"<br>\", \"\\n\");\t// preserve line breaks\n\t\t\t} while(oldHtml !== html);\n\t\t\t$comment.html(html);\n\n\t\t\treturn $comment.text();\n\t\t},\n\n\t\t_onSubmitComment: function(e) {\n\t\t\tvar self = this;\n\t\t\tvar $form = $(e.target);\n\t\t\tvar commentId = $form.closest('.comment').data('id');\n\t\t\tvar currentUser = OC.getCurrentUser();\n\t\t\tvar $submit = $form.find('.submit');\n\t\t\tvar $loading = $form.find('.submitLoading');\n\t\t\tvar $commentField = $form.find('.message');\n\t\t\tvar message = $commentField.text().trim();\n\t\t\te.preventDefault();\n\n\t\t\tif (!message.length || message.length > this._commentMaxLength) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$commentField.prop('contenteditable', false);\n\t\t\t$submit.addClass('hidden');\n\t\t\t$loading.removeClass('hidden');\n\n\t\t\tmessage = this._commentBodyHTML2Plain($commentField);\n\t\t\tif (commentId) {\n\t\t\t\t// edit mode\n\t\t\t\tvar comment = this.collection.get(commentId);\n\t\t\t\tcomment.save({\n\t\t\t\t\tmessage: message\n\t\t\t\t}, {\n\t\t\t\t\tsuccess: function(model) {\n\t\t\t\t\t\tself._onSubmitSuccess(model, $form);\n\t\t\t\t\t\tif(model.get('message').trim() === model.previous('message').trim()) {\n\t\t\t\t\t\t\t// model change event doesn't trigger, manually remove the row.\n\t\t\t\t\t\t\tvar $row = $form.closest('.comment');\n\t\t\t\t\t\t\t$row.data('commentEl').removeClass('hidden');\n\t\t\t\t\t\t\t$row.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\terror: function() {\n\t\t\t\t\t\tself._onSubmitError($form, commentId);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.collection.create({\n\t\t\t\t\tactorId: currentUser.uid,\n\t\t\t\t\tactorDisplayName: currentUser.displayName,\n\t\t\t\t\tactorType: 'users',\n\t\t\t\t\tverb: 'comment',\n\t\t\t\t\tmessage: message,\n\t\t\t\t\tcreationDateTime: (new Date()).toUTCString()\n\t\t\t\t}, {\n\t\t\t\t\tat: 0,\n\t\t\t\t\t// wait for real creation before adding\n\t\t\t\t\twait: true,\n\t\t\t\t\tsuccess: function(model) {\n\t\t\t\t\t\tself._onSubmitSuccess(model, $form);\n\t\t\t\t\t},\n\t\t\t\t\terror: function() {\n\t\t\t\t\t\tself._onSubmitError($form, undefined);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\n\t\t/**\n\t\t * takes care of updating the UI after an error on submit (either new\n\t\t * comment or edit).\n\t\t *\n\t\t * @param {jQuery} $form\n\t\t * @param {string|undefined} commentId\n\t\t * @private\n\t\t */\n\t\t_onSubmitError: function($form, commentId) {\n\t\t\t$form.find('.submit').removeClass('hidden');\n\t\t\t$form.find('.submitLoading').addClass('hidden');\n\t\t\t$form.find('.message').prop('contenteditable', true);\n\n\t\t\tif(!_.isUndefined(commentId)) {\n\t\t\t\tOC.Notification.show(t('comments', 'Error occurred while updating comment with id {id}', {id: commentId}), {type: 'error'});\n\t\t\t} else {\n\t\t\t\tOC.Notification.show(t('comments', 'Error occurred while posting comment'), {type: 'error'});\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * ensures the contenteditable div is really empty, when user removed\n\t\t * all input, so that the placeholder will be shown again\n\t\t *\n\t\t * @private\n\t\t */\n\t\t_onTextChange: function() {\n\t\t\tvar $message = $('#commentsTabView').find('.newCommentForm div.message');\n\t\t\tif(!$message.text().trim().length) {\n\t\t\t\t$message.empty();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Limit pasting to plain text\n\t\t *\n\t\t * @param e\n\t\t * @private\n\t\t */\n\t\t_onPaste: function (e) {\n\t\t\te.preventDefault();\n\t\t\tvar text = e.originalEvent.clipboardData.getData(\"text/plain\");\n\t\t\tdocument.execCommand('insertText', false, text);\n\t\t},\n\n\t\t/**\n\t\t * Returns whether the given message is long and needs\n\t\t * collapsing\n\t\t */\n\t\t_isLong: function(message) {\n\t\t\treturn message.length > 250 || (message.match(/\\n/g) || []).length > 1;\n\t\t}\n\t});\n\n\tOCA.Comments.CommentsTabView = CommentsTabView;\n})(OC, OCA);\n","/*\n * Copyright (c) 2018\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\n/* global Handlebars */\n(function() {\n\n\t/**\n\t * Construct a new CommentsModifyMenuinstance\n\t * @constructs CommentsModifyMenu\n\t * @memberof OC.Comments\n\t * @private\n\t */\n\tvar CommentsModifyMenu = OC.Backbone.View.extend({\n\t\ttagName: 'div',\n\t\tclassName: 'commentsModifyMenu popovermenu bubble menu',\n\t\t_scopes: [\n\t\t\t{\n\t\t\t\tname: 'edit',\n\t\t\t\tdisplayName: t('comments', 'Edit comment'),\n\t\t\t\ticonClass: 'icon-rename'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'delete',\n\t\t\t\tdisplayName: t('comments', 'Delete comment'),\n\t\t\t\ticonClass: 'icon-delete'\n\t\t\t}\n\t\t],\n\t\tinitialize: function() {\n\n\t\t},\n\t\tevents: {\n\t\t\t'click a.action': '_onClickAction'\n\t\t},\n\n\t\t/**\n\t\t * Event handler whenever an action has been clicked within the menu\n\t\t *\n\t\t * @param {Object} event event object\n\t\t */\n\t\t_onClickAction: function(event) {\n\t\t\tvar $target = $(event.currentTarget);\n\t\t\tif (!$target.hasClass('menuitem')) {\n\t\t\t\t$target = $target.closest('.menuitem');\n\t\t\t}\n\n\t\t\tOC.hideMenus();\n\n\t\t\tthis.trigger('select:menu-item-clicked', event, $target.data('action'));\n\t\t},\n\n\t\t/**\n\t\t * Renders the menu with the currently set items\n\t\t */\n\t\trender: function() {\n\t\t\tthis.$el.html(OCA.Comments.Templates['commentsmodifymenu']({\n\t\t\t\titems: this._scopes\n\t\t\t}));\n\t\t},\n\n\t\t/**\n\t\t * Displays the menu\n\t\t */\n\t\tshow: function(context) {\n\t\t\tthis._context = context;\n\n\t\t\tfor(var i in this._scopes) {\n\t\t\t\tthis._scopes[i].active = false;\n\t\t\t}\n\n\n\t\t\tvar $el = $(context.target);\n\t\t\tvar offsetIcon = $el.offset();\n\t\t\tvar offsetContainer = $el.closest('.authorRow').offset();\n\n\t\t\t// adding some extra top offset to push the menu below the button.\n\t\t\tvar position = {\n\t\t\t\ttop: offsetIcon.top - offsetContainer.top + 48,\n\t\t\t\tleft: '',\n\t\t\t\tright: ''\n\t\t\t};\n\n\t\t\tposition.left = offsetIcon.left - offsetContainer.left;\n\n\t\t\tif (position.left > 200) {\n\t\t\t\t// we need to position the menu to the right.\n\t\t\t\tposition.left = '';\n\t\t\t\tposition.right = this.$el.closest('.comment').find('.date').width();\n\t\t\t\tthis.$el.removeClass('menu-left').addClass('menu-right');\n\t\t\t} else {\n\t\t\t\tthis.$el.removeClass('menu-right').addClass('menu-left');\n\t\t\t}\n\t\t\tthis.$el.css(position);\n\t\t\tthis.render();\n\t\t\tthis.$el.removeClass('hidden');\n\n\t\t\tOC.showMenu(null, this.$el);\n\t\t}\n\t});\n\n\tOCA.Comments = OCA.Comments || {};\n\tOCA.Comments.CommentsModifyMenu = CommentsModifyMenu;\n})(OC, OCA);\n","/*\n * Copyright (c) 2016 Vincent Petry <pvince81@owncloud.com>\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\n/* global Handlebars */\n\n(function() {\n\n\t_.extend(OC.Files.Client, {\n\t\tPROPERTY_COMMENTS_UNREAD:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}comments-unread'\n\t});\n\n\tOCA.Comments = _.extend({}, OCA.Comments);\n\tif (!OCA.Comments) {\n\t\t/**\n\t\t * @namespace\n\t\t */\n\t\tOCA.Comments = {};\n\t}\n\n\t/**\n\t * @namespace\n\t */\n\tOCA.Comments.FilesPlugin = {\n\t\tignoreLists: [\n\t\t\t'files_trashbin',\n\t\t\t'files.public'\n\t\t],\n\n\t\t_formatCommentCount: function(count) {\n\t\t\treturn OCA.Comments.Templates['filesplugin']({\n\t\t\t\tcount: count,\n\t\t\t\tcountMessage: n('comments', '%n unread comment', '%n unread comments', count),\n\t\t\t\ticonUrl: OC.imagePath('core', 'actions/comment')\n\t\t\t});\n\t\t},\n\n\t\tattach: function(fileList) {\n\t\t\tvar self = this;\n\t\t\tif (this.ignoreLists.indexOf(fileList.id) >= 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfileList.registerTabView(new OCA.Comments.CommentsTabView('commentsTabView'));\n\n\t\t\tvar oldGetWebdavProperties = fileList._getWebdavProperties;\n\t\t\tfileList._getWebdavProperties = function() {\n\t\t\t\tvar props = oldGetWebdavProperties.apply(this, arguments);\n\t\t\t\tprops.push(OC.Files.Client.PROPERTY_COMMENTS_UNREAD);\n\t\t\t\treturn props;\n\t\t\t};\n\n\t\t\tfileList.filesClient.addFileInfoParser(function(response) {\n\t\t\t\tvar data = {};\n\t\t\t\tvar props = response.propStat[0].properties;\n\t\t\t\tvar commentsUnread = props[OC.Files.Client.PROPERTY_COMMENTS_UNREAD];\n\t\t\t\tif (!_.isUndefined(commentsUnread) && commentsUnread !== '') {\n\t\t\t\t\tdata.commentsUnread = parseInt(commentsUnread, 10);\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\t});\n\n\t\t\tfileList.$el.addClass('has-comments');\n\t\t\tvar oldCreateRow = fileList._createRow;\n\t\t\tfileList._createRow = function(fileData) {\n\t\t\t\tvar $tr = oldCreateRow.apply(this, arguments);\n\t\t\t\tif (fileData.commentsUnread) {\n\t\t\t\t\t$tr.attr('data-comments-unread', fileData.commentsUnread);\n\t\t\t\t}\n\t\t\t\treturn $tr;\n\t\t\t};\n\n\t\t\t// register \"comment\" action for reading comments\n\t\t\tfileList.fileActions.registerAction({\n\t\t\t\tname: 'Comment',\n\t\t\t\tdisplayName: t('comments', 'Comment'),\n\t\t\t\tmime: 'all',\n\t\t\t\tpermissions: OC.PERMISSION_READ,\n\t\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\t\trender: function(actionSpec, isDefault, context) {\n\t\t\t\t\tvar $file = context.$file;\n\t\t\t\t\tvar unreadComments = $file.data('comments-unread');\n\t\t\t\t\tif (unreadComments) {\n\t\t\t\t\t\tvar $actionLink = $(self._formatCommentCount(unreadComments));\n\t\t\t\t\t\tcontext.$file.find('a.name>span.fileactions').append($actionLink);\n\t\t\t\t\t\treturn $actionLink;\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tactionHandler: function(fileName, context) {\n\t\t\t\t\tcontext.$file.find('.action-comment').tooltip('hide');\n\t\t\t\t\t// open sidebar in comments section\n\t\t\t\t\tcontext.fileList.showDetailsView(fileName, 'commentsTabView');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// add attribute to \"elementToFile\"\n\t\t\tvar oldElementToFile = fileList.elementToFile;\n\t\t\tfileList.elementToFile = function($el) {\n\t\t\t\tvar fileInfo = oldElementToFile.apply(this, arguments);\n\t\t\t\tvar commentsUnread = $el.data('comments-unread');\n\t\t\t\tif (commentsUnread) {\n\t\t\t\t\tfileInfo.commentsUnread = commentsUnread;\n\t\t\t\t}\n\t\t\t\treturn fileInfo;\n\t\t\t};\n\t\t}\n\t};\n\n})();\n\nOC.Plugins.register('OCA.Files.FileList', OCA.Comments.FilesPlugin);\n","/*\n * @author Joas Schilling <coding@schilljs.com>\n * Copyright (c) 2016\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n */\n\n(function() {\n\tOCA.Comments.ActivityTabViewPlugin = {\n\n\t\t/**\n\t\t * Prepare activity for display\n\t\t *\n\t\t * @param {OCA.Activity.ActivityModel} model for this activity\n\t\t * @param {jQuery} $el jQuery handle for this activity\n\t\t * @param {string} view The view that displayes this activity\n\t\t */\n\t\tprepareModelForDisplay: function (model, $el, view) {\n\t\t\tif (model.get('app') !== 'comments' || model.get('type') !== 'comments') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (view === 'ActivityTabView') {\n\t\t\t\t$el.addClass('comment');\n\t\t\t\tif (model.get('message') && this._isLong(model.get('message'))) {\n\t\t\t\t\t$el.addClass('collapsed');\n\t\t\t\t\tvar $overlay = $('<div>').addClass('message-overlay');\n\t\t\t\t\t$el.find('.activitymessage').after($overlay);\n\t\t\t\t\t$el.on('click', this._onClickCollapsedComment);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/*\n\t\t * Copy of CommentsTabView._onClickComment()\n\t\t */\n\t\t_onClickCollapsedComment: function(ev) {\n\t\t\tvar $row = $(ev.target);\n\t\t\tif (!$row.is('.comment')) {\n\t\t\t\t$row = $row.closest('.comment');\n\t\t\t}\n\t\t\t$row.removeClass('collapsed');\n\t\t},\n\n\t\t/*\n\t\t * Copy of CommentsTabView._isLong()\n\t\t */\n\t\t_isLong: function(message) {\n\t\t\treturn message.length > 250 || (message.match(/\\n/g) || []).length > 1;\n\t\t}\n\t};\n\n\n})();\n\nOC.Plugins.register('OCA.Activity.RenderingPlugins', OCA.Comments.ActivityTabViewPlugin);\n","/*\n * Copyright (c) 2014\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n(function(OC, OCA, $) {\n\t\"use strict\";\n\n\t/**\n\t * Construct a new FileActions instance\n\t * @constructs Files\n\t */\n\tvar Comment = function() {\n\t\tthis.initialize();\n\t};\n\n\tComment.prototype = {\n\n\t\tfileList: null,\n\n\t\t/**\n\t\t * Initialize the file search\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tvar self = this;\n\n\t\t\tthis.fileAppLoaded = function() {\n\t\t\t\treturn !!OCA.Files && !!OCA.Files.App;\n\t\t\t};\n\t\t\tfunction inFileList($row, result) {\n\t\t\t\treturn false;\n\n\t\t\t\tif (! self.fileAppLoaded()) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tvar dir = self.fileList.getCurrentDirectory().replace(/\\/+$/,'');\n\t\t\t\tvar resultDir = OC.dirname(result.path);\n\t\t\t\treturn dir === resultDir && self.fileList.inList(result.name);\n\t\t\t}\n\t\t\tfunction hideNoFilterResults() {\n\t\t\t\tvar $nofilterresults = $('.nofilterresults');\n\t\t\t\tif ( ! $nofilterresults.hasClass('hidden') ) {\n\t\t\t\t\t$nofilterresults.addClass('hidden');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t *\n\t\t\t * @param {jQuery} $row\n\t\t\t * @param {Object} result\n\t\t\t * @param {int} result.id\n\t\t\t * @param {string} result.comment\n\t\t\t * @param {string} result.authorId\n\t\t\t * @param {string} result.authorName\n\t\t\t * @param {string} result.link\n\t\t\t * @param {string} result.fileName\n\t\t\t * @param {string} result.path\n\t\t\t * @returns {*}\n\t\t\t */\n\t\t\tthis.renderCommentResult = function($row, result) {\n\t\t\t\tif (inFileList($row, result)) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\thideNoFilterResults();\n\t\t\t\t/*render preview icon, show path beneath filename,\n\t\t\t\t show size and last modified date on the right */\n\t\t\t\tthis.updateLegacyMimetype(result);\n\n\t\t\t\tvar $pathDiv = $('<div>').addClass('path').text(result.path);\n\n\t\t\t\tvar $avatar = $('<div>');\n\t\t\t\t$avatar.addClass('avatar')\n\t\t\t\t\t.css('display', 'inline-block')\n\t\t\t\t\t.css('vertical-align', 'middle')\n\t\t\t\t\t.css('margin', '0 5px 2px 3px');\n\n\t\t\t\tif (result.authorName) {\n\t\t\t\t\t$avatar.avatar(result.authorId, 21, undefined, false, undefined, result.authorName);\n\t\t\t\t} else {\n\t\t\t\t\t$avatar.avatar(result.authorId, 21);\n\t\t\t\t}\n\n\t\t\t\t$row.find('td.info div.name').after($pathDiv).text(result.comment).prepend($('<span>').addClass('path').css('margin-right', '5px').text(result.authorName)).prepend($avatar);\n\t\t\t\t$row.find('td.result a').attr('href', result.link);\n\n\t\t\t\t$row.find('td.icon')\n\t\t\t\t\t.css('background-image', 'url(' + OC.imagePath('core', 'actions/comment') + ')')\n\t\t\t\t\t.css('opacity', '.4');\n\t\t\t\tvar dir = OC.dirname(result.path);\n\t\t\t\t// \"result.path\" does not include a leading \"/\", so \"OC.dirname\"\n\t\t\t\t// returns the path itself for files or folders in the root.\n\t\t\t\tif (dir === result.path) {\n\t\t\t\t\tdir = '/';\n\t\t\t\t}\n\t\t\t\t$row.find('td.info a').attr('href',\n\t\t\t\t\tOC.generateUrl('/apps/files/?dir={dir}&scrollto={scrollto}', {dir: dir, scrollto: result.fileName})\n\t\t\t\t);\n\n\t\t\t\treturn $row;\n\t\t\t};\n\n\t\t\tthis.handleCommentClick = function($row, result, event) {\n\t\t\t\tif (self.fileAppLoaded() && self.fileList.id === 'files') {\n\t\t\t\t\tself.fileList.changeDirectory(OC.dirname(result.path));\n\t\t\t\t\tself.fileList.scrollTo(result.name);\n\t\t\t\t\treturn false;\n\t\t\t\t} else {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.updateLegacyMimetype = function (result) {\n\t\t\t\t// backward compatibility:\n\t\t\t\tif (!result.mime && result.mime_type) {\n\t\t\t\t\tresult.mime = result.mime_type;\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.setFileList = function (fileList) {\n\t\t\t\tthis.fileList = fileList;\n\t\t\t};\n\n\t\t\tOC.Plugins.register('OCA.Search.Core', this);\n\t\t},\n\t\tattach: function(search) {\n\t\t\tsearch.setRenderer('comment', this.renderCommentResult.bind(this));\n\t\t\tsearch.setHandler('comment', this.handleCommentClick.bind(this));\n\t\t}\n\t};\n\n\tOCA.Search.comment = new Comment();\n})(OC, OCA, $);\n","/*! jquery.caret 2015-02-01 */\n!function(a,b){\"function\"==typeof define&&define.amd?define([\"jquery\"],function(c){return a.returnExportsGlobal=b(c)}):\"object\"==typeof exports?module.exports=b(require(\"jquery\")):b(jQuery)}(this,function(a){\"use strict\";var b,c,d,e,f,g,h,i,j,k,l;k=\"caret\",b=function(){function b(a){this.$inputor=a,this.domInputor=this.$inputor[0]}return b.prototype.setPos=function(){return this.domInputor},b.prototype.getIEPosition=function(){return this.getPosition()},b.prototype.getPosition=function(){var a,b;return b=this.getOffset(),a=this.$inputor.offset(),b.left-=a.left,b.top-=a.top,b},b.prototype.getOldIEPos=function(){var a,b;return b=h.selection.createRange(),a=h.body.createTextRange(),a.moveToElementText(this.domInputor),a.setEndPoint(\"EndToEnd\",b),a.text.length},b.prototype.getPos=function(){var a,b,c;return(c=this.range())?(a=c.cloneRange(),a.selectNodeContents(this.domInputor),a.setEnd(c.endContainer,c.endOffset),b=a.toString().length,a.detach(),b):h.selection?this.getOldIEPos():void 0},b.prototype.getOldIEOffset=function(){var a,b;return a=h.selection.createRange().duplicate(),a.moveStart(\"character\",-1),b=a.getBoundingClientRect(),{height:b.bottom-b.top,left:b.left,top:b.top}},b.prototype.getOffset=function(){var b,c,d,e,f;return j.getSelection&&(d=this.range())?(d.endOffset-1>0&&d.endContainer===!this.domInputor&&(b=d.cloneRange(),b.setStart(d.endContainer,d.endOffset-1),b.setEnd(d.endContainer,d.endOffset),e=b.getBoundingClientRect(),c={height:e.height,left:e.left+e.width,top:e.top},b.detach()),c&&0!==(null!=c?c.height:void 0)||(b=d.cloneRange(),f=a(h.createTextNode(\"|\")),b.insertNode(f[0]),b.selectNode(f[0]),e=b.getBoundingClientRect(),c={height:e.height,left:e.left,top:e.top},f.remove(),b.detach())):h.selection&&(c=this.getOldIEOffset()),c&&(c.top+=a(j).scrollTop(),c.left+=a(j).scrollLeft()),c},b.prototype.range=function(){var a;if(j.getSelection)return a=j.getSelection(),a.rangeCount>0?a.getRangeAt(0):null},b}(),c=function(){function b(a){this.$inputor=a,this.domInputor=this.$inputor[0]}return b.prototype.getIEPos=function(){var a,b,c,d,e,f,g;return b=this.domInputor,f=h.selection.createRange(),e=0,f&&f.parentElement()===b&&(d=b.value.replace(/\\r\\n/g,\"\\n\"),c=d.length,g=b.createTextRange(),g.moveToBookmark(f.getBookmark()),a=b.createTextRange(),a.collapse(!1),e=g.compareEndPoints(\"StartToEnd\",a)>-1?c:-g.moveStart(\"character\",-c)),e},b.prototype.getPos=function(){return h.selection?this.getIEPos():this.domInputor.selectionStart},b.prototype.setPos=function(a){var b,c;return b=this.domInputor,h.selection?(c=b.createTextRange(),c.move(\"character\",a),c.select()):b.setSelectionRange&&b.setSelectionRange(a,a),b},b.prototype.getIEOffset=function(a){var b,c,d,e;return c=this.domInputor.createTextRange(),a||(a=this.getPos()),c.move(\"character\",a),d=c.boundingLeft,e=c.boundingTop,b=c.boundingHeight,{left:d,top:e,height:b}},b.prototype.getOffset=function(b){var c,d,e;return c=this.$inputor,h.selection?(d=this.getIEOffset(b),d.top+=a(j).scrollTop()+c.scrollTop(),d.left+=a(j).scrollLeft()+c.scrollLeft(),d):(d=c.offset(),e=this.getPosition(b),d={left:d.left+e.left-c.scrollLeft(),top:d.top+e.top-c.scrollTop(),height:e.height})},b.prototype.getPosition=function(a){var b,c,e,f,g,h,i;return b=this.$inputor,f=function(a){return a=a.replace(/<|>|`|\"|&/g,\"?\").replace(/\\r\\n|\\r|\\n/g,\"<br/>\"),/firefox/i.test(navigator.userAgent)&&(a=a.replace(/\\s/g,\"&nbsp;\")),a},void 0===a&&(a=this.getPos()),i=b.val().slice(0,a),e=b.val().slice(a),g=\"<span style='position: relative; display: inline;'>\"+f(i)+\"</span>\",g+=\"<span id='caret' style='position: relative; display: inline;'>|</span>\",g+=\"<span style='position: relative; display: inline;'>\"+f(e)+\"</span>\",h=new d(b),c=h.create(g).rect()},b.prototype.getIEPosition=function(a){var b,c,d,e,f;return d=this.getIEOffset(a),c=this.$inputor.offset(),e=d.left-c.left,f=d.top-c.top,b=d.height,{left:e,top:f,height:b}},b}(),d=function(){function b(a){this.$inputor=a}return b.prototype.css_attr=[\"borderBottomWidth\",\"borderLeftWidth\",\"borderRightWidth\",\"borderTopStyle\",\"borderRightStyle\",\"borderBottomStyle\",\"borderLeftStyle\",\"borderTopWidth\",\"boxSizing\",\"fontFamily\",\"fontSize\",\"fontWeight\",\"height\",\"letterSpacing\",\"lineHeight\",\"marginBottom\",\"marginLeft\",\"marginRight\",\"marginTop\",\"outlineWidth\",\"overflow\",\"overflowX\",\"overflowY\",\"paddingBottom\",\"paddingLeft\",\"paddingRight\",\"paddingTop\",\"textAlign\",\"textOverflow\",\"textTransform\",\"whiteSpace\",\"wordBreak\",\"wordWrap\"],b.prototype.mirrorCss=function(){var b,c=this;return b={position:\"absolute\",left:-9999,top:0,zIndex:-2e4},\"TEXTAREA\"===this.$inputor.prop(\"tagName\")&&this.css_attr.push(\"width\"),a.each(this.css_attr,function(a,d){return b[d]=c.$inputor.css(d)}),b},b.prototype.create=function(b){return this.$mirror=a(\"<div></div>\"),this.$mirror.css(this.mirrorCss()),this.$mirror.html(b),this.$inputor.after(this.$mirror),this},b.prototype.rect=function(){var a,b,c;return a=this.$mirror.find(\"#caret\"),b=a.position(),c={left:b.left,top:b.top,height:a.height()},this.$mirror.remove(),c},b}(),e={contentEditable:function(a){return!(!a[0].contentEditable||\"true\"!==a[0].contentEditable)}},g={pos:function(a){return a||0===a?this.setPos(a):this.getPos()},position:function(a){return h.selection?this.getIEPosition(a):this.getPosition(a)},offset:function(a){var b;return b=this.getOffset(a)}},h=null,j=null,i=null,l=function(a){var b;return(b=null!=a?a.iframe:void 0)?(i=b,j=b.contentWindow,h=b.contentDocument||j.document):(i=void 0,j=window,h=document)},f=function(a){var b;h=a[0].ownerDocument,j=h.defaultView||h.parentWindow;try{return i=j.frameElement}catch(c){b=c}},a.fn.caret=function(d,f,h){var i;return g[d]?(a.isPlainObject(f)?(l(f),f=void 0):l(h),i=e.contentEditable(this)?new b(this):new c(this),g[d].apply(i,[f])):a.error(\"Method \"+d+\" does not exist on jQuery.caret\")},a.fn.caret.EditableCaret=b,a.fn.caret.InputCaret=c,a.fn.caret.Utils=e,a.fn.caret.apis=g});","!function(t,e){\"function\"==typeof define&&define.amd?define([\"jquery\"],function(t){return e(t)}):\"object\"==typeof exports?module.exports=e(require(\"jquery\")):e(jQuery)}(this,function(t){var e,i;i={ESC:27,TAB:9,ENTER:13,CTRL:17,A:65,P:80,N:78,LEFT:37,UP:38,RIGHT:39,DOWN:40,BACKSPACE:8,SPACE:32},e={beforeSave:function(t){return r.arrayToDefaultHash(t)},matcher:function(t,e,i,n){var r,o,s,a,h;return t=t.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g,\"\\\\$&\"),i&&(t=\"(?:^|\\\\s)\"+t),r=decodeURI(\"%C3%80\"),o=decodeURI(\"%C3%BF\"),h=n?\" \":\"\",a=new RegExp(t+\"([A-Za-z\"+r+\"-\"+o+\"0-9_\"+h+\"'.+-]*)$|\"+t+\"([^\\\\x00-\\\\xff]*)$\",\"gi\"),s=a.exec(e),s?s[2]||s[1]:null},filter:function(t,e,i){var n,r,o,s;for(n=[],r=0,s=e.length;s>r;r++)o=e[r],~new String(o[i]).toLowerCase().indexOf(t.toLowerCase())&&n.push(o);return n},remoteFilter:null,sorter:function(t,e,i){var n,r,o,s;if(!t)return e;for(n=[],r=0,s=e.length;s>r;r++)o=e[r],o.atwho_order=new String(o[i]).toLowerCase().indexOf(t.toLowerCase()),o.atwho_order>-1&&n.push(o);return n.sort(function(t,e){return t.atwho_order-e.atwho_order})},tplEval:function(t,e){var i,n,r;r=t;try{return\"string\"!=typeof t&&(r=t(e)),r.replace(/\\$\\{([^\\}]*)\\}/g,function(t,i,n){return e[i]})}catch(n){return i=n,\"\"}},highlighter:function(t,e){var i;return e?(i=new RegExp(\">\\\\s*([^<]*?)(\"+e.replace(\"+\",\"\\\\+\")+\")([^<]*)\\\\s*<\",\"ig\"),t.replace(i,function(t,e,i,n){return\"> \"+e+\"<strong>\"+i+\"</strong>\"+n+\" <\"})):t},beforeInsert:function(t,e,i){return t},beforeReposition:function(t){return t},afterMatchFailed:function(t,e){}};var n;n=function(){function e(e){this.currentFlag=null,this.controllers={},this.aliasMaps={},this.$inputor=t(e),this.setupRootElement(),this.listen()}return e.prototype.createContainer=function(e){var i;return null!=(i=this.$el)&&i.remove(),t(e.body).append(this.$el=t(\"<div class='atwho-container'></div>\"))},e.prototype.setupRootElement=function(e,i){var n,r;if(null==i&&(i=!1),e)this.window=e.contentWindow,this.document=e.contentDocument||this.window.document,this.iframe=e;else{this.document=this.$inputor[0].ownerDocument,this.window=this.document.defaultView||this.document.parentWindow;try{this.iframe=this.window.frameElement}catch(r){if(n=r,this.iframe=null,t.fn.atwho.debug)throw new Error(\"iframe auto-discovery is failed.\\nPlease use `setIframe` to set the target iframe manually.\\n\"+n)}}return this.createContainer((this.iframeAsRoot=i)?this.document:document)},e.prototype.controller=function(t){var e,i,n,r;if(this.aliasMaps[t])i=this.controllers[this.aliasMaps[t]];else{r=this.controllers;for(n in r)if(e=r[n],n===t){i=e;break}}return i?i:this.controllers[this.currentFlag]},e.prototype.setContextFor=function(t){return this.currentFlag=t,this},e.prototype.reg=function(t,e){var i,n;return n=(i=this.controllers)[t]||(i[t]=this.$inputor.is(\"[contentEditable]\")?new l(this,t):new s(this,t)),e.alias&&(this.aliasMaps[e.alias]=t),n.init(e),this},e.prototype.listen=function(){return this.$inputor.on(\"compositionstart\",function(t){return function(e){var i;return null!=(i=t.controller())&&i.view.hide(),t.isComposing=!0,null}}(this)).on(\"compositionend\",function(t){return function(e){return t.isComposing=!1,setTimeout(function(e){return t.dispatch(e)}),null}}(this)).on(\"keyup.atwhoInner\",function(t){return function(e){return t.onKeyup(e)}}(this)).on(\"keydown.atwhoInner\",function(t){return function(e){return t.onKeydown(e)}}(this)).on(\"blur.atwhoInner\",function(t){return function(e){var i;return(i=t.controller())?(i.expectedQueryCBId=null,i.view.hide(e,i.getOpt(\"displayTimeout\"))):void 0}}(this)).on(\"click.atwhoInner\",function(t){return function(e){return t.dispatch(e)}}(this)).on(\"scroll.atwhoInner\",function(t){return function(){var e;return e=t.$inputor.scrollTop(),function(i){var n,r;return n=i.target.scrollTop,e!==n&&null!=(r=t.controller())&&r.view.hide(i),e=n,!0}}}(this)())},e.prototype.shutdown=function(){var t,e,i;i=this.controllers;for(t in i)e=i[t],e.destroy(),delete this.controllers[t];return this.$inputor.off(\".atwhoInner\"),this.$el.remove()},e.prototype.dispatch=function(t){var e,i,n,r;n=this.controllers,r=[];for(e in n)i=n[e],r.push(i.lookUp(t));return r},e.prototype.onKeyup=function(e){var n;switch(e.keyCode){case i.ESC:e.preventDefault(),null!=(n=this.controller())&&n.view.hide();break;case i.DOWN:case i.UP:case i.CTRL:case i.ENTER:t.noop();break;case i.P:case i.N:e.ctrlKey||this.dispatch(e);break;default:this.dispatch(e)}},e.prototype.onKeydown=function(e){var n,r;if(r=null!=(n=this.controller())?n.view:void 0,r&&r.visible())switch(e.keyCode){case i.ESC:e.preventDefault(),r.hide(e);break;case i.UP:e.preventDefault(),r.prev();break;case i.DOWN:e.preventDefault(),r.next();break;case i.P:if(!e.ctrlKey)return;e.preventDefault(),r.prev();break;case i.N:if(!e.ctrlKey)return;e.preventDefault(),r.next();break;case i.TAB:case i.ENTER:case i.SPACE:if(!r.visible())return;if(!this.controller().getOpt(\"spaceSelectsMatch\")&&e.keyCode===i.SPACE)return;if(!this.controller().getOpt(\"tabSelectsMatch\")&&e.keyCode===i.TAB)return;r.highlighted()?(e.preventDefault(),r.choose(e)):r.hide(e);break;default:t.noop()}},e}();var r,o=[].slice;r=function(){function i(e,i){this.app=e,this.at=i,this.$inputor=this.app.$inputor,this.id=this.$inputor[0].id||this.uid(),this.expectedQueryCBId=null,this.setting=null,this.query=null,this.pos=0,this.range=null,0===(this.$el=t(\"#atwho-ground-\"+this.id,this.app.$el)).length&&this.app.$el.append(this.$el=t(\"<div id='atwho-ground-\"+this.id+\"'></div>\")),this.model=new u(this),this.view=new c(this)}return i.prototype.uid=function(){return(Math.random().toString(16)+\"000000000\").substr(2,8)+(new Date).getTime()},i.prototype.init=function(e){return this.setting=t.extend({},this.setting||t.fn.atwho[\"default\"],e),this.view.init(),this.model.reload(this.setting.data)},i.prototype.destroy=function(){return this.trigger(\"beforeDestroy\"),this.model.destroy(),this.view.destroy(),this.$el.remove()},i.prototype.callDefault=function(){var i,n,r,s;s=arguments[0],i=2<=arguments.length?o.call(arguments,1):[];try{return e[s].apply(this,i)}catch(r){return n=r,t.error(n+\" Or maybe At.js doesn't have function \"+s)}},i.prototype.trigger=function(t,e){var i,n;return null==e&&(e=[]),e.push(this),i=this.getOpt(\"alias\"),n=i?t+\"-\"+i+\".atwho\":t+\".atwho\",this.$inputor.trigger(n,e)},i.prototype.callbacks=function(t){return this.getOpt(\"callbacks\")[t]||e[t]},i.prototype.getOpt=function(t,e){var i,n;try{return this.setting[t]}catch(n){return i=n,null}},i.prototype.insertContentFor=function(e){var i,n;return n=this.getOpt(\"insertTpl\"),i=t.extend({},e.data(\"item-data\"),{\"atwho-at\":this.at}),this.callbacks(\"tplEval\").call(this,n,i,\"onInsert\")},i.prototype.renderView=function(t){var e;return e=this.getOpt(\"searchKey\"),t=this.callbacks(\"sorter\").call(this,this.query.text,t.slice(0,1001),e),this.view.render(t.slice(0,this.getOpt(\"limit\")))},i.arrayToDefaultHash=function(e){var i,n,r,o;if(!t.isArray(e))return e;for(o=[],i=0,r=e.length;r>i;i++)n=e[i],t.isPlainObject(n)?o.push(n):o.push({name:n});return o},i.prototype.lookUp=function(t){var e,i;if((!t||\"click\"!==t.type||this.getOpt(\"lookUpOnClick\"))&&(!this.getOpt(\"suspendOnComposing\")||!this.app.isComposing))return(e=this.catchQuery(t))?(this.app.setContextFor(this.at),(i=this.getOpt(\"delay\"))?this._delayLookUp(e,i):this._lookUp(e),e):(this.expectedQueryCBId=null,e)},i.prototype._delayLookUp=function(t,e){var i,n;return i=Date.now?Date.now():(new Date).getTime(),this.previousCallTime||(this.previousCallTime=i),n=e-(i-this.previousCallTime),n>0&&e>n?(this.previousCallTime=i,this._stopDelayedCall(),this.delayedCallTimeout=setTimeout(function(e){return function(){return e.previousCallTime=0,e.delayedCallTimeout=null,e._lookUp(t)}}(this),e)):(this._stopDelayedCall(),this.previousCallTime!==i&&(this.previousCallTime=0),this._lookUp(t))},i.prototype._stopDelayedCall=function(){return this.delayedCallTimeout?(clearTimeout(this.delayedCallTimeout),this.delayedCallTimeout=null):void 0},i.prototype._generateQueryCBId=function(){return{}},i.prototype._lookUp=function(e){var i;return i=function(t,e){return t===this.expectedQueryCBId?e&&e.length>0?this.renderView(this.constructor.arrayToDefaultHash(e)):this.view.hide():void 0},this.expectedQueryCBId=this._generateQueryCBId(),this.model.query(e.text,t.proxy(i,this,this.expectedQueryCBId))},i}();var s,a=function(t,e){function i(){this.constructor=t}for(var n in e)h.call(e,n)&&(t[n]=e[n]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},h={}.hasOwnProperty;s=function(e){function i(){return i.__super__.constructor.apply(this,arguments)}return a(i,e),i.prototype.catchQuery=function(){var t,e,i,n,r,o,s;return e=this.$inputor.val(),t=this.$inputor.caret(\"pos\",{iframe:this.app.iframe}),s=e.slice(0,t),r=this.callbacks(\"matcher\").call(this,this.at,s,this.getOpt(\"startWithSpace\"),this.getOpt(\"acceptSpaceBar\")),n=\"string\"==typeof r,n&&r.length<this.getOpt(\"minLen\",0)?void 0:(n&&r.length<=this.getOpt(\"maxLen\",20)?(o=t-r.length,i=o+r.length,this.pos=o,r={text:r,headPos:o,endPos:i},this.trigger(\"matched\",[this.at,r.text])):(r=null,this.view.hide()),this.query=r)},i.prototype.rect=function(){var e,i,n;if(e=this.$inputor.caret(\"offset\",this.pos-1,{iframe:this.app.iframe}))return this.app.iframe&&!this.app.iframeAsRoot&&(i=t(this.app.iframe).offset(),e.left+=i.left,e.top+=i.top),n=this.app.document.selection?0:2,{left:e.left,top:e.top,bottom:e.top+e.height+n}},i.prototype.insert=function(t,e){var i,n,r,o,s;return i=this.$inputor,n=i.val(),r=n.slice(0,Math.max(this.query.headPos-this.at.length,0)),o=\"\"===(o=this.getOpt(\"suffix\"))?o:o||\" \",t+=o,s=\"\"+r+t+n.slice(this.query.endPos||0),i.val(s),i.caret(\"pos\",r.length+t.length,{iframe:this.app.iframe}),i.is(\":focus\")||i.focus(),i.change()},i}(r);var l,a=function(t,e){function i(){this.constructor=t}for(var n in e)h.call(e,n)&&(t[n]=e[n]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},h={}.hasOwnProperty;l=function(e){function n(){return n.__super__.constructor.apply(this,arguments)}return a(n,e),n.prototype._getRange=function(){var t;return t=this.app.window.getSelection(),t.rangeCount>0?t.getRangeAt(0):void 0},n.prototype._setRange=function(e,i,n){return null==n&&(n=this._getRange()),n&&i?(i=t(i)[0],\"after\"===e?(n.setEndAfter(i),n.setStartAfter(i)):(n.setEndBefore(i),n.setStartBefore(i)),n.collapse(!1),this._clearRange(n)):void 0},n.prototype._clearRange=function(t){var e;return null==t&&(t=this._getRange()),e=this.app.window.getSelection(),null==this.ctrl_a_pressed?(e.removeAllRanges(),e.addRange(t)):void 0},n.prototype._movingEvent=function(t){var e;return\"click\"===t.type||(e=t.which)===i.RIGHT||e===i.LEFT||e===i.UP||e===i.DOWN},n.prototype._unwrap=function(e){var i;return e=t(e).unwrap().get(0),(i=e.nextSibling)&&i.nodeValue&&(e.nodeValue+=i.nodeValue,t(i).remove()),e},n.prototype.catchQuery=function(e){var n,r,o,s,a,h,l,u,c,p,f,d;if((d=this._getRange())&&d.collapsed){if(e.which===i.ENTER)return(r=t(d.startContainer).closest(\".atwho-query\")).contents().unwrap(),r.is(\":empty\")&&r.remove(),(r=t(\".atwho-query\",this.app.document)).text(r.text()).contents().last().unwrap(),void this._clearRange();if(/firefox/i.test(navigator.userAgent)){if(t(d.startContainer).is(this.$inputor))return void this._clearRange();e.which===i.BACKSPACE&&d.startContainer.nodeType===document.ELEMENT_NODE&&(c=d.startOffset-1)>=0?(o=d.cloneRange(),o.setStart(d.startContainer,c),t(o.cloneContents()).contents().last().is(\".atwho-inserted\")&&(a=t(d.startContainer).contents().get(c),this._setRange(\"after\",t(a).contents().last()))):e.which===i.LEFT&&d.startContainer.nodeType===document.TEXT_NODE&&(n=t(d.startContainer.previousSibling),n.is(\".atwho-inserted\")&&0===d.startOffset&&this._setRange(\"after\",n.contents().last()))}if(t(d.startContainer).closest(\".atwho-inserted\").addClass(\"atwho-query\").siblings().removeClass(\"atwho-query\"),(r=t(\".atwho-query\",this.app.document)).length>0&&r.is(\":empty\")&&0===r.text().length&&r.remove(),this._movingEvent(e)||r.removeClass(\"atwho-inserted\"),r.length>0)switch(e.which){case i.LEFT:return this._setRange(\"before\",r.get(0),d),void r.removeClass(\"atwho-query\");case i.RIGHT:return this._setRange(\"after\",r.get(0).nextSibling,d),void r.removeClass(\"atwho-query\")}if(r.length>0&&(f=r.attr(\"data-atwho-at-query\"))&&(r.empty().html(f).attr(\"data-atwho-at-query\",null),this._setRange(\"after\",r.get(0),d)),o=d.cloneRange(),o.setStart(d.startContainer,0),u=this.callbacks(\"matcher\").call(this,this.at,o.toString(),this.getOpt(\"startWithSpace\"),this.getOpt(\"acceptSpaceBar\")),h=\"string\"==typeof u,0===r.length&&h&&(s=d.startOffset-this.at.length-u.length)>=0&&(d.setStart(d.startContainer,s),r=t(\"<span/>\",this.app.document).attr(this.getOpt(\"editableAtwhoQueryAttrs\")).addClass(\"atwho-query\"),d.surroundContents(r.get(0)),l=r.contents().last().get(0),l&&(/firefox/i.test(navigator.userAgent)?(d.setStart(l,l.length),d.setEnd(l,l.length),this._clearRange(d)):this._setRange(\"after\",l,d))),!(h&&u.length<this.getOpt(\"minLen\",0)))return h&&u.length<=this.getOpt(\"maxLen\",20)?(p={text:u,el:r},this.trigger(\"matched\",[this.at,p.text]),this.query=p):(this.view.hide(),this.query={el:r},r.text().indexOf(this.at)>=0&&(this._movingEvent(e)&&r.hasClass(\"atwho-inserted\")?r.removeClass(\"atwho-query\"):!1!==this.callbacks(\"afterMatchFailed\").call(this,this.at,r)&&this._setRange(\"after\",this._unwrap(r.text(r.text()).contents().first()))),null)}},n.prototype.rect=function(){var e,i,n;return n=this.query.el.offset(),n&&this.query.el[0].getClientRects().length?(this.app.iframe&&!this.app.iframeAsRoot&&(i=(e=t(this.app.iframe)).offset(),n.left+=i.left-this.$inputor.scrollLeft(),n.top+=i.top-this.$inputor.scrollTop()),n.bottom=n.top+this.query.el.height(),n):void 0},n.prototype.insert=function(t,e){var i,n,r,o,s;return this.$inputor.is(\":focus\")||this.$inputor.focus(),n=this.getOpt(\"functionOverrides\"),n.insert?n.insert.call(this,t,e):(o=\"\"===(o=this.getOpt(\"suffix\"))?o:o||\" \",i=e.data(\"item-data\"),this.query.el.removeClass(\"atwho-query\").addClass(\"atwho-inserted\").html(t).attr(\"data-atwho-at-query\",\"\"+i[\"atwho-at\"]+this.query.text).attr(\"contenteditable\",\"false\"),(r=this._getRange())&&(this.query.el.length&&r.setEndAfter(this.query.el[0]),r.collapse(!1),r.insertNode(s=this.app.document.createTextNode(\"\"+o)),this._setRange(\"after\",s,r)),this.$inputor.is(\":focus\")||this.$inputor.focus(),this.$inputor.change())},n}(r);var u;u=function(){function e(t){this.context=t,this.at=this.context.at,this.storage=this.context.$inputor}return e.prototype.destroy=function(){return this.storage.data(this.at,null)},e.prototype.saved=function(){return this.fetch()>0},e.prototype.query=function(t,e){var i,n,r;return n=this.fetch(),r=this.context.getOpt(\"searchKey\"),n=this.context.callbacks(\"filter\").call(this.context,t,n,r)||[],i=this.context.callbacks(\"remoteFilter\"),n.length>0||!i&&0===n.length?e(n):i.call(this.context,t,e)},e.prototype.fetch=function(){return this.storage.data(this.at)||[]},e.prototype.save=function(t){return this.storage.data(this.at,this.context.callbacks(\"beforeSave\").call(this.context,t||[]))},e.prototype.load=function(t){return!this.saved()&&t?this._load(t):void 0},e.prototype.reload=function(t){return this._load(t)},e.prototype._load=function(e){return\"string\"==typeof e?t.ajax(e,{dataType:\"json\"}).done(function(t){return function(e){return t.save(e)}}(this)):this.save(e)},e}();var c;c=function(){function e(e){this.context=e,this.$el=t(\"<div class='atwho-view'><ul class='atwho-view-ul'></ul></div>\"),this.$elUl=this.$el.children(),this.timeoutID=null,this.context.$el.append(this.$el),this.bindEvent()}return e.prototype.init=function(){var t,e;return e=this.context.getOpt(\"alias\")||this.context.at.charCodeAt(0),t=this.context.getOpt(\"headerTpl\"),t&&1===this.$el.children().length&&this.$el.prepend(t),this.$el.attr({id:\"at-view-\"+e})},e.prototype.destroy=function(){return this.$el.remove()},e.prototype.bindEvent=function(){var e,i,n;return e=this.$el.find(\"ul\"),i=0,n=0,e.on(\"mousemove.atwho-view\",\"li\",function(r){return function(r){var o;if((i!==r.clientX||n!==r.clientY)&&(i=r.clientX,n=r.clientY,o=t(r.currentTarget),!o.hasClass(\"cur\")))return e.find(\".cur\").removeClass(\"cur\"),o.addClass(\"cur\")}}(this)).on(\"click.atwho-view\",\"li\",function(i){return function(n){return e.find(\".cur\").removeClass(\"cur\"),t(n.currentTarget).addClass(\"cur\"),i.choose(n),n.preventDefault()}}(this))},e.prototype.visible=function(){return t.expr.filters.visible(this.$el[0])},e.prototype.highlighted=function(){return this.$el.find(\".cur\").length>0},e.prototype.choose=function(t){var e,i;return(e=this.$el.find(\".cur\")).length&&(i=this.context.insertContentFor(e),this.context._stopDelayedCall(),this.context.insert(this.context.callbacks(\"beforeInsert\").call(this.context,i,e,t),e),this.context.trigger(\"inserted\",[e,t]),this.hide(t)),this.context.getOpt(\"hideWithoutSuffix\")?this.stopShowing=!0:void 0},e.prototype.reposition=function(e){var i,n,r,o;return i=this.context.app.iframeAsRoot?this.context.app.window:window,e.bottom+this.$el.height()-t(i).scrollTop()>t(i).height()&&(e.bottom=e.top-this.$el.height()),e.left>(r=t(i).width()-this.$el.width()-5)&&(e.left=r),n={left:e.left,top:e.bottom},null!=(o=this.context.callbacks(\"beforeReposition\"))&&o.call(this.context,n),this.$el.offset(n),this.context.trigger(\"reposition\",[n])},e.prototype.next=function(){var t,e,i,n;return t=this.$el.find(\".cur\").removeClass(\"cur\"),e=t.next(),e.length||(e=this.$el.find(\"li:first\")),e.addClass(\"cur\"),i=e[0],n=i.offsetTop+i.offsetHeight+(i.nextSibling?i.nextSibling.offsetHeight:0),this.scrollTop(Math.max(0,n-this.$el.height()))},e.prototype.prev=function(){var t,e,i,n;return t=this.$el.find(\".cur\").removeClass(\"cur\"),i=t.prev(),i.length||(i=this.$el.find(\"li:last\")),i.addClass(\"cur\"),n=i[0],e=n.offsetTop+n.offsetHeight+(n.nextSibling?n.nextSibling.offsetHeight:0),this.scrollTop(Math.max(0,e-this.$el.height()))},e.prototype.scrollTop=function(t){var e;return e=this.context.getOpt(\"scrollDuration\"),e?this.$elUl.animate({scrollTop:t},e):this.$elUl.scrollTop(t)},e.prototype.show=function(){var t;return this.stopShowing?void(this.stopShowing=!1):(this.visible()||(this.$el.show(),this.$el.scrollTop(0),this.context.trigger(\"shown\")),(t=this.context.rect())?this.reposition(t):void 0)},e.prototype.hide=function(t,e){var i;if(this.visible())return isNaN(e)?(this.$el.hide(),this.context.trigger(\"hidden\",[t])):(i=function(t){return function(){return t.hide()}}(this),clearTimeout(this.timeoutID),this.timeoutID=setTimeout(i,e))},e.prototype.render=function(e){var i,n,r,o,s,a,h;if(!(t.isArray(e)&&e.length>0))return void this.hide();for(this.$el.find(\"ul\").empty(),n=this.$el.find(\"ul\"),h=this.context.getOpt(\"displayTpl\"),r=0,s=e.length;s>r;r++)o=e[r],o=t.extend({},o,{\"atwho-at\":this.context.at}),a=this.context.callbacks(\"tplEval\").call(this.context,h,o,\"onDisplay\"),i=t(this.context.callbacks(\"highlighter\").call(this.context,a,this.context.query.text)),i.data(\"item-data\",o),n.append(i);return this.show(),this.context.getOpt(\"highlightFirst\")?n.find(\"li:first\").addClass(\"cur\"):void 0},e}();var p;p={load:function(t,e){var i;return(i=this.controller(t))?i.model.load(e):void 0},isSelecting:function(){var t;return!!(null!=(t=this.controller())?t.view.visible():void 0)},hide:function(){var t;return null!=(t=this.controller())?t.view.hide():void 0},reposition:function(){var t;return(t=this.controller())?t.view.reposition(t.rect()):void 0},setIframe:function(t,e){return this.setupRootElement(t,e),null},run:function(){return this.dispatch()},destroy:function(){return this.shutdown(),this.$inputor.data(\"atwho\",null)}},t.fn.atwho=function(e){var i,r;return i=arguments,r=null,this.filter('textarea, input, [contenteditable=\"\"], [contenteditable=true]').each(function(){var o,s;return(s=(o=t(this)).data(\"atwho\"))||o.data(\"atwho\",s=new n(this)),\"object\"!=typeof e&&e?p[e]&&s?r=p[e].apply(s,Array.prototype.slice.call(i,1)):t.error(\"Method \"+e+\" does not exist on jQuery.atwho\"):s.reg(e.at,e)}),null!=r?r:this},t.fn.atwho[\"default\"]={at:void 0,alias:void 0,data:null,displayTpl:\"<li>${name}</li>\",insertTpl:\"${atwho-at}${name}\",headerTpl:null,callbacks:e,functionOverrides:{},searchKey:\"name\",suffix:void 0,hideWithoutSuffix:!1,startWithSpace:!0,acceptSpaceBar:!1,highlightFirst:!0,limit:5,maxLen:20,minLen:0,displayTimeout:300,delay:null,spaceSelectsMatch:!1,tabSelectsMatch:!0,editableAtwhoQueryAttrs:{},scrollDuration:150,suspendOnComposing:!0,lookUpOnClick:!0},t.fn.atwho.debug=!1});","\nvar content = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/lib/loader.js!./autocomplete.scss\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/lib/loader.js!./autocomplete.scss\", function() {\n\t\tvar newContent = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/lib/loader.js!./autocomplete.scss\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","exports = module.exports = require(\"../../../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"/**\\n * based upon apps/comments/js/vendor/At.js/dist/css/jquery.atwho.css,\\n * only changed colors and font-weight\\n */\\n.atwho-view {\\n position: absolute;\\n top: 0;\\n left: 0;\\n display: none;\\n margin-top: 18px;\\n background: var(--color-main-background);\\n color: var(--color-main-text);\\n border: 1px solid var(--color-border);\\n border-radius: var(--border-radius);\\n box-shadow: 0 0 5px var(--color-box-shadow);\\n min-width: 120px;\\n z-index: 11110 !important; }\\n\\n.atwho-view .atwho-header {\\n padding: 5px;\\n margin: 5px;\\n cursor: pointer;\\n border-bottom: solid 1px var(--color-border);\\n color: var(--color-main-text);\\n font-size: 11px;\\n font-weight: bold; }\\n\\n.atwho-view .atwho-header .small {\\n color: var(--color-main-text);\\n float: right;\\n padding-top: 2px;\\n margin-right: -5px;\\n font-size: 12px;\\n font-weight: normal; }\\n\\n.atwho-view .atwho-header:hover {\\n cursor: default; }\\n\\n.atwho-view .cur {\\n background: var(--color-primary);\\n color: var(--color-primary-text); }\\n\\n.atwho-view .cur small {\\n color: var(--color-primary-text); }\\n\\n.atwho-view strong {\\n color: var(--color-main-text);\\n font-weight: normal; }\\n\\n.atwho-view .cur strong {\\n color: var(--color-primary-text);\\n font-weight: normal; }\\n\\n.atwho-view ul {\\n /* width: 100px; */\\n list-style: none;\\n padding: 0;\\n margin: auto;\\n max-height: 200px;\\n overflow-y: auto; }\\n\\n.atwho-view ul li {\\n display: block;\\n padding: 5px 10px;\\n border-bottom: 1px solid var(--color-border);\\n cursor: pointer; }\\n\\n.atwho-view small {\\n font-size: smaller;\\n color: var(--color-main-text);\\n font-weight: normal; }\\n\", \"\"]);\n\n","\n/**\n * When source maps are enabled, `style-loader` uses a link element with a data-uri to\n * embed the css on the page. This breaks all relative urls because now they are relative to a\n * bundle instead of the current page.\n *\n * One solution is to only use full urls, but that may be impossible.\n *\n * Instead, this function \"fixes\" the relative urls to be absolute according to the current page location.\n *\n * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command.\n *\n */\n\nmodule.exports = function (css) {\n // get current location\n var location = typeof window !== \"undefined\" && window.location;\n\n if (!location) {\n throw new Error(\"fixUrls requires window.location\");\n }\n\n\t// blank or null?\n\tif (!css || typeof css !== \"string\") {\n\t return css;\n }\n\n var baseUrl = location.protocol + \"//\" + location.host;\n var currentDir = baseUrl + location.pathname.replace(/\\/[^\\/]*$/, \"/\");\n\n\t// convert each url(...)\n\t/*\n\tThis regular expression is just a way to recursively match brackets within\n\ta string.\n\n\t /url\\s*\\( = Match on the word \"url\" with any whitespace after it and then a parens\n\t ( = Start a capturing group\n\t (?: = Start a non-capturing group\n\t [^)(] = Match anything that isn't a parentheses\n\t | = OR\n\t \\( = Match a start parentheses\n\t (?: = Start another non-capturing groups\n\t [^)(]+ = Match anything that isn't a parentheses\n\t | = OR\n\t \\( = Match a start parentheses\n\t [^)(]* = Match anything that isn't a parentheses\n\t \\) = Match a end parentheses\n\t ) = End Group\n *\\) = Match anything and then a close parens\n ) = Close non-capturing group\n * = Match anything\n ) = Close capturing group\n\t \\) = Match a close parens\n\n\t /gi = Get all matches, not the first. Be case insensitive.\n\t */\n\tvar fixedCss = css.replace(/url\\s*\\(((?:[^)(]|\\((?:[^)(]+|\\([^)(]*\\))*\\))*)\\)/gi, function(fullMatch, origUrl) {\n\t\t// strip quotes (if they exist)\n\t\tvar unquotedOrigUrl = origUrl\n\t\t\t.trim()\n\t\t\t.replace(/^\"(.*)\"$/, function(o, $1){ return $1; })\n\t\t\t.replace(/^'(.*)'$/, function(o, $1){ return $1; });\n\n\t\t// already a full url? no change\n\t\tif (/^(#|data:|http:\\/\\/|https:\\/\\/|file:\\/\\/\\/|\\s*$)/i.test(unquotedOrigUrl)) {\n\t\t return fullMatch;\n\t\t}\n\n\t\t// convert the url to a full url\n\t\tvar newUrl;\n\n\t\tif (unquotedOrigUrl.indexOf(\"//\") === 0) {\n\t\t \t//TODO: should we add protocol?\n\t\t\tnewUrl = unquotedOrigUrl;\n\t\t} else if (unquotedOrigUrl.indexOf(\"/\") === 0) {\n\t\t\t// path should be relative to the base url\n\t\t\tnewUrl = baseUrl + unquotedOrigUrl; // already starts with '/'\n\t\t} else {\n\t\t\t// path should be relative to current directory\n\t\t\tnewUrl = currentDir + unquotedOrigUrl.replace(/^\\.\\//, \"\"); // Strip leading './'\n\t\t}\n\n\t\t// send back the fixed url(...)\n\t\treturn \"url(\" + JSON.stringify(newUrl) + \")\";\n\t});\n\n\t// send back the fixed css\n\treturn fixedCss;\n};\n","\nvar content = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/lib/loader.js!./comments.scss\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/lib/loader.js!./comments.scss\", function() {\n\t\tvar newContent = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/lib/loader.js!./comments.scss\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","exports = module.exports = require(\"../../../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"/*\\n * Copyright (c) 2016\\n *\\n * This file is licensed under the Affero General Public License version 3\\n * or later.\\n *\\n * See the COPYING-README file.\\n *\\n */\\n#commentsTabView .emptycontent {\\n margin-top: 0; }\\n\\n#commentsTabView .newCommentForm {\\n margin-left: 36px;\\n position: relative; }\\n\\n#commentsTabView .newCommentForm .message {\\n width: 100%;\\n padding: 10px;\\n min-height: 44px;\\n margin: 0;\\n /* Prevent the text from overlapping with the submit button. */\\n padding-right: 30px; }\\n\\n#commentsTabView .newCommentForm .submit,\\n#commentsTabView .newCommentForm .submitLoading {\\n width: 44px;\\n height: 44px;\\n margin: 0;\\n padding: 13px;\\n background-color: transparent;\\n border: none;\\n opacity: .3;\\n position: absolute;\\n bottom: 0;\\n right: 0; }\\n\\n#commentsTabView .deleteLoading {\\n padding: 14px;\\n vertical-align: middle; }\\n\\n#commentsTabView .newCommentForm .submit:not(:disabled):hover,\\n#commentsTabView .newCommentForm .submit:not(:disabled):focus {\\n opacity: 1; }\\n\\n#commentsTabView .newCommentForm div.message {\\n resize: none; }\\n\\n#commentsTabView .newCommentForm div.message:empty:before {\\n content: attr(data-placeholder);\\n color: grey; }\\n\\n#commentsTabView .comment {\\n position: relative;\\n /** padding bottom is little more so that the top and bottom gap look uniform **/\\n padding: 10px 0 15px; }\\n\\n#commentsTabView .comments .comment {\\n border-top: 1px solid var(--color-border); }\\n\\n#commentsTabView .comment .avatar,\\n.atwho-view-ul * .avatar {\\n width: 32px;\\n height: 32px;\\n line-height: 32px;\\n margin-right: 5px; }\\n\\n#commentsTabView .comment .message .avatar,\\n.atwho-view-ul * .avatar {\\n display: inline-block; }\\n\\n#activityTabView li.comment.collapsed .activitymessage,\\n#commentsTabView .comment.collapsed .message {\\n white-space: pre-wrap; }\\n\\n#activityTabView li.comment.collapsed .activitymessage,\\n#commentsTabView .comment.collapsed .message {\\n max-height: 70px;\\n overflow: hidden; }\\n\\n#activityTabView li.comment .message-overlay,\\n#commentsTabView .comment .message-overlay {\\n display: none; }\\n\\n#activityTabView li.comment.collapsed .message-overlay,\\n#commentsTabView .comment.collapsed .message-overlay {\\n display: block;\\n position: absolute;\\n z-index: 2;\\n height: 50px;\\n pointer-events: none;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n background: -moz-linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));\\n background: -webkit-linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));\\n background: -o-linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));\\n background: -ms-linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));\\n background: linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));\\n background-repeat: no-repeat; }\\n\\n#commentsTabView .hidden {\\n display: none !important; }\\n\\n/** set min-height as 44px to ensure that it fits the button sizes. **/\\n#commentsTabView .comment .authorRow {\\n min-height: 44px; }\\n\\n#commentsTabView .comment .authorRow .tooltip {\\n /** because of the padding on the element, the tooltip appear too far up,\\n\\t adding this brings them closer to the element**/\\n margin-top: 5px; }\\n\\n.atwho-view-ul * .avatar-name-wrapper,\\n#commentsTabView .comment .authorRow {\\n position: relative;\\n display: inline-flex;\\n align-items: center;\\n width: 100%; }\\n\\n#commentsTabView .comment:not(.newCommentRow) .message .avatar-name-wrapper:not(.currentUser),\\n#commentsTabView .comment:not(.newCommentRow) .message .avatar-name-wrapper:not(.currentUser) .avatar,\\n#commentsTabView .comment:not(.newCommentRow) .message .avatar-name-wrapper:not(.currentUser) .avatar img,\\n#commentsTabView .comment .authorRow .avatar:not(.currentUser),\\n#commentsTabView .comment .authorRow .author:not(.currentUser) {\\n cursor: pointer; }\\n\\n.atwho-view-ul .avatar-name-wrapper,\\n.atwho-view-ul .avatar-name-wrapper .avatar,\\n.atwho-view-ul .avatar-name-wrapper .avatar img {\\n cursor: pointer; }\\n\\n#commentsTabView .comments li .message .atwho-inserted .avatar-name-wrapper,\\n#commentsTabView .newCommentForm .atwho-inserted .avatar-name-wrapper {\\n /* Make the wrapper the positioning context of its child contacts\\n\\t\\t * menu. */\\n position: relative;\\n display: inline;\\n vertical-align: top;\\n background-color: var(--color-background-dark);\\n border-radius: 50vh;\\n padding: 1px 7px 1px 1px;\\n /* Ensure that the avatar and the user name will be kept together. */\\n white-space: nowrap; }\\n #commentsTabView .comments li .message .atwho-inserted .avatar-name-wrapper .avatar,\\n #commentsTabView .newCommentForm .atwho-inserted .avatar-name-wrapper .avatar {\\n height: 16px;\\n width: 16px;\\n vertical-align: middle;\\n padding: 1px;\\n margin-top: -3px;\\n margin-left: 0;\\n margin-right: 2px; }\\n #commentsTabView .comments li .message .atwho-inserted .avatar-name-wrapper .avatar img,\\n #commentsTabView .newCommentForm .atwho-inserted .avatar-name-wrapper .avatar img {\\n vertical-align: top; }\\n #commentsTabView .comments li .message .atwho-inserted .avatar-name-wrapper strong,\\n #commentsTabView .newCommentForm .atwho-inserted .avatar-name-wrapper strong {\\n /* Ensure that the user name is shown in bold, as different browsers\\n\\t\\t\\t * use different font weights for strong elements. */\\n font-weight: bold; }\\n\\n#commentsTabView .comments li .message .atwho-inserted .avatar-name-wrapper.currentUser,\\n#commentsTabView .newCommentForm .atwho-inserted .avatar-name-wrapper.currentUser {\\n background-color: var(--color-primary);\\n color: var(--color-primary-text); }\\n\\n.atwho-view-ul * .avatar-name-wrapper {\\n white-space: nowrap; }\\n\\n#commentsTabView .comment .author,\\n#commentsTabView .comment .date {\\n opacity: .5; }\\n\\n#commentsTabView .comment .author {\\n max-width: 210px;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap; }\\n\\n#commentsTabView .comment .date {\\n margin-left: auto;\\n /** this is to fix the tooltip being too close due to the margin-top applied\\n\\t to bring the tooltip closer for the action icons **/\\n padding: 10px 0px; }\\n\\n#commentsTabView .comments > li:not(.newCommentRow) .message {\\n padding-left: 40px;\\n word-wrap: break-word;\\n overflow-wrap: break-word; }\\n\\n#commentsTabView .comment .action {\\n opacity: 0.3;\\n padding: 14px;\\n display: block; }\\n\\n#commentsTabView .comment .action:hover,\\n#commentsTabView .comment .action:focus {\\n opacity: 1; }\\n\\n#commentsTabView .newCommentRow .action-container {\\n margin-left: auto; }\\n\\n#commentsTabView .comment.disabled .message {\\n opacity: 0.3; }\\n\\n#commentsTabView .comment.disabled .action {\\n display: none; }\\n\\n#commentsTabView .message.error {\\n color: #e9322d;\\n border-color: #e9322d;\\n box-shadow: 0 0 6px #f8b9b7; }\\n\\n.app-files .action-comment {\\n padding: 16px 14px; }\\n\\n#commentsTabView .comment .message .contactsmenu-popover {\\n left: -6px;\\n top: 24px; }\\n\", \"\"]);\n\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/apps/comments/js/merged.json b/apps/comments/js/merged.json
deleted file mode 100644
index 8f40b5621a6..00000000000
--- a/apps/comments/js/merged.json
+++ /dev/null
@@ -1,14 +0,0 @@
-[
- "app.js",
- "templates.js",
- "commentmodel.js",
- "commentcollection.js",
- "commentsummarymodel.js",
- "commentstabview.js",
- "commentsmodifymenu.js",
- "filesplugin.js",
- "activitytabviewplugin.js",
- "search.js",
- "vendor/Caret.js/dist/jquery.caret.min.js",
- "vendor/At.js/dist/js/jquery.atwho.min.js"
-]
diff --git a/apps/comments/lib/AppInfo/Application.php b/apps/comments/lib/AppInfo/Application.php
index 52848f3d63d..b44c1c519c8 100644
--- a/apps/comments/lib/AppInfo/Application.php
+++ b/apps/comments/lib/AppInfo/Application.php
@@ -61,9 +61,7 @@ class Application extends App {
$dispatcher->addListener(
'OCA\Files::loadAdditionalScripts',
function() {
- Util::addScript('comments', 'merged');
- Util::addStyle('comments', 'autocomplete');
- Util::addStyle('comments', 'comments');
+ Util::addScript('comments', 'comments');
}
);
}
diff --git a/apps/comments/js/activitytabviewplugin.js b/apps/comments/src/activitytabviewplugin.js
index b6195b80c45..b6195b80c45 100644
--- a/apps/comments/js/activitytabviewplugin.js
+++ b/apps/comments/src/activitytabviewplugin.js
diff --git a/apps/comments/js/app.js b/apps/comments/src/app.js
index 547059393a5..547059393a5 100644
--- a/apps/comments/js/app.js
+++ b/apps/comments/src/app.js
diff --git a/apps/comments/js/commentcollection.js b/apps/comments/src/commentcollection.js
index a15039cf484..a15039cf484 100644
--- a/apps/comments/js/commentcollection.js
+++ b/apps/comments/src/commentcollection.js
diff --git a/apps/comments/js/commentmodel.js b/apps/comments/src/commentmodel.js
index 3711e53c9f3..3711e53c9f3 100644
--- a/apps/comments/js/commentmodel.js
+++ b/apps/comments/src/commentmodel.js
diff --git a/apps/comments/src/comments.js b/apps/comments/src/comments.js
new file mode 100644
index 00000000000..f0d4433674b
--- /dev/null
+++ b/apps/comments/src/comments.js
@@ -0,0 +1,18 @@
+import './app'
+import './templates'
+import './commentmodel'
+import './commentcollection'
+import './commentsummarymodel'
+import './commentstabview'
+import './commentsmodifymenu'
+import './filesplugin'
+import './activitytabviewplugin'
+import './search'
+
+import './vendor/Caret.js/dist/jquery.caret.min'
+import './vendor/At.js/dist/js/jquery.atwho.min'
+
+import './style/autocomplete.scss'
+import './style/comments.scss'
+
+window.OCA.Comments = OCA.Comments;
diff --git a/apps/comments/js/commentsmodifymenu.js b/apps/comments/src/commentsmodifymenu.js
index 2640dcf4201..2640dcf4201 100644
--- a/apps/comments/js/commentsmodifymenu.js
+++ b/apps/comments/src/commentsmodifymenu.js
diff --git a/apps/comments/js/commentstabview.js b/apps/comments/src/commentstabview.js
index f87cf29a7d1..f87cf29a7d1 100644
--- a/apps/comments/js/commentstabview.js
+++ b/apps/comments/src/commentstabview.js
diff --git a/apps/comments/js/commentsummarymodel.js b/apps/comments/src/commentsummarymodel.js
index ffabbc30fb4..ffabbc30fb4 100644
--- a/apps/comments/js/commentsummarymodel.js
+++ b/apps/comments/src/commentsummarymodel.js
diff --git a/apps/comments/js/filesplugin.js b/apps/comments/src/filesplugin.js
index 939edc8c695..939edc8c695 100644
--- a/apps/comments/js/filesplugin.js
+++ b/apps/comments/src/filesplugin.js
diff --git a/apps/comments/js/search.js b/apps/comments/src/search.js
index 8e0a35ff6ed..8e0a35ff6ed 100644
--- a/apps/comments/js/search.js
+++ b/apps/comments/src/search.js
diff --git a/apps/comments/css/autocomplete.scss b/apps/comments/src/style/autocomplete.scss
index 0837b387814..0837b387814 100644
--- a/apps/comments/css/autocomplete.scss
+++ b/apps/comments/src/style/autocomplete.scss
diff --git a/apps/comments/css/comments.scss b/apps/comments/src/style/comments.scss
index 665051cf065..665051cf065 100644
--- a/apps/comments/css/comments.scss
+++ b/apps/comments/src/style/comments.scss
diff --git a/apps/comments/js/templates.js b/apps/comments/src/templates.js
index 26ca658c772..26ca658c772 100644
--- a/apps/comments/js/templates.js
+++ b/apps/comments/src/templates.js
diff --git a/apps/comments/js/templates/comment.handlebars b/apps/comments/src/templates/comment.handlebars
index c1a1091a4e0..c1a1091a4e0 100644
--- a/apps/comments/js/templates/comment.handlebars
+++ b/apps/comments/src/templates/comment.handlebars
diff --git a/apps/comments/js/templates/commentsmodifymenu.handlebars b/apps/comments/src/templates/commentsmodifymenu.handlebars
index 28f6ffcdde6..28f6ffcdde6 100644
--- a/apps/comments/js/templates/commentsmodifymenu.handlebars
+++ b/apps/comments/src/templates/commentsmodifymenu.handlebars
diff --git a/apps/comments/js/templates/edit_comment.handlebars b/apps/comments/src/templates/edit_comment.handlebars
index 0a909ebe6aa..0a909ebe6aa 100644
--- a/apps/comments/js/templates/edit_comment.handlebars
+++ b/apps/comments/src/templates/edit_comment.handlebars
diff --git a/apps/comments/js/templates/filesplugin.handlebars b/apps/comments/src/templates/filesplugin.handlebars
index 8f3699380be..8f3699380be 100644
--- a/apps/comments/js/templates/filesplugin.handlebars
+++ b/apps/comments/src/templates/filesplugin.handlebars
diff --git a/apps/comments/js/templates/view.handlebars b/apps/comments/src/templates/view.handlebars
index c63faa386b3..c63faa386b3 100644
--- a/apps/comments/js/templates/view.handlebars
+++ b/apps/comments/src/templates/view.handlebars
diff --git a/apps/comments/js/vendor/At.js/dist/js/jquery.atwho.min.js b/apps/comments/src/vendor/At.js/dist/js/jquery.atwho.min.js
index d1e60152b4c..d1e60152b4c 100644
--- a/apps/comments/js/vendor/At.js/dist/js/jquery.atwho.min.js
+++ b/apps/comments/src/vendor/At.js/dist/js/jquery.atwho.min.js
diff --git a/apps/comments/js/vendor/Caret.js/dist/jquery.caret.min.js b/apps/comments/src/vendor/Caret.js/dist/jquery.caret.min.js
index a4d02eae247..a4d02eae247 100644
--- a/apps/comments/js/vendor/Caret.js/dist/jquery.caret.min.js
+++ b/apps/comments/src/vendor/Caret.js/dist/jquery.caret.min.js
diff --git a/apps/comments/webpack.js b/apps/comments/webpack.js
new file mode 100644
index 00000000000..dff1aa0518f
--- /dev/null
+++ b/apps/comments/webpack.js
@@ -0,0 +1,40 @@
+const path = require('path');
+
+module.exports = {
+ entry: path.join(__dirname, 'src', 'comments.js'),
+ output: {
+ path: path.resolve(__dirname, './js'),
+ publicPath: '/js/',
+ filename: 'comments.js'
+ },
+ module: {
+ rules: [
+ {
+ test: /\.css$/,
+ use: ['style-loader', 'css-loader']
+ },
+ {
+ test: /\.scss$/,
+ use: ['style-loader', 'css-loader', 'sass-loader']
+ },
+ {
+ test: /\.js$/,
+ loader: 'babel-loader',
+ exclude: /node_modules/
+ },
+ {
+ test: /\.(png|jpg|gif|svg)$/,
+ loader: 'file-loader',
+ options: {
+ name: '[name].[ext]?[hash]'
+ }
+ }
+ ]
+ },
+ externals: {
+ jquery: 'jQuery'
+ },
+ resolve: {
+ extensions: ['*', '.js']
+ }
+};
diff --git a/apps/dav/l10n/bg.js b/apps/dav/l10n/bg.js
index a18942a2fbd..194feb4cfcb 100644
--- a/apps/dav/l10n/bg.js
+++ b/apps/dav/l10n/bg.js
@@ -36,8 +36,8 @@ OC.L10N.register(
"You deleted todo {todo} from list {calendar}" : "Изтрихте задача {todo} от списък {calendar}",
"{actor} updated todo {todo} in list {calendar}" : "{actor} актуализира задача {todo} в списък {calendar}",
"You updated todo {todo} in list {calendar}" : "Променихте задача {todo} в списък {calendar}",
- "{actor} solved todo {todo} in list {calendar}" : "{actor} реши задача {todo} в списък {calendar}",
- "You solved todo {todo} in list {calendar}" : "Решихте задача {todo} в списък {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} разреши задача {todo} в списък {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Разрешихте задача {todo} в списък {calendar}",
"{actor} reopened todo {todo} in list {calendar}" : "{actor} възобнови задача {todo} в списък {calendar}",
"You reopened todo {todo} in list {calendar}" : "Възобновихте задача {todo} в списък {calendar}",
"A <strong>calendar</strong> was modified" : "Промяна на <strong>календар</strong>",
diff --git a/apps/dav/l10n/bg.json b/apps/dav/l10n/bg.json
index 646009b70c2..ca90843adbe 100644
--- a/apps/dav/l10n/bg.json
+++ b/apps/dav/l10n/bg.json
@@ -34,8 +34,8 @@
"You deleted todo {todo} from list {calendar}" : "Изтрихте задача {todo} от списък {calendar}",
"{actor} updated todo {todo} in list {calendar}" : "{actor} актуализира задача {todo} в списък {calendar}",
"You updated todo {todo} in list {calendar}" : "Променихте задача {todo} в списък {calendar}",
- "{actor} solved todo {todo} in list {calendar}" : "{actor} реши задача {todo} в списък {calendar}",
- "You solved todo {todo} in list {calendar}" : "Решихте задача {todo} в списък {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} разреши задача {todo} в списък {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Разрешихте задача {todo} в списък {calendar}",
"{actor} reopened todo {todo} in list {calendar}" : "{actor} възобнови задача {todo} в списък {calendar}",
"You reopened todo {todo} in list {calendar}" : "Възобновихте задача {todo} в списък {calendar}",
"A <strong>calendar</strong> was modified" : "Промяна на <strong>календар</strong>",
diff --git a/apps/encryption/l10n/eo.js b/apps/encryption/l10n/eo.js
index 8baa1ff5755..702e3bbc3fa 100644
--- a/apps/encryption/l10n/eo.js
+++ b/apps/encryption/l10n/eo.js
@@ -1,29 +1,66 @@
OC.L10N.register(
"encryption",
{
+ "Missing recovery key password" : "Mankas pasvorto de la restaŭroŝlosilo",
+ "Please repeat the recovery key password" : "Bv. ripeti la pasvorton de restaŭroŝlosilo",
+ "Repeated recovery key password does not match the provided recovery key password" : "La du pasvortoj pri la restaŭroŝlosilo ne kongruas",
+ "Recovery key successfully enabled" : "Restaŭroŝlosilo sukcese ebligita",
+ "Could not enable recovery key. Please check your recovery key password!" : "Restaŭroŝlosilo ne povis esti ŝaltita. Bv. kontroli vian pasvorton de restaŭroŝlosilo!",
+ "Recovery key successfully disabled" : "Restaŭroŝlosilo sukcese malŝaltita",
+ "Could not disable recovery key. Please check your recovery key password!" : "Restaŭroŝlosilo ne povis esti malŝaltita. Bv. kontroli vian pasvorton de restaŭroŝlosilo!",
"Missing parameters" : "Mankas parametroj",
+ "Please provide the old recovery password" : "Bv. doni la malnovan pasvorton de restaŭroŝlosilo",
+ "Please provide a new recovery password" : "Bv. doni la novan pasvorton de restaŭroŝlosilo",
+ "Please repeat the new recovery password" : "Bv. ripeti la novan pasvorton de restaŭroŝlosilo",
"Password successfully changed." : "La pasvorto sukcese ŝanĝiĝis.",
"Could not change the password. Maybe the old password was not correct." : "Ne eblis ŝanĝi la pasvorton. Eble la malnova pasvorto malĝustis.",
- "Recovery Key disabled" : "Restaŭroŝlosilo malkapabliĝis",
- "Recovery Key enabled" : "Restaŭroŝlosilo kapabliĝis",
- "Private key password successfully updated." : "La pasvorto de la malpublika ŝlosilo sukcese ĝisdatiĝis.",
- "Encryption App is enabled and ready" : "Aplikaĵo Ĉifrado kapabligitas kaj pretas",
+ "Recovery Key disabled" : "Restaŭroŝlosilo malŝaltita",
+ "Recovery Key enabled" : "Restaŭroŝlosilo ŝaltita",
+ "Could not enable the recovery key, please try again or contact your administrator" : "Restaŭroŝlosilo ne povis esti ŝaltita. Bv. re-provi aŭ kontakti vian administranton.",
+ "Could not update the private key password." : "Ne eblis ĝisdatigi la pasvorton de restaŭroŝlosilo.",
+ "The old password was not correct, please try again." : "La malnova pasvorto malĝustas. Provu denove.",
+ "The current log-in password was not correct, please try again." : "La aktuala ensalutpasvorto ne ĝustas. Bv. provi denove.",
+ "Private key password successfully updated." : "La pasvorto de la privata ŝlosilo sukcese ĝisdatiĝis.",
+ "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Nevalida privata ŝlosilo por la ĉifra aplikaĵo. Bv. ĝisdatigi la pasvorton de via privata ŝlosilo en viaj personaj agordoj por povi realiri al viaj ĉifritajn dosierojn.",
+ "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Ĉifra aplikaĵo estas ŝaltita, sed viaj ŝlosiloj ne uziĝas. Bv. elsaluti kaj re-ensaluti.",
+ "Please enable server side encryption in the admin settings in order to use the encryption module." : "Bv. ŝalti la ĉeservilan ĉifradon en la administraj agordoj por uzi la ĉifran modulon.",
+ "Encryption app is enabled and ready" : "La ĉifra aplikaĵo estas ŝaltita kaj preta",
+ "Bad Signature" : "Malbona subskribo",
+ "Missing Signature" : "Mankanta subskribo",
+ "one-time password for server-side-encryption" : "unuuza pasvorto por ĉeservila ĉifrado",
+ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ne eblas malĉifri tiun ĉi dosieron, probable kunhavigitan. Bv. demandi al posedanto re-kunhavigi la dosieron kun vi.",
+ "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ne eblas legi tiun ĉi dosieron, probable kunhavigitan. Bv. demandi al posedanto re-kunhavigi la dosieron kun vi.",
+ "Default encryption module" : "Defaŭlta ĉifra modulo",
+ "Default encryption module for server-side encryption" : "Defaŭlta ĉifra modulo por ĉeservila ĉifrado",
+ "In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "Por uzi tiun ĉifran modulon, vi bezonas ŝalti ĉeservilan ĉifradon en la administraj agordoj. Tiu modulo ĉifros ĉiujn viajn dosierojn netrudiĝeme. La ĉifrado baziĝas sur AES-ŝlosiloj de 256 bitoj.\nLa modulo ne ĉifros ekzistantajn dosierojn, nur la venontajn, post kiam la ĉeservila ĉifrado estis ŝaltita. Ankaŭ ne eblas malŝalti la ĉifradon kaj reiri al neĉifrita sistemo.\nBv. legi la dokumentaron por scii ĉiujn konsekvencojn, antaŭ ol decidi, ĉu vi uzos ĉeservilan ĉifradon.",
+ "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Saluton,\n\nLa administranto ebligis ĉeservilan ĉifradon. Viaj dosieroj ĉifriĝis per la pasvorto „%s“.\n\nBonvolu ensaluti al la TTT-fasado, iri en viaj personaj agordoj al la parto „Bazĉifrada modulo“ por ĝisdatigi vian ĉifran pasvorton: en la kampo „Malnova ensaluta pasvorto“, skribu la ĉi-supran pasvorton kaj en la alia kampo vian nunan pasvorton.\n\n",
"The share will expire on %s." : "La kunhavo senvalidiĝos je %s.",
- "Enable recovery key" : "Kapabligi restaŭroŝlosilon",
- "Disable recovery key" : "Malkapabligi restaŭroŝlosilon",
+ "Cheers!" : "Ĝis!",
+ "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Saluton,<br><br>La administranto ebligis ĉeservilan ĉifradon. Viaj dosieroj ĉifriĝis per la pasvorto <strong>%s</strong>.<br><br>Bonvolu ensaluti al la TTT-fasado, iri en viaj personaj agordoj al la parto „Bazĉifrada modulo“ por ĝisdatigi vian ĉifran pasvorton: en la kampo „Malnova ensaluta pasvorto“, skribu la ĉi-supran pasvorton kaj en la alia kampo vian nunan pasvorton.<br><br>",
+ "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Ĉifra aplikaĵo estas ŝaltita, sed viaj ŝlosiloj ne uziĝas. Bv. elsaluti kaj re-ensaluti.",
+ "Encrypt the home storage" : "Ĉifri la ĉefkonservejon",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ebligi tiun opcion ĉifras ĉiujn dosierojn de la ĉefkonservejo, alie nur dosieroj en ekstera konservejo ĉifriĝos.",
+ "Enable recovery key" : "Ŝalti restaŭroŝlosilon",
+ "Disable recovery key" : "Malŝalti restaŭroŝlosilon",
+ "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La restaŭroŝlosilo estas kroma ĉifroŝlosilo, kiu uziĝas por ĉifri dosierojn. Ĝi ebligas restaŭron el dosieroj de uzanto, se la uzanto forgesas sian pasvorton.",
"Recovery key password" : "Pasvorto de restaŭroŝlosilo",
"Repeat recovery key password" : "Ripetu la pasvorton de restaŭroŝlosilo",
"Change recovery key password:" : "Ŝanĝi la pasvorton de la restaŭroŝlosilo:",
"Old recovery key password" : "Malnova pasvorto de restaŭroŝlosilo",
"New recovery key password" : "Nova pasvorto de restaŭroŝlosilo",
"Repeat new recovery key password" : "Ripetu la novan pasvorton de restaŭroŝlosilo",
- "Change Password" : "Ŝarĝi pasvorton",
- "basic encryption module" : "Baza ĉifrada modulo de",
+ "Change Password" : "Ŝanĝi pasvorton",
+ "Basic encryption module" : "Bazĉifrada modulo",
+ "Your private key password no longer matches your log-in password." : "La pasvorto de via privata ŝlosilo ne plu kongruas kun via ensaluta pasvorto.",
+ "Set your old private key password to your current log-in password:" : "Agordi la pasvorton de via antaŭa privata ŝlosilo al via nuna ensaluta pasvorto:",
+ " If you don't remember your old password you can ask your administrator to recover your files." : "Se vi ne memoras vian antaŭan pasvorton, vi povas peti al via administranto restaŭri viajn dosierojn.",
"Old log-in password" : "Malnova ensaluta pasvorto",
"Current log-in password" : "Nuna ensaluta pasvorto",
"Update Private Key Password" : "Ĝisdatigi la pasvorton de la malpublika ŝlosilo",
- "Enable password recovery:" : "Kapabligi restaŭron de pasvorto:",
- "Enabled" : "Kapabligita",
- "Disabled" : "Malkapabligita"
+ "Enable password recovery:" : "Ŝalti restaŭron de pasvorto:",
+ "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ŝalti tiun opcion ebligas al vi rehavi aliron al viaj ĉifritaj dosierojn okaze de pasvorta perdo.",
+ "Enabled" : "Ŝaltita",
+ "Disabled" : "Malŝaltita",
+ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Vi devas transigi viajn ĉifroŝlosilojn el antaŭa versio (ownCloud ⩽ 8.0) al nova. Bv. ruli komandlinie „occ encryption:migrate“ aŭ kontakti vian administranton."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/encryption/l10n/eo.json b/apps/encryption/l10n/eo.json
index 6080d9e9069..28332d70db0 100644
--- a/apps/encryption/l10n/eo.json
+++ b/apps/encryption/l10n/eo.json
@@ -1,27 +1,64 @@
{ "translations": {
+ "Missing recovery key password" : "Mankas pasvorto de la restaŭroŝlosilo",
+ "Please repeat the recovery key password" : "Bv. ripeti la pasvorton de restaŭroŝlosilo",
+ "Repeated recovery key password does not match the provided recovery key password" : "La du pasvortoj pri la restaŭroŝlosilo ne kongruas",
+ "Recovery key successfully enabled" : "Restaŭroŝlosilo sukcese ebligita",
+ "Could not enable recovery key. Please check your recovery key password!" : "Restaŭroŝlosilo ne povis esti ŝaltita. Bv. kontroli vian pasvorton de restaŭroŝlosilo!",
+ "Recovery key successfully disabled" : "Restaŭroŝlosilo sukcese malŝaltita",
+ "Could not disable recovery key. Please check your recovery key password!" : "Restaŭroŝlosilo ne povis esti malŝaltita. Bv. kontroli vian pasvorton de restaŭroŝlosilo!",
"Missing parameters" : "Mankas parametroj",
+ "Please provide the old recovery password" : "Bv. doni la malnovan pasvorton de restaŭroŝlosilo",
+ "Please provide a new recovery password" : "Bv. doni la novan pasvorton de restaŭroŝlosilo",
+ "Please repeat the new recovery password" : "Bv. ripeti la novan pasvorton de restaŭroŝlosilo",
"Password successfully changed." : "La pasvorto sukcese ŝanĝiĝis.",
"Could not change the password. Maybe the old password was not correct." : "Ne eblis ŝanĝi la pasvorton. Eble la malnova pasvorto malĝustis.",
- "Recovery Key disabled" : "Restaŭroŝlosilo malkapabliĝis",
- "Recovery Key enabled" : "Restaŭroŝlosilo kapabliĝis",
- "Private key password successfully updated." : "La pasvorto de la malpublika ŝlosilo sukcese ĝisdatiĝis.",
- "Encryption App is enabled and ready" : "Aplikaĵo Ĉifrado kapabligitas kaj pretas",
+ "Recovery Key disabled" : "Restaŭroŝlosilo malŝaltita",
+ "Recovery Key enabled" : "Restaŭroŝlosilo ŝaltita",
+ "Could not enable the recovery key, please try again or contact your administrator" : "Restaŭroŝlosilo ne povis esti ŝaltita. Bv. re-provi aŭ kontakti vian administranton.",
+ "Could not update the private key password." : "Ne eblis ĝisdatigi la pasvorton de restaŭroŝlosilo.",
+ "The old password was not correct, please try again." : "La malnova pasvorto malĝustas. Provu denove.",
+ "The current log-in password was not correct, please try again." : "La aktuala ensalutpasvorto ne ĝustas. Bv. provi denove.",
+ "Private key password successfully updated." : "La pasvorto de la privata ŝlosilo sukcese ĝisdatiĝis.",
+ "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Nevalida privata ŝlosilo por la ĉifra aplikaĵo. Bv. ĝisdatigi la pasvorton de via privata ŝlosilo en viaj personaj agordoj por povi realiri al viaj ĉifritajn dosierojn.",
+ "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Ĉifra aplikaĵo estas ŝaltita, sed viaj ŝlosiloj ne uziĝas. Bv. elsaluti kaj re-ensaluti.",
+ "Please enable server side encryption in the admin settings in order to use the encryption module." : "Bv. ŝalti la ĉeservilan ĉifradon en la administraj agordoj por uzi la ĉifran modulon.",
+ "Encryption app is enabled and ready" : "La ĉifra aplikaĵo estas ŝaltita kaj preta",
+ "Bad Signature" : "Malbona subskribo",
+ "Missing Signature" : "Mankanta subskribo",
+ "one-time password for server-side-encryption" : "unuuza pasvorto por ĉeservila ĉifrado",
+ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ne eblas malĉifri tiun ĉi dosieron, probable kunhavigitan. Bv. demandi al posedanto re-kunhavigi la dosieron kun vi.",
+ "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ne eblas legi tiun ĉi dosieron, probable kunhavigitan. Bv. demandi al posedanto re-kunhavigi la dosieron kun vi.",
+ "Default encryption module" : "Defaŭlta ĉifra modulo",
+ "Default encryption module for server-side encryption" : "Defaŭlta ĉifra modulo por ĉeservila ĉifrado",
+ "In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "Por uzi tiun ĉifran modulon, vi bezonas ŝalti ĉeservilan ĉifradon en la administraj agordoj. Tiu modulo ĉifros ĉiujn viajn dosierojn netrudiĝeme. La ĉifrado baziĝas sur AES-ŝlosiloj de 256 bitoj.\nLa modulo ne ĉifros ekzistantajn dosierojn, nur la venontajn, post kiam la ĉeservila ĉifrado estis ŝaltita. Ankaŭ ne eblas malŝalti la ĉifradon kaj reiri al neĉifrita sistemo.\nBv. legi la dokumentaron por scii ĉiujn konsekvencojn, antaŭ ol decidi, ĉu vi uzos ĉeservilan ĉifradon.",
+ "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Saluton,\n\nLa administranto ebligis ĉeservilan ĉifradon. Viaj dosieroj ĉifriĝis per la pasvorto „%s“.\n\nBonvolu ensaluti al la TTT-fasado, iri en viaj personaj agordoj al la parto „Bazĉifrada modulo“ por ĝisdatigi vian ĉifran pasvorton: en la kampo „Malnova ensaluta pasvorto“, skribu la ĉi-supran pasvorton kaj en la alia kampo vian nunan pasvorton.\n\n",
"The share will expire on %s." : "La kunhavo senvalidiĝos je %s.",
- "Enable recovery key" : "Kapabligi restaŭroŝlosilon",
- "Disable recovery key" : "Malkapabligi restaŭroŝlosilon",
+ "Cheers!" : "Ĝis!",
+ "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Saluton,<br><br>La administranto ebligis ĉeservilan ĉifradon. Viaj dosieroj ĉifriĝis per la pasvorto <strong>%s</strong>.<br><br>Bonvolu ensaluti al la TTT-fasado, iri en viaj personaj agordoj al la parto „Bazĉifrada modulo“ por ĝisdatigi vian ĉifran pasvorton: en la kampo „Malnova ensaluta pasvorto“, skribu la ĉi-supran pasvorton kaj en la alia kampo vian nunan pasvorton.<br><br>",
+ "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Ĉifra aplikaĵo estas ŝaltita, sed viaj ŝlosiloj ne uziĝas. Bv. elsaluti kaj re-ensaluti.",
+ "Encrypt the home storage" : "Ĉifri la ĉefkonservejon",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ebligi tiun opcion ĉifras ĉiujn dosierojn de la ĉefkonservejo, alie nur dosieroj en ekstera konservejo ĉifriĝos.",
+ "Enable recovery key" : "Ŝalti restaŭroŝlosilon",
+ "Disable recovery key" : "Malŝalti restaŭroŝlosilon",
+ "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La restaŭroŝlosilo estas kroma ĉifroŝlosilo, kiu uziĝas por ĉifri dosierojn. Ĝi ebligas restaŭron el dosieroj de uzanto, se la uzanto forgesas sian pasvorton.",
"Recovery key password" : "Pasvorto de restaŭroŝlosilo",
"Repeat recovery key password" : "Ripetu la pasvorton de restaŭroŝlosilo",
"Change recovery key password:" : "Ŝanĝi la pasvorton de la restaŭroŝlosilo:",
"Old recovery key password" : "Malnova pasvorto de restaŭroŝlosilo",
"New recovery key password" : "Nova pasvorto de restaŭroŝlosilo",
"Repeat new recovery key password" : "Ripetu la novan pasvorton de restaŭroŝlosilo",
- "Change Password" : "Ŝarĝi pasvorton",
- "basic encryption module" : "Baza ĉifrada modulo de",
+ "Change Password" : "Ŝanĝi pasvorton",
+ "Basic encryption module" : "Bazĉifrada modulo",
+ "Your private key password no longer matches your log-in password." : "La pasvorto de via privata ŝlosilo ne plu kongruas kun via ensaluta pasvorto.",
+ "Set your old private key password to your current log-in password:" : "Agordi la pasvorton de via antaŭa privata ŝlosilo al via nuna ensaluta pasvorto:",
+ " If you don't remember your old password you can ask your administrator to recover your files." : "Se vi ne memoras vian antaŭan pasvorton, vi povas peti al via administranto restaŭri viajn dosierojn.",
"Old log-in password" : "Malnova ensaluta pasvorto",
"Current log-in password" : "Nuna ensaluta pasvorto",
"Update Private Key Password" : "Ĝisdatigi la pasvorton de la malpublika ŝlosilo",
- "Enable password recovery:" : "Kapabligi restaŭron de pasvorto:",
- "Enabled" : "Kapabligita",
- "Disabled" : "Malkapabligita"
+ "Enable password recovery:" : "Ŝalti restaŭron de pasvorto:",
+ "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ŝalti tiun opcion ebligas al vi rehavi aliron al viaj ĉifritaj dosierojn okaze de pasvorta perdo.",
+ "Enabled" : "Ŝaltita",
+ "Disabled" : "Malŝaltita",
+ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Vi devas transigi viajn ĉifroŝlosilojn el antaŭa versio (ownCloud ⩽ 8.0) al nova. Bv. ruli komandlinie „occ encryption:migrate“ aŭ kontakti vian administranton."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index e0b274cdc76..a56668c493f 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -194,6 +194,9 @@ OC.FileUpload.prototype = {
var data = this.data;
var file = this.getFile();
+ if (self.aborted === true) {
+ return $.Deferred().resolve().promise();
+ }
// it was a folder upload, so make sure the parent directory exists already
var folderPromise;
if (file.relativePath) {
@@ -243,8 +246,10 @@ OC.FileUpload.prototype = {
}
// wait for creation of the required directory before uploading
- $.when(folderPromise, chunkFolderPromise).then(function() {
- data.submit();
+ return Promise.all([folderPromise, chunkFolderPromise]).then(function() {
+ if (self.aborted !== true) {
+ data.submit();
+ }
}, function() {
self.abort();
});
@@ -295,6 +300,7 @@ OC.FileUpload.prototype = {
}
this.data.abort();
this.deleteUpload();
+ this.aborted = true;
},
/**
@@ -317,7 +323,7 @@ OC.FileUpload.prototype = {
if (response.errorThrown) {
// attempt parsing Sabre exception is available
var xml = response.jqXHR.responseXML;
- if (xml.documentElement.localName === 'error' && xml.documentElement.namespaceURI === 'DAV:') {
+ if (xml && xml.documentElement.localName === 'error' && xml.documentElement.namespaceURI === 'DAV:') {
var messages = xml.getElementsByTagNameNS('http://sabredav.org/ns', 'message');
var exceptions = xml.getElementsByTagNameNS('http://sabredav.org/ns', 'exception');
if (messages.length) {
@@ -554,7 +560,15 @@ OC.Uploader.prototype = _.extend({
var self = this;
_.each(uploads, function(upload) {
self._uploads[upload.data.uploadId] = upload;
- upload.submit();
+ });
+ self.totalToUpload = _.reduce(uploads, function(memo, upload) { return memo+upload.getFile().size; }, 0);
+ var semaphore = new OCA.Files.Semaphore(5);
+ var promises = _.map(uploads, function(upload) {
+ return semaphore.acquire().then(function(){
+ return upload.submit().then(function(){
+ semaphore.release();
+ });
+ });
});
},
@@ -861,7 +875,6 @@ OC.Uploader.prototype = _.extend({
autoUpload: false,
sequentialUploads: false,
limitConcurrentUploads: 10,
- //singleFileUploads is on by default, so the data.files array will always have length 1
/**
* on first add of every selection
* - check all files of originalFiles array with files in dir
@@ -886,15 +899,6 @@ OC.Uploader.prototype = _.extend({
// can't link directly due to jQuery not liking cyclic deps on its ajax object
data.uploadId = upload.getId();
- // we need to collect all data upload objects before
- // starting the upload so we can check their existence
- // and set individual conflict actions. Unfortunately,
- // there is only one variable that we can use to identify
- // the selection a data upload is part of, so we have to
- // collect them in data.originalFiles turning
- // singleFileUploads off is not an option because we want
- // to gracefully handle server errors like 'already exists'
-
// create a container where we can store the data objects
if ( ! data.originalFiles.selection ) {
// initialize selection and remember number of files to upload
@@ -1030,7 +1034,7 @@ OC.Uploader.prototype = _.extend({
self.removeUpload(upload);
- if (data.textStatus === 'abort') {
+ if (data.textStatus === 'abort' || data.errorThrown === 'abort') {
self.showUploadCancelMessage();
} else if (status === 412) {
// file already exists
@@ -1134,14 +1138,15 @@ OC.Uploader.prototype = _.extend({
});
fileupload.on('fileuploadprogressall', function(e, data) {
self.log('progress handle fileuploadprogressall', e, data);
- var progress = (data.loaded / data.total) * 100;
+ var total = self.totalToUpload;
+ var progress = (data.loaded / total) * 100;
var thisUpdate = new Date().getTime();
var diffUpdate = (thisUpdate - lastUpdate)/1000; // eg. 2s
lastUpdate = thisUpdate;
var diffSize = data.loaded - lastSize;
lastSize = data.loaded;
diffSize = diffSize / diffUpdate; // apply timing factor, eg. 1MiB/2s = 0.5MiB/s, unit is byte per second
- var remainingSeconds = ((data.total - data.loaded) / diffSize);
+ var remainingSeconds = ((total - data.loaded) / diffSize);
if(remainingSeconds >= 0) {
bufferTotal = bufferTotal - (buffer[bufferIndex]) + remainingSeconds;
buffer[bufferIndex] = remainingSeconds; //buffer to make it smoother
@@ -1164,7 +1169,7 @@ OC.Uploader.prototype = _.extend({
}
self._setProgressBarText(h, h, t('files', '{loadedSize} of {totalSize} ({bitrate})' , {
loadedSize: humanFileSize(data.loaded),
- totalSize: humanFileSize(data.total),
+ totalSize: humanFileSize(total),
bitrate: humanFileSize(data.bitrate / 8) + '/s'
}));
self._setProgressBarValue(progress);
diff --git a/apps/files/js/operationprogressbar.js b/apps/files/js/operationprogressbar.js
index efeea4ad78f..d07cea91235 100644
--- a/apps/files/js/operationprogressbar.js
+++ b/apps/files/js/operationprogressbar.js
@@ -32,8 +32,9 @@
},
hideCancelButton: function() {
+ var self = this;
$('#uploadprogresswrapper .stop').fadeOut(function() {
- this.$el.trigger(new $.Event('resized'));
+ self.$el.trigger(new $.Event('resized'));
});
},
diff --git a/apps/files/tests/js/fileUploadSpec.js b/apps/files/tests/js/fileUploadSpec.js
index 0d2c9eb0697..b7955f3b837 100644
--- a/apps/files/tests/js/fileUploadSpec.js
+++ b/apps/files/tests/js/fileUploadSpec.js
@@ -84,33 +84,41 @@ describe('OC.Upload tests', function() {
}
describe('Adding files for upload', function() {
- it('adds file when size is below limits', function() {
+ it('adds file when size is below limits', function(done) {
var result = addFiles(uploader, [testFile]);
expect(result[0]).not.toEqual(null);
- expect(result[0].submit.calledOnce).toEqual(true);
+ result[0].submit.callsFake(function(){
+ expect(result[0].submit.calledOnce).toEqual(true);
+ done();
+ });
});
- it('adds file when free space is unknown', function() {
+ it('adds file when free space is unknown', function(done) {
var result;
$('#free_space').val(-2);
result = addFiles(uploader, [testFile]);
-
expect(result[0]).not.toEqual(null);
- expect(result[0].submit.calledOnce).toEqual(true);
- expect(failStub.notCalled).toEqual(true);
+ result[0].submit.callsFake(function(){
+ expect(result[0].submit.calledOnce).toEqual(true);
+ expect(failStub.notCalled).toEqual(true);
+ done();
+ });
});
- it('does not add file if it exceeds free space', function() {
+ it('does not add file if it exceeds free space', function(done) {
var result;
$('#free_space').val(1000);
+ failStub.callsFake(function(){
+ expect(failStub.calledOnce).toEqual(true);
+ expect(failStub.getCall(0).args[1].textStatus).toEqual('notenoughspace');
+ expect(failStub.getCall(0).args[1].errorThrown).toEqual(
+ 'Not enough free space, you are uploading 5 KB but only 1000 B is left'
+ );
+ setTimeout(done, 0);
+ });
result = addFiles(uploader, [testFile]);
expect(result[0]).toEqual(null);
- expect(failStub.calledOnce).toEqual(true);
- expect(failStub.getCall(0).args[1].textStatus).toEqual('notenoughspace');
- expect(failStub.getCall(0).args[1].errorThrown).toEqual(
- 'Not enough free space, you are uploading 5 KB but only 1000 B is left'
- );
});
});
describe('Upload conflicts', function() {
@@ -158,38 +166,60 @@ describe('OC.Upload tests', function() {
fileList.destroy();
});
- it('does not show conflict dialog when no client side conflict', function() {
+ it('does not show conflict dialog when no client side conflict', function(done) {
+ $('#free_space').val(200000);
+ var counter = 0;
+ var fun = function() {
+ counter++;
+ if(counter != 2) {
+ return;
+ }
+ expect(result[0].submit.calledOnce).toEqual(true);
+ expect(result[1].submit.calledOnce).toEqual(true);
+ setTimeout(done, 0);
+ };
var result = addFiles(uploader, [{name: 'noconflict.txt'}, {name: 'noconflict2.txt'}]);
+ result[0].submit.callsFake(fun);
+ result[1].submit.callsFake(fun);
expect(conflictDialogStub.notCalled).toEqual(true);
- expect(result[0].submit.calledOnce).toEqual(true);
- expect(result[1].submit.calledOnce).toEqual(true);
+
});
- it('shows conflict dialog when no client side conflict', function() {
+ it('shows conflict dialog when no client side conflict', function(done) {
+ var counter = 0;
+ conflictDialogStub.callsFake(function(){
+ counter++;
+ if(counter != 3) {
+ return $.Deferred().resolve().promise();
+ }
+ setTimeout(function() {
+ expect(conflictDialogStub.callCount).toEqual(3);
+ expect(conflictDialogStub.getCall(1).args[0].getFileName())
+ .toEqual('conflict.txt');
+ expect(conflictDialogStub.getCall(1).args[1])
+ .toEqual({ name: 'conflict.txt', mimetype: 'text/plain', directory: '/' });
+ expect(conflictDialogStub.getCall(1).args[2]).toEqual({ name: 'conflict.txt' });
+
+ // yes, the dialog must be called several times...
+ expect(conflictDialogStub.getCall(2).args[0].getFileName()).toEqual('conflict2.txt');
+ expect(conflictDialogStub.getCall(2).args[1])
+ .toEqual({ name: 'conflict2.txt', mimetype: 'text/plain', directory: '/' });
+ expect(conflictDialogStub.getCall(2).args[2]).toEqual({ name: 'conflict2.txt' });
+
+ expect(result[0].submit.calledOnce).toEqual(false);
+ expect(result[1].submit.calledOnce).toEqual(false);
+ expect(result[2].submit.calledOnce).toEqual(true);
+ done();
+ }, 0);
+ });
var result = addFiles(uploader, [
{name: 'conflict.txt'},
{name: 'conflict2.txt'},
{name: 'noconflict.txt'}
]);
- expect(conflictDialogStub.callCount).toEqual(3);
- expect(conflictDialogStub.getCall(1).args[0].getFileName())
- .toEqual('conflict.txt');
- expect(conflictDialogStub.getCall(1).args[1])
- .toEqual({ name: 'conflict.txt', mimetype: 'text/plain', directory: '/' });
- expect(conflictDialogStub.getCall(1).args[2]).toEqual({ name: 'conflict.txt' });
-
- // yes, the dialog must be called several times...
- expect(conflictDialogStub.getCall(2).args[0].getFileName()).toEqual('conflict2.txt');
- expect(conflictDialogStub.getCall(2).args[1])
- .toEqual({ name: 'conflict2.txt', mimetype: 'text/plain', directory: '/' });
- expect(conflictDialogStub.getCall(2).args[2]).toEqual({ name: 'conflict2.txt' });
-
- expect(result[0].submit.calledOnce).toEqual(false);
- expect(result[1].submit.calledOnce).toEqual(false);
- expect(result[2].submit.calledOnce).toEqual(true);
});
- it('cancels upload when skipping file in conflict mode', function() {
+ it('cancels upload when skipping file in conflict mode', function(done) {
var fileData = {name: 'conflict.txt'};
var uploadData = addFiles(uploader, [
fileData
@@ -197,11 +227,14 @@ describe('OC.Upload tests', function() {
var upload = new OC.FileUpload(uploader, uploadData[0]);
var deleteStub = sinon.stub(upload, 'deleteUpload');
+ deleteStub.callsFake(function(){
+ expect(deleteStub.calledOnce).toEqual(true);
+ done();
+ });
uploader.onSkip(upload);
- expect(deleteStub.calledOnce).toEqual(true);
});
- it('overwrites file when choosing replace in conflict mode', function() {
+ it('overwrites file when choosing replace in conflict mode', function(done) {
var fileData = {name: 'conflict.txt'};
var uploadData = addFiles(uploader, [
fileData
@@ -210,12 +243,14 @@ describe('OC.Upload tests', function() {
expect(uploadData[0].submit.notCalled).toEqual(true);
var upload = new OC.FileUpload(uploader, uploadData[0]);
-
+ uploadData[0].submit.callsFake(function(){
+ expect(upload.getConflictMode()).toEqual(OC.FileUpload.CONFLICT_MODE_OVERWRITE);
+ expect(uploadData[0].submit.callCount).toEqual(1);
+ done();
+ });
uploader.onReplace(upload);
- expect(upload.getConflictMode()).toEqual(OC.FileUpload.CONFLICT_MODE_OVERWRITE);
- expect(uploadData[0].submit.calledOnce).toEqual(true);
});
- it('autorenames file when choosing replace in conflict mode', function() {
+ it('autorenames file when choosing replace in conflict mode', function(done) {
// needed for _.defer call
var clock = sinon.useFakeTimers();
var fileData = {name: 'conflict.txt'};
@@ -227,20 +262,31 @@ describe('OC.Upload tests', function() {
var upload = new OC.FileUpload(uploader, uploadData[0]);
var getResponseStatusStub = sinon.stub(upload, 'getResponseStatus');
+ var counter = 0;
+ uploadData[0].submit.callsFake(function(){
+ counter++;
+ if(counter===1)
+ {
+ expect(upload.getConflictMode()).toEqual(OC.FileUpload.CONFLICT_MODE_AUTORENAME);
+ expect(upload.getFileName()).toEqual('conflict (2).txt');
+ expect(uploadData[0].submit.calledOnce).toEqual(true);
+ getResponseStatusStub.returns(412);
+ uploader.fileUploadParam.fail.call($dummyUploader[0], {}, uploadData[0]);
+ clock.tick(500);
+ }
+ if(counter===2)
+ {
+ expect(upload.getFileName()).toEqual('conflict (3).txt');
+ expect(uploadData[0].submit.calledTwice).toEqual(true);
+
+ clock.restore();
+ done();
+ }
+ });
uploader.onAutorename(upload);
- expect(upload.getConflictMode()).toEqual(OC.FileUpload.CONFLICT_MODE_AUTORENAME);
- expect(upload.getFileName()).toEqual('conflict (2).txt');
- expect(uploadData[0].submit.calledOnce).toEqual(true);
// in case of server-side conflict, tries to rename again
- getResponseStatusStub.returns(412);
- uploader.fileUploadParam.fail.call($dummyUploader[0], {}, uploadData[0]);
- clock.tick(500);
- expect(upload.getFileName()).toEqual('conflict (3).txt');
- expect(uploadData[0].submit.calledTwice).toEqual(true);
-
- clock.restore();
});
});
});
diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php
index eea6715e57d..ce7ba409199 100644
--- a/apps/files_sharing/appinfo/routes.php
+++ b/apps/files_sharing/appinfo/routes.php
@@ -94,6 +94,11 @@ return [
'url' => '/api/v1/sharees',
'verb' => 'GET',
],
+ [
+ 'name' => 'ShareesAPI#findRecommended',
+ 'url' => '/api/v1/sharees_recommended',
+ 'verb' => 'GET',
+ ],
/*
* Remote Shares
*/
diff --git a/apps/files_sharing/l10n/zh_CN.js b/apps/files_sharing/l10n/zh_CN.js
index d5bc105d717..8fee78fb932 100644
--- a/apps/files_sharing/l10n/zh_CN.js
+++ b/apps/files_sharing/l10n/zh_CN.js
@@ -22,6 +22,7 @@ OC.L10N.register(
"Download" : "下载",
"Delete" : "删除",
"You can upload into this folder" : "您可以上传文件至此文件夹",
+ "Terms of service" : "服务条款",
"No compatible server found at {remote}" : " {remote} 未发现匹配的服务器",
"Invalid server URL" : "无效的服务器地址",
"Failed to add the public link to your Nextcloud" : "添加公开链接到您的 Nextcloud 失败",
diff --git a/apps/files_sharing/l10n/zh_CN.json b/apps/files_sharing/l10n/zh_CN.json
index d83347d65ba..56973f852b5 100644
--- a/apps/files_sharing/l10n/zh_CN.json
+++ b/apps/files_sharing/l10n/zh_CN.json
@@ -20,6 +20,7 @@
"Download" : "下载",
"Delete" : "删除",
"You can upload into this folder" : "您可以上传文件至此文件夹",
+ "Terms of service" : "服务条款",
"No compatible server found at {remote}" : " {remote} 未发现匹配的服务器",
"Invalid server URL" : "无效的服务器地址",
"Failed to add the public link to your Nextcloud" : "添加公开链接到您的 Nextcloud 失败",
diff --git a/apps/files_sharing/lib/Controller/ShareController.php b/apps/files_sharing/lib/Controller/ShareController.php
index 7c1a297d354..99685f671d3 100644
--- a/apps/files_sharing/lib/Controller/ShareController.php
+++ b/apps/files_sharing/lib/Controller/ShareController.php
@@ -361,6 +361,7 @@ class ShareController extends AuthPublicShareController {
$folder->assign('isPublic', true);
$folder->assign('hideFileList', $hideFileList);
$folder->assign('publicUploadEnabled', 'no');
+ // default to list view
$folder->assign('showgridview', false);
$folder->assign('uploadMaxFilesize', $maxUploadFilesize);
$folder->assign('uploadMaxHumanFilesize', \OCP\Util::humanFileSize($maxUploadFilesize));
@@ -372,6 +373,7 @@ class ShareController extends AuthPublicShareController {
$shareIsFolder = false;
}
+ // default to list view
$shareTmpl['showgridview'] = false;
$shareTmpl['hideFileList'] = $hideFileList;
diff --git a/apps/files_sharing/lib/Controller/ShareesAPIController.php b/apps/files_sharing/lib/Controller/ShareesAPIController.php
index c39547bdea5..a52ee88855a 100644
--- a/apps/files_sharing/lib/Controller/ShareesAPIController.php
+++ b/apps/files_sharing/lib/Controller/ShareesAPIController.php
@@ -29,17 +29,29 @@ declare(strict_types=1);
*/
namespace OCA\Files_Sharing\Controller;
+use function array_filter;
+use function array_slice;
+use function array_values;
+use Generator;
+use OC\Collaboration\Collaborators\SearchResult;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSBadRequestException;
use OCP\AppFramework\OCSController;
use OCP\Collaboration\Collaborators\ISearch;
+use OCP\Collaboration\Collaborators\ISearchResult;
+use OCP\Collaboration\Collaborators\SearchResultType;
use OCP\IRequest;
use OCP\IConfig;
use OCP\IURLGenerator;
use OCP\Share;
use OCP\Share\IManager;
+use function usort;
class ShareesAPIController extends OCSController {
+
+ /** @var userId */
+ protected $userId;
+
/** @var IConfig */
protected $config;
@@ -87,6 +99,7 @@ class ShareesAPIController extends OCSController {
private $collaboratorSearch;
/**
+ * @param string $UserId
* @param string $appName
* @param IRequest $request
* @param IConfig $config
@@ -95,6 +108,7 @@ class ShareesAPIController extends OCSController {
* @param ISearch $collaboratorSearch
*/
public function __construct(
+ $UserId,
string $appName,
IRequest $request,
IConfig $config,
@@ -103,7 +117,7 @@ class ShareesAPIController extends OCSController {
ISearch $collaboratorSearch
) {
parent::__construct($appName, $request);
-
+ $this->userId = $UserId;
$this->config = $config;
$this->urlGenerator = $urlGenerator;
$this->shareManager = $shareManager;
@@ -213,6 +227,148 @@ class ShareesAPIController extends OCSController {
}
/**
+ * @param string $user
+ * @param int $shareType
+ *
+ * @return Generator<array<string>>
+ */
+ private function getAllShareesByType(string $user, int $shareType): Generator {
+ $offset = 0;
+ $pageSize = 50;
+
+ while (count($page = $this->shareManager->getSharesBy(
+ $user,
+ $shareType,
+ null,
+ false,
+ $pageSize,
+ $offset
+ ))) {
+ foreach ($page as $share) {
+ yield [$share->getSharedWith(), $share->getSharedWithDisplayName() ?? $share->getSharedWith()];
+ }
+
+ $offset += $pageSize;
+ }
+ }
+
+ private function sortShareesByFrequency(array $sharees): array {
+ usort($sharees, function(array $s1, array $s2) {
+ return $s2['count'] - $s1['count'];
+ });
+ return $sharees;
+ }
+
+ private $searchResultTypeMap = [
+ Share::SHARE_TYPE_USER => 'users',
+ Share::SHARE_TYPE_GROUP => 'groups',
+ Share::SHARE_TYPE_REMOTE => 'remotes',
+ Share::SHARE_TYPE_REMOTE_GROUP => 'remote_groups',
+ Share::SHARE_TYPE_EMAIL => 'emails',
+ ];
+
+ private function getAllSharees(string $user, array $shareTypes): ISearchResult {
+ $result = [];
+ foreach ($shareTypes as $shareType) {
+ $sharees = $this->getAllShareesByType($user, $shareType);
+ $shareTypeResults = [];
+ foreach ($sharees as list($sharee, $displayname)) {
+ if (!isset($this->searchResultTypeMap[$shareType])) {
+ continue;
+ }
+
+ if (!isset($shareTypeResults[$sharee])) {
+ $shareTypeResults[$sharee] = [
+ 'count' => 1,
+ 'label' => $displayname,
+ 'value' => [
+ 'shareType' => $shareType,
+ 'shareWith' => $sharee,
+ ],
+ ];
+ } else {
+ $shareTypeResults[$sharee]['count']++;
+ }
+ }
+ $result = array_merge($result, array_values($shareTypeResults));
+ }
+
+ $top5 = array_slice(
+ $this->sortShareesByFrequency($result),
+ 0,
+ 5
+ );
+
+ $searchResult = new SearchResult();
+ foreach ($this->searchResultTypeMap as $int => $str) {
+ $searchResult->addResultSet(new SearchResultType($str), [], []);
+ foreach ($top5 as $x) {
+ if ($x['value']['shareType'] === $int) {
+ $searchResult->addResultSet(new SearchResultType($str), [], [$x]);
+ }
+ }
+ }
+ return $searchResult;
+ }
+
+ /**
+ * @NoAdminRequired
+ *
+ * @param string $itemType
+ * @return DataResponse
+ * @throws OCSBadRequestException
+ */
+ public function findRecommended(string $itemType = null, $shareType = null): DataResponse {
+ $shareTypes = [
+ Share::SHARE_TYPE_USER,
+ ];
+
+ if ($itemType === null) {
+ throw new OCSBadRequestException('Missing itemType');
+ } elseif ($itemType === 'file' || $itemType === 'folder') {
+ if ($this->shareManager->allowGroupSharing()) {
+ $shareTypes[] = Share::SHARE_TYPE_GROUP;
+ }
+
+ if ($this->isRemoteSharingAllowed($itemType)) {
+ $shareTypes[] = Share::SHARE_TYPE_REMOTE;
+ }
+
+ if ($this->isRemoteGroupSharingAllowed($itemType)) {
+ $shareTypes[] = Share::SHARE_TYPE_REMOTE_GROUP;
+ }
+
+ if ($this->shareManager->shareProviderExists(Share::SHARE_TYPE_EMAIL)) {
+ $shareTypes[] = Share::SHARE_TYPE_EMAIL;
+ }
+
+ if ($this->shareManager->shareProviderExists(Share::SHARE_TYPE_ROOM)) {
+ $shareTypes[] = Share::SHARE_TYPE_ROOM;
+ }
+ } else {
+ $shareTypes[] = Share::SHARE_TYPE_GROUP;
+ $shareTypes[] = Share::SHARE_TYPE_EMAIL;
+ }
+
+ // FIXME: DI
+ if (\OC::$server->getAppManager()->isEnabledForUser('circles') && class_exists('\OCA\Circles\ShareByCircleProvider')) {
+ $shareTypes[] = Share::SHARE_TYPE_CIRCLE;
+ }
+
+ if (isset($_GET['shareType']) && is_array($_GET['shareType'])) {
+ $shareTypes = array_intersect($shareTypes, $_GET['shareType']);
+ sort($shareTypes);
+ } else if (is_numeric($shareType)) {
+ $shareTypes = array_intersect($shareTypes, [(int) $shareType]);
+ sort($shareTypes);
+ }
+
+ return new DataResponse(
+ $this->getAllSharees($this->userId, $shareTypes)->asArray()
+ );
+ }
+
+ /**
* Method to get out the static call for better testing
*
* @param string $itemType
diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php
index eccdc49bc31..792b4d23804 100644
--- a/apps/files_sharing/templates/public.php
+++ b/apps/files_sharing/templates/public.php
@@ -46,14 +46,16 @@ $maxUploadFilesize = min($upload_max_filesize, $post_max_size);
</div>
<?php endif; ?>
-<?php if ($_['showgridview'] && empty($_['dir']) === false) { ?>
- <input type="checkbox" class="hidden-visually" id="showgridview"
- <?php if($_['showgridview']) { ?>checked="checked" <?php } ?>/>
- <label id="view-toggle" for="showgridview" class="button <?php p($_['showgridview'] ? 'icon-toggle-filelist' : 'icon-toggle-pictures') ?>"
- title="<?php p($l->t('Toggle grid view'))?>"></label>
-<?php } ?>
-
<?php if (!isset($_['hideFileList']) || (isset($_['hideFileList']) && $_['hideFileList'] === false)) { ?>
+ <!-- ONLY if this is a folder, we show the grid toggle button -->
+ <?php if (empty($_['dir']) === false) { ?>
+ <input type="checkbox" class="hidden-visually" id="showgridview"
+ <?php if($_['showgridview']) { ?>checked="checked" <?php } ?>/>
+ <label id="view-toggle" for="showgridview" class="button <?php p($_['showgridview'] ? 'icon-toggle-filelist' : 'icon-toggle-pictures') ?>"
+ title="<?php p($l->t('Toggle grid view'))?>"></label>
+ <?php } ?>
+
+ <!-- files listing -->
<div id="files-public-content">
<div id="preview">
<?php if (isset($_['folder'])): ?>
diff --git a/apps/files_sharing/tests/Controller/ShareesAPIControllerTest.php b/apps/files_sharing/tests/Controller/ShareesAPIControllerTest.php
index adfb72f550a..618a1095407 100644
--- a/apps/files_sharing/tests/Controller/ShareesAPIControllerTest.php
+++ b/apps/files_sharing/tests/Controller/ShareesAPIControllerTest.php
@@ -50,6 +50,9 @@ class ShareesAPIControllerTest extends TestCase {
/** @var ShareesAPIController */
protected $sharees;
+ /** @var string */
+ protected $uid;
+
/** @var IRequest|\PHPUnit_Framework_MockObject_MockObject */
protected $request;
@@ -62,6 +65,7 @@ class ShareesAPIControllerTest extends TestCase {
protected function setUp() {
parent::setUp();
+ $this->uid = 'test123';
$this->request = $this->createMock(IRequest::class);
$this->shareManager = $this->createMock(IManager::class);
@@ -74,6 +78,7 @@ class ShareesAPIControllerTest extends TestCase {
$this->collaboratorSearch = $this->createMock(ISearch::class);
$this->sharees = new ShareesAPIController(
+ $this->uid,
'files_sharing',
$this->request,
$configMock,
@@ -243,6 +248,8 @@ class ShareesAPIControllerTest extends TestCase {
->method('allowGroupSharing')
->willReturn($allowGroupSharing);
+ /** @var string */
+ $uid = 'test123';
/** @var IRequest|\PHPUnit_Framework_MockObject_MockObject $request */
$request = $this->createMock(IRequest::class);
/** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject $urlGenerator */
@@ -251,6 +258,7 @@ class ShareesAPIControllerTest extends TestCase {
/** @var \PHPUnit_Framework_MockObject_MockObject|\OCA\Files_Sharing\Controller\ShareesAPIController $sharees */
$sharees = $this->getMockBuilder('\OCA\Files_Sharing\Controller\ShareesAPIController')
->setConstructorArgs([
+ $uid,
'files_sharing',
$request,
$config,
@@ -335,6 +343,8 @@ class ShareesAPIControllerTest extends TestCase {
$config->expects($this->never())
->method('getAppValue');
+ /** @var string */
+ $uid = 'test123';
/** @var IRequest|\PHPUnit_Framework_MockObject_MockObject $request */
$request = $this->createMock(IRequest::class);
/** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject $urlGenerator */
@@ -343,6 +353,7 @@ class ShareesAPIControllerTest extends TestCase {
/** @var \PHPUnit_Framework_MockObject_MockObject|\OCA\Files_Sharing\Controller\ShareesAPIController $sharees */
$sharees = $this->getMockBuilder('\OCA\Files_Sharing\Controller\ShareesAPIController')
->setConstructorArgs([
+ $uid,
'files_sharing',
$request,
$config,
diff --git a/apps/updatenotification/l10n/ja.js b/apps/updatenotification/l10n/ja.js
index f00d34b9501..f6e3b77c5bb 100644
--- a/apps/updatenotification/l10n/ja.js
+++ b/apps/updatenotification/l10n/ja.js
@@ -30,6 +30,7 @@ OC.L10N.register(
"Checking apps for compatible updates" : "互換性のあるアップデートの有無を確認する",
"<strong>All</strong> apps have an update for this version available" : "<strong>すべての</strong> アプリにこのバージョンのアップデートがあります",
"View changelog" : "変更履歴を確認する",
+ "Beta" : "ベータ",
"_<strong>%n</strong> app has no update for this version available_::_<strong>%n</strong> apps have no update for this version available_" : ["<strong>%n</strong> アプリにこのバージョンのアップデートがありません"],
"Could not start updater, please try the manual update" : "アップデータを起動できませんでした。手動アップデートをお試しください",
"A new version is available: %s" : "新しいバージョンが利用可能: %s",
diff --git a/apps/updatenotification/l10n/ja.json b/apps/updatenotification/l10n/ja.json
index 65e6a91ac18..bb5d38c56cb 100644
--- a/apps/updatenotification/l10n/ja.json
+++ b/apps/updatenotification/l10n/ja.json
@@ -28,6 +28,7 @@
"Checking apps for compatible updates" : "互換性のあるアップデートの有無を確認する",
"<strong>All</strong> apps have an update for this version available" : "<strong>すべての</strong> アプリにこのバージョンのアップデートがあります",
"View changelog" : "変更履歴を確認する",
+ "Beta" : "ベータ",
"_<strong>%n</strong> app has no update for this version available_::_<strong>%n</strong> apps have no update for this version available_" : ["<strong>%n</strong> アプリにこのバージョンのアップデートがありません"],
"Could not start updater, please try the manual update" : "アップデータを起動できませんでした。手動アップデートをお試しください",
"A new version is available: %s" : "新しいバージョンが利用可能: %s",
diff --git a/apps/user_ldap/l10n/cs.js b/apps/user_ldap/l10n/cs.js
index ddacc7a8ca7..875fb24b2df 100644
--- a/apps/user_ldap/l10n/cs.js
+++ b/apps/user_ldap/l10n/cs.js
@@ -177,7 +177,7 @@ OC.L10N.register(
"User Home Folder Naming Rule" : "Pravidlo pojmenování domovské složky uživatele",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ponechte prázdné pro uživatelské jméno (výchozí). Jinak uveďte LDAP/AD parametr.",
"\"$home\" Placeholder Field" : "Výplňová kolonka „$home“",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home bude v nastavení externího úložiště nahrazeno hodnotou zadaného atributu",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home bude v nastavení externího úložiště nahrazeno hodnotou zadaného atributu",
"Internal Username" : "Interní uživatelské jméno",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Ve výchozím nastavení bude interní uživatelské jméno vytvořeno z atributu UUID. To zajišťuje, že je uživatelské jméno unikátní a znaky nemusí být převáděny. Interní uživatelské jméno má omezení, podle kterého jsou povoleny jen následující znaky [ a-zA-Z0-9_.@- ]. Ostatní znaky jsou nahrazeny jejich protějšky z ASCII nebo prostě vynechány. Při konfliktech bude přidáno/zvýšeno číslo. Interní uživatelské jméno slouží pro interní identifikaci uživatele. Je také výchozím názvem domovského adresáře uživatele. Je také součástí URL, např. pro služby *DAV. Tímto nastavením může být výchozí chování změněno. Ponechte jej prázdné, chcete-li zachovat výchozí nastavení. Změny se projeví pouze u nově namapovaných (přidaných) uživatelů LDAP.",
"Internal Username Attribute:" : "Atribut interního uživatelského jména:",
diff --git a/apps/user_ldap/l10n/cs.json b/apps/user_ldap/l10n/cs.json
index 9f62035bfb3..0fde7a9e258 100644
--- a/apps/user_ldap/l10n/cs.json
+++ b/apps/user_ldap/l10n/cs.json
@@ -175,7 +175,7 @@
"User Home Folder Naming Rule" : "Pravidlo pojmenování domovské složky uživatele",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ponechte prázdné pro uživatelské jméno (výchozí). Jinak uveďte LDAP/AD parametr.",
"\"$home\" Placeholder Field" : "Výplňová kolonka „$home“",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home bude v nastavení externího úložiště nahrazeno hodnotou zadaného atributu",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home bude v nastavení externího úložiště nahrazeno hodnotou zadaného atributu",
"Internal Username" : "Interní uživatelské jméno",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Ve výchozím nastavení bude interní uživatelské jméno vytvořeno z atributu UUID. To zajišťuje, že je uživatelské jméno unikátní a znaky nemusí být převáděny. Interní uživatelské jméno má omezení, podle kterého jsou povoleny jen následující znaky [ a-zA-Z0-9_.@- ]. Ostatní znaky jsou nahrazeny jejich protějšky z ASCII nebo prostě vynechány. Při konfliktech bude přidáno/zvýšeno číslo. Interní uživatelské jméno slouží pro interní identifikaci uživatele. Je také výchozím názvem domovského adresáře uživatele. Je také součástí URL, např. pro služby *DAV. Tímto nastavením může být výchozí chování změněno. Ponechte jej prázdné, chcete-li zachovat výchozí nastavení. Změny se projeví pouze u nově namapovaných (přidaných) uživatelů LDAP.",
"Internal Username Attribute:" : "Atribut interního uživatelského jména:",
diff --git a/apps/user_ldap/l10n/de.js b/apps/user_ldap/l10n/de.js
index 62c40512e75..2ccfd82c172 100644
--- a/apps/user_ldap/l10n/de.js
+++ b/apps/user_ldap/l10n/de.js
@@ -177,7 +177,7 @@ OC.L10N.register(
"User Home Folder Naming Rule" : "Benennungsregel für das Home-Verzeichnis des Benutzers",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfall trage ein LDAP/AD-Attribut ein.",
"\"$home\" Placeholder Field" : "\"$home\" Platzhalter-Feld",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home in der Konfiguration eines extern angeschlossenen Speichers wird mit dem Wert des angegebenen Attributs ersetzt",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in der Konfiguration eines extern angeschlossenen Speichers wird mit dem Wert des angegebenen Attributs ersetzt",
"Internal Username" : "Interner Benutzername",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standardmäßig wird der interne Benutzername aus dem UUID-Atribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [ a-zA-Z0-9_.@- ]. Andere Zeichen werden mit ihrer ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwandt, um den Benutzer intern zu identifizieren. Er ist ausserdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Bespiel für alle *DAV-Dienste. Mit dieser Einstellung, kann das Standardverhalten geändert werden. Für die Standardeinstellung, lasse das Eingabefeld leer. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus.",
"Internal Username Attribute:" : "Attribut für interne Benutzernamen:",
diff --git a/apps/user_ldap/l10n/de.json b/apps/user_ldap/l10n/de.json
index 1e5bdef2bbc..8620ff5d780 100644
--- a/apps/user_ldap/l10n/de.json
+++ b/apps/user_ldap/l10n/de.json
@@ -175,7 +175,7 @@
"User Home Folder Naming Rule" : "Benennungsregel für das Home-Verzeichnis des Benutzers",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfall trage ein LDAP/AD-Attribut ein.",
"\"$home\" Placeholder Field" : "\"$home\" Platzhalter-Feld",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home in der Konfiguration eines extern angeschlossenen Speichers wird mit dem Wert des angegebenen Attributs ersetzt",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in der Konfiguration eines extern angeschlossenen Speichers wird mit dem Wert des angegebenen Attributs ersetzt",
"Internal Username" : "Interner Benutzername",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standardmäßig wird der interne Benutzername aus dem UUID-Atribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [ a-zA-Z0-9_.@- ]. Andere Zeichen werden mit ihrer ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwandt, um den Benutzer intern zu identifizieren. Er ist ausserdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Bespiel für alle *DAV-Dienste. Mit dieser Einstellung, kann das Standardverhalten geändert werden. Für die Standardeinstellung, lasse das Eingabefeld leer. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus.",
"Internal Username Attribute:" : "Attribut für interne Benutzernamen:",
diff --git a/apps/user_ldap/l10n/de_DE.js b/apps/user_ldap/l10n/de_DE.js
index ea86eccc728..d9eeeb7515e 100644
--- a/apps/user_ldap/l10n/de_DE.js
+++ b/apps/user_ldap/l10n/de_DE.js
@@ -177,7 +177,7 @@ OC.L10N.register(
"User Home Folder Naming Rule" : "Benennungsregel für das Home-Verzeichnis des Benutzers",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfalls tragen Sie bitte ein LDAP/AD-Attribut ein.",
"\"$home\" Placeholder Field" : "\"$home\" Platzhalter-Feld",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home in der Konfiguration eines extern angeschlossenen Speichers wird mit dem Wert des angegebenen Attributs ersetzt",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in der Konfiguration eines extern angeschlossenen Speichers wird mit dem Wert des angegebenen Attributs ersetzt",
"Internal Username" : "Interner Benutzername",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standardmäßig wird der interne Benutzername aus dem UUID-Atribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [ a-zA-Z0-9_.@- ]. Andere Zeichen werden mit ihrer ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwandt, um den Benutzer intern zu identifizieren. Er ist ausserdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Bespiel für alle *DAV-Dienste. Mit dieser Einstellung, kann das Standardverhalten geändert werden. Für die Standardeinstellung, lassen Sie das Eingabefeld leer. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus.",
"Internal Username Attribute:" : "Interne Eigenschaften des Benutzers:",
diff --git a/apps/user_ldap/l10n/de_DE.json b/apps/user_ldap/l10n/de_DE.json
index 61fe741adaf..82dcc1cac46 100644
--- a/apps/user_ldap/l10n/de_DE.json
+++ b/apps/user_ldap/l10n/de_DE.json
@@ -175,7 +175,7 @@
"User Home Folder Naming Rule" : "Benennungsregel für das Home-Verzeichnis des Benutzers",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfalls tragen Sie bitte ein LDAP/AD-Attribut ein.",
"\"$home\" Placeholder Field" : "\"$home\" Platzhalter-Feld",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home in der Konfiguration eines extern angeschlossenen Speichers wird mit dem Wert des angegebenen Attributs ersetzt",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in der Konfiguration eines extern angeschlossenen Speichers wird mit dem Wert des angegebenen Attributs ersetzt",
"Internal Username" : "Interner Benutzername",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standardmäßig wird der interne Benutzername aus dem UUID-Atribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [ a-zA-Z0-9_.@- ]. Andere Zeichen werden mit ihrer ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwandt, um den Benutzer intern zu identifizieren. Er ist ausserdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Bespiel für alle *DAV-Dienste. Mit dieser Einstellung, kann das Standardverhalten geändert werden. Für die Standardeinstellung, lassen Sie das Eingabefeld leer. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus.",
"Internal Username Attribute:" : "Interne Eigenschaften des Benutzers:",
diff --git a/apps/user_ldap/l10n/es_AR.js b/apps/user_ldap/l10n/es_AR.js
index 6055cd3726f..4480e70e47e 100644
--- a/apps/user_ldap/l10n/es_AR.js
+++ b/apps/user_ldap/l10n/es_AR.js
@@ -161,7 +161,6 @@ OC.L10N.register(
"Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Establecer el correo electrónico del usuario con base en el atributo LDAP. Dejelo vacío para el comportamiento predeterminado. ",
"User Home Folder Naming Rule" : "Regla de Nomenclatura para la Carpeta Inicio del Usuario",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Dejar vacío para el nombre de usuario (predeterminado). En otro caso, especifique un atributo LDAP/AD.",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home en una configuración de almacenamiento externo será reemplazado por el valor del atributo especificado",
"Internal Username" : "Nombre de usuario interno",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el nombre de usuario interno se creará con base en el atributo UUID. Esto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El nombre de usuario intenro tiene la restricción de que sólo los siguienes caracteres están permitidos: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un numero. El nombre de usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Mantengalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. ",
"Internal Username Attribute:" : "Atributo de nombre de usuario Interno:",
diff --git a/apps/user_ldap/l10n/es_AR.json b/apps/user_ldap/l10n/es_AR.json
index 58010242fb8..13586a55b2c 100644
--- a/apps/user_ldap/l10n/es_AR.json
+++ b/apps/user_ldap/l10n/es_AR.json
@@ -159,7 +159,6 @@
"Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Establecer el correo electrónico del usuario con base en el atributo LDAP. Dejelo vacío para el comportamiento predeterminado. ",
"User Home Folder Naming Rule" : "Regla de Nomenclatura para la Carpeta Inicio del Usuario",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Dejar vacío para el nombre de usuario (predeterminado). En otro caso, especifique un atributo LDAP/AD.",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home en una configuración de almacenamiento externo será reemplazado por el valor del atributo especificado",
"Internal Username" : "Nombre de usuario interno",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el nombre de usuario interno se creará con base en el atributo UUID. Esto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El nombre de usuario intenro tiene la restricción de que sólo los siguienes caracteres están permitidos: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un numero. El nombre de usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Mantengalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. ",
"Internal Username Attribute:" : "Atributo de nombre de usuario Interno:",
diff --git a/apps/user_ldap/l10n/gl.js b/apps/user_ldap/l10n/gl.js
index 56768a5abbf..61c860b67ba 100644
--- a/apps/user_ldap/l10n/gl.js
+++ b/apps/user_ldap/l10n/gl.js
@@ -177,7 +177,7 @@ OC.L10N.register(
"User Home Folder Naming Rule" : "Regra de nomeado do cartafol do usuario",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Deixar baleiro para o nome de usuario (predeterminado). Noutro caso, especifique un atributo LDAP/AD.",
"\"$home\" Placeholder Field" : "Campo de marcador de posición «$home»",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "Nunha configuración de almacenamento externo substituirase $home polo valor do atributo especificado",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Nunha configuración de almacenamento externo substituirase $home polo valor do atributo especificado",
"Internal Username" : "Nome interno de usuario",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "De xeito predeterminado, o nome interno de usuario crearase a partires do atributo UUID. Isto asegura que o nome de usuario é único e non é necesario converter os caracteres. O nome interno de usuario ten a restrición de que só se admiten estes caracteres: [ a-zA-Z0-9_.@- ]. Outros caracteres son substituídos pola súa correspondencia ASCII ou simplemente omitidos. En caso de colisións engadirase/incrementarase un número. O nome interno de usuario usase para identificar internamente a un usuario. É tamén o nome predeterminado do cartafol de inicio do usuario. Tamén é parte dos URL remotos, por exemplo para todos os servizos *DAV. Con esta configuración, pódese anular o comportamento predeterminado. Déixeo baleiro para usar o comportamento predeterminado. Os cambios terán efecto só nos usuarios LDAP signados (engadidos) após os cambios.",
"Internal Username Attribute:" : "Atributo do nome interno de usuario:",
diff --git a/apps/user_ldap/l10n/gl.json b/apps/user_ldap/l10n/gl.json
index f4add1be934..5e718af5f4b 100644
--- a/apps/user_ldap/l10n/gl.json
+++ b/apps/user_ldap/l10n/gl.json
@@ -175,7 +175,7 @@
"User Home Folder Naming Rule" : "Regra de nomeado do cartafol do usuario",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Deixar baleiro para o nome de usuario (predeterminado). Noutro caso, especifique un atributo LDAP/AD.",
"\"$home\" Placeholder Field" : "Campo de marcador de posición «$home»",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "Nunha configuración de almacenamento externo substituirase $home polo valor do atributo especificado",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Nunha configuración de almacenamento externo substituirase $home polo valor do atributo especificado",
"Internal Username" : "Nome interno de usuario",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "De xeito predeterminado, o nome interno de usuario crearase a partires do atributo UUID. Isto asegura que o nome de usuario é único e non é necesario converter os caracteres. O nome interno de usuario ten a restrición de que só se admiten estes caracteres: [ a-zA-Z0-9_.@- ]. Outros caracteres son substituídos pola súa correspondencia ASCII ou simplemente omitidos. En caso de colisións engadirase/incrementarase un número. O nome interno de usuario usase para identificar internamente a un usuario. É tamén o nome predeterminado do cartafol de inicio do usuario. Tamén é parte dos URL remotos, por exemplo para todos os servizos *DAV. Con esta configuración, pódese anular o comportamento predeterminado. Déixeo baleiro para usar o comportamento predeterminado. Os cambios terán efecto só nos usuarios LDAP signados (engadidos) após os cambios.",
"Internal Username Attribute:" : "Atributo do nome interno de usuario:",
diff --git a/apps/user_ldap/l10n/it.js b/apps/user_ldap/l10n/it.js
index a770edd1876..9894d595630 100644
--- a/apps/user_ldap/l10n/it.js
+++ b/apps/user_ldap/l10n/it.js
@@ -177,7 +177,6 @@ OC.L10N.register(
"User Home Folder Naming Rule" : "Regola di assegnazione del nome della cartella utente",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Lascia vuoto per il nome utente (predefinito). Altrimenti, specifica un attributo LDAP/AD.",
"\"$home\" Placeholder Field" : "Segnaposto \"$home\"",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home nella configurazione di un'archiviazione esterna sarà sostituita con il valore dell'attributo specificato",
"Internal Username" : "Nome utente interno",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "In modo predefinito, il nome utente interno sarà creato dall'attributo UUID. Ciò assicura che il nome utente sia univoco e che non sia necessario convertire i caratteri. Il nome utente interno consente l'uso di determinati caratteri: [ a-zA-Z0-9_.@- ]. Altri caratteri sono sostituiti con il corrispondente ASCII o sono semplicemente omessi. In caso di conflitto, sarà aggiunto/incrementato un numero. Il nome utente interno è utilizzato per identificare un utente internamente. Rappresenta, inoltre, il nome predefinito per la cartella home dell'utente in ownCloud. Costituisce anche una parte di URL remoti, ad esempio per tutti i servizi *DAV. Con questa impostazione, il comportamento predefinito può essere scavalcato. Lascialo vuoto per ottenere il comportamento predefinito. Le modifiche avranno effetto solo sui nuovo utenti LDAP associati (aggiunti).",
"Internal Username Attribute:" : "Attributo nome utente interno:",
diff --git a/apps/user_ldap/l10n/it.json b/apps/user_ldap/l10n/it.json
index 15f670ef512..2d4dbaf7967 100644
--- a/apps/user_ldap/l10n/it.json
+++ b/apps/user_ldap/l10n/it.json
@@ -175,7 +175,6 @@
"User Home Folder Naming Rule" : "Regola di assegnazione del nome della cartella utente",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Lascia vuoto per il nome utente (predefinito). Altrimenti, specifica un attributo LDAP/AD.",
"\"$home\" Placeholder Field" : "Segnaposto \"$home\"",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home nella configurazione di un'archiviazione esterna sarà sostituita con il valore dell'attributo specificato",
"Internal Username" : "Nome utente interno",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "In modo predefinito, il nome utente interno sarà creato dall'attributo UUID. Ciò assicura che il nome utente sia univoco e che non sia necessario convertire i caratteri. Il nome utente interno consente l'uso di determinati caratteri: [ a-zA-Z0-9_.@- ]. Altri caratteri sono sostituiti con il corrispondente ASCII o sono semplicemente omessi. In caso di conflitto, sarà aggiunto/incrementato un numero. Il nome utente interno è utilizzato per identificare un utente internamente. Rappresenta, inoltre, il nome predefinito per la cartella home dell'utente in ownCloud. Costituisce anche una parte di URL remoti, ad esempio per tutti i servizi *DAV. Con questa impostazione, il comportamento predefinito può essere scavalcato. Lascialo vuoto per ottenere il comportamento predefinito. Le modifiche avranno effetto solo sui nuovo utenti LDAP associati (aggiunti).",
"Internal Username Attribute:" : "Attributo nome utente interno:",
diff --git a/apps/user_ldap/l10n/nl.js b/apps/user_ldap/l10n/nl.js
index 781d73cda7b..39b12bb7dd9 100644
--- a/apps/user_ldap/l10n/nl.js
+++ b/apps/user_ldap/l10n/nl.js
@@ -177,7 +177,6 @@ OC.L10N.register(
"User Home Folder Naming Rule" : "Gebruikers Home map naamgevingsregel",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Laat leeg voor de gebruikersnaam (standaard). Of specificeer een LDAP/AD attribuut.",
"\"$home\" Placeholder Field" : "\"$home\" Plaatshouder veld",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home in een externe opslag configuratie wordt vervangen door de waarde van het gespecificeerde attribuut",
"Internal Username" : "Interne gebruikersnaam",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standaard wordt de interne gebruikersnaam afgeleid van het UUID attribuut. dat zorgt ervoor dat de gebruikersnaam uniek is en dat tekens niet hoeven te worden geconverteerd. De interne gebruikersnaam heeft de beperking dat alleen deze tekens zijn toegestaan: [ a-zA-Z0-9_.@- ]. Andere tekens worden vervangen door hun overeenkomstige ASCII-waarde of simpelweg weggelaten. Bij conflicten wordt een nummer toegevoegd/verhoogd. De interne gebruikersnaam wordt gebruikt om een gebruiker intern te identificeren. Het is ook de standaardnaam voor de thuis-map van de gebruiker. Het is ook onderdeel van de externe URLs, bijvoorbeeld voor alle *DAV services. Met deze instelling kan het standaardgedrag worden overschreven. Laat het leeg voor de standaardwerkwijze. Wijzigingen hebben alleen effect voor nieuw gekoppelde (toegevoegde) LDAP gebruikers.",
"Internal Username Attribute:" : "Interne gebruikersnaam attribuut:",
diff --git a/apps/user_ldap/l10n/nl.json b/apps/user_ldap/l10n/nl.json
index 46dc65f6009..141c288c1a9 100644
--- a/apps/user_ldap/l10n/nl.json
+++ b/apps/user_ldap/l10n/nl.json
@@ -175,7 +175,6 @@
"User Home Folder Naming Rule" : "Gebruikers Home map naamgevingsregel",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Laat leeg voor de gebruikersnaam (standaard). Of specificeer een LDAP/AD attribuut.",
"\"$home\" Placeholder Field" : "\"$home\" Plaatshouder veld",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home in een externe opslag configuratie wordt vervangen door de waarde van het gespecificeerde attribuut",
"Internal Username" : "Interne gebruikersnaam",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standaard wordt de interne gebruikersnaam afgeleid van het UUID attribuut. dat zorgt ervoor dat de gebruikersnaam uniek is en dat tekens niet hoeven te worden geconverteerd. De interne gebruikersnaam heeft de beperking dat alleen deze tekens zijn toegestaan: [ a-zA-Z0-9_.@- ]. Andere tekens worden vervangen door hun overeenkomstige ASCII-waarde of simpelweg weggelaten. Bij conflicten wordt een nummer toegevoegd/verhoogd. De interne gebruikersnaam wordt gebruikt om een gebruiker intern te identificeren. Het is ook de standaardnaam voor de thuis-map van de gebruiker. Het is ook onderdeel van de externe URLs, bijvoorbeeld voor alle *DAV services. Met deze instelling kan het standaardgedrag worden overschreven. Laat het leeg voor de standaardwerkwijze. Wijzigingen hebben alleen effect voor nieuw gekoppelde (toegevoegde) LDAP gebruikers.",
"Internal Username Attribute:" : "Interne gebruikersnaam attribuut:",
diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js
index fe7376bdaa4..a184ba42812 100644
--- a/apps/user_ldap/l10n/pt_BR.js
+++ b/apps/user_ldap/l10n/pt_BR.js
@@ -177,7 +177,7 @@ OC.L10N.register(
"User Home Folder Naming Rule" : "Regra de nomeação de pasta de usuário Home",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para nome de usuário (padrão). Caso contrário, especifique um atributo LDAP/AD.",
"\"$home\" Placeholder Field" : "Campo Reservado \"$home\"",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home em uma configuração de armazenamento externo será substituído pelo valor do atributo especificado",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home em uma configuração de armazenamento externo será substituído pelo valor do atributo especificado",
"Internal Username" : "Nome de usuário interno",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por padrão, um nome de usuário interno será criado a partir de um atributo UUID. Isso garante que o nome de usuário seja único e estes caracteres não precisam ser convertidos. um nome de usuário interno possui a restrição que somente estes caracteres são permitdos: [ a-zA-Z0-9_.@- ]. Outros caracteres serão substituidos por seus correspondentes ASCII ou simplesmente omitidos. Em caso de coincidências, um número será adicionado/incrementado. O nome de usuário interno é utilizado para identificar o usuário internamente. Também é o nome padrão da pasta principal do usuário. Também é uma parte das URL's remotas, por exemplo, para todos os serviços *DAV. Com esta configuração, o comportamento padrão pode ser alterado. Deixe em branco para que assuma o comportamento padrão. Alterações terão efeito apenas em novos usuários LDAP mapeados (adicionados).",
"Internal Username Attribute:" : "Atributo Interno de Nome de Usuário:",
diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json
index 2d61efbb990..ed132bfe352 100644
--- a/apps/user_ldap/l10n/pt_BR.json
+++ b/apps/user_ldap/l10n/pt_BR.json
@@ -175,7 +175,7 @@
"User Home Folder Naming Rule" : "Regra de nomeação de pasta de usuário Home",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para nome de usuário (padrão). Caso contrário, especifique um atributo LDAP/AD.",
"\"$home\" Placeholder Field" : "Campo Reservado \"$home\"",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home em uma configuração de armazenamento externo será substituído pelo valor do atributo especificado",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home em uma configuração de armazenamento externo será substituído pelo valor do atributo especificado",
"Internal Username" : "Nome de usuário interno",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por padrão, um nome de usuário interno será criado a partir de um atributo UUID. Isso garante que o nome de usuário seja único e estes caracteres não precisam ser convertidos. um nome de usuário interno possui a restrição que somente estes caracteres são permitdos: [ a-zA-Z0-9_.@- ]. Outros caracteres serão substituidos por seus correspondentes ASCII ou simplesmente omitidos. Em caso de coincidências, um número será adicionado/incrementado. O nome de usuário interno é utilizado para identificar o usuário internamente. Também é o nome padrão da pasta principal do usuário. Também é uma parte das URL's remotas, por exemplo, para todos os serviços *DAV. Com esta configuração, o comportamento padrão pode ser alterado. Deixe em branco para que assuma o comportamento padrão. Alterações terão efeito apenas em novos usuários LDAP mapeados (adicionados).",
"Internal Username Attribute:" : "Atributo Interno de Nome de Usuário:",
diff --git a/apps/user_ldap/l10n/sr.js b/apps/user_ldap/l10n/sr.js
index b3b51c8d87f..ee1512d3e84 100644
--- a/apps/user_ldap/l10n/sr.js
+++ b/apps/user_ldap/l10n/sr.js
@@ -177,7 +177,6 @@ OC.L10N.register(
"User Home Folder Naming Rule" : "Правило именовања корисничке фасцикле",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Оставите празно за корисничко име (подразумевано). У супротном, наведите особину LDAP/AD.",
"\"$home\" Placeholder Field" : "Резервисано место за поље „$home“",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home ће се у подешавању спољног складишта заменити са вредношћу задатог атрибута",
"Internal Username" : "Интерно корисничко име:",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Подразумевано се интерно корисничко име креира од UUID атрибута. Тиме се гарантује да се корисничко име јединствено и да карактери не морају да се конвертују. Интерно корисничко име има ограничења да су дозвољени само следећи карактери: [ a-zA-Z0-9_.@- ]. Остали карактери ће или бити замењени ASCII еквивалентима или ће бити прескочени. Ако се деси поклапање са постојећим корисничким именом, додаће се број на крај имена. Интерно корисничко име се користи да идентификује корисника интерно. Такође се користи и као подразумевано име за име корисничку фасцикле, а и део је удаљених адреса, нпр. свих *DAV сервиса. Уз помоћ овог подешавања, може да се промени подразумевано понашање. Оставите га празним за подразумевано понашање. Промене ће се тицати само новомапираних (додатих) LDAP корисника.",
"Internal Username Attribute:" : "Интерни параметри корисничког имена:",
diff --git a/apps/user_ldap/l10n/sr.json b/apps/user_ldap/l10n/sr.json
index 3600595565e..b3fbfb70813 100644
--- a/apps/user_ldap/l10n/sr.json
+++ b/apps/user_ldap/l10n/sr.json
@@ -175,7 +175,6 @@
"User Home Folder Naming Rule" : "Правило именовања корисничке фасцикле",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Оставите празно за корисничко име (подразумевано). У супротном, наведите особину LDAP/AD.",
"\"$home\" Placeholder Field" : "Резервисано место за поље „$home“",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home ће се у подешавању спољног складишта заменити са вредношћу задатог атрибута",
"Internal Username" : "Интерно корисничко име:",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Подразумевано се интерно корисничко име креира од UUID атрибута. Тиме се гарантује да се корисничко име јединствено и да карактери не морају да се конвертују. Интерно корисничко име има ограничења да су дозвољени само следећи карактери: [ a-zA-Z0-9_.@- ]. Остали карактери ће или бити замењени ASCII еквивалентима или ће бити прескочени. Ако се деси поклапање са постојећим корисничким именом, додаће се број на крај имена. Интерно корисничко име се користи да идентификује корисника интерно. Такође се користи и као подразумевано име за име корисничку фасцикле, а и део је удаљених адреса, нпр. свих *DAV сервиса. Уз помоћ овог подешавања, може да се промени подразумевано понашање. Оставите га празним за подразумевано понашање. Промене ће се тицати само новомапираних (додатих) LDAP корисника.",
"Internal Username Attribute:" : "Интерни параметри корисничког имена:",
diff --git a/apps/user_ldap/l10n/sv.js b/apps/user_ldap/l10n/sv.js
index 1d486689c20..16c22ef2c6c 100644
--- a/apps/user_ldap/l10n/sv.js
+++ b/apps/user_ldap/l10n/sv.js
@@ -177,7 +177,7 @@ OC.L10N.register(
"User Home Folder Naming Rule" : "Namnregel för hemkatalog",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Lämnas tomt för användarnamn (standard). Ange annars ett LDAP-/AD-attribut.",
"\"$home\" Placeholder Field" : "\"$home\" Platshållare-fält",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home i en extern lagringskonfiguration kommer ersättas med värdet av det angivna attributet",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home i en extern lagringskonfiguration kommer ersättas med värdet av det angivna attributet",
"Internal Username" : "Internt användarnamn",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Som standard kommer de interna användarnamnen skapas från UUID-attributen. Det säkerställer att användarnamnet är unikt och att tecken inte behöver konverteras. Det interna användarnamnet har begränsningen att bara dessa tecken tillåts: [ a-zA-Z0-9_.@- ]. Andra tecken kommer att ersättas med deras korresponderande ASCII-kod eller utelämnas. Vid kollisioner kommer ett nummer läggas till/ökas. Det interna användarnamnet används för att identifiera en användare internt. Det är också standardnamnet för användarens hemmapp. Det är också en del av externa URL'er, till exempel för alla *DAV-tjänster. Med denna inställning, kan standardbeteendet bli överskrivet. Lämna det tomt för standardbeteende. Ändringar kommer att bara gälla för nya mappningar (tillagda) LDAP-användare.",
"Internal Username Attribute:" : "Internt användarnamnsattribut:",
diff --git a/apps/user_ldap/l10n/sv.json b/apps/user_ldap/l10n/sv.json
index 59efc2d1b46..0a2a609aa3a 100644
--- a/apps/user_ldap/l10n/sv.json
+++ b/apps/user_ldap/l10n/sv.json
@@ -175,7 +175,7 @@
"User Home Folder Naming Rule" : "Namnregel för hemkatalog",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Lämnas tomt för användarnamn (standard). Ange annars ett LDAP-/AD-attribut.",
"\"$home\" Placeholder Field" : "\"$home\" Platshållare-fält",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "$home i en extern lagringskonfiguration kommer ersättas med värdet av det angivna attributet",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home i en extern lagringskonfiguration kommer ersättas med värdet av det angivna attributet",
"Internal Username" : "Internt användarnamn",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Som standard kommer de interna användarnamnen skapas från UUID-attributen. Det säkerställer att användarnamnet är unikt och att tecken inte behöver konverteras. Det interna användarnamnet har begränsningen att bara dessa tecken tillåts: [ a-zA-Z0-9_.@- ]. Andra tecken kommer att ersättas med deras korresponderande ASCII-kod eller utelämnas. Vid kollisioner kommer ett nummer läggas till/ökas. Det interna användarnamnet används för att identifiera en användare internt. Det är också standardnamnet för användarens hemmapp. Det är också en del av externa URL'er, till exempel för alla *DAV-tjänster. Med denna inställning, kan standardbeteendet bli överskrivet. Lämna det tomt för standardbeteende. Ändringar kommer att bara gälla för nya mappningar (tillagda) LDAP-användare.",
"Internal Username Attribute:" : "Internt användarnamnsattribut:",
diff --git a/apps/user_ldap/l10n/tr.js b/apps/user_ldap/l10n/tr.js
index f7b14fbccd9..9f26b5f5653 100644
--- a/apps/user_ldap/l10n/tr.js
+++ b/apps/user_ldap/l10n/tr.js
@@ -177,7 +177,6 @@ OC.L10N.register(
"User Home Folder Naming Rule" : "Kullanıcı Ana Klasörünü Adlandırma Kuralı",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Kullanıcı adının kullanılması için boş bırakın (varsayılan) ya da bir LDAP/AD özniteliği belirtin.",
"\"$home\" Placeholder Field" : "\"$home\" Yer Belirleyici Alanı",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "Bir dış depolama yapılandırmasında $home yerine belirtilen öznitelik kullanılır",
"Internal Username" : "İç Kullanıcı Adı",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Varsayılan olarak, iç kullanıcı adı UUID özniteliğinden oluşturulur. Böylece kullanıcı adının eşsiz olması ve dönüştürülmesi gereken karakterler içermediğinden emin olunur. İç kullanıcı adında kısıtlaması yalnız şu karakterleri kullanılabilir: [ a-zA-Z0-9_.@- ]. Diğer karakterler ASCII karşılıklarına dönüştürülür ya da yok sayılır. Çakışmalarda ada bir sayı eklenir. İç kullanıcı adı bir kullanıcıyı içsel olarak belirlemeye yarar. Aynı zamanda kullanıcı ana klasörünün varsayılan adı olarak da kullanılır. İnternet adreslerinin, örneğin *DAV servislerinin bir parçasıdır. Bu seçenek ile varsayılan davranış değiştirilebilir. Varsayılan davranışı kullanmak için boş bırakın. Değişiklikler yalnız yeni eşleştirilecek (eklenecek) LDAP kullanıcılarını etkiler.",
"Internal Username Attribute:" : "İç Kullanıcı Adı Özniteliği:",
diff --git a/apps/user_ldap/l10n/tr.json b/apps/user_ldap/l10n/tr.json
index 656321276ea..ee64d7e8767 100644
--- a/apps/user_ldap/l10n/tr.json
+++ b/apps/user_ldap/l10n/tr.json
@@ -175,7 +175,6 @@
"User Home Folder Naming Rule" : "Kullanıcı Ana Klasörünü Adlandırma Kuralı",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Kullanıcı adının kullanılması için boş bırakın (varsayılan) ya da bir LDAP/AD özniteliği belirtin.",
"\"$home\" Placeholder Field" : "\"$home\" Yer Belirleyici Alanı",
- "$home in an external storage configuration will replaced with the value of the specified attribute" : "Bir dış depolama yapılandırmasında $home yerine belirtilen öznitelik kullanılır",
"Internal Username" : "İç Kullanıcı Adı",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Varsayılan olarak, iç kullanıcı adı UUID özniteliğinden oluşturulur. Böylece kullanıcı adının eşsiz olması ve dönüştürülmesi gereken karakterler içermediğinden emin olunur. İç kullanıcı adında kısıtlaması yalnız şu karakterleri kullanılabilir: [ a-zA-Z0-9_.@- ]. Diğer karakterler ASCII karşılıklarına dönüştürülür ya da yok sayılır. Çakışmalarda ada bir sayı eklenir. İç kullanıcı adı bir kullanıcıyı içsel olarak belirlemeye yarar. Aynı zamanda kullanıcı ana klasörünün varsayılan adı olarak da kullanılır. İnternet adreslerinin, örneğin *DAV servislerinin bir parçasıdır. Bu seçenek ile varsayılan davranış değiştirilebilir. Varsayılan davranışı kullanmak için boş bırakın. Değişiklikler yalnız yeni eşleştirilecek (eklenecek) LDAP kullanıcılarını etkiler.",
"Internal Username Attribute:" : "İç Kullanıcı Adı Özniteliği:",
diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php
index 7c41363c635..ab7a55f33e4 100644
--- a/apps/user_ldap/templates/settings.php
+++ b/apps/user_ldap/templates/settings.php
@@ -108,7 +108,7 @@ style('user_ldap', 'settings');
<p><label for="ldap_quota_def"><?php p($l->t('Quota Default'));?></label><input type="text" id="ldap_quota_def" name="ldap_quota_def" data-default="<?php p($_['ldap_quota_def_default']); ?>" title="<?php p($l->t('Override default quota for LDAP users who do not have a quota set in the Quota Field.'));?>" /></p>
<p><label for="ldap_email_attr"><?php p($l->t('Email Field'));?></label><input type="text" id="ldap_email_attr" name="ldap_email_attr" data-default="<?php p($_['ldap_email_attr_default']); ?>" title="<?php p($l->t('Set the user\'s email from their LDAP attribute. Leave it empty for default behaviour.'));?>" /></p>
<p><label for="home_folder_naming_rule"><?php p($l->t('User Home Folder Naming Rule'));?></label><input type="text" id="home_folder_naming_rule" name="home_folder_naming_rule" title="<?php p($l->t('Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute.'));?>" data-default="<?php p($_['home_folder_naming_rule_default']); ?>" /></p>
- <p><label for="ldap_ext_storage_home_attribute"> <?php p($l->t('"$home" Placeholder Field')); ?></label><input type="text" id="ldap_ext_storage_home_attribute" name="ldap_ext_storage_home_attribute" title="<?php p($l->t('$home in an external storage configuration will replaced with the value of the specified attribute')); ?>" data-default="<?php p($_['ldap_ext_storage_home_attribute_default']); ?>"></p>
+ <p><label for="ldap_ext_storage_home_attribute"> <?php p($l->t('"$home" Placeholder Field')); ?></label><input type="text" id="ldap_ext_storage_home_attribute" name="ldap_ext_storage_home_attribute" title="<?php p($l->t('$home in an external storage configuration will be replaced with the value of the specified attribute')); ?>" data-default="<?php p($_['ldap_ext_storage_home_attribute_default']); ?>"></p>
</div>
</div>
<?php print_unescaped($_['settingControls']); ?>
diff --git a/apps/workflowengine/l10n/de.js b/apps/workflowengine/l10n/de.js
index 984ddce5fe9..3e7950dc281 100644
--- a/apps/workflowengine/l10n/de.js
+++ b/apps/workflowengine/l10n/de.js
@@ -23,10 +23,10 @@ OC.L10N.register(
"less or equals" : "weniger oder gleich",
"greater or equals" : "größer oder gleich",
"greater" : "größer",
- "File system tag" : "Dateisystem-Tag",
- "is tagged with" : "hat den Tag",
- "is not tagged with" : "hat nicht den Tag",
- "Select tag…" : "Wähle einen Tag…",
+ "File system tag" : "Dateisystem-Schlagwort",
+ "is tagged with" : "hat das Schlagwort",
+ "is not tagged with" : "ist nicht verschlagwortet mit",
+ "Select tag…" : "Wähle ein Schlagwort…",
"Request remote address" : "IP Adresse der Anfrage",
"matches IPv4" : "entspricht IPv4",
"does not match IPv4" : "entspricht nicht IPv4",
@@ -53,7 +53,7 @@ OC.L10N.register(
"The given operator is invalid" : "Der angegebene Operator ist ungültig",
"The given regular expression is invalid" : "Der angegebene Reguläre Ausdruck ist ungültig",
"The given file size is invalid" : "Die angegebene Dateigröße ist ungültig",
- "The given tag id is invalid" : "Die angegebene Tag ID ist ungültig",
+ "The given tag id is invalid" : "Die angegebene Schlagwort-ID ist ungültig",
"The given IP range is invalid" : "Der angegebene IP-Bereich ist ungültig",
"The given IP range is not valid for IPv4" : "Der angegebene IP-Bereich ist ungültig für IPv4",
"The given IP range is not valid for IPv6" : "Der angegebene IP-Bereich ist ungültig für IPv6",
@@ -68,6 +68,7 @@ OC.L10N.register(
"Check %s does not exist" : "Die Prüfung %s existiert nicht",
"Check %s is invalid" : "Die Prüfung %s ist ungültig",
"Check #%s does not exist" : "Die Prüfung #%s existiert nicht",
+ "Tag management" : "Schlagwortverwaltung",
"Files workflow engine" : "Datei-Workflow-Engine",
"Open documentation" : "Dokumentation öffnen",
"Loading…" : "Laden…",
diff --git a/apps/workflowengine/l10n/de.json b/apps/workflowengine/l10n/de.json
index a55dee12f01..eee2aae228a 100644
--- a/apps/workflowengine/l10n/de.json
+++ b/apps/workflowengine/l10n/de.json
@@ -21,10 +21,10 @@
"less or equals" : "weniger oder gleich",
"greater or equals" : "größer oder gleich",
"greater" : "größer",
- "File system tag" : "Dateisystem-Tag",
- "is tagged with" : "hat den Tag",
- "is not tagged with" : "hat nicht den Tag",
- "Select tag…" : "Wähle einen Tag…",
+ "File system tag" : "Dateisystem-Schlagwort",
+ "is tagged with" : "hat das Schlagwort",
+ "is not tagged with" : "ist nicht verschlagwortet mit",
+ "Select tag…" : "Wähle ein Schlagwort…",
"Request remote address" : "IP Adresse der Anfrage",
"matches IPv4" : "entspricht IPv4",
"does not match IPv4" : "entspricht nicht IPv4",
@@ -51,7 +51,7 @@
"The given operator is invalid" : "Der angegebene Operator ist ungültig",
"The given regular expression is invalid" : "Der angegebene Reguläre Ausdruck ist ungültig",
"The given file size is invalid" : "Die angegebene Dateigröße ist ungültig",
- "The given tag id is invalid" : "Die angegebene Tag ID ist ungültig",
+ "The given tag id is invalid" : "Die angegebene Schlagwort-ID ist ungültig",
"The given IP range is invalid" : "Der angegebene IP-Bereich ist ungültig",
"The given IP range is not valid for IPv4" : "Der angegebene IP-Bereich ist ungültig für IPv4",
"The given IP range is not valid for IPv6" : "Der angegebene IP-Bereich ist ungültig für IPv6",
@@ -66,6 +66,7 @@
"Check %s does not exist" : "Die Prüfung %s existiert nicht",
"Check %s is invalid" : "Die Prüfung %s ist ungültig",
"Check #%s does not exist" : "Die Prüfung #%s existiert nicht",
+ "Tag management" : "Schlagwortverwaltung",
"Files workflow engine" : "Datei-Workflow-Engine",
"Open documentation" : "Dokumentation öffnen",
"Loading…" : "Laden…",
diff --git a/apps/workflowengine/l10n/de_DE.js b/apps/workflowengine/l10n/de_DE.js
index a27880e12a8..12a2824626b 100644
--- a/apps/workflowengine/l10n/de_DE.js
+++ b/apps/workflowengine/l10n/de_DE.js
@@ -23,10 +23,10 @@ OC.L10N.register(
"less or equals" : "weniger oder gleich",
"greater or equals" : "größer oder gleich",
"greater" : "größer",
- "File system tag" : "Dateisystem-Tag",
- "is tagged with" : "hat den Tag",
- "is not tagged with" : "hat nicht den Tag",
- "Select tag…" : "Wählen Sie einen Tag…",
+ "File system tag" : "Dateisystem-Schlagwort",
+ "is tagged with" : "hat das Schlagwort",
+ "is not tagged with" : "ist nicht verschlagwortet mit",
+ "Select tag…" : "Wählen Sie ein Schlagwort…",
"Request remote address" : "IP Adresse der Anfrage",
"matches IPv4" : "entspricht IPv4",
"does not match IPv4" : "entspricht nicht IPv4",
@@ -53,7 +53,7 @@ OC.L10N.register(
"The given operator is invalid" : "Der angegebene Operator ist falsch",
"The given regular expression is invalid" : "Der angegebene reguläre Ausdruck ist falsch",
"The given file size is invalid" : "Die angegebene Dateigröße ist ungültig",
- "The given tag id is invalid" : "Die angegebene Tag-ID ist ungültig",
+ "The given tag id is invalid" : "Die angegebene Schlagwort-ID ist ungültig",
"The given IP range is invalid" : "Der angegebene IP-Bereich ist falsch",
"The given IP range is not valid for IPv4" : "Der angegebene IP-Bereich ist für IPv4 ungültig",
"The given IP range is not valid for IPv6" : "Der angegebene IP-Bereich ist für IPv6 ungültig",
@@ -68,6 +68,7 @@ OC.L10N.register(
"Check %s does not exist" : "Die Prüfung %s existiert nicht",
"Check %s is invalid" : "Die Prüfung %s ist ungültig",
"Check #%s does not exist" : "Die Prüfung #%s existiert nicht",
+ "Tag management" : "Schlagwortverwaltung",
"Files workflow engine" : "Datei-Workflow-Engine",
"Open documentation" : "Dokumentation öffnen",
"Loading…" : "Laden…",
diff --git a/apps/workflowengine/l10n/de_DE.json b/apps/workflowengine/l10n/de_DE.json
index ac6548e9250..54f03208975 100644
--- a/apps/workflowengine/l10n/de_DE.json
+++ b/apps/workflowengine/l10n/de_DE.json
@@ -21,10 +21,10 @@
"less or equals" : "weniger oder gleich",
"greater or equals" : "größer oder gleich",
"greater" : "größer",
- "File system tag" : "Dateisystem-Tag",
- "is tagged with" : "hat den Tag",
- "is not tagged with" : "hat nicht den Tag",
- "Select tag…" : "Wählen Sie einen Tag…",
+ "File system tag" : "Dateisystem-Schlagwort",
+ "is tagged with" : "hat das Schlagwort",
+ "is not tagged with" : "ist nicht verschlagwortet mit",
+ "Select tag…" : "Wählen Sie ein Schlagwort…",
"Request remote address" : "IP Adresse der Anfrage",
"matches IPv4" : "entspricht IPv4",
"does not match IPv4" : "entspricht nicht IPv4",
@@ -51,7 +51,7 @@
"The given operator is invalid" : "Der angegebene Operator ist falsch",
"The given regular expression is invalid" : "Der angegebene reguläre Ausdruck ist falsch",
"The given file size is invalid" : "Die angegebene Dateigröße ist ungültig",
- "The given tag id is invalid" : "Die angegebene Tag-ID ist ungültig",
+ "The given tag id is invalid" : "Die angegebene Schlagwort-ID ist ungültig",
"The given IP range is invalid" : "Der angegebene IP-Bereich ist falsch",
"The given IP range is not valid for IPv4" : "Der angegebene IP-Bereich ist für IPv4 ungültig",
"The given IP range is not valid for IPv6" : "Der angegebene IP-Bereich ist für IPv6 ungültig",
@@ -66,6 +66,7 @@
"Check %s does not exist" : "Die Prüfung %s existiert nicht",
"Check %s is invalid" : "Die Prüfung %s ist ungültig",
"Check #%s does not exist" : "Die Prüfung #%s existiert nicht",
+ "Tag management" : "Schlagwortverwaltung",
"Files workflow engine" : "Datei-Workflow-Engine",
"Open documentation" : "Dokumentation öffnen",
"Loading…" : "Laden…",
diff --git a/apps/workflowengine/l10n/eo.js b/apps/workflowengine/l10n/eo.js
index 0ef62134d13..7a37a51f611 100644
--- a/apps/workflowengine/l10n/eo.js
+++ b/apps/workflowengine/l10n/eo.js
@@ -68,6 +68,7 @@ OC.L10N.register(
"Check %s does not exist" : "Kontrolo %s ne ekzistas",
"Check %s is invalid" : "Kontrolo %s ne validas",
"Check #%s does not exist" : "Kontrolo n-ro %s ne ekzistas",
+ "Tag management" : "Etikeda administrado",
"Files workflow engine" : "Modulo de dosiera laborfluo",
"Open documentation" : "Malfermi dokumentaron",
"Loading…" : "Ŝargante...",
diff --git a/apps/workflowengine/l10n/eo.json b/apps/workflowengine/l10n/eo.json
index 23fdd34fe65..a211c6688e4 100644
--- a/apps/workflowengine/l10n/eo.json
+++ b/apps/workflowengine/l10n/eo.json
@@ -66,6 +66,7 @@
"Check %s does not exist" : "Kontrolo %s ne ekzistas",
"Check %s is invalid" : "Kontrolo %s ne validas",
"Check #%s does not exist" : "Kontrolo n-ro %s ne ekzistas",
+ "Tag management" : "Etikeda administrado",
"Files workflow engine" : "Modulo de dosiera laborfluo",
"Open documentation" : "Malfermi dokumentaron",
"Loading…" : "Ŝargante...",
diff --git a/apps/workflowengine/l10n/nl.js b/apps/workflowengine/l10n/nl.js
index f188c233adf..3a757bccfdb 100644
--- a/apps/workflowengine/l10n/nl.js
+++ b/apps/workflowengine/l10n/nl.js
@@ -68,6 +68,7 @@ OC.L10N.register(
"Check %s does not exist" : "Controleer: %s bestaat niet",
"Check %s is invalid" : "Controleer: %s is ongeldig",
"Check #%s does not exist" : "Controleer: #%s bestaat niet",
+ "Tag management" : "Tagbeheer",
"Files workflow engine" : "Betanden workflow engine",
"Open documentation" : "Open documentatie",
"Loading…" : "Laden...",
diff --git a/apps/workflowengine/l10n/nl.json b/apps/workflowengine/l10n/nl.json
index c7e515c0aca..b68cffd52f9 100644
--- a/apps/workflowengine/l10n/nl.json
+++ b/apps/workflowengine/l10n/nl.json
@@ -66,6 +66,7 @@
"Check %s does not exist" : "Controleer: %s bestaat niet",
"Check %s is invalid" : "Controleer: %s is ongeldig",
"Check #%s does not exist" : "Controleer: #%s bestaat niet",
+ "Tag management" : "Tagbeheer",
"Files workflow engine" : "Betanden workflow engine",
"Open documentation" : "Open documentatie",
"Loading…" : "Laden...",
diff --git a/apps/workflowengine/l10n/pl.js b/apps/workflowengine/l10n/pl.js
index e347face5d2..8daaddfc7d9 100644
--- a/apps/workflowengine/l10n/pl.js
+++ b/apps/workflowengine/l10n/pl.js
@@ -68,6 +68,7 @@ OC.L10N.register(
"Check %s does not exist" : "Sprawdź, czy %s nie istnieje",
"Check %s is invalid" : "Sprawdź, czy %s jest nieprawidłowy",
"Check #%s does not exist" : "Sprawdź, czy #%s nie istnieje",
+ "Tag management" : "Zarządzanie tagami",
"Files workflow engine" : "Pliki silnika workflow",
"Open documentation" : "Otwórz dokumentację",
"Loading…" : "Wczytywanie…",
diff --git a/apps/workflowengine/l10n/pl.json b/apps/workflowengine/l10n/pl.json
index b854dbab7d1..77be6b6344e 100644
--- a/apps/workflowengine/l10n/pl.json
+++ b/apps/workflowengine/l10n/pl.json
@@ -66,6 +66,7 @@
"Check %s does not exist" : "Sprawdź, czy %s nie istnieje",
"Check %s is invalid" : "Sprawdź, czy %s jest nieprawidłowy",
"Check #%s does not exist" : "Sprawdź, czy #%s nie istnieje",
+ "Tag management" : "Zarządzanie tagami",
"Files workflow engine" : "Pliki silnika workflow",
"Open documentation" : "Otwórz dokumentację",
"Loading…" : "Wczytywanie…",
diff --git a/apps/workflowengine/l10n/sk.js b/apps/workflowengine/l10n/sk.js
index c7b266e3f54..adfbb6b305e 100644
--- a/apps/workflowengine/l10n/sk.js
+++ b/apps/workflowengine/l10n/sk.js
@@ -68,6 +68,7 @@ OC.L10N.register(
"Check %s does not exist" : "Kontrola %s neexistuje",
"Check %s is invalid" : "Kontrola %s je neplatná",
"Check #%s does not exist" : "Kontrola #%s neexistuje",
+ "Tag management" : "Správa štítkov",
"Files workflow engine" : "Typ spôsobu práce súborov",
"Open documentation" : "Otvoriť dokumentáciu",
"Loading…" : "Načítava sa...",
diff --git a/apps/workflowengine/l10n/sk.json b/apps/workflowengine/l10n/sk.json
index e04c0cf5319..2fc4de6ed1f 100644
--- a/apps/workflowengine/l10n/sk.json
+++ b/apps/workflowengine/l10n/sk.json
@@ -66,6 +66,7 @@
"Check %s does not exist" : "Kontrola %s neexistuje",
"Check %s is invalid" : "Kontrola %s je neplatná",
"Check #%s does not exist" : "Kontrola #%s neexistuje",
+ "Tag management" : "Správa štítkov",
"Files workflow engine" : "Typ spôsobu práce súborov",
"Open documentation" : "Otvoriť dokumentáciu",
"Loading…" : "Načítava sa...",
diff --git a/apps/workflowengine/l10n/sr.js b/apps/workflowengine/l10n/sr.js
index 663c01f4821..d12086449a5 100644
--- a/apps/workflowengine/l10n/sr.js
+++ b/apps/workflowengine/l10n/sr.js
@@ -68,6 +68,7 @@ OC.L10N.register(
"Check %s does not exist" : "Проверите да ли %s постоји",
"Check %s is invalid" : "Проверите да ли је %s исправно",
"Check #%s does not exist" : "Проверите да ли #%s постоји",
+ "Tag management" : "Управљање ознакама",
"Files workflow engine" : "Датотеке за мотор процеса рада",
"Open documentation" : "Отвори документацију",
"Loading…" : "Учитавање…",
diff --git a/apps/workflowengine/l10n/sr.json b/apps/workflowengine/l10n/sr.json
index fccff654591..ac9b640d231 100644
--- a/apps/workflowengine/l10n/sr.json
+++ b/apps/workflowengine/l10n/sr.json
@@ -66,6 +66,7 @@
"Check %s does not exist" : "Проверите да ли %s постоји",
"Check %s is invalid" : "Проверите да ли је %s исправно",
"Check #%s does not exist" : "Проверите да ли #%s постоји",
+ "Tag management" : "Управљање ознакама",
"Files workflow engine" : "Датотеке за мотор процеса рада",
"Open documentation" : "Отвори документацију",
"Loading…" : "Учитавање…",
diff --git a/apps/workflowengine/l10n/sv.js b/apps/workflowengine/l10n/sv.js
index 5305cad1a25..76383c5d178 100644
--- a/apps/workflowengine/l10n/sv.js
+++ b/apps/workflowengine/l10n/sv.js
@@ -68,6 +68,7 @@ OC.L10N.register(
"Check %s does not exist" : "Kontroll av %s existerar inte",
"Check %s is invalid" : "Kontroll av %s är ogiltig",
"Check #%s does not exist" : "Kontroll av #%s existerar inte",
+ "Tag management" : "Tagghantering",
"Open documentation" : "Öppna dokumentation",
"Loading…" : "Laddar...",
"Workflow" : "Arbetsflöde"
diff --git a/apps/workflowengine/l10n/sv.json b/apps/workflowengine/l10n/sv.json
index 498f0c15e44..6a344b4ad39 100644
--- a/apps/workflowengine/l10n/sv.json
+++ b/apps/workflowengine/l10n/sv.json
@@ -66,6 +66,7 @@
"Check %s does not exist" : "Kontroll av %s existerar inte",
"Check %s is invalid" : "Kontroll av %s är ogiltig",
"Check #%s does not exist" : "Kontroll av #%s existerar inte",
+ "Tag management" : "Tagghantering",
"Open documentation" : "Öppna dokumentation",
"Loading…" : "Laddar...",
"Workflow" : "Arbetsflöde"