MoonShine 2.9 "Frosty Fizz"

MoonShine 2.9 "Frosty Fizz"

Danil Shutsky
Danil Shutsky
10.03.2024 в 15:40

Всем привет!

Недавно проводил консультацию по 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.