DesktopToolbar.vue team members widget resolving

This commit is contained in:
Čarodej
2021-10-22 10:53:04 +02:00
parent cea881ce38
commit 705281325f
8 changed files with 87 additions and 40 deletions

View File

@@ -59,7 +59,7 @@
"/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=2bdbb5f9141052aaaa3d", "/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=2bdbb5f9141052aaaa3d",
"/chunks/plans.js": "/chunks/plans.js?id=a3a16f546521050656fb", "/chunks/plans.js": "/chunks/plans.js?id=a3a16f546521050656fb",
"/chunks/platform.js": "/chunks/platform.js?id=07fd139d62a2c60f9468", "/chunks/platform.js": "/chunks/platform.js?id=07fd139d62a2c60f9468",
"/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=e914b8a5e845646456c3", "/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=6da8a930d3ab447dc666",
"/chunks/profile.js": "/chunks/profile.js?id=91ea55260c78ea4e7abd", "/chunks/profile.js": "/chunks/profile.js?id=91ea55260c78ea4e7abd",
"/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=7b80324eef831d31e3e8", "/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=7b80324eef831d31e3e8",
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=26a3951e09a8862d8dc2", "/chunks/purchase-code.js": "/chunks/purchase-code.js?id=26a3951e09a8862d8dc2",
@@ -182,5 +182,21 @@
"/chunks/shared-with-me.54e36bd53fa339ec4fb7.hot-update.js": "/chunks/shared-with-me.54e36bd53fa339ec4fb7.hot-update.js", "/chunks/shared-with-me.54e36bd53fa339ec4fb7.hot-update.js": "/chunks/shared-with-me.54e36bd53fa339ec4fb7.hot-update.js",
"/chunks/shared-with-me.17b05bf3b95620219457.hot-update.js": "/chunks/shared-with-me.17b05bf3b95620219457.hot-update.js", "/chunks/shared-with-me.17b05bf3b95620219457.hot-update.js": "/chunks/shared-with-me.17b05bf3b95620219457.hot-update.js",
"/chunks/shared-with-me.4a8a25245ef7531c5735.hot-update.js": "/chunks/shared-with-me.4a8a25245ef7531c5735.hot-update.js", "/chunks/shared-with-me.4a8a25245ef7531c5735.hot-update.js": "/chunks/shared-with-me.4a8a25245ef7531c5735.hot-update.js",
"/chunks/shared-with-me.2455d13237b72650ef8b.hot-update.js": "/chunks/shared-with-me.2455d13237b72650ef8b.hot-update.js" "/chunks/shared-with-me.2455d13237b72650ef8b.hot-update.js": "/chunks/shared-with-me.2455d13237b72650ef8b.hot-update.js",
"/chunks/platform~chunks/shared.c4d84777bd49629c7f4e.hot-update.js": "/chunks/platform~chunks/shared.c4d84777bd49629c7f4e.hot-update.js",
"/chunks/platform~chunks/shared.2002cbbac234f7eda6b0.hot-update.js": "/chunks/platform~chunks/shared.2002cbbac234f7eda6b0.hot-update.js",
"/chunks/platform~chunks/shared.d3f35c4b013d89a92526.hot-update.js": "/chunks/platform~chunks/shared.d3f35c4b013d89a92526.hot-update.js",
"/chunks/platform~chunks/shared.5505ecef8146fd90e641.hot-update.js": "/chunks/platform~chunks/shared.5505ecef8146fd90e641.hot-update.js",
"/chunks/platform~chunks/shared.44baf0152316974ff956.hot-update.js": "/chunks/platform~chunks/shared.44baf0152316974ff956.hot-update.js",
"/chunks/platform~chunks/shared.b850f5f0dbce66101ac6.hot-update.js": "/chunks/platform~chunks/shared.b850f5f0dbce66101ac6.hot-update.js",
"/chunks/platform~chunks/shared.fad4fcff2a55b7c9de5b.hot-update.js": "/chunks/platform~chunks/shared.fad4fcff2a55b7c9de5b.hot-update.js",
"/chunks/platform~chunks/shared.427068b74f3a9223c8af.hot-update.js": "/chunks/platform~chunks/shared.427068b74f3a9223c8af.hot-update.js",
"/chunks/platform~chunks/shared.7cd67170f606d88b046a.hot-update.js": "/chunks/platform~chunks/shared.7cd67170f606d88b046a.hot-update.js",
"/chunks/platform~chunks/shared.4a5f63d6af032394abb4.hot-update.js": "/chunks/platform~chunks/shared.4a5f63d6af032394abb4.hot-update.js",
"/chunks/platform~chunks/shared.85e2c221e154cdb096ca.hot-update.js": "/chunks/platform~chunks/shared.85e2c221e154cdb096ca.hot-update.js",
"/chunks/platform~chunks/shared.40220b39a67ea6947ada.hot-update.js": "/chunks/platform~chunks/shared.40220b39a67ea6947ada.hot-update.js",
"/chunks/platform~chunks/shared.cdc982ee462905db2739.hot-update.js": "/chunks/platform~chunks/shared.cdc982ee462905db2739.hot-update.js",
"/chunks/platform~chunks/shared.da8714bce7630fc753ba.hot-update.js": "/chunks/platform~chunks/shared.da8714bce7630fc753ba.hot-update.js",
"/chunks/platform~chunks/shared.1c7a870b7ada9ad6da18.hot-update.js": "/chunks/platform~chunks/shared.1c7a870b7ada9ad6da18.hot-update.js",
"/chunks/platform~chunks/shared.d6227f7e312ed10fe374.hot-update.js": "/chunks/platform~chunks/shared.d6227f7e312ed10fe374.hot-update.js"
} }

View File

@@ -16,14 +16,15 @@
<ToolbarWrapper> <ToolbarWrapper>
<!--Search bar--> <!--Search bar-->
<ToolbarGroup style="margin-left: 0"> <ToolbarGroup v-if="false" style="margin-left: 0">
<SearchBar /> <SearchBar />
</ToolbarGroup> </ToolbarGroup>
<!--Creating controls--> <!--Create button for all pages except SharedWithMe-->
<ToolbarGroup v-if="$checkPermission(['master', 'editor'])"> <ToolbarGroup v-if="$checkPermission(['master', 'editor']) && ! $isThisRoute($route, ['SharedWithMe'])">
<PopoverWrapper> <PopoverWrapper>
<ToolbarButton @click.stop.native="showCreateMenu" source="cloud-plus" :action="$t('actions.create')" /> <ToolbarButton @click.stop.native="showCreateMenu" source="cloud-plus" :action="$t('actions.create')" />
<PopoverItem name="desktop-create" side="left"> <PopoverItem name="desktop-create" side="left">
<OptionGroup> <OptionGroup>
<OptionUpload :class="{'is-inactive': canUploadInView || isTeamFolderHomepage }" :title="$t('actions.upload')" /> <OptionUpload :class="{'is-inactive': canUploadInView || isTeamFolderHomepage }" :title="$t('actions.upload')" />
@@ -36,6 +37,22 @@
</PopoverWrapper> </PopoverWrapper>
</ToolbarGroup> </ToolbarGroup>
<!--Create button for shared with me page-->
<ToolbarGroup v-if="$isThisRoute($route, ['SharedWithMe'])">
<PopoverWrapper>
<ToolbarButton @click.stop.native="showCreateMenu" source="cloud-plus" :class="{'is-inactive': ! canEdit}" :action="$t('actions.create')" />
<PopoverItem name="desktop-create" side="left">
<OptionGroup>
<OptionUpload :class="{'is-inactive': canUploadInView || isSharedWithMeHomepage }" :title="$t('actions.upload')" />
</OptionGroup>
<OptionGroup>
<Option @click.stop.native="$createFolder" :class="{'is-inactive': canCreateFolderInView || isSharedWithMeHomepage }" :title="$t('actions.create_folder')" icon="folder-plus" />
</OptionGroup>
</PopoverItem>
</PopoverWrapper>
</ToolbarGroup>
<!--Share Controls--> <!--Share Controls-->
<ToolbarGroup v-if="! $isMobile() && ! $isThisRoute($route, ['Public'])"> <ToolbarGroup v-if="! $isMobile() && ! $isThisRoute($route, ['Public'])">
@@ -121,7 +138,17 @@
'currentFolder', 'currentFolder',
'sharedDetail', 'sharedDetail',
'clipboard', 'clipboard',
'user',
]), ]),
canEdit() {
if (this.currentTeamFolder && this.user) {
let member = this.currentTeamFolder.data.relationships.members.data.find(member => member.data.id === this.user.data.id)
return member.data.attributes.permission === 'can-edit'
}
return false
},
teamFolder() { teamFolder() {
return this.currentTeamFolder return this.currentTeamFolder
? this.currentTeamFolder ? this.currentTeamFolder
@@ -138,18 +165,23 @@
return this.$isThisRoute(this.$route, ['TeamFolders']) return this.$isThisRoute(this.$route, ['TeamFolders'])
&& ! this.$route.params.id && ! this.$route.params.id
}, },
isSharedWithMeHomepage() {
return this.$isThisRoute(this.$route, ['SharedWithMe'])
&& ! this.$route.params.id
},
canCreateFolderInView() { canCreateFolderInView() {
return ! this.$isThisRoute(this.$route, ['Files', 'Public', 'TeamFolders']) return ! this.$isThisRoute(this.$route, ['Files', 'Public', 'TeamFolders', 'SharedWithMe'])
}, },
canShowConvertToTeamFolder() { canShowConvertToTeamFolder() {
return this.$isThisRoute(this.$route, ['Files', 'MySharedItems']) return this.$isThisRoute(this.$route, ['Files', 'MySharedItems'])
}, },
canUploadInView() { canUploadInView() {
return ! this.$isThisRoute(this.$route, ['Files', 'Public', 'TeamFolders']) return ! this.$isThisRoute(this.$route, ['Files', 'Public', 'TeamFolders', 'SharedWithMe'])
}, },
canDeleteInView() { canDeleteInView() {
let routes = [ let routes = [
'TeamFolders', 'TeamFolders',
'SharedWithMe',
'RecentUploads', 'RecentUploads',
'MySharedItems', 'MySharedItems',
'Trash', 'Trash',

View File

@@ -128,7 +128,7 @@ class SetupDevEnvironment extends Command
collect([ collect([
[ [
'avatar' => 'avatar-02.png', 'avatar' => 'avatar-02.png',
'email' => 'alice@vuefilemanager.com', 'email' => 'alice@hi5ve.digital',
], ],
[ [
'avatar' => 'avatar-03.png', 'avatar' => 'avatar-03.png',
@@ -801,7 +801,7 @@ class SetupDevEnvironment extends Command
$member = User::whereEmail('howdy@hi5ve.digital') $member = User::whereEmail('howdy@hi5ve.digital')
->first(); ->first();
$owner = User::whereEmail('alice@vuefilemanager.com') $owner = User::whereEmail('alice@hi5ve.digital')
->first(); ->first();
$folder = Folder::factory() $folder = Folder::factory()

View File

@@ -1,6 +1,7 @@
<?php <?php
namespace App\Providers; namespace App\Providers;
use Auth;
use DB; use DB;
use App\Users\Models\User; use App\Users\Models\User;
use Domain\Files\Models\File; use Domain\Files\Models\File;
@@ -89,11 +90,14 @@ class AuthServiceProvider extends ServiceProvider
private function team_member_guard(Folder | File $item, ?User $user, $ability): bool private function team_member_guard(Folder | File $item, ?User $user, $ability): bool
{ {
$teamFolder = $item->getLatestParent();
$membership = DB::table('team_folder_members') $membership = DB::table('team_folder_members')
->where('parent_id', $item->getLatestParent()->id) ->where('parent_id', $teamFolder->id)
->where('user_id', $user->id) ->where('user_id', $user->id)
->first(); ->first();
return $membership?->permission === $ability; // check existing members permission or check team folder owner privileges
return $membership?->permission === $ability || $teamFolder->user_id === Auth::id();
} }
} }

View File

@@ -21,7 +21,7 @@ class DeleteUserDataAction
Storage::deleteDirectory("files/$user->id"); Storage::deleteDirectory("files/$user->id");
// Delete all user records in database // Delete all user records in database
collect(['folders', 'files', 'user_settings', 'shares', 'favourite_folder', 'zips', 'traffic']) collect(['folders', 'files', 'user_settings', 'shares', 'favourite_folder', 'traffic'])
->each(function ($table) use ($user) { ->each(function ($table) use ($user) {
DB::table($table) DB::table($table)
->whereUserId($user->id) ->whereUserId($user->id)

View File

@@ -28,14 +28,13 @@ class ShareController extends Controller
CreateShareRequest $request, CreateShareRequest $request,
SendViaEmailAction $sendLinkToEmailAction, SendViaEmailAction $sendLinkToEmailAction,
): ShareResource { ): ShareResource {
$type = $request->input('type') === 'folder' ? 'folder' : 'file'; $item = get_item($request->input('type'), $request->input('id'));
$item = get_item($request->input('id'), $type);
$this->authorize('owner', $item); $this->authorize('owner', $item);
$shared = Share::create([ $shared = Share::create([
'password' => $request->has('password') ? bcrypt($request->input('password')) : null, 'password' => $request->has('password') ? bcrypt($request->input('password')) : null,
'type' => $type, 'type' => $request->input('type') === 'folder' ? 'folder' : 'file',
'is_protected' => $request->input('isPassword'), 'is_protected' => $request->input('isPassword'),
'permission' => $request->input('permission') ?? null, 'permission' => $request->input('permission') ?? null,
'expire_in' => $request->input('expiration') ?? null, 'expire_in' => $request->input('expiration') ?? null,

View File

@@ -33,13 +33,11 @@ class TeamFoldersController extends Controller
$folders = Folder::where('parent_id', $id) $folders = Folder::where('parent_id', $id)
->where('team_folder', ! Str::isUuid($id)) ->where('team_folder', ! Str::isUuid($id))
->where('user_id', Auth::id())
->sortable() ->sortable()
->get(); ->get();
if ($id) { if ($id) {
$files = File::where('parent_id', $id) $files = File::where('parent_id', $id)
->where('user_id', Auth::id())
->sortable() ->sortable()
->get(); ->get();
} }

View File

@@ -16,12 +16,12 @@ class UserShareTest extends TestCase
*/ */
public function it_share_single_file_without_password() public function it_share_single_file_without_password()
{ {
$file = File::factory(File::class)
->create();
$user = User::factory(User::class) $user = User::factory(User::class)
->create(); ->create();
$file = File::factory(File::class)
->create(['user_id' => $user->id]);
$this $this
->actingAs($user) ->actingAs($user)
->postJson('/api/share', [ ->postJson('/api/share', [
@@ -49,12 +49,12 @@ class UserShareTest extends TestCase
*/ */
public function it_share_folder_without_password() public function it_share_folder_without_password()
{ {
$folder = Folder::factory(Folder::class)
->create();
$user = User::factory(User::class) $user = User::factory(User::class)
->create(); ->create();
$folder = Folder::factory(Folder::class)
->create(['user_id' => $user->id]);
$this $this
->actingAs($user) ->actingAs($user)
->postJson('/api/share', [ ->postJson('/api/share', [
@@ -82,12 +82,12 @@ class UserShareTest extends TestCase
*/ */
public function it_share_folder_with_password() public function it_share_folder_with_password()
{ {
$folder = Folder::factory(Folder::class)
->create();
$user = User::factory(User::class) $user = User::factory(User::class)
->create(); ->create();
$folder = Folder::factory(Folder::class)
->create(['user_id' => $user->id]);
$this $this
->actingAs($user) ->actingAs($user)
->postJson('/api/share', [ ->postJson('/api/share', [
@@ -121,12 +121,12 @@ class UserShareTest extends TestCase
*/ */
public function it_share_folder_with_expiration_time() public function it_share_folder_with_expiration_time()
{ {
$folder = Folder::factory(Folder::class)
->create();
$user = User::factory(User::class) $user = User::factory(User::class)
->create(); ->create();
$folder = Folder::factory(Folder::class)
->create(['user_id' => $user->id]);
$this $this
->actingAs($user) ->actingAs($user)
->postJson('/api/share', [ ->postJson('/api/share', [
@@ -148,12 +148,12 @@ class UserShareTest extends TestCase
*/ */
public function it_share_folder_and_send_link_for_multiple_email() public function it_share_folder_and_send_link_for_multiple_email()
{ {
$folder = Folder::factory(Folder::class)
->create();
$user = User::factory(User::class) $user = User::factory(User::class)
->create(); ->create();
$folder = Folder::factory(Folder::class)
->create(['user_id' => $user->id]);
$this $this
->actingAs($user) ->actingAs($user)
->postJson('/api/share', [ ->postJson('/api/share', [
@@ -175,12 +175,12 @@ class UserShareTest extends TestCase
*/ */
public function it_send_existing_shared_folder_for_multiple_email_once_again() public function it_send_existing_shared_folder_for_multiple_email_once_again()
{ {
$folder = Folder::factory(Folder::class)
->create();
$user = User::factory(User::class) $user = User::factory(User::class)
->create(); ->create();
$folder = Folder::factory(Folder::class)
->create(['user_id' => $user->id]);
Sanctum::actingAs($user); Sanctum::actingAs($user);
$this->postJson('/api/share', [ $this->postJson('/api/share', [
@@ -202,17 +202,15 @@ class UserShareTest extends TestCase
/** /**
* @test * @test
*
* TODO: pridat test na zmazanie zip
*/ */
public function it_revoke_single_share_record() public function it_revoke_single_share_record()
{ {
$folder = Folder::factory(Folder::class)
->create();
$user = User::factory(User::class) $user = User::factory(User::class)
->create(); ->create();
$folder = Folder::factory(Folder::class)
->create(['user_id' => $user->id]);
Sanctum::actingAs($user); Sanctum::actingAs($user);
$this->postJson('/api/share', [ $this->postJson('/api/share', [