Files
nocodb/packages/nc-gui/components/cell/GeoData.vue
Ramesh Mane 2640656ddd Nc feat/new field modal (#8578)
* fix(nc-gui): remove field modal title & type selector label

* fix(nc-gui): hide default value input initially

* fix(nc-gui): remove clear icon from default value input

* fix(nc-gui): update email, phone, url column validation settings ui

* fix(nc-gui): add missing validate field condition

* fix(nc-gui): update long text field modal ui

* fix(nc-gui): update default field modal width & enable rich text option

* fix(nc-gui): small changes

* fix(nc-gui): hide default value input only if user clicks on delete icon

* fix(nc-gui): decimal field option ui

* fix(nc-gui): update percent option ui

* fix(nc-gui): small changes

* fix(nc-gui): update field modal switch option alignment

* fix(nc-gui): update date & dateTime field modal options

* feat(nc-gui): add 12, 24 hrs time format option in field modal

* feat(nc-gui): add 12hr time cell format support

* fix(nc-gui): update time cell placeholder according to time format

* fix(nc-gui): field modal default value option visibility issue

* fix(nc-gui): update barcode, qr code field modal option

* fix(nc-gui): field modal expanded json input modal overlay click issue

* fix(nc-gui): currency code option from field modal

* fix(nc-gui): udpate duration option

* fix(nc-gui): date time cell clear icon visibility issue in link record dropdown

* fix(nc-gui): update field modal lookup options

* fix(nc-gui): update user option from field modal

* fix(nc-gui): update rollup option from field modal

* fix(nc-gui): update select field type ui for create column

* fix(nc-gui): update field modal cancel & save btn alignment

* fix(nc-gui): update formula option margin

* fic(nc-gui): update select type option

* fix(nc-gui): small changes

* fix(nc-gui): update links field options

* fix(nc-gui): small changes

* fix(nc-gui): select option border issue

* fix(nc-gui): add new color picker

* fix(nc-gui): update rating field options

* fix(nc-gui): update geodata field options

* fix(nc-gui): geodata option small changes

* fix(nc-gui): add new color picker for select type options

* fix(nc-gui): show only title & field type list if uidt is null

* feat(nc-gui): add 12hrs time support in dateTime cell

* fix(nc-gui): formula suggestion list visibility issue

* fix(nc-gui): reduce formaula suggestion fields icon size

* fix(nc-gui): rich text default value visibility issue in field modal

* fix(nc-gui): update rich text default value bubble menu option

* fix(nc-gui): some pr review changes

* fix(nc-gui): remove example from duration format

* feat(nc-gui): add keyboard navigation support for field list

* fix(nc-gui): update email, url, phone validate text

* fix(nc-gui): update qr & barcode value select input

* fix(nc-gui): pr review changes

* test: update create column test cases

* fix(nc-gui): remove required symbol from field modal inputs

* fix(nc-gui): remove delete default value icon and add cross icon in default input itself

* test: update duration field type test

* fix(nc-gui): update column name & type input shadow

* fix(nc-gui): add hover effect on selected type

* fix(nc-gui): enabel rich text case update

* fix(nc-gui): update select options

* fix(nc-gui): show full time format in edit modal default value

* fix(nc-gui): remove optional placeholder of default value

* fix(nc-gui): instead of removing field type option disable it if it is onlyNameUpdateOnEditColumns

* fix(nc-gui): update links field icons from field modal

* fix(nc-gui): add links options in edit modal

* fix(nc-gui): show links config and disable if it is not editable in edit column mode

* fix(nc-gui): add support to configure date time format for create & last modified type field

* fix(nc-gui): virtual field icon visibility issue if it is edit mode

* fix(nc-gui): disabled edit option from field context menu if column is pk or system column

* fix(nc-gui): update field modal submit btn text

* fix(nc-gui): add shdow on input field in field modal

* fix(nc-gui): disable submit btn if field modal has some warnings

* test: update field add/edit save test case

* test: update links column add/edit test cases

* test: uncomment code

* test: update user field default value update test cases

* test: update select type option default value

* test: update multi field editor test cases

* test: update kanban view add option test cases

* test: update multifield editor test cases

* test: update create column keyboard shortcut test case

* chore(nc-gui): lint

* fix(nc-gui): field modal redio option shadow issue

* fix(nc-gui): update field modal select option color picker btn border radius

* fix(nc-gui): checkbox & rating icon alignment issue

* fix(nc-gui): update field modal formula field

* fix(nc-gui): field modal padding and gap issue

* fix(nc-gui): update set default value font case & font color

* fix(nc-gui): update field modal formula suggestion list ui

* fix(nc-gui): removecolumn create field search list from multifield editor

* fix(nc-gui): add placeholder for lookup & rollup options

* fix: label

* fix(nc-gui): remove placeholder from select type

* fix(nc-gui): remove link type from link field select option

* fix(nc-gui): qr, barcode value field icon issue

* fix(nc-gui): set color picker tab according to active color

* fix(nc-gui): json editor save btn ui changes in edit modal

* fix(nc-gui): disable editing primary key col

* chore(nc-gui): lint

---------

Co-authored-by: Raju Udava <86527202+dstala@users.noreply.github.com>
2024-05-31 21:26:57 +05:30

206 lines
6.4 KiB
Vue

<script lang="ts" setup>
import type { GeoLocationType } from 'nocodb-sdk'
import { Modal as AModal } from '#imports'
interface Props {
modelValue?: string | null
}
interface Emits {
(event: 'update:modelValue', model: GeoLocationType): void
}
const props = defineProps<Props>()
const emits = defineEmits<Emits>()
const vModel = useVModel(props, 'modelValue', emits)
const isExpanded = ref(false)
const isLoading = ref(false)
const isLocationSet = ref(false)
const [latitude, longitude] = (vModel.value || '').split(';')
const latLongStr = computed(() => {
const [latitude, longitude] = (vModel.value || '').split(';')
if (latitude) isLocationSet.value = true
return latitude && longitude ? `${latitude}; ${longitude}` : 'Set location'
})
const formState = reactive({
latitude,
longitude,
})
const handleFinish = () => {
vModel.value = latLongToJoinedString(parseFloat(formState.latitude), parseFloat(formState.longitude))
isExpanded.value = false
}
const clear = () => {
isExpanded.value = false
formState.latitude = latitude
formState.longitude = longitude
}
const onClickSetCurrentLocation = () => {
isLoading.value = true
const onSuccess: PositionCallback = (position: GeolocationPosition) => {
const crd = position.coords
formState.latitude = `${crd.latitude}`
formState.longitude = `${crd.longitude}`
isLoading.value = false
}
const onError: PositionErrorCallback = (err: GeolocationPositionError) => {
console.error(`ERROR(${err.code}): ${err.message}`)
isLoading.value = false
}
const options = {
enableHighAccuracy: true,
timeout: 20000,
maximumAge: 2000,
}
navigator.geolocation.getCurrentPosition(onSuccess, onError, options)
}
const openInGoogleMaps = () => {
const [latitude, longitude] = (vModel.value || '').split(';')
const url = `https://www.google.com/maps/search/?api=1&query=${latitude},${longitude}`
window.open(url, '_blank', 'noopener,noreferrer')
}
const openInOSM = () => {
const [latitude, longitude] = (vModel.value || '').split(';')
const url = `https://www.openstreetmap.org/?mlat=${latitude}&mlon=${longitude}#map=15/${latitude}/${longitude}`
window.open(url, '_blank', "'noopener,noreferrer'")
}
</script>
<template>
<a-dropdown :is="isExpanded ? AModal : 'div'" v-model:visible="isExpanded" :trigger="['click']">
<div
v-if="!isLocationSet"
class="group cursor-pointer flex gap-1 items-center mx-auto max-w-64 justify-center active:(ring ring-accent ring-opacity-100) rounded border-1 p-1 shadow-sm hover:(bg-primary bg-opacity-10) dark:(!bg-slate-500) my-1"
tabindex="0"
>
<div class="flex items-center gap-2" data-testid="nc-geo-data-set-location-button">
<component
:is="iconMap.mapMarker"
class="transform dark:(!text-white) group-hover:(!text-accent scale-120) text-gray-500 text-[0.75rem]"
/>
<div class="group-hover:text-primary text-gray-500 dark:text-gray-200 dark:group-hover:!text-white text-xs">
{{ latLongStr }}
</div>
</div>
</div>
<div
v-else
data-testid="nc-geo-data-lat-long-set"
tabindex="0"
class="nc-cell-field h-full w-full flex items-center py-1 focus-visible:!outline-none focus:!outline-none"
>
{{ latLongStr }}
</div>
<template #overlay>
<a-form :model="formState" class="flex flex-col w-max-64 border-1 border-gray-200" @finish="handleFinish">
<a-form-item>
<div class="flex mt-4 items-center mx-2">
<div class="mr-2">{{ $t('labels.lat') }}:</div>
<a-input
v-model:value="formState.latitude"
data-testid="nc-geo-data-latitude"
type="number"
step="0.0000001"
:min="-90"
required
:max="90"
@keydown.stop
@selectstart.capture.stop
@mousedown.stop
/>
</div>
</a-form-item>
<a-form-item>
<div class="flex items-center mx-2">
<div class="mr-2">{{ $t('labels.lng') }}:</div>
<a-input
v-model:value="formState.longitude"
data-testid="nc-geo-data-longitude"
type="number"
step="0.0000001"
required
:min="-180"
:max="180"
@keydown.stop
@selectstart.capture.stop
@mousedown.stop
/>
</div>
</a-form-item>
<a-form-item>
<div class="mr-2 flex flex-col items-end gap-1 text-left">
<component
:is="iconMap.reload"
v-if="isLoading"
:class="{ 'animate-infinite animate-spin text-gray-500': isLoading }"
/>
<a-button class="ml-2 !rounded-lg" @click="onClickSetCurrentLocation">
<div class="flex items-center gap-1">
<component :is="iconMap.currentLocation" />{{ $t('labels.currentLocation') }}
</div>
</a-button>
</div>
</a-form-item>
<a-form-item v-if="vModel">
<div class="mr-2 flex flex-row items-end gap-1 text-left">
<a-button class="!rounded-lg" @click="openInOSM">
<div class="flex items-center gap-1">
<component :is="iconMap.openInNew" />{{ $t('activity.map.openInOpenStreetMap') }}
</div>
</a-button>
<a-button class="!rounded-lg" @click="openInGoogleMaps">
<div class="flex items-center gap-1">
<component :is="iconMap.openInNew" />{{ $t('activity.map.openInGoogleMaps') }}
</div>
</a-button>
</div>
</a-form-item>
<a-form-item>
<div class="ml-auto mr-2 w-auto">
<a-button type="text" class="!rounded-lg" @click="clear">{{ $t('general.cancel') }}</a-button>
<a-button type="primary" html-type="submit" data-testid="nc-geo-data-save" class="!rounded-lg">{{
$t('general.submit')
}}</a-button>
</div>
</a-form-item>
</a-form>
</template>
</a-dropdown>
</template>
<style scoped lang="scss">
input[type='number']:focus {
@apply ring-transparent shadow-selected;
}
input[type='number'] {
@apply !border-1 !pr-1 rounded-lg;
}
input[type='number'] {
width: 180px;
}
.ant-form-item {
margin-bottom: 1rem;
}
.ant-dropdown-menu {
align-items: flex-end;
}
</style>