client/containers/settings-modal/components/settings-date-format.vue (198 lines of code) (raw):

<script> // Copyright (c) 2017-2024 Uber Technologies Inc. // // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { FlexGrid, FlexGridItem, SelectInput, SettingsFooter, TextInput, } from '~components'; import { getDatetimeFormattedString } from '~helpers'; export default { name: 'settings-date-format', props: { dateFormat: { type: String, }, dateFormatOptions: { type: Array, }, timeFormat: { type: String, }, timeFormatOptions: { type: Array, }, timezone: { type: String, }, timezoneOptions: { type: Array, }, }, data() { return { exampleDate: new Date(), modalDateFormat: this.getModalDateFormat(this.dateFormat), modalTimeFormat: this.getModalTimeFormat(this.timeFormat), modalTimezone: this.getModalTimezone(this.timezone), }; }, computed: { exampleFormattedDateTime() { return getDatetimeFormattedString({ date: this.exampleDate, dateFormat: this.modalDateFormat.value, timeFormat: this.modalTimeFormat.value, timezone: this.modalTimezone.value, }); }, isDateFormatChanged() { return this.modalDateFormat.value !== this.dateFormat; }, isSettingsChanged() { return ( this.isDateFormatChanged || this.isTimeFormatChanged || this.isTimezoneChanged ); }, isTimeFormatChanged() { return this.modalTimeFormat.value !== this.timeFormat; }, isTimezoneChanged() { return this.modalTimezone.value !== this.timezone; }, }, methods: { getModalDateFormat(dateFormat) { return this.dateFormatOptions.find(({ value }) => dateFormat === value); }, getModalTimeFormat(timeFormat) { return this.timeFormatOptions.find(({ value }) => timeFormat === value); }, getModalTimezone(timezone) { return this.timezoneOptions.find(({ value }) => timezone === value); }, onClose() { this.$emit('close'); }, onDateFormatChange(dateFormat) { this.modalDateFormat = dateFormat; }, onTimeFormatChange(timeFormat) { this.modalTimeFormat = timeFormat; }, onTimezoneChange(timezone) { this.modalTimezone = timezone; }, onSubmit() { this.$emit('change', { ...(this.isDateFormatChanged && { dateFormat: this.modalDateFormat.value, }), ...(this.isTimeFormatChanged && { timeFormat: this.modalTimeFormat.value, }), ...(this.isTimezoneChanged && { timezone: this.modalTimezone.value }), }); }, setModalDateFormat(dateFormat) { this.modalDateFormat = this.getModalDateFormat(dateFormat); }, setModalTimeFormat(timeFormat) { this.modalTimeFormat = this.getModalTimeFormat(timeFormat); }, setModalTimezone(timezone) { this.modalTimezone = this.getModalTimezone(timezone); }, }, components: { 'flex-grid': FlexGrid, 'flex-grid-item': FlexGridItem, 'settings-footer': SettingsFooter, 'select-input': SelectInput, 'text-input': TextInput, }, watch: { dateFormat(dateFormat) { this.setModalDateFormat(dateFormat); }, timeFormat(timeFormat) { this.setModalTimeFormat(timeFormat); }, timezone(timezone) { this.setModalTimezone(timezone); }, }, }; </script> <template> <div> <div class="content"> <div class="content-item"> <text-input label="Example" name="settingsExample" :readonly="true" :value="exampleFormattedDateTime" /> </div> <div class="content-item"> <flex-grid> <flex-grid-item grow="1"> <select-input label="Date format" name="settingsDateFormat" :options="dateFormatOptions" :value="modalDateFormat" @change="onDateFormatChange" /> </flex-grid-item> <flex-grid-item grow="1"> <select-input label="Time format" name="settingsTimeFormat" :options="timeFormatOptions" :value="modalTimeFormat" @change="onTimeFormatChange" /> </flex-grid-item> <flex-grid-item grow="1"> <select-input label="Timezone" name="settingsTimezone" :options="timezoneOptions" :value="modalTimezone" @change="onTimezoneChange" /> </flex-grid-item> </flex-grid> </div> </div> <settings-footer :submit-enabled="isSettingsChanged" @cancel="onClose" @submit="onSubmit" /> </div> </template>