stub of the row editor

This commit is contained in:
2018-08-05 14:45:43 +02:00
parent e17548e5e7
commit bb8bc459dc
34 changed files with 724 additions and 175 deletions
+114 -10
View File
@@ -40,39 +40,43 @@ class Changeset
* Rows whose content changed, identified by _id.
* Only changed values are to be filled. Columns are identified by GCIDs
*
* @var array|null - [[_id:…, …], …]
* Key'd by _id
*
* @var array|null - [_id -> [_id:…, cid:…, cid:…], …]
*/
public $rowUpdates;
public $rowUpdates = [];
/**
* New rows in the full Row::data format, including GRIDs.
* Values are identified by GCIDs from previously defined, or new columns.
*
* @var array|null - [[_id:…, …], …]
* @var array|null - [[_id:…, cid:…, cid:…], …]
*/
public $newRows;
public $newRows = [];
/**
* Rows to be removed
*
* @var int[]|null - GRIDs
*/
public $removedRows;
public $removedRows = [];
/**
* Values changed in column specifications, such as name, title, etc.
* This does not affect the table rows in any way.
*
* @var array[] - column specification objects, with GCIDs
* Key'd by id
*
* @var array[] - column specification objects, with GCIDs, key'd by CID
*/
public $columnUpdates;
public $columnUpdates = [];
/**
* New columns in the full format, including GCIDs
*
* @var array|null - [[id:…, …], …]
*/
public $newColumns;
public $newColumns = [];
/**
* When reordering columns, here is the column IDs array
@@ -84,7 +88,7 @@ class Changeset
*
* @var string[]|null - GCIDs
*/
public $columnOrder;
public $columnOrder = [];
/**
* Columns to be removed
@@ -94,7 +98,10 @@ class Changeset
*
* @var int[]|null - GCIDs
*/
public $removedColumns;
public $removedColumns = [];
/** @var Column[] - loaded and transformed columns, cached from previous call to transformColumns() */
private $cachedColumns;
private function walkProps()
{
@@ -146,6 +153,11 @@ class Changeset
return $object;
}
/**
* Check if there is any change in this changeset
*
* @return bool - any found
*/
public function hasAnyChanges()
{
foreach ($this->walkProps() as $prop) {
@@ -156,4 +168,96 @@ class Changeset
return false;
}
/**
* Decorate / transform a single row for the editor view
*
* @param object|\DecoratedRow $row - row, must be key'd by column ids
* @param bool $decorate - to add extra underscored info for the editor
* @return \DecoratedRow|object|null - null if not decorating and the row was removed
*/
public function transformRow($row, $decorate)
{
if ($decorate) {
$row->_remove = false;
$row->_changed = [];
$row->_orig = [];
}
// Removed rows
if (in_array($row->_id, $this->removedRows)) {
if ($decorate) {
$row->_remove = true;
} else {
return null;
}
}
// Changed values
if (isset($this->rowUpdates[$row->_id])) {
$newVals = $this->rowUpdates[$row->_id];
if ($decorate) {
$row->_changed = array_keys($newVals);
$row->_orig = array_only((array)$row, $row->_changed);
}
$row = (object)array_merge((array)$row, $newVals);
}
// Drop deleted columns
if (!$decorate) {
foreach ($this->removedColumns as $colId) {
unset($row->$colId);
}
}
unset($row->_row_pivot);
return $row;
}
/**
* Decorate / transform columns (loaded from the source revision)
*
* @return Column[]
*/
public function transformColumns()
{
if ($this->cachedColumns) return $this->cachedColumns;
$columns = Column::columnsFromJson($this->revision->columns);
// Modify columns
$byId = [];
foreach ($columns as $column) {
$byId[$column->id] = $column;
if (isset($this->columnUpdates[$column->id])) {
$column->modifyByChangeset($this->columnUpdates[$column->id]);
}
if (in_array($column->id, $this->removedColumns)) {
$column->markForRemoval();
}
}
// Append new columns
foreach ($this->newColumns as $newColumn) {
$columns[] = $c =new Column($newColumn);
$c->markAsNew();
}
// Reorder
$newOrder = [];
foreach ($this->columnOrder as $id) {
$newOrder[] = $byId[$id];
}
$leftover_keys = array_diff(array_keys($byId), $this->columnOrder);
foreach ($leftover_keys as $id) {
$newOrder[] = $byId[$id];
}
return $this->cachedColumns = $newOrder;
}
}
+84 -12
View File
@@ -1,9 +1,8 @@
<?php
namespace App\Tables;
use Illuminate\Contracts\Support\Arrayable;
use JsonSerializable;
use MightyPork\Exceptions\NotApplicableException;
use MightyPork\Utils\Utils;
@@ -15,8 +14,20 @@ use MightyPork\Utils\Utils;
* @property-read string $type
* @property-read string $name
* @property-read string $title
* @property-read bool $isNew
* @property-read bool $toRemove
*
* @property-read bool $id_modified
* @property-read bool $type_modified
* @property-read bool $name_modified
* @property-read bool $title_modified
*
* @property-read string $id_orig
* @property-read string $type_orig
* @property-read string $name_orig
* @property-read string $title_orig
*/
class Column implements JsonSerializable
class Column implements JsonSerializable, Arrayable
{
const colTypes = [
'int', 'bool', 'float', 'string'
@@ -27,6 +38,76 @@ class Column implements JsonSerializable
private $name;
private $title;
/** @var bool - column is marked to be deleted by a changeset */
private $toRemove = false;
/** @var bool - column is new in this changeset */
private $isNew = false;
/** @var array - original attrib values if edited in a changeset */
private $orig_attribs = [];
/** @var array - list of attrib names that are modified by a changeset */
private $modified_attribs = [];
/**
* Mark for removal (used in editing GUI)
*/
public function markForRemoval()
{
$this->toRemove = true;
}
/**
* Mark this column as new
*/
public function markAsNew()
{
$this->isNew = true;
}
/**
* Modify by a changeset
*
* @param array $columnObject
*/
public function modifyByChangeset(array $columnObject)
{
foreach ((array)$columnObject as $key => $value) {
if ($value != $this->$key) {
$this->modified_attribs[] = $key;
$this->orig_attribs[] = $this->$key;
$this->$key = $value;
}
}
}
public function __get($name)
{
if (property_exists($this, $name)) {
return $this->$name;
}
if (ends_with($name, '_modified')) {
$basename = str_replace('_modified', '', $name);
if (property_exists($this, $basename)) {
return in_array($basename, $this->modified_attribs);
}
}
if (ends_with($name, '_orig')) {
$basename = str_replace('_orig', '', $name);
if (property_exists($this, $basename)) {
return $this->orig_attribs[$basename];
}
}
throw new NotApplicableException("No such column property: $name");
}
/**
* @param $columns
* @return Column[]
*/
public static function columnsFromJson($columns)
{
if (is_string($columns)) {
@@ -73,15 +154,6 @@ class Column implements JsonSerializable
$this->title = $b->title ?: $b->name;
}
public function __get($name)
{
if (property_exists($this, $name)) {
return $this->$name;
}
throw new NotApplicableException("No such column property: $name");
}
/**
* @return array with keys {name, title, type}
*/