diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsHeader/ContactListHeaderWrapper.vue b/app/javascript/dashboard/components-next/Contacts/ContactsHeader/ContactListHeaderWrapper.vue index 0b4880264..3d4b5c8a5 100644 --- a/app/javascript/dashboard/components-next/Contacts/ContactsHeader/ContactListHeaderWrapper.vue +++ b/app/javascript/dashboard/components-next/Contacts/ContactsHeader/ContactListHeaderWrapper.vue @@ -68,8 +68,7 @@ const hasActiveSegments = computed( ); const activeSegmentName = computed(() => props.activeSegment?.name); -const openCreateNewContactDialog = async () => { - await createNewContactDialogRef.value?.contactsFormRef.resetValidation(); +const openCreateNewContactDialog = () => { createNewContactDialogRef.value?.dialogRef.open(); }; const openContactImportDialog = () => diff --git a/app/javascript/dashboard/components-next/NewConversation/components/EmailOptions.vue b/app/javascript/dashboard/components-next/NewConversation/components/EmailOptions.vue index ac7e8d659..4e0c71adb 100644 --- a/app/javascript/dashboard/components-next/NewConversation/components/EmailOptions.vue +++ b/app/javascript/dashboard/components-next/NewConversation/components/EmailOptions.vue @@ -95,6 +95,7 @@ const inputClass = computed(() => { :show-dropdown="showCcEmailsDropdown" :is-loading="isLoading" type="email" + allow-create class="flex-1 min-h-7" @focus="emit('updateDropdown', 'cc', true)" @input="emit('searchCcEmails', $event)" @@ -127,6 +128,7 @@ const inputClass = computed(() => { :show-dropdown="showBccEmailsDropdown" :is-loading="isLoading" type="email" + allow-create class="flex-1 min-h-7" focus-on-mount @focus="emit('updateDropdown', 'bcc', true)" diff --git a/app/javascript/dashboard/components-next/combobox/ComboBox.vue b/app/javascript/dashboard/components-next/combobox/ComboBox.vue index d50134e88..58d9e634d 100644 --- a/app/javascript/dashboard/components-next/combobox/ComboBox.vue +++ b/app/javascript/dashboard/components-next/combobox/ComboBox.vue @@ -56,8 +56,13 @@ const selectedLabel = computed(() => { }); const selectOption = option => { - selectedValue.value = option.value; - emit('update:modelValue', option.value); + if (selectedValue.value === option.value) { + selectedValue.value = ''; + emit('update:modelValue', ''); + } else { + selectedValue.value = option.value; + emit('update:modelValue', option.value); + } open.value = false; search.value = ''; }; diff --git a/app/javascript/dashboard/components-next/dialog/Dialog.vue b/app/javascript/dashboard/components-next/dialog/Dialog.vue index 78ca5206b..8a5439554 100644 --- a/app/javascript/dashboard/components-next/dialog/Dialog.vue +++ b/app/javascript/dashboard/components-next/dialog/Dialog.vue @@ -53,6 +53,11 @@ const props = defineProps({ default: 'lg', validator: value => ['3xl', '2xl', 'xl', 'lg', 'md', 'sm'].includes(value), }, + position: { + type: String, + default: 'center', + validator: value => ['center', 'top'].includes(value), + }, }); const emit = defineEmits(['confirm', 'close']); @@ -61,6 +66,7 @@ const { t } = useI18n(); const dialogRef = ref(null); const dialogContentRef = ref(null); +const isOpen = ref(false); const maxWidthClass = computed(() => { const classesMap = { @@ -75,13 +81,19 @@ const maxWidthClass = computed(() => { return classesMap[props.width] ?? 'max-w-md'; }); +const positionClass = computed(() => + props.position === 'top' ? 'dialog-position-top' : '' +); + const open = () => { + isOpen.value = true; dialogRef.value?.showModal(); }; const close = () => { emit('close'); dialogRef.value?.close(); + isOpen.value = false; }; const confirm = () => { @@ -98,6 +110,7 @@ defineExpose({ open, close }); class="w-full transition-all duration-300 ease-in-out shadow-xl rounded-xl" :class="[ maxWidthClass, + positionClass, overflowYAuto ? 'overflow-y-auto' : 'overflow-visible', ]" @close="close" @@ -105,7 +118,7 @@ defineExpose({ open, close });
@@ -119,7 +132,7 @@ defineExpose({ open, close });

- +
diff --git a/app/javascript/dashboard/components-next/dropdown-menu/base/DropdownSection.vue b/app/javascript/dashboard/components-next/dropdown-menu/base/DropdownSection.vue index 54872c440..5fc63b85c 100644 --- a/app/javascript/dashboard/components-next/dropdown-menu/base/DropdownSection.vue +++ b/app/javascript/dashboard/components-next/dropdown-menu/base/DropdownSection.vue @@ -4,6 +4,10 @@ defineProps({ type: String, default: '', }, + height: { + type: String, + default: 'max-h-96', + }, }); @@ -15,7 +19,10 @@ defineProps({ > {{ title }}
-
    +
    diff --git a/app/javascript/dashboard/components-next/filter/ConditionRow.vue b/app/javascript/dashboard/components-next/filter/ConditionRow.vue index c74879a58..510ddbde3 100644 --- a/app/javascript/dashboard/components-next/filter/ConditionRow.vue +++ b/app/javascript/dashboard/components-next/filter/ConditionRow.vue @@ -50,12 +50,12 @@ const currentFilter = computed(() => ); const getOperator = (filter, selectedOperator) => { - const operatorFromOptions = filter.filterOperators.find( + const operatorFromOptions = filter?.filterOperators?.find( operator => operator.value === selectedOperator ); if (!operatorFromOptions) { - return filter.filterOperators[0]; + return filter?.filterOperators?.[0]; } return operatorFromOptions; @@ -138,7 +138,11 @@ const validate = () => { return !validationError.value; }; -defineExpose({ validate }); +const resetValidation = () => { + showErrors.value = false; +}; + +defineExpose({ validate, resetValidation });