feat(files_sharing): Add toggle for federated share display area

Signed-off-by: nfebe <fenn25.fn@gmail.com>
pull/52511/head
nfebe 2025-04-28 18:17:24 +07:00
parent 87bad33496
commit 1c50329fdb
4 changed files with 47 additions and 10 deletions

@ -1,4 +1,5 @@
<?php
/**
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
@ -37,6 +38,7 @@ use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent;
use OCP\AppFramework\Services\IInitialState;
use OCP\Collaboration\Resources\LoadAdditionalScriptsEvent as ResourcesLoadAdditionalScriptsEvent;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Federation\ICloudIdManager;
@ -47,6 +49,7 @@ use OCP\Files\Events\Node\BeforeNodeReadEvent;
use OCP\Group\Events\GroupChangedEvent;
use OCP\Group\Events\GroupDeletedEvent;
use OCP\Group\Events\UserAddedEvent;
use OCP\IAppConfig;
use OCP\IDBConnection;
use OCP\IGroup;
use OCP\Share\Events\ShareCreatedEvent;
@ -111,6 +114,9 @@ class Application extends App implements IBootstrap {
public function boot(IBootContext $context): void {
$context->injectFn([$this, 'registerMountProviders']);
$context->injectFn([$this, 'registerEventsScripts']);
$context->injectFn(function (IInitialState $initialState, IAppConfig $appConfig) {
$initialState->provideInitialState('showFederatedSharesAsInternal', $appConfig->getValueBool(self::APP_ID, 'show_federated_shares_as_internal', false));
});
Helper::registerHooks();

@ -194,11 +194,11 @@ export default {
let shareType = []
const remoteTypes = [ShareType.Remote, ShareType.RemoteGroup]
if (this.isExternal) {
shareType.push(ShareType.Remote)
shareType.push(ShareType.RemoteGroup)
shareType.push(...remoteTypes)
} else {
// Merge shareType array
shareType = shareType.concat([
ShareType.User,
ShareType.Group,
@ -209,10 +209,9 @@ export default {
ShareType.ScienceMesh,
])
}
if (getCapabilities().files_sharing.public.enabled === true && this.isExternal) {
shareType.push(ShareType.Email)
if (this.config.showFederatedSharesAsInternal) {
shareType.push(...remoteTypes)
}
}
let request = null

@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { getCapabilities } from '@nextcloud/capabilities'
import { loadState } from '@nextcloud/initial-state'
type PasswordPolicyCapabilities = {
enforceNonCommonPassword: boolean
@ -306,4 +307,14 @@ export default class Config {
return this._capabilities?.files_sharing?.public?.custom_tokens
}
/**
* Show federated shares as internal shares
* @return {boolean}
*/
get showFederatedSharesAsInternal(): boolean {
const showFederatedSharesAsInternal = loadState('files_sharing', 'showFederatedSharesAsInternal', false)
return !!showFederatedSharesAsInternal
}
}

@ -50,7 +50,7 @@
:link-shares="linkShares"
:reshare="reshare"
:shares="shares"
:placeholder="t('files_sharing', 'Share with accounts and teams')"
:placeholder="internalShareInputPlaceholder"
@open-sharing-details="toggleShareDetailsView" />
<!-- other shares list -->
@ -90,7 +90,7 @@
:file-info="fileInfo"
:link-shares="linkShares"
:is-external="true"
:placeholder="t('files_sharing', 'Email, federated cloud id')"
:placeholder="externalShareInputPlaceholder"
:reshare="reshare"
:shares="shares"
@open-sharing-details="toggleShareDetailsView" />
@ -249,6 +249,18 @@ export default {
return !!(this.fileInfo.permissions & OC.PERMISSION_SHARE)
|| !!(this.reshare && this.reshare.hasSharePermission && this.config.isResharingAllowed)
},
internalShareInputPlaceholder() {
return this.config.showFederatedSharesAsInternal
? t('files_sharing', 'Share with accounts, teams, federated cloud id')
: t('files_sharing', 'Share with accounts and teams')
},
externalShareInputPlaceholder() {
return this.config.showFederatedSharesAsInternal
? t('files_sharing', 'Email')
: t('files_sharing', 'Email, federated cloud id')
},
},
methods: {
@ -369,7 +381,11 @@ export default {
if ([ShareType.Link, ShareType.Email].includes(share.type)) {
this.linkShares.push(share)
} else if ([ShareType.Remote, ShareType.RemoteGroup].includes(share.type)) {
this.externalShares.push(share)
if (this.config.showFederatedSharesAsInternal) {
this.shares.push(share)
} else {
this.externalShares.push(share)
}
} else {
this.shares.push(share)
}
@ -439,6 +455,11 @@ export default {
if (share.type === ShareType.Email) {
this.linkShares.unshift(share)
} else if ([ShareType.Remote, ShareType.RemoteGroup].includes(share.type)) {
if (this.config.showFederatedSharesAsInternal) {
this.shares.unshift(share)
} else {
this.externalShares.unshift(share)
}
this.externalShares.unshift(share)
} else {
this.shares.unshift(share)