epicmaxco / vuestic-ui

Free and Open Source UI Library for Vue 3 🤘
https://vuestic.dev
MIT License
3.33k stars 323 forks source link

сlose modal/confirm programmatically #3371

Open EugenGedroyc opened 1 year ago

EugenGedroyc commented 1 year ago

close #3346

Description

Added function close() for the Modals including the confirm

But i have one bug. This string break "background overlay" if reopen modal: packages\ui\src\components\va-modal\VaModal.vue => computedOverlayStyles => if (!props.overlay || !isLowestLevelModal.value) { return }

Markup:

```vue // Your code ```

Types of changes

EugenGedroyc commented 1 year ago

Я догадался почему происходит этот bug и хотел пофиксить. Выяснил, что onClose не вызывает перерасчёт valueComputed, а просто уничтожает модальное окно

const onClose = (event: HTMLElement) => {
    props?.onClose?.(event)
    destroy(el, vNode)
  }

и соответственно не срабатывает в VaModal.vue:
watch(valueComputed, newValueComputed => { // watch for open/close modal в котором вызывается функция unregisterModal() и поэтому модальное окно как бы закрывается, но остается зарегистрированным. Следовательно тут !isLowestLevelModal.value считается, что уже есть открытые модальные окна и чтобы фон не перекрывал их, он не добавляется на новое модальное окно. Не знаю как правильно сделать: пытаться onClose завязать на VaModal, чтобы срабатывала:

 const hide = (cb?: () => void) => {
      const _hide = () => {
        valueComputed.value = false
        cb?.()
      }
      props.beforeClose ? props.beforeClose(_hide) : _hide()
    }

Или вообще по-другому?

m0ksem commented 1 year ago

Я догадался почему происходит этот bug и хотел пофиксить. Выяснил, что onClose не вызывает перерасчёт valueComputed, а просто уничтожает модальное окно

const onClose = (event: HTMLElement) => {
    props?.onClose?.(event)
    destroy(el, vNode)
  }

и соответственно не срабатывает в VaModal.vue: watch(valueComputed, newValueComputed => { // watch for open/close modal в котором вызывается функция unregisterModal() и поэтому модальное окно как бы закрывается, но остается зарегистрированным. Следовательно тут !isLowestLevelModal.value считается, что уже есть открытые модальные окна и чтобы фон не перекрывал их, он не добавляется на новое модальное окно. Не знаю как правильно сделать: пытаться onClose завязать на VaModal, чтобы срабатывала:

 const hide = (cb?: () => void) => {
      const _hide = () => {
        valueComputed.value = false
        cb?.()
      }
      props.beforeClose ? props.beforeClose(_hide) : _hide()
    }

Или вообще по-другому?

mb так в самом модале можно сделать.

beforeDestroy(() => {
  hide()
})
asvae commented 11 months ago

@EugenGedroyc hey,

do yo plan to continue working on that? Thanks :).

EugenGedroyc commented 11 months ago

My project was freezed(temporarily). And i have not the work time to close it, therefore i'm waiting the continous project. As a last resort, i`ll close it in free time but after a few months, because I'm afraid it won't be fast for me :)