/**
  * Handle the command.
  */
 public function handle()
 {
     $stream = $this->builder->getTableStream();
     if (!$stream instanceof StreamInterface) {
         return;
     }
     $eager = [];
     if ($stream->isTranslatable()) {
         $eager[] = 'translations';
     }
     $assignments = $stream->getRelationshipAssignments();
     foreach ($this->builder->getColumns() as $column) {
         /**
          * If the column value is a string and uses a dot
          * format then check if it's a relation.
          */
         if (isset($column['value']) && is_string($column['value']) && preg_match("/^entry.([a-zA-Z\\_]+)./", $column['value'], $match)) {
             if ($assignment = $assignments->findByFieldSlug($match[1])) {
                 if ($assignment->getFieldType()->getNamespace() == 'anomaly.field_type.polymorphic') {
                     continue;
                 }
                 $eager[] = camel_case($match[1]);
             }
         }
     }
     $this->builder->setTableOption('eager', array_unique($this->builder->getTableOption('eager', []) + $eager));
 }
 /**
  * Set defaults.
  *
  * @param TableBuilder $builder
  */
 public function defaults(TableBuilder $builder)
 {
     $stream = $builder->getTableStream();
     if ($builder->getColumns() == []) {
         $builder->setColumns([$stream->getTitleColumn()]);
     }
 }
 /**
  * Normalize the column input.
  *
  * @param TableBuilder $builder
  */
 public function normalize(TableBuilder $builder)
 {
     $columns = $builder->getColumns();
     foreach ($columns as $key => &$column) {
         /*
          * If the key is non-numerical then
          * use it as the header and use the
          * column as the column if it's a class.
          */
         if (!is_numeric($key) && !is_array($column) && class_exists($column)) {
             $column = ['heading' => $key, 'column' => $column];
         }
         /*
          * If the key is non-numerical then
          * use it as the header and use the
          * column as the value.
          */
         if (!is_numeric($key) && !is_array($column) && !class_exists($column)) {
             $column = ['heading' => $key, 'value' => $column];
         }
         /*
          * If the column is not already an
          * array then treat it as the value.
          */
         if (!is_array($column)) {
             $column = ['value' => $column];
         }
         /*
          * If the key is non-numerical and
          * the column is an array without
          * a heading then use the key.
          */
         if (!is_numeric($key) && is_array($column) && !array_has($column, 'field')) {
             $column['field'] = $key;
         }
         /*
          * If the key is non-numerical and
          * the column is an array without
          * a value then use the key.
          */
         if (!is_numeric($key) && is_array($column) && !isset($column['value'])) {
             $column['value'] = $key;
         }
         /*
          * If no value wrap is set
          * then use a default.
          */
         array_set($column, 'wrapper', array_get($column, 'wrapper', '{value}'));
         /*
          * If there is no value then use NULL
          */
         array_set($column, 'value', array_get($column, 'value', null));
     }
     $builder->setColumns($columns);
 }
 /**
  * Resolve table views.
  *
  * @param TableBuilder $builder
  */
 public function resolve(TableBuilder $builder)
 {
     $this->resolver->resolve($builder->getColumns(), compact('builder'));
 }
 /**
  * Evaluate the table columns.
  *
  * @param TableBuilder $builder
  */
 public function evaluate(TableBuilder $builder)
 {
     $builder->setColumns($this->evaluator->evaluate($builder->getColumns(), compact('builder')));
 }
 /**
  * Guess the sortable flags for headers.
  *
  * @param TableBuilder $builder
  */
 public function guess(TableBuilder $builder)
 {
     $columns = $builder->getColumns();
     $stream = $builder->getTableStream();
     foreach ($columns as &$column) {
         if ($builder->getTableOption('sortable_headers') === false) {
             $column['sortable'] = false;
             continue;
         }
         /*
          * If the heading is false or does not exist
          * then the intent was to not have
          * heading text at all.
          */
         if (!isset($column['heading']) || $column['heading'] === false) {
             continue;
         }
         /*
          * If sortable is already set the we don't
          * need to guess anything.
          */
         if (isset($column['sortable'])) {
             continue;
         }
         /*
          * If the sort column is set and
          * sortable is not yet, set it.
          */
         if (isset($column['sort_column'])) {
             $column['sortable'] = true;
             continue;
         }
         /*
          * No stream means we can't
          * really do much here.
          */
         if (!$stream instanceof StreamInterface) {
             continue;
         }
         /*
          * We're going to be using the value to
          * try and determine if a streams field is
          * being used. No value, no guess.
          */
         if (!isset($column['value']) || !$column['value'] || !is_string($column['value'])) {
             continue;
         }
         /*
          * Now we're going to try and determine
          * what streams field this column if
          * using if any at all.
          */
         $field = $column['value'];
         /*
          * If the value matches a field
          * with dot format then reduce it.
          */
         if (preg_match("/^entry.([a-zA-Z\\_]+)/", $column['value'], $match)) {
             $field = $match[1];
         }
         /*
          * If we can't determine a field type
          * then we don't have anything to base
          * our guess off of.
          */
         if (!($assignment = $stream->getAssignment($field))) {
             continue;
         }
         $type = $assignment->getFieldType();
         /*
          * If the field type has a database
          * column type then we can sort on it
          * by default!
          *
          * @todo: Allow sorting of translatable fields.
          */
         if ($type->getColumnType() && !$assignment->isTranslatable()) {
             $column['sortable'] = true;
             $column['sort_column'] = $type->getColumnName();
         } else {
             $column['sortable'] = false;
         }
     }
     $builder->setColumns($columns);
 }
 /**
  * Guess the field for a column.
  *
  * @param TableBuilder $builder
  */
 public function guess(TableBuilder $builder)
 {
     $columns = $builder->getColumns();
     $stream = $builder->getTableStream();
     $module = $this->modules->active();
     foreach ($columns as &$column) {
         /*
          * If the heading is already set then
          * we don't have anything to do.
          */
         if (isset($column['heading'])) {
             continue;
         }
         /*
          * If the heading is false, then no
          * header is desired at all.
          */
         if (isset($column['heading']) && $column['heading'] === false) {
             continue;
         }
         /*
          * No stream means we can't
          * really do much here.
          */
         if (!$stream instanceof StreamInterface) {
             continue;
         }
         if (!isset($column['field']) && is_string($column['value'])) {
             $column['field'] = $column['value'];
         }
         /*
          * If the heading matches a field
          * with dot format then reduce it.
          */
         if (isset($column['field']) && preg_match("/^entry.([a-zA-Z\\_]+)/", $column['field'], $match)) {
             $column['field'] = $match[1];
         }
         /*
          * Detect some built in columns.
          */
         if (in_array($column['field'], ['id', 'created_at', 'created_by', 'updated_at', 'updated_by'])) {
             $column['heading'] = 'streams::entry.' . $column['field'];
             continue;
         }
         /*
          * Detect entry title.
          */
         if (in_array($column['field'], ['view_link', 'edit_link']) && ($field = $stream->getTitleField())) {
             $column['heading'] = $field->getName();
             continue;
         }
         $field = $stream->getField(array_get($column, 'field'));
         /*
          * Detect the title column.
          */
         $title = $stream->getTitleField();
         if ($title && !$field && $column['field'] == 'title' && $this->translator->has($heading = $title->getName())) {
             $column['heading'] = $heading;
         }
         /*
          * Use the name from the field.
          */
         if ($field && ($heading = $field->getName())) {
             $column['heading'] = $heading;
         }
         /*
          * If no field look for
          * a name anyways.
          */
         if ($module && !$field && $this->translator->has($heading = $module->getNamespace('field.' . $column['field'] . '.name'))) {
             $column['heading'] = $heading;
         }
         /*
          * If no translatable heading yet and
          * the heading matches the value (default)
          * then humanize the heading value.
          */
         if (!isset($column['heading']) && $this->config->get('streams::system.lazy_translations')) {
             $column['heading'] = ucwords($this->string->humanize($column['field']));
         }
         /*
          * If we have a translatable heading and
          * the heading does not have a translation
          * then humanize the heading value.
          */
         if (isset($column['heading']) && str_is('*.*.*::*', $column['heading']) && !$this->translator->has($column['heading']) && $this->config->get('streams::system.lazy_translations')) {
             $column['heading'] = ucwords($this->string->humanize($column['field']));
         }
         /*
          * Last resort.
          */
         if ($module && !isset($column['heading'])) {
             $column['heading'] = $module->getNamespace('field.' . $column['field'] . '.name');
         }
     }
     $builder->setColumns($columns);
 }