Add vue app for ACL management in files sidebar

Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
Julius Härtl 2019-02-13 15:37:42 +01:00 committed by Robin Appelman
parent 09c8c01774
commit 093dbb6e87
14 changed files with 744 additions and 219 deletions

View file

@ -9,10 +9,11 @@ $eventDispatcher = \OC::$server->getEventDispatcher();
$eventDispatcher->addListener(
'OCA\Files::loadAdditionalScripts',
function () {
\OCP\Util::addScript('groupfolders', 'files');
\OCP\Util::addScript('groupfolders', '../build/files');
}
);
$eventDispatcher->addListener('OCA\Files_Sharing::loadAdditionalScripts', function () {
\OCP\Util::addScript('groupfolders', 'files');
});

70
img/deny.svg Normal file
View file

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
viewbox="0 0 16 16"
width="16"
height="16"
id="svg3791"
sodipodi:docname="deny.svg"
inkscape:version="0.92.4 5da689c313, 2019-01-14">
<metadata
id="metadata3797">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs3795" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview3793"
showgrid="false"
inkscape:zoom="18.296388"
inkscape:cx="-13.154265"
inkscape:cy="1.9505725"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:current-layer="g3789" />
<g
stroke-width="2"
stroke="#000"
stroke-linecap="round"
fill="none"
id="g3789">
<path
d="M 11.678082,4.5280679 4.5924509,11.613699"
id="path3787"
inkscape:connector-curvature="0"
style="stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none" />
<ellipse
id="path3993"
cx="7.9999995"
cy="8"
rx="5.9096346"
ry="5.9096351"
style="stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -1,171 +0,0 @@
(function(OC, OCA) {
if (OCA.Theming) {
// https://localcloud.icewind.me/apps/theming/img/groupfolders/folder-group.svg?v=34
OC.MimeType._mimeTypeIcons['dir-group'] = OC.generateUrl('/apps/theming/img/groupfolders/folder-group.svg?v=' + OCA.Theming.cacheBuster);
} else {
OC.MimeType._mimeTypeIcons['dir-group'] = OC.imagePath('groupfolders', 'folder-group');
}
var ACL_PROPERTIES = {
PROPERTY_ACL_LIST: '{' + OC.Files.Client.NS_NEXTCLOUD + '}acl-list',
PROPERTY_ACL_ENTRY: '{' + OC.Files.Client.NS_NEXTCLOUD + '}acl',
PROPERTY_ACL_MAPPING_TYPE: '{' + OC.Files.Client.NS_NEXTCLOUD + '}acl-mapping-type',
PROPERTY_ACL_MAPPING_ID: '{' + OC.Files.Client.NS_NEXTCLOUD + '}acl-mapping-id',
PROPERTY_ACL_MASK: '{' + OC.Files.Client.NS_NEXTCLOUD + '}acl-mask',
PROPERTY_ACL_PERMISSIONS: '{' + OC.Files.Client.NS_NEXTCLOUD + '}acl-permissions',
};
_.extend(OC.Files.Client, ACL_PROPERTIES);
// Allow nested properties in PROPPATCH
// WIP branch at https://github.com/juliushaertl/davclient.js/tree/enhancement/nested-proppatch
var patchClientForNestedPropPatch = function (client) {
client._client.getPropertyBody = function(key, propValue) {
var property = this.parseClarkNotation(key);
var propName;
if (this.xmlNamespaces[property.namespace]) {
propName = this.xmlNamespaces[property.namespace] + ':' + property.name;
} else {
propName = 'x:' + property.name + ' xmlns:x="' + property.namespace + '"';
}
if (Array.isArray(propValue)) {
var body = '';
for(var ii in propValue) {
if ( propValue[ii].hasOwnProperty('type') && propValue[ii].hasOwnProperty('data') ) {
body += this.getPropertyBody(propValue[ii].type, propValue[ii].data);
} else {
body += this.getPropertyBody(ii, propValue[ii]);
}
}
return ' <' + propName + '>' + body + '</' + propName + '>';
} else if (typeof propValue === 'object') {
var body = '';
if ( propValue.hasOwnProperty('type') && propValue.hasOwnProperty('data') ) {
return this.getPropertyBody(propValue.type, propValue.data)
}
for(var ii in propValue) {
body += this.getPropertyBody(ii, propValue[ii]);
}
return ' <' + propName + '>' + body + '</' + propName + '>';
} else {
// FIXME: hard-coded for now until we allow properties to
// specify whether to be escaped or not
if (propName !== 'd:resourcetype') {
propValue = dav._escapeXml('' + propValue);
}
return ' <' + propName + '>' + propValue + '</' + propName + '>';
}
}
client._client._renderPropSet = function(properties) {
var body = ' <d:set>\n' +
' <d:prop>\n';
for(var ii in properties) {
if (!properties.hasOwnProperty(ii)) {
continue;
}
body += this.getPropertyBody(ii, properties[ii])
}
body +=' </d:prop>\n';
body +=' </d:set>\n';
return body;
}
};
// dummy acl data for testing
var getDummyAcl = function() {
var acl2 = {};
acl2[ACL_PROPERTIES.PROPERTY_ACL_MAPPING_TYPE] = 'group';
acl2[ACL_PROPERTIES.PROPERTY_ACL_MAPPING_ID] = 'admin';
acl2[ACL_PROPERTIES.PROPERTY_ACL_MASK] = 31;
acl2[ACL_PROPERTIES.PROPERTY_ACL_PERMISSIONS] = 0;
var acl1 = {};
acl1[ACL_PROPERTIES.PROPERTY_ACL_MAPPING_TYPE] = 'user';
acl1[ACL_PROPERTIES.PROPERTY_ACL_MAPPING_ID] = 'admin';
acl1[ACL_PROPERTIES.PROPERTY_ACL_MASK] = 31;
acl1[ACL_PROPERTIES.PROPERTY_ACL_PERMISSIONS] = 1;
var acls = [{type: ACL_PROPERTIES.PROPERTY_ACL_ENTRY, data: acl1}, {type: ACL_PROPERTIES.PROPERTY_ACL_ENTRY, data: acl2}];
var props = {};
props[OC.Files.Client.PROPERTY_ACL_LIST] = acls;
return props;
}
OCA.Groupfolders = {};
OCA.Groupfolders.ShareTabPlugin = {
attach: function (shareTabView) {
shareTabView.on('rendered', function() {
if (this.model && this.model.get('mountType') === 'group') {
shareTabView.$el.find('.dialogContainer').append(
$('<div id="groupfolder-sharing">' +
'<div class="avatar icon-group-white" style="display: inline-block;background-color: var(--color-primary);padding: 16px;"></div>' +
'Group folders</div>'
)
);
// TODO: bind js app here
}
});
}
};
OCA.Groupfolders.FileListPlugin = {
attach: function (fileList) {
fileList.filesClient.addFileInfoParser(function(response) {
var data = {};
var props = response.propStat[0].properties;
var acls = props[ACL_PROPERTIES.PROPERTY_ACL_LIST];
if (!_.isUndefined(acls)) {
data.acl = [];
for (var i = 0; i < acls.length; i++) {
var acl = {};
for (var ii in acls[i].children) {
var prop = acls[i].children[ii];
if (!prop.nodeName) {
continue;
}
var propertyName = prop.nodeName.split(':')[1] || '';
switch (propertyName) {
case 'acl-mapping-id':
acl.mappingId = prop.textContent || prop.text;
break;
case 'acl-mapping-type':
acl.mappingType = prop.textContent || prop.text;
break;
case 'acl-mask':
acl.mask = parseInt(prop.textContent || prop.text, 10);
break;
case 'acl-permissions':
acl.permissions = parseInt(prop.textContent || prop.text, 10);
break;
default:
break;
}
}
data.acl.push(acl);
}
}
return data;
});
// PROPPATCH/PROPGET testing
var client = fileList.filesClient;
patchClientForNestedPropPatch(client);
// example prop patch
//client._client.propPatch(client._client.baseUrl + '/Test', getDummyAcl()).then((response) => console.log(response))
// example fetching acl
//client.getFileInfo('/Test', {
// properties: [OC.Files.Client.PROPERTY_ACL_LIST]
//} ).then((status, fileInfo) => { console.log(fileInfo); });
}
};
OC.Plugins.register('OCA.Files.FileList', OCA.Groupfolders.FileListPlugin);
// Requires https://github.com/nextcloud/server/compare/enhancement/noid/sharing-tab-plugins?expand=1
OC.Plugins.register('OCA.Sharing.ShareTabView', OCA.Groupfolders.ShareTabPlugin);
})(OC, OCA);

369
package-lock.json generated
View file

@ -322,6 +322,109 @@
"integrity": "sha512-rzi6fw7hhxPcCoNVsgysHFlKnhYYvVj7AJwdAO0HQNP5vg9sY0DoRRC1pfuCQm94cOa1sab82HGUtdFlWHIhBg==",
"dev": true
},
"@vue/component-compiler-utils": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.5.2.tgz",
"integrity": "sha512-3exq9O89GXo9E+CGKzgURCbasG15FtFMs8QRrCUVWGaKue4Egpw41MHb3Avtikv1VykKfBq3FvAnf9Nx3sdVJg==",
"dev": true,
"requires": {
"consolidate": "^0.15.1",
"hash-sum": "^1.0.2",
"lru-cache": "^4.1.2",
"merge-source-map": "^1.1.0",
"postcss": "^7.0.14",
"postcss-selector-parser": "^5.0.0",
"prettier": "1.16.3",
"source-map": "~0.6.1",
"vue-template-es2015-compiler": "^1.8.2"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"dependencies": {
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"cssesc": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
"integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
"dev": true
},
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"dev": true,
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"postcss": {
"version": "7.0.14",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz",
"integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==",
"dev": true,
"requires": {
"chalk": "^2.4.2",
"source-map": "^0.6.1",
"supports-color": "^6.1.0"
}
},
"postcss-selector-parser": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
"integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
"dev": true,
"requires": {
"cssesc": "^2.0.0",
"indexes-of": "^1.0.1",
"uniq": "^1.0.1"
}
},
"supports-color": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
"dev": true
}
}
},
"@webassemblyjs/ast": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.3.tgz",
@ -702,7 +805,7 @@
},
"util": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
"resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz",
"integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
"dev": true,
"requires": {
@ -982,6 +1085,15 @@
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
"optional": true
},
"axios": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
"integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
"requires": {
"follow-redirects": "^1.3.0",
"is-buffer": "^1.1.5"
}
},
"babel-code-frame": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
@ -2472,7 +2584,7 @@
},
"browserify-aes": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
"resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
"integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
"dev": true,
"requires": {
@ -2509,7 +2621,7 @@
},
"browserify-rsa": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
"resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
"integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
"dev": true,
"requires": {
@ -2553,7 +2665,7 @@
},
"buffer": {
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
"resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
"integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
"dev": true,
"requires": {
@ -2682,6 +2794,11 @@
"supports-color": "^2.0.0"
}
},
"charenc": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
"integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
},
"chokidar": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
@ -2955,6 +3072,15 @@
"date-now": "^0.1.4"
}
},
"consolidate": {
"version": "0.15.1",
"resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz",
"integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
"dev": true,
"requires": {
"bluebird": "^3.1.1"
}
},
"constants-browserify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
@ -3040,7 +3166,7 @@
},
"create-hash": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
"resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
"integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
"dev": true,
"requires": {
@ -3053,7 +3179,7 @@
},
"create-hmac": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
"resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
"integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
"dev": true,
"requires": {
@ -3078,6 +3204,11 @@
"which": "^1.2.9"
}
},
"crypt": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
},
"crypto-browserify": {
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
@ -3274,6 +3405,12 @@
"integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
"dev": true
},
"de-indent": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
"integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
"dev": true
},
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@ -3461,7 +3598,7 @@
},
"diffie-hellman": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
"resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
"integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
"dev": true,
"requires": {
@ -3998,6 +4135,11 @@
"websocket-driver": ">=0.5.1"
}
},
"fecha": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz",
"integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg=="
},
"figgy-pudding": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
@ -4113,28 +4255,25 @@
}
},
"follow-redirects": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz",
"integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==",
"dev": true,
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz",
"integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==",
"requires": {
"debug": "^3.2.6"
"debug": "=3.1.0"
},
"dependencies": {
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"dev": true,
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "^2.1.1"
"ms": "2.0.0"
}
},
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
"dev": true
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
}
}
},
@ -4987,6 +5126,12 @@
"safe-buffer": "^5.0.1"
}
},
"hash-sum": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
"integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
"dev": true
},
"hash.js": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
@ -4997,6 +5142,12 @@
"minimalistic-assert": "^1.0.1"
}
},
"he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"dev": true
},
"hmac-drbg": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@ -5416,8 +5567,7 @@
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
"dev": true
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
},
"is-callable": {
"version": "1.1.4",
@ -5829,8 +5979,7 @@
"lodash.merge": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz",
"integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==",
"dev": true
"integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ=="
},
"lodash.template": {
"version": "4.4.0",
@ -5925,6 +6074,16 @@
"integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=",
"dev": true
},
"md5": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
"integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
"requires": {
"charenc": "~0.0.1",
"crypt": "~0.0.1",
"is-buffer": "~1.1.1"
}
},
"md5.js": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
@ -5969,6 +6128,15 @@
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
"dev": true
},
"merge-source-map": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
"integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
"dev": true,
"requires": {
"source-map": "^0.6.1"
}
},
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
@ -6198,6 +6366,43 @@
"integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==",
"dev": true
},
"nextcloud-axios": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/nextcloud-axios/-/nextcloud-axios-0.1.3.tgz",
"integrity": "sha512-M2eLX0qrP8xy1VEGDhPXGwvV4W4gMnU1ysjnURVen8ehR1qRLdb/JfhJHab6XRsme7vWWMgSTEj+o3ibQ94N6g==",
"requires": {
"axios": "^0.18.0"
}
},
"nextcloud-server": {
"version": "0.15.9",
"resolved": "https://registry.npmjs.org/nextcloud-server/-/nextcloud-server-0.15.9.tgz",
"integrity": "sha512-QFgVMMNdUrGtVyRyDb7d6qM9zk7OdwzllBWPdNmwnp9xc9rhZbdXSeP+K0g6vsfT43HBCW1rmSOrDeU39LKOlQ==",
"requires": {
"@types/jquery": "^2.0.50"
},
"dependencies": {
"@types/jquery": {
"version": "2.0.53",
"resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.53.tgz",
"integrity": "sha512-MZKPWUhp5TKkoJ/58NSq6io+CSUCOHm2b3Z6U4+r9v70kktB0JM+eRjdp6YmDHtw0kK2XB7L2K7/FMIoziHjUA=="
}
}
},
"nextcloud-vue": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/nextcloud-vue/-/nextcloud-vue-0.6.2.tgz",
"integrity": "sha512-2RudZGzgoGoDp+ZIVPEBBONJOCeV+SvvyNmfxYMqBHHtFnQIeXJ2o3Bp6Ou45zo0Jt07Q9HzJkxc9fEnbweG3Q==",
"requires": {
"md5": "^2.2.1",
"nextcloud-axios": "^0.1.2",
"v-tooltip": "^2.0.0-rc.33",
"vue": "^2.5.20",
"vue-click-outside": "^1.0.7",
"vue-multiselect": "^2.1.0",
"vue2-datepicker": "^2.6.1"
}
},
"nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
@ -6570,7 +6775,7 @@
},
"path-browserify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
"resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
"integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
"dev": true
},
@ -6686,10 +6891,9 @@
}
},
"popper.js": {
"version": "1.14.7",
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.7.tgz",
"integrity": "sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ==",
"dev": true
"version": "1.14.6",
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.6.tgz",
"integrity": "sha512-AGwHGQBKumlk/MDfrSOf0JHhJCImdDMcGNoqKmKkU+68GFazv3CQ6q9r7Ja1sKDZmYWTckY/uLyEznheTDycnA=="
},
"portfinder": {
"version": "1.0.20",
@ -7621,6 +7825,12 @@
"uniq": "^1.0.1"
}
},
"prettier": {
"version": "1.16.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.3.tgz",
"integrity": "sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==",
"dev": true
},
"private": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@ -7679,6 +7889,12 @@
"resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz",
"integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo="
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
"dev": true
},
"psl": {
"version": "1.1.29",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
@ -7946,7 +8162,7 @@
},
"regexpu-core": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
"resolved": "http://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
"integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
"dev": true,
"requires": {
@ -7957,13 +8173,13 @@
},
"regjsgen": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
"resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
"integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
"dev": true
},
"regjsparser": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
"resolved": "http://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
"integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
"dev": true,
"requires": {
@ -7972,7 +8188,7 @@
"dependencies": {
"jsesc": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
"resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
"integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
"dev": true
}
@ -8354,7 +8570,7 @@
},
"sha.js": {
"version": "2.4.11",
"resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
"resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
"integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
"dev": true,
"requires": {
@ -9029,7 +9245,7 @@
},
"tty-browserify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
"resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
"integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
"dev": true
},
@ -9293,6 +9509,16 @@
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
},
"v-tooltip": {
"version": "2.0.0-rc.33",
"resolved": "https://registry.npmjs.org/v-tooltip/-/v-tooltip-2.0.0-rc.33.tgz",
"integrity": "sha1-ePfY6cNCZWIr5lup3HjGfx3AK3M=",
"requires": {
"lodash.merge": "^4.6.0",
"popper.js": "^1.12.9",
"vue-resize": "^0.4.3"
}
},
"v8-compile-cache": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz",
@ -9324,13 +9550,86 @@
},
"vm-browserify": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
"resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
"integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
"dev": true,
"requires": {
"indexof": "0.0.1"
}
},
"vue": {
"version": "2.6.6",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.6.tgz",
"integrity": "sha512-Y2DdOZD8sxApS+iUlwv1v8U1qN41kq6Kw45lM6nVZKhygeWA49q7VCCXkjXqeDBXgurrKWkYQ9cJeEJwAq0b9Q=="
},
"vue-click-outside": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/vue-click-outside/-/vue-click-outside-1.0.7.tgz",
"integrity": "sha1-zdKxYF48SUR4TheU6uShKg9wC9Y="
},
"vue-hot-reload-api": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.2.tgz",
"integrity": "sha512-NpznMQoe/DzMG7nJjPkJKT7FdEn9xXfnntG7POfTmqnSaza97ylaBf1luZDh4IgV+vgUoR//id5pf8Ru+Ym+0g==",
"dev": true
},
"vue-loader": {
"version": "15.6.2",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.6.2.tgz",
"integrity": "sha512-T6fONodj861M3PqZ1jlbUFjeezbUnPRY2bd+3eZuDvYADgkN3VFU2H5feqySNg9XBt8rcbyBGmFWTZtrOX+v5w==",
"dev": true,
"requires": {
"@vue/component-compiler-utils": "^2.5.1",
"hash-sum": "^1.0.2",
"loader-utils": "^1.1.0",
"vue-hot-reload-api": "^2.3.0",
"vue-style-loader": "^4.1.0"
}
},
"vue-multiselect": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-2.1.3.tgz",
"integrity": "sha512-ANLvoLEZv5uzissmh2WSHTn8DGhqsKi6zVtctpf1wnGK6vmZBktQZzeuHGxH7KpIb+4A6BlXmq0RR08jtQ67tg=="
},
"vue-resize": {
"version": "0.4.5",
"resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-0.4.5.tgz",
"integrity": "sha512-bhP7MlgJQ8TIkZJXAfDf78uJO+mEI3CaLABLjv0WNzr4CcGRGPIAItyWYnP6LsPA4Oq0WE+suidNs6dgpO4RHg=="
},
"vue-style-loader": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz",
"integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==",
"dev": true,
"requires": {
"hash-sum": "^1.0.2",
"loader-utils": "^1.0.2"
}
},
"vue-template-compiler": {
"version": "2.6.6",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.6.tgz",
"integrity": "sha512-OakxDGyrmMQViCjkakQFbDZlG0NibiOzpLauOfyCUVRQc9yPmTqpiz9nF0VeA+dFkXegetw0E5x65BFhhLXO0A==",
"dev": true,
"requires": {
"de-indent": "^1.0.2",
"he": "^1.1.0"
}
},
"vue-template-es2015-compiler": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.8.2.tgz",
"integrity": "sha512-cliV19VHLJqFUYbz/XeWXe5CO6guzwd0yrrqqp0bmjlMP3ZZULY7fu8RTC4+3lmHwo6ESVDHFDsvjB15hcR5IA==",
"dev": true
},
"vue2-datepicker": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/vue2-datepicker/-/vue2-datepicker-2.10.0.tgz",
"integrity": "sha512-WGL7ou0TdBiJQuHVp29BtBw3rSkLrIYwXWU/ELmaLdnAerI0EdGVAu7DvZV2iIxY4lsHyjqocApxdvXTmwLrAw==",
"requires": {
"fecha": "^2.3.3"
}
},
"watchpack": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",

View file

@ -1,4 +1,8 @@
{
"scripts": {
"dev": "webpack --colors --display-error-details --config webpack.dev.config.js --watch",
"build": "webpack --colors --display-error-details --config webpack.prod.config.js"
},
"devDependencies": {
"@babel/core": "^7.3.4",
"@types/bootstrap": "^4.2.2",
@ -30,15 +34,20 @@
"url-loader": "^1.1.2",
"webpack": "^4.29.5",
"webpack-cli": "^3.2.3",
"webpack-dev-server": "^3.2.1"
"webpack-dev-server": "^3.2.1",
"vue-loader": "^15.6.2",
"vue-template-compiler": "^2.6.6"
},
"dependencies": {
"less": "^3.9.0",
"less-loader": "^4.1.0",
"nextcloud-server": "^0.15.9",
"nextcloud-vue": "^0.6.2",
"oc-react-components": "^0.2.0",
"react": "^16.8.3",
"react-dom": "^16.8.3",
"react-flip-move": "^3.0.3",
"vue": "^2.6.6",
"whatwg-fetch": "^3.0.0"
}
}

16
src/SharingSidebarApp.js Normal file
View file

@ -0,0 +1,16 @@
import Vue from 'vue';
import SharingSidebarView from './components/SharingSidebarView.vue';
import VTooltip from 'v-tooltip';
import ClickOutside from 'vue-click-outside';
Vue.prototype.t = t
Vue.prototype.n = n
Vue.prototype.OC = OC
Vue.prototype.OCA = OCA
Vue.use(VTooltip);
Vue.directive('ClickOutside', ClickOutside)
const View = Vue.extend(SharingSidebarView);
export default View;

View file

@ -0,0 +1,89 @@
<template>
<div style="position: relative;" v-click-outside="popoverClose">
<button @click="open = true" v-if="state === STATES.INHERIT_DENY" class="icon-deny inherited" v-tooltip="t('groupfolders', 'Denied (Inherited permission)')"></button>
<button @click="open = true" v-else-if="state === STATES.INHERIT_ALLOW" class="icon-checkmark inherited" v-tooltip="t('groupfolders', 'Allowed (Inherited permission)')"></button>
<button @click="open = true" v-else-if="state === STATES.SELF_DENY" class="icon-deny" v-tooltip="t('groupfolders', 'Denied')"></button>
<button @click="open = true" v-else-if="state === STATES.SELF_ALLOW" class="icon-checkmark" v-tooltip="t('groupfolders', 'Allowed')"></button>
<div class="popovermenu" :class="{open: open}"><PopoverMenu :menu="menu"></PopoverMenu></div>
</div>
</template>
<script>
import { PopoverMenu } from 'nextcloud-vue'
const STATES = {
INHERIT_DENY: 0,
INHERIT_ALLOW: 1,
SELF_DENY: 2,
SELF_ALLOW: 3
}
export default {
name: 'AclStateButton',
components: {PopoverMenu},
props: {
state: {
type: Number,
default: STATES.INHERIT_DENY
}
},
methods: {
popoverClose() {
this.open = false
}
},
data() {
return {
STATES: STATES,
open: false,
menu: [
{
icon: 'icon-history',
text: 'Inherit permission',
active: this.state === STATES.INHERIT_ALLOW || this.state === STATES.INHERIT_DENY,
action: () => {
this.popoverClose()
}
},
{
icon: 'icon-close',
text: 'Deny',
active: this.state === STATES.SELF_DENY,
action: () => {
this.popoverClose()
}
},
{
icon: 'icon-history',
text: 'Allow',
active: this.state === STATES.SELF_ALLOW,
action: () => {
this.popoverClose()
}
}
]
}
}
}
</script>
<style scoped>
.popovermenu {
top: 38px;
right: -5px;
}
button {
height: 24px;
border-color: transparent;
}
button:hover {
height: 24px;
border-color: var(--color-primary, #0082c9);
}
.icon-deny {
background-image: url('../../img/deny.svg');
}
.inherited {
opacity: 0.5;
}
</style>

View file

@ -0,0 +1,136 @@
<template>
<div>
<div class="groupfolder-entry">
<div class="avatar icon-group-white"></div>
<span class="username">{{ t('groupfolders', 'Groupfolder') }}</span>
</div>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th>{{ t('groupfolders', 'Read') }}</th>
<th>{{ t('groupfolders', 'Write') }}</th>
<th>{{ t('groupfolders', 'Share') }}</th>
<th>{{ t('groupfolders', 'Delete') }}</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><avatar user="admin" :size="24"></avatar></td>
<td class="username">Username</td>
<td><AclStateButton :state="0" /></td>
<td><AclStateButton :state="1" /></td>
<td><AclStateButton :state="2" /></td>
<td><AclStateButton :state="3" /></td>
<td><a class="icon-close" v-tooltip="t('groupfolders', 'Remove access rule')"></a></td>
</tr>
<tr>
<td><avatar user="group" :isNoUser="true" :size="24"></avatar></td>
<td>Group</td>
<td><AclStateButton :state="0" /></td>
<td><AclStateButton :state="1" /></td>
<td><AclStateButton :state="2" /></td>
<td><AclStateButton :state="3" /></td>
<td><a class="icon-close" v-tooltip="t('groupfolders', 'Remove access rule')"></a></td>
</tr>
</tbody>
</table>
<button v-if="!showAclCreate" @click="toggleAclCreate"><span class="icon-add"></span> {{ t('groupfolders', 'Add advanced permission rule') }}</button>
<multiselect v-if="showAclCreate" ref="multiselect" v-model="value" :options="options"></multiselect>
</div>
</template>
<script>
import { Avatar, Multiselect } from 'nextcloud-vue';
import AclStateButton from './AclStateButton'
export default {
name: 'SharingSidebarView',
props: ['fileModel'],
components: {
Avatar, Multiselect, AclStateButton
},
data() {
return {
showAclCreate: false,
options: ['list', 'of', 'options'],
value: null
}
},
computed: {
canShare() {
return OC.PERMISSION_SHARE & this.fileModel.permissions !== 0
}
},
methods: {
toggleAclCreate() {
this.showAclCreate = !this.showAclCreate;
}
}
}
</script>
<style scoped>
.groupfolder-entry {
height: 44px;
white-space: normal;
display: inline-flex;
align-items: center;
position: relative;
}
.avatar.icon-group-white {
display: inline-block;
background-color: var(--color-primary, #0082c9);
padding: 16px;
}
.groupfolder-entry .username {
padding: 0 8px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
table {
width: 100%;
margin-top: -44px;
margin-bottom: 5px;
}
thead th {
text-align: center;
height: 44px;
}
tbody tr td:first-child {
width: 24px;
padding: 0;
padding-left: 4px;
}
table .avatardiv {
margin-top: 6px;
}
table .username {
width: 50%;
}
table button {
height: 26px;
width: 24px !important;
display: block;
border-radius: 50%;
margin: auto;
}
a.icon-close {
display: inline-block;
height: 24px;
vertical-align: middle;
background-size: 12px;
opacity: .7;
float: right;
}
a.icon-close:hover {
opacity: 1;
}
.multiselect {
margin-left: 44px;
width: calc(100% - 44px);
}
</style>

34
src/files.js Normal file
View file

@ -0,0 +1,34 @@
(function(OC, OCA) {
if (OCA.Theming) {
OC.MimeType._mimeTypeIcons['dir-group'] = OC.generateUrl('/apps/theming/img/groupfolders/folder-group.svg?v=' + OCA.Theming.cacheBuster);
} else {
OC.MimeType._mimeTypeIcons['dir-group'] = OC.imagePath('groupfolders', 'folder-group');
}
__webpack_nonce__ = btoa(OC.requestToken)
__webpack_public_path__ = OC.linkTo('groupfolders', 'build/')
var ShareTabPlugin = {
attach: function (shareTabView) {
shareTabView.on('rendered', function() {
if (this.model && this.model.get('mountType') === 'group') {
const el = document.createElement('div');
const container = shareTabView.$el.find('.dialogContainer')[0];
container.parentNode.insertBefore(el, container.nextSibling);
el.id = 'groupfolder-sharing';
import(/* webpackChunkName: "sharing" */'./SharingSidebarApp').then((Module) => {
const View = Module.default;
const vm = new View({
propsData: {
fileModel: this.model
}
}).$mount(el);
});
}
});
}
};
OC.Plugins.register('OCA.Sharing.ShareTabView', ShareTabPlugin);
})(OC, OCA);

10
src/model/Properties.js Normal file
View file

@ -0,0 +1,10 @@
const ACL_PROPERTIES = {
PROPERTY_ACL_LIST: '{' + OC.Files.Client.NS_NEXTCLOUD + '}acl-list',
PROPERTY_ACL_ENTRY: '{' + OC.Files.Client.NS_NEXTCLOUD + '}acl',
PROPERTY_ACL_MAPPING_TYPE: '{' + OC.Files.Client.NS_NEXTCLOUD + '}acl-mapping-type',
PROPERTY_ACL_MAPPING_ID: '{' + OC.Files.Client.NS_NEXTCLOUD + '}acl-mapping-id',
PROPERTY_ACL_MASK: '{' + OC.Files.Client.NS_NEXTCLOUD + '}acl-mask',
PROPERTY_ACL_PERMISSIONS: '{' + OC.Files.Client.NS_NEXTCLOUD + '}acl-permissions',
};
export default ACL_PROPERTIES;

14
src/model/Rule.js Normal file
View file

@ -0,0 +1,14 @@
import PROPERTIES from 'Properties'
export default class Rule {
constructor (props) {
this.mappingType = props[PROPERTIES.PROPERTY_ACL_MAPPING_TYPE];
this.mappingType = props[PROPERTIES.PROPERTY_ACL_MAPPING_ID];
this.mask = props[PROPERTIES.PROPERTY_ACL_MASK];
this.permissions = props[PROPERTIES.PROPERTY_ACL_PERMISSIONS];
}
}

View file

@ -1,4 +1,4 @@
<?php script($_['appId'], ['../build/bundle']); ?>
<?php style($_['appId'], ['../build/bundle']); ?>
<?php script($_['appId'], ['../build/app']); ?>
<?php style($_['appId'], ['../build/app']); ?>
<div id="searchresults" style="display: none"></div>
<div id="groupfolders-root"/>

View file

@ -1,6 +1,7 @@
'use strict';
const path = require("path");
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
devtool: 'source-map',
@ -9,16 +10,20 @@ module.exports = {
app: [
'webpack/hot/only-dev-server',
'./js/index.tsx'
],
files: [
'./src/files.js'
]
},
output: {
path: path.join(__dirname, "build"),
filename: "bundle.js",
filename: "[name].js",
publicPath: '/'
},
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
},
plugins: [new VueLoaderPlugin()],
module: {
rules: [
{
@ -34,6 +39,10 @@ module.exports = {
'ts-loader'
]
},
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /.*\.(gif|png|jpe?g|svg|webp)(\?.+)?$/i,
use: [
@ -42,7 +51,7 @@ module.exports = {
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader', 'postcss-loader']
use: ['vue-style-loader', 'style-loader', 'css-loader', 'postcss-loader']
}
]
},

View file

@ -3,6 +3,7 @@
const path = require("path");
const CleanPlugin = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
devtool: 'source-map',
@ -12,22 +13,26 @@ module.exports = {
`whatwg-fetch`,
'./js/index.tsx'
],
files: [
'./src/files.js'
]
},
output: {
path: path.join(__dirname, "build"),
filename: "bundle.js",
filename: "[name].js",
libraryTarget: 'umd',
publicPath: '/'
},
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
},
plugins: [
new CleanPlugin(['build']),
new MiniCssExtractPlugin({
filename: 'bundle.css',
allChunks: true
})
filename: '[name].css',
chunks: ['app']
}),
new VueLoaderPlugin()
],
module: {
rules: [
@ -44,6 +49,10 @@ module.exports = {
'ts-loader'
]
},
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /.*\.(gif|png|jpe?g|svg|webp)(\?.+)?$/i,
use: [
@ -53,7 +62,7 @@ module.exports = {
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
'vue-style-loader',
'css-loader',
'postcss-loader'
]