-
Notifications
You must be signed in to change notification settings - Fork 34
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Js events, recipe async metrics
- Loading branch information
Showing
6 changed files
with
251 additions
and
157 deletions.
There are no files selected for viewing
301 changes: 152 additions & 149 deletions
301
resources/views/pages/en/advanced/js_events.blade.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,158 +1,161 @@ | ||
<x-page title="Js events" :sectionMenu="[ | ||
<x-page title="Js события" :sectionMenu="[ | ||
'Разделы' => [ | ||
['url' => '#blade-directives', 'label' => 'Blade directives'], | ||
['url' => '#helper', 'label' => 'AlpineJs helper'], | ||
['url' => '#default-events', 'label' => 'Default events'], | ||
['url' => '#response-events', 'label' => 'Calling events via Response'], | ||
['url' => '#blade-directives', 'label' => 'Blade-директивы'], | ||
['url' => '#helper', 'label' => 'Помощник AlpineJs'], | ||
['url' => '#default-events', 'label' => 'События по умолчанию'], | ||
['url' => '#response-events', 'label' => 'Вызов событий через Response'], | ||
] | ||
]"> | ||
|
||
<x-sub-title id="blade-directives">Blade directives</x-sub-title> | ||
|
||
<x-p> | ||
<em>Blade directives</em> are used to quickly declare events for components. | ||
</x-p> | ||
|
||
<x-moonshine::divider label="@defineEvent" /> | ||
|
||
<x-code language="php"> | ||
@@defineEvent(string|JsEvent $event, ?string $name = null, ?string $call = null) | ||
</x-code> | ||
|
||
<x-ul> | ||
<li><code>$event</code> - event</li> | ||
<li><code>$name</code> - component name</li> | ||
<li><code>$call</code> - callback function.</li> | ||
</x-ul> | ||
|
||
<x-code language="php"> | ||
<div x-data="myComponent" | ||
// @table-updated-index.window="asyncRequest" | ||
@@defineEvent('table-updated', 'index', 'asyncRequest') | ||
> | ||
</div> | ||
</x-code> | ||
|
||
<x-moonshine::divider label="@defineEventWhen" /> | ||
|
||
<x-code language="php"> | ||
@@defineEventWhen(mixed $condition, string|JsEvent $event, ?string $name = null, ?string $call = null) | ||
</x-code> | ||
|
||
<x-ul> | ||
<li><code>$condition</code> - condition for the event</li> | ||
<li><code>$event</code> - event</li> | ||
<li><code>$name</code> - component name</li> | ||
<li><code>$call</code> - callback function.</li> | ||
</x-ul> | ||
|
||
<x-code language="php"> | ||
<div x-data="myComponent" | ||
// @table-updated-index.window="asyncRequest" | ||
@@defineEventWhen(true, 'table-updated', 'index', 'asyncRequest') | ||
> | ||
</div> | ||
</x-code> | ||
|
||
<x-sub-title id="helper">AlpineJs helper</x-sub-title> | ||
|
||
<x-p> | ||
<em>AlpineJs</em> helper class for generating events. | ||
</x-p> | ||
|
||
<x-moonshine::divider label="AlpineJs::event()" /> | ||
|
||
<x-code language="php"> | ||
AlpineJs::event(string|JsEvent $event, ?string $name = null, ?string $call = null) | ||
</x-code> | ||
|
||
<x-ul> | ||
<li><code>$event</code> - event</li> | ||
<li><code>$name</code> - component name</li> | ||
<li><code>$call</code> - callback function.</li> | ||
</x-ul> | ||
|
||
<x-code language="php"> | ||
use MoonShine\Components\FormBuilder; | ||
use MoonShine\Enums\JsEvent; | ||
use MoonShine\Support\AlpineJs; | ||
|
||
FormBuilder::make('/crud/update', 'PUT') | ||
->name('main-form') | ||
->async(asyncEvents: [AlpineJs::event(JsEvent::TABLE_UPDATED, 'index', 'asyncRequest')]) // [tl! focus] | ||
</x-code> | ||
|
||
<x-moonshine::divider label="AlpineJs::eventBlade()" /> | ||
|
||
<x-code language="php"> | ||
AlpineJs::eventBlade(string|JsEvent $event, ?string $name = null, ?string $call = null) | ||
</x-code> | ||
|
||
<x-ul> | ||
<li><code>$event</code> - event</li> | ||
<li><code>$name</code> - component name</li> | ||
<li><code>$call</code> - callback function.</li> | ||
</x-ul> | ||
|
||
<x-code language="php"> | ||
use MoonShine\Components\FormBuilder; | ||
use MoonShine\Enums\JsEvent; | ||
use MoonShine\Support\AlpineJs; | ||
|
||
FormBuilder::make('/crud/update', 'PUT') | ||
->name('main-form') | ||
->customAttributes([ | ||
<x-sub-title id="blade-directives">Blade-директивы</x-sub-title> | ||
|
||
<x-p> | ||
<em>Blade-директивы</em> используются для быстрого объявления событий у компонентов. | ||
</x-p> | ||
|
||
<x-moonshine::divider label="@defineEvent" /> | ||
|
||
<x-code language="php"> | ||
@@defineEvent(string|JsEvent $event, ?string $name = null, ?string $call = null, array $params = []) | ||
</x-code> | ||
|
||
<x-ul> | ||
<li><code>$event</code> - событие,</li> | ||
<li><code>$name</code> - название компонента,</li> | ||
<li><code>$call</code> - callback функция.</li> | ||
<li><code>$params</code> - параметры события.</li> | ||
</x-ul> | ||
|
||
<x-code language="php"> | ||
<div x-data="myComponent"> | ||
// @table-updated-index.window="asyncRequest" | ||
@@defineEvent('table-updated', 'index', 'asyncRequest') | ||
> | ||
</div> | ||
</x-code> | ||
|
||
<x-moonshine::divider label="@defineEventWhen" /> | ||
|
||
<x-code language="php"> | ||
@@defineEventWhen(mixed $condition, string|JsEvent $event, ?string $name = null, ?string $call = null, array $params = []) | ||
</x-code> | ||
|
||
<x-ul> | ||
<li><code>$condition</code> - условие для события,</li> | ||
<li><code>$event</code> - событие,</li> | ||
<li><code>$name</code> - название компонента,</li> | ||
<li><code>$call</code> - callback функция.</li> | ||
<li><code>$params</code> - параметры события.</li> | ||
</x-ul> | ||
|
||
<x-code language="php"> | ||
<div x-data="myComponent"> | ||
// @table-updated-index.window="asyncRequest" | ||
@@defineEventWhen(true, 'table-updated', 'index', 'asyncRequest') | ||
> | ||
</div> | ||
</x-code> | ||
|
||
<x-sub-title id="helper">Помощник AlpineJs</x-sub-title> | ||
|
||
<x-p> | ||
<em>AlpineJs</em> класс-помощник, для формирования событий. | ||
</x-p> | ||
|
||
<x-moonshine::divider label="AlpineJs::event()" /> | ||
|
||
<x-code language="php"> | ||
AlpineJs::event(string|JsEvent $event, ?string $name = null, array $params = []) | ||
</x-code> | ||
|
||
<x-ul> | ||
<li><code>$event</code> - событие,</li> | ||
<li><code>$name</code> - название компонента,</li> | ||
<li><code>$params</code> - параметры события</li> | ||
</x-ul> | ||
|
||
<x-code language="php"> | ||
use MoonShine\Components\FormBuilder; | ||
use MoonShine\Enums\JsEvent; | ||
use MoonShine\Support\AlpineJs; | ||
|
||
FormBuilder::make('/crud/update', 'PUT') | ||
->name('main-form') | ||
->async(asyncEvents: [AlpineJs::event(JsEvent::TABLE_UPDATED, 'index', ['var' => 'foo])]) // [tl! focus] | ||
</x-code> | ||
|
||
<x-moonshine::divider label="AlpineJs::eventBlade()" /> | ||
|
||
<x-code language="php"> | ||
AlpineJs::eventBlade(string|JsEvent $event, ?string $name = null, ?string $call = null, array $params = []) | ||
</x-code> | ||
|
||
<x-ul> | ||
<li><code>$event</code> - событие,</li> | ||
<li><code>$name</code> - название компонента,</li> | ||
<li><code>$call</code> - callback функция.</li> | ||
<li><code>$params</code> - параметры события</li> | ||
</x-ul> | ||
|
||
<x-code language="php"> | ||
use MoonShine\Components\FormBuilder; | ||
use MoonShine\Enums\JsEvent; | ||
use MoonShine\Support\AlpineJs; | ||
|
||
FormBuilder::make('/crud/update', 'PUT') | ||
->name('main-form') | ||
->customAttributes([ | ||
// @form-reset-main-form.window="formReset" | ||
AlpineJs::eventBlade(JsEvent::FORM_RESET, 'main-form') => 'formReset', // [tl! focus] | ||
]); | ||
</x-code> | ||
|
||
<x-sub-title id="default-events">Default events</x-sub-title> | ||
|
||
<x-p> | ||
There are several default events defined in the <strong>MoonShine</strong> admin panel, | ||
the names of which can be conveniently obtained via enum <em>JsEvent</em>. | ||
</x-p> | ||
|
||
<x-ul> | ||
<li><code>JsEvent::FRAGMENT_UPDATED</code> - fragment update,</li> | ||
<li><code>JsEvent::TABLE_UPDATED</code> - table update,</li> | ||
<li><code>JsEvent::TABLE_REINDEX</code> - updating table indexes when sorting,</li> | ||
<li><code>JsEvent::TABLE_ROW_UPDATED</code> - updating a row in the table,</li> | ||
<li><code>JsEvent::CARDS_UPDATED</code> - updating the Cards list,</li> | ||
<li><code>JsEvent::FORM_RESET</code> - form reset,</li> | ||
<li><code>JsEvent::FORM_SUBMIT</code> - submitting the form,</li> | ||
<li><code>JsEvent::MODAL_TOGGLED</code> - opening / closing a modal window,</li> | ||
<li><code>JsEvent::OFF_CANVAS_TOGGLED</code> - opening / closing Offcanvas,</li> | ||
<li><code>JsEvent::TOAST</code> - call Toast.</li> | ||
</x-ul> | ||
|
||
<x-sub-title id="response-events">Calling events via Response</x-sub-title> | ||
|
||
<x-p> | ||
In <strong>MoonShine</strong> you can return events to <em>MoonShineJsonResponse</em>, which will then be called.<br /> | ||
To do this, you need to use the <code>events()</code> method. | ||
</x-p> | ||
|
||
<x-code language="php"> | ||
events(array $events) | ||
</x-code> | ||
|
||
<x-ul> | ||
<li><code>$events</code> - array of events to be called.</li> | ||
</x-ul> | ||
|
||
<x-code language="php"> | ||
use MoonShine\Enums\JsEvent; | ||
use MoonShine\Http\Responses\MoonShineJsonResponse; | ||
use MoonShine\Support\AlpineJs; | ||
|
||
//... | ||
|
||
return MoonShineJsonResponse::make() | ||
->events([ | ||
]); | ||
</x-code> | ||
|
||
<x-sub-title id="default-events">События по умолчанию</x-sub-title> | ||
|
||
<x-p> | ||
В админ-панели <strong>MoonShine</strong> определены несколько событий по умолчанию, | ||
названия которых можно удобно получить через enum <em>JsEvent</em>. | ||
</x-p> | ||
|
||
<x-ul> | ||
<li><code>JsEvent::FRAGMENT_UPDATED</code> - обновление фрагмента,</li> | ||
<li><code>JsEvent::TABLE_UPDATED</code> - обновление таблицы,</li> | ||
<li><code>JsEvent::TABLE_REINDEX</code> - обновление индексов таблицы при сортировке,</li> | ||
<li><code>JsEvent::TABLE_ROW_UPDATED</code> - обновление строки в таблице,</li> | ||
<li><code>JsEvent::CARDS_UPDATED</code> - обновление списка Сards,</li> | ||
<li><code>JsEvent::FORM_RESET</code> - сброс формы,</li> | ||
<li><code>JsEvent::FORM_SUBMIT</code> - отправка формы,</li> | ||
<li><code>JsEvent::MODAL_TOGGLED</code> - открытие / закрытие модального окна,</li> | ||
<li><code>JsEvent::OFF_CANVAS_TOGGLED</code> - открытие / закрытие Offcanvas,</li> | ||
<li><code>JsEvent::TOAST</code> - вызов Toast.</li> | ||
</x-ul> | ||
|
||
<x-sub-title id="response-events">Вызов событий через Response</x-sub-title> | ||
|
||
<x-p> | ||
В <strong>MoonShine</strong> можно вернуть события в <em>MoonShineJsonResponse</em>, которые потом будут вызваны.<br /> | ||
Для этого необходимо воспользоваться методом <code>events()</code>. | ||
</x-p> | ||
|
||
<x-code language="php"> | ||
events(array $events) | ||
</x-code> | ||
|
||
<x-ul> | ||
<li><code>$events</code> - массив вызываемых событий.</li> | ||
</x-ul> | ||
|
||
<x-code language="php"> | ||
use MoonShine\Enums\JsEvent; | ||
use MoonShine\Http\Responses\MoonShineJsonResponse; | ||
use MoonShine\Support\AlpineJs; | ||
|
||
//... | ||
|
||
return MoonShineJsonResponse::make() | ||
->events([ | ||
AlpineJs::event(JsEvent::TABLE_UPDATED, 'index'), | ||
]); // [tl! focus:-2] | ||
</x-code> | ||
]); // [tl! focus:-2] | ||
</x-code> | ||
|
||
</x-page> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
<x-recipe id="async-metrics" title="{{ $title ?? 'Recipe' }}"> | ||
|
||
<x-p> | ||
Metrics with form parameters | ||
</x-p> | ||
|
||
<x-code language="php"> | ||
$startDate = request()->date('_form.start_date'); | ||
$endDate = request()->date('_form.end_date'); | ||
|
||
FormBuilder::make() | ||
->dispatchEvent(AlpineJs::event(JsEvent::FRAGMENT_UPDATED, 'metrics')) | ||
->fields([ | ||
Flex::make([ | ||
Date::make('Start date'), | ||
Date::make('End date'), | ||
]), | ||
]), | ||
|
||
Fragment::make([ | ||
FlexibleRender::make("$startDate - $endDate"), | ||
|
||
LineChartMetric::make('Orders') | ||
->line([ | ||
'Profit' => Order::query() | ||
->selectRaw('SUM(price) as sum, DATE_FORMAT(created_at, "%d.%m.%Y") as date') | ||
->whereBetween('created_at', [$startDate, $endDate]) | ||
->groupBy('date') | ||
->pluck('sum', 'date') | ||
->toArray(), | ||
]) | ||
->line([ | ||
'Avg' => Order::query() | ||
->selectRaw('AVG(price) as average, DATE_FORMAT(created_at, "%d.%m.%Y") as date') | ||
->whereBetween('created_at', [$startDate, $endDate]) | ||
->groupBy('date') | ||
-> pluck('avg', 'date') | ||
->toArray(), | ||
], '#EC4176'), | ||
])->name('metrics'), | ||
</x-code> | ||
</x-recipe> |
Oops, something went wrong.