diff options
author | F. E Noel Nfebe <fenn25.fn@gmail.com> | 2024-06-12 23:55:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-12 23:55:01 +0100 |
commit | 603122d4fee26caf30e279e9207a469c83e23f0d (patch) | |
tree | 1a6efd744d6dfc7caa64ff42aff6364798ad7b17 /apps | |
parent | a11262b212103327584dab89e9a36a932918bff9 (diff) | |
parent | 81190107ba5ed750516474b5b85d9e248d6d5f7e (diff) | |
download | nextcloud-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.vue | 116 | ||||
-rw-r--r-- | apps/files_sharing/src/mixins/ShareDetails.js | 3 | ||||
-rw-r--r-- | apps/files_sharing/src/views/SharingDetailsTab.vue | 1 |
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) } |