4.95.29
-
Добавлены колбеки на поля. Теперь каждому полю доступен ряд колбеков и ряд логики с операциями Order,
Search(основной на Async) и FilterSearch (отдельный фильтр на колонке переопределение его логики)
Если у вас есть кастомная логика на Order или Search или FilterSearch вы можете вызвать на коламне:setSearchCallback(function($column, $query, $search){ //Тут ваша логика //например $query->where($column->getName(), 'like', "%$search%"); })
setOrderCallback(function($column, $query, $search){ //Тут ваша логика //например $query->orderBy($column->getName(), 'asc'); })
setFilterCallback(function($column, $query, $search){ //Тут ваша логика })
Если у вас много однотипной логики, которую вы не хотите прописывать в каждом коламне
вы можете вызвать:->setMetaData(SomeColumnMetaData::class)
SomeColumnMetaData.php
namespace App\Modules\Nhs\Admin\ColumnsMeta; use Illuminate\Database\Eloquent\Builder; use SleepingOwl\Admin\Contracts\Display\ColumnMetaInterface; use SleepingOwl\Admin\Contracts\Display\NamedColumnInterface; class SomeColumnMetaData implements ColumnMetaInterface { public function onFilterSearch(NamedColumnInterface $column, Builder $query, $queryString, $queryParams) { // TODO: Implement onFilterSearch() method. } public function onOrderBy(NamedColumnInterface $column, Builder $query, $direction) { // TODO: Implement onOrderBy() method. } public function onSearch(NamedColumnInterface $column, Builder $query, $queryString) { // TODO: Implement onSearch() method. } }
Вы можете создать любой из этих методов - и все они будут работать.
Так же на каждом фильтре есть свой колбек (если честно надобность его я не особо понимаю однако оставил ввиду обратной совестимости)
Вызвать его можно на фильтре setCallback()Помните про приоритет прерывания (расположены по старшинству):
- Если у вас есть ColumnMeta::class - сработает только тот метод который будет в нем (onSearch onFilterSearch onOrderBy)
дальнейшую логику он прервет - Если у вас setSearchCallback - сработает он и дальнейшая логика будет прервана
- Если у вас есть setCallback - непосредственно на фильтре - в операции Filter он сработает если не будет ни колбека на коламне - ни колбека в ColumnMeta::class
- Если у вас нету ничего из вышеперечисленного - сработает дефолтная логика всех 3 операций
Всем добра
- Если у вас есть ColumnMeta::class - сработает только тот метод который будет в нем (onSearch onFilterSearch onOrderBy)
-
Исправлена дефолтная логика сортировки для столбцов с отношениями. Теперь в секции Users поле post.name
поле будет сортироваться без ошибок. Однако эта сортировка не будет работать с EagerLoad, то есть она не будет сортировать поле
в секцииPosts
-category.user.name
(TODO) -
Добавлен тип
OrderTreeType::class
который ограничивает дерево только на первый уровень
(работает без parent_id) и позволяет сортировать элементы
Пример можно увидеть по ссылке в демо
Пример кода можно увидеть в секции PageOrders.php -
Добавлена возможность указывать деревьям максимальный уровень вложенности
setMaxDepth(10)
-
Добавлен метод setDisplaySearch(true|false) для установки параметра отображения общего поля поиска для DataTablesAsync
-
Добавлен коллбек на мультиселект и ajax-мультиселект который контролирует pivot-data
AdminFormElement::multiselectajax('someBelongToManyRelation', "SomeLabel") ->setModelForOptions(SomeModelWithBelongsToRelation::class) ->setDisplay('some_display_field') ->setPivotCallback(function($values){ //$values - массив данных что будет передаваться в sync //Обычно это массив id [1, 2, 3]; //Что бы sync сьел данные с pivot нужно сделать так //[1 => ['order' => 9], 2 => ['order' => 6], 3 => ['order' => 7] ] //И после вернуть значение $values return $values; }), ->required()
-
Теперь после обработки формы если у вас на форме есть таб и если даже этот таб внутри таба
родительский определится и будет активным. Больше не нужно переключаться все время с первого на нужный
Протестировать можно тут -
Теперь политики поддерживают Light-DDD структуру
AdminSectionServiceProvider теперь имеется $policies (property)не путать с методом.
это ассоциативный массив Section::class => Policy::class. Если для секции правило в этом массиве не определено,
то Gate будет запрашивать неймспейс политик указанный в sleeping_owl.php + имя секции + SectionModelPolicy
т.е. Если секция называется Users то политика будет к примеру App\Policy\UsersSectionModelPolicy.php - это не всегда удобно.
Теперь с помощью $policies можно хранить политики где угодно. -
Поправлено поведение payload реализованном в этом #432 issue ( не работал с async )
if(!is_null($id)) { $contacts = AdminSection::getModel(Contact::class)->fireDisplay(['scopes' => ['withBusiness', $id]]); $tabs[] = AdminDisplay::tab($contacts) ->setLabel("Contacts") ->setIcon('<i class="fa fa-credit-card"></i>'); }
В секции должно быть что то типо
public function onDisplay($scopes = []) { $display = AdminDisplay::datatablesAsync()->paginate(10); if($scopes){ $display->getScopes()->push($scopes); } }
-
Пофикшено поведение AdminColumnEditable, в нашем случае checkbox в табах и коламнах
-
Добавлен метод getCancelUrl для установки Url кнопки Отмены
-
Переработан механизм кнопок формы
- Теперь кнопки формы можно засунуть под либо над любым полем в форме (помимо стандартного их места нахождения)
- Кнопки теперь отдельные объекты с возможностью указать свои аттрибуты.
- Кнопки теперь можно менять местами и заменять в стандартном наборе
- Каждая кнопка имеет набор групповых параметров groupElements которые являеются элементами ( выводятся в дропдауне )
- Можно добавлять в набор свои кнопки используя класс FormButton
- Ищите примеры в демо-репозитори - документацию в ближайшее время подотовит @Lunatig
-
Исправлены поведения фильтров ( пофикшена работа с BigData - добавлены эвенты обработки на Enter и Доп. Кнопка
в ControlColumn, которую кстати можно задавать самостоятельно) -
Исправлена работа dataTablesAsync в AdminDisplayTabbed
-
Пофикшены проблемы, идентифицированы новые ( скорее всего добавлены новые )
-
Фильтры переработаны с эвентов keyup и change на эвенты keyup (keyCode=ENTER) и общую кнопку
-
Добавлены баджи к tab (имеется проблема с css, но не у всех) читать в документации
-
Добавлена поддержка HtmlAttributes для всех AdminFormElement кроме File,Upload,Image,Images
Теперь AdminFormElement поддерживает методы setHtmlAttributes, setHtmlAttribute и прочие. -
Рефакторинг JS кода (http://sleepingowladmin.ru/docs/javascript)
Отказ от хранения настроек по url
admin/scripts
, теперь глобальный конфиг хранится в body шаблона.
Переносapp.js
в футер