Всем привет!
Недавно проводил консультацию по MoonShine и помимо ответов на вопросы, получил от ребят фидбек с проблемами и в итоге на основе общения был сформирован релиз 2.9.0 с кодовым именем "Frosty Fizz".
Давайте расскажу что появилось нового и интересного.
Новый метод dispatchEvent
Всемогущие ActionButton умели отправлять асинхронные запросы и дергать события, но не умели просто дергать события, хотя вы и могли повесить dispatch на onClick, но современный мир Laravel без сахара невозможен)
Вообщем у ActionButton появился метод dispatchEvent, с помощью которого можно просто по клику дергать события
ActionButton::make('Label', '#')
->dispatchEvent(AlpineJs::event(JsEvent::CARDS_UPDATED, 'main-table'))
Такая же проблема была и у FormBuilder, но в процессе реализации также пришлось серьезно порефакторить и добавить метод, который скрывает сабмит. В итоге:
$form->dispatchEvent([
AlpineJs::event(JsEvent::OFF_CANVAS_TOGGLED, 'default')
]);
$form->hideSubmit();
Серьезные улучшения для Menu, Sidebar, TopBar
Давайте начнем с меню и с самого простого - возможность отключить поведение скролла к активному элементу
Menu::make()->withoutScrollTo()
Добавлена возможность указывать логику выбора активного пункта. Будет полезно в том случае, когда страница находится вне ресурса, но необходимо продолжать делать активным пункт меню ресурса:
MenuItem::make('Label', '/endpoint')->forceActive(fn() => request()->fullUrlIs('*admin/endpoint/*'))
С этого релиза в LayoutBuilder вы можете использовать сразу и TopBar и Sidebar, а также появлился MobileBar, где вы можете определить содержимое мобильного меню по-своему.
Ах да и самих компонентов меню теперь может быть несколько, вы можете передавать состав меню прямо в LayoutBuilder:
LayoutBuilder::make([
MobileBar::make([
Divider::make('Sidebar menu')->centered(),
Menu::make(),
Divider::make('Top menu')->centered(),
Menu::make([
MenuItem::make('Label', '/endpoint')
]),
When::make(
static fn() => config('moonshine.auth.enable', true),
static fn() => [Profile::make(withBorder: true)]
),
]),
TopBar::make([
Menu::make([
MenuItem::make('Label', '/endpoint')
])->top()
])->hideLogo()->hideSwitcher(),
Sidebar::make([
Menu::make(),
When::make(
static fn() => config('moonshine.auth.enable', true),
static fn() => [Profile::make(withBorder: true)]
),
]),
// ...
]);
Я думаю, вы также заметили новые методы hideLogo и hideSwitcher, которые будут необходимы в условиях возможности использовать сразу и верхнее меню и сайдбар.
Отличный получился релиз!!!
Большой респект Dissnik за вклад в большую часть PR.