From 77cc60e0edd627d3bbed63f0e34b13822b387baf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?= Date: Mon, 15 Mar 2021 11:48:15 +0100 Subject: [PATCH] New member button and virtual list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ (skjnldsv) --- .eslintrc.js | 20 +- package.json | 3 +- src/components/AppContent/CircleContent.vue | 24 ++- .../AppNavigation/CircleNavigationItem.vue | 24 ++- .../AppNavigation/RootNavigation.vue | 10 +- .../Settings/SettingsImportContacts.vue | 2 +- .../EntityPicker/ContactsPicker.vue | 2 +- src/components/EntityPicker/EntityBubble.vue | 1 + src/components/EntityPicker/EntityPicker.vue | 90 ++++++-- .../EntityPicker/EntitySearchResult.vue | 6 + src/components/MemberList.vue | 197 +++++++++++++++++- .../MembersListItem.vue} | 109 ++++++---- src/models/circle.d.ts | 142 +++++++++++++ src/models/{circle.js => circle.ts} | 162 +++++--------- src/models/constants.d.ts | 68 ++++++ src/models/constants.js | 75 ------- src/models/constants.ts | 133 ++++++++++++ src/models/member.d.ts | 76 +++++++ src/models/{member.js => member.ts} | 71 +++---- src/router/index.js | 10 +- src/services/circles.d.ts | 101 +++++++++ src/services/{circles.js => circles.ts} | 62 +++--- src/services/collaborationAutocompletion.js | 141 +++++++++++++ src/store/circles.js | 44 ++-- src/views/Contacts.vue | 21 +- tsconfig.json | 14 ++ webpack.js | 8 + 27 files changed, 1242 insertions(+), 374 deletions(-) rename src/components/{MemberList/MemberListItem.vue => MembersList/MembersListItem.vue} (67%) create mode 100644 src/models/circle.d.ts rename src/models/{circle.js => circle.ts} (55%) create mode 100644 src/models/constants.d.ts delete mode 100644 src/models/constants.js create mode 100644 src/models/constants.ts create mode 100644 src/models/member.d.ts rename src/models/{member.js => member.ts} (71%) create mode 100644 src/services/circles.d.ts rename src/services/{circles.js => circles.ts} (52%) create mode 100644 src/services/collaborationAutocompletion.js create mode 100644 tsconfig.json diff --git a/.eslintrc.js b/.eslintrc.js index 307f668a..a532df9e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,8 +1,20 @@ module.exports = { globals: { - appVersion: true + appVersion: true, + }, + + plugins: ['import'], + extends: ['@nextcloud'], + + settings: { + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + paths: './tsconfig.json', + }, + }, }, - extends: [ - '@nextcloud' - ] } diff --git a/package.json b/package.json index db5467c3..d96d2dae 100644 --- a/package.json +++ b/package.json @@ -36,13 +36,14 @@ "@mattkrick/sanitize-svg": "^0.3.1", "@nextcloud/auth": "^1.3.0", "@nextcloud/axios": "^1.6.0", + "@nextcloud/capabilities": "^1.0.4", "@nextcloud/dialogs": "^3.1.2", "@nextcloud/event-bus": "^1.2.0", "@nextcloud/initial-state": "^1.2.0", "@nextcloud/l10n": "^1.4.1", "@nextcloud/moment": "^1.1.1", "@nextcloud/paths": "^1.1.2", - "@nextcloud/router": "^1.2.0", + "@nextcloud/router": "^2.0.0", "@nextcloud/vue": "^3.9.0", "axios": "^0.21.1", "b64-to-blob": "^1.2.19", diff --git a/src/components/AppContent/CircleContent.vue b/src/components/AppContent/CircleContent.vue index d382ae16..164aaf5b 100644 --- a/src/components/AppContent/CircleContent.vue +++ b/src/components/AppContent/CircleContent.vue @@ -50,7 +50,7 @@ - {{ t('contacts', 'Joining circle') }} + {{ t('contacts', 'Your request to join this circle is pending approval') }} @@ -76,7 +76,8 @@ import EmptyContent from '@nextcloud/vue/dist/Components/EmptyContent' import CircleDetails from '../CircleDetails' import MemberList from '../MemberList' import RouterMixin from '../../mixins/RouterMixin' -import { MEMBER_LEVEL_NONE } from '../../models/constants' +import { joinCircle } from '../../services/circles.ts' +import { showError } from '@nextcloud/dialogs' export default { name: 'CircleContent', @@ -123,14 +124,6 @@ export default { isEmptyCircle() { return this.members.length === 0 }, - - /** - * Is the current user member of this circle? - * @returns {boolean} - */ - isMemberOfCircle() { - return this.circle.initiator?.level > MEMBER_LEVEL_NONE - }, }, watch: { @@ -150,8 +143,17 @@ export default { /** * Request to join this circle */ - requestJoin() { + async requestJoin() { this.loadingJoin = true + + try { + await joinCircle(this.circle.id) + } catch (error) { + showError(t('contacts', 'Unable to join the circle')) + } finally { + this.loadingJoin = false + } + }, }, } diff --git a/src/components/AppNavigation/CircleNavigationItem.vue b/src/components/AppNavigation/CircleNavigationItem.vue index 32846d5f..26838678 100644 --- a/src/components/AppNavigation/CircleNavigationItem.vue +++ b/src/components/AppNavigation/CircleNavigationItem.vue @@ -41,7 +41,7 @@ {{ copyButtonText }} @@ -49,7 +49,7 @@ {{ t('contacts', 'Leave circle') }} {{ joinButtonTitle }} diff --git a/src/components/MemberList/MemberListItem.vue b/src/components/MembersList/MembersListItem.vue similarity index 67% rename from src/components/MemberList/MemberListItem.vue rename to src/components/MembersList/MembersListItem.vue index f47495f6..19e67906 100644 --- a/src/components/MemberList/MemberListItem.vue +++ b/src/components/MembersList/MembersListItem.vue @@ -22,13 +22,14 @@