public function index()
 {
     if (!Auth::check()) {
         return LoginController::getIndex();
     }
     LoginController::updateUserPermissions();
     //why not
     # Trail
     Trail::clear();
     $tables = array_where(config('center.tables'), function ($key, $value) {
         return !$value->hidden && LoginController::checkPermission($value->name, 'view');
     });
     $groups = $objects = [];
     foreach ($tables as $table) {
         $latest = DB::table($table->name)->leftJoin(config('center.db.users') . ' as u2', $table->name . '.updated_by', '=', 'u2.id')->select('u2.name as updated_name', $table->name . '.updated_at')->orderBy($table->name . '.updated_at', 'desc')->first();
         if (!isset($groups[$table->list_grouping])) {
             $groups[$table->list_grouping] = [];
         }
         $groups[$table->list_grouping][] = (object) ['title' => $table->title, 'list_grouping' => $table->list_grouping, 'link' => action('\\LeftRight\\Center\\Controllers\\RowController@index', $table->name), 'updated_name' => isset($latest->updated_name) ? $latest->updated_name : '', 'updated_at' => isset($latest->updated_at) ? $latest->updated_at : '', 'count' => number_format(DB::table($table->name)->count())];
     }
     foreach ($groups as $group) {
         $objects = array_merge($objects, $group);
     }
     $table = new Table();
     $table->rows($objects);
     $table->column('title', 'string', trans('center::site.table'));
     $table->column('count', 'integer', trans('center::site.count'));
     $table->column('updated_name', 'updated_name', trans('center::site.updated_name'));
     $table->column('updated_at', 'updated_at', trans('center::site.updated_at'));
     $table->groupBy('list_grouping');
     $table = $table->draw('tables');
     return view('center::tables.index', compact('table'));
 }
Exemple #2
0
    public function index($table_name, $linked_field = false, $linked_row = false)
    {
        # Get info about the object
        $table = config('center.tables.' . $table_name);
        //dd($table);
        # Trail
        if (!$linked_field) {
            Trail::clear();
        }
        # Security -- todo hidden?
        if (!isset($table->name)) {
            return redirect()->action('\\LeftRight\\Center\\Controllers\\TableController@index')->with('error', trans('center::site.table_does_not_exist'));
        } elseif (!LoginController::checkPermission($table->name, 'view')) {
            if ($linked_field && $linked_row) {
                return false;
            }
            return redirect()->action('\\LeftRight\\Center\\Controllers\\TableController@index')->with('error', trans('center::site.no_permissions_view'));
        }
        # Custom index?
        //if ($table->index) return call_user_func($table->index);
        # Start query
        $rows = DB::table($table->name);
        # Table columns
        $columns = [];
        # Build select statement
        $rows->select([$table->name . '.id']);
        foreach ($table->list as $field) {
            if ($field == $linked_field) {
                continue;
            }
            $field = $table->fields->{$field};
            if ($field->type == 'checkboxes') {
                $rows->addSelect(DB::raw('(SELECT GROUP_CONCAT(' . $field->source . '.' . self::listColumn($field->source) . ' SEPARATOR ", ") 
					FROM ' . $field->source . ' 
					JOIN ' . $field->name . ' ON ' . $field->source . '.id = ' . $field->name . '.' . self::formatKeyColumn($field->source) . '
					WHERE ' . $field->name . '.' . self::formatKeyColumn($table->name) . ' = ' . $table->name . '.id 
					ORDER BY ' . $field->source . '.' . self::listColumn($field->source) . ') AS ' . $field->name));
            } elseif ($field->type == 'image') {
                $rows->leftJoin(config('center.db.files'), $table->name . '.' . $field->name, '=', config('center.db.files') . '.id')->addSelect(config('center.db.files') . '.url AS ' . $field->name . '_url');
            } elseif (in_array($field->type, ['select', 'user'])) {
                $rows->leftJoin($field->source, $field->name, '=', $field->source . '.id')->addSelect($field->source . '.' . self::listColumn($field->source) . ' AS ' . $field->name);
            } else {
                //normal, selectable field
                $rows->addSelect($table->name . '.' . $field->name);
            }
            //add to table columns
            $columns[] = $field;
        }
        # Handle group-by fields
        $table->nested = false;
        if (!empty($table->group_by)) {
            if (strpos($table->group_by, '::')) {
                list($object, $method) = explode('::', $table->group_by);
                if (class_exists($object)) {
                    //call arbitrary user function
                    $rows = call_user_func($table->group_by, $rows);
                }
            } else {
                $grouped_table = config('center.tables.' . $table->fields->{$table->group_by}->source);
                $grouped_field = self::listColumn($grouped_table->name);
                if ($grouped_table->name == $table->name) {
                    //nested object
                    $table->nested = true;
                } else {
                    # Include group_by_field in resultset
                    foreach ($grouped_table->order_by as $order_by => $direction) {
                        $rows->orderBy($order_by, $direction);
                    }
                    $rows->leftJoin($grouped_table->name, $table->name . '.' . $table->fields->{$table->group_by}->name, '=', $grouped_table->name . '.id');
                    $rows->addSelect($grouped_table->name . '.' . $grouped_field . ' as group');
                }
            }
        }
        # If linked, limit scope to just the linked row
        if ($linked_field && $linked_row) {
            $rows->where($table->name . '.' . $linked_field, $linked_row);
        }
        # Set the order and direction
        foreach ($table->order_by as $order_by => $direction) {
            $rows->orderBy($order_by, $direction);
        }
        # Soft deletes?
        if (isset($table->fields->deleted_at)) {
            $rows->addSelect($table->name . '.deleted_at');
        }
        $searching = false;
        # Text search?
        if ($table->search && Request::has('search')) {
            $searching = true;
            $rows->where(function ($query) use($table) {
                foreach ($table->search as $field) {
                    $query->orWhere($table->name . '.' . $field, 'LIKE', '%' . Request::input('search') . '%');
                }
            });
        }
        # Filter search?
        foreach ($table->filters as $filter) {
            if (Request::has($filter)) {
                $searching = true;
                $rows->where($table->name . '.' . $filter, Request::input($filter));
            }
        }
        # Run query and save it to a variable
        $rows = $rows->paginate(50);
        # Set URLs on each instance
        if (LoginController::checkPermission($table->name, 'edit')) {
            foreach ($rows as &$row) {
                $row->link = action('\\LeftRight\\Center\\Controllers\\RowController@edit', [$table->name, $row->id, $linked_field, $linked_row]);
                $row->delete = action('\\LeftRight\\Center\\Controllers\\RowController@delete', [$table->name, $row->id]);
            }
        } else {
            foreach ($rows as &$row) {
                $row->link = action('\\LeftRight\\Center\\Controllers\\RowController@pdf', [$table->name, $row->id]);
            }
        }
        # If it's a nested object, nest-ify the resultset
        if ($table->nested) {
            $list = array();
            foreach ($rows as &$row) {
                $row->children = array();
                if (empty($row->{$grouped_field->name})) {
                    //$grouped_field->name is for ex parent_id
                    $list[] = $row;
                } elseif (self::nestedNodeExists($list, $row->{$grouped_field->name}, $row)) {
                    //attached child to parent node
                } else {
                    //an error occurred; a parent should exist but is not yet present
                }
            }
            $rows = $list;
        }
        # Search filters for the sidebar
        $filters = [];
        foreach ($table->filters as $filter) {
            if ($table->fields->{$filter}->type == 'us_state') {
                $filters[$filter] = ['' => $table->fields->{$filter}->title] + trans('center::site.us_states');
            } elseif ($table->fields->{$filter}->type == 'country') {
                $filters[$filter] = ['' => $table->fields->{$filter}->title] + trans('center::site.countries');
            } else {
                $related_table = config('center.tables.' . $table->fields->{$filter}->source);
                $options = DB::table($related_table->name);
                foreach ($related_table->order_by as $column => $direction) {
                    $options->orderBy($column, $direction);
                }
                $options->whereIn('id', DB::table($table->name)->distinct()->lists($filter));
                $options = $options->lists(self::listColumn($related_table), 'id');
                $filters[$filter] = ['' => $related_table->title] + $options;
            }
        }
        $return = compact('table', 'columns', 'rows', 'filters', 'searching', 'linked_field', 'linked_row');
        # Return array to edit()
        if ($linked_field && $linked_row) {
            return $return;
        }
        # Return HTML view
        return view('center::rows.index', $return);
    }