import * as DateUtils from 'src/services/date_utils/date_utils.js' import { pollFallback } from 'src/services/poll/poll.service.js' import { library } from '@fortawesome/fontawesome-svg-core' import Select from '../select/select.vue' import { faTimes, faPlus } from '@fortawesome/free-solid-svg-icons' library.add( faTimes, faPlus ) export default { components: { Select }, name: 'PollForm', props: { visible: {}, modelValue: { type: Object, required: true } }, emits: ['update:modelValue'], computed: { pollType: { get () { return pollFallback(this.modelValue, 'pollType') }, set (newVal) { this.modelValue.pollType = newVal } }, options: { get () { return pollFallback(this.modelValue, 'options') }, set (newVal) { this.modelValue.options = newVal } }, expiryAmount: { get () { return pollFallback(this.modelValue, 'expiryAmount') }, set (newVal) { this.modelValue.expiryAmount = newVal } }, expiryUnit: { get () { return pollFallback(this.modelValue, 'expiryUnit') }, set (newVal) { this.modelValue.expiryUnit = newVal } }, pollLimits () { return this.$store.state.instance.pollLimits }, maxOptions () { return this.pollLimits.max_options }, maxLength () { return this.pollLimits.max_option_chars }, expiryUnits () { const allUnits = ['minutes', 'hours', 'days'] const expiry = this.convertExpiryFromUnit return allUnits.filter( unit => this.pollLimits.max_expiration >= expiry(unit, 1) ) }, minExpirationInCurrentUnit () { return Math.ceil( this.convertExpiryToUnit( this.expiryUnit, this.pollLimits.min_expiration ) ) }, maxExpirationInCurrentUnit () { return Math.floor( this.convertExpiryToUnit( this.expiryUnit, this.pollLimits.max_expiration ) ) } }, methods: { clear () { this.pollType = 'single' this.options = ['', ''] this.expiryAmount = 10 this.expiryUnit = 'minutes' }, nextOption (index) { const element = this.$el.querySelector(`#poll-${index + 1}`) if (element) { element.focus() } else { // Try adding an option and try focusing on it const addedOption = this.addOption() if (addedOption) { this.$nextTick(function () { this.nextOption(index) }) } } }, addOption () { if (this.options.length < this.maxOptions) { this.options.push('') return true } return false }, deleteOption (index, event) { if (this.options.length > 2) { this.options.splice(index, 1) } }, convertExpiryToUnit (unit, amount) { // Note: we want seconds and not milliseconds return DateUtils.secondsToUnit(unit, amount) }, convertExpiryFromUnit (unit, amount) { return DateUtils.unitToSeconds(unit, amount) }, expiryAmountChange () { this.expiryAmount = Math.max(this.minExpirationInCurrentUnit, this.expiryAmount) this.expiryAmount = Math.min(this.maxExpirationInCurrentUnit, this.expiryAmount) } } }