diff --git a/apps/files_sharing/src/components/SharingEntry.vue b/apps/files_sharing/src/components/SharingEntry.vue
index 46b65c695eede..7b1063b6f2b25 100644
--- a/apps/files_sharing/src/components/SharingEntry.vue
+++ b/apps/files_sharing/src/components/SharingEntry.vue
@@ -29,139 +29,59 @@
:menu-position="'left'"
:url="share.shareWithAvatar" />
-
- {{ title }} ({{ share.shareWithDisplayNameUnique }})
-
- {{ share.status.icon || '' }}
- {{ share.status.message || '' }}
-
-
-
-
-
-
- {{ t('files_sharing', 'Allow editing') }}
-
-
-
-
- {{ t('files_sharing', 'Allow creating') }}
-
-
-
-
- {{ t('files_sharing', 'Allow deleting') }}
-
-
-
-
- {{ t('files_sharing', 'Allow resharing') }}
-
-
-
- {{ allowDownloadText }}
-
-
-
-
- {{ config.isDefaultInternalExpireDateEnforced
- ? t('files_sharing', 'Expiration date enforced')
- : t('files_sharing', 'Set expiration date') }}
-
-
- {{ t('files_sharing', 'Enter a date') }}
-
-
-
-
-
- {{ t('files_sharing', 'Note to recipient') }}
-
-
-
+
+
+ {{ title }} ({{
+ share.shareWithDisplayNameUnique }})
+
+ {{ share.status.icon || '' }}
+ {{ share.status.message || '' }}
+
+
+
+
+
+
+
-
-
- {{ t('files_sharing', 'Unshare') }}
-
-
+
@@ -465,21 +391,34 @@ export default {
display: flex;
align-items: center;
height: 44px;
+
&__desc {
display: flex;
flex-direction: column;
justify-content: space-between;
- padding: 8px;
+ padding-bottom: 0;
line-height: 1.2em;
+
p {
color: var(--color-text-maxcontrast);
}
+
&-unique {
color: var(--color-text-maxcontrast);
}
}
+
&__actions {
margin-left: auto;
}
+
+ &__summary {
+ padding: 8px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ width: 100%;
+ }
+
}
diff --git a/apps/files_sharing/src/components/SharingEntryLink.vue b/apps/files_sharing/src/components/SharingEntryLink.vue
index 06c9cb708510f..ffe73a3da8854 100644
--- a/apps/files_sharing/src/components/SharingEntryLink.vue
+++ b/apps/files_sharing/src/components/SharingEntryLink.vue
@@ -25,13 +25,17 @@
-
+
{{ title }}
{{ subtitle }}
+
@@ -292,11 +296,14 @@ import NcActionTextEditable from '@nextcloud/vue/dist/Components/NcActionTextEdi
import NcActions from '@nextcloud/vue/dist/Components/NcActions.js'
import NcAvatar from '@nextcloud/vue/dist/Components/NcAvatar.js'
+import QuickShareSelect from './SharingEntryQuickShareSelect.vue'
+
import ExternalShareAction from './ExternalShareAction.vue'
import SharePermissionsEditor from './SharePermissionsEditor.vue'
import GeneratePassword from '../utils/GeneratePassword.js'
import Share from '../models/Share.js'
import SharesMixin from '../mixins/SharesMixin.js'
+import ShareDropDown from '../mixins/ShareDropdown.js'
export default {
name: 'SharingEntryLink',
@@ -313,9 +320,10 @@ export default {
NcAvatar,
ExternalShareAction,
SharePermissionsEditor,
+ QuickShareSelect,
},
- mixins: [SharesMixin],
+ mixins: [SharesMixin, ShareDropDown],
props: {
canReshare: {
@@ -330,6 +338,7 @@ export default {
data() {
return {
+ showDropdown: false,
copySuccess: true,
copied: false,
@@ -671,7 +680,7 @@ export default {
* accordingly
*
* @param {Share} share the new share
- * @param {boolean} [update=false] do we update the current share ?
+ * @param {boolean} [update] do we update the current share ?
*/
async pushNewLinkShare(share, update) {
try {
@@ -870,6 +879,10 @@ export default {
// YET. We can safely delete the share :)
this.$emit('remove:share', this.share)
},
+
+ toggleQuickShareSelect() {
+ this.showDropdown = !this.showDropdown
+ },
},
}
@@ -879,6 +892,7 @@ export default {
display: flex;
align-items: center;
min-height: 44px;
+
&__desc {
display: flex;
flex-direction: column;
diff --git a/apps/files_sharing/src/components/SharingEntryQuickShareSelect.vue b/apps/files_sharing/src/components/SharingEntryQuickShareSelect.vue
new file mode 100644
index 0000000000000..93cc76508c6af
--- /dev/null
+++ b/apps/files_sharing/src/components/SharingEntryQuickShareSelect.vue
@@ -0,0 +1,117 @@
+
+
+
+ {{ selectedOption }}
+
+
+
+
+
+
+
+
+
diff --git a/apps/files_sharing/src/components/SharingEntrySimple.vue b/apps/files_sharing/src/components/SharingEntrySimple.vue
index daff947fe803b..5e858de990b44 100644
--- a/apps/files_sharing/src/components/SharingEntrySimple.vue
+++ b/apps/files_sharing/src/components/SharingEntrySimple.vue
@@ -29,8 +29,8 @@
{{ subtitle }}
-
diff --git a/apps/files_sharing/src/components/SharingInput.vue b/apps/files_sharing/src/components/SharingInput.vue
index 8b740c1bac3b4..fe296f531b356 100644
--- a/apps/files_sharing/src/components/SharingInput.vue
+++ b/apps/files_sharing/src/components/SharingInput.vue
@@ -24,6 +24,7 @@
+ @option:selected="openSharingDetails">
{{ search ? noResultText : t('files_sharing', 'No recommendations. Start typing.') }}
@@ -176,7 +176,7 @@ export default {
* Get suggestions
*
* @param {string} search the search query
- * @param {boolean} [lookup=false] search on lookup server
+ * @param {boolean} [lookup] search on lookup server
*/
async getSuggestions(search, lookup = false) {
this.loading = true
@@ -538,6 +538,14 @@ export default {
this.loading = false
}
},
+ openSharingDetails(value) {
+ const openShareDetailsEventData = {
+ fileInfo: this.fileInfo,
+ share: null,
+ shareRequestValue: value,
+ }
+ this.$emit('open-sharing-details', openShareDetailsEventData)
+ },
},
}
diff --git a/apps/files_sharing/src/mixins/ShareRequests.js b/apps/files_sharing/src/mixins/ShareRequests.js
index e1d246b740016..72c180f50b660 100644
--- a/apps/files_sharing/src/mixins/ShareRequests.js
+++ b/apps/files_sharing/src/mixins/ShareRequests.js
@@ -42,13 +42,13 @@ export default {
* @param {string} data.path path to the file/folder which should be shared
* @param {number} data.shareType 0 = user; 1 = group; 3 = public link; 6 = federated cloud share
* @param {string} data.shareWith user/group id with which the file should be shared (optional for shareType > 1)
- * @param {boolean} [data.publicUpload=false] allow public upload to a public shared folder
+ * @param {boolean} [data.publicUpload] allow public upload to a public shared folder
* @param {string} [data.password] password to protect public link Share with
- * @param {number} [data.permissions=31] 1 = read; 2 = update; 4 = create; 8 = delete; 16 = share; 31 = all (default: 31, for public shares: 1)
- * @param {boolean} [data.sendPasswordByTalk=false] send the password via a talk conversation
- * @param {string} [data.expireDate=''] expire the shareautomatically after
- * @param {string} [data.label=''] custom label
- * @param {string} [data.attributes=null] Share attributes encoded as json
+ * @param {number} [data.permissions] 1 = read; 2 = update; 4 = create; 8 = delete; 16 = share; 31 = all (default: 31, for public shares: 1)
+ * @param {boolean} [data.sendPasswordByTalk] send the password via a talk conversation
+ * @param {string} [data.expireDate] expire the shareautomatically after
+ * @param {string} [data.label] custom label
+ * @param {string} [data.attributes] Share attributes encoded as json
* @return {Share} the new share
* @throws {Error}
*/
@@ -66,7 +66,7 @@ export default {
const errorMessage = error?.response?.data?.ocs?.meta?.message
OC.Notification.showTemporary(
errorMessage ? t('files_sharing', 'Error creating the share: {errorMessage}', { errorMessage }) : t('files_sharing', 'Error creating the share'),
- { type: 'error' }
+ { type: 'error' },
)
throw error
}
@@ -91,7 +91,7 @@ export default {
const errorMessage = error?.response?.data?.ocs?.meta?.message
OC.Notification.showTemporary(
errorMessage ? t('files_sharing', 'Error deleting the share: {errorMessage}', { errorMessage }) : t('files_sharing', 'Error deleting the share'),
- { type: 'error' }
+ { type: 'error' },
)
throw error
}
@@ -118,7 +118,7 @@ export default {
const errorMessage = error?.response?.data?.ocs?.meta?.message
OC.Notification.showTemporary(
errorMessage ? t('files_sharing', 'Error updating the share: {errorMessage}', { errorMessage }) : t('files_sharing', 'Error updating the share'),
- { type: 'error' }
+ { type: 'error' },
)
}
const message = error.response.data.ocs.meta.message
diff --git a/apps/files_sharing/src/views/SharingDetailsTab.vue b/apps/files_sharing/src/views/SharingDetailsTab.vue
new file mode 100644
index 0000000000000..c5f6321fd0a3c
--- /dev/null
+++ b/apps/files_sharing/src/views/SharingDetailsTab.vue
@@ -0,0 +1,565 @@
+
+
+
+
+
+
+ {{ t('files_sharing', 'View only') }}
+
+
+
+
+
+ {{ t('files_sharing', 'Allow upload and editing') }}
+
+
+
+
+
+ {{ t('files_sharing', 'File drop') }}
+ {{ t('files_sharing', 'Upload only') }}
+
+
+
+
+
+ {{ t('files_sharing', 'Custom permissions') }}
+ {{ t('files_sharing', 'Create, read & update') }}
+
+
+
+
+
+
+
+
+ Advanced settings
+
+
+
+
+
+
+
+
+
+
+ {{ t('file_sharing', 'Set password') }}
+
+
+
+
+ {{ t('file_sharing', 'Set expiration date') }}
+
+
+
+ {{ t('file_sharing', 'Hide download') }}
+
+
+
+
+
+ {{ t('file_sharing', 'Custom permissions') }}
+
+
+
+ {{ t('file_sharing', 'Read') }}
+
+
+ {{ t('file_sharing', 'Create') }}
+
+
+ {{ t('file_sharing', 'Update') }}
+
+
+ {{ t('file_sharing', 'Share') }}
+
+
+ {{ t('file_sharing', 'Delete') }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/files_sharing/src/views/SharingList.vue b/apps/files_sharing/src/views/SharingList.vue
index 05dc87d9b0760..eabcf77b6c848 100644
--- a/apps/files_sharing/src/views/SharingList.vue
+++ b/apps/files_sharing/src/views/SharingList.vue
@@ -27,7 +27,8 @@
:file-info="fileInfo"
:share="share"
:is-unique="isUnique(share)"
- @remove:share="removeShare" />
+ @remove:share="removeShare"
+ @open-sharing-details="onOpenSharingDetails(share)" />
@@ -83,6 +84,13 @@ export default {
// eslint-disable-next-line vue/no-mutating-props
this.shares.splice(index, 1)
},
+ onOpenSharingDetails(share) {
+ const openShareDetailsEventData = {
+ fileInfo: this.fileInfo,
+ share,
+ }
+ this.$emit('open-sharing-details', openShareDetailsEventData)
+ },
},
}
diff --git a/apps/files_sharing/src/views/SharingTab.vue b/apps/files_sharing/src/views/SharingTab.vue
index bfaf8a766eed4..9947f0d159555 100644
--- a/apps/files_sharing/src/views/SharingTab.vue
+++ b/apps/files_sharing/src/views/SharingTab.vue
@@ -29,7 +29,7 @@
-
+
@@ -46,7 +46,7 @@
:link-shares="linkShares"
:reshare="reshare"
:shares="shares"
- @add:share="addShare" />
+ @open-sharing-details="toggleShareDetailsView" />
+ :file-info="fileInfo"
+ @open-sharing-details="toggleShareDetailsView" />
@@ -74,6 +75,15 @@
:name="fileInfo.name" />
+
+
+
+
+
{}) {
+ addShare(share, resolve = () => { }) {
// only catching share type MAIL as link shares are added differently
// meaning: not from the ShareInput
if (share.type === this.SHARE_TYPES.SHARE_TYPE_EMAIL) {
@@ -355,6 +369,18 @@ export default {
}
})
},
+
+ toggleShareDetailsView(eventData) {
+ if (eventData) {
+ // If no share request value, set to null
+ // Implies existing share
+ if (!eventData.shareRequestValue) {
+ eventData.shareRequestValue = null
+ }
+ this.shareDetailsData = eventData
+ }
+ this.showSharingDetailsView = !this.showSharingDetailsView
+ },
},
}
@@ -368,6 +394,7 @@ export default {
&__content {
padding: 0 6px;
}
+
&__additionalContent {
margin: 44px 0;
}
diff --git a/apps/settings/src/components/UserList/UserRow.vue b/apps/settings/src/components/UserList/UserRow.vue
new file mode 100644
index 0000000000000..797156f18822a
--- /dev/null
+++ b/apps/settings/src/components/UserList/UserRow.vue
@@ -0,0 +1,689 @@
+
+
+
+
+
+
+
+
+
+ {{ user.id }}
+
+
+ {{ t('settings','You do not have permissions to see the details of this user') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ user.id }}
+
+
+ {{ user.displayname }}
+
+
+
+
+
+
+
+
+ {{ t('settings', 'No results') }}
+
+
+
+
+ {{ t('settings', 'No results') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ feedbackMessage }}
+
+
+
+
+
+
+
diff --git a/apps/settings/src/components/UserList/UserRowSimple.vue b/apps/settings/src/components/UserList/UserRowSimple.vue
new file mode 100644
index 0000000000000..eddc16a64a5cd
--- /dev/null
+++ b/apps/settings/src/components/UserList/UserRowSimple.vue
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+ {{ user.displayname }}
+
+
+
+ {{ user.id }}
+
+
+
+
+ {{ userGroupsLabels }}
+
+
+ {{ userSubAdminsGroupsLabels }}
+
+
+
+ {{ userQuota }} ({{ usedSpace }})
+
+
+
+
+ {{ userLanguage.name }}
+
+
+
+ {{ user.backend }}
+
+
+ {{ user.storageLocation }}
+
+
+
+ {{ userLastLogin }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ feedbackMessage }}
+
+
+
+
+
+
+
+