mirror of
https://github.com/nocodb/nocodb.git
synced 2026-05-02 13:37:04 +00:00
* 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>
206 lines
6.4 KiB
Vue
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>
|