mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
4.5 KiB
116 lines
4.5 KiB
<script setup lang="ts"> |
|
import { UITypes, isSelectTypeCol } from 'nocodb-sdk' |
|
|
|
const { formState, activeField, updateColMeta, isRequired } = useFormViewStoreOrThrow() |
|
|
|
const { betaFeatureToggleState } = useBetaFeatureToggle() |
|
|
|
const updateSelectFieldLayout = (value: boolean) => { |
|
if (!activeField.value) return |
|
|
|
activeField.value.meta.isList = value |
|
updateColMeta(activeField.value) |
|
} |
|
|
|
const columnSupportsScanning = (elementType: UITypes) => |
|
betaFeatureToggleState.show && |
|
[UITypes.SingleLineText, UITypes.Number, UITypes.Email, UITypes.URL, UITypes.LongText].includes(elementType) |
|
</script> |
|
|
|
<template> |
|
<!-- Field Settings --> |
|
<template v-if="activeField"> |
|
<div class="nc-form-field-settings p-4 flex flex-col gap-4 border-b border-gray-200"> |
|
<div class="text-base font-bold">{{ $t('objects.field') }} {{ $t('activity.validations').toLowerCase() }}</div> |
|
<div class="flex flex-col gap-6"> |
|
<div class="flex items-center justify-between gap-3"> |
|
<div |
|
class="nc-form-input-required text-gray-800 font-medium" |
|
@click=" |
|
() => { |
|
activeField.required = !activeField.required |
|
updateColMeta(activeField) |
|
} |
|
" |
|
> |
|
{{ $t('general.required') }} {{ $t('objects.field').toLowerCase() }} |
|
</div> |
|
|
|
<a-switch |
|
v-model:checked="activeField.required" |
|
v-e="['a:form-view:field:mark-required']" |
|
size="small" |
|
data-testid="nc-form-input-required" |
|
@change="updateColMeta(activeField)" |
|
/> |
|
</div> |
|
|
|
<div v-if="columnSupportsScanning(activeField.uidt)" class="!my-0 nc-form-input-enable-scanner-form-item"> |
|
<div class="flex items-center justify-between gap-3"> |
|
<div class="nc-form-input-enable-scanner text-gray-800 font-medium"> |
|
{{ $t('general.enableScanner') }} |
|
</div> |
|
<a-switch |
|
v-model:checked="activeField.enable_scanner" |
|
v-e="['a:form-view:field:mark-enable-scanner']" |
|
data-testid="nc-form-input-enable-scanner" |
|
size="small" |
|
@change="updateColMeta(activeField)" |
|
/> |
|
</div> |
|
</div> |
|
|
|
<!-- Limit options --> |
|
<div v-if="isSelectTypeCol(activeField.uidt)" class="w-full flex items-start justify-between gap-3"> |
|
<div class="flex-1 max-w-[calc(100%_-_40px)]"> |
|
<div class="font-medium text-gray-800">{{ $t('labels.limitOptions') }}</div> |
|
<div class="text-gray-500 mt-1">{{ $t('labels.limitOptionsSubtext') }}.</div> |
|
<div v-if="activeField.meta.isLimitOption" class="mt-3"> |
|
<LazySmartsheetFormLimitOptions |
|
v-model:model-value="activeField.meta.limitOptions" |
|
:form-field-state="formState[activeField.title] || ''" |
|
:column="activeField" |
|
:is-required="isRequired(activeField, activeField.required)" |
|
@update:model-value="updateColMeta(activeField)" |
|
@update:form-field-state="(value)=>{ |
|
formState[activeField!.title] = value |
|
}" |
|
></LazySmartsheetFormLimitOptions> |
|
</div> |
|
</div> |
|
|
|
<a-switch |
|
v-model:checked="activeField.meta.isLimitOption" |
|
v-e="['a:form-view:field:limit-options']" |
|
size="small" |
|
class="flex-none nc-form-switch-focus" |
|
@change="updateColMeta(activeField)" |
|
/> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<!-- Field Appearance Settings --> |
|
<div |
|
v-if="isSelectTypeCol(activeField.uidt)" |
|
class="nc-form-field-appearance-settings p-4 flex flex-col gap-4 border-b border-gray-200" |
|
> |
|
<div class="text-base font-bold text-gray-600">{{ $t('general.appearance') }}</div> |
|
<div class="flex flex-col gap-6"> |
|
<!-- Select type field Options Layout --> |
|
<div> |
|
<div class="text-gray-800 font-medium">Options layout</div> |
|
|
|
<a-radio-group |
|
:value="!!activeField.meta.isList" |
|
class="nc-form-field-layout !mt-3 max-w-[calc(100%_-_40px)]" |
|
@update:value="updateSelectFieldLayout" |
|
> |
|
<a-radio :value="false">{{ $t('general.dropdown') }}</a-radio> |
|
<a-radio :value="true">{{ $t('general.list') }}</a-radio> |
|
</a-radio-group> |
|
</div> |
|
</div> |
|
</div> |
|
</template> |
|
</template>
|
|
|