diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2020-10-17 20:12:00 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-17 20:12:00 +0900 |
| commit | 7199e6f4e0b3a2c2bc198e689c3e0cd0d0f0354a (patch) | |
| tree | 2263a06acec7fa21882366bae26d1a983ce21135 /src/client/pages/my-groups | |
| parent | CW の input でも投稿ショートカットが動作するように (#6690) (diff) | |
| download | misskey-7199e6f4e0b3a2c2bc198e689c3e0cd0d0f0354a.tar.gz misskey-7199e6f4e0b3a2c2bc198e689c3e0cd0d0f0354a.tar.bz2 misskey-7199e6f4e0b3a2c2bc198e689c3e0cd0d0f0354a.zip | |
Migrate to Vue3 (#6587)
* Update reaction.vue
* fix bug
* wip
* wip
* wjio
* wip
* Revert "wip"
This reverts commit e427f2160adf4e8a4147006e25a89854edab0033.
* wip
* wip
* wip
* Update init.ts
* Update drive-window.vue
* wip
* wip
* Use PascalCase for components
* Use PascalCase for components
* update dep
* wip
* wip
* wip
* Update init.ts
* wip
* Update paging.ts
* Update test.vue
* watch deep
* wip
* lint
* wip
* wip
* wip
* wip
* wiop
* wip
* Update webpack.config.ts
* alllow null poll
* wip
* wip
* wip
* wiop
* UI redesign & refactor (#6714)
* wip
* wip
* wip
* wip
* wip
* Update drive.vue
* Update word-mute.vue
* wip
* wip
* wip
* clean up
* wip
* Update default.vue
* wip
* Update notes.vue
* Update mfm.ts
* Update index.home.vue
* Update post-form.vue
* Update post-form-attaches.vue
* wip
* Update post-form.vue
* Update sidebar.vue
* wip
* wip
* Update index.vue
* wip
* Update default.vue
* Update index.vue
* Update index.vue
* wip
* Update post-form-attaches.vue
* Update note.vue
* wip
* clean up
* Update notes.vue
* wip
* wip
* Update ja-JP.yml
* wip
* wip
* Update index.vue
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* Update default.vue
* wip
* Update _dark.json5
* wip
* wip
* wip
* clean up
* wip
* wip
* Update index.vue
* Update test.vue
* wip
* wip
* fix
* wip
* wip
* wip
* wip
* clena yop
* wip
* wip
* Update store.ts
* Update messaging-room.vue
* Update default.widgets.vue
* fix
* wip
* wip
* Update modal.vue
* wip
* Update os.ts
* Update os.ts
* Update deck.vue
* Update init.ts
* wip
* Update ja-JP.yml
* v-sizeは単にwindowのresizeを監視するだけで良いかもしれない
* Update modal.vue
* wip
* Update tooltip.ts
* wip
* wip
* wip
* wip
* wip
* Update image-viewer.vue
* wip
* wip
* Update style.scss
* Update style.scss
* Update visitor.vue
* wip
* Update init.ts
* Update init.ts
* wip
* wip
* Update visitor.vue
* Update visitor.vue
* Update visitor.vue
* Update visitor.vue
* wip
* wip
* Update modal.vue
* Update header.vue
* Update menu.vue
* Update about.vue
* Update about-misskey.vue
* wip
* wip
* Update visitor.vue
* Update tooltip.ts
* wip
* Update drive.vue
* wip
* Update style.scss
* Update header.vue
* wip
* wip
* Update users.user.vue
* Update announcements.vue
* wip
* wip
* wip
* Update emojis.vue
* wip
* Update emojis.vue
* Update style.scss
* Update users.vue
* wip
* Update style.scss
* wip
* Update welcome.entrance.vue
* Update radio.vue
* Update size.ts
* Update emoji-edit-dialog.vue
* wip
* Update emojis.vue
* wip
* Update emojis.vue
* Update emojis.vue
* Update emojis.vue
* wip
* wip
* wip
* wip
* Update file-dialog.vue
* wip
* wip
* Update token-generate-window.vue
* Update notification-setting-window.vue
* wip
* wip
* Update _error_.vue
* Update ja-JP.yml
* wip
* wip
* Update store.ts
* Update emojis.vue
* Update emojis.vue
* Update emojis.vue
* Update announcements.vue
* Update store.ts
* wip
* Update page-editor.vue
* wip
* wip
* Update modal.vue
* wip
* Update select-file.ts
* Update timeline.vue
* Update emojis.vue
* Update os.ts
* wip
* Update user-select.vue
* Update mfm.ts
* Update get-file-info.ts
* Update drive.vue
* Update init.ts
* Update mfm.ts
* wip
* wip
* Update window.vue
* Update note.vue
* wip
* wip
* Update user-info.vue
* wip
* wip
* wip
* wip
* wip
* Update header.vue
* Update header.vue
* wip
* Update explore.vue
* wip
* wip
* wip
* Update webpack.config.ts
* wip
* wip
* wip
* wip
* wip
* wip
* Update autocomplete.ts
* wip
* wip
* wip
* Update toast.vue
* wip
* Update post-form-dialog.vue
* wip
* wip
* wip
* wip
* wip
* Update users.vue
* wip
* Update explore.vue
* wip
* wip
* wip
* Update package.json
* wip
* Update icon-dialog.vue
* wip
* wip
* Update user-preview.ts
* wip
* wip
* wip
* wip
* wip
* Update instance.vue
* Update user-name.vue
* Update federation.vue
* Update instance.vue
* wip
* wip
* Update tag.vue
* wip
* wip
* wip
* wip
* wip
* Update instance.vue
* wip
* Update os.ts
* Update os.ts
* wip
* wip
* wip
* Update router.ts
* wip
* Update init.ts
* Update note.vue
* Update messages.vue
* wip
* wip
* wip
* wip
* wip
* google
* wip
* wip
* wip
* wip
* Update theme-editor.vue
* wip
* wip
* Update room.vue
* Update channel-editor.vue
* wip
* Update window.vue
* Update window.vue
* wip
* Update window.vue
* Update window.vue
* wip
* Update menu.vue
* wip
* wip
* wip
* wip
* Update messaging-room.vue
* wip
* Update post-form.vue
* Update default.widgets.vue
* Update window.vue
* wip
Diffstat (limited to 'src/client/pages/my-groups')
| -rw-r--r-- | src/client/pages/my-groups/group.vue | 99 | ||||
| -rw-r--r-- | src/client/pages/my-groups/index.vue | 114 |
2 files changed, 90 insertions, 123 deletions
diff --git a/src/client/pages/my-groups/group.vue b/src/client/pages/my-groups/group.vue index 5ac6db8e98..008c71d1fa 100644 --- a/src/client/pages/my-groups/group.vue +++ b/src/client/pages/my-groups/group.vue @@ -1,63 +1,58 @@ <template> <div class="mk-group-page"> - <portal to="icon"><fa :icon="faUsers"/></portal> - <portal to="title">{{ group.name }}</portal> - <transition name="zoom" mode="out-in"> - <div v-if="group" class="_card _vMargin"> + <div v-if="group" class="_section"> <div class="_content"> - <mk-button inline @click="renameGroup()">{{ $t('rename') }}</mk-button> - <mk-button inline @click="transfer()">{{ $t('transfer') }}</mk-button> - <mk-button inline @click="deleteGroup()">{{ $t('delete') }}</mk-button> + <MkButton inline @click="invite()">{{ $t('invite') }}</MkButton> + <MkButton inline @click="renameGroup()">{{ $t('rename') }}</MkButton> + <MkButton inline @click="transfer()">{{ $t('transfer') }}</MkButton> + <MkButton inline @click="deleteGroup()">{{ $t('delete') }}</MkButton> </div> </div> </transition> <transition name="zoom" mode="out-in"> - <div v-if="group" class="_card members _vMargin"> + <div v-if="group" class="_section members _vMargin"> <div class="_title">{{ $t('members') }}</div> <div class="_content"> <div class="users"> - <div class="user" v-for="user in users" :key="user.id"> - <mk-avatar :user="user" class="avatar"/> + <div class="user _panel" v-for="user in users" :key="user.id"> + <MkAvatar :user="user" class="avatar"/> <div class="body"> - <mk-user-name :user="user" class="name"/> - <mk-acct :user="user" class="acct"/> + <MkUserName :user="user" class="name"/> + <MkAcct :user="user" class="acct"/> </div> <div class="action"> - <button class="_button" @click="removeUser(user)"><fa :icon="faTimes"/></button> + <button class="_button" @click="removeUser(user)"><Fa :icon="faTimes"/></button> </div> </div> </div> </div> - <div class="_footer"> - <mk-button inline @click="invite()">{{ $t('invite') }}</mk-button> - </div> </div> </transition> </div> </template> <script lang="ts"> -import Vue from 'vue'; +import { computed, defineComponent } from 'vue'; import { faTimes, faUsers } from '@fortawesome/free-solid-svg-icons'; -import Progress from '../../scripts/loading'; -import MkButton from '../../components/ui/button.vue'; -import MkUserSelect from '../../components/user-select.vue'; - -export default Vue.extend({ - metaInfo() { - return { - title: this.group ? `${this.group.name} | ${this.$t('manageGroups')}` : this.$t('manageGroups') - }; - }, +import Progress from '@/scripts/loading'; +import MkButton from '@/components/ui/button.vue'; +import * as os from '@/os'; +export default defineComponent({ components: { MkButton }, data() { return { + INFO: computed(() => this.group ? { + header: [{ + title: this.group.name, + icon: faUsers, + }], + } : null), group: null, users: [], faTimes, faUsers @@ -75,11 +70,11 @@ export default Vue.extend({ methods: { fetch() { Progress.start(); - this.$root.api('users/groups/show', { + os.api('users/groups/show', { groupId: this.$route.params.group }).then(group => { this.group = group; - this.$root.api('users/show', { + os.api('users/show', { userIds: this.group.userIds }).then(users => { this.users = users; @@ -89,26 +84,16 @@ export default Vue.extend({ }, invite() { - this.$root.new(MkUserSelect, {}).$once('selected', user => { - this.$root.api('users/groups/invite', { + os.selectUser().then(user => { + os.apiWithDialog('users/groups/invite', { groupId: this.group.id, userId: user.id - }).then(() => { - this.$root.dialog({ - type: 'success', - iconOnly: true, autoClose: true - }); - }).catch(e => { - this.$root.dialog({ - type: 'error', - text: e - }); }); }); }, removeUser(user) { - this.$root.api('users/groups/pull', { + os.api('users/groups/pull', { groupId: this.group.id, userId: user.id }).then(() => { @@ -117,7 +102,7 @@ export default Vue.extend({ }, async renameGroup() { - const { canceled, result: name } = await this.$root.dialog({ + const { canceled, result: name } = await os.dialog({ title: this.$t('groupName'), input: { default: this.group.name @@ -125,7 +110,7 @@ export default Vue.extend({ }); if (canceled) return; - await this.$root.api('users/groups/update', { + await os.api('users/groups/update', { groupId: this.group.id, name: name }); @@ -134,39 +119,25 @@ export default Vue.extend({ }, transfer() { - this.$root.new(MkUserSelect, {}).$once('selected', user => { - this.$root.api('users/groups/transfer', { + os.selectUser().then(user => { + os.apiWithDialog('users/groups/transfer', { groupId: this.group.id, userId: user.id - }).then(() => { - this.$root.dialog({ - type: 'success', - iconOnly: true, autoClose: true - }); - }).catch(e => { - this.$root.dialog({ - type: 'error', - text: e - }); }); }); }, async deleteGroup() { - const { canceled } = await this.$root.dialog({ + const { canceled } = await os.dialog({ type: 'warning', text: this.$t('removeAreYouSure', { x: this.group.name }), showCancelButton: true }); if (canceled) return; - await this.$root.api('users/groups/delete', { + await os.apiWithDialog('users/groups/delete', { groupId: this.group.id }); - this.$root.dialog({ - type: 'success', - iconOnly: true, autoClose: true - }); this.$router.push('/my/groups'); } } @@ -177,13 +148,11 @@ export default Vue.extend({ .mk-group-page { > .members { > ._content { - max-height: 400px; - overflow: auto; - > .users { > .user { display: flex; align-items: center; + padding: 16px; > .avatar { width: 50px; diff --git a/src/client/pages/my-groups/index.vue b/src/client/pages/my-groups/index.vue index 30d7dabbfb..f05226faaf 100644 --- a/src/client/pages/my-groups/index.vue +++ b/src/client/pages/my-groups/index.vue @@ -1,70 +1,74 @@ <template> <div class=""> - <portal to="icon"><fa :icon="faUsers"/></portal> - <portal to="title">{{ $t('groups') }}</portal> + <div class="_section" style="padding: 0;"> + <MkTab v-model:value="tab" :items="[{ label: $t('ownedGroups'), value: 'owned' }, { label: $t('joinedGroups'), value: 'joined' }, { label: $t('invites'), icon: faEnvelopeOpenText, value: 'invites' }]"/> + </div> - <mk-button @click="create" primary style="margin: 0 auto var(--margin) auto;"><fa :icon="faPlus"/> {{ $t('createGroup') }}</mk-button> + <div class="_section"> + <div class="_content" v-if="tab === 'owned'"> + <MkButton @click="create" primary style="margin: 0 auto var(--margin) auto;"><Fa :icon="faPlus"/> {{ $t('createGroup') }}</MkButton> - <mk-container :body-togglable="true"> - <template #header><fa :icon="faUsers"/> {{ $t('ownedGroups') }}</template> - <mk-pagination :pagination="ownedPagination" #default="{items}" ref="owned"> - <div class="_card" v-for="group in items" :key="group.id"> - <div class="_title"><router-link :to="`/my/groups/${ group.id }`" class="_link">{{ group.name }}</router-link></div> - <div class="_content"><mk-avatars :user-ids="group.userIds"/></div> - </div> - </mk-pagination> - </mk-container> - - <mk-container :body-togglable="true"> - <template #header><fa :icon="faEnvelopeOpenText"/> {{ $t('invites') }}</template> - <mk-pagination :pagination="invitationPagination" #default="{items}" ref="invitations"> - <div class="_card" v-for="invitation in items" :key="invitation.id"> - <div class="_title">{{ invitation.group.name }}</div> - <div class="_content"><mk-avatars :user-ids="invitation.group.userIds"/></div> - <div class="_footer"> - <mk-button @click="acceptInvite(invitation)" primary inline><fa :icon="faCheck"/> {{ $t('accept') }}</mk-button> - <mk-button @click="rejectInvite(invitation)" primary inline><fa :icon="faBan"/> {{ $t('reject') }}</mk-button> + <MkPagination :pagination="ownedPagination" #default="{items}" ref="owned"> + <div class="_card" v-for="group in items" :key="group.id"> + <div class="_title"><router-link :to="`/my/groups/${ group.id }`" class="_link">{{ group.name }}</router-link></div> + <div class="_content"><MkAvatars :user-ids="group.userIds"/></div> </div> - </div> - </mk-pagination> - </mk-container> + </MkPagination> + </div> - <mk-container :body-togglable="true"> - <template #header><fa :icon="faUsers"/> {{ $t('joinedGroups') }}</template> - <mk-pagination :pagination="joinedPagination" #default="{items}" ref="joined"> - <div class="_card" v-for="group in items" :key="group.id"> - <div class="_title">{{ group.name }}</div> - <div class="_content"><mk-avatars :user-ids="group.userIds"/></div> - </div> - </mk-pagination> - </mk-container> + <div class="_content" v-else-if="tab === 'joined'"> + <MkPagination :pagination="joinedPagination" #default="{items}" ref="joined"> + <div class="_card" v-for="group in items" :key="group.id"> + <div class="_title">{{ group.name }}</div> + <div class="_content"><MkAvatars :user-ids="group.userIds"/></div> + </div> + </MkPagination> + </div> + + <div class="_content" v-else-if="tab === 'invites'"> + <MkPagination :pagination="invitationPagination" #default="{items}" ref="invitations"> + <div class="_card" v-for="invitation in items" :key="invitation.id"> + <div class="_title">{{ invitation.group.name }}</div> + <div class="_content"><MkAvatars :user-ids="invitation.group.userIds"/></div> + <div class="_footer"> + <MkButton @click="acceptInvite(invitation)" primary inline><Fa :icon="faCheck"/> {{ $t('accept') }}</MkButton> + <MkButton @click="rejectInvite(invitation)" primary inline><Fa :icon="faBan"/> {{ $t('reject') }}</MkButton> + </div> + </div> + </MkPagination> + </div> + </div> </div> </template> <script lang="ts"> -import Vue from 'vue'; +import { defineComponent } from 'vue'; import { faUsers, faPlus, faEnvelopeOpenText } from '@fortawesome/free-solid-svg-icons'; -import MkPagination from '../../components/ui/pagination.vue'; -import MkButton from '../../components/ui/button.vue'; -import MkContainer from '../../components/ui/container.vue'; -import MkAvatars from '../../components/avatars.vue'; - -export default Vue.extend({ - metaInfo() { - return { - title: this.$t('groups') as string, - }; - }, +import MkPagination from '@/components/ui/pagination.vue'; +import MkButton from '@/components/ui/button.vue'; +import MkContainer from '@/components/ui/container.vue'; +import MkAvatars from '@/components/avatars.vue'; +import MkTab from '@/components/tab.vue'; +import * as os from '@/os'; +export default defineComponent({ components: { MkPagination, MkButton, MkContainer, + MkTab, MkAvatars, }, data() { return { + INFO: { + header: [{ + title: this.$t('groups'), + icon: faUsers + }], + }, + tab: 'owned', ownedPagination: { endpoint: 'users/groups/owned', limit: 10, @@ -83,32 +87,26 @@ export default Vue.extend({ methods: { async create() { - const { canceled, result: name } = await this.$root.dialog({ + const { canceled, result: name } = await os.dialog({ title: this.$t('groupName'), input: true }); if (canceled) return; - await this.$root.api('users/groups/create', { name: name }); + await os.api('users/groups/create', { name: name }); this.$refs.owned.reload(); - this.$root.dialog({ - type: 'success', - iconOnly: true, autoClose: true - }); + os.success(); }, acceptInvite(invitation) { - this.$root.api('users/groups/invitations/accept', { + os.api('users/groups/invitations/accept', { invitationId: invitation.id }).then(() => { - this.$root.dialog({ - type: 'success', - iconOnly: true, autoClose: true - }); + os.success(); this.$refs.invitations.reload(); this.$refs.joined.reload(); }); }, rejectInvite(invitation) { - this.$root.api('users/groups/invitations/reject', { + os.api('users/groups/invitations/reject', { invitationId: invitation.id }).then(() => { this.$refs.invitations.reload(); |