123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- <?php
- namespace Dcat\Admin\Form;
- use Dcat\Admin\Form;
- use Illuminate\Support\Collection;
- class Tab
- {
- /**
- * @var Form
- */
- protected $form;
- /**
- * @var Collection
- */
- protected $tabs;
- /**
- * @var int
- */
- protected $offset = 0;
- /**
- * Tab constructor.
- *
- * @param Form $form
- */
- public function __construct(Form $form)
- {
- $this->form = $form;
- $this->tabs = new Collection();
- }
- /**
- * Append a tab section.
- *
- * @param string $title
- * @param \Closure $content
- * @param bool $active
- *
- * @return $this
- */
- public function append($title, \Closure $content, $active = false)
- {
- $fields = $this->collectFields($content);
- $id = 'tab-form-'.($this->tabs->count() + 1).'-'.mt_rand(0, 9999);
- $this->tabs->push(compact('id', 'title', 'fields', 'active'));
- return $this;
- }
- /**
- * Collect fields under current tab.
- *
- * @param \Closure $content
- *
- * @return Collection
- */
- protected function collectFields(\Closure $content)
- {
- call_user_func($content, $this->form);
- $fields = clone $this->form->builder()->fields();
- $all = $fields->toArray();
- foreach ($this->form->rows() as $row) {
- $rowFields = array_map(function ($field) {
- return $field['element'];
- }, $row->getFields());
- $match = false;
- foreach ($rowFields as $field) {
- if (($index = array_search($field, $all)) !== false) {
- if (! $match) {
- $fields->put($index, $row);
- } else {
- $fields->pull($index);
- }
- $match = true;
- }
- }
- }
- $fields = $fields->slice($this->offset);
- $this->offset += $fields->count();
- return $fields;
- }
- /**
- * Get all tabs.
- *
- * @return Collection
- */
- public function getTabs()
- {
- // If there is no active tab, then active the first.
- if ($this->tabs->filter(function ($tab) {
- return $tab['active'];
- })->isEmpty()) {
- $first = $this->tabs->first();
- $first['active'] = true;
- $this->tabs->offsetSet(0, $first);
- }
- return $this->tabs;
- }
- /**
- * @return bool
- */
- public function isEmpty()
- {
- return $this->tabs->isEmpty();
- }
- }
|