mirror of
https://github.com/Karaka-Management/oms-Kanban.git
synced 2026-01-11 11:28:42 +00:00
new datamapper mostly implemented
This commit is contained in:
parent
b345f1131f
commit
6b42f1394f
|
|
@ -354,7 +354,7 @@ final class ApiController extends Controller
|
|||
*/
|
||||
public function apiKanbanBoardUpdate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void
|
||||
{
|
||||
$old = clone KanbanBoardMapper::get((int) $request->getData('id'));
|
||||
$old = clone KanbanBoardMapper::get()->where('id', (int) $request->getData('id'))->execute();
|
||||
$new = $this->updateBoardFromRequest($request);
|
||||
$this->updateModel($request->header->account, $old, $new, KanbanBoardMapper::class, 'board', $request->getOrigin());
|
||||
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Board', 'Board successfully updated', $new);
|
||||
|
|
@ -372,7 +372,7 @@ final class ApiController extends Controller
|
|||
private function updateBoardFromRequest(RequestAbstract $request) : KanbanBoard
|
||||
{
|
||||
/** @var KanbanBoard $board */
|
||||
$board = KanbanBoardMapper::get((int) $request->getData('id'));
|
||||
$board = KanbanBoardMapper::get()->where('id', (int) $request->getData('id'))->execute();
|
||||
$board->name = $request->getData('title') ?? $board->name;
|
||||
$board->description = Markdown::parse((string) ($request->getData('plain') ?? $board->descriptionRaw));
|
||||
$board->descriptionRaw = (string) ($request->getData('plain') ?? $board->descriptionRaw);
|
||||
|
|
|
|||
|
|
@ -18,8 +18,10 @@ use Modules\Kanban\Models\KanbanBoardMapper;
|
|||
use Modules\Kanban\Models\KanbanCardMapper;
|
||||
use Modules\Kanban\Models\PermissionState;
|
||||
use phpOMS\Account\PermissionType;
|
||||
use phpOMS\Algorithm\Sort\SortOrder;
|
||||
use phpOMS\Asset\AssetType;
|
||||
use phpOMS\Contract\RenderableInterface;
|
||||
use phpOMS\DataStorage\Database\Query\OrderType;
|
||||
use phpOMS\Message\Http\RequestStatusCode;
|
||||
use phpOMS\Message\RequestAbstract;
|
||||
use phpOMS\Message\ResponseAbstract;
|
||||
|
|
@ -74,10 +76,14 @@ final class BackendController extends Controller
|
|||
$view->setTemplate('/Modules/Kanban/Theme/Backend/kanban-dashboard');
|
||||
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005801001, $request, $response));
|
||||
|
||||
$list = KanbanBoardMapper
|
||||
::with('columns', models: null)
|
||||
::with('language', $response->getLanguage())
|
||||
::getNewest(20, depth: 3);
|
||||
$list = KanbanBoardMapper::getAll()
|
||||
->with('tags')
|
||||
->with('tags/title')
|
||||
->where('tags/title/language', $request->getLanguage())
|
||||
->sort('createdAt', OrderType::DESC)
|
||||
->limit(20)
|
||||
->execute();
|
||||
|
||||
$view->setData('boards', $list);
|
||||
|
||||
return $view;
|
||||
|
|
@ -99,8 +105,15 @@ final class BackendController extends Controller
|
|||
{
|
||||
$view = new View($this->app->l11nManager, $request, $response);
|
||||
|
||||
$board = KanbanBoardMapper::with('language', $response->getLanguage())
|
||||
::get((int) $request->getData('id'), depth: 5);
|
||||
$board = KanbanBoardMapper::get()
|
||||
->with('columns')
|
||||
->with('columns/cards')
|
||||
->with('columns/cards/tags')
|
||||
->with('columns/cards/tags/title')
|
||||
->where('id', (int) $request->getData('id'))
|
||||
->where('columns/cards/tags/title/language', $request->getLanguage())
|
||||
->execute();
|
||||
|
||||
$accountId = $request->header->account;
|
||||
|
||||
if ($board->createdBy->getId() !== $accountId
|
||||
|
|
@ -138,9 +151,13 @@ final class BackendController extends Controller
|
|||
$view->setTemplate('/Modules/Kanban/Theme/Backend/kanban-archive');
|
||||
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005801001, $request, $response));
|
||||
|
||||
$list = KanbanBoardMapper::with('columns', models: null)
|
||||
::with('language', $response->getLanguage())
|
||||
::getNewest(20, depth: 3);
|
||||
$list = KanbanBoardMapper::getAll()
|
||||
->with('tags')
|
||||
->with('tags/title')
|
||||
->where('tags/title/language', $request->getLanguage())
|
||||
->sort('createdAt', OrderType::DESC)
|
||||
->limit(25)
|
||||
->execute();
|
||||
|
||||
$view->setData('boards', $list);
|
||||
|
||||
|
|
@ -195,7 +212,7 @@ final class BackendController extends Controller
|
|||
{
|
||||
$view = new View($this->app->l11nManager, $request, $response);
|
||||
|
||||
$card = KanbanCardMapper::get((int) $request->getData('id'));
|
||||
$card = KanbanCardMapper::get()->where('id', (int) $request->getData('id'))->execute();
|
||||
$accountId = $request->header->account;
|
||||
|
||||
if ($card->createdBy->getId() !== $accountId
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ namespace Modules\Kanban\Models;
|
|||
|
||||
use Modules\Admin\Models\AccountMapper;
|
||||
use Modules\Tag\Models\TagMapper;
|
||||
use phpOMS\DataStorage\Database\DataMapperAbstract;
|
||||
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
|
||||
|
||||
/**
|
||||
* Mapper class.
|
||||
|
|
@ -26,7 +26,7 @@ use phpOMS\DataStorage\Database\DataMapperAbstract;
|
|||
* @link https://orange-management.org
|
||||
* @since 1.0.0
|
||||
*/
|
||||
final class KanbanBoardMapper extends DataMapperAbstract
|
||||
final class KanbanBoardMapper extends DataMapperFactory
|
||||
{
|
||||
/**
|
||||
* Columns.
|
||||
|
|
@ -34,7 +34,7 @@ final class KanbanBoardMapper extends DataMapperAbstract
|
|||
* @var array<string, array{name:string, type:string, internal:string, autocomplete?:bool, readonly?:bool, writeonly?:bool, annotations?:array}>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static array $columns = [
|
||||
public const COLUMNS = [
|
||||
'kanban_board_id' => ['name' => 'kanban_board_id', 'type' => 'int', 'internal' => 'id'],
|
||||
'kanban_board_name' => ['name' => 'kanban_board_name', 'type' => 'string', 'internal' => 'name'],
|
||||
'kanban_board_desc' => ['name' => 'kanban_board_desc', 'type' => 'string', 'internal' => 'description'],
|
||||
|
|
@ -52,7 +52,7 @@ final class KanbanBoardMapper extends DataMapperAbstract
|
|||
* @var array<string, array{mapper:string, table:string, self?:?string, external?:?string, column?:string}>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static array $hasMany = [
|
||||
public const HAS_MANY = [
|
||||
'columns' => [
|
||||
'mapper' => KanbanColumnMapper::class,
|
||||
'table' => 'kanban_column',
|
||||
|
|
@ -73,7 +73,7 @@ final class KanbanBoardMapper extends DataMapperAbstract
|
|||
* @var array<string, array{mapper:string, external:string}>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static array $belongsTo = [
|
||||
public const BELONGS_TO = [
|
||||
'createdBy' => [
|
||||
'mapper' => AccountMapper::class,
|
||||
'external' => 'kanban_board_created_by',
|
||||
|
|
@ -86,7 +86,7 @@ final class KanbanBoardMapper extends DataMapperAbstract
|
|||
* @var string
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static string $table = 'kanban_board';
|
||||
public const TABLE = 'kanban_board';
|
||||
|
||||
/**
|
||||
* Created at.
|
||||
|
|
@ -94,7 +94,7 @@ final class KanbanBoardMapper extends DataMapperAbstract
|
|||
* @var string
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static string $createdAt = 'kanban_board_created_at';
|
||||
public const CREATED_AT = 'kanban_board_created_at';
|
||||
|
||||
/**
|
||||
* Primary field name.
|
||||
|
|
@ -102,5 +102,5 @@ final class KanbanBoardMapper extends DataMapperAbstract
|
|||
* @var string
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static string $primaryField = 'kanban_board_id';
|
||||
public const PRIMARYFIELD ='kanban_board_id';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ namespace Modules\Kanban\Models;
|
|||
|
||||
use Modules\Admin\Models\AccountMapper;
|
||||
use Modules\Media\Models\MediaMapper;
|
||||
use phpOMS\DataStorage\Database\DataMapperAbstract;
|
||||
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
|
||||
|
||||
/**
|
||||
* Mapper class.
|
||||
|
|
@ -26,7 +26,7 @@ use phpOMS\DataStorage\Database\DataMapperAbstract;
|
|||
* @link https://orange-management.org
|
||||
* @since 1.0.0
|
||||
*/
|
||||
final class KanbanCardCommentMapper extends DataMapperAbstract
|
||||
final class KanbanCardCommentMapper extends DataMapperFactory
|
||||
{
|
||||
/**
|
||||
* Columns.
|
||||
|
|
@ -34,7 +34,7 @@ final class KanbanCardCommentMapper extends DataMapperAbstract
|
|||
* @var array<string, array{name:string, type:string, internal:string, autocomplete?:bool, readonly?:bool, writeonly?:bool, annotations?:array}>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static array $columns = [
|
||||
public const COLUMNS = [
|
||||
'kanban_card_comment_id' => ['name' => 'kanban_card_comment_id', 'type' => 'int', 'internal' => 'id'],
|
||||
'kanban_card_comment_description' => ['name' => 'kanban_card_comment_description', 'type' => 'string', 'internal' => 'description'],
|
||||
'kanban_card_comment_descriptionraw' => ['name' => 'kanban_card_comment_descriptionraw', 'type' => 'string', 'internal' => 'descriptionRaw'],
|
||||
|
|
@ -49,7 +49,7 @@ final class KanbanCardCommentMapper extends DataMapperAbstract
|
|||
* @var array<string, array{mapper:string, table:string, self?:?string, external?:?string, column?:string}>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static array $hasMany = [
|
||||
public const HAS_MANY = [
|
||||
'media' => [
|
||||
'mapper' => MediaMapper::class,
|
||||
'table' => 'kanban_card_comment_media',
|
||||
|
|
@ -64,7 +64,7 @@ final class KanbanCardCommentMapper extends DataMapperAbstract
|
|||
* @var array<string, array{mapper:string, external:string}>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static array $belongsTo = [
|
||||
public const BELONGS_TO = [
|
||||
'createdBy' => [
|
||||
'mapper' => AccountMapper::class,
|
||||
'external' => 'kanban_card_comment_created_by',
|
||||
|
|
@ -77,7 +77,7 @@ final class KanbanCardCommentMapper extends DataMapperAbstract
|
|||
* @var string
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static string $table = 'kanban_card_comment';
|
||||
public const TABLE = 'kanban_card_comment';
|
||||
|
||||
/**
|
||||
* Created at.
|
||||
|
|
@ -85,7 +85,7 @@ final class KanbanCardCommentMapper extends DataMapperAbstract
|
|||
* @var string
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static string $createdAt = 'kanban_card_comment_created_at';
|
||||
public const CREATED_AT = 'kanban_card_comment_created_at';
|
||||
|
||||
/**
|
||||
* Primary field name.
|
||||
|
|
@ -93,5 +93,5 @@ final class KanbanCardCommentMapper extends DataMapperAbstract
|
|||
* @var string
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static string $primaryField = 'kanban_card_comment_id';
|
||||
public const PRIMARYFIELD ='kanban_card_comment_id';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ namespace Modules\Kanban\Models;
|
|||
use Modules\Admin\Models\AccountMapper;
|
||||
use Modules\Media\Models\MediaMapper;
|
||||
use Modules\Tag\Models\TagMapper;
|
||||
use phpOMS\DataStorage\Database\DataMapperAbstract;
|
||||
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
|
||||
|
||||
/**
|
||||
* Mapper class.
|
||||
|
|
@ -27,7 +27,7 @@ use phpOMS\DataStorage\Database\DataMapperAbstract;
|
|||
* @link https://orange-management.org
|
||||
* @since 1.0.0
|
||||
*/
|
||||
final class KanbanCardMapper extends DataMapperAbstract
|
||||
final class KanbanCardMapper extends DataMapperFactory
|
||||
{
|
||||
/**
|
||||
* Columns.
|
||||
|
|
@ -35,7 +35,7 @@ final class KanbanCardMapper extends DataMapperAbstract
|
|||
* @var array<string, array{name:string, type:string, internal:string, autocomplete?:bool, readonly?:bool, writeonly?:bool, annotations?:array}>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static array $columns = [
|
||||
public const COLUMNS = [
|
||||
'kanban_card_id' => ['name' => 'kanban_card_id', 'type' => 'int', 'internal' => 'id'],
|
||||
'kanban_card_name' => ['name' => 'kanban_card_name', 'type' => 'string', 'internal' => 'name'],
|
||||
'kanban_card_description' => ['name' => 'kanban_card_description', 'type' => 'string', 'internal' => 'description'],
|
||||
|
|
@ -57,7 +57,7 @@ final class KanbanCardMapper extends DataMapperAbstract
|
|||
* @var array<string, array{mapper:string, external:string}>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static array $belongsTo = [
|
||||
public const BELONGS_TO = [
|
||||
'createdBy' => [
|
||||
'mapper' => AccountMapper::class,
|
||||
'external' => 'kanban_card_created_by',
|
||||
|
|
@ -70,7 +70,7 @@ final class KanbanCardMapper extends DataMapperAbstract
|
|||
* @var array<string, array{mapper:string, table:string, self?:?string, external?:?string, column?:string}>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static array $hasMany = [
|
||||
public const HAS_MANY = [
|
||||
'media' => [
|
||||
'mapper' => MediaMapper::class,
|
||||
'table' => 'kanban_card_media',
|
||||
|
|
@ -97,7 +97,7 @@ final class KanbanCardMapper extends DataMapperAbstract
|
|||
* @var string
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static string $table = 'kanban_card';
|
||||
public const TABLE = 'kanban_card';
|
||||
|
||||
/**
|
||||
* Created at.
|
||||
|
|
@ -105,7 +105,7 @@ final class KanbanCardMapper extends DataMapperAbstract
|
|||
* @var string
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static string $createdAt = 'kanban_card_created_at';
|
||||
public const CREATED_AT = 'kanban_card_created_at';
|
||||
|
||||
/**
|
||||
* Primary field name.
|
||||
|
|
@ -113,5 +113,5 @@ final class KanbanCardMapper extends DataMapperAbstract
|
|||
* @var string
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static string $primaryField = 'kanban_card_id';
|
||||
public const PRIMARYFIELD ='kanban_card_id';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ declare(strict_types=1);
|
|||
|
||||
namespace Modules\Kanban\Models;
|
||||
|
||||
use phpOMS\DataStorage\Database\DataMapperAbstract;
|
||||
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
|
||||
|
||||
/**
|
||||
* Mapper class.
|
||||
|
|
@ -24,7 +24,7 @@ use phpOMS\DataStorage\Database\DataMapperAbstract;
|
|||
* @link https://orange-management.org
|
||||
* @since 1.0.0
|
||||
*/
|
||||
final class KanbanColumnMapper extends DataMapperAbstract
|
||||
final class KanbanColumnMapper extends DataMapperFactory
|
||||
{
|
||||
/**
|
||||
* Columns.
|
||||
|
|
@ -32,7 +32,7 @@ final class KanbanColumnMapper extends DataMapperAbstract
|
|||
* @var array<string, array{name:string, type:string, internal:string, autocomplete?:bool, readonly?:bool, writeonly?:bool, annotations?:array}>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static array $columns = [
|
||||
public const COLUMNS = [
|
||||
'kanban_column_id' => ['name' => 'kanban_column_id', 'type' => 'int', 'internal' => 'id'],
|
||||
'kanban_column_name' => ['name' => 'kanban_column_name', 'type' => 'string', 'internal' => 'name'],
|
||||
'kanban_column_order' => ['name' => 'kanban_column_order', 'type' => 'int', 'internal' => 'order'],
|
||||
|
|
@ -45,7 +45,7 @@ final class KanbanColumnMapper extends DataMapperAbstract
|
|||
* @var array<string, array{mapper:string, table:string, self?:?string, external?:?string, column?:string}>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static array $hasMany = [
|
||||
public const HAS_MANY = [
|
||||
'cards' => [
|
||||
'mapper' => KanbanCardMapper::class,
|
||||
'table' => 'kanban_card',
|
||||
|
|
@ -60,7 +60,7 @@ final class KanbanColumnMapper extends DataMapperAbstract
|
|||
* @var string
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static string $table = 'kanban_column';
|
||||
public const TABLE = 'kanban_column';
|
||||
|
||||
/**
|
||||
* Primary field name.
|
||||
|
|
@ -68,5 +68,5 @@ final class KanbanColumnMapper extends DataMapperAbstract
|
|||
* @var string
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static string $primaryField = 'kanban_column_id';
|
||||
public const PRIMARYFIELD ='kanban_column_id';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ require_once __DIR__ . '/../vendor/autoload.php';
|
|||
require_once __DIR__ . '/Autoloader.php';
|
||||
|
||||
use phpOMS\DataStorage\Database\DatabasePool;
|
||||
use phpOMS\DataStorage\Database\DataMapperAbstract;
|
||||
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
|
||||
use phpOMS\DataStorage\Session\HttpSession;
|
||||
|
||||
$CONFIG = [
|
||||
|
|
@ -329,7 +329,7 @@ $GLOBALS['dbpool']->create('delete', $CONFIG['db']['core']['masters']['delete'])
|
|||
$GLOBALS['dbpool']->create('insert', $CONFIG['db']['core']['masters']['insert']);
|
||||
$GLOBALS['dbpool']->create('schema', $CONFIG['db']['core']['masters']['schema']);
|
||||
|
||||
DataMapperAbstract::setConnection($GLOBALS['dbpool']->get());
|
||||
DataMapperFactory::db($GLOBALS['dbpool']->get());
|
||||
|
||||
$GLOBALS['frameworkpath'] = '/phpOMS/';
|
||||
|
||||
|
|
|
|||
|
|
@ -35,11 +35,11 @@ final class KanbanBoardMapperTest extends \PHPUnit\Framework\TestCase
|
|||
$board->description = 'This is some description';
|
||||
$board->createdBy = new NullAccount(1);
|
||||
|
||||
$id = KanbanBoardMapper::create($board);
|
||||
$id = KanbanBoardMapper::create()->execute($board);
|
||||
self::assertGreaterThan(0, $board->getId());
|
||||
self::assertEquals($id, $board->getId());
|
||||
|
||||
$boardR = KanbanBoardMapper::get($board->getId());
|
||||
$boardR = KanbanBoardMapper::get()->where('id', $board->getId())->execute();
|
||||
self::assertEquals($board->name, $boardR->name);
|
||||
self::assertEquals($board->getStatus(), $boardR->getStatus());
|
||||
self::assertEquals($board->description, $boardR->description);
|
||||
|
|
|
|||
|
|
@ -36,11 +36,11 @@ final class KanbanCardCommentMapperTest extends \PHPUnit\Framework\TestCase
|
|||
$comment->card = 1;
|
||||
$comment->createdBy = new NullAccount(1);
|
||||
|
||||
$id = KanbanCardCommentMapper::create($comment);
|
||||
$id = KanbanCardCommentMapper::create()->execute($comment);
|
||||
self::assertGreaterThan(0, $comment->getId());
|
||||
self::assertEquals($id, $comment->getId());
|
||||
|
||||
$commentR = KanbanCardCommentMapper::get($comment->getId());
|
||||
$commentR = KanbanCardCommentMapper::get()->where('id', $comment->getId())->execute();
|
||||
self::assertEquals($comment->description, $commentR->description);
|
||||
self::assertEquals($comment->card, $commentR->card);
|
||||
self::assertEquals($comment->createdBy->getId(), $commentR->createdBy->getId());
|
||||
|
|
|
|||
|
|
@ -45,11 +45,11 @@ final class KanbanCardMapperTest extends \PHPUnit\Framework\TestCase
|
|||
$card->addTag(new Tag());
|
||||
$card->addTag(new Tag());
|
||||
|
||||
$id = KanbanCardMapper::create($card);
|
||||
$id = KanbanCardMapper::create()->execute($card);
|
||||
self::assertGreaterThan(0, $card->getId());
|
||||
self::assertEquals($id, $card->getId());
|
||||
|
||||
$cardR = KanbanCardMapper::get($card->getId());
|
||||
$cardR = KanbanCardMapper::get()->where('id', $card->getId())->execute();
|
||||
self::assertEquals($card->name, $cardR->name);
|
||||
self::assertEquals($card->description, $cardR->description);
|
||||
self::assertEquals($card->column, $cardR->column);
|
||||
|
|
@ -78,7 +78,7 @@ final class KanbanCardMapperTest extends \PHPUnit\Framework\TestCase
|
|||
$card->addTag(new Tag());
|
||||
$card->addTag(new Tag());
|
||||
|
||||
$id = KanbanCardMapper::create($card);
|
||||
$id = KanbanCardMapper::create()->execute($card);
|
||||
self::assertGreaterThan(0, $card->getId());
|
||||
self::assertEquals($id, $card->getId());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,11 +35,11 @@ final class KanbanColumnMapperTest extends \PHPUnit\Framework\TestCase
|
|||
$column->board = 1;
|
||||
$column->order = 1;
|
||||
|
||||
$id = KanbanColumnMapper::create($column);
|
||||
$id = KanbanColumnMapper::create()->execute($column);
|
||||
self::assertGreaterThan(0, $column->getId());
|
||||
self::assertEquals($id, $column->getId());
|
||||
|
||||
$columnR = KanbanColumnMapper::get($column->getId());
|
||||
$columnR = KanbanColumnMapper::get()->where('id', $column->getId())->execute();
|
||||
self::assertEquals($column->name, $columnR->name);
|
||||
self::assertEquals($column->board, $columnR->board);
|
||||
self::assertEquals($column->order, $columnR->order);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user