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.
138 lines
5.1 KiB
138 lines
5.1 KiB
<script lang="ts" setup> |
|
import type { ColumnType } from 'nocodb-sdk' |
|
|
|
const { visibleColumns, activeField, allViewFilters, localColumnsMapByFkColumnId } = useFormViewStoreOrThrow() |
|
|
|
const isOpen = ref<boolean>(false) |
|
|
|
const allFilters = ref({}) |
|
|
|
provide(AllFiltersInj, allFilters) |
|
|
|
const visibilityError = computed(() => { |
|
return parseProp(activeField.value?.meta)?.visibility?.errors || {} |
|
}) |
|
|
|
const hasvisibilityError = computed(() => Object.keys(visibilityError.value).length) |
|
|
|
const visibilityFilters = computed(() => { |
|
if (activeField.value?.fk_column_id && !allViewFilters.value[activeField.value.fk_column_id]) { |
|
allViewFilters.value[activeField.value.fk_column_id] = [] |
|
} |
|
|
|
return allViewFilters.value[`${activeField.value?.fk_column_id}`] |
|
}) |
|
|
|
const isFirstField = computed(() => { |
|
return !!(visibleColumns.value.length && visibleColumns.value[0].id === activeField.value?.id) |
|
}) |
|
|
|
const filterOption = (column: ColumnType) => { |
|
// hide active field from filter option |
|
const isNotActiveField = column.id !== activeField.value?.fk_column_id |
|
|
|
// show only form view visible columns and order is less than active field |
|
const orderIsLessThanActiveField = |
|
column.id && localColumnsMapByFkColumnId.value[column.id] |
|
? (localColumnsMapByFkColumnId.value[column.id].order ?? Infinity) < (activeField.value?.order ?? Infinity) |
|
: false |
|
|
|
const isVisible = localColumnsMapByFkColumnId.value[column.id]?.show |
|
|
|
return isNotActiveField && orderIsLessThanActiveField && isVisible |
|
} |
|
</script> |
|
|
|
<template> |
|
<div v-if="activeField" class="flex flex-col"> |
|
<div class="flex flex-col gap-3"> |
|
<div class="flex items-center justify-between"> |
|
<div class="text-gray-800 font-medium">{{ $t('labels.showOnConditions') }}</div> |
|
|
|
<div class="flex flex-col"> |
|
<NcDropdown |
|
v-if="visibilityFilters" |
|
v-model:visible="isOpen" |
|
placement="bottomLeft" |
|
:disabled="isFirstField && !visibilityFilters.length && !isOpen" |
|
overlay-class-name="nc-form-field-visibility-dropdown" |
|
> |
|
<NcTooltip placement="left" :disabled="!isFirstField"> |
|
<template #title> Cannot add conditions to the first field in a form. </template> |
|
<div |
|
class="nc-form-field-visibility-btn border-1 rounded-lg py-1 px-3 flex items-center justify-between gap-2 !min-w-[170px] transition-all cursor-pointer select-none text-sm" |
|
:class="{ |
|
'!border-brand-500 shadow-selected': isOpen, |
|
'border-gray-200': !isOpen, |
|
'bg-[#F0F3FF]': visibilityFilters.length, |
|
'opacity-70 cursor-default nc-disabled': isFirstField && !visibilityFilters.length, |
|
}" |
|
data-testid="nc-form-field-visibility-btn" |
|
> |
|
<div |
|
class="nc-form-field-visibility-conditions-count flex-1" |
|
:class="{ |
|
'text-brand-500 ': visibilityFilters.length, |
|
}" |
|
> |
|
{{ |
|
visibilityFilters.length |
|
? `${visibilityFilters.length} condition${visibilityFilters.length !== 1 ? 's' : ''}` |
|
: 'No conditions' |
|
}} |
|
</div> |
|
|
|
<GeneralIcon v-if="hasvisibilityError" icon="alertTriangle" class="flex-none !text-red-500" /> |
|
|
|
<GeneralIcon |
|
icon="settings" |
|
class="flex-none w-4 h-4" |
|
:class="{ |
|
'text-brand-500 ': visibilityFilters.length, |
|
}" |
|
/> |
|
</div> |
|
</NcTooltip> |
|
|
|
<template #overlay> |
|
<div |
|
class="nc-form-field-visibility-dropdown-container" |
|
:class="{ |
|
'py-2': !visibilityFilters.length, |
|
}" |
|
> |
|
<SmartsheetToolbarColumnFilter |
|
ref="fieldVisibilityRef" |
|
v-model="visibilityFilters" |
|
class="w-full" |
|
:auto-save="true" |
|
data-testid="nc-filter-menu" |
|
:show-loading="false" |
|
:parent-col-id="activeField.fk_column_id" |
|
:filter-option="filterOption" |
|
:visibility-error="visibilityError" |
|
:disable-add-new-filter="isFirstField" |
|
/> |
|
</div> |
|
</template> |
|
</NcDropdown> |
|
</div> |
|
</div> |
|
<div> |
|
<div class="text-sm text-gray-500">{{ $t('labels.showFieldOnConditionsMet') }}</div> |
|
<div v-if="hasvisibilityError" class="mt-2 visibility-condition-input-error text-red-500"> |
|
Error conditions will not be used for determining field visibility. |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</template> |
|
|
|
<style lang="scss" scoped></style> |
|
|
|
<style lang="scss"> |
|
.nc-form-field-visibility-dropdown { |
|
@apply rounded-2xl border-gray-200; |
|
box-shadow: 0px 20px 24px -4px rgba(0, 0, 0, 0.1), 0px 8px 8px -4px rgba(0, 0, 0, 0.04); |
|
} |
|
</style>
|
|
|