moonshine-software / moonshine

Laravel Admin panel and more. Simple for beginners and powerful for experts. Using Blade, Alpine.js and Tailwind CSS.
https://moonshine-laravel.com
MIT License
797 stars 104 forks source link

[3.x] modelResource $assets #1346

Closed ArtemYurov closed 2 days ago

ArtemYurov commented 4 days ago

MoonShine Version

3.x-dev 856a134

Laravel Version

11.34.2

PHP Version

8.3.12

Database Driver & Version

No response

Description

Так как так теперь сделать нельзя:

protected array $assets = [Css::make('test.css'), InlineCss::make(".table-sticky {max-height: 83dvh;}")];

А можно так:

public function getAssets(): array
{
    return [Css::make("test.css"), InlineCss::make(".table-sticky {max-height: 83dvh;}")];
}

То нужен метод с каким то более осмысленным называнием, который можно будет добавить в документацию.

Также проблема, что добавленные $assets как через getAssets, так и для компонента через addAssets добавляются перед основными css файлами, а должны после:

    <style>
                .box-shadow:before {
                    display: none
                }
            </style>
    <style>.table-sticky {max-height: 83dvh;}</style>
    <script src="http://test.test/vendor/moonshine/assets/app.js?v=3.9999999.9999999.9999999-dev" defer=""></script>
    <link href="http://test.test/vendor/moonshine/assets/main.css?v=3.9999999.9999999.9999999-dev" rel="stylesheet" defer="">
    <link href="http://test.test/vendor/moonshine/assets/minimalistic.css?v=3.9999999.9999999.9999999-dev" rel="stylesheet" defer="">

Steps To Reproduce

выше.

lee-to commented 3 days ago

1) Вообще сейчас это выглядит так - сперва ресурс добавляет ассеты а потом (всегда последним) грузится шаблон который добавляет свои ассеты, что говорит о том что ассеты шаблона всегда будут в конце

2) Не нужно использовать getAssets у ресурса, единственное место где он требуется это Fields, да и зачем каждый раз их там держать когда есть метод onLoad чтобы добавить их когда ресурс или страница активны

protected function onLoad(): void
{
    $this->getAssetManager()->add(InlineJs::make('alert(1)'));
}

4) Что касается жизненого цикла то я добавлю в ассет менеджер три метода append, prepend

Issue не закрывай, я закрою когда сделаю 4

ArtemYurov commented 3 days ago
  1. Ну так иногда нужно же переопределить стандартный дизайн. Поэтому хотелось бы чтобы ассеты были после шаблона
  2. Я согласен что не нужно, но это рекомендация ваша же из тг чата)) окей значит об assetManager нужно упомянуть в доке.
lee-to commented 3 days ago
  1. Ну так иногда нужно же переопределить стандартный дизайн. Поэтому хотелось бы чтобы ассеты были после шаблона
  2. Я согласен что не нужно, но это рекомендация ваша же из тг чата)) окей значит об assetManager нужно упомянуть в доке.
  1. А почему тогда не переопределять в шаблоне? Там есть метод с ассетами, ставьте как требуется, зачем это делать через сахар для ленивых (ну и новые методы решат в любом случае эту задачу)
  2. Мы еще не писали в доке про ассет менеджер поэтому тема не раскрыта
ArtemYurov commented 3 days ago
  1. Так зачем мне переопределять во всём шаблоне, если мне нужно только на одной странице например изменить высоту таблицы?
lee-to commented 3 days ago
  1. Так зачем мне переопределять во всём шаблоне, если мне нужно только на одной странице например изменить высоту таблицы?

Ждать когда я добавлю методы append/prepend и сделать

$this->assetManager()->prepend()

lee-to commented 2 days ago

1352

ArtemYurov commented 2 days ago

Так, ещё до кучи про компоненты - там же тогда тоже нужно prepend. Сейчас есть trait WithAssets. Там есть методы:

    public function addAssets(array $assets): static
    {
        $this->getAssetManager()->add($assets);

        return $this;
    }

    public function pushAssets(array $assets): static
    {
        $this->assets = array_merge($this->assets, $assets);

        return $this;
    }
lee-to commented 2 days ago

Множество изменений, в том числе и ломающих совместимость описал в доке

https://github.com/moonshine-software/doc/commit/ed98d4613baa0bd47361693e0d7b27d82082d13f

ArtemYurov commented 2 days ago

у меня был такой код в ресурсе:

    protected function onLoad(): void
    {
        $this->getIndexPage()->pushToLayer(
            layer: Layer::TOP,
            component: Fragment::make([
            ....
            ])->name('metrics2')
            ->addAssets([InlineCss::make("
                .box-shadow:before {
                    display: none
                }
            ")]),
        );

    }

сейчас этот assets перестал добавляться. И я правильно понял доку что в этом случае на лету у нас должно быть такое же поведение: Метод add будет зависеть от жизненного цикла приложения.