diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 62b2ddf004..2484375334 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1628,6 +1628,9 @@ mobile/views/pages/user.vue: block: "ブロック" unblock: "ブロック解除" years-old: "{age}歳" + push-to-list: "リストに追加" + select-list: "リストを選択してください" + list-pushed: "{user}を{list}に追加しました" mobile/views/pages/user/home.vue: recent-notes: "最近の投稿" diff --git a/src/client/app/common/views/components/alert.vue b/src/client/app/common/views/components/alert.vue index d48defe8a7..abbdb8536e 100644 --- a/src/client/app/common/views/components/alert.vue +++ b/src/client/app/common/views/components/alert.vue @@ -2,9 +2,12 @@
-
+
+ + + OK Cancel @@ -33,6 +36,9 @@ export default Vue.extend({ type: String, required: false }, + select: { + required: false + }, showCancelButton: { type: Boolean, default: false @@ -43,6 +49,12 @@ export default Vue.extend({ } }, + data() { + return { + selectedValue: null + }; + }, + computed: { icon(): any { switch (this.type) { @@ -83,7 +95,8 @@ export default Vue.extend({ methods: { ok() { - this.$emit('ok'); + const result = this.select ? this.selectedValue : true; + this.$emit('ok', result); this.close(); }, @@ -180,8 +193,11 @@ export default Vue.extend({ display block margin 0 auto + & + header + margin-top 16px + > header - margin 16px 0 8px 0 + margin 0 0 8px 0 font-weight bold font-size 20px diff --git a/src/client/app/desktop/views/pages/user/user.profile.vue b/src/client/app/desktop/views/pages/user/user.profile.vue index fcd4aebdac..4d45b2433c 100644 --- a/src/client/app/desktop/views/pages/user/user.profile.vue +++ b/src/client/app/desktop/views/pages/user/user.profile.vue @@ -109,8 +109,12 @@ export default Vue.extend({ userId: this.user.id }); this.$root.alert({ + type: 'success', title: 'Done!', - text: this.$t('list-pushed').replace('{user}', this.user.name).replace('{list}', list.title) + text: this.$t('list-pushed', { + user: this.user.name, + list: list.title + }) }); }); } diff --git a/src/client/app/init.ts b/src/client/app/init.ts index 7a74311098..e0eef935f5 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -460,7 +460,7 @@ export default (callback: (launch: (router: VueRouter) => [Vue, MiOS]) => void, alert(opts) { return new Promise((res) => { const vm = this.new(Alert, opts); - vm.$once('ok', () => res(true)); + vm.$once('ok', result => res(result)); vm.$once('cancel', () => res(false)); }); } diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue index 3187f09f47..7e167d83d7 100644 --- a/src/client/app/mobile/views/pages/user.vue +++ b/src/client/app/mobile/views/pages/user.vue @@ -116,6 +116,34 @@ export default Vue.extend({ menu() { let menu = [{ + icon: ['far', 'list'], + text: this.$t('push-to-list'), + action: async () => { + const lists = await this.$root.api('users/lists/list'); + const listId = await this.$root.alert({ + type: null, + title: this.$t('select-list'), + select: { + items: lists.map(list => ({ + value: list.id, text: list.title + })) + }, + showCancelButton: true + }); + if (listId == null) return; + await this.$root.api('users/lists/push', { + listId: listId, + userId: this.user.id + }); + this.$root.alert({ + type: 'success', + text: this.$t('list-pushed', { + user: this.user.name, + list: lists.find(l => l.id === listId).title + }) + }); + } + }, null, { icon: this.user.isMuted ? ['fas', 'eye'] : ['far', 'eye-slash'], text: this.user.isMuted ? this.$t('unmute') : this.$t('mute'), action: () => {