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/components/poll-editor.vue | |
| parent | CW の input でも投稿ショートカットが動作するように (#6690) (diff) | |
| download | sharkey-7199e6f4e0b3a2c2bc198e689c3e0cd0d0f0354a.tar.gz sharkey-7199e6f4e0b3a2c2bc198e689c3e0cd0d0f0354a.tar.bz2 sharkey-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/components/poll-editor.vue')
| -rw-r--r-- | src/client/components/poll-editor.vue | 127 |
1 files changed, 84 insertions, 43 deletions
diff --git a/src/client/components/poll-editor.vue b/src/client/components/poll-editor.vue index 0687e999b5..5b615677dc 100644 --- a/src/client/components/poll-editor.vue +++ b/src/client/components/poll-editor.vue @@ -1,47 +1,47 @@ <template> <div class="zmdxowus"> <p class="caution" v-if="choices.length < 2"> - <fa :icon="faExclamationTriangle"/>{{ $t('_poll.noOnlyOneChoice') }} + <Fa :icon="faExclamationTriangle"/>{{ $t('_poll.noOnlyOneChoice') }} </p> <ul ref="choices"> <li v-for="(choice, i) in choices" :key="i"> - <mk-input class="input" :value="choice" @input="onInput(i, $event)"> + <MkInput class="input" :value="choice" @update:value="onInput(i, $event)"> <span>{{ $t('_poll.choiceN', { n: i + 1 }) }}</span> - </mk-input> + </MkInput> <button @click="remove(i)" class="_button"> - <fa :icon="faTimes"/> + <Fa :icon="faTimes"/> </button> </li> </ul> - <mk-button class="add" v-if="choices.length < 10" @click="add">{{ $t('add') }}</mk-button> - <mk-button class="add" v-else disabled>{{ $t('_poll.noMore') }}</mk-button> + <MkButton class="add" v-if="choices.length < 10" @click="add">{{ $t('add') }}</MkButton> + <MkButton class="add" v-else disabled>{{ $t('_poll.noMore') }}</MkButton> <section> - <mk-switch v-model="multiple">{{ $t('_poll.canMultipleVote') }}</mk-switch> + <MkSwitch v-model:value="multiple">{{ $t('_poll.canMultipleVote') }}</MkSwitch> <div> - <mk-select v-model="expiration"> + <MkSelect v-model:value="expiration"> <template #label>{{ $t('_poll.expiration') }}</template> <option value="infinite">{{ $t('_poll.infinite') }}</option> <option value="at">{{ $t('_poll.at') }}</option> <option value="after">{{ $t('_poll.after') }}</option> - </mk-select> + </MkSelect> <section v-if="expiration === 'at'"> - <mk-input v-model="atDate" type="date" class="input"> + <MkInput v-model:value="atDate" type="date" class="input"> <span>{{ $t('_poll.deadlineDate') }}</span> - </mk-input> - <mk-input v-model="atTime" type="time" class="input"> + </MkInput> + <MkInput v-model:value="atTime" type="time" class="input"> <span>{{ $t('_poll.deadlineTime') }}</span> - </mk-input> + </MkInput> </section> <section v-if="expiration === 'after'"> - <mk-input v-model="after" type="number" class="input"> + <MkInput v-model:value="after" type="number" class="input"> <span>{{ $t('_poll.duration') }}</span> - </mk-input> - <mk-select v-model="unit"> + </MkInput> + <MkSelect v-model:value="unit"> <option value="second">{{ $t('_time.second') }}</option> <option value="minute">{{ $t('_time.minute') }}</option> <option value="hour">{{ $t('_time.hour') }}</option> <option value="day">{{ $t('_time.day') }}</option> - </mk-select> + </MkSelect> </section> </div> </section> @@ -49,23 +49,33 @@ </template> <script lang="ts"> -import Vue from 'vue'; +import { defineComponent } from 'vue'; import { faExclamationTriangle, faTimes } from '@fortawesome/free-solid-svg-icons'; -import { erase } from '../../prelude/array'; import { addTime } from '../../prelude/time'; import { formatDateTimeString } from '../../misc/format-time-string'; import MkInput from './ui/input.vue'; import MkSelect from './ui/select.vue'; import MkSwitch from './ui/switch.vue'; import MkButton from './ui/button.vue'; +import * as os from '@/os'; -export default Vue.extend({ +export default defineComponent({ components: { MkInput, MkSelect, MkSwitch, MkButton, }, + + props: { + poll: { + type: Object, + required: true + } + }, + + emits: ['updated'], + data() { return { choices: ['', ''], @@ -78,20 +88,66 @@ export default Vue.extend({ faExclamationTriangle, faTimes }; }, + watch: { - choices() { - this.$emit('updated'); - } + poll: { + handler(poll) { + if (poll == null) return; + if (poll.choices.length == 0) return; + this.choices = poll.choices; + if (poll.choices.length == 1) this.choices = this.choices.concat(''); + this.multiple = poll.multiple; + if (poll.expiresAt) { + this.expiration = 'at'; + this.atDate = this.atTime = poll.expiresAt; + } else if (typeof poll.expiredAfter === 'number') { + this.expiration = 'after'; + this.after = poll.expiredAfter; + } else { + this.expiration = 'infinite'; + } + }, + deep: true, + immediate: true + }, + choices: { + handler() { + this.$emit('updated', this.get()); + }, + deep: true + }, + multiple: { + handler() { + this.$emit('updated', this.get()); + }, + }, + expiration: { + handler() { + this.$emit('updated', this.get()); + }, + }, + atDate: { + handler() { + this.$emit('updated', this.get()); + }, + }, + after: { + handler() { + this.$emit('updated', this.get()); + }, + }, }, + methods: { onInput(i, e) { - Vue.set(this.choices, i, e); + this.choices[i] = e; }, add() { this.choices.push(''); this.$nextTick(() => { - (this.$refs.choices as any).childNodes[this.choices.length - 1].childNodes[0].focus(); + // TODO + //(this.$refs.choices as any).childNodes[this.choices.length - 1].childNodes[0].focus(); }); }, @@ -116,29 +172,14 @@ export default Vue.extend({ }; return { - choices: erase('', this.choices), + choices: this.choices, multiple: this.multiple, ...( this.expiration === 'at' ? { expiresAt: at() } : - this.expiration === 'after' ? { expiredAfter: after() } : {}) + this.expiration === 'after' ? { expiredAfter: after() } : {} + ) }; }, - - set(data) { - if (data.choices.length == 0) return; - this.choices = data.choices; - if (data.choices.length == 1) this.choices = this.choices.concat(''); - this.multiple = data.multiple; - if (data.expiresAt) { - this.expiration = 'at'; - this.atDate = this.atTime = data.expiresAt; - } else if (typeof data.expiredAfter === 'number') { - this.expiration = 'after'; - this.after = data.expiredAfter; - } else { - this.expiration = 'infinite'; - } - } } }); </script> |