]> source.dussan.org Git - nextcloud-server.git/commitdiff
Move files_sharing additionalscripts over to webpack 14218/head
authorRoeland Jago Douma <roeland@famdouma.nl>
Fri, 15 Feb 2019 08:10:07 +0000 (09:10 +0100)
committerRoeland Jago Douma <roeland@famdouma.nl>
Fri, 15 Feb 2019 11:33:04 +0000 (12:33 +0100)
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
21 files changed:
.gitattributes
apps/files_sharing/.l10nignore [new file with mode: 0644]
apps/files_sharing/appinfo/app.php
apps/files_sharing/css/mergedAdditionalStyles.scss [deleted file]
apps/files_sharing/css/sharebreadcrumb.scss [deleted file]
apps/files_sharing/css/sharetabview.scss [deleted file]
apps/files_sharing/js/additionalScripts.js [new file with mode: 0644]
apps/files_sharing/js/additionalScripts.js.map [new file with mode: 0644]
apps/files_sharing/js/additionalScripts.json [deleted file]
apps/files_sharing/js/share.js [deleted file]
apps/files_sharing/js/sharebreadcrumbview.js [deleted file]
apps/files_sharing/js/sharetabview.js [deleted file]
apps/files_sharing/src/additionalScripts.js [new file with mode: 0644]
apps/files_sharing/src/share.js [new file with mode: 0644]
apps/files_sharing/src/sharebreadcrumbview.js [new file with mode: 0644]
apps/files_sharing/src/sharetabview.js [new file with mode: 0644]
apps/files_sharing/src/style/sharebreadcrumb.scss [new file with mode: 0644]
apps/files_sharing/src/style/sharetabview.scss [new file with mode: 0644]
apps/files_sharing/webpack.js [new file with mode: 0644]
tests/karma.config.js
webpack.common.js

index aaa918cb2e05d8337aaee3b358fe63bc06d7ec37..44975c09eb1982aa4ac0a97f9f81f085d98d55fa 100644 (file)
@@ -3,6 +3,8 @@
 
 /apps/accessibility/js/accessibility.js binary
 /apps/accessibility/js/accessibility.js.map binary
+/apps/files_sharing/js/additionalScripts.js binary
+/apps/files_sharing/js/additionalScripts.js.map binary
 /apps/files_versions/js/files_versions.js binary
 /apps/files_versions/js/files_versions.js.map binary
 /apps/oauth2/js/oauth2.js binary
diff --git a/apps/files_sharing/.l10nignore b/apps/files_sharing/.l10nignore
new file mode 100644 (file)
index 0000000..dfb7d6c
--- /dev/null
@@ -0,0 +1,2 @@
+#webpack bundled files
+js/additionalScripts.js
index 13705718a04a8d7e72d2ebe7c7604faa2ab42595..3db4faf5f502e15d6949be2d5d25d16ac75c1643 100644 (file)
@@ -42,7 +42,6 @@ $eventDispatcher = \OC::$server->getEventDispatcher();
 $eventDispatcher->addListener(
        'OCA\Files::loadAdditionalScripts',
        function() {
-               \OCP\Util::addStyle('files_sharing', 'mergedAdditionalStyles');
                \OCP\Util::addScript('files_sharing', 'additionalScripts');
        }
 );
diff --git a/apps/files_sharing/css/mergedAdditionalStyles.scss b/apps/files_sharing/css/mergedAdditionalStyles.scss
deleted file mode 100644 (file)
index a95ad59..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-@import 'sharetabview.scss';
-@import 'sharebreadcrumb.scss';
diff --git a/apps/files_sharing/css/sharebreadcrumb.scss b/apps/files_sharing/css/sharebreadcrumb.scss
deleted file mode 100644 (file)
index f3096f4..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-div.crumb span.icon-shared,
-div.crumb span.icon-public {
-       display: inline-block;
-       cursor: pointer;
-       opacity: 0.2;
-       margin-right: 6px;
-}
-
-div.crumb span.icon-shared.shared,
-div.crumb span.icon-public.shared {
-       opacity: 0.7;
-}
diff --git a/apps/files_sharing/css/sharetabview.scss b/apps/files_sharing/css/sharetabview.scss
deleted file mode 100644 (file)
index f698697..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-.app-files .shareTabView {
-       min-height: 100px;
-}
-
-.share-autocomplete-item {
-       display: flex;
-
-       &.merged {
-               margin-left: 32px;
-       }
-       .autocomplete-item-text {
-               margin-left: 10px;
-               margin-right: 10px;
-               white-space: nowrap;
-               text-overflow: ellipsis;
-               overflow: hidden;
-               line-height: 32px;
-               vertical-align: middle;
-               flex-grow: 1;
-               .ui-state-highlight {
-                       border: none;
-                       margin: 0;
-               }
-       }
-       &.with-description {
-               .autocomplete-item-text {
-                       line-height: 100%;
-               }
-       }
-       .autocomplete-item-details {
-               display: block;
-               line-height: 130%;
-               font-size: 90%;
-               opacity: 0.7;
-       }
-
-       .icon {
-               opacity: .7;
-               margin-right: 7px;
-       }
-}
-
-.shareTabView {
-       .oneline {
-               white-space: nowrap;
-               position: relative;
-       }
-       .shareWithLoading {
-               padding-left: 10px;
-               right: 35px;
-               top: 3px;
-       }
-       .shareWithConfirm {
-               position: absolute;
-               right: 2px;
-               top: 6px;
-               padding: 14px;
-               opacity: 0.5;
-       }
-       .shareWithField:focus ~ .shareWithConfirm {
-               opacity: 1;
-       }
-       .linkMore {
-               position: absolute;
-               right: -7px;
-               top: -4px;
-               padding: 14px;
-       }
-       .popovermenu {
-               .linkPassMenu {
-                       .share-pass-submit {
-                               width: auto !important;
-                       }
-                       .icon-loading-small {
-                               background-color: var(--color-main-background);
-                               position: absolute;
-                               right: 8px;
-                               margin: 3px;
-                               padding: 10px;
-                               width: 32px;
-                               height: 32px;
-                               z-index: 10;
-                       }
-               }
-               .datepicker {
-                       margin-left: 35px;
-               }
-               .share-add {
-                       input.share-note-delete {
-                               border: none;
-                               background-color: transparent;
-                               width: 44px !important;
-                               padding: 0;
-                               flex: 0 0 44px;
-                               margin-left: auto;
-                               &.hidden {
-                                       display: none;
-                               }
-                       }
-               }
-               // note
-               .share-note-form {
-                       span.icon-note {
-                               position: relative;
-                       }
-                       textarea.share-note {
-                               margin: 0;
-                               width: 200px;
-                               min-height: 70px;
-                               resize: none;
-                               + input.share-note-submit {
-                                       position: absolute;
-                                       width: 44px !important;
-                                       height: 44px;
-                                       bottom: 0px;
-                                       right: 10px;
-                                       margin: 0;
-                                       background-color: transparent;
-                                       border: none;
-                                       opacity: .7;
-                                       &:hover,
-                                       &:focus,
-                                       &:active {
-                                               opacity: 1;
-                                       }
-                               }
-                       }
-                       // fix for popover link share
-                       &.share-note-link {
-                               margin-bottom: 10px;
-                       }
-               }
-
-               /* Border above last entry '+ Add another share' to separate it from current link settings */
-               .new-share {
-                       border-top: 1px solid var(--color-border);
-               }
-       }
-       .linkPass .icon-loading-small {
-               margin-right: 0px;
-       }
-       .icon {
-               background-size: 16px 16px;
-       }
-       .shareWithList .icon-loading-small:not(.hidden) + span,
-       .linkShareView .icon-loading-small:not(.hidden) + input + label:before {
-               /* Hide if loader is visible */
-               display: none !important;
-       }
-       input {
-               &[type='checkbox'] {
-                       margin: 0 3px 0 8px;
-                       vertical-align: middle;
-               }
-               &[type='text'] {
-                       &.shareWithField,
-                       &.emailField {
-                               width: 100%;
-                               box-sizing: border-box;
-                               padding-right: 32px;
-                               text-overflow: ellipsis;
-                       }
-               }
-               &[type='text'].linkText
-               &[type='password'].linkPassText,
-               &[type='password'].passwordField {
-                       width: 180px !important;
-               }
-       }
-       form {
-               font-size: 100%;
-               margin-left: 0;
-               margin-right: 0;
-       }
-       // share note on the sidebar
-       .share-note {
-               border-radius: var(--border-radius);
-               margin-bottom: 10px;
-               margin-left: 37px;
-       }
-}
-
-// Sharing tab users list
-.shareWithList {
-       list-style-type: none;
-       display: flex;
-       flex-direction: column;
-       > li {
-               height: 44px;
-               white-space: normal;
-               display: inline-flex;
-               align-items: center;
-               position: relative;
-               .avatar {
-                       width: 32px;
-                       height: 32px;
-                       background-color: var(--color-primary);
-               }
-       }
-       .unshare img {
-               vertical-align: text-bottom;
-               /* properly align icons */
-       }
-       .sharingOptionsGroup {
-               margin-left: auto;
-               display: flex;
-               align-items: center;
-               white-space: nowrap;
-
-               // icons
-               > .icon:not(.hidden),
-               .share-menu > .icon:not(.hidden) {
-                       padding: 14px;
-                       height: 44px;
-                       width: 44px;
-                       opacity: .5;
-                       display: block;
-                       cursor: pointer;
-
-                       &:hover,
-                       &:focus,
-                       &:active {
-                               opacity: .7;;
-                       }
-               }
-
-               // more menu
-               > .share-menu  {
-                       position: relative;
-                       display: block;
-               }
-       }
-       .username {
-               padding: 0 8px;
-               overflow: hidden;
-               white-space: nowrap;
-               text-overflow: ellipsis;
-       }
-}
-
-.ui-autocomplete {
-       /* limit dropdown height to 6 1/2 entries */
-       max-height: calc(36px * 6.5);
-       overflow-y: auto;
-       overflow-x: hidden;
-       z-index: 1550 !important;
-}
-
-.notCreatable {
-       padding-left: 12px;
-       padding-top: 12px;
-       color: var(--color-text-lighter);
-}
-
-.contactsmenu-popover {
-       left: -6px;
-       right: auto;
-       padding: 3px 6px;
-       top: 100%;
-       margin-top: 0;
-       li.hidden {
-               display: none !important;
-       }
-       &:after {
-               left: 8px;
-               right: auto;
-       }
-}
-
-.reshare,
-#link label,
-#expiration label {
-       display: inline-flex;
-       align-items: center;
-       .avatar {
-               margin-right: 5px;
-       }
-}
-
-.resharerInfoView.subView {
-       position: relative;
-}
diff --git a/apps/files_sharing/js/additionalScripts.js b/apps/files_sharing/js/additionalScripts.js
new file mode 100644 (file)
index 0000000..19d1d3b
--- /dev/null
@@ -0,0 +1,24 @@
+!function(e){var n={};function t(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,t),r.l=!0,r.exports}t.m=e,t.c=n,t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:i})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var r in e)t.d(i,r,function(n){return e[n]}.bind(null,r));return i},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="/js/",t(t.s=2)}([function(e,n,t){"use strict";e.exports=function(e){var n=[];return n.toString=function(){return this.map(function(n){var t=function(e,n){var t=e[1]||"",i=e[3];if(!i)return t;if(n&&"function"==typeof btoa){var r=(o=i,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */"),a=i.sources.map(function(e){return"/*# sourceURL="+i.sourceRoot+e+" */"});return[t].concat(a).concat([r]).join("\n")}var o;return[t].join("\n")}(n,e);return n[2]?"@media "+n[2]+"{"+t+"}":t}).join("")},n.i=function(e,t){"string"==typeof e&&(e=[[null,e,""]]);for(var i={},r=0;r<this.length;r++){var a=this[r][0];null!=a&&(i[a]=!0)}for(r=0;r<e.length;r++){var o=e[r];null!=o[0]&&i[o[0]]||(t&&!o[2]?o[2]=t:t&&(o[2]="("+o[2]+") and ("+t+")"),n.push(o))}},n}},function(e,n,t){var i,r,a={},o=(i=function(){return window&&document&&document.all&&!window.atob},function(){return void 0===r&&(r=i.apply(this,arguments)),r}),s=function(e){var n={};return function(e,t){if("function"==typeof e)return e();if(void 0===n[e]){var i=function(e,n){return n?n.querySelector(e):document.querySelector(e)}.call(this,e,t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}n[e]=i}return n[e]}}(),h=null,l=0,p=[],d=t(8);function c(e,n){for(var t=0;t<e.length;t++){var i=e[t],r=a[i.id];if(r){r.refs++;for(var o=0;o<r.parts.length;o++)r.parts[o](i.parts[o]);for(;o<i.parts.length;o++)r.parts.push(v(i.parts[o],n))}else{var s=[];for(o=0;o<i.parts.length;o++)s.push(v(i.parts[o],n));a[i.id]={id:i.id,refs:1,parts:s}}}}function u(e,n){for(var t=[],i={},r=0;r<e.length;r++){var a=e[r],o=n.base?a[0]+n.base:a[0],s={css:a[1],media:a[2],sourceMap:a[3]};i[o]?i[o].parts.push(s):t.push(i[o]={id:o,parts:[s]})}return t}function f(e,n){var t=s(e.insertInto);if(!t)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var i=p[p.length-1];if("top"===e.insertAt)i?i.nextSibling?t.insertBefore(n,i.nextSibling):t.appendChild(n):t.insertBefore(n,t.firstChild),p.push(n);else if("bottom"===e.insertAt)t.appendChild(n);else{if("object"!=typeof e.insertAt||!e.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 r=s(e.insertAt.before,t);t.insertBefore(n,r)}}function m(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e);var n=p.indexOf(e);n>=0&&p.splice(n,1)}function g(e){var n=document.createElement("style");if(void 0===e.attrs.type&&(e.attrs.type="text/css"),void 0===e.attrs.nonce){var i=function(){0;return t.nc}();i&&(e.attrs.nonce=i)}return b(n,e.attrs),f(e,n),n}function b(e,n){Object.keys(n).forEach(function(t){e.setAttribute(t,n[t])})}function v(e,n){var t,i,r,a;if(n.transform&&e.css){if(!(a="function"==typeof n.transform?n.transform(e.css):n.transform.default(e.css)))return function(){};e.css=a}if(n.singleton){var o=l++;t=h||(h=g(n)),i=O.bind(null,t,o,!1),r=O.bind(null,t,o,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(t=function(e){var n=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",b(n,e.attrs),f(e,n),n}(n),i=function(e,n,t){var i=t.css,r=t.sourceMap,a=void 0===n.convertToAbsoluteUrls&&r;(n.convertToAbsoluteUrls||a)&&(i=d(i));r&&(i+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+" */");var o=new Blob([i],{type:"text/css"}),s=e.href;e.href=URL.createObjectURL(o),s&&URL.revokeObjectURL(s)}.bind(null,t,n),r=function(){m(t),t.href&&URL.revokeObjectURL(t.href)}):(t=g(n),i=function(e,n){var t=n.css,i=n.media;i&&e.setAttribute("media",i);if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}.bind(null,t),r=function(){m(t)});return i(e),function(n){if(n){if(n.css===e.css&&n.media===e.media&&n.sourceMap===e.sourceMap)return;i(e=n)}else r()}}e.exports=function(e,n){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(n=n||{}).attrs="object"==typeof n.attrs?n.attrs:{},n.singleton||"boolean"==typeof n.singleton||(n.singleton=o()),n.insertInto||(n.insertInto="head"),n.insertAt||(n.insertAt="bottom");var t=u(e,n);return c(t,n),function(e){for(var i=[],r=0;r<t.length;r++){var o=t[r];(s=a[o.id]).refs--,i.push(s)}e&&c(u(e,n),n);for(r=0;r<i.length;r++){var s;if(0===(s=i[r]).refs){for(var h=0;h<s.parts.length;h++)s.parts[h]();delete a[s.id]}}}};var w,y=(w=[],function(e,n){return w[e]=n,w.filter(Boolean).join("\n")});function O(e,n,t,i){var r=t?"":i.css;if(e.styleSheet)e.styleSheet.cssText=y(n,r);else{var a=document.createTextNode(r),o=e.childNodes;o[n]&&e.removeChild(o[n]),o.length?e.insertBefore(a,o[n]):e.appendChild(a)}}},function(e,n,t){"use strict";t.r(n);t(3),t(4),t(5),t(6),t(9)},function(e,n){_.extend(OC.Files.Client,{PROPERTY_SHARE_TYPES:"{"+OC.Files.Client.NS_OWNCLOUD+"}share-types",PROPERTY_OWNER_ID:"{"+OC.Files.Client.NS_OWNCLOUD+"}owner-id",PROPERTY_OWNER_DISPLAY_NAME:"{"+OC.Files.Client.NS_OWNCLOUD+"}owner-display-name"}),OCA.Sharing||(OCA.Sharing={}),OCA.Sharing.Util={attach:function(e){if(OC.Share&&"trashbin"!==e.id&&"files.public"!==e.id){var n=e.fileActions,i=e._createRow;e._createRow=function(e){var t=i.apply(this,arguments),r=OCA.Sharing.Util.getSharePermissions(e);return 0===e.permissions&&(delete n.actions.all.Comment,delete n.actions.all.Details,delete n.actions.all.Goto),t.attr("data-share-permissions",r),e.shareOwner&&(t.attr("data-share-owner",e.shareOwner),t.attr("data-share-owner-id",e.shareOwnerId),"shared-root"===e.mountType&&t.attr("data-permissions",e.permissions|OC.PERMISSION_UPDATE)),e.recipientData&&!_.isEmpty(e.recipientData)&&t.attr("data-share-recipient-data",JSON.stringify(e.recipientData)),e.shareTypes&&t.attr("data-share-types",e.shareTypes.join(",")),t};var r=e.elementToFile;e.elementToFile=function(e){var n=r.apply(this,arguments);if(n.sharePermissions=e.attr("data-share-permissions")||void 0,n.shareOwner=e.attr("data-share-owner")||void 0,n.shareOwnerId=e.attr("data-share-owner-id")||void 0,e.attr("data-share-types")&&(n.shareTypes=e.attr("data-share-types").split(",")),e.attr("data-expiration")){var t=parseInt(e.attr("data-expiration"));n.shares=[],n.shares.push({expiration:t})}return n};var a=e._getWebdavProperties;e._getWebdavProperties=function(){var e=a.apply(this,arguments);return e.push(OC.Files.Client.PROPERTY_OWNER_ID),e.push(OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME),e.push(OC.Files.Client.PROPERTY_SHARE_TYPES),e},e.filesClient.addFileInfoParser(function(e){var n={},t=e.propStat[0].properties,i=t[OC.Files.Client.PROPERTY_PERMISSIONS];i&&i.indexOf("S")>=0&&(n.shareOwner=t[OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME],n.shareOwnerId=t[OC.Files.Client.PROPERTY_OWNER_ID]);var r=t[OC.Files.Client.PROPERTY_SHARE_TYPES];return r&&(n.shareTypes=_.chain(r).filter(function(e){return e.namespaceURI===OC.Files.Client.NS_OWNCLOUD&&"share-type"===e.nodeName.split(":")[1]}).map(function(e){return parseInt(e.textContent||e.text,10)}).value()),n}),e.$el.on("fileActionsReady",function(e){var n=e.$files;_.each(n,function(e){var n=$(e),t=n.attr("data-share-types")||"",i=n.attr("data-share-owner");if(t||i){var r=!1,a=!1;_.each(t.split(",")||[],function(e){(e=parseInt(e,10))===OC.Share.SHARE_TYPE_LINK?r=!0:e===OC.Share.SHARE_TYPE_EMAIL?r=!0:e===OC.Share.SHARE_TYPE_USER?a=!0:e===OC.Share.SHARE_TYPE_GROUP?a=!0:e===OC.Share.SHARE_TYPE_REMOTE?a=!0:e===OC.Share.SHARE_TYPE_CIRCLE?a=!0:e===OC.Share.SHARE_TYPE_ROOM&&(a=!0)}),OCA.Sharing.Util._updateFileActionIcon(n,a,r)}})}),e.$el.on("changeDirectory",function(){OCA.Sharing.sharesLoaded=!1}),n.registerAction({name:"Share",displayName:"",altText:t("core","Share"),mime:"all",permissions:OC.PERMISSION_ALL,iconClass:"icon-shared",type:OCA.Files.FileActions.TYPE_INLINE,actionHandler:function(n,t){var i=parseInt(t.$file.data("share-permissions"),10);(isNaN(i)||i>0)&&e.showDetailsView(n,"shareTabView")},render:function(e,t,i){return 0!=(parseInt(i.$file.data("permissions"),10)&OC.PERMISSION_SHARE)||i.$file.attr("data-share-owner")?n._defaultRenderAction.call(n,e,t,i):null}});var o=new OCA.Sharing.ShareTabView("shareTabView",{order:-20});o.on("sharesChanged",function(n){var t=n.fileInfoModel,i=e.findFileEl(t.get("name")),r=n.hasLinkShares();n.get("shares").forEach(function(e){e.share_type===OC.Share.SHARE_TYPE_EMAIL&&(r=!0)}),OCA.Sharing.Util._updateFileListDataAttributes(e,i,n),OCA.Sharing.Util._updateFileActionIcon(i,n.hasUserShares(),r)||OC.Share.markFileAsShared(i,!1,!1),t.set({shareTypes:n.getShareTypes(),icon:i.attr("data-icon")})}),e.registerTabView(o);var s=new OCA.Sharing.ShareBreadCrumbView({shareTab:o});e.registerBreadCrumbDetailView(s)}},_updateFileListDataAttributes:function(e,n,t){if("files"!==e.id)if(_.pluck(t.get("shares"),"share_with_displayname").length){var i=_.mapObject(t.get("shares"),function(e){return{shareWith:e.share_with,shareWithDisplayName:e.share_with_displayname}});n.attr("data-share-recipient-data",JSON.stringify(i))}else n.removeAttr("data-share-recipient-data")},_updateFileActionIcon:function(e,n,t){return!!(n||t||e.attr("data-share-recipient-data")||e.attr("data-share-owner"))&&(OC.Share.markFileAsShared(e,!0,t),!0)},getSharePermissions:function(e){return e.sharePermissions}},OC.Plugins.register("OCA.Files.FileList",OCA.Sharing.Util)},function(e,n){var i;i=OCA.Files.DetailTabView.extend({id:"shareTabView",className:"tab shareTabView",initialize:function(e,n){OCA.Files.DetailTabView.prototype.initialize.call(this,e,n),OC.Plugins.attach("OCA.Sharing.ShareTabView",this)},template:function(e){return'<div><div class="dialogContainer"></div></div>'},getLabel:function(){return t("files_sharing","Sharing")},getIcon:function(){return"icon-shared"},render:function(){var e=this;if(this._dialog&&(this._dialog.model.off(),this._dialog.remove(),this._dialog=null),this.model){this.$el.html(this.template()),_.isUndefined(this.model.get("sharePermissions"))&&this.model.set("sharePermissions",OCA.Sharing.Util.getSharePermissions(this.model.attributes));var n={itemType:this.model.isDirectory()?"folder":"file",itemSource:this.model.get("id"),possiblePermissions:this.model.get("sharePermissions")},t=new OC.Share.ShareConfigModel,i=new OC.Share.ShareItemModel(n,{configModel:t,fileInfoModel:this.model});this._dialog=new OC.Share.ShareDialogView({configModel:t,model:i}),this.$el.find(".dialogContainer").append(this._dialog.$el),this._dialog.render(),this._dialog.model.fetch(),this._dialog.model.on("change",function(){e.trigger("sharesChanged",i)})}else this.$el.empty();this.trigger("rendered")}}),OCA.Sharing.ShareTabView=i},function(e,n){
+/**
+ * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+!function(){"use strict";var e=OC.Backbone.View.extend({tagName:"span",events:{click:"_onClick"},_dirInfo:void 0,_shareTab:void 0,initialize:function(e){this._shareTab=e.shareTab},render:function(e){if(this._dirInfo=e.dirInfo||null,null===this._dirInfo||"/"===this._dirInfo.path&&""===this._dirInfo.name)this.$el.removeClass("shared icon-public icon-shared"),this.$el.hide();else{var n=e.dirInfo&&e.dirInfo.shareTypes&&e.dirInfo.shareTypes.length>0;this.$el.removeClass("shared icon-public icon-shared"),n?(this.$el.addClass("shared"),-1!==e.dirInfo.shareTypes.indexOf(OC.Share.SHARE_TYPE_LINK)?this.$el.addClass("icon-public"):this.$el.addClass("icon-shared")):this.$el.addClass("icon-shared"),this.$el.show(),this.delegateEvents()}return this},_onClick:function(e){e.preventDefault();var n=new OCA.Files.FileInfoModel(this._dirInfo),t=this;n.on("change",function(){t.render({dirInfo:t._dirInfo})}),this._shareTab.on("sharesChanged",function(e){for(var n=[],i=e.getSharesWithCurrentItem(),r=0;r<i.length;r++)-1===n.indexOf(i[r].share_type)&&n.push(i[r].share_type);e.hasLinkShares()&&n.push(OC.Share.SHARE_TYPE_LINK),t._dirInfo.shareTypes=n,t.render({dirInfo:t._dirInfo})}),OCA.Files.App.fileList.showDetailsView(n,"shareTabView")}});OCA.Sharing.ShareBreadCrumbView=e}()},function(e,n,t){var i=t(7);"string"==typeof i&&(i=[[e.i,i,""]]);var r={hmr:!0,transform:void 0,insertInto:void 0};t(1)(i,r);i.locals&&(e.exports=i.locals)},function(e,n,t){(e.exports=t(0)(!1)).push([e.i,".app-files .shareTabView {\n  min-height: 100px; }\n\n.share-autocomplete-item {\n  display: flex; }\n  .share-autocomplete-item.merged {\n    margin-left: 32px; }\n  .share-autocomplete-item .autocomplete-item-text {\n    margin-left: 10px;\n    margin-right: 10px;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    line-height: 32px;\n    vertical-align: middle;\n    flex-grow: 1; }\n    .share-autocomplete-item .autocomplete-item-text .ui-state-highlight {\n      border: none;\n      margin: 0; }\n  .share-autocomplete-item.with-description .autocomplete-item-text {\n    line-height: 100%; }\n  .share-autocomplete-item .autocomplete-item-details {\n    display: block;\n    line-height: 130%;\n    font-size: 90%;\n    opacity: 0.7; }\n  .share-autocomplete-item .icon {\n    opacity: .7;\n    margin-right: 7px; }\n\n.shareTabView .oneline {\n  white-space: nowrap;\n  position: relative; }\n\n.shareTabView .shareWithLoading {\n  padding-left: 10px;\n  right: 35px;\n  top: 3px; }\n\n.shareTabView .shareWithConfirm {\n  position: absolute;\n  right: 2px;\n  top: 6px;\n  padding: 14px;\n  opacity: 0.5; }\n\n.shareTabView .shareWithField:focus ~ .shareWithConfirm {\n  opacity: 1; }\n\n.shareTabView .linkMore {\n  position: absolute;\n  right: -7px;\n  top: -4px;\n  padding: 14px; }\n\n.shareTabView .popovermenu {\n  /* Border above last entry '+ Add another share' to separate it from current link settings */ }\n  .shareTabView .popovermenu .linkPassMenu .share-pass-submit {\n    width: auto !important; }\n  .shareTabView .popovermenu .linkPassMenu .icon-loading-small {\n    background-color: var(--color-main-background);\n    position: absolute;\n    right: 8px;\n    margin: 3px;\n    padding: 10px;\n    width: 32px;\n    height: 32px;\n    z-index: 10; }\n  .shareTabView .popovermenu .datepicker {\n    margin-left: 35px; }\n  .shareTabView .popovermenu .share-add input.share-note-delete {\n    border: none;\n    background-color: transparent;\n    width: 44px !important;\n    padding: 0;\n    flex: 0 0 44px;\n    margin-left: auto; }\n    .shareTabView .popovermenu .share-add input.share-note-delete.hidden {\n      display: none; }\n  .shareTabView .popovermenu .share-note-form span.icon-note {\n    position: relative; }\n  .shareTabView .popovermenu .share-note-form textarea.share-note {\n    margin: 0;\n    width: 200px;\n    min-height: 70px;\n    resize: none; }\n    .shareTabView .popovermenu .share-note-form textarea.share-note + input.share-note-submit {\n      position: absolute;\n      width: 44px !important;\n      height: 44px;\n      bottom: 0px;\n      right: 10px;\n      margin: 0;\n      background-color: transparent;\n      border: none;\n      opacity: .7; }\n      .shareTabView .popovermenu .share-note-form textarea.share-note + input.share-note-submit:hover, .shareTabView .popovermenu .share-note-form textarea.share-note + input.share-note-submit:focus, .shareTabView .popovermenu .share-note-form textarea.share-note + input.share-note-submit:active {\n        opacity: 1; }\n  .shareTabView .popovermenu .share-note-form.share-note-link {\n    margin-bottom: 10px; }\n  .shareTabView .popovermenu .new-share {\n    border-top: 1px solid var(--color-border); }\n\n.shareTabView .linkPass .icon-loading-small {\n  margin-right: 0px; }\n\n.shareTabView .icon {\n  background-size: 16px 16px; }\n\n.shareTabView .shareWithList .icon-loading-small:not(.hidden) + span,\n.shareTabView .linkShareView .icon-loading-small:not(.hidden) + input + label:before {\n  /* Hide if loader is visible */\n  display: none !important; }\n\n.shareTabView input[type='checkbox'] {\n  margin: 0 3px 0 8px;\n  vertical-align: middle; }\n\n.shareTabView input[type='text'].shareWithField, .shareTabView input[type='text'].emailField {\n  width: 100%;\n  box-sizing: border-box;\n  padding-right: 32px;\n  text-overflow: ellipsis; }\n\n.shareTabView input[type='text'].linkText .shareTabView input[type='password'].linkPassText, .shareTabView input[type='password'].passwordField {\n  width: 180px !important; }\n\n.shareTabView form {\n  font-size: 100%;\n  margin-left: 0;\n  margin-right: 0; }\n\n.shareTabView .share-note {\n  border-radius: var(--border-radius);\n  margin-bottom: 10px;\n  margin-left: 37px; }\n\n.shareWithList {\n  list-style-type: none;\n  display: flex;\n  flex-direction: column; }\n  .shareWithList > li {\n    height: 44px;\n    white-space: normal;\n    display: inline-flex;\n    align-items: center;\n    position: relative; }\n    .shareWithList > li .avatar {\n      width: 32px;\n      height: 32px;\n      background-color: var(--color-primary); }\n  .shareWithList .unshare img {\n    vertical-align: text-bottom;\n    /* properly align icons */ }\n  .shareWithList .sharingOptionsGroup {\n    margin-left: auto;\n    display: flex;\n    align-items: center;\n    white-space: nowrap; }\n    .shareWithList .sharingOptionsGroup > .icon:not(.hidden),\n    .shareWithList .sharingOptionsGroup .share-menu > .icon:not(.hidden) {\n      padding: 14px;\n      height: 44px;\n      width: 44px;\n      opacity: .5;\n      display: block;\n      cursor: pointer; }\n      .shareWithList .sharingOptionsGroup > .icon:not(.hidden):hover, .shareWithList .sharingOptionsGroup > .icon:not(.hidden):focus, .shareWithList .sharingOptionsGroup > .icon:not(.hidden):active,\n      .shareWithList .sharingOptionsGroup .share-menu > .icon:not(.hidden):hover,\n      .shareWithList .sharingOptionsGroup .share-menu > .icon:not(.hidden):focus,\n      .shareWithList .sharingOptionsGroup .share-menu > .icon:not(.hidden):active {\n        opacity: .7; }\n    .shareWithList .sharingOptionsGroup > .share-menu {\n      position: relative;\n      display: block; }\n  .shareWithList .username {\n    padding: 0 8px;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis; }\n\n.ui-autocomplete {\n  /* limit dropdown height to 6 1/2 entries */\n  max-height: calc(36px * 6.5);\n  overflow-y: auto;\n  overflow-x: hidden;\n  z-index: 1550 !important; }\n\n.notCreatable {\n  padding-left: 12px;\n  padding-top: 12px;\n  color: var(--color-text-lighter); }\n\n.contactsmenu-popover {\n  left: -6px;\n  right: auto;\n  padding: 3px 6px;\n  top: 100%;\n  margin-top: 0; }\n  .contactsmenu-popover li.hidden {\n    display: none !important; }\n  .contactsmenu-popover:after {\n    left: 8px;\n    right: auto; }\n\n.reshare,\n#link label,\n#expiration label {\n  display: inline-flex;\n  align-items: center; }\n  .reshare .avatar,\n  #link label .avatar,\n  #expiration label .avatar {\n    margin-right: 5px; }\n\n.resharerInfoView.subView {\n  position: relative; }\n",""])},function(e,n){e.exports=function(e){var n="undefined"!=typeof window&&window.location;if(!n)throw new Error("fixUrls requires window.location");if(!e||"string"!=typeof e)return e;var t=n.protocol+"//"+n.host,i=t+n.pathname.replace(/\/[^\/]*$/,"/");return e.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(e,n){var r,a=n.trim().replace(/^"(.*)"$/,function(e,n){return n}).replace(/^'(.*)'$/,function(e,n){return n});return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(a)?e:(r=0===a.indexOf("//")?a:0===a.indexOf("/")?t+a:i+a.replace(/^\.\//,""),"url("+JSON.stringify(r)+")")})}},function(e,n,t){var i=t(10);"string"==typeof i&&(i=[[e.i,i,""]]);var r={hmr:!0,transform:void 0,insertInto:void 0};t(1)(i,r);i.locals&&(e.exports=i.locals)},function(e,n,t){(e.exports=t(0)(!1)).push([e.i,"/**\n * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\ndiv.crumb span.icon-shared,\ndiv.crumb span.icon-public {\n  display: inline-block;\n  cursor: pointer;\n  opacity: 0.2;\n  margin-right: 6px; }\n\ndiv.crumb span.icon-shared.shared,\ndiv.crumb span.icon-public.shared {\n  opacity: 0.7; }\n",""])}]);
+//# sourceMappingURL=additionalScripts.js.map
\ No newline at end of file
diff --git a/apps/files_sharing/js/additionalScripts.js.map b/apps/files_sharing/js/additionalScripts.js.map
new file mode 100644 (file)
index 0000000..6d19e8d
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/css-loader/dist/runtime/api.js","webpack:///./node_modules/style-loader/lib/addStyles.js","webpack:///./apps/files_sharing/src/additionalScripts.js","webpack:///./apps/files_sharing/src/share.js","webpack:///./apps/files_sharing/src/sharetabview.js","webpack:///./apps/files_sharing/src/sharebreadcrumbview.js","webpack:///./apps/files_sharing/src/style/sharetabview.scss?3391","webpack:///./apps/files_sharing/src/style/sharetabview.scss","webpack:///./node_modules/style-loader/lib/urls.js","webpack:///./apps/files_sharing/src/style/sharebreadcrumb.scss?732e","webpack:///./apps/files_sharing/src/style/sharebreadcrumb.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","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__","_","extend","OC","Files","Client","PROPERTY_SHARE_TYPES","NS_OWNCLOUD","PROPERTY_OWNER_ID","PROPERTY_OWNER_DISPLAY_NAME","OCA","Sharing","Util","attach","fileList","Share","fileActions","oldCreateRow","_createRow","fileData","tr","sharePermissions","getSharePermissions","permissions","actions","Comment","Details","Goto","attr","shareOwner","shareOwnerId","mountType","PERMISSION_UPDATE","recipientData","isEmpty","shareTypes","oldElementToFile","elementToFile","$el","fileInfo","split","expirationTimestamp","parseInt","shares","expiration","oldGetWebdavProperties","_getWebdavProperties","props","filesClient","addFileInfoParser","response","data","propStat","properties","permissionsProp","PROPERTY_PERMISSIONS","shareTypesProp","chain","xmlvalue","namespaceURI","nodeName","textContent","text","on","ev","$files","each","file","$tr","$","hasLink","hasShares","shareType","SHARE_TYPE_LINK","SHARE_TYPE_EMAIL","SHARE_TYPE_USER","SHARE_TYPE_GROUP","SHARE_TYPE_REMOTE","SHARE_TYPE_CIRCLE","SHARE_TYPE_ROOM","_updateFileActionIcon","sharesLoaded","registerAction","displayName","altText","mime","PERMISSION_ALL","iconClass","FileActions","TYPE_INLINE","actionHandler","fileName","context","$file","isNaN","showDetailsView","render","actionSpec","isDefault","PERMISSION_SHARE","_defaultRenderAction","shareTab","ShareTabView","order","shareModel","fileInfoModel","findFileEl","hasLinkShares","share","share_type","_updateFileListDataAttributes","hasUserShares","markFileAsShared","set","getShareTypes","icon","registerTabView","breadCrumbSharingDetailView","ShareBreadCrumbView","registerBreadCrumbDetailView","pluck","mapObject","shareWith","share_with","shareWithDisplayName","share_with_displayname","removeAttr","Plugins","register","DetailTabView","className","initialize","template","params","getLabel","getIcon","self","_dialog","model","off","html","isUndefined","attributes","itemType","isDirectory","itemSource","possiblePermissions","configModel","ShareConfigModel","ShareItemModel","ShareDialogView","find","append","fetch","trigger","empty","BreadCrumbView","Backbone","View","tagName","events","click","_dirInfo","_shareTab","dirInfo","path","removeClass","hide","isShared","addClass","show","delegateEvents","_onClick","preventDefault","FileInfoModel","getSharesWithCurrentItem","App","hmr","locals","location","baseUrl","protocol","host","currentDir","pathname","replace","fullMatch","origUrl","newUrl","unquotedOrigUrl","trim","$1","test"],"mappings":"aACA,IAAAA,EAAA,GAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAC,QAGA,IAAAC,EAAAJ,EAAAE,GAAA,CACAG,EAAAH,EACAI,GAAA,EACAH,QAAA,IAUA,OANAI,EAAAL,GAAAM,KAAAJ,EAAAD,QAAAC,IAAAD,QAAAF,GAGAG,EAAAE,GAAA,EAGAF,EAAAD,QAKAF,EAAAQ,EAAAF,EAGAN,EAAAS,EAAAV,EAGAC,EAAAU,EAAA,SAAAR,EAAAS,EAAAC,GACAZ,EAAAa,EAAAX,EAAAS,IACAG,OAAAC,eAAAb,EAAAS,EAAA,CAA0CK,YAAA,EAAAC,IAAAL,KAK1CZ,EAAAkB,EAAA,SAAAhB,GACA,oBAAAiB,eAAAC,aACAN,OAAAC,eAAAb,EAAAiB,OAAAC,YAAA,CAAwDC,MAAA,WAExDP,OAAAC,eAAAb,EAAA,cAAiDmB,OAAA,KAQjDrB,EAAAsB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAArB,EAAAqB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,iBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAX,OAAAY,OAAA,MAGA,GAFA1B,EAAAkB,EAAAO,GACAX,OAAAC,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAArB,EAAAU,EAAAe,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAzB,EAAA6B,EAAA,SAAA1B,GACA,IAAAS,EAAAT,KAAAqB,WACA,WAA2B,OAAArB,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAH,EAAAU,EAAAE,EAAA,IAAAA,GACAA,GAIAZ,EAAAa,EAAA,SAAAiB,EAAAC,GAAsD,OAAAjB,OAAAkB,UAAAC,eAAA1B,KAAAuB,EAAAC,IAGtD/B,EAAAkC,EAAA,OAIAlC,IAAAmC,EAAA,kCC3EAhC,EAAAD,QAAA,SAAAkC,GACA,IAAAC,EAAA,GAgDA,OA9CAA,EAAAC,SAAA,WACA,OAAAC,KAAAC,IAAA,SAAAC,GACA,IAAAC,EA+CA,SAAAD,EAAAL,GACA,IAAAM,EAAAD,EAAA,OACAE,EAAAF,EAAA,GAEA,IAAAE,EACA,OAAAD,EAGA,GAAAN,GAAA,mBAAAQ,KAAA,CACA,IAAAC,GAWAC,EAXAH,EAeA,mEAFAC,KAAAG,SAAAC,mBAAAC,KAAAC,UAAAJ,MAEA,OAdAK,EAAAR,EAAAS,QAAAZ,IAAA,SAAAa,GACA,uBAAAV,EAAAW,WAAAD,EAAA,QAEA,OAAAX,GAAAa,OAAAJ,GAAAI,OAAA,CAAAV,IAAAW,KAAA,MAOA,IAAAV,EAJA,OAAAJ,GAAAc,KAAA,MA/DAC,CAAAhB,EAAAL,GAEA,OAAAK,EAAA,GACA,UAAAA,EAAA,OAAuCC,EAAA,IAEvCA,IAEKc,KAAA,KAILnB,EAAAjC,EAAA,SAAAE,EAAAoD,GACA,iBAAApD,IACAA,EAAA,OAAAA,EAAA,MAKA,IAFA,IAAAqD,EAAA,GAEAvD,EAAA,EAAmBA,EAAAmC,KAAAqB,OAAiBxD,IAAA,CACpC,IAAAyD,EAAAtB,KAAAnC,GAAA,GAEA,MAAAyD,IACAF,EAAAE,IAAA,GAIA,IAAAzD,EAAA,EAAeA,EAAAE,EAAAsD,OAAoBxD,IAAA,CACnC,IAAAqC,EAAAnC,EAAAF,GAKA,MAAAqC,EAAA,IAAAkB,EAAAlB,EAAA,MACAiB,IAAAjB,EAAA,GACAA,EAAA,GAAAiB,EACSA,IACTjB,EAAA,OAAAA,EAAA,aAAAiB,EAAA,KAGArB,EAAAyB,KAAArB,MAKAJ,oBCnDA,IAEA0B,EACAC,EAHAC,EAAA,GAWAC,GATAH,EASA,WAMA,OAAAI,QAAAC,mBAAAC,MAAAF,OAAAG,MAZA,WAEA,YADA,IAAAN,MAAAD,EAAAQ,MAAAhC,KAAAiC,YACAR,IAoBAS,EAAA,SAAAV,GACA,IAAAC,EAAA,GAEA,gBAAAU,EAAAC,GAMA,sBAAAD,EACA,OAAAA,IAEA,YAAAV,EAAAU,GAAA,CACA,IAAAE,EApBA,SAAAF,EAAAC,GACA,OAAAA,EACAA,EAAAE,cAAAH,GAEAN,SAAAS,cAAAH,IAgBAnE,KAAAgC,KAAAmC,EAAAC,GAEA,GAAAR,OAAAW,mBAAAF,aAAAT,OAAAW,kBACA,IAGAF,IAAAG,gBAAAC,KACK,MAAAC,GACLL,EAAA,KAGAZ,EAAAU,GAAAE,EAEA,OAAAZ,EAAAU,IA1BA,GA8BAQ,EAAA,KACAC,EAAA,EACAC,EAAA,GAEAC,EAAcrF,EAAQ,GAqDtB,SAAAsF,EAAAC,EAAAC,GACA,QAAApF,EAAA,EAAgBA,EAAAmF,EAAA3B,OAAmBxD,IAAA,CACnC,IAAAqC,EAAA8C,EAAAnF,GACAqF,EAAAxB,EAAAxB,EAAAoB,IAEA,GAAA4B,EAAA,CACAA,EAAAC,OAEA,QAAAC,EAAA,EAAiBA,EAAAF,EAAAG,MAAAhC,OAA2B+B,IAC5CF,EAAAG,MAAAD,GAAAlD,EAAAmD,MAAAD,IAGA,KAAQA,EAAAlD,EAAAmD,MAAAhC,OAAuB+B,IAC/BF,EAAAG,MAAA9B,KAAA+B,EAAApD,EAAAmD,MAAAD,GAAAH,QAEG,CACH,IAAAI,EAAA,GAEA,IAAAD,EAAA,EAAiBA,EAAAlD,EAAAmD,MAAAhC,OAAuB+B,IACxCC,EAAA9B,KAAA+B,EAAApD,EAAAmD,MAAAD,GAAAH,IAGAvB,EAAAxB,EAAAoB,IAAA,CAA2BA,GAAApB,EAAAoB,GAAA6B,KAAA,EAAAE,WAK3B,SAAAE,EAAAzD,EAAAmD,GAIA,IAHA,IAAAD,EAAA,GACAQ,EAAA,GAEA3F,EAAA,EAAgBA,EAAAiC,EAAAuB,OAAiBxD,IAAA,CACjC,IAAAqC,EAAAJ,EAAAjC,GACAyD,EAAA2B,EAAAQ,KAAAvD,EAAA,GAAA+C,EAAAQ,KAAAvD,EAAA,GAIAwD,EAAA,CAAcC,IAHdzD,EAAA,GAGc0D,MAFd1D,EAAA,GAEcK,UADdL,EAAA,IAGAsD,EAAAlC,GACAkC,EAAAlC,GAAA+B,MAAA9B,KAAAmC,GADAV,EAAAzB,KAAAiC,EAAAlC,GAAA,CAAkDA,KAAA+B,MAAA,CAAAK,KAIlD,OAAAV,EAGA,SAAAa,EAAAZ,EAAAa,GACA,IAAA3B,EAAAD,EAAAe,EAAAc,YAEA,IAAA5B,EACA,UAAA6B,MAAA,+GAGA,IAAAC,EAAApB,IAAAxB,OAAA,GAEA,WAAA4B,EAAAiB,SACAD,EAEGA,EAAAE,YACHhC,EAAAiC,aAAAN,EAAAG,EAAAE,aAEAhC,EAAAkC,YAAAP,GAJA3B,EAAAiC,aAAAN,EAAA3B,EAAAmC,YAMAzB,EAAAtB,KAAAuC,QACE,cAAAb,EAAAiB,SACF/B,EAAAkC,YAAAP,OACE,qBAAAb,EAAAiB,WAAAjB,EAAAiB,SAAAK,OAIF,UAAAP,MAAA,8LAHA,IAAAG,EAAAjC,EAAAe,EAAAiB,SAAAK,OAAApC,GACAA,EAAAiC,aAAAN,EAAAK,IAMA,SAAAK,EAAAV,GACA,UAAAA,EAAAW,WAAA,SACAX,EAAAW,WAAAC,YAAAZ,GAEA,IAAAa,EAAA9B,EAAA+B,QAAAd,GACAa,GAAA,GACA9B,EAAAgC,OAAAF,EAAA,GAIA,SAAAG,EAAA7B,GACA,IAAAa,EAAAjC,SAAAkD,cAAA,SAMA,QAJAC,IAAA/B,EAAAgC,MAAAC,OACAjC,EAAAgC,MAAAC,KAAA,iBAGAF,IAAA/B,EAAAgC,MAAAE,MAAA,CACA,IAAAA,EAgCA,WACK,EAIL,OAAQ1H,EAAA2H,GArCRC,GACAF,IACAlC,EAAAgC,MAAAE,SAOA,OAHAG,EAAAxB,EAAAb,EAAAgC,OACApB,EAAAZ,EAAAa,GAEAA,EAiBA,SAAAwB,EAAAC,EAAAN,GACA1G,OAAAiH,KAAAP,GAAAQ,QAAA,SAAArG,GACAmG,EAAAG,aAAAtG,EAAA6F,EAAA7F,MAYA,SAAAkE,EAAAqC,EAAA1C,GACA,IAAAa,EAAA8B,EAAAC,EAAAC,EAGA,GAAA7C,EAAA8C,WAAAJ,EAAAhC,IAAA,CAKA,KAJAmC,EAAA,mBAAA7C,EAAA8C,UACA9C,EAAA8C,UAAAJ,EAAAhC,KACAV,EAAA8C,UAAAC,QAAAL,EAAAhC,MASA,oBAJAgC,EAAAhC,IAAAmC,EAUA,GAAA7C,EAAAN,UAAA,CACA,IAAAsD,EAAArD,IAEAkB,EAAAnB,MAAAmC,EAAA7B,IAEA2C,EAAAM,EAAA7G,KAAA,KAAAyE,EAAAmC,GAAA,GACAJ,EAAAK,EAAA7G,KAAA,KAAAyE,EAAAmC,GAAA,QAGAN,EAAApF,WACA,mBAAA4F,KACA,mBAAAA,IAAAC,iBACA,mBAAAD,IAAAE,iBACA,mBAAAC,MACA,mBAAAjG,MAEAyD,EAlEA,SAAAb,GACA,IAAAsD,EAAA1E,SAAAkD,cAAA,QAUA,YARAC,IAAA/B,EAAAgC,MAAAC,OACAjC,EAAAgC,MAAAC,KAAA,YAEAjC,EAAAgC,MAAAuB,IAAA,aAEAlB,EAAAiB,EAAAtD,EAAAgC,OACApB,EAAAZ,EAAAsD,GAEAA,EAuDAE,CAAAxD,GACA2C,EAiFA,SAAAW,EAAAtD,EAAA0C,GACA,IAAAhC,EAAAgC,EAAAhC,IACApD,EAAAoF,EAAApF,UAQAmG,OAAA1B,IAAA/B,EAAA0D,uBAAApG,GAEA0C,EAAA0D,uBAAAD,KACA/C,EAAAb,EAAAa,IAGApD,IAEAoD,GAAA,uDAAuDtD,KAAAG,SAAAC,mBAAAC,KAAAC,UAAAJ,MAAA,OAGvD,IAAAqG,EAAA,IAAAN,KAAA,CAAA3C,GAAA,CAA6BuB,KAAA,aAE7B2B,EAAAN,EAAAO,KAEAP,EAAAO,KAAAX,IAAAC,gBAAAQ,GAEAC,GAAAV,IAAAE,gBAAAQ,IA5GAxH,KAAA,KAAAyE,EAAAb,GACA4C,EAAA,WACArB,EAAAV,GAEAA,EAAAgD,MAAAX,IAAAE,gBAAAvC,EAAAgD,SAGAhD,EAAAgB,EAAA7B,GACA2C,EAsDA,SAAA9B,EAAA6B,GACA,IAAAhC,EAAAgC,EAAAhC,IACAC,EAAA+B,EAAA/B,MAEAA,GACAE,EAAA4B,aAAA,QAAA9B,GAGA,GAAAE,EAAAiD,WACAjD,EAAAiD,WAAAC,QAAArD,MACE,CACF,KAAAG,EAAAQ,YACAR,EAAAY,YAAAZ,EAAAQ,YAGAR,EAAAO,YAAAxC,SAAAoF,eAAAtD,MArEAtE,KAAA,KAAAyE,GACA+B,EAAA,WACArB,EAAAV,KAMA,OAFA8B,EAAAD,GAEA,SAAAuB,GACA,GAAAA,EAAA,CACA,GACAA,EAAAvD,MAAAgC,EAAAhC,KACAuD,EAAAtD,QAAA+B,EAAA/B,OACAsD,EAAA3G,YAAAoF,EAAApF,UAEA,OAGAqF,EAAAD,EAAAuB,QAEArB,KA1PAjI,EAAAD,QAAA,SAAAmC,EAAAmD,GACA,uBAAAkE,cACA,iBAAAtF,SAAA,UAAAmC,MAAA,iEAGAf,KAAA,IAEAgC,MAAA,iBAAAhC,EAAAgC,MAAAhC,EAAAgC,MAAA,GAIAhC,EAAAN,WAAA,kBAAAM,EAAAN,YAAAM,EAAAN,UAAAhB,KAGAsB,EAAAc,aAAAd,EAAAc,WAAA,QAGAd,EAAAiB,WAAAjB,EAAAiB,SAAA,UAEA,IAAAlB,EAAAO,EAAAzD,EAAAmD,GAIA,OAFAF,EAAAC,EAAAC,GAEA,SAAAmE,GAGA,IAFA,IAAAC,EAAA,GAEAxJ,EAAA,EAAiBA,EAAAmF,EAAA3B,OAAmBxD,IAAA,CACpC,IAAAqC,EAAA8C,EAAAnF,IACAqF,EAAAxB,EAAAxB,EAAAoB,KAEA6B,OACAkE,EAAA9F,KAAA2B,GAGAkE,GAEArE,EADAQ,EAAA6D,EAAAnE,GACAA,GAGA,IAAApF,EAAA,EAAiBA,EAAAwJ,EAAAhG,OAAsBxD,IAAA,CACvC,IAAAqF,EAEA,QAFAA,EAAAmE,EAAAxJ,IAEAsF,KAAA,CACA,QAAAC,EAAA,EAAmBA,EAAAF,EAAAG,MAAAhC,OAA2B+B,IAAAF,EAAAG,MAAAD,YAE9C1B,EAAAwB,EAAA5B,QAkNA,IACAgG,EADAC,GACAD,EAAA,GAEA,SAAAE,EAAAC,GAGA,OAFAH,EAAAE,GAAAC,EAEAH,EAAAI,OAAAC,SAAA1G,KAAA,QAIA,SAAAiF,EAAApC,EAAA0D,EAAA3B,EAAAF,GACA,IAAAhC,EAAAkC,EAAA,GAAAF,EAAAhC,IAEA,GAAAG,EAAAiD,WACAjD,EAAAiD,WAAAC,QAAAO,EAAAC,EAAA7D,OACE,CACF,IAAAiE,EAAA/F,SAAAoF,eAAAtD,GACAkE,EAAA/D,EAAA+D,WAEAA,EAAAL,IAAA1D,EAAAY,YAAAmD,EAAAL,IAEAK,EAAAxG,OACAyC,EAAAM,aAAAwD,EAAAC,EAAAL,IAEA1D,EAAAO,YAAAuD,mCC3VAnK,EAAAkB,EAAAmJ,GAAArK,EAAA,GAAAA,EAAA,GAAAA,EAAA,GAAAA,EAAA,GAAAA,EAAA,kBCYCsK,EAAEC,OAAOC,GAAGC,MAAMC,OAAQ,CACzBC,qBAAsB,IAAMH,GAAGC,MAAMC,OAAOE,YAAc,eAC1DC,kBAAmB,IAAML,GAAGC,MAAMC,OAAOE,YAAc,YACvDE,4BAA6B,IAAMN,GAAGC,MAAMC,OAAOE,YAAc,wBAG7DG,IAAIC,UACRD,IAAIC,QAAU,IAKfD,IAAIC,QAAQC,KAAO,CASlBC,OAAQ,SAASC,GAEhB,GAAKX,GAAGY,OAGY,aAAhBD,EAAStH,IAAqC,iBAAhBsH,EAAStH,GAA3C,CAGA,IAAIwH,EAAcF,EAASE,YACvBC,EAAeH,EAASI,WAC5BJ,EAASI,WAAa,SAASC,GAE9B,IAAIC,EAAKH,EAAa/G,MAAMhC,KAAMiC,WAC9BkH,EAAmBX,IAAIC,QAAQC,KAAKU,oBAAoBH,GAuB5D,OArB6B,IAAzBA,EAASI,qBAELP,EAAYQ,QAAQxH,IAAIyH,eACxBT,EAAYQ,QAAQxH,IAAI0H,eACxBV,EAAYQ,QAAQxH,IAAI2H,MAEhCP,EAAGQ,KAAK,yBAA0BP,GAC9BF,EAASU,aACZT,EAAGQ,KAAK,mBAAoBT,EAASU,YACrCT,EAAGQ,KAAK,sBAAuBT,EAASW,cAEb,gBAAvBX,EAASY,WACZX,EAAGQ,KAAK,mBAAoBT,EAASI,YAAcpB,GAAG6B,oBAGpDb,EAASc,gBAAkBhC,EAAEiC,QAAQf,EAASc,gBACjDb,EAAGQ,KAAK,4BAA6BhJ,KAAKC,UAAUsI,EAASc,gBAE1Dd,EAASgB,YACZf,EAAGQ,KAAK,mBAAoBT,EAASgB,WAAWhJ,KAAK,MAE/CiI,GAGR,IAAIgB,EAAmBtB,EAASuB,cAChCvB,EAASuB,cAAgB,SAASC,GACjC,IAAIC,EAAWH,EAAiBlI,MAAMhC,KAAMiC,WAS5C,GARAoI,EAASlB,iBAAmBiB,EAAIV,KAAK,gCAA6B1E,EAClEqF,EAASV,WAAaS,EAAIV,KAAK,0BAAuB1E,EACtDqF,EAAST,aAAeQ,EAAIV,KAAK,6BAA0B1E,EAEvDoF,EAAIV,KAAK,sBACZW,EAASJ,WAAaG,EAAIV,KAAK,oBAAoBY,MAAM,MAGtDF,EAAIV,KAAK,mBAAmB,CAC/B,IAAIa,EAAsBC,SAASJ,EAAIV,KAAK,oBAC5CW,EAASI,OAAS,GAClBJ,EAASI,OAAOlJ,KAAK,CAACmJ,WAAYH,IAGnC,OAAOF,GAGR,IAAIM,EAAyB/B,EAASgC,qBACtChC,EAASgC,qBAAuB,WAC/B,IAAIC,EAAQF,EAAuB3I,MAAMhC,KAAMiC,WAI/C,OAHA4I,EAAMtJ,KAAK0G,GAAGC,MAAMC,OAAOG,mBAC3BuC,EAAMtJ,KAAK0G,GAAGC,MAAMC,OAAOI,6BAC3BsC,EAAMtJ,KAAK0G,GAAGC,MAAMC,OAAOC,sBACpByC,GAGRjC,EAASkC,YAAYC,kBAAkB,SAASC,GAC/C,IAAIC,EAAO,GACPJ,EAAQG,EAASE,SAAS,GAAGC,WAC7BC,EAAkBP,EAAM5C,GAAGC,MAAMC,OAAOkD,sBAExCD,GAAmBA,EAAgBxG,QAAQ,MAAQ,IACtDqG,EAAKtB,WAAakB,EAAM5C,GAAGC,MAAMC,OAAOI,6BACxC0C,EAAKrB,aAAeiB,EAAM5C,GAAGC,MAAMC,OAAOG,oBAG3C,IAAIgD,EAAiBT,EAAM5C,GAAGC,MAAMC,OAAOC,sBAS3C,OARIkD,IACHL,EAAKhB,WAAalC,EAAEwD,MAAMD,GAAgB5D,OAAO,SAAS8D,GACzD,OAAQA,EAASC,eAAiBxD,GAAGC,MAAMC,OAAOE,aAAmD,eAApCmD,EAASE,SAASpB,MAAM,KAAK,KAC5FrK,IAAI,SAASuL,GACf,OAAOhB,SAASgB,EAASG,aAAeH,EAASI,KAAM,MACrD9M,SAGGmM,IAIRrC,EAASwB,IAAIyB,GAAG,mBAAoB,SAASC,GAC5C,IAAIC,EAASD,EAAGC,OAEhBhE,EAAEiE,KAAKD,EAAQ,SAASE,GACvB,IAAIC,EAAMC,EAAEF,GACRhC,EAAaiC,EAAIxC,KAAK,qBAAuB,GAC7CC,EAAauC,EAAIxC,KAAK,oBAC1B,GAAIO,GAAcN,EAAY,CAC7B,IAAIyC,GAAU,EACVC,GAAY,EAChBtE,EAAEiE,KAAK/B,EAAWK,MAAM,MAAQ,GAAI,SAASgC,IAC5CA,EAAY9B,SAAS8B,EAAW,OACdrE,GAAGY,MAAM0D,gBAC1BH,GAAU,EACAE,IAAcrE,GAAGY,MAAM2D,iBACjCJ,GAAU,EACAE,IAAcrE,GAAGY,MAAM4D,gBACjCJ,GAAY,EACFC,IAAcrE,GAAGY,MAAM6D,iBACjCL,GAAY,EACFC,IAAcrE,GAAGY,MAAM8D,kBACjCN,GAAY,EACFC,IAAcrE,GAAGY,MAAM+D,kBACjCP,GAAY,EACFC,IAAcrE,GAAGY,MAAMgE,kBACjCR,GAAY,KAGd7D,IAAIC,QAAQC,KAAKoE,sBAAsBZ,EAAKG,EAAWD,QAM1DxD,EAASwB,IAAIyB,GAAG,kBAAmB,WAClCrD,IAAIC,QAAQsE,cAAe,IAG5BjE,EAAYkE,eAAe,CAC1B5O,KAAM,QACN6O,YAAa,GACbC,QAASnO,EAAE,OAAQ,SACnBoO,KAAM,MACN9D,YAAapB,GAAGmF,eAChBC,UAAW,cACXnI,KAAMsD,IAAIN,MAAMoF,YAAYC,YAC5BC,cAAe,SAASC,EAAUC,GAEjC,IAAIrE,EAAcmB,SAASkD,EAAQC,MAAM1C,KAAK,qBAAsB,KAChE2C,MAAMvE,IAAgBA,EAAc,IACvCT,EAASiF,gBAAgBJ,EAAU,iBAGrCK,OAAQ,SAASC,EAAYC,EAAWN,GAGvC,OAA4C,IAF1BlD,SAASkD,EAAQC,MAAM1C,KAAK,eAAgB,IAE3ChD,GAAGgG,mBAA2BP,EAAQC,MAAMjE,KAAK,oBAC5DZ,EAAYoF,qBAAqBlQ,KAAK8K,EAAaiF,EAAYC,EAAWN,GAG3E,QAIT,IAAIS,EAAW,IAAI3F,IAAIC,QAAQ2F,aAAa,eAAgB,CAACC,OAAQ,KAErEF,EAAStC,GAAG,gBAAiB,SAASyC,GACrC,IAAIC,EAAgBD,EAAWC,cAC3BrC,EAAMtD,EAAS4F,WAAWD,EAAc7P,IAAI,SAG5C+P,EAAgBH,EAAWG,gBAC/BH,EAAW5P,IAAI,UAAU+G,QAAQ,SAAUiJ,GACtCA,EAAMC,aAAe1G,GAAGY,MAAM2D,mBACjCiC,GAAgB,KAIlBjG,IAAIC,QAAQC,KAAKkG,8BAA8BhG,EAAUsD,EAAKoC,GACzD9F,IAAIC,QAAQC,KAAKoE,sBAAsBZ,EAAKoC,EAAWO,gBAAiBJ,IAE5ExG,GAAGY,MAAMiG,iBAAiB5C,GAAK,GAAO,GAKvCqC,EAAcQ,IAAI,CACjB9E,WAAYqE,EAAWU,gBAIvBC,KAAM/C,EAAIxC,KAAK,iBAGjBd,EAASsG,gBAAgBf,GAEzB,IAAIgB,EAA8B,IAAI3G,IAAIC,QAAQ2G,oBAAoB,CAACjB,SAAUA,IACjFvF,EAASyG,6BAA6BF,KAMvCP,8BAA+B,SAAShG,EAAUsD,EAAKoC,GAGtD,GAAoB,UAAhB1F,EAAStH,GAKb,GAFiByG,EAAEuH,MAAMhB,EAAW5P,IAAI,UAAW,0BAEpC2C,OAAQ,CACtB,IAAI0I,EAAgBhC,EAAEwH,UAAUjB,EAAW5P,IAAI,UAAW,SAAUgQ,GACnE,MAAO,CAACc,UAAWd,EAAMe,WAAYC,qBAAsBhB,EAAMiB,0BAElEzD,EAAIxC,KAAK,4BAA6BhJ,KAAKC,UAAUoJ,SAGrDmC,EAAI0D,WAAW,8BAajB9C,sBAAuB,SAASZ,EAAK2C,EAAeJ,GAGnD,SAAII,GAAiBJ,GAAiBvC,EAAIxC,KAAK,8BAAgCwC,EAAIxC,KAAK,uBACvFzB,GAAGY,MAAMiG,iBAAiB5C,GAAK,EAAMuC,IAC9B,IASTrF,oBAAqB,SAASH,GAC7B,OAAOA,EAASE,mBAKnBlB,GAAG4H,QAAQC,SAAS,qBAAsBtH,IAAIC,QAAQC,qBCvQtD,IASK0F,IAAe5F,IAAIN,MAAM6H,cAAc/H,OACO,CACjD1G,GAAI,eACJ0O,UAAW,mBAEXC,WAAY,SAAS7R,EAAM6E,GAC1BuF,IAAIN,MAAM6H,cAActQ,UAAUwQ,WAAWjS,KAAKgC,KAAM5B,EAAM6E,GAC9DgF,GAAG4H,QAAQlH,OAAO,2BAA4B3I,OAG/CkQ,SAAU,SAASC,GAClB,MAlBD,kDAqBAC,SAAU,WACT,OAAOrR,EAAE,gBAAiB,YAG3BsR,QAAS,WACR,MAAO,eAMRvC,OAAQ,WACP,IAAIwC,EAAOtQ,KAQX,GAPIA,KAAKuQ,UAERvQ,KAAKuQ,QAAQC,MAAMC,MACnBzQ,KAAKuQ,QAAQ1K,SACb7F,KAAKuQ,QAAU,MAGZvQ,KAAKwQ,MAAO,CACfxQ,KAAKoK,IAAIsG,KAAK1Q,KAAKkQ,YAEfnI,EAAE4I,YAAY3Q,KAAKwQ,MAAM9R,IAAI,sBAChCsB,KAAKwQ,MAAMzB,IAAI,mBAAoBvG,IAAIC,QAAQC,KAAKU,oBAAoBpJ,KAAKwQ,MAAMI,aAIpF,IAAIA,EAAa,CAChBC,SAAU7Q,KAAKwQ,MAAMM,cAAgB,SAAW,OAC7CC,WAAY/Q,KAAKwQ,MAAM9R,IAAI,MAC9BsS,oBAAqBhR,KAAKwQ,MAAM9R,IAAI,qBAEjCuS,EAAc,IAAIhJ,GAAGY,MAAMqI,iBAC3B5C,EAAa,IAAIrG,GAAGY,MAAMsI,eAAeP,EAAY,CACxDK,YAAaA,EACb1C,cAAevO,KAAKwQ,QAErBxQ,KAAKuQ,QAAU,IAAItI,GAAGY,MAAMuI,gBAAgB,CAC3CH,YAAaA,EACbT,MAAOlC,IAERtO,KAAKoK,IAAIiH,KAAK,oBAAoBC,OAAOtR,KAAKuQ,QAAQnG,KACtDpK,KAAKuQ,QAAQzC,SACb9N,KAAKuQ,QAAQC,MAAMe,QACnBvR,KAAKuQ,QAAQC,MAAM3E,GAAG,SAAU,WAC/ByE,EAAKkB,QAAQ,gBAAiBlD,UAG/BtO,KAAKoK,IAAIqH,QAGVzR,KAAKwR,QAAQ,eAIfhJ,IAAIC,QAAQ2F,aAAeA;;;;;;;;;;;;;;;;;;;;;;CCnE5B,WACC,aAEA,IAAIsD,EAAiBzJ,GAAG0J,SAASC,KAAK5J,OAAO,CAC5C6J,QAAS,OACTC,OAAQ,CACPC,MAAO,YAERC,cAAUhN,EAGViN,eAAWjN,EAEXiL,WAAY,SAAShN,GACpBjD,KAAKiS,UAAYhP,EAAQkL,UAG1BL,OAAQ,SAAS7C,GAGhB,GAFAjL,KAAKgS,SAAW/G,EAAKiH,SAAW,KAEV,OAAlBlS,KAAKgS,UAA6C,MAAvBhS,KAAKgS,SAASG,MAAuC,KAAvBnS,KAAKgS,SAAS5T,KAgB1E4B,KAAKoK,IAAIgI,YAAY,kCACrBpS,KAAKoK,IAAIiI,WAjB+E,CACxF,IAAIC,EAAWrH,EAAKiH,SAAWjH,EAAKiH,QAAQjI,YAAcgB,EAAKiH,QAAQjI,WAAW5I,OAAS,EAC3FrB,KAAKoK,IAAIgI,YAAY,kCACjBE,GACHtS,KAAKoK,IAAImI,SAAS,WACiD,IAA/DtH,EAAKiH,QAAQjI,WAAWrF,QAAQqD,GAAGY,MAAM0D,iBAC5CvM,KAAKoK,IAAImI,SAAS,eAElBvS,KAAKoK,IAAImI,SAAS,gBAGnBvS,KAAKoK,IAAImI,SAAS,eAEnBvS,KAAKoK,IAAIoI,OACTxS,KAAKyS,iBAMN,OAAOzS,MAER0S,SAAU,SAAShQ,GAClBA,EAAEiQ,iBAEF,IAAIpE,EAAgB,IAAI/F,IAAIN,MAAM0K,cAAc5S,KAAKgS,UACjD1B,EAAOtQ,KACXuO,EAAc1C,GAAG,SAAU,WAC1ByE,EAAKxC,OAAO,CACXoE,QAAS5B,EAAK0B,aAGhBhS,KAAKiS,UAAUpG,GAAG,gBAAiB,SAASyC,GAI3C,IAHA,IAAIrE,EAAa,GACbQ,EAAS6D,EAAWuE,2BAEhBhV,EAAI,EAAGA,EAAI4M,EAAOpJ,OAAQxD,KACiB,IAA9CoM,EAAWrF,QAAQ6F,EAAO5M,GAAG8Q,aAChC1E,EAAW1I,KAAKkJ,EAAO5M,GAAG8Q,YAIxBL,EAAWG,iBACdxE,EAAW1I,KAAK0G,GAAGY,MAAM0D,iBAI1B+D,EAAK0B,SAAS/H,WAAaA,EAE3BqG,EAAKxC,OAAO,CACXoE,QAAS5B,EAAK0B,aAGhBxJ,IAAIN,MAAM4K,IAAIlK,SAASiF,gBAAgBU,EAAe,mBAIxD/F,IAAIC,QAAQ2G,oBAAsBsC,EA7EnC,oBCvBA,IAAAvR,EAAc1C,EAAQ,GAEtB,iBAAA0C,MAAA,EAA4CvC,EAAAC,EAASsC,EAAA,MAOrD,IAAA8C,EAAA,CAAe8P,KAAA,EAEfhN,eAPAA,EAQAhC,gBAAAiB,GAEavH,EAAQ,EAARA,CAAiE0C,EAAA8C,GAE9E9C,EAAA6S,SAAApV,EAAAD,QAAAwC,EAAA6S,0BCjBApV,EAAAD,QAA2BF,EAAQ,EAARA,EAAiE,IAE5F8D,KAAA,CAAc3D,EAAAC,EAAS,0hNAAwhN,oBCY/iND,EAAAD,QAAA,SAAAgG,GAEA,IAAAsP,EAAA,oBAAArR,eAAAqR,SAEA,IAAAA,EACA,UAAAjP,MAAA,oCAIA,IAAAL,GAAA,iBAAAA,EACA,OAAAA,EAGA,IAAAuP,EAAAD,EAAAE,SAAA,KAAAF,EAAAG,KACAC,EAAAH,EAAAD,EAAAK,SAAAC,QAAA,iBA2DA,OA/BA5P,EAAA4P,QAAA,+DAAAC,EAAAC,GAEA,IAWAC,EAXAC,EAAAF,EACAG,OACAL,QAAA,oBAAAjV,EAAAuV,GAAwC,OAAAA,IACxCN,QAAA,oBAAAjV,EAAAuV,GAAwC,OAAAA,IAGxC,0DAAAC,KAAAH,GACAH,GAQAE,EAFA,IAAAC,EAAA/O,QAAA,MAEA+O,EACG,IAAAA,EAAA/O,QAAA,KAEHsO,EAAAS,EAGAN,EAAAM,EAAAJ,QAAA,YAIA,OAAA7S,KAAAC,UAAA+S,GAAA,yBClFA,IAAAvT,EAAc1C,EAAQ,IAEtB,iBAAA0C,MAAA,EAA4CvC,EAAAC,EAASsC,EAAA,MAOrD,IAAA8C,EAAA,CAAe8P,KAAA,EAEfhN,eAPAA,EAQAhC,gBAAAiB,GAEavH,EAAQ,EAARA,CAAiE0C,EAAA8C,GAE9E9C,EAAA6S,SAAApV,EAAAD,QAAAwC,EAAA6S,0BCjBApV,EAAAD,QAA2BF,EAAQ,EAARA,EAAiE,IAE5F8D,KAAA,CAAc3D,EAAAC,EAAS,4mCAA0mC","file":"additionalScripts.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 = 2);\n","\"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 './share'\nimport './sharetabview'\nimport './sharebreadcrumbview'\n\nimport './style/sharetabview.scss'\nimport './style/sharebreadcrumb.scss'\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\n(function() {\n\n\t_.extend(OC.Files.Client, {\n\t\tPROPERTY_SHARE_TYPES:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}share-types',\n\t\tPROPERTY_OWNER_ID:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}owner-id',\n\t\tPROPERTY_OWNER_DISPLAY_NAME:\t'{' + OC.Files.Client.NS_OWNCLOUD + '}owner-display-name'\n\t});\n\n\tif (!OCA.Sharing) {\n\t\tOCA.Sharing = {};\n\t}\n\t/**\n\t * @namespace\n\t */\n\tOCA.Sharing.Util = {\n\t\t/**\n\t\t * Initialize the sharing plugin.\n\t\t *\n\t\t * Registers the \"Share\" file action and adds additional\n\t\t * DOM attributes for the sharing file info.\n\t\t *\n\t\t * @param {OCA.Files.FileList} fileList file list to be extended\n\t\t */\n\t\tattach: function(fileList) {\n\t\t\t// core sharing is disabled/not loaded\n\t\t\tif (!OC.Share) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (fileList.id === 'trashbin' || fileList.id === 'files.public') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fileActions = fileList.fileActions;\n\t\t\tvar oldCreateRow = fileList._createRow;\n\t\t\tfileList._createRow = function(fileData) {\n\n\t\t\t\tvar tr = oldCreateRow.apply(this, arguments);\n\t\t\t\tvar sharePermissions = OCA.Sharing.Util.getSharePermissions(fileData);\n\t\t\t\t\n\t\t\t\tif (fileData.permissions === 0) {\n\t\t\t\t\t// no permission, disabling sidebar\n\t\t\t\t\tdelete fileActions.actions.all.Comment;\n\t\t\t\t\tdelete fileActions.actions.all.Details;\n\t\t\t\t\tdelete fileActions.actions.all.Goto;\n\t\t\t\t}\n\t\t\t\ttr.attr('data-share-permissions', sharePermissions);\n\t\t\t\tif (fileData.shareOwner) {\n\t\t\t\t\ttr.attr('data-share-owner', fileData.shareOwner);\n\t\t\t\t\ttr.attr('data-share-owner-id', fileData.shareOwnerId);\n\t\t\t\t\t// user should always be able to rename a mount point\n\t\t\t\t\tif (fileData.mountType === 'shared-root') {\n\t\t\t\t\t\ttr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (fileData.recipientData && !_.isEmpty(fileData.recipientData)) {\n\t\t\t\t\ttr.attr('data-share-recipient-data', JSON.stringify(fileData.recipientData));\n\t\t\t\t}\n\t\t\t\tif (fileData.shareTypes) {\n\t\t\t\t\ttr.attr('data-share-types', fileData.shareTypes.join(','));\n\t\t\t\t}\n\t\t\t\treturn tr;\n\t\t\t};\n\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\tfileInfo.sharePermissions = $el.attr('data-share-permissions') || undefined;\n\t\t\t\tfileInfo.shareOwner = $el.attr('data-share-owner') || undefined;\n\t\t\t\tfileInfo.shareOwnerId = $el.attr('data-share-owner-id') || undefined;\n\n\t\t\t\tif( $el.attr('data-share-types')){\n\t\t\t\t\tfileInfo.shareTypes = $el.attr('data-share-types').split(',');\n\t\t\t\t}\n\n\t\t\t\tif( $el.attr('data-expiration')){\n\t\t\t\t\tvar expirationTimestamp = parseInt($el.attr('data-expiration'));\n\t\t\t\t\tfileInfo.shares = [];\n\t\t\t\t\tfileInfo.shares.push({expiration: expirationTimestamp});\n\t\t\t\t}\n\n\t\t\t\treturn fileInfo;\n\t\t\t};\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_OWNER_ID);\n\t\t\t\tprops.push(OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME);\n\t\t\t\tprops.push(OC.Files.Client.PROPERTY_SHARE_TYPES);\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 permissionsProp = props[OC.Files.Client.PROPERTY_PERMISSIONS];\n\n\t\t\t\tif (permissionsProp && permissionsProp.indexOf('S') >= 0) {\n\t\t\t\t\tdata.shareOwner = props[OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME];\n\t\t\t\t\tdata.shareOwnerId = props[OC.Files.Client.PROPERTY_OWNER_ID];\n\t\t\t\t}\n\n\t\t\t\tvar shareTypesProp = props[OC.Files.Client.PROPERTY_SHARE_TYPES];\n\t\t\t\tif (shareTypesProp) {\n\t\t\t\t\tdata.shareTypes = _.chain(shareTypesProp).filter(function(xmlvalue) {\n\t\t\t\t\t\treturn (xmlvalue.namespaceURI === OC.Files.Client.NS_OWNCLOUD && xmlvalue.nodeName.split(':')[1] === 'share-type');\n\t\t\t\t\t}).map(function(xmlvalue) {\n\t\t\t\t\t\treturn parseInt(xmlvalue.textContent || xmlvalue.text, 10);\n\t\t\t\t\t}).value();\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\t\t\t});\n\n\t\t\t// use delegate to catch the case with multiple file lists\n\t\t\tfileList.$el.on('fileActionsReady', function(ev){\n\t\t\t\tvar $files = ev.$files;\n\n\t\t\t\t_.each($files, function(file) {\n\t\t\t\t\tvar $tr = $(file);\n\t\t\t\t\tvar shareTypes = $tr.attr('data-share-types') || '';\n\t\t\t\t\tvar shareOwner = $tr.attr('data-share-owner');\n\t\t\t\t\tif (shareTypes || shareOwner) {\n\t\t\t\t\t\tvar hasLink = false;\n\t\t\t\t\t\tvar hasShares = false;\n\t\t\t\t\t\t_.each(shareTypes.split(',') || [], function(shareType) {\n\t\t\t\t\t\t\tshareType = parseInt(shareType, 10);\n\t\t\t\t\t\t\tif (shareType === OC.Share.SHARE_TYPE_LINK) {\n\t\t\t\t\t\t\t\thasLink = true;\n\t\t\t\t\t\t\t} else if (shareType === OC.Share.SHARE_TYPE_EMAIL) {\n\t\t\t\t\t\t\t\thasLink = true;\n\t\t\t\t\t\t\t} else if (shareType === OC.Share.SHARE_TYPE_USER) {\n\t\t\t\t\t\t\t\thasShares = true;\n\t\t\t\t\t\t\t} else if (shareType === OC.Share.SHARE_TYPE_GROUP) {\n\t\t\t\t\t\t\t\thasShares = true;\n\t\t\t\t\t\t\t} else if (shareType === OC.Share.SHARE_TYPE_REMOTE) {\n\t\t\t\t\t\t\t\thasShares = true;\n\t\t\t\t\t\t\t} else if (shareType === OC.Share.SHARE_TYPE_CIRCLE) {\n\t\t\t\t\t\t\t\thasShares = true;\n\t\t\t\t\t\t\t} else if (shareType === OC.Share.SHARE_TYPE_ROOM) {\n\t\t\t\t\t\t\t\thasShares = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tOCA.Sharing.Util._updateFileActionIcon($tr, hasShares, hasLink);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\n\t\t\tfileList.$el.on('changeDirectory', function() {\n\t\t\t\tOCA.Sharing.sharesLoaded = false;\n\t\t\t});\n\n\t\t\tfileActions.registerAction({\n\t\t\t\tname: 'Share',\n\t\t\t\tdisplayName: '',\n\t\t\t\taltText: t('core', 'Share'),\n\t\t\t\tmime: 'all',\n\t\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\t\ticonClass: 'icon-shared',\n\t\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\t\tactionHandler: function(fileName, context) {\n\t\t\t\t\t// do not open sidebar if permission is set and equal to 0\n\t\t\t\t\tvar permissions = parseInt(context.$file.data('share-permissions'), 10);\n\t\t\t\t\tif (isNaN(permissions) || permissions > 0) {\n\t\t\t\t\t\tfileList.showDetailsView(fileName, 'shareTabView');\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\trender: function(actionSpec, isDefault, context) {\n\t\t\t\t\tvar permissions = parseInt(context.$file.data('permissions'), 10);\n\t\t\t\t\t// if no share permissions but share owner exists, still show the link\n\t\t\t\t\tif ((permissions & OC.PERMISSION_SHARE) !== 0 || context.$file.attr('data-share-owner')) {\n\t\t\t\t\t\treturn fileActions._defaultRenderAction.call(fileActions, actionSpec, isDefault, context);\n\t\t\t\t\t}\n\t\t\t\t\t// don't render anything\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar shareTab = new OCA.Sharing.ShareTabView('shareTabView', {order: -20});\n\t\t\t// detect changes and change the matching list entry\n\t\t\tshareTab.on('sharesChanged', function(shareModel) {\n\t\t\t\tvar fileInfoModel = shareModel.fileInfoModel;\n\t\t\t\tvar $tr = fileList.findFileEl(fileInfoModel.get('name'));\n\n\t\t\t\t// We count email shares as link share\n\t\t\t\tvar hasLinkShares = shareModel.hasLinkShares();\n\t\t\t\tshareModel.get('shares').forEach(function (share) {\n\t\t\t\t\tif (share.share_type === OC.Share.SHARE_TYPE_EMAIL) {\n\t\t\t\t\t\thasLinkShares = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tOCA.Sharing.Util._updateFileListDataAttributes(fileList, $tr, shareModel);\n\t\t\t\tif (!OCA.Sharing.Util._updateFileActionIcon($tr, shareModel.hasUserShares(), hasLinkShares)) {\n\t\t\t\t\t// remove icon, if applicable\n\t\t\t\t\tOC.Share.markFileAsShared($tr, false, false);\n\t\t\t\t}\n\n\t\t\t\t// FIXME: this is too convoluted. We need to get rid of the above updates\n\t\t\t\t// and only ever update the model and let the events take care of rerendering\n\t\t\t\tfileInfoModel.set({\n\t\t\t\t\tshareTypes: shareModel.getShareTypes(),\n\t\t\t\t\t// in case markFileAsShared decided to change the icon,\n\t\t\t\t\t// we need to modify the model\n\t\t\t\t\t// (FIXME: yes, this is hacky)\n\t\t\t\t\ticon: $tr.attr('data-icon')\n\t\t\t\t});\n\t\t\t});\n\t\t\tfileList.registerTabView(shareTab);\n\n\t\t\tvar breadCrumbSharingDetailView = new OCA.Sharing.ShareBreadCrumbView({shareTab: shareTab});\n\t\t\tfileList.registerBreadCrumbDetailView(breadCrumbSharingDetailView);\n\t\t},\n\n\t\t/**\n\t\t * Update file list data attributes\n\t\t */\n\t\t_updateFileListDataAttributes: function(fileList, $tr, shareModel) {\n\t\t\t// files app current cannot show recipients on load, so we don't update the\n\t\t\t// icon when changed for consistency\n\t\t\tif (fileList.id === 'files') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar recipients = _.pluck(shareModel.get('shares'), 'share_with_displayname');\n\t\t\t// note: we only update the data attribute because updateIcon()\n\t\t\tif (recipients.length) {\n\t\t\t\tvar recipientData = _.mapObject(shareModel.get('shares'), function (share) {\n\t\t\t\t\treturn {shareWith: share.share_with, shareWithDisplayName: share.share_with_displayname};\n\t\t\t\t});\n\t\t\t\t$tr.attr('data-share-recipient-data', JSON.stringify(recipientData));\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$tr.removeAttr('data-share-recipient-data');\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Update the file action share icon for the given file\n\t\t *\n\t\t * @param $tr file element of the file to update\n\t\t * @param {boolean} hasUserShares true if a user share exists\n\t\t * @param {boolean} hasLinkShares true if a link share exists\n\t\t *\n\t\t * @return {boolean} true if the icon was set, false otherwise\n\t\t */\n\t\t_updateFileActionIcon: function($tr, hasUserShares, hasLinkShares) {\n\t\t\t// if the statuses are loaded already, use them for the icon\n\t\t\t// (needed when scrolling to the next page)\n\t\t\tif (hasUserShares || hasLinkShares || $tr.attr('data-share-recipient-data') || $tr.attr('data-share-owner')) {\n\t\t\t\tOC.Share.markFileAsShared($tr, true, hasLinkShares);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\t/**\n\t\t * @param {Array} fileData\n\t\t * @returns {String}\n\t\t */\n\t\tgetSharePermissions: function(fileData) {\n\t\t\treturn fileData.sharePermissions;\n\t\t}\n\t};\n})();\n\nOC.Plugins.register('OCA.Files.FileList', OCA.Sharing.Util);\n","/*\n * Copyright (c) 2015\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\tvar TEMPLATE =\n\t\t'<div>' +\n\t\t'<div class=\"dialogContainer\"></div>' +\n\t\t'</div>';\n\n\t/**\n\t * @memberof OCA.Sharing\n\t */\n\tvar ShareTabView = OCA.Files.DetailTabView.extend(\n\t\t/** @lends OCA.Sharing.ShareTabView.prototype */ {\n\t\tid: 'shareTabView',\n\t\tclassName: 'tab shareTabView',\n\n\t\tinitialize: function(name, options) {\n\t\t\tOCA.Files.DetailTabView.prototype.initialize.call(this, name, options);\n\t\t\tOC.Plugins.attach('OCA.Sharing.ShareTabView', this);\n\t\t},\n\n\t\ttemplate: function(params) {\n\t\t\treturn \tTEMPLATE;\n\t\t},\n\n\t\tgetLabel: function() {\n\t\t\treturn t('files_sharing', 'Sharing');\n\t\t},\n\n\t\tgetIcon: function() {\n\t\t\treturn 'icon-shared';\n\t\t},\n\n\t\t/**\n\t\t * Renders this details view\n\t\t */\n\t\trender: function() {\n\t\t\tvar self = this;\n\t\t\tif (this._dialog) {\n\t\t\t\t// remove/destroy older instance\n\t\t\t\tthis._dialog.model.off();\n\t\t\t\tthis._dialog.remove();\n\t\t\t\tthis._dialog = null;\n\t\t\t}\n\n\t\t\tif (this.model) {\n\t\t\t\tthis.$el.html(this.template());\n\n\t\t\t\tif (_.isUndefined(this.model.get('sharePermissions'))) {\n\t\t\t\t\tthis.model.set('sharePermissions', OCA.Sharing.Util.getSharePermissions(this.model.attributes));\n\t\t\t\t}\n\n\t\t\t\t// TODO: the model should read these directly off the passed fileInfoModel\n\t\t\t\tvar attributes = {\n\t\t\t\t\titemType: this.model.isDirectory() ? 'folder' : 'file',\n\t\t\t\t   \titemSource: this.model.get('id'),\n\t\t\t\t\tpossiblePermissions: this.model.get('sharePermissions')\n\t\t\t\t};\n\t\t\t\tvar configModel = new OC.Share.ShareConfigModel();\n\t\t\t\tvar shareModel = new OC.Share.ShareItemModel(attributes, {\n\t\t\t\t\tconfigModel: configModel,\n\t\t\t\t\tfileInfoModel: this.model\n\t\t\t\t});\n\t\t\t\tthis._dialog = new OC.Share.ShareDialogView({\n\t\t\t\t\tconfigModel: configModel,\n\t\t\t\t\tmodel: shareModel\n\t\t\t\t});\n\t\t\t\tthis.$el.find('.dialogContainer').append(this._dialog.$el);\n\t\t\t\tthis._dialog.render();\n\t\t\t\tthis._dialog.model.fetch();\n\t\t\t\tthis._dialog.model.on('change', function() {\n\t\t\t\t\tself.trigger('sharesChanged', shareModel);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.$el.empty();\n\t\t\t\t// TODO: render placeholder text?\n\t\t\t}\n\t\t\tthis.trigger('rendered');\n\t\t}\n\t});\n\n\tOCA.Sharing.ShareTabView = ShareTabView;\n})();\n\n","/* global Handlebars, OC */\n\n/**\n * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n(function() {\n\t'use strict';\n\n\tvar BreadCrumbView = OC.Backbone.View.extend({\n\t\ttagName: 'span',\n\t\tevents: {\n\t\t\tclick: '_onClick'\n\t\t},\n\t\t_dirInfo: undefined,\n\n\t\t/** @type OCA.Sharing.ShareTabView */\n\t\t_shareTab: undefined,\n\n\t\tinitialize: function(options) {\n\t\t\tthis._shareTab = options.shareTab;\n\t\t},\n\n\t\trender: function(data) {\n\t\t\tthis._dirInfo = data.dirInfo || null;\n\n\t\t\tif (this._dirInfo !== null && (this._dirInfo.path !== '/' || this._dirInfo.name !== '')) {\n\t\t\t\tvar isShared = data.dirInfo && data.dirInfo.shareTypes && data.dirInfo.shareTypes.length > 0;\n\t\t\t\tthis.$el.removeClass('shared icon-public icon-shared');\n\t\t\t\tif (isShared) {\n\t\t\t\t\tthis.$el.addClass('shared');\n\t\t\t\t\tif (data.dirInfo.shareTypes.indexOf(OC.Share.SHARE_TYPE_LINK) !== -1) {\n\t\t\t\t\t\tthis.$el.addClass('icon-public');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$el.addClass('icon-shared');\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.$el.addClass('icon-shared');\n\t\t\t\t}\n\t\t\t\tthis.$el.show();\n\t\t\t\tthis.delegateEvents();\n\t\t\t} else {\n\t\t\t\tthis.$el.removeClass('shared icon-public icon-shared');\n\t\t\t\tthis.$el.hide();\n\t\t\t}\n\n\t\t\treturn this;\n\t\t},\n\t\t_onClick: function(e) {\n\t\t\te.preventDefault();\n\n\t\t\tvar fileInfoModel = new OCA.Files.FileInfoModel(this._dirInfo);\n\t\t\tvar self = this;\n\t\t\tfileInfoModel.on('change', function() {\n\t\t\t\tself.render({\n\t\t\t\t\tdirInfo: self._dirInfo\n\t\t\t\t});\n\t\t\t});\n\t\t\tthis._shareTab.on('sharesChanged', function(shareModel) {\n\t\t\t\tvar shareTypes = [];\n\t\t\t\tvar shares = shareModel.getSharesWithCurrentItem();\n\n\t\t\t\tfor(var i = 0; i < shares.length; i++) {\n\t\t\t\t\tif (shareTypes.indexOf(shares[i].share_type) === -1) {\n\t\t\t\t\t\tshareTypes.push(shares[i].share_type);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (shareModel.hasLinkShares()) {\n\t\t\t\t\tshareTypes.push(OC.Share.SHARE_TYPE_LINK);\n\t\t\t\t}\n\n\t\t\t\t// Since the dirInfo isn't updated we need to do this dark hackery\n\t\t\t\tself._dirInfo.shareTypes = shareTypes;\n\n\t\t\t\tself.render({\n\t\t\t\t\tdirInfo: self._dirInfo\n\t\t\t\t});\n\t\t\t});\n\t\t\tOCA.Files.App.fileList.showDetailsView(fileInfoModel, 'shareTabView');\n\t\t}\n\t});\n\n\tOCA.Sharing.ShareBreadCrumbView = BreadCrumbView;\n})();\n","\nvar content = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/lib/loader.js!./sharetabview.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!./sharetabview.scss\", function() {\n\t\tvar newContent = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/lib/loader.js!./sharetabview.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, \".app-files .shareTabView {\\n  min-height: 100px; }\\n\\n.share-autocomplete-item {\\n  display: flex; }\\n  .share-autocomplete-item.merged {\\n    margin-left: 32px; }\\n  .share-autocomplete-item .autocomplete-item-text {\\n    margin-left: 10px;\\n    margin-right: 10px;\\n    white-space: nowrap;\\n    text-overflow: ellipsis;\\n    overflow: hidden;\\n    line-height: 32px;\\n    vertical-align: middle;\\n    flex-grow: 1; }\\n    .share-autocomplete-item .autocomplete-item-text .ui-state-highlight {\\n      border: none;\\n      margin: 0; }\\n  .share-autocomplete-item.with-description .autocomplete-item-text {\\n    line-height: 100%; }\\n  .share-autocomplete-item .autocomplete-item-details {\\n    display: block;\\n    line-height: 130%;\\n    font-size: 90%;\\n    opacity: 0.7; }\\n  .share-autocomplete-item .icon {\\n    opacity: .7;\\n    margin-right: 7px; }\\n\\n.shareTabView .oneline {\\n  white-space: nowrap;\\n  position: relative; }\\n\\n.shareTabView .shareWithLoading {\\n  padding-left: 10px;\\n  right: 35px;\\n  top: 3px; }\\n\\n.shareTabView .shareWithConfirm {\\n  position: absolute;\\n  right: 2px;\\n  top: 6px;\\n  padding: 14px;\\n  opacity: 0.5; }\\n\\n.shareTabView .shareWithField:focus ~ .shareWithConfirm {\\n  opacity: 1; }\\n\\n.shareTabView .linkMore {\\n  position: absolute;\\n  right: -7px;\\n  top: -4px;\\n  padding: 14px; }\\n\\n.shareTabView .popovermenu {\\n  /* Border above last entry '+ Add another share' to separate it from current link settings */ }\\n  .shareTabView .popovermenu .linkPassMenu .share-pass-submit {\\n    width: auto !important; }\\n  .shareTabView .popovermenu .linkPassMenu .icon-loading-small {\\n    background-color: var(--color-main-background);\\n    position: absolute;\\n    right: 8px;\\n    margin: 3px;\\n    padding: 10px;\\n    width: 32px;\\n    height: 32px;\\n    z-index: 10; }\\n  .shareTabView .popovermenu .datepicker {\\n    margin-left: 35px; }\\n  .shareTabView .popovermenu .share-add input.share-note-delete {\\n    border: none;\\n    background-color: transparent;\\n    width: 44px !important;\\n    padding: 0;\\n    flex: 0 0 44px;\\n    margin-left: auto; }\\n    .shareTabView .popovermenu .share-add input.share-note-delete.hidden {\\n      display: none; }\\n  .shareTabView .popovermenu .share-note-form span.icon-note {\\n    position: relative; }\\n  .shareTabView .popovermenu .share-note-form textarea.share-note {\\n    margin: 0;\\n    width: 200px;\\n    min-height: 70px;\\n    resize: none; }\\n    .shareTabView .popovermenu .share-note-form textarea.share-note + input.share-note-submit {\\n      position: absolute;\\n      width: 44px !important;\\n      height: 44px;\\n      bottom: 0px;\\n      right: 10px;\\n      margin: 0;\\n      background-color: transparent;\\n      border: none;\\n      opacity: .7; }\\n      .shareTabView .popovermenu .share-note-form textarea.share-note + input.share-note-submit:hover, .shareTabView .popovermenu .share-note-form textarea.share-note + input.share-note-submit:focus, .shareTabView .popovermenu .share-note-form textarea.share-note + input.share-note-submit:active {\\n        opacity: 1; }\\n  .shareTabView .popovermenu .share-note-form.share-note-link {\\n    margin-bottom: 10px; }\\n  .shareTabView .popovermenu .new-share {\\n    border-top: 1px solid var(--color-border); }\\n\\n.shareTabView .linkPass .icon-loading-small {\\n  margin-right: 0px; }\\n\\n.shareTabView .icon {\\n  background-size: 16px 16px; }\\n\\n.shareTabView .shareWithList .icon-loading-small:not(.hidden) + span,\\n.shareTabView .linkShareView .icon-loading-small:not(.hidden) + input + label:before {\\n  /* Hide if loader is visible */\\n  display: none !important; }\\n\\n.shareTabView input[type='checkbox'] {\\n  margin: 0 3px 0 8px;\\n  vertical-align: middle; }\\n\\n.shareTabView input[type='text'].shareWithField, .shareTabView input[type='text'].emailField {\\n  width: 100%;\\n  box-sizing: border-box;\\n  padding-right: 32px;\\n  text-overflow: ellipsis; }\\n\\n.shareTabView input[type='text'].linkText .shareTabView input[type='password'].linkPassText, .shareTabView input[type='password'].passwordField {\\n  width: 180px !important; }\\n\\n.shareTabView form {\\n  font-size: 100%;\\n  margin-left: 0;\\n  margin-right: 0; }\\n\\n.shareTabView .share-note {\\n  border-radius: var(--border-radius);\\n  margin-bottom: 10px;\\n  margin-left: 37px; }\\n\\n.shareWithList {\\n  list-style-type: none;\\n  display: flex;\\n  flex-direction: column; }\\n  .shareWithList > li {\\n    height: 44px;\\n    white-space: normal;\\n    display: inline-flex;\\n    align-items: center;\\n    position: relative; }\\n    .shareWithList > li .avatar {\\n      width: 32px;\\n      height: 32px;\\n      background-color: var(--color-primary); }\\n  .shareWithList .unshare img {\\n    vertical-align: text-bottom;\\n    /* properly align icons */ }\\n  .shareWithList .sharingOptionsGroup {\\n    margin-left: auto;\\n    display: flex;\\n    align-items: center;\\n    white-space: nowrap; }\\n    .shareWithList .sharingOptionsGroup > .icon:not(.hidden),\\n    .shareWithList .sharingOptionsGroup .share-menu > .icon:not(.hidden) {\\n      padding: 14px;\\n      height: 44px;\\n      width: 44px;\\n      opacity: .5;\\n      display: block;\\n      cursor: pointer; }\\n      .shareWithList .sharingOptionsGroup > .icon:not(.hidden):hover, .shareWithList .sharingOptionsGroup > .icon:not(.hidden):focus, .shareWithList .sharingOptionsGroup > .icon:not(.hidden):active,\\n      .shareWithList .sharingOptionsGroup .share-menu > .icon:not(.hidden):hover,\\n      .shareWithList .sharingOptionsGroup .share-menu > .icon:not(.hidden):focus,\\n      .shareWithList .sharingOptionsGroup .share-menu > .icon:not(.hidden):active {\\n        opacity: .7; }\\n    .shareWithList .sharingOptionsGroup > .share-menu {\\n      position: relative;\\n      display: block; }\\n  .shareWithList .username {\\n    padding: 0 8px;\\n    overflow: hidden;\\n    white-space: nowrap;\\n    text-overflow: ellipsis; }\\n\\n.ui-autocomplete {\\n  /* limit dropdown height to 6 1/2 entries */\\n  max-height: calc(36px * 6.5);\\n  overflow-y: auto;\\n  overflow-x: hidden;\\n  z-index: 1550 !important; }\\n\\n.notCreatable {\\n  padding-left: 12px;\\n  padding-top: 12px;\\n  color: var(--color-text-lighter); }\\n\\n.contactsmenu-popover {\\n  left: -6px;\\n  right: auto;\\n  padding: 3px 6px;\\n  top: 100%;\\n  margin-top: 0; }\\n  .contactsmenu-popover li.hidden {\\n    display: none !important; }\\n  .contactsmenu-popover:after {\\n    left: 8px;\\n    right: auto; }\\n\\n.reshare,\\n#link label,\\n#expiration label {\\n  display: inline-flex;\\n  align-items: center; }\\n  .reshare .avatar,\\n  #link label .avatar,\\n  #expiration label .avatar {\\n    margin-right: 5px; }\\n\\n.resharerInfoView.subView {\\n  position: relative; }\\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!./sharebreadcrumb.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!./sharebreadcrumb.scss\", function() {\n\t\tvar newContent = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/lib/loader.js!./sharebreadcrumb.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 2016 Christoph Wurst <christoph@winzerhof-wurst.at>\\n *\\n * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>\\n *\\n * @license GNU AGPL version 3 or any later version\\n *\\n * This program is free software: you can redistribute it and/or modify\\n * it under the terms of the GNU Affero General Public License as\\n * published by the Free Software Foundation, either version 3 of the\\n * License, or (at your option) any later version.\\n *\\n * This program is distributed in the hope that it will be useful,\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\n * GNU Affero General Public License for more details.\\n *\\n * You should have received a copy of the GNU Affero General Public License\\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\\n *\\n */\\ndiv.crumb span.icon-shared,\\ndiv.crumb span.icon-public {\\n  display: inline-block;\\n  cursor: pointer;\\n  opacity: 0.2;\\n  margin-right: 6px; }\\n\\ndiv.crumb span.icon-shared.shared,\\ndiv.crumb span.icon-public.shared {\\n  opacity: 0.7; }\\n\", \"\"]);\n\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/apps/files_sharing/js/additionalScripts.json b/apps/files_sharing/js/additionalScripts.json
deleted file mode 100644 (file)
index 81f3e9f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-[
-       "share.js",
-       "sharetabview.js",
-       "sharebreadcrumbview.js"
-]
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
deleted file mode 100644 (file)
index b02c6e3..0000000
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (c) 2014
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function() {
-
-       _.extend(OC.Files.Client, {
-               PROPERTY_SHARE_TYPES:   '{' + OC.Files.Client.NS_OWNCLOUD + '}share-types',
-               PROPERTY_OWNER_ID:      '{' + OC.Files.Client.NS_OWNCLOUD + '}owner-id',
-               PROPERTY_OWNER_DISPLAY_NAME:    '{' + OC.Files.Client.NS_OWNCLOUD + '}owner-display-name'
-       });
-
-       if (!OCA.Sharing) {
-               OCA.Sharing = {};
-       }
-       /**
-        * @namespace
-        */
-       OCA.Sharing.Util = {
-               /**
-                * Initialize the sharing plugin.
-                *
-                * Registers the "Share" file action and adds additional
-                * DOM attributes for the sharing file info.
-                *
-                * @param {OCA.Files.FileList} fileList file list to be extended
-                */
-               attach: function(fileList) {
-                       // core sharing is disabled/not loaded
-                       if (!OC.Share) {
-                               return;
-                       }
-                       if (fileList.id === 'trashbin' || fileList.id === 'files.public') {
-                               return;
-                       }
-                       var fileActions = fileList.fileActions;
-                       var oldCreateRow = fileList._createRow;
-                       fileList._createRow = function(fileData) {
-
-                               var tr = oldCreateRow.apply(this, arguments);
-                               var sharePermissions = OCA.Sharing.Util.getSharePermissions(fileData);
-                               
-                               if (fileData.permissions === 0) {
-                                       // no permission, disabling sidebar
-                                       delete fileActions.actions.all.Comment;
-                                       delete fileActions.actions.all.Details;
-                                       delete fileActions.actions.all.Goto;
-                               }
-                               tr.attr('data-share-permissions', sharePermissions);
-                               if (fileData.shareOwner) {
-                                       tr.attr('data-share-owner', fileData.shareOwner);
-                                       tr.attr('data-share-owner-id', fileData.shareOwnerId);
-                                       // user should always be able to rename a mount point
-                                       if (fileData.mountType === 'shared-root') {
-                                               tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE);
-                                       }
-                               }
-                               if (fileData.recipientData && !_.isEmpty(fileData.recipientData)) {
-                                       tr.attr('data-share-recipient-data', JSON.stringify(fileData.recipientData));
-                               }
-                               if (fileData.shareTypes) {
-                                       tr.attr('data-share-types', fileData.shareTypes.join(','));
-                               }
-                               return tr;
-                       };
-
-                       var oldElementToFile = fileList.elementToFile;
-                       fileList.elementToFile = function($el) {
-                               var fileInfo = oldElementToFile.apply(this, arguments);
-                               fileInfo.sharePermissions = $el.attr('data-share-permissions') || undefined;
-                               fileInfo.shareOwner = $el.attr('data-share-owner') || undefined;
-                               fileInfo.shareOwnerId = $el.attr('data-share-owner-id') || undefined;
-
-                               if( $el.attr('data-share-types')){
-                                       fileInfo.shareTypes = $el.attr('data-share-types').split(',');
-                               }
-
-                               if( $el.attr('data-expiration')){
-                                       var expirationTimestamp = parseInt($el.attr('data-expiration'));
-                                       fileInfo.shares = [];
-                                       fileInfo.shares.push({expiration: expirationTimestamp});
-                               }
-
-                               return fileInfo;
-                       };
-
-                       var oldGetWebdavProperties = fileList._getWebdavProperties;
-                       fileList._getWebdavProperties = function() {
-                               var props = oldGetWebdavProperties.apply(this, arguments);
-                               props.push(OC.Files.Client.PROPERTY_OWNER_ID);
-                               props.push(OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME);
-                               props.push(OC.Files.Client.PROPERTY_SHARE_TYPES);
-                               return props;
-                       };
-
-                       fileList.filesClient.addFileInfoParser(function(response) {
-                               var data = {};
-                               var props = response.propStat[0].properties;
-                               var permissionsProp = props[OC.Files.Client.PROPERTY_PERMISSIONS];
-
-                               if (permissionsProp && permissionsProp.indexOf('S') >= 0) {
-                                       data.shareOwner = props[OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME];
-                                       data.shareOwnerId = props[OC.Files.Client.PROPERTY_OWNER_ID];
-                               }
-
-                               var shareTypesProp = props[OC.Files.Client.PROPERTY_SHARE_TYPES];
-                               if (shareTypesProp) {
-                                       data.shareTypes = _.chain(shareTypesProp).filter(function(xmlvalue) {
-                                               return (xmlvalue.namespaceURI === OC.Files.Client.NS_OWNCLOUD && xmlvalue.nodeName.split(':')[1] === 'share-type');
-                                       }).map(function(xmlvalue) {
-                                               return parseInt(xmlvalue.textContent || xmlvalue.text, 10);
-                                       }).value();
-                               }
-
-                               return data;
-                       });
-
-                       // use delegate to catch the case with multiple file lists
-                       fileList.$el.on('fileActionsReady', function(ev){
-                               var $files = ev.$files;
-
-                               _.each($files, function(file) {
-                                       var $tr = $(file);
-                                       var shareTypes = $tr.attr('data-share-types') || '';
-                                       var shareOwner = $tr.attr('data-share-owner');
-                                       if (shareTypes || shareOwner) {
-                                               var hasLink = false;
-                                               var hasShares = false;
-                                               _.each(shareTypes.split(',') || [], function(shareType) {
-                                                       shareType = parseInt(shareType, 10);
-                                                       if (shareType === OC.Share.SHARE_TYPE_LINK) {
-                                                               hasLink = true;
-                                                       } else if (shareType === OC.Share.SHARE_TYPE_EMAIL) {
-                                                               hasLink = true;
-                                                       } else if (shareType === OC.Share.SHARE_TYPE_USER) {
-                                                               hasShares = true;
-                                                       } else if (shareType === OC.Share.SHARE_TYPE_GROUP) {
-                                                               hasShares = true;
-                                                       } else if (shareType === OC.Share.SHARE_TYPE_REMOTE) {
-                                                               hasShares = true;
-                                                       } else if (shareType === OC.Share.SHARE_TYPE_CIRCLE) {
-                                                               hasShares = true;
-                                                       } else if (shareType === OC.Share.SHARE_TYPE_ROOM) {
-                                                               hasShares = true;
-                                                       }
-                                               });
-                                               OCA.Sharing.Util._updateFileActionIcon($tr, hasShares, hasLink);
-                                       }
-                               });
-                       });
-
-
-                       fileList.$el.on('changeDirectory', function() {
-                               OCA.Sharing.sharesLoaded = false;
-                       });
-
-                       fileActions.registerAction({
-                               name: 'Share',
-                               displayName: '',
-                               altText: t('core', 'Share'),
-                               mime: 'all',
-                               permissions: OC.PERMISSION_ALL,
-                               iconClass: 'icon-shared',
-                               type: OCA.Files.FileActions.TYPE_INLINE,
-                               actionHandler: function(fileName, context) {
-                                       // do not open sidebar if permission is set and equal to 0
-                                       var permissions = parseInt(context.$file.data('share-permissions'), 10);
-                                       if (isNaN(permissions) || permissions > 0) {
-                                               fileList.showDetailsView(fileName, 'shareTabView');
-                                       }
-                               },
-                               render: function(actionSpec, isDefault, context) {
-                                       var permissions = parseInt(context.$file.data('permissions'), 10);
-                                       // if no share permissions but share owner exists, still show the link
-                                       if ((permissions & OC.PERMISSION_SHARE) !== 0 || context.$file.attr('data-share-owner')) {
-                                               return fileActions._defaultRenderAction.call(fileActions, actionSpec, isDefault, context);
-                                       }
-                                       // don't render anything
-                                       return null;
-                               }
-                       });
-
-                       var shareTab = new OCA.Sharing.ShareTabView('shareTabView', {order: -20});
-                       // detect changes and change the matching list entry
-                       shareTab.on('sharesChanged', function(shareModel) {
-                               var fileInfoModel = shareModel.fileInfoModel;
-                               var $tr = fileList.findFileEl(fileInfoModel.get('name'));
-
-                               // We count email shares as link share
-                               var hasLinkShares = shareModel.hasLinkShares();
-                               shareModel.get('shares').forEach(function (share) {
-                                       if (share.share_type === OC.Share.SHARE_TYPE_EMAIL) {
-                                               hasLinkShares = true;
-                                       }
-                               });
-
-                               OCA.Sharing.Util._updateFileListDataAttributes(fileList, $tr, shareModel);
-                               if (!OCA.Sharing.Util._updateFileActionIcon($tr, shareModel.hasUserShares(), hasLinkShares)) {
-                                       // remove icon, if applicable
-                                       OC.Share.markFileAsShared($tr, false, false);
-                               }
-
-                               // FIXME: this is too convoluted. We need to get rid of the above updates
-                               // and only ever update the model and let the events take care of rerendering
-                               fileInfoModel.set({
-                                       shareTypes: shareModel.getShareTypes(),
-                                       // in case markFileAsShared decided to change the icon,
-                                       // we need to modify the model
-                                       // (FIXME: yes, this is hacky)
-                                       icon: $tr.attr('data-icon')
-                               });
-                       });
-                       fileList.registerTabView(shareTab);
-
-                       var breadCrumbSharingDetailView = new OCA.Sharing.ShareBreadCrumbView({shareTab: shareTab});
-                       fileList.registerBreadCrumbDetailView(breadCrumbSharingDetailView);
-               },
-
-               /**
-                * Update file list data attributes
-                */
-               _updateFileListDataAttributes: function(fileList, $tr, shareModel) {
-                       // files app current cannot show recipients on load, so we don't update the
-                       // icon when changed for consistency
-                       if (fileList.id === 'files') {
-                               return;
-                       }
-                       var recipients = _.pluck(shareModel.get('shares'), 'share_with_displayname');
-                       // note: we only update the data attribute because updateIcon()
-                       if (recipients.length) {
-                               var recipientData = _.mapObject(shareModel.get('shares'), function (share) {
-                                       return {shareWith: share.share_with, shareWithDisplayName: share.share_with_displayname};
-                               });
-                               $tr.attr('data-share-recipient-data', JSON.stringify(recipientData));
-                       }
-                       else {
-                               $tr.removeAttr('data-share-recipient-data');
-                       }
-               },
-
-               /**
-                * Update the file action share icon for the given file
-                *
-                * @param $tr file element of the file to update
-                * @param {boolean} hasUserShares true if a user share exists
-                * @param {boolean} hasLinkShares true if a link share exists
-                *
-                * @return {boolean} true if the icon was set, false otherwise
-                */
-               _updateFileActionIcon: function($tr, hasUserShares, hasLinkShares) {
-                       // if the statuses are loaded already, use them for the icon
-                       // (needed when scrolling to the next page)
-                       if (hasUserShares || hasLinkShares || $tr.attr('data-share-recipient-data') || $tr.attr('data-share-owner')) {
-                               OC.Share.markFileAsShared($tr, true, hasLinkShares);
-                               return true;
-                       }
-                       return false;
-               },
-
-               /**
-                * @param {Array} fileData
-                * @returns {String}
-                */
-               getSharePermissions: function(fileData) {
-                       return fileData.sharePermissions;
-               }
-       };
-})();
-
-OC.Plugins.register('OCA.Files.FileList', OCA.Sharing.Util);
diff --git a/apps/files_sharing/js/sharebreadcrumbview.js b/apps/files_sharing/js/sharebreadcrumbview.js
deleted file mode 100644 (file)
index 17e3eae..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/* global Handlebars, OC */
-
-/**
- * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-(function() {
-       'use strict';
-
-       var BreadCrumbView = OC.Backbone.View.extend({
-               tagName: 'span',
-               events: {
-                       click: '_onClick'
-               },
-               _dirInfo: undefined,
-
-               /** @type OCA.Sharing.ShareTabView */
-               _shareTab: undefined,
-
-               initialize: function(options) {
-                       this._shareTab = options.shareTab;
-               },
-
-               render: function(data) {
-                       this._dirInfo = data.dirInfo || null;
-
-                       if (this._dirInfo !== null && (this._dirInfo.path !== '/' || this._dirInfo.name !== '')) {
-                               var isShared = data.dirInfo && data.dirInfo.shareTypes && data.dirInfo.shareTypes.length > 0;
-                               this.$el.removeClass('shared icon-public icon-shared');
-                               if (isShared) {
-                                       this.$el.addClass('shared');
-                                       if (data.dirInfo.shareTypes.indexOf(OC.Share.SHARE_TYPE_LINK) !== -1) {
-                                               this.$el.addClass('icon-public');
-                                       } else {
-                                               this.$el.addClass('icon-shared');
-                                       }
-                               } else {
-                                       this.$el.addClass('icon-shared');
-                               }
-                               this.$el.show();
-                               this.delegateEvents();
-                       } else {
-                               this.$el.removeClass('shared icon-public icon-shared');
-                               this.$el.hide();
-                       }
-
-                       return this;
-               },
-               _onClick: function(e) {
-                       e.preventDefault();
-
-                       var fileInfoModel = new OCA.Files.FileInfoModel(this._dirInfo);
-                       var self = this;
-                       fileInfoModel.on('change', function() {
-                               self.render({
-                                       dirInfo: self._dirInfo
-                               });
-                       });
-                       this._shareTab.on('sharesChanged', function(shareModel) {
-                               var shareTypes = [];
-                               var shares = shareModel.getSharesWithCurrentItem();
-
-                               for(var i = 0; i < shares.length; i++) {
-                                       if (shareTypes.indexOf(shares[i].share_type) === -1) {
-                                               shareTypes.push(shares[i].share_type);
-                                       }
-                               }
-
-                               if (shareModel.hasLinkShares()) {
-                                       shareTypes.push(OC.Share.SHARE_TYPE_LINK);
-                               }
-
-                               // Since the dirInfo isn't updated we need to do this dark hackery
-                               self._dirInfo.shareTypes = shareTypes;
-
-                               self.render({
-                                       dirInfo: self._dirInfo
-                               });
-                       });
-                       OCA.Files.App.fileList.showDetailsView(fileInfoModel, 'shareTabView');
-               }
-       });
-
-       OCA.Sharing.ShareBreadCrumbView = BreadCrumbView;
-})();
diff --git a/apps/files_sharing/js/sharetabview.js b/apps/files_sharing/js/sharetabview.js
deleted file mode 100644 (file)
index 9b1176d..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2015
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-/* @global Handlebars */
-
-(function() {
-       var TEMPLATE =
-               '<div>' +
-               '<div class="dialogContainer"></div>' +
-               '</div>';
-
-       /**
-        * @memberof OCA.Sharing
-        */
-       var ShareTabView = OCA.Files.DetailTabView.extend(
-               /** @lends OCA.Sharing.ShareTabView.prototype */ {
-               id: 'shareTabView',
-               className: 'tab shareTabView',
-
-               initialize: function(name, options) {
-                       OCA.Files.DetailTabView.prototype.initialize.call(this, name, options);
-                       OC.Plugins.attach('OCA.Sharing.ShareTabView', this);
-               },
-
-               template: function(params) {
-                       return  TEMPLATE;
-               },
-
-               getLabel: function() {
-                       return t('files_sharing', 'Sharing');
-               },
-
-               getIcon: function() {
-                       return 'icon-shared';
-               },
-
-               /**
-                * Renders this details view
-                */
-               render: function() {
-                       var self = this;
-                       if (this._dialog) {
-                               // remove/destroy older instance
-                               this._dialog.model.off();
-                               this._dialog.remove();
-                               this._dialog = null;
-                       }
-
-                       if (this.model) {
-                               this.$el.html(this.template());
-
-                               if (_.isUndefined(this.model.get('sharePermissions'))) {
-                                       this.model.set('sharePermissions', OCA.Sharing.Util.getSharePermissions(this.model.attributes));
-                               }
-
-                               // TODO: the model should read these directly off the passed fileInfoModel
-                               var attributes = {
-                                       itemType: this.model.isDirectory() ? 'folder' : 'file',
-                                       itemSource: this.model.get('id'),
-                                       possiblePermissions: this.model.get('sharePermissions')
-                               };
-                               var configModel = new OC.Share.ShareConfigModel();
-                               var shareModel = new OC.Share.ShareItemModel(attributes, {
-                                       configModel: configModel,
-                                       fileInfoModel: this.model
-                               });
-                               this._dialog = new OC.Share.ShareDialogView({
-                                       configModel: configModel,
-                                       model: shareModel
-                               });
-                               this.$el.find('.dialogContainer').append(this._dialog.$el);
-                               this._dialog.render();
-                               this._dialog.model.fetch();
-                               this._dialog.model.on('change', function() {
-                                       self.trigger('sharesChanged', shareModel);
-                               });
-                       } else {
-                               this.$el.empty();
-                               // TODO: render placeholder text?
-                       }
-                       this.trigger('rendered');
-               }
-       });
-
-       OCA.Sharing.ShareTabView = ShareTabView;
-})();
-
diff --git a/apps/files_sharing/src/additionalScripts.js b/apps/files_sharing/src/additionalScripts.js
new file mode 100644 (file)
index 0000000..dc07e2e
--- /dev/null
@@ -0,0 +1,6 @@
+import './share'
+import './sharetabview'
+import './sharebreadcrumbview'
+
+import './style/sharetabview.scss'
+import './style/sharebreadcrumb.scss'
diff --git a/apps/files_sharing/src/share.js b/apps/files_sharing/src/share.js
new file mode 100644 (file)
index 0000000..b02c6e3
--- /dev/null
@@ -0,0 +1,276 @@
+/*
+ * Copyright (c) 2014
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+(function() {
+
+       _.extend(OC.Files.Client, {
+               PROPERTY_SHARE_TYPES:   '{' + OC.Files.Client.NS_OWNCLOUD + '}share-types',
+               PROPERTY_OWNER_ID:      '{' + OC.Files.Client.NS_OWNCLOUD + '}owner-id',
+               PROPERTY_OWNER_DISPLAY_NAME:    '{' + OC.Files.Client.NS_OWNCLOUD + '}owner-display-name'
+       });
+
+       if (!OCA.Sharing) {
+               OCA.Sharing = {};
+       }
+       /**
+        * @namespace
+        */
+       OCA.Sharing.Util = {
+               /**
+                * Initialize the sharing plugin.
+                *
+                * Registers the "Share" file action and adds additional
+                * DOM attributes for the sharing file info.
+                *
+                * @param {OCA.Files.FileList} fileList file list to be extended
+                */
+               attach: function(fileList) {
+                       // core sharing is disabled/not loaded
+                       if (!OC.Share) {
+                               return;
+                       }
+                       if (fileList.id === 'trashbin' || fileList.id === 'files.public') {
+                               return;
+                       }
+                       var fileActions = fileList.fileActions;
+                       var oldCreateRow = fileList._createRow;
+                       fileList._createRow = function(fileData) {
+
+                               var tr = oldCreateRow.apply(this, arguments);
+                               var sharePermissions = OCA.Sharing.Util.getSharePermissions(fileData);
+                               
+                               if (fileData.permissions === 0) {
+                                       // no permission, disabling sidebar
+                                       delete fileActions.actions.all.Comment;
+                                       delete fileActions.actions.all.Details;
+                                       delete fileActions.actions.all.Goto;
+                               }
+                               tr.attr('data-share-permissions', sharePermissions);
+                               if (fileData.shareOwner) {
+                                       tr.attr('data-share-owner', fileData.shareOwner);
+                                       tr.attr('data-share-owner-id', fileData.shareOwnerId);
+                                       // user should always be able to rename a mount point
+                                       if (fileData.mountType === 'shared-root') {
+                                               tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE);
+                                       }
+                               }
+                               if (fileData.recipientData && !_.isEmpty(fileData.recipientData)) {
+                                       tr.attr('data-share-recipient-data', JSON.stringify(fileData.recipientData));
+                               }
+                               if (fileData.shareTypes) {
+                                       tr.attr('data-share-types', fileData.shareTypes.join(','));
+                               }
+                               return tr;
+                       };
+
+                       var oldElementToFile = fileList.elementToFile;
+                       fileList.elementToFile = function($el) {
+                               var fileInfo = oldElementToFile.apply(this, arguments);
+                               fileInfo.sharePermissions = $el.attr('data-share-permissions') || undefined;
+                               fileInfo.shareOwner = $el.attr('data-share-owner') || undefined;
+                               fileInfo.shareOwnerId = $el.attr('data-share-owner-id') || undefined;
+
+                               if( $el.attr('data-share-types')){
+                                       fileInfo.shareTypes = $el.attr('data-share-types').split(',');
+                               }
+
+                               if( $el.attr('data-expiration')){
+                                       var expirationTimestamp = parseInt($el.attr('data-expiration'));
+                                       fileInfo.shares = [];
+                                       fileInfo.shares.push({expiration: expirationTimestamp});
+                               }
+
+                               return fileInfo;
+                       };
+
+                       var oldGetWebdavProperties = fileList._getWebdavProperties;
+                       fileList._getWebdavProperties = function() {
+                               var props = oldGetWebdavProperties.apply(this, arguments);
+                               props.push(OC.Files.Client.PROPERTY_OWNER_ID);
+                               props.push(OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME);
+                               props.push(OC.Files.Client.PROPERTY_SHARE_TYPES);
+                               return props;
+                       };
+
+                       fileList.filesClient.addFileInfoParser(function(response) {
+                               var data = {};
+                               var props = response.propStat[0].properties;
+                               var permissionsProp = props[OC.Files.Client.PROPERTY_PERMISSIONS];
+
+                               if (permissionsProp && permissionsProp.indexOf('S') >= 0) {
+                                       data.shareOwner = props[OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME];
+                                       data.shareOwnerId = props[OC.Files.Client.PROPERTY_OWNER_ID];
+                               }
+
+                               var shareTypesProp = props[OC.Files.Client.PROPERTY_SHARE_TYPES];
+                               if (shareTypesProp) {
+                                       data.shareTypes = _.chain(shareTypesProp).filter(function(xmlvalue) {
+                                               return (xmlvalue.namespaceURI === OC.Files.Client.NS_OWNCLOUD && xmlvalue.nodeName.split(':')[1] === 'share-type');
+                                       }).map(function(xmlvalue) {
+                                               return parseInt(xmlvalue.textContent || xmlvalue.text, 10);
+                                       }).value();
+                               }
+
+                               return data;
+                       });
+
+                       // use delegate to catch the case with multiple file lists
+                       fileList.$el.on('fileActionsReady', function(ev){
+                               var $files = ev.$files;
+
+                               _.each($files, function(file) {
+                                       var $tr = $(file);
+                                       var shareTypes = $tr.attr('data-share-types') || '';
+                                       var shareOwner = $tr.attr('data-share-owner');
+                                       if (shareTypes || shareOwner) {
+                                               var hasLink = false;
+                                               var hasShares = false;
+                                               _.each(shareTypes.split(',') || [], function(shareType) {
+                                                       shareType = parseInt(shareType, 10);
+                                                       if (shareType === OC.Share.SHARE_TYPE_LINK) {
+                                                               hasLink = true;
+                                                       } else if (shareType === OC.Share.SHARE_TYPE_EMAIL) {
+                                                               hasLink = true;
+                                                       } else if (shareType === OC.Share.SHARE_TYPE_USER) {
+                                                               hasShares = true;
+                                                       } else if (shareType === OC.Share.SHARE_TYPE_GROUP) {
+                                                               hasShares = true;
+                                                       } else if (shareType === OC.Share.SHARE_TYPE_REMOTE) {
+                                                               hasShares = true;
+                                                       } else if (shareType === OC.Share.SHARE_TYPE_CIRCLE) {
+                                                               hasShares = true;
+                                                       } else if (shareType === OC.Share.SHARE_TYPE_ROOM) {
+                                                               hasShares = true;
+                                                       }
+                                               });
+                                               OCA.Sharing.Util._updateFileActionIcon($tr, hasShares, hasLink);
+                                       }
+                               });
+                       });
+
+
+                       fileList.$el.on('changeDirectory', function() {
+                               OCA.Sharing.sharesLoaded = false;
+                       });
+
+                       fileActions.registerAction({
+                               name: 'Share',
+                               displayName: '',
+                               altText: t('core', 'Share'),
+                               mime: 'all',
+                               permissions: OC.PERMISSION_ALL,
+                               iconClass: 'icon-shared',
+                               type: OCA.Files.FileActions.TYPE_INLINE,
+                               actionHandler: function(fileName, context) {
+                                       // do not open sidebar if permission is set and equal to 0
+                                       var permissions = parseInt(context.$file.data('share-permissions'), 10);
+                                       if (isNaN(permissions) || permissions > 0) {
+                                               fileList.showDetailsView(fileName, 'shareTabView');
+                                       }
+                               },
+                               render: function(actionSpec, isDefault, context) {
+                                       var permissions = parseInt(context.$file.data('permissions'), 10);
+                                       // if no share permissions but share owner exists, still show the link
+                                       if ((permissions & OC.PERMISSION_SHARE) !== 0 || context.$file.attr('data-share-owner')) {
+                                               return fileActions._defaultRenderAction.call(fileActions, actionSpec, isDefault, context);
+                                       }
+                                       // don't render anything
+                                       return null;
+                               }
+                       });
+
+                       var shareTab = new OCA.Sharing.ShareTabView('shareTabView', {order: -20});
+                       // detect changes and change the matching list entry
+                       shareTab.on('sharesChanged', function(shareModel) {
+                               var fileInfoModel = shareModel.fileInfoModel;
+                               var $tr = fileList.findFileEl(fileInfoModel.get('name'));
+
+                               // We count email shares as link share
+                               var hasLinkShares = shareModel.hasLinkShares();
+                               shareModel.get('shares').forEach(function (share) {
+                                       if (share.share_type === OC.Share.SHARE_TYPE_EMAIL) {
+                                               hasLinkShares = true;
+                                       }
+                               });
+
+                               OCA.Sharing.Util._updateFileListDataAttributes(fileList, $tr, shareModel);
+                               if (!OCA.Sharing.Util._updateFileActionIcon($tr, shareModel.hasUserShares(), hasLinkShares)) {
+                                       // remove icon, if applicable
+                                       OC.Share.markFileAsShared($tr, false, false);
+                               }
+
+                               // FIXME: this is too convoluted. We need to get rid of the above updates
+                               // and only ever update the model and let the events take care of rerendering
+                               fileInfoModel.set({
+                                       shareTypes: shareModel.getShareTypes(),
+                                       // in case markFileAsShared decided to change the icon,
+                                       // we need to modify the model
+                                       // (FIXME: yes, this is hacky)
+                                       icon: $tr.attr('data-icon')
+                               });
+                       });
+                       fileList.registerTabView(shareTab);
+
+                       var breadCrumbSharingDetailView = new OCA.Sharing.ShareBreadCrumbView({shareTab: shareTab});
+                       fileList.registerBreadCrumbDetailView(breadCrumbSharingDetailView);
+               },
+
+               /**
+                * Update file list data attributes
+                */
+               _updateFileListDataAttributes: function(fileList, $tr, shareModel) {
+                       // files app current cannot show recipients on load, so we don't update the
+                       // icon when changed for consistency
+                       if (fileList.id === 'files') {
+                               return;
+                       }
+                       var recipients = _.pluck(shareModel.get('shares'), 'share_with_displayname');
+                       // note: we only update the data attribute because updateIcon()
+                       if (recipients.length) {
+                               var recipientData = _.mapObject(shareModel.get('shares'), function (share) {
+                                       return {shareWith: share.share_with, shareWithDisplayName: share.share_with_displayname};
+                               });
+                               $tr.attr('data-share-recipient-data', JSON.stringify(recipientData));
+                       }
+                       else {
+                               $tr.removeAttr('data-share-recipient-data');
+                       }
+               },
+
+               /**
+                * Update the file action share icon for the given file
+                *
+                * @param $tr file element of the file to update
+                * @param {boolean} hasUserShares true if a user share exists
+                * @param {boolean} hasLinkShares true if a link share exists
+                *
+                * @return {boolean} true if the icon was set, false otherwise
+                */
+               _updateFileActionIcon: function($tr, hasUserShares, hasLinkShares) {
+                       // if the statuses are loaded already, use them for the icon
+                       // (needed when scrolling to the next page)
+                       if (hasUserShares || hasLinkShares || $tr.attr('data-share-recipient-data') || $tr.attr('data-share-owner')) {
+                               OC.Share.markFileAsShared($tr, true, hasLinkShares);
+                               return true;
+                       }
+                       return false;
+               },
+
+               /**
+                * @param {Array} fileData
+                * @returns {String}
+                */
+               getSharePermissions: function(fileData) {
+                       return fileData.sharePermissions;
+               }
+       };
+})();
+
+OC.Plugins.register('OCA.Files.FileList', OCA.Sharing.Util);
diff --git a/apps/files_sharing/src/sharebreadcrumbview.js b/apps/files_sharing/src/sharebreadcrumbview.js
new file mode 100644 (file)
index 0000000..17e3eae
--- /dev/null
@@ -0,0 +1,103 @@
+/* global Handlebars, OC */
+
+/**
+ * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+(function() {
+       'use strict';
+
+       var BreadCrumbView = OC.Backbone.View.extend({
+               tagName: 'span',
+               events: {
+                       click: '_onClick'
+               },
+               _dirInfo: undefined,
+
+               /** @type OCA.Sharing.ShareTabView */
+               _shareTab: undefined,
+
+               initialize: function(options) {
+                       this._shareTab = options.shareTab;
+               },
+
+               render: function(data) {
+                       this._dirInfo = data.dirInfo || null;
+
+                       if (this._dirInfo !== null && (this._dirInfo.path !== '/' || this._dirInfo.name !== '')) {
+                               var isShared = data.dirInfo && data.dirInfo.shareTypes && data.dirInfo.shareTypes.length > 0;
+                               this.$el.removeClass('shared icon-public icon-shared');
+                               if (isShared) {
+                                       this.$el.addClass('shared');
+                                       if (data.dirInfo.shareTypes.indexOf(OC.Share.SHARE_TYPE_LINK) !== -1) {
+                                               this.$el.addClass('icon-public');
+                                       } else {
+                                               this.$el.addClass('icon-shared');
+                                       }
+                               } else {
+                                       this.$el.addClass('icon-shared');
+                               }
+                               this.$el.show();
+                               this.delegateEvents();
+                       } else {
+                               this.$el.removeClass('shared icon-public icon-shared');
+                               this.$el.hide();
+                       }
+
+                       return this;
+               },
+               _onClick: function(e) {
+                       e.preventDefault();
+
+                       var fileInfoModel = new OCA.Files.FileInfoModel(this._dirInfo);
+                       var self = this;
+                       fileInfoModel.on('change', function() {
+                               self.render({
+                                       dirInfo: self._dirInfo
+                               });
+                       });
+                       this._shareTab.on('sharesChanged', function(shareModel) {
+                               var shareTypes = [];
+                               var shares = shareModel.getSharesWithCurrentItem();
+
+                               for(var i = 0; i < shares.length; i++) {
+                                       if (shareTypes.indexOf(shares[i].share_type) === -1) {
+                                               shareTypes.push(shares[i].share_type);
+                                       }
+                               }
+
+                               if (shareModel.hasLinkShares()) {
+                                       shareTypes.push(OC.Share.SHARE_TYPE_LINK);
+                               }
+
+                               // Since the dirInfo isn't updated we need to do this dark hackery
+                               self._dirInfo.shareTypes = shareTypes;
+
+                               self.render({
+                                       dirInfo: self._dirInfo
+                               });
+                       });
+                       OCA.Files.App.fileList.showDetailsView(fileInfoModel, 'shareTabView');
+               }
+       });
+
+       OCA.Sharing.ShareBreadCrumbView = BreadCrumbView;
+})();
diff --git a/apps/files_sharing/src/sharetabview.js b/apps/files_sharing/src/sharetabview.js
new file mode 100644 (file)
index 0000000..9b1176d
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2015
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+/* @global Handlebars */
+
+(function() {
+       var TEMPLATE =
+               '<div>' +
+               '<div class="dialogContainer"></div>' +
+               '</div>';
+
+       /**
+        * @memberof OCA.Sharing
+        */
+       var ShareTabView = OCA.Files.DetailTabView.extend(
+               /** @lends OCA.Sharing.ShareTabView.prototype */ {
+               id: 'shareTabView',
+               className: 'tab shareTabView',
+
+               initialize: function(name, options) {
+                       OCA.Files.DetailTabView.prototype.initialize.call(this, name, options);
+                       OC.Plugins.attach('OCA.Sharing.ShareTabView', this);
+               },
+
+               template: function(params) {
+                       return  TEMPLATE;
+               },
+
+               getLabel: function() {
+                       return t('files_sharing', 'Sharing');
+               },
+
+               getIcon: function() {
+                       return 'icon-shared';
+               },
+
+               /**
+                * Renders this details view
+                */
+               render: function() {
+                       var self = this;
+                       if (this._dialog) {
+                               // remove/destroy older instance
+                               this._dialog.model.off();
+                               this._dialog.remove();
+                               this._dialog = null;
+                       }
+
+                       if (this.model) {
+                               this.$el.html(this.template());
+
+                               if (_.isUndefined(this.model.get('sharePermissions'))) {
+                                       this.model.set('sharePermissions', OCA.Sharing.Util.getSharePermissions(this.model.attributes));
+                               }
+
+                               // TODO: the model should read these directly off the passed fileInfoModel
+                               var attributes = {
+                                       itemType: this.model.isDirectory() ? 'folder' : 'file',
+                                       itemSource: this.model.get('id'),
+                                       possiblePermissions: this.model.get('sharePermissions')
+                               };
+                               var configModel = new OC.Share.ShareConfigModel();
+                               var shareModel = new OC.Share.ShareItemModel(attributes, {
+                                       configModel: configModel,
+                                       fileInfoModel: this.model
+                               });
+                               this._dialog = new OC.Share.ShareDialogView({
+                                       configModel: configModel,
+                                       model: shareModel
+                               });
+                               this.$el.find('.dialogContainer').append(this._dialog.$el);
+                               this._dialog.render();
+                               this._dialog.model.fetch();
+                               this._dialog.model.on('change', function() {
+                                       self.trigger('sharesChanged', shareModel);
+                               });
+                       } else {
+                               this.$el.empty();
+                               // TODO: render placeholder text?
+                       }
+                       this.trigger('rendered');
+               }
+       });
+
+       OCA.Sharing.ShareTabView = ShareTabView;
+})();
+
diff --git a/apps/files_sharing/src/style/sharebreadcrumb.scss b/apps/files_sharing/src/style/sharebreadcrumb.scss
new file mode 100644 (file)
index 0000000..f3096f4
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+div.crumb span.icon-shared,
+div.crumb span.icon-public {
+       display: inline-block;
+       cursor: pointer;
+       opacity: 0.2;
+       margin-right: 6px;
+}
+
+div.crumb span.icon-shared.shared,
+div.crumb span.icon-public.shared {
+       opacity: 0.7;
+}
diff --git a/apps/files_sharing/src/style/sharetabview.scss b/apps/files_sharing/src/style/sharetabview.scss
new file mode 100644 (file)
index 0000000..f698697
--- /dev/null
@@ -0,0 +1,282 @@
+.app-files .shareTabView {
+       min-height: 100px;
+}
+
+.share-autocomplete-item {
+       display: flex;
+
+       &.merged {
+               margin-left: 32px;
+       }
+       .autocomplete-item-text {
+               margin-left: 10px;
+               margin-right: 10px;
+               white-space: nowrap;
+               text-overflow: ellipsis;
+               overflow: hidden;
+               line-height: 32px;
+               vertical-align: middle;
+               flex-grow: 1;
+               .ui-state-highlight {
+                       border: none;
+                       margin: 0;
+               }
+       }
+       &.with-description {
+               .autocomplete-item-text {
+                       line-height: 100%;
+               }
+       }
+       .autocomplete-item-details {
+               display: block;
+               line-height: 130%;
+               font-size: 90%;
+               opacity: 0.7;
+       }
+
+       .icon {
+               opacity: .7;
+               margin-right: 7px;
+       }
+}
+
+.shareTabView {
+       .oneline {
+               white-space: nowrap;
+               position: relative;
+       }
+       .shareWithLoading {
+               padding-left: 10px;
+               right: 35px;
+               top: 3px;
+       }
+       .shareWithConfirm {
+               position: absolute;
+               right: 2px;
+               top: 6px;
+               padding: 14px;
+               opacity: 0.5;
+       }
+       .shareWithField:focus ~ .shareWithConfirm {
+               opacity: 1;
+       }
+       .linkMore {
+               position: absolute;
+               right: -7px;
+               top: -4px;
+               padding: 14px;
+       }
+       .popovermenu {
+               .linkPassMenu {
+                       .share-pass-submit {
+                               width: auto !important;
+                       }
+                       .icon-loading-small {
+                               background-color: var(--color-main-background);
+                               position: absolute;
+                               right: 8px;
+                               margin: 3px;
+                               padding: 10px;
+                               width: 32px;
+                               height: 32px;
+                               z-index: 10;
+                       }
+               }
+               .datepicker {
+                       margin-left: 35px;
+               }
+               .share-add {
+                       input.share-note-delete {
+                               border: none;
+                               background-color: transparent;
+                               width: 44px !important;
+                               padding: 0;
+                               flex: 0 0 44px;
+                               margin-left: auto;
+                               &.hidden {
+                                       display: none;
+                               }
+                       }
+               }
+               // note
+               .share-note-form {
+                       span.icon-note {
+                               position: relative;
+                       }
+                       textarea.share-note {
+                               margin: 0;
+                               width: 200px;
+                               min-height: 70px;
+                               resize: none;
+                               + input.share-note-submit {
+                                       position: absolute;
+                                       width: 44px !important;
+                                       height: 44px;
+                                       bottom: 0px;
+                                       right: 10px;
+                                       margin: 0;
+                                       background-color: transparent;
+                                       border: none;
+                                       opacity: .7;
+                                       &:hover,
+                                       &:focus,
+                                       &:active {
+                                               opacity: 1;
+                                       }
+                               }
+                       }
+                       // fix for popover link share
+                       &.share-note-link {
+                               margin-bottom: 10px;
+                       }
+               }
+
+               /* Border above last entry '+ Add another share' to separate it from current link settings */
+               .new-share {
+                       border-top: 1px solid var(--color-border);
+               }
+       }
+       .linkPass .icon-loading-small {
+               margin-right: 0px;
+       }
+       .icon {
+               background-size: 16px 16px;
+       }
+       .shareWithList .icon-loading-small:not(.hidden) + span,
+       .linkShareView .icon-loading-small:not(.hidden) + input + label:before {
+               /* Hide if loader is visible */
+               display: none !important;
+       }
+       input {
+               &[type='checkbox'] {
+                       margin: 0 3px 0 8px;
+                       vertical-align: middle;
+               }
+               &[type='text'] {
+                       &.shareWithField,
+                       &.emailField {
+                               width: 100%;
+                               box-sizing: border-box;
+                               padding-right: 32px;
+                               text-overflow: ellipsis;
+                       }
+               }
+               &[type='text'].linkText
+               &[type='password'].linkPassText,
+               &[type='password'].passwordField {
+                       width: 180px !important;
+               }
+       }
+       form {
+               font-size: 100%;
+               margin-left: 0;
+               margin-right: 0;
+       }
+       // share note on the sidebar
+       .share-note {
+               border-radius: var(--border-radius);
+               margin-bottom: 10px;
+               margin-left: 37px;
+       }
+}
+
+// Sharing tab users list
+.shareWithList {
+       list-style-type: none;
+       display: flex;
+       flex-direction: column;
+       > li {
+               height: 44px;
+               white-space: normal;
+               display: inline-flex;
+               align-items: center;
+               position: relative;
+               .avatar {
+                       width: 32px;
+                       height: 32px;
+                       background-color: var(--color-primary);
+               }
+       }
+       .unshare img {
+               vertical-align: text-bottom;
+               /* properly align icons */
+       }
+       .sharingOptionsGroup {
+               margin-left: auto;
+               display: flex;
+               align-items: center;
+               white-space: nowrap;
+
+               // icons
+               > .icon:not(.hidden),
+               .share-menu > .icon:not(.hidden) {
+                       padding: 14px;
+                       height: 44px;
+                       width: 44px;
+                       opacity: .5;
+                       display: block;
+                       cursor: pointer;
+
+                       &:hover,
+                       &:focus,
+                       &:active {
+                               opacity: .7;;
+                       }
+               }
+
+               // more menu
+               > .share-menu  {
+                       position: relative;
+                       display: block;
+               }
+       }
+       .username {
+               padding: 0 8px;
+               overflow: hidden;
+               white-space: nowrap;
+               text-overflow: ellipsis;
+       }
+}
+
+.ui-autocomplete {
+       /* limit dropdown height to 6 1/2 entries */
+       max-height: calc(36px * 6.5);
+       overflow-y: auto;
+       overflow-x: hidden;
+       z-index: 1550 !important;
+}
+
+.notCreatable {
+       padding-left: 12px;
+       padding-top: 12px;
+       color: var(--color-text-lighter);
+}
+
+.contactsmenu-popover {
+       left: -6px;
+       right: auto;
+       padding: 3px 6px;
+       top: 100%;
+       margin-top: 0;
+       li.hidden {
+               display: none !important;
+       }
+       &:after {
+               left: 8px;
+               right: auto;
+       }
+}
+
+.reshare,
+#link label,
+#expiration label {
+       display: inline-flex;
+       align-items: center;
+       .avatar {
+               margin-right: 5px;
+       }
+}
+
+.resharerInfoView.subView {
+       position: relative;
+}
diff --git a/apps/files_sharing/webpack.js b/apps/files_sharing/webpack.js
new file mode 100644 (file)
index 0000000..815f6bd
--- /dev/null
@@ -0,0 +1,37 @@
+const path = require('path');
+
+module.exports = {
+       entry: path.join(__dirname, 'src', 'additionalScripts.js'),
+       output: {
+               path: path.resolve(__dirname, './js'),
+               publicPath: '/js/',
+               filename: 'additionalScripts.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]'
+                               }
+                       }
+               ]
+       },
+       resolve: {
+               extensions: ['*', '.js']
+       }
+};
index 954188f5e566423945e4a05a29f3aae93b72d758..e5a28b1f0ed87dd920201da7003b73bcafd83ad1 100644 (file)
@@ -54,10 +54,8 @@ module.exports = function(config) {
                                        // up with the global namespace/classes/state
                                        'apps/files_sharing/js/app.js',
                                        'apps/files_sharing/js/sharedfilelist.js',
-                                       'apps/files_sharing/js/share.js',
-                                       'apps/files_sharing/js/sharebreadcrumbview.js',
+                                       'apps/files_sharing/js/additionalScripts.js',
                                        'apps/files_sharing/js/public.js',
-                                       'apps/files_sharing/js/sharetabview.js',
                                        'apps/files_sharing/js/files_drop.js',
                                        'apps/files_sharing/js/templates.js',
                                ],
index fd28e53b91b558037d4afc323c5045bc3eb12bbb..0d712ad65ddbecfad36127749e4f1365dbc214fb 100644 (file)
@@ -1,4 +1,5 @@
 const core = require('./core/webpack');
+const files_sharing = require('./apps/files_sharing/webpack')
 const files_trashbin = require('./apps/files_trashbin/webpack')
 const files_versions = require('./apps/files_versions/webpack');
 const oauth2 = require('./apps/oauth2/webpack')
@@ -6,6 +7,7 @@ const systemtags = require('./apps/systemtags/webpack')
 
 module.exports = [].concat(
        core,
+       files_sharing,
        files_trashbin,
        files_versions,
        oauth2,