stub of the row editor
This commit is contained in:
+114
-10
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user