aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorF. E Noel Nfebe <fenn25.fn@gmail.com>2024-06-12 23:55:01 +0100
committerGitHub <noreply@github.com>2024-06-12 23:55:01 +0100
commit603122d4fee26caf30e279e9207a469c83e23f0d (patch)
tree1a6efd744d6dfc7caa64ff42aff6364798ad7b17 /apps
parenta11262b212103327584dab89e9a36a932918bff9 (diff)
parent81190107ba5ed750516474b5b85d9e248d6d5f7e (diff)
downloadnextcloud-server-603122d4fee26caf30e279e9207a469c83e23f0d.tar.gz
nextcloud-server-603122d4fee26caf30e279e9207a469c83e23f0d.zip
Merge pull request #45305 from nextcloud/backport/44464/master
44032 fix show new shares without refresh
Diffstat (limited to 'apps')
-rw-r--r--apps/files_sharing/src/components/SharingEntryLink.vue116
-rw-r--r--apps/files_sharing/src/mixins/ShareDetails.js3
-rw-r--r--apps/files_sharing/src/views/SharingDetailsTab.vue1
3 files changed, 82 insertions, 38 deletions
diff --git a/apps/files_sharing/src/components/SharingEntryLink.vue b/apps/files_sharing/src/components/SharingEntryLink.vue
index 03bc77eb519..6413b8226b6 100644
--- a/apps/files_sharing/src/components/SharingEntryLink.vue
+++ b/apps/files_sharing/src/components/SharingEntryLink.vue
@@ -241,6 +241,7 @@ import GeneratePassword from '../utils/GeneratePassword.js'
import Share from '../models/Share.js'
import SharesMixin from '../mixins/SharesMixin.js'
import ShareDetails from '../mixins/ShareDetails.js'
+import { getLoggerBuilder } from '@nextcloud/logger'
export default {
name: 'SharingEntryLink',
@@ -282,6 +283,7 @@ export default {
data() {
return {
+ shareCreationComplete: false,
copySuccess: true,
copied: false,
@@ -290,6 +292,10 @@ export default {
ExternalLegacyLinkActions: OCA.Sharing.ExternalLinkActions.state,
ExternalShareActions: OCA.Sharing.ExternalShareActions.state,
+ logger: getLoggerBuilder()
+ .setApp('files_sharing')
+ .detectUser()
+ .build(),
// tracks whether modal should be opened or not
showQRCode: false,
@@ -453,6 +459,32 @@ export default {
return this.config.isDefaultExpireDateEnforced && this.share && !this.share.id
},
+ sharePolicyHasRequiredProperties() {
+ return this.config.enforcePasswordForPublicLink || this.config.isDefaultExpireDateEnforced
+ },
+
+ requiredPropertiesMissing() {
+ // Ensure share exist and the share policy has required properties
+ if (!this.sharePolicyHasRequiredProperties) {
+ return false
+ }
+
+ if (!this.share) {
+ // if no share, we can't tell if properties are missing or not so we assume properties are missing
+ return true
+ }
+
+ // If share has ID, then this is an incoming link share created from the existing link share
+ // Hence assume required properties
+ if (this.share.id) {
+ return true
+ }
+ // Check if either password or expiration date is missing and enforced
+ const isPasswordMissing = this.config.enforcePasswordForPublicLink && !this.share.password
+ const isExpireDateMissing = this.config.isDefaultExpireDateEnforced && !this.share.expireDate
+
+ return isPasswordMissing || isExpireDateMissing
+ },
// if newPassword exists, but is empty, it means
// the user deleted the original password
hasUnsavedPassword() {
@@ -529,6 +561,7 @@ export default {
* Create a new share link and append it to the list
*/
async onNewLinkShare() {
+ this.logger.debug('onNewLinkShare called (with this.share)', this.share)
// do not run again if already loading
if (this.loading) {
return
@@ -543,28 +576,13 @@ export default {
shareDefaults.expiration = this.formatDateToString(this.config.defaultExpirationDate)
}
+ this.logger.debug('Missing required properties?', this.requiredPropertiesMissing)
// do not push yet if we need a password or an expiration date: show pending menu
- if (this.config.enableLinkPasswordByDefault || this.config.enforcePasswordForPublicLink || this.config.isDefaultExpireDateEnforced) {
+ if (this.sharePolicyHasRequiredProperties && this.requiredPropertiesMissing) {
this.pending = true
+ this.shareCreationComplete = false
- // if a share already exists, pushing it
- if (this.share && !this.share.id) {
- // if the share is valid, create it on the server
- if (this.checkShare(this.share)) {
- try {
- await this.pushNewLinkShare(this.share, true)
- } catch (e) {
- this.pending = false
- console.error(e)
- return false
- }
- return true
- } else {
- this.open = true
- OC.Notification.showTemporary(t('files_sharing', 'Error, please enter proper password and/or expiration date'))
- return false
- }
- }
+ this.logger.info('Share policy requires mandated properties (password)...')
// ELSE, show the pending popovermenu
// if password default or enforced, pre-fill with random one
@@ -586,8 +604,32 @@ export default {
// Nothing is enforced, creating share directly
} else {
+
+ // if a share already exists, pushing it
+ if (this.share && !this.share.id) {
+ // if the share is valid, create it on the server
+ if (this.checkShare(this.share)) {
+ try {
+ this.logger.info('Sending existing share to server', this.share)
+ await this.pushNewLinkShare(this.share, true)
+ this.shareCreationComplete = true
+ this.logger.info('Share created on server', this.share)
+ } catch (e) {
+ this.pending = false
+ this.logger.error('Error creating share', e)
+ return false
+ }
+ return true
+ } else {
+ this.open = true
+ showError(t('files_sharing', 'Error, please enter proper password and/or expiration date'))
+ return false
+ }
+ }
+
const share = new Share(shareDefaults)
await this.pushNewLinkShare(share)
+ this.shareCreationComplete = true
}
},
@@ -627,8 +669,8 @@ export default {
const newShare = await this.createShare(options)
this.open = false
+ this.shareCreationComplete = true
console.debug('Link share created', newShare)
-
// if share already exists, copy link directly on next tick
let component
if (update) {
@@ -670,8 +712,10 @@ export default {
this.onSyncError('pending', message)
}
throw data
+
} finally {
this.loading = false
+ this.shareCreationComplete = true
}
},
async copyLink() {
@@ -774,7 +818,9 @@ export default {
// this.share already exists at this point,
// but is incomplete as not pushed to server
// YET. We can safely delete the share :)
- this.$emit('remove:share', this.share)
+ if (!this.shareCreationComplete) {
+ this.$emit('remove:share', this.share)
+ }
},
},
}
@@ -795,25 +841,21 @@ export default {
min-width: 0;
}
- &__desc {
- display: flex;
- flex-direction: column;
- line-height: 1.2em;
+ &__desc {
+ display: flex;
+ flex-direction: column;
+ line-height: 1.2em;
- p {
- color: var(--color-text-maxcontrast);
- }
+ p {
+ color: var(--color-text-maxcontrast);
+ }
- &__title {
- text-overflow: ellipsis;
- overflow: hidden;
- white-space: nowrap;
+ &__title {
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ }
}
- }
-
- &__copy {
-
- }
&:not(.sharing-entry--share) &__actions {
.new-share-link {
diff --git a/apps/files_sharing/src/mixins/ShareDetails.js b/apps/files_sharing/src/mixins/ShareDetails.js
index 5490506622d..6c50440ff24 100644
--- a/apps/files_sharing/src/mixins/ShareDetails.js
+++ b/apps/files_sharing/src/mixins/ShareDetails.js
@@ -5,6 +5,7 @@
import Share from '../models/Share.js'
+import Config from '../services/ConfigService.js'
export default {
methods: {
@@ -56,7 +57,7 @@ export default {
user: shareRequestObject.shareWith,
share_with_displayname: shareRequestObject.displayName,
subtitle: shareRequestObject.subtitle,
- permissions: shareRequestObject.permissions,
+ permissions: shareRequestObject.permissions ?? new Config().defaultPermissions,
expiration: '',
}
diff --git a/apps/files_sharing/src/views/SharingDetailsTab.vue b/apps/files_sharing/src/views/SharingDetailsTab.vue
index 16bacf5c2c8..9922caf4f4e 100644
--- a/apps/files_sharing/src/views/SharingDetailsTab.vue
+++ b/apps/files_sharing/src/views/SharingDetailsTab.vue
@@ -892,6 +892,7 @@ export default {
this.share = share
this.$emit('add:share', this.share)
} else {
+ this.$emit('update:share', this.share)
this.queueUpdate(...permissionsAndAttributes)
}