Browse Source

refactor/gui-v2-added-DateTime-Picker

pull/2899/head
Muhammed Mustafa 2 years ago
parent
commit
d4c28d9066
  1. 156
      packages/nc-gui-v2/components/cell/DateTimePicker.vue
  2. 3
      packages/nc-gui-v2/utils/dateTimeUtils.ts

156
packages/nc-gui-v2/components/cell/DateTimePicker.vue

@ -1,146 +1,62 @@
<script setup lang="ts"> <script setup lang="ts">
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { computed, ref, useProject } from '#imports' import { ReadonlyInj } from '~/context'
interface Props {
modelValue?: string
}
const { modelValue } = defineProps<Props>() const { modelValue } = defineProps<Props>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { isMysql } = useProject() interface Props {
const showMessage = ref(false) modelValue: string
}
const localState = computed({ const { isMysql } = useProject()
get() {
if (!modelValue) {
return modelValue
}
const d = /^\d+$/.test(modelValue) ? dayjs(+modelValue) : dayjs(modelValue)
if (d.isValid()) {
showMessage.value = false
return d.format('YYYY-MM-DD HH:mm')
} else {
showMessage.value = true
}
},
set(value?: string) {
if (isMysql) {
emit('update:modelValue', value && dayjs(value).format('YYYY-MM-DD HH:mm:ss'))
} else {
emit('update:modelValue', value && dayjs(value).format('YYYY-MM-DD HH:mm:ssZ'))
}
},
})
/* import dayjs from 'dayjs' const readOnlyMode = inject(ReadonlyInj, false)
import utc from 'dayjs/plugin/utc'
dayjs.extend(utc) let isDateInvalid = $ref(false)
const dateFormat = isMysql ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD HH:mm:ssZ'
export default { const localState = $computed({
name: 'DateTimePickerCell',
props: {
value: [String, Date, Number],
ignoreFocus: Boolean,
},
data: () => ({
showMessage: false,
}),
computed: {
isMysql() {
return ['mysql', 'mysql2'].indexOf(this.$store.getters['project/GtrClientType'])
},
localState: {
get() { get() {
if (!this.value) { if (!modelValue) {
return this.value return undefined
}
const d = /^\d+$/.test(this.value) ? dayjs(+this.value) : dayjs(this.value)
if (d.isValid()) {
this.showMessage = false
return d.format('YYYY-MM-DD HH:mm')
} else {
this.showMessage = true
}
},
set(value) {
if (this.isMysql) {
this.$emit('input', value && dayjs(value).format('YYYY-MM-DD HH:mm:ss'))
} else {
this.$emit('input', value && dayjs(value).format('YYYY-MM-DD HH:mm:ssZ'))
} }
},
},
parentListeners() {
const $listeners = {}
if (this.$listeners.blur) { if (!dayjs(modelValue).isValid()) {
// $listeners.blur = this.$listeners.blur isDateInvalid = true
} return undefined
if (this.$listeners.focus) {
$listeners.focus = this.$listeners.focus
} }
return $listeners return /^\d+$/.test(modelValue) ? dayjs(+modelValue) : dayjs(modelValue)
}, },
}, set(val?: dayjs.Dayjs) {
mounted() { if (!val) {
// listen dialog click:outside event and save on close emit('update:modelValue', null)
if (this.$refs.picker && this.$refs.picker.$children && this.$refs.picker.$children[0]) { return
this.$refs.picker.$children[0].$on('click:outside', () => {
this.$refs.picker.okHandler()
})
} }
if (!this.ignoreFocus) { if (val.isValid()) {
this.$refs.picker.display = true emit('update:modelValue', val?.format(dateFormat))
} }
}, },
} */ })
</script> </script>
<template> <template>
<input v-model="localState" type="datetime-local" /> <a-date-picker
<!-- <div> --> v-model:value="localState"
<!-- <div v-show="!showMessage"> --> :show-time="true"
<!-- <v-datetime-picker --> :bordered="false"
<!-- ref="picker" --> class="!w-full px-1"
<!-- v-model="localState" --> format="YYYY-MM-DD HH:mm"
<!-- class="caption xc-date-time-picker" --> :placeholder="isDateInvalid ? 'Invalid date' : !readOnlyMode ? 'Select date' : ''"
<!-- :text-field-props="{ --> :allow-clear="!readOnlyMode"
<!-- class: 'caption mt-0 pt-0', --> :input-read-only="true"
<!-- flat: true, --> :open="readOnlyMode ? false : undefined"
<!-- solo: true, --> >
<!-- dense: true, --> <template v-if="readOnlyMode" #suffixIcon></template>
<!-- hideDetails: true, --> </a-date-picker>
<!-- }" -->
<!-- :time-picker-props="{ -->
<!-- format: '24hr', -->
<!-- }" -->
<!-- v-on="parentListeners" -->
<!-- /> -->
<!-- </div> -->
<!-- <div v-show="showMessage" class="edit-warning" @dblclick="$refs.picker.display = true"> -->
<!-- &lt;!&ndash; TODO: i18n &ndash;&gt; -->
<!-- ERR: Couldn't parse {{ value }} -->
<!-- </div> -->
<!-- </div> -->
</template> </template>
<style scoped> <style scoped></style>
/*:deep(.v-input),*/
/*:deep(.v-text-field) {*/
/* margin-top: 0 !important;*/
/* padding-top: 0 !important;*/
/* font-size: inherit !important;*/
/*}*/
/*.edit-warning {*/
/* padding: 10px;*/
/* text-align: left;*/
/* color: #e65100;*/
/*}*/
</style>

3
packages/nc-gui-v2/utils/dateTimeUtils.ts

@ -1,9 +1,12 @@
import dayjs from 'dayjs' import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime' import relativeTime from 'dayjs/plugin/relativeTime'
import customParseFormat from 'dayjs/plugin/customParseFormat'
import utc from 'dayjs/plugin/utc' import utc from 'dayjs/plugin/utc'
dayjs.extend(utc) dayjs.extend(utc)
dayjs.extend(relativeTime) dayjs.extend(relativeTime)
dayjs.extend(customParseFormat)
export const timeAgo = (date: any) => { export const timeAgo = (date: any) => {
return dayjs.utc(date).fromNow() return dayjs.utc(date).fromNow()

Loading…
Cancel
Save