Skip to content

Improve callbacks url generation 2#1651

Closed
mvorisek wants to merge 12 commits intodevelopfrom
improve_callback_url
Closed

Improve callbacks url generation 2#1651
mvorisek wants to merge 12 commits intodevelopfrom
improve_callback_url

Conversation

@mvorisek
Copy link
Copy Markdown
Member

@mvorisek mvorisek commented Jul 22, 2021

@mvorisek mvorisek requested a review from ibelar July 22, 2021 00:29
@mvorisek mvorisek force-pushed the improve_callback_url branch from 14d0172 to 9b532df Compare July 22, 2021 00:32
@ibelar
Copy link
Copy Markdown
Contributor

ibelar commented Jul 22, 2021

Tks! I fixed test and also added a behat test for url

@ibelar
Copy link
Copy Markdown
Contributor

ibelar commented Jul 22, 2021

I can update the PR using a static property for runningCallback. Then we can grab argument from it when need.


class Callback 
{
   
    protected static $runningCallbacks = [];

    public static function getRunningCallbackArgs(): array
    {
        $args = [];
        foreach (self::$runningCallbacks as $cb) {
            $args[$cb->urlTrigger] = $cb->getTriggeredValue();
        }

        return $args;
    }

    public function set($fx = null, $args = null)
    {
        if ($this->isTriggered() && $this->canTrigger()) {
            self::$runningCallbacks[] = $this;
            return $fx(...($args ?? []));
        }
    }
}

This way, we do not need to check for Get value and also do not need public const URL_QUERY_TRIGGER_PREFIX

@mvorisek What do you think?

@ibelar
Copy link
Copy Markdown
Contributor

ibelar commented Jul 22, 2021

I have made the changes. Feel free to revert if you do not like it.

@mvorisek
Copy link
Copy Markdown
Member Author

I can update the PR using a static property for runningCallback. Then we can grab argument from it when need.

I belive running callbacks can be obtained quite easily by traversing the parents /wo the need to persist them in a static array, I will impl. that later.

@mvorisek mvorisek force-pushed the improve_callback_url branch from de1780f to 077d40e Compare July 24, 2021 11:11
@mvorisek mvorisek force-pushed the improve_callback_url branch 5 times, most recently from a221eca to 1cf01e8 Compare July 26, 2021 13:38
parent::init();

$this->cb = $this->add([Callback::class, 'urlTrigger' => $this->urlTrigger ?: $this->name]);
unset($this->{'urlTrigger'});
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a very bad hack to dedup urlTrigger property stored at 2 places, but let's keep is for now, related with atk4/core#245 , otherwise this property can not be set from seed

@ibelar
Copy link
Copy Markdown
Contributor

ibelar commented Jul 26, 2021 via email

@mvorisek mvorisek force-pushed the improve_callback_url branch 8 times, most recently from f271757 to 428165b Compare July 27, 2021 09:15
$isTerminated = true;
}

if ($isTerminated && $v->isTriggered() && $v->canTrigger()) {
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ibelar does $v->canTrigger() make sense here and any idea how to fix the remaining failing Behat tests?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ibelar does $v->canTrigger() make sense here and any idea how to fix the remaining failing Behat tests?

Yes, canTrigger method will check for a reload. Normally, JsCallback should not run during a reload.

Copy link
Copy Markdown
Contributor

@ibelar ibelar Jul 27, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see why the test is failing. ViewTester reload is missing Callback arguments. Thus when reload is call, the callback method is not run.

I think the reason is that ViewTester is added directly to Modal, while the callback is added to Button

$button->on('click', $vp1Modal->show());

Resulting in

App -> Button -> Cb
    -> Modal -> ViewTester (reload)

Thus the callback is not part of the Modal render tree... missing its arguments when reload URL is rendered.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thus the callback is not part of the Modal render tree...

any idea how to solve it?

Copy link
Copy Markdown
Member Author

@mvorisek mvorisek Aug 19, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ibelar the issue is here:

'uri' => $this->view->jsUrl(['__atk_reload' => $this->view->name]),

  1. in Improve callbacks url generation #1646 you have removed mergeStickyArgsFromChildView which allowed to delegate sticky args from it's children.
  2. in this PR, sticky args are collected from the render tree, but the URL must be obtained thru terminating callback
  3. here, hovewer the URL is obtained thru $this->view which is placed correctly within the Modal render tree, but the Modal is not delegating it's callback sticky args as mergeStickyArgsFromChildView was removed

To better understand the issue, I have pushed a debug code in 53a0352#diff-0741d95fd53e7a9a50ab8b371b0d621c3eaf3cb460c79dfe5a886deaec0814a9R68 , when you open the test URL, the expected and actual value must be the same.

I belive, mergeStickyArgsFromChildView is needed. Or how else should the $this->view->jsUrl(... in JsReload work?

With 29ecd83#diff-c5bb4a733c5ddd3bb0744ef4c29a8fd1e0bd5999fcf06b7f3cfef4c3d1926ce3R640-R668 Behat passes.

Here is a summary of problems to solve:

  1. traverse all callbacks that CAN trigger (can be solved easily but by brute force by analysis whole reachable render tree) - temporary implemented by analysis stack trace
  2. identify THE LAST TERMINATING callback - temporary implemented by pretending that all Modals can terminate - I need a help with this, as terminating callback must be identified from the render tree (not by the user requested terminating callback from URL, as it can differ)

@mvorisek mvorisek force-pushed the improve_callback_url branch from 428165b to 5a5ff3a Compare July 27, 2021 09:23
@mvorisek mvorisek marked this pull request as ready for review July 27, 2021 11:07
@ibelar
Copy link
Copy Markdown
Contributor

ibelar commented Jul 27, 2021 via email

@mvorisek mvorisek force-pushed the improve_callback_url branch 4 times, most recently from b1e9b14 to 982c631 Compare October 7, 2021 00:00
@mvorisek mvorisek force-pushed the improve_callback_url branch from 982c631 to f985362 Compare December 3, 2021 23:36
@mvorisek mvorisek added the MAJOR label Apr 8, 2022
@mvorisek mvorisek force-pushed the improve_callback_url branch 4 times, most recently from 86ea86e to c592b8f Compare August 28, 2022 18:34
@mvorisek mvorisek force-pushed the improve_callback_url branch from c592b8f to e118723 Compare June 18, 2023 22:07
@mvorisek mvorisek marked this pull request as draft December 30, 2024 09:53
@mvorisek mvorisek force-pushed the improve_callback_url branch from e118723 to 82fad5f Compare March 29, 2025 12:22
@mvorisek mvorisek force-pushed the improve_callback_url branch from 82fad5f to e086dd9 Compare March 29, 2025 22:19
@mvorisek
Copy link
Copy Markdown
Member Author

mvorisek commented Mar 31, 2025

Probably impossible to satisfy all goals with the current design - new URL handling and multipass rendering needed.

@mvorisek mvorisek closed this Mar 31, 2025
@mvorisek mvorisek deleted the improve_callback_url branch March 31, 2025 09:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Development

Successfully merging this pull request may close these issues.

2 participants