isLazy($gridField)) { if ($dataList instanceof Filterable) { // If our original list can be filtered, filter out all results. $dataList = $dataList->byIDs([-1]); } else { // If not, create an empty list instead. $dataList = ArrayList::create([]); } } return $dataList; } /** * Apply an appropriate CSS class to `$gridField` based on whatever the current request is lazy loadable or not. * * @param GridField $gridField * @return array */ public function getHTMLFragments($gridField) { $gridField->addExtraClass($this->isLazy($gridField) ? 'grid-field--lazy-loadable' : 'grid-field--lazy-loaded'); return []; } /** * Detect if the current request should include results. * @param GridField $gridField * @return bool */ private function isLazy(GridField $gridField) { return $gridField->getRequest()->getHeader('X-Pjax') !== 'CurrentField' && $this->isInTabSet($gridField); } /** * Recursively check if $field is inside a TabSet. * @param FormField $field * @return bool */ private function isInTabSet(FormField $field) { $list = $field->getContainerFieldList(); if ($list && $containerField = $list->getContainerField()) { // Classes that extends TabSet might not have the expected JS to lazy load. return get_class($containerField) === TabSet::class ?: $this->isInTabSet($containerField); } return false; } }