mirror of
https://github.com/UndefinedOffset/SortableGridField.git
synced 2024-09-29 11:18:58 +02:00
Compare commits
No commits in common. "master" and "2.0.4" have entirely different histories.
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -2,4 +2,4 @@
|
|||||||
/docs export-ignore
|
/docs export-ignore
|
||||||
/.gitignore export-ignore
|
/.gitignore export-ignore
|
||||||
/.travis.yml export-ignore
|
/.travis.yml export-ignore
|
||||||
/.github export-ignore
|
/phpunit.xml.dist export-ignore
|
||||||
|
14
.github/ISSUE_TEMPLATE.md
vendored
14
.github/ISSUE_TEMPLATE.md
vendored
@ -1,14 +0,0 @@
|
|||||||
## Affected Version
|
|
||||||
|
|
||||||
Show version numbers by pasting the output of `composer info --direct`.
|
|
||||||
Alternatively, hover over the SilverStripe logo in the CMS to basic version information.
|
|
||||||
|
|
||||||
## Description
|
|
||||||
|
|
||||||
Describe expected and observed behaviour.
|
|
||||||
For visual issues, please include browser version and screenshots.
|
|
||||||
Please read https://docs.silverstripe.org/en/contributing/issues_and_bugs/
|
|
||||||
|
|
||||||
## Steps to Reproduce
|
|
||||||
|
|
||||||
Help us with step-by-step instructions.
|
|
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -1,5 +0,0 @@
|
|||||||
Thanks for contributing, you're awesome! :star:
|
|
||||||
Please describe expected and observed behaviour, and what you're fixing.
|
|
||||||
For visual fixes, please include tested browsers and screenshots.
|
|
||||||
Search for related existing issues and link to them if possible.
|
|
||||||
Please read https://github.com/UndefinedOffset/SortableGridField/blob/master/CONTRIBUTING.md
|
|
23
.github/matchers/phpcs.json
vendored
23
.github/matchers/phpcs.json
vendored
@ -1,23 +0,0 @@
|
|||||||
{
|
|
||||||
"problemMatcher": [
|
|
||||||
{
|
|
||||||
"owner": "phpcs",
|
|
||||||
"severity": "error",
|
|
||||||
"pattern": [
|
|
||||||
{
|
|
||||||
"regexp": "^<file name=\"(?:\\/github\\/workspace\\/)?(.*)\">$",
|
|
||||||
"file": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"regexp": "<error line=\"(\\d*)\" column=\"(\\d*)\" severity=\"(error|warning)\" message=\"(.*)\" source=\"(.*)(\"\\/>+)$",
|
|
||||||
"line": 1,
|
|
||||||
"column": 2,
|
|
||||||
"severity": 3,
|
|
||||||
"message": 4,
|
|
||||||
"code": 5,
|
|
||||||
"loop": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
241
.github/workflows/ci.yml
vendored
241
.github/workflows/ci.yml
vendored
@ -1,241 +0,0 @@
|
|||||||
name: CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ '**' ]
|
|
||||||
paths-ignore:
|
|
||||||
- 'docs/**'
|
|
||||||
- '*.md'
|
|
||||||
pull_request:
|
|
||||||
branches: [ '**' ]
|
|
||||||
paths-ignore:
|
|
||||||
- 'docs/**'
|
|
||||||
- '*.md'
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
silverstripe_5_php81:
|
|
||||||
name: "Silverstripe 5.0 | PHP 8.1"
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[ci skip]')"
|
|
||||||
env:
|
|
||||||
php_version: 8.1
|
|
||||||
php_extensions: ctype, dom, fileinfo, hash, intl, mbstring, session, simplexml, tokenizer, xml, pdo, mysqli, gd, zip
|
|
||||||
services:
|
|
||||||
mysql:
|
|
||||||
image: mysql:5.7
|
|
||||||
env:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: false
|
|
||||||
MYSQL_ROOT_PASSWORD: testpassword
|
|
||||||
MYSQL_DATABASE: test_db
|
|
||||||
ports:
|
|
||||||
- 3306/tcp
|
|
||||||
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Setup PHP Extension Cache
|
|
||||||
id: cache-env
|
|
||||||
uses: shivammathur/cache-extensions@v1
|
|
||||||
with:
|
|
||||||
php-version: ${{ env.php_version }}
|
|
||||||
extensions: ${{ env.php_extensions }}
|
|
||||||
key: php74-ext-cache-${{ hashFiles('.github/workflows/ci.yml') }}
|
|
||||||
|
|
||||||
- name: Cache PHP Extensions
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ${{ steps.cache-env.outputs.dir }}
|
|
||||||
key: ${{ steps.cache-env.outputs.key }}
|
|
||||||
restore-keys: ${{ steps.cache-env.outputs.key }}
|
|
||||||
|
|
||||||
- name: Setup PHP, with composer and extensions
|
|
||||||
uses: shivammathur/setup-php@v2
|
|
||||||
with:
|
|
||||||
php-version: ${{ env.php_version }}
|
|
||||||
extensions: ${{ env.php_extensions }}
|
|
||||||
ini-values: log_errors=On, error_log="${{github.workspace}}/artifacts/php_errors.log"
|
|
||||||
coverage: none
|
|
||||||
tools: composer:v2
|
|
||||||
|
|
||||||
- name: Get composer cache directory
|
|
||||||
id: composer-cache
|
|
||||||
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Cache composer dependencies
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ${{ steps.composer-cache.outputs.dir }}
|
|
||||||
key: ${{ runner.os }}-composer-ss5-php81-${{ hashFiles('**/composer.json') }}-${{ hashFiles('.github/workflows/ci.yml') }}
|
|
||||||
restore-keys: ${{ runner.os }}-composer-ss5-php81-
|
|
||||||
|
|
||||||
- name: Install Composer dependencies
|
|
||||||
env:
|
|
||||||
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
composer self-update --ansi || true
|
|
||||||
if [[ $GITHUB_ACCESS_TOKEN ]]; then composer config --ansi -g github-oauth.github.com $GITHUB_ACCESS_TOKEN; fi
|
|
||||||
composer config allow-plugins.composer/installers true
|
|
||||||
composer config allow-plugins.silverstripe/recipe-plugin true
|
|
||||||
composer config allow-plugins.silverstripe/vendor-plugin true
|
|
||||||
composer require silverstripe/admin 2.0.* --no-update
|
|
||||||
composer require silverstripe/versioned 2.0.*
|
|
||||||
composer install --verbose --no-interaction --no-progress --no-suggest --optimize-autoloader --ansi
|
|
||||||
|
|
||||||
- name: Configure Environment
|
|
||||||
run: |
|
|
||||||
cp tests/utils/actions.env.template .env
|
|
||||||
mkdir artifacts
|
|
||||||
|
|
||||||
- name: Perform PHPUnit Tests
|
|
||||||
env:
|
|
||||||
SS_DATABASE_PORT: ${{ job.services.mysql.ports['3306'] }}
|
|
||||||
run: vendor/bin/phpunit --colors=always --printer UndefinedOffset\\SortableGridField\\Tests\\PHPUnit\\Bootstrap\\GitHubActionsAnnotatorPrinter
|
|
||||||
|
|
||||||
silverstripe_411_php80:
|
|
||||||
name: "Silverstripe 4.11 | PHP 8.0"
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[ci skip]')"
|
|
||||||
env:
|
|
||||||
php_version: 8.0
|
|
||||||
php_extensions: ctype, dom, fileinfo, hash, intl, mbstring, session, simplexml, tokenizer, xml, pdo, mysqli, gd, zip
|
|
||||||
services:
|
|
||||||
mysql:
|
|
||||||
image: mysql:5.7
|
|
||||||
env:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: false
|
|
||||||
MYSQL_ROOT_PASSWORD: testpassword
|
|
||||||
MYSQL_DATABASE: test_db
|
|
||||||
ports:
|
|
||||||
- 3306/tcp
|
|
||||||
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Setup PHP Extension Cache
|
|
||||||
id: cache-env
|
|
||||||
uses: shivammathur/cache-extensions@v1
|
|
||||||
with:
|
|
||||||
php-version: ${{ env.php_version }}
|
|
||||||
extensions: ${{ env.php_extensions }}
|
|
||||||
key: php80-ext-cache-${{ hashFiles('.github/workflows/ci.yml') }}
|
|
||||||
|
|
||||||
- name: Cache PHP Extensions
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ${{ steps.cache-env.outputs.dir }}
|
|
||||||
key: ${{ steps.cache-env.outputs.key }}
|
|
||||||
restore-keys: ${{ steps.cache-env.outputs.key }}
|
|
||||||
|
|
||||||
- name: Setup PHP, with composer and extensions
|
|
||||||
uses: shivammathur/setup-php@v2
|
|
||||||
with:
|
|
||||||
php-version: ${{ env.php_version }}
|
|
||||||
extensions: ${{ env.php_extensions }}
|
|
||||||
ini-values: log_errors=On, error_log="${{github.workspace}}/artifacts/php_errors.log"
|
|
||||||
coverage: none
|
|
||||||
tools: composer:v2
|
|
||||||
|
|
||||||
- name: Get composer cache directory
|
|
||||||
id: composer-cache
|
|
||||||
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Cache composer dependencies
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ${{ steps.composer-cache.outputs.dir }}
|
|
||||||
key: ${{ runner.os }}-composer-ss411-php80-${{ hashFiles('**/composer.json') }}-${{ hashFiles('.github/workflows/ci.yml') }}
|
|
||||||
restore-keys: ${{ runner.os }}-composer-ss411-php80-
|
|
||||||
|
|
||||||
- name: Install Composer dependencies
|
|
||||||
env:
|
|
||||||
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
composer self-update --ansi || true
|
|
||||||
if [[ $GITHUB_ACCESS_TOKEN ]]; then composer config --ansi -g github-oauth.github.com $GITHUB_ACCESS_TOKEN; fi
|
|
||||||
composer config allow-plugins.composer/installers true
|
|
||||||
composer config allow-plugins.silverstripe/recipe-plugin true
|
|
||||||
composer config allow-plugins.silverstripe/vendor-plugin true
|
|
||||||
composer require silverstripe/admin 1.11.* --no-update
|
|
||||||
composer require silverstripe/versioned 1.11.*
|
|
||||||
composer install --verbose --no-interaction --no-progress --no-suggest --optimize-autoloader --ansi
|
|
||||||
|
|
||||||
- name: Configure Environment
|
|
||||||
run: |
|
|
||||||
cp tests/utils/actions.env.template .env
|
|
||||||
mkdir artifacts
|
|
||||||
|
|
||||||
- name: Perform PHPUnit Tests
|
|
||||||
env:
|
|
||||||
SS_DATABASE_PORT: ${{ job.services.mysql.ports['3306'] }}
|
|
||||||
run: vendor/bin/phpunit --colors=always --printer UndefinedOffset\\SortableGridField\\Tests\\PHPUnit\\Bootstrap\\GitHubActionsAnnotatorPrinter
|
|
||||||
|
|
||||||
phpcs:
|
|
||||||
name: "PHP_CodeSniffer"
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[ci skip]')"
|
|
||||||
env:
|
|
||||||
php_version: 8.0
|
|
||||||
php_extensions: ctype, dom, fileinfo, hash, intl, mbstring, session, simplexml, tokenizer, xml, pdo, mysqli, gd, zip
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Setup PHP Extension Cache
|
|
||||||
id: cache-env
|
|
||||||
uses: shivammathur/cache-extensions@v1
|
|
||||||
with:
|
|
||||||
php-version: ${{ env.php_version }}
|
|
||||||
extensions: ${{ env.php_extensions }}
|
|
||||||
key: php74-ext-cache-${{ hashFiles('.github/workflows/ci.yml') }}
|
|
||||||
|
|
||||||
- name: Cache PHP Extensions
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ${{ steps.cache-env.outputs.dir }}
|
|
||||||
key: ${{ steps.cache-env.outputs.key }}
|
|
||||||
restore-keys: ${{ steps.cache-env.outputs.key }}
|
|
||||||
|
|
||||||
- name: Setup PHP, with composer and extensions
|
|
||||||
uses: shivammathur/setup-php@v2
|
|
||||||
with:
|
|
||||||
php-version: ${{ env.php_version }}
|
|
||||||
extensions: ${{ env.php_extensions }}
|
|
||||||
ini-values: log_errors=On, error_log="${{github.workspace}}/artifacts/php_errors.log"
|
|
||||||
coverage: none
|
|
||||||
tools: composer:v2
|
|
||||||
|
|
||||||
- name: Get composer cache directory
|
|
||||||
id: composer-cache
|
|
||||||
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Cache composer dependencies
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ${{ steps.composer-cache.outputs.dir }}
|
|
||||||
key: ${{ runner.os }}-composer-phpcs-${{ hashFiles('.github/workflows/ci.yml') }}
|
|
||||||
restore-keys: ${{ runner.os }}-composer-phpcs-
|
|
||||||
|
|
||||||
- name: Install Composer dependencies
|
|
||||||
env:
|
|
||||||
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
rm composer.json
|
|
||||||
composer self-update --ansi || true
|
|
||||||
if [[ $GITHUB_ACCESS_TOKEN ]]; then composer config --ansi -g github-oauth.github.com $GITHUB_ACCESS_TOKEN; fi
|
|
||||||
composer require squizlabs/php_codesniffer ~3.4
|
|
||||||
composer install --verbose --no-interaction --no-progress --no-suggest --optimize-autoloader --ansi
|
|
||||||
mkdir artifacts
|
|
||||||
|
|
||||||
- name: Validate Code Style
|
|
||||||
run: vendor/bin/phpcs --colors --report=full --report-checkstyle=artifacts/phpcs.xml
|
|
||||||
|
|
||||||
- name: Annotate Code Style Issues
|
|
||||||
if: failure()
|
|
||||||
run: (test -f artifacts/phpcs.xml && echo "::add-matcher::.github/matchers/phpcs.json" && cat artifacts/phpcs.xml && echo "::remove-matcher owner=phpcs::")
|
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,4 +3,3 @@
|
|||||||
/.project
|
/.project
|
||||||
/.settings
|
/.settings
|
||||||
/.settings/*
|
/.settings/*
|
||||||
.phpunit.result.cache
|
|
||||||
|
33
.travis.yml
33
.travis.yml
@ -1,27 +1,19 @@
|
|||||||
language: php
|
language: php
|
||||||
|
|
||||||
dist: xenial
|
php:
|
||||||
|
- 5.6
|
||||||
|
- 7.0
|
||||||
|
- 7.1
|
||||||
|
|
||||||
services:
|
env:
|
||||||
- mysql
|
- DB=MYSQL CORE_RELEASE=4.0
|
||||||
- postgresql
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- $HOME/.composer/cache/files
|
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- php: 5.6
|
|
||||||
env: DB=MYSQL CORE_RELEASE=4.4.x-dev PHPUNIT_TEST=1
|
|
||||||
- php: 7.1
|
- php: 7.1
|
||||||
env: DB=MYSQL CORE_RELEASE=4.5.x-dev PHPUNIT_TEST=1 PDO=1
|
env: DB=PGSQL CORE_RELEASE=4.0
|
||||||
- php: 7.2
|
- php: 7.1
|
||||||
env: DB=PGSQL CORE_RELEASE=4.6.x-dev PHPUNIT_TEST=1
|
env: DB=SQLITE3 CORE_RELEASE=4.0
|
||||||
- php: 7.3
|
|
||||||
env: DB=MYSQL CORE_RELEASE=4.6.x-dev PHPUNIT_TEST=1
|
|
||||||
- php: 7.4
|
|
||||||
env: DB=MYSQL CORE_RELEASE=4.x-dev PHPUNIT_TEST=1
|
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
# Init PHP
|
# Init PHP
|
||||||
@ -31,11 +23,10 @@ before_script:
|
|||||||
|
|
||||||
# Install composer dependencies
|
# Install composer dependencies
|
||||||
- composer validate
|
- composer validate
|
||||||
- composer require --no-update silverstripe/recipe-core:$CORE_RELEASE
|
- composer require --no-update silverstripe/recipe-core:^1.0
|
||||||
- composer require --no-update phpunit/phpunit:^5.7
|
- composer require --no-update phpunit/phpunit:^5.7
|
||||||
# Fix for running phpunit 5 on php 7.4+
|
- if [[ $DB == PGSQL ]]; then composer require silverstripe/postgresql:2.0.x-dev --prefer-dist --no-update; fi
|
||||||
- composer require --no-update sminnee/phpunit-mock-objects:^3
|
- if [[ $DB == SQLITE ]]; then composer require silverstripe/sqlite3:2.1.x-dev --prefer-dist --no-update; fi
|
||||||
- if [[ $DB == PGSQL ]]; then composer require silverstripe/postgresql:^2 --prefer-dist --no-update; fi
|
|
||||||
- composer install --prefer-dist --no-interaction --no-progress --no-suggest --optimize-autoloader --verbose --profile
|
- composer install --prefer-dist --no-interaction --no-progress --no-suggest --optimize-autoloader --verbose --profile
|
||||||
|
|
||||||
script:
|
script:
|
||||||
|
29
CHANGELOG.md
29
CHANGELOG.md
@ -1,37 +1,12 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
## [2.2.0](https://github.com/UndefinedOffset/SortableGridField/tree/2.2.0) (2023-05-08)
|
## [2.0.4](https://github.com/UndefinedOffset/SortableGridField/tree/2.0.4) (2018-03-07)
|
||||||
[Full Changelog](https://github.com/UndefinedOffset/SortableGridField/compare/2.1.0...2.2.0)
|
[Full Changelog](https://github.com/UndefinedOffset/SortableGridField/compare/2.0.3...2.0.4)
|
||||||
|
|
||||||
## [2.1.0](https://github.com/UndefinedOffset/SortableGridField/tree/2.1.0) (2022-07-06)
|
|
||||||
[Full Changelog](https://github.com/UndefinedOffset/SortableGridField/compare/2.0.9...2.1.0)
|
|
||||||
|
|
||||||
## [2.0.9](https://github.com/UndefinedOffset/SortableGridField/tree/2.0.9) (2021-07-19)
|
|
||||||
[Full Changelog](https://github.com/UndefinedOffset/SortableGridField/compare/2.0.8...2.0.9)
|
|
||||||
|
|
||||||
## [2.0.8](https://github.com/UndefinedOffset/SortableGridField/tree/2.0.8) (2019-01-08)
|
|
||||||
[Full Changelog](https://github.com/UndefinedOffset/SortableGridField/compare/2.0.7...2.0.8)
|
|
||||||
|
|
||||||
## [2.0.7](https://github.com/UndefinedOffset/SortableGridField/tree/2.0.7) (2018-12-13)
|
|
||||||
[Full Changelog](https://github.com/UndefinedOffset/SortableGridField/compare/2.0.6...2.0.7)
|
|
||||||
|
|
||||||
## [2.0.6](https://github.com/UndefinedOffset/SortableGridField/tree/2.0.6) (2018-07-04)
|
|
||||||
[Full Changelog](https://github.com/UndefinedOffset/SortableGridField/compare/2.0.5...2.0.6)
|
|
||||||
|
|
||||||
## [2.0.5](https://github.com/UndefinedOffset/SortableGridField/tree/2.0.5) (2018-06-07)
|
|
||||||
[Full Changelog](https://github.com/UndefinedOffset/SortableGridField/compare/2.0.4...2.0.5)
|
|
||||||
|
|
||||||
**Closed issues:**
|
**Closed issues:**
|
||||||
|
|
||||||
- Int to DBInt [\#120](https://github.com/UndefinedOffset/SortableGridField/issues/120)
|
- Int to DBInt [\#120](https://github.com/UndefinedOffset/SortableGridField/issues/120)
|
||||||
|
|
||||||
**Merged pull requests:**
|
|
||||||
|
|
||||||
- Fixes "undefined offset" error when moving a many\_many item to previous page [\#121](https://github.com/UndefinedOffset/SortableGridField/pull/121) ([ChrissiQ](https://github.com/ChrissiQ))
|
|
||||||
|
|
||||||
## [2.0.4](https://github.com/UndefinedOffset/SortableGridField/tree/2.0.4) (2018-03-07)
|
|
||||||
[Full Changelog](https://github.com/UndefinedOffset/SortableGridField/compare/2.0.3...2.0.4)
|
|
||||||
|
|
||||||
## [2.0.3](https://github.com/UndefinedOffset/SortableGridField/tree/2.0.3) (2018-03-01)
|
## [2.0.3](https://github.com/UndefinedOffset/SortableGridField/tree/2.0.3) (2018-03-01)
|
||||||
[Full Changelog](https://github.com/UndefinedOffset/SortableGridField/compare/2.0.2...2.0.3)
|
[Full Changelog](https://github.com/UndefinedOffset/SortableGridField/compare/2.0.2...2.0.3)
|
||||||
|
|
||||||
|
2
LICENSE
2
LICENSE
@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2024, Ed Chipman
|
Copyright (c) 2017, Ed Chipman
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
10
README.md
10
README.md
@ -1,17 +1,13 @@
|
|||||||
SortableGridField
|
SortableGridField
|
||||||
=================
|
=================
|
||||||
|
|
||||||
[![CI](https://github.com/UndefinedOffset/SortableGridField/actions/workflows/ci.yml/badge.svg)](https://github.com/UndefinedOffset/SortableGridField/actions/workflows/ci.yml)
|
[![Build Status](https://travis-ci.org/UndefinedOffset/SortableGridField.png)](https://travis-ci.org/UndefinedOffset/SortableGridField) ![helpfulrobot](https://helpfulrobot.io/undefinedoffset/sortablegridfield/badge)
|
||||||
[![Latest Stable Version](https://poser.pugx.org/undefinedoffset/sortablegridfield/version.svg)](http://www.silverstripe.org/stable-download/)
|
|
||||||
[![Latest Unstable Version](https://poser.pugx.org/undefinedoffset/sortablegridfield/v/unstable.svg)](https://packagist.org/packages/undefinedoffset/sortablegridfield)
|
|
||||||
[![Total Downloads](https://poser.pugx.org/undefinedoffset/sortablegridfield/downloads.svg)](https://packagist.org/packages/undefinedoffset/sortablegridfield)
|
|
||||||
[![License](https://poser.pugx.org/undefinedoffset/sortablegridfield/license.svg)](https://github.com/UndefinedOffset/SortableGridField/blob/master/LICENSE)
|
|
||||||
|
|
||||||
Adds drag and drop functionality to Silverstripe's GridField
|
Adds drag and drop functionality to SilverStripe 4's GridField
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
* Silverstripe 4.11+ or 5.0+
|
* SilverStripe 4.x
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "undefinedoffset/sortablegridfield",
|
"name": "undefinedoffset/sortablegridfield",
|
||||||
"description": "Adds drag and drop functionality to Silverstripe's GridField",
|
"description": "Adds drag and drop functionality to SilverStripe 4.x's GridField",
|
||||||
"type": "silverstripe-vendormodule",
|
"type": "silverstripe-vendormodule",
|
||||||
"keywords": ["silverstripe", "gridfield", "sortable", "sort"],
|
"keywords": ["silverstripe", "gridfield"],
|
||||||
"license": "BSD-3-Clause",
|
"license": "BSD-3-Clause",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
@ -12,13 +12,10 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"silverstripe/framework": "~4.11 | ^5",
|
"silverstripe/framework": "~4.0",
|
||||||
"silverstripe/versioned": "^1 | ^2"
|
"silverstripe/versioned": "^1.0",
|
||||||
|
"silverstripe/vendor-plugin": "^1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
|
||||||
"phpunit/phpunit": "^9.5",
|
|
||||||
"squizlabs/php_codesniffer": "~3.4"
|
|
||||||
},
|
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"UndefinedOffset\\SortableGridField\\": "src/",
|
"UndefinedOffset\\SortableGridField\\": "src/",
|
||||||
@ -37,7 +34,5 @@
|
|||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "2.0.x-dev"
|
"dev-master": "2.0.x-dev"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"prefer-stable": true,
|
|
||||||
"minimum-stability": "dev"
|
|
||||||
}
|
}
|
||||||
|
@ -2,37 +2,28 @@ has_many Example
|
|||||||
=================
|
=================
|
||||||
|
|
||||||
```php
|
```php
|
||||||
|
|
||||||
/*** TestPage.php ***/
|
/*** TestPage.php ***/
|
||||||
use SilverStripe\Forms\GridField\GridField;
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor;
|
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
|
||||||
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
||||||
|
|
||||||
class TestPage extends Page
|
class TestPage extends Page
|
||||||
{
|
{
|
||||||
private static $has_many = [
|
private static $has_many = [
|
||||||
'TestObjects' => 'TestObject',
|
'TestObjects' => 'TestObject',
|
||||||
];
|
];
|
||||||
|
|
||||||
public function getCMSFields()
|
public function getCMSFields()
|
||||||
{
|
{
|
||||||
$fields = parent::getCMSFields();
|
$fields = parent::getCMSFields();
|
||||||
|
|
||||||
$conf = GridFieldConfig_RelationEditor::create(10);
|
$conf = GridFieldConfig_RecordEditor::create(10);
|
||||||
$conf->addComponent(GridFieldSortableRows::create('SortOrder'));
|
$conf->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
|
|
||||||
$fields->addFieldToTab(
|
$fields->addFieldToTab('Root.TestObjects', new GridField('TestObjects', 'TestObjects', $this->TestObjects(), $conf));
|
||||||
'Root.TestObjects',
|
|
||||||
GridField::create(
|
|
||||||
'TestObjects',
|
|
||||||
'TestObjects',
|
|
||||||
$this->TestObjects(),
|
|
||||||
$conf
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
return $fields;
|
return $fields;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -41,18 +32,15 @@ use SilverStripe\ORM\DataObject;
|
|||||||
|
|
||||||
class TestObject extends DataObject
|
class TestObject extends DataObject
|
||||||
{
|
{
|
||||||
private static $db = [
|
private static $db = [
|
||||||
'Title' => 'Text',
|
'Title' => 'Text',
|
||||||
'SortOrder' => 'Int',
|
'SortOrder' => 'Int',
|
||||||
];
|
];
|
||||||
|
|
||||||
private static $indexes = [
|
|
||||||
'SortOrder' => true,
|
|
||||||
];
|
|
||||||
private static $has_one = [
|
private static $has_one = [
|
||||||
'Parent' => 'TestPage',
|
'Parent' => 'TestPage',
|
||||||
];
|
];
|
||||||
|
|
||||||
private static $default_sort = 'SortOrder';
|
private static $default_sort = 'SortOrder';
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -25,9 +25,9 @@ class TestPage extends Page
|
|||||||
$fields = parent::getCMSFields();
|
$fields = parent::getCMSFields();
|
||||||
|
|
||||||
$conf = GridFieldConfig_RelationEditor::create(10);
|
$conf = GridFieldConfig_RelationEditor::create(10);
|
||||||
$conf->addComponent(GridFieldSortableRows::create('SortOrder'));
|
$conf->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
|
|
||||||
$fields->addFieldToTab('Root.TestObjects', GridField::create('TestObjects', 'TestObjects', $this->TestObjects(), $conf));
|
$fields->addFieldToTab('Root.TestObjects', new GridField('TestObjects', 'TestObjects', $this->TestObjects(), $conf));
|
||||||
|
|
||||||
return $fields;
|
return $fields;
|
||||||
}
|
}
|
||||||
|
@ -14,20 +14,18 @@ class MyModelAdmin extends ModelAdmin
|
|||||||
private static $url_segment = 'my-model-admin';
|
private static $url_segment = 'my-model-admin';
|
||||||
|
|
||||||
private static $managed_models = [
|
private static $managed_models = [
|
||||||
MATestObject::class,
|
'MATestObject',
|
||||||
];
|
];
|
||||||
|
|
||||||
public function getEditForm($id = null, $fields = null)
|
public function getEditForm($id = null, $fields = null)
|
||||||
{
|
{
|
||||||
$form = parent::getEditForm($id, $fields);
|
$form = parent::getEditForm($id, $fields);
|
||||||
|
|
||||||
// This check is simply to ensure you are on the managed model you want adjust accordingly
|
//This check is simply to ensure you are on the managed model you want adjust accordingly
|
||||||
if ($this->modelClass === MATestObject::class) {
|
if($this->modelClass == 'MATestObject' && $gridField = $form->Fields()->dataFieldByName($this->sanitiseClassName($this->modelClass))) {
|
||||||
$gridField = $form->Fields()->dataFieldByName($this->sanitiseClassName($this->modelClass));
|
//This is just a precaution to ensure we got a GridField from dataFieldByName() which you should have
|
||||||
|
if($gridField instanceof GridField) {
|
||||||
// This is just a precaution to ensure we got a GridField from dataFieldByName() which you should have
|
$gridField->getConfig()->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
if ($gridField instanceof GridField) {
|
|
||||||
$gridField->getConfig()->addComponent(GridFieldSortableRows::create('SortOrder'));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,10 +43,6 @@ class MATestObject extends DataObject
|
|||||||
'SortOrder' => 'Int',
|
'SortOrder' => 'Int',
|
||||||
];
|
];
|
||||||
|
|
||||||
private static $indexes = [
|
|
||||||
'SortOrder' => true,
|
|
||||||
];
|
|
||||||
|
|
||||||
private static $default_sort = 'SortOrder';
|
private static $default_sort = 'SortOrder';
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -107,7 +107,7 @@
|
|||||||
dataType: 'html',
|
dataType: 'html',
|
||||||
success: callback,
|
success: callback,
|
||||||
error: function (e) {
|
error: function (e) {
|
||||||
alert(ss.i18n._t('Admin.ERRORINTRANSACTION', 'An error occured while fetching data from the server\n Please try again later.'));
|
alert(ss.i18n._t('GRIDFIELD.ERRORINTRANSACTION'));
|
||||||
}
|
}
|
||||||
}, ajaxOpts));
|
}, ajaxOpts));
|
||||||
}
|
}
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
da:
|
|
||||||
GridFieldSortableRows:
|
|
||||||
ALLOW_DRAG_DROP: 'Tillad træk og slip sortering'
|
|
||||||
EditPermissionsFailure: 'Manglende tilladelse til at redigere'
|
|
||||||
NEXT: 'Flyt til næste side'
|
|
||||||
PREVIOUS: 'Flyt til forrige side'
|
|
@ -2,5 +2,3 @@ nl:
|
|||||||
GridFieldSortableRows:
|
GridFieldSortableRows:
|
||||||
ALLOW_DRAG_DROP: 'Rangschikken met drag & drop toestaan'
|
ALLOW_DRAG_DROP: 'Rangschikken met drag & drop toestaan'
|
||||||
EditPermissionsFailure: 'Geen toegang'
|
EditPermissionsFailure: 'Geen toegang'
|
||||||
NEXT: 'Verplaats naar Volgende Pagina'
|
|
||||||
PREVIOUS: 'Verplaats naar Vorige Pagina'
|
|
||||||
|
@ -2,5 +2,3 @@ pl:
|
|||||||
GridFieldSortableRows:
|
GridFieldSortableRows:
|
||||||
ALLOW_DRAG_DROP: 'Pozwól na reorganizację przez drag and drop'
|
ALLOW_DRAG_DROP: 'Pozwól na reorganizację przez drag and drop'
|
||||||
EditPermissionsFailure: 'Brak możliwości edycji'
|
EditPermissionsFailure: 'Brak możliwości edycji'
|
||||||
NEXT: 'Przenieś do następnej strony'
|
|
||||||
PREVIOUS: 'Przenieś do poprzedniej strony'
|
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
sl:
|
|
||||||
GridFieldSortableRows:
|
|
||||||
ALLOW_DRAG_DROP: 'Omogoči razvrščanje s "povleci in spusti" '
|
|
||||||
EditPermissionsFailure: 'Nimate pravic za urejanje'
|
|
||||||
NEXT: 'Prestavi na naslednjo stran'
|
|
||||||
PREVIOUS: 'Prestavi na prejšnjo stran'
|
|
@ -2,5 +2,3 @@ sv:
|
|||||||
GridFieldSortableRows:
|
GridFieldSortableRows:
|
||||||
ALLOW_DRAG_DROP: 'Aktivera dra och släpp sortering'
|
ALLOW_DRAG_DROP: 'Aktivera dra och släpp sortering'
|
||||||
EditPermissionsFailure: 'Rättighet för att redigera saknas'
|
EditPermissionsFailure: 'Rättighet för att redigera saknas'
|
||||||
NEXT: 'Gå till nästa sida'
|
|
||||||
PREVIOUS: 'Gå till föregående sida'
|
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ruleset name="SilverStripe">
|
|
||||||
<description>CodeSniffer ruleset for SilverStripe coding conventions.</description>
|
|
||||||
|
|
||||||
<!-- base rules are PSR-2 -->
|
|
||||||
<rule ref="PSR2" >
|
|
||||||
<!-- Current exclusions -->
|
|
||||||
<exclude name="PSR1.Methods.CamelCapsMethodName" />
|
|
||||||
<exclude name="PSR1.Files.SideEffects.FoundWithSymbols" />
|
|
||||||
<exclude name="PSR2.Classes.PropertyDeclaration" />
|
|
||||||
<exclude name="PSR2.Methods.MethodDeclaration.Underscore" />
|
|
||||||
<exclude name="Squiz.Scope.MethodScope" />
|
|
||||||
<exclude name="Squiz.Classes.ValidClassName.NotCamelCaps" />
|
|
||||||
<exclude name="Generic.Files.LineLength.TooLong" />
|
|
||||||
<exclude name="PEAR.Functions.ValidDefaultValue.NotAtEnd" />
|
|
||||||
<exclude name="PSR2.ControlStructures.ElseIfDeclaration" />
|
|
||||||
</rule>
|
|
||||||
|
|
||||||
<rule ref="Squiz.Strings.ConcatenationSpacing">
|
|
||||||
<properties>
|
|
||||||
<property name="spacing" value="1" />
|
|
||||||
<property name="ignoreNewlines" value="true"/>
|
|
||||||
</properties>
|
|
||||||
</rule>
|
|
||||||
|
|
||||||
<rule ref="PEAR.ControlStructures.MultiLineCondition" />
|
|
||||||
|
|
||||||
<rule ref="Generic.Formatting.SpaceAfterCast" />
|
|
||||||
<rule ref="Generic.Arrays.DisallowLongArraySyntax.Found">
|
|
||||||
<type>warning</type>
|
|
||||||
</rule>
|
|
||||||
|
|
||||||
<rule ref="Squiz.Arrays.ArrayDeclaration.NoComma" />
|
|
||||||
<rule ref="Squiz.WhiteSpace.OperatorSpacing">
|
|
||||||
<properties>
|
|
||||||
<property name="ignoreNewlines" value="true" />
|
|
||||||
</properties>
|
|
||||||
</rule>
|
|
||||||
|
|
||||||
<rule ref="PSR12.Functions.ReturnTypeDeclaration" />
|
|
||||||
|
|
||||||
<!-- include php files only -->
|
|
||||||
<arg name="extensions" value="php,lib,inc,php5"/>
|
|
||||||
|
|
||||||
<file>./src</file>
|
|
||||||
<file>./tests</file>
|
|
||||||
<file>./_config.php</file>
|
|
||||||
</ruleset>
|
|
||||||
|
|
@ -1,27 +1,5 @@
|
|||||||
<?xml version="1.0"?>
|
<phpunit bootstrap="vendor/silverstripe/framework/tests/bootstrap.php" colors="true">
|
||||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" bootstrap="vendor/silverstripe/framework/tests/bootstrap.php" colors="true" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
|
<testsuite name="Default">
|
||||||
<testsuites>
|
<directory>tests/</directory>
|
||||||
<testsuite name="Default">
|
</testsuite>
|
||||||
<directory suffix=".php">tests/PHPUnit</directory>
|
|
||||||
</testsuite>
|
|
||||||
</testsuites>
|
|
||||||
|
|
||||||
<groups>
|
|
||||||
<exclude>
|
|
||||||
<group>sanitychecks</group>
|
|
||||||
</exclude>
|
|
||||||
</groups>
|
|
||||||
|
|
||||||
<coverage includeUncoveredFiles="true">
|
|
||||||
<include>
|
|
||||||
<directory suffix=".php">src/</directory>
|
|
||||||
</include>
|
|
||||||
<exclude>
|
|
||||||
<directory suffix=".php">tests/</directory>
|
|
||||||
</exclude>
|
|
||||||
</coverage>
|
|
||||||
|
|
||||||
<php>
|
|
||||||
<get name="flush" value="1"/>
|
|
||||||
</php>
|
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace UndefinedOffset\SortableGridField\Forms;
|
namespace UndefinedOffset\SortableGridField\Forms;
|
||||||
|
|
||||||
use SilverStripe\Admin\ModelAdmin;
|
use SilverStripe\Admin\ModelAdmin;
|
||||||
use SilverStripe\Control\Controller;
|
use SilverStripe\Control\Controller;
|
||||||
use SilverStripe\Core\ClassInfo;
|
use SilverStripe\Core\ClassInfo;
|
||||||
use SilverStripe\Core\Config\Config;
|
use SilverStripe\Core\Config\Config;
|
||||||
|
use SilverStripe\Core\Extensible;
|
||||||
use SilverStripe\Core\Injector\Injector;
|
use SilverStripe\Core\Injector\Injector;
|
||||||
use SilverStripe\Forms\GridField\AbstractGridFieldComponent;
|
|
||||||
use SilverStripe\Forms\GridField\GridField;
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
use SilverStripe\Forms\GridField\GridField_ActionProvider;
|
use SilverStripe\Forms\GridField\GridField_ActionProvider;
|
||||||
use SilverStripe\Forms\GridField\GridField_DataManipulator;
|
use SilverStripe\Forms\GridField\GridField_DataManipulator;
|
||||||
@ -15,11 +16,12 @@ use SilverStripe\Forms\GridField\GridField_HTMLProvider;
|
|||||||
use SilverStripe\Forms\GridField\GridFieldFilterHeader;
|
use SilverStripe\Forms\GridField\GridFieldFilterHeader;
|
||||||
use SilverStripe\Forms\GridField\GridFieldPaginator;
|
use SilverStripe\Forms\GridField\GridFieldPaginator;
|
||||||
use SilverStripe\Forms\GridField\GridFieldSortableHeader;
|
use SilverStripe\Forms\GridField\GridFieldSortableHeader;
|
||||||
|
use SilverStripe\ORM\DataList;
|
||||||
use SilverStripe\ORM\DataObject;
|
use SilverStripe\ORM\DataObject;
|
||||||
use SilverStripe\ORM\DataObjectSchema;
|
use SilverStripe\ORM\DataObjectSchema;
|
||||||
|
use SilverStripe\ORM\DataQuery;
|
||||||
use SilverStripe\ORM\DB;
|
use SilverStripe\ORM\DB;
|
||||||
use SilverStripe\ORM\ManyManyList;
|
use SilverStripe\ORM\ManyManyList;
|
||||||
use SilverStripe\ORM\ManyManyThroughList;
|
|
||||||
use SilverStripe\ORM\RelationList;
|
use SilverStripe\ORM\RelationList;
|
||||||
use SilverStripe\ORM\SS_List;
|
use SilverStripe\ORM\SS_List;
|
||||||
use SilverStripe\ORM\UnsavedRelationList;
|
use SilverStripe\ORM\UnsavedRelationList;
|
||||||
@ -30,8 +32,10 @@ use SilverStripe\View\Requirements;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* This component provides a checkbox which when checked enables drag-and-drop re-ordering of elements displayed in a {@link GridField}
|
* This component provides a checkbox which when checked enables drag-and-drop re-ordering of elements displayed in a {@link GridField}
|
||||||
|
*
|
||||||
|
* @package forms
|
||||||
*/
|
*/
|
||||||
class GridFieldSortableRows extends AbstractGridFieldComponent implements GridField_HTMLProvider, GridField_ActionProvider, GridField_DataManipulator
|
class GridFieldSortableRows implements GridField_HTMLProvider, GridField_ActionProvider, GridField_DataManipulator
|
||||||
{
|
{
|
||||||
/** @var string */
|
/** @var string */
|
||||||
protected $sortColumn;
|
protected $sortColumn;
|
||||||
@ -72,7 +76,7 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
$dataList = $gridField->getList();
|
$dataList = $gridField->getList();
|
||||||
|
|
||||||
if (class_exists('UnsavedRelationList') && $dataList instanceof UnsavedRelationList) {
|
if (class_exists('UnsavedRelationList') && $dataList instanceof UnsavedRelationList) {
|
||||||
return [];
|
return array();
|
||||||
}
|
}
|
||||||
|
|
||||||
$state = $gridField->State->GridFieldSortableRows;
|
$state = $gridField->State->GridFieldSortableRows;
|
||||||
@ -82,7 +86,7 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
|
|
||||||
//Ensure user can edit
|
//Ensure user can edit
|
||||||
if (!singleton($gridField->getModelClass())->canEdit()) {
|
if (!singleton($gridField->getModelClass())->canEdit()) {
|
||||||
return [];
|
return array();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -115,22 +119,20 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
)->addExtraClass('sortablerows-sorttopage');
|
)->addExtraClass('sortablerows-sorttopage');
|
||||||
|
|
||||||
|
|
||||||
$data = [
|
$data = array('SortableToggle' => $sortOrderToggle,
|
||||||
'SortableToggle' => $sortOrderToggle,
|
|
||||||
'SortOrderSave' => $sortOrderSave,
|
'SortOrderSave' => $sortOrderSave,
|
||||||
'SortToPage' => $sortToPage,
|
'SortToPage' => $sortToPage,
|
||||||
'Checked' => ($state->sortableToggle == true ? ' checked = "checked"' : ''),
|
'Checked' => ($state->sortableToggle == true ? ' checked = "checked"' : ''),
|
||||||
'List' => $dataList,
|
'List' => $dataList);
|
||||||
];
|
|
||||||
|
|
||||||
$forTemplate = new ArrayData($data);
|
$forTemplate = new arrayData($data);
|
||||||
|
|
||||||
Requirements::css('undefinedoffset/sortablegridfield:css/GridFieldSortableRows.css');
|
Requirements::css('undefinedoffset/sortablegridfield:css/GridFieldSortableRows.css');
|
||||||
Requirements::javascript('undefinedoffset/sortablegridfield:javascript/GridFieldSortableRows.js');
|
Requirements::javascript('undefinedoffset/sortablegridfield:javascript/GridFieldSortableRows.js');
|
||||||
|
|
||||||
$args = ['Colspan' => count($gridField->getColumns()), 'ID' => $gridField->ID(), 'DisableSelection' => $this->disable_selection];
|
$args = array('Colspan' => count($gridField->getColumns()), 'ID' => $gridField->ID(), 'DisableSelection' => $this->disable_selection);
|
||||||
|
|
||||||
$fragments = ['header' => $forTemplate->renderWith('SortableGridField\Forms\Includes\GridFieldSortableRows', $args)];
|
$fragments = array('header' => $forTemplate->renderWith('SortableGridField\Forms\Includes\GridFieldSortableRows', $args));
|
||||||
|
|
||||||
if ($gridField->getConfig()->getComponentByType(GridFieldPaginator::class)) {
|
if ($gridField->getConfig()->getComponentByType(GridFieldPaginator::class)) {
|
||||||
$fragments['after'] = $forTemplate->renderWith('SortableGridField\Forms\Includes\GridFieldSortableRows_paginator');
|
$fragments['after'] = $forTemplate->renderWith('SortableGridField\Forms\Includes\GridFieldSortableRows_paginator');
|
||||||
@ -142,8 +144,8 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
/**
|
/**
|
||||||
* Manipulate the datalist as needed by this grid modifier.
|
* Manipulate the datalist as needed by this grid modifier.
|
||||||
* @param GridField $gridField Grid Field Reference
|
* @param GridField $gridField Grid Field Reference
|
||||||
* @param SS_List|\SilverStripe\ORM\DataList $dataList Data List to adjust
|
* @param SS_List|DataList $dataList Data List to adjust
|
||||||
* @return \SilverStripe\ORM\DataList Modified Data List
|
* @return DataList Modified Data List
|
||||||
*/
|
*/
|
||||||
public function getManipulatedData(GridField $gridField, SS_List $dataList)
|
public function getManipulatedData(GridField $gridField, SS_List $dataList)
|
||||||
{
|
{
|
||||||
@ -211,7 +213,7 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
/**
|
/**
|
||||||
* Detects and corrects items with a sort column value of 0, by appending them to the bottom of the list
|
* Detects and corrects items with a sort column value of 0, by appending them to the bottom of the list
|
||||||
* @param GridField $gridField Grid Field Reference
|
* @param GridField $gridField Grid Field Reference
|
||||||
* @param SS_List|\SilverStripe\ORM\DataList $dataList Data List of items to be checked
|
* @param SS_List|DataList $dataList Data List of items to be checked
|
||||||
*/
|
*/
|
||||||
protected function fixSortColumn($gridField, SS_List $dataList)
|
protected function fixSortColumn($gridField, SS_List $dataList)
|
||||||
{
|
{
|
||||||
@ -219,15 +221,15 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var SS_List|\SilverStripe\ORM\DataList $list */
|
/** @var SS_List|DataList $list */
|
||||||
$list = clone $dataList;
|
$list = clone $dataList;
|
||||||
$list = $list->alterDataQuery(function ($query, SS_List $tmplist) {
|
$list = $list->alterDataQuery(function ($query, SS_List $tmplist) {
|
||||||
/** @var \SilverStripe\ORM\DataQuery $query */
|
/** @var DataQuery $query */
|
||||||
$query->limit(null);
|
$query->limit(array());
|
||||||
return $query;
|
return $query;
|
||||||
});
|
});
|
||||||
|
|
||||||
$many_many = ($list instanceof ManyManyList || $list instanceof ManyManyThroughList);
|
$many_many = ($list instanceof ManyManyList);
|
||||||
if (!$many_many) {
|
if (!$many_many) {
|
||||||
$sng = singleton($gridField->getModelClass());
|
$sng = singleton($gridField->getModelClass());
|
||||||
$fieldType = $sng->config()->db[$this->sortColumn];
|
$fieldType = $sng->config()->db[$this->sortColumn];
|
||||||
@ -251,22 +253,13 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
$i = 1;
|
$i = 1;
|
||||||
|
|
||||||
if ($many_many) {
|
if ($many_many) {
|
||||||
$schema = Injector::inst()->get(DataObjectSchema::class);
|
$schema=Injector::inst()->get(DataObjectSchema::class);
|
||||||
$componentDetails = $schema->manyManyComponent(get_class($owner), (!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()));
|
$componentDetails=$schema->manyManyComponent(get_class($owner), (!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()));
|
||||||
if (empty($componentDetails)) {
|
$parentField=$componentDetails['parentField'];
|
||||||
user_error('Could not find the relationship "' . (!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()) . '" on "' . get_class($owner) . '"', E_USER_ERROR);
|
$componentField=$componentDetails['childField'];
|
||||||
}
|
$table=$componentDetails['join'];
|
||||||
|
|
||||||
$parentField = $componentDetails['parentField'];
|
$extraFields = $schema->manyManyExtraFieldsForComponent(get_class($owner), (!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()));
|
||||||
$componentField = $componentDetails['childField'];
|
|
||||||
$table = $componentDetails['join'];
|
|
||||||
|
|
||||||
//For ManyManyThroughLists get the right join table
|
|
||||||
if ($list instanceof ManyManyThroughList && class_exists($table)) {
|
|
||||||
$table = $schema->tableName($table);
|
|
||||||
}
|
|
||||||
|
|
||||||
$extraFields = $list->getExtraFields();
|
|
||||||
|
|
||||||
if (!$extraFields || !array_key_exists($this->sortColumn, $extraFields) || !($extraFields[$this->sortColumn] == 'Int' || $extraFields[$this->sortColumn] == 'SilverStripe\\ORM\\FieldType\\DBInt' || is_subclass_of('SilverStripe\\ORM\\FieldType\\DBInt', $extraFields[$this->sortColumn]))) {
|
if (!$extraFields || !array_key_exists($this->sortColumn, $extraFields) || !($extraFields[$this->sortColumn] == 'Int' || $extraFields[$this->sortColumn] == 'SilverStripe\\ORM\\FieldType\\DBInt' || is_subclass_of('SilverStripe\\ORM\\FieldType\\DBInt', $extraFields[$this->sortColumn]))) {
|
||||||
user_error('Sort column ' . $this->sortColumn . ' must be an SilverStripe\\ORM\\FieldType\\DBInt, column is of type ' . $extraFields[$this->sortColumn], E_USER_ERROR);
|
user_error('Sort column ' . $this->sortColumn . ' must be an SilverStripe\\ORM\\FieldType\\DBInt, column is of type ' . $extraFields[$this->sortColumn], E_USER_ERROR);
|
||||||
@ -312,11 +305,9 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($this->append_to_top) {
|
if ($this->append_to_top) {
|
||||||
$topIncremented = [];
|
$topIncremented = array();
|
||||||
}
|
}
|
||||||
|
|
||||||
$modelClass = $gridField->getModelClass();
|
|
||||||
$hasVersioned = $this->hasVersionedExtension($modelClass);
|
|
||||||
foreach ($list as $obj) {
|
foreach ($list as $obj) {
|
||||||
if ($many_many) {
|
if ($many_many) {
|
||||||
if ($this->append_to_top) {
|
if ($this->append_to_top) {
|
||||||
@ -333,21 +324,10 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
. ' WHERE "' . $componentField . '" = ' . $obj->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
|
. ' WHERE "' . $componentField . '" = ' . $obj->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
|
||||||
}
|
}
|
||||||
} else if ($this->append_to_top) {
|
} else if ($this->append_to_top) {
|
||||||
if ($hasVersioned) {
|
//Upgrade all the records (including the last inserted from 0 to 1)
|
||||||
// For versioned objects, modify them with the ORM so that the *_versions table is updated
|
DB::query('UPDATE "' . $table
|
||||||
$itemsToUpdate = $modelClass::get()->where(($list instanceof RelationList ? '"' . $list->foreignKey . '" = ' . $owner->ID : $idCondition) . (!empty($topIncremented) ? ' AND "ID" NOT IN(\'' . implode('\',\'', $topIncremented) . '\')' : ''));
|
. '" SET "' . $sortColumn . '" = "' . $sortColumn . '"+1'
|
||||||
if ($itemsToUpdate->exists()) {
|
. ' WHERE ' . ($list instanceof RelationList ? '"' . $list->foreignKey . '" = ' . $owner->ID : $idCondition) . (!empty($topIncremented) ? ' AND "ID" NOT IN(\'' . implode('\',\'', $topIncremented) . '\')' : ''));
|
||||||
foreach ($itemsToUpdate as $item) {
|
|
||||||
$item->$sortColumn = $item->$sortColumn + 1;
|
|
||||||
$item->write();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//Upgrade all the records (including the last inserted from 0 to 1)
|
|
||||||
DB::query('UPDATE "' . $table
|
|
||||||
. '" SET "' . $sortColumn . '" = "' . $sortColumn . '"+1'
|
|
||||||
. ' WHERE ' . ($list instanceof RelationList ? '"' . $list->foreignKey . '" = ' . $owner->ID : $idCondition) . (!empty($topIncremented) ? ' AND "ID" NOT IN(\'' . implode('\',\'', $topIncremented) . '\')' : ''));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->update_versioned_stage && $this->hasVersionedExtension($gridField->getModelClass())) {
|
if ($this->update_versioned_stage && $this->hasVersionedExtension($gridField->getModelClass())) {
|
||||||
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
||||||
@ -357,21 +337,14 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
|
|
||||||
$topIncremented[] = $obj->ID;
|
$topIncremented[] = $obj->ID;
|
||||||
} else {
|
} else {
|
||||||
if ($hasVersioned) {
|
//Append the last record to the bottom
|
||||||
// For versioned objects, modify them with the ORM so that the *_versions table is updated
|
DB::query('UPDATE "' . $table
|
||||||
$obj->$sortColumn = ($max + $i);
|
. '" SET "' . $sortColumn . '" = ' . ($max + $i)
|
||||||
$obj->write();
|
. ' WHERE "ID" = ' . $obj->ID);
|
||||||
} else {
|
//LastEdited
|
||||||
//Append the last record to the bottom
|
DB::query('UPDATE "' . $baseDataTable
|
||||||
DB::query('UPDATE "' . $table
|
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
||||||
. '" SET "' . $sortColumn . '" = ' . ($max + $i)
|
. ' WHERE "ID" = ' . $obj->ID);
|
||||||
. ' WHERE "ID" = ' . $obj->ID);
|
|
||||||
|
|
||||||
//LastEdited
|
|
||||||
DB::query('UPDATE "' . $baseDataTable
|
|
||||||
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
|
||||||
. ' WHERE "ID" = ' . $obj->ID);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->update_versioned_stage && $this->hasVersionedExtension($gridField->getModelClass())) {
|
if ($this->update_versioned_stage && $this->hasVersionedExtension($gridField->getModelClass())) {
|
||||||
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
||||||
@ -417,7 +390,7 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
*/
|
*/
|
||||||
public function getActions($gridField)
|
public function getActions($gridField)
|
||||||
{
|
{
|
||||||
return ['saveGridRowSort', 'sortableRowsToggle', 'sortToPage'];
|
return array('saveGridRowSort', 'sortableRowsToggle', 'sortToPage');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -471,7 +444,7 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
$className = $gridField->getModelClass();
|
$className = $gridField->getModelClass();
|
||||||
$owner = $gridField->Form->getRecord();
|
$owner = $gridField->Form->getRecord();
|
||||||
$items = clone $gridField->getList();
|
$items = clone $gridField->getList();
|
||||||
$many_many = ($items instanceof ManyManyList || $items instanceof ManyManyThroughList);
|
$many_many = ($items instanceof ManyManyList);
|
||||||
$sortColumn = $this->sortColumn;
|
$sortColumn = $this->sortColumn;
|
||||||
$pageOffset = 0;
|
$pageOffset = 0;
|
||||||
|
|
||||||
@ -485,20 +458,11 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
|
|
||||||
|
|
||||||
if ($many_many) {
|
if ($many_many) {
|
||||||
$schema = Injector::inst()->get(DataObjectSchema::class);
|
$schema=Injector::inst()->get(DataObjectSchema::class);
|
||||||
$componentDetails = $schema->manyManyComponent(get_class($owner), (!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()));
|
$componentDetails=$schema->manyManyComponent(get_class($owner), (!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()));
|
||||||
if (empty($componentDetails)) {
|
$parentField=$componentDetails['parentField'];
|
||||||
user_error('Could not find the relationship "' . (!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()) . '" on "' . get_class($owner) . '"', E_USER_ERROR);
|
$componentField=$componentDetails['childField'];
|
||||||
}
|
$table=$componentDetails['join'];
|
||||||
|
|
||||||
$parentField = $componentDetails['parentField'];
|
|
||||||
$componentField = $componentDetails['childField'];
|
|
||||||
$table = $componentDetails['join'];
|
|
||||||
|
|
||||||
//For ManyManyThroughLists get the right join table
|
|
||||||
if ($items instanceof ManyManyThroughList && class_exists($table)) {
|
|
||||||
$table = $schema->tableName($table);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
//Find table containing the sort column
|
//Find table containing the sort column
|
||||||
$table = false;
|
$table = false;
|
||||||
@ -541,8 +505,6 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
|
|
||||||
//Perform sorting
|
//Perform sorting
|
||||||
$ids = explode(',', $data['ItemIDs']);
|
$ids = explode(',', $data['ItemIDs']);
|
||||||
$modelClass = $gridField->getModelClass();
|
|
||||||
$hasVersioned = $this->hasVersionedExtension($modelClass);
|
|
||||||
for ($sort = 0; $sort < count($ids); $sort++) {
|
for ($sort = 0; $sort < count($ids); $sort++) {
|
||||||
$id = intval($ids[$sort]);
|
$id = intval($ids[$sort]);
|
||||||
if ($many_many) {
|
if ($many_many) {
|
||||||
@ -550,24 +512,15 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
. '" SET "' . $sortColumn . '" = ' . (($sort + 1) + $pageOffset)
|
. '" SET "' . $sortColumn . '" = ' . (($sort + 1) + $pageOffset)
|
||||||
. ' WHERE "' . $componentField . '" = ' . $id . ' AND "' . $parentField . '" = ' . $owner->ID);
|
. ' WHERE "' . $componentField . '" = ' . $id . ' AND "' . $parentField . '" = ' . $owner->ID);
|
||||||
} else {
|
} else {
|
||||||
if ($hasVersioned) {
|
DB::query('UPDATE "' . $table
|
||||||
// For versioned objects, modify them with the ORM so that the *_versions table is updated
|
. '" SET "' . $sortColumn . '" = ' . (($sort + 1) + $pageOffset)
|
||||||
$obj = $modelClass::get()->byID(intval($id));
|
. ' WHERE "ID" = ' . $id);
|
||||||
if (!empty($obj) && $obj !== false && $obj->exists()) {
|
|
||||||
$obj->$sortColumn = (($sort + 1) + $pageOffset);
|
|
||||||
$obj->write();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
DB::query('UPDATE "' . $table
|
|
||||||
. '" SET "' . $sortColumn . '" = ' . (($sort + 1) + $pageOffset)
|
|
||||||
. ' WHERE "ID" = ' . $id);
|
|
||||||
|
|
||||||
DB::query('UPDATE "' . $baseDataTable
|
DB::query('UPDATE "' . $baseDataTable
|
||||||
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
||||||
. ' WHERE "ID" = ' . $id);
|
. ' WHERE "ID" = ' . $id);
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->update_versioned_stage && $hasVersioned) {
|
if ($this->update_versioned_stage && $this->hasVersionedExtension($gridField->getModelClass())) {
|
||||||
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
||||||
. '" SET "' . $sortColumn . '" = ' . (($sort + 1) + $pageOffset)
|
. '" SET "' . $sortColumn . '" = ' . (($sort + 1) + $pageOffset)
|
||||||
. ' WHERE "ID" = ' . $id);
|
. ' WHERE "ID" = ' . $id);
|
||||||
@ -615,14 +568,14 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
user_error('No target page', E_USER_ERROR);
|
user_error('No target page', E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var \SilverStripe\Core\Extensible $className */
|
/** @var Extensible $className */
|
||||||
$className = $gridField->getModelClass();
|
$className = $gridField->getModelClass();
|
||||||
$owner = $gridField->Form->getRecord();
|
$owner = $gridField->Form->getRecord();
|
||||||
|
|
||||||
/** @var DataList $items */
|
/** @var DataList $items */
|
||||||
$items = clone $gridField->getList();
|
$items = clone $gridField->getList();
|
||||||
|
|
||||||
$many_many = ($items instanceof ManyManyList || $items instanceof ManyManyThroughList);
|
$many_many = ($items instanceof ManyManyList);
|
||||||
$sortColumn = $this->sortColumn;
|
$sortColumn = $this->sortColumn;
|
||||||
$targetItem = $items->byID(intval($data['ItemID']));
|
$targetItem = $items->byID(intval($data['ItemID']));
|
||||||
|
|
||||||
@ -638,16 +591,11 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($many_many) {
|
if ($many_many) {
|
||||||
$schema = Injector::inst()->get(DataObjectSchema::class);
|
$schema=Injector::inst()->get(DataObjectSchema::class);
|
||||||
$componentDetails = $schema->manyManyComponent(get_class($owner), (!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()));
|
$componentDetails=$schema->manyManyComponent(get_class($owner), (!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()));
|
||||||
$parentField = $componentDetails['parentField'];
|
$parentField=$componentDetails['parentField'];
|
||||||
$componentField = $componentDetails['childField'];
|
$componentField=$componentDetails['childField'];
|
||||||
$table = $componentDetails['join'];
|
$table=$componentDetails['join'];
|
||||||
|
|
||||||
//For ManyManyThroughLists get the right join table
|
|
||||||
if ($items instanceof ManyManyThroughList && class_exists($table)) {
|
|
||||||
$table = $schema->tableName($table);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($data['Target'] == 'previouspage') {
|
if ($data['Target'] == 'previouspage') {
|
||||||
@ -708,7 +656,7 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
|
|
||||||
$i = 1;
|
$i = 1;
|
||||||
foreach ($items as $obj) {
|
foreach ($items as $obj) {
|
||||||
if ($obj->ID == $targetItem->ID || $i >= count($sortPositions)) {
|
if ($obj->ID == $targetItem->ID) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -787,7 +735,8 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Check to see if the given class name has the Versioned extension
|
* Check to see if the given class name has the Versioned extension
|
||||||
* @param \SilverStripe\Core\Extensible|string $className
|
*
|
||||||
|
* @param Extensible|string $className
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function hasVersionedExtension($className)
|
public function hasVersionedExtension($className)
|
||||||
@ -797,6 +746,7 @@ class GridFieldSortableRows extends AbstractGridFieldComponent implements GridFi
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks to see if $table_name is declared on the DataObject, if not returns string as given
|
* Checks to see if $table_name is declared on the DataObject, if not returns string as given
|
||||||
|
*
|
||||||
* @param $className
|
* @param $className
|
||||||
* @return string
|
* @return string
|
||||||
* @deprecated Use DataObject::getSchema()->tableName() instead
|
* @deprecated Use DataObject::getSchema()->tableName() instead
|
||||||
|
@ -1,112 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests\PHPUnit\Bootstrap;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestFailure;
|
|
||||||
use PHPUnit\TextUI\DefaultResultPrinter;
|
|
||||||
|
|
||||||
class GitHubActionsAnnotatorPrinter extends DefaultResultPrinter
|
|
||||||
{
|
|
||||||
protected $currentType = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles printing of the defects
|
|
||||||
* @param array $defects Array of Test Failures
|
|
||||||
* @param string $type Type of the failure
|
|
||||||
*/
|
|
||||||
protected function printDefects(array $defects, string $type): void
|
|
||||||
{
|
|
||||||
$this->currentType = $type;
|
|
||||||
|
|
||||||
parent::printDefects($defects, $type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles printing of a single defect
|
|
||||||
* @param TestFailure $defect Test Failure Object
|
|
||||||
* @param int $count Current position
|
|
||||||
*/
|
|
||||||
protected function printDefect(TestFailure $defect, int $count): void
|
|
||||||
{
|
|
||||||
parent::printDefect($defect, $count);
|
|
||||||
|
|
||||||
$this->printGitHubAnnotation($defect);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prints a GitHub Annotation Command
|
|
||||||
* @param TestFailure $defect Defect to print
|
|
||||||
*/
|
|
||||||
protected function printGitHubAnnotation(TestFailure $defect)
|
|
||||||
{
|
|
||||||
$e = $defect->thrownException();
|
|
||||||
|
|
||||||
$errorLines = array_filter(
|
|
||||||
explode("\n", (string) $e),
|
|
||||||
function ($l) {
|
|
||||||
return $l;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
$error = end($errorLines);
|
|
||||||
$lineIndex = strrpos($error, ":");
|
|
||||||
$path = substr($error, 0, $lineIndex);
|
|
||||||
$line = substr($error, $lineIndex + 1);
|
|
||||||
|
|
||||||
if (!$path) {
|
|
||||||
list($path, $line) = $this->getReflectionFromTest(
|
|
||||||
$defect->getTestName()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$message = explode("\n", trim($defect->getTestName() . "\n\n" . (string) $e));
|
|
||||||
$message = implode('%0A', $message);
|
|
||||||
|
|
||||||
$type = $this->getCurrentType();
|
|
||||||
$file = "file={$this->relativePath($path)}";
|
|
||||||
$line = "line={$line}";
|
|
||||||
$this->write("::{$type} $file,$line::{$message}\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the current type of the defect
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function getCurrentType()
|
|
||||||
{
|
|
||||||
if (in_array($this->currentType, ['error', 'failure'])) {
|
|
||||||
return 'error';
|
|
||||||
}
|
|
||||||
|
|
||||||
return 'warning';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the relative path to the file
|
|
||||||
* @param string $path Path to make relative
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function relativePath($path)
|
|
||||||
{
|
|
||||||
$relative = str_replace(getcwd() . DIRECTORY_SEPARATOR, '', $path);
|
|
||||||
|
|
||||||
//Normalize
|
|
||||||
$relative = str_replace('\\', '/', $relative);
|
|
||||||
|
|
||||||
return $relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the file name and start line for the test
|
|
||||||
* @param string $name Name of the test
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
protected function getReflectionFromTest($name)
|
|
||||||
{
|
|
||||||
list($klass, $method) = explode('::', $name);
|
|
||||||
$c = new \ReflectionClass($klass);
|
|
||||||
$m = $c->getMethod($method);
|
|
||||||
|
|
||||||
return [$m->getFileName(), $m->getStartLine()];
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,264 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests\Forms;
|
|
||||||
|
|
||||||
use SilverStripe\Control\Controller;
|
|
||||||
use SilverStripe\Control\HTTPRequest;
|
|
||||||
use SilverStripe\Dev\SapphireTest;
|
|
||||||
use SilverStripe\Forms\FieldList;
|
|
||||||
use SilverStripe\Forms\Form;
|
|
||||||
use SilverStripe\Forms\GridField\GridField;
|
|
||||||
use SilverStripe\Forms\GridField\GridFieldConfig;
|
|
||||||
use SilverStripe\ORM\DB;
|
|
||||||
use SilverStripe\Security\Security;
|
|
||||||
use SilverStripe\Versioned\Versioned;
|
|
||||||
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
|
||||||
use UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\BaseObject;
|
|
||||||
use UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\ChildObject;
|
|
||||||
use UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\DummyController;
|
|
||||||
use UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\Player;
|
|
||||||
use UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\TestParent;
|
|
||||||
use UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\VPlayer;
|
|
||||||
|
|
||||||
class AutoSortTest extends SapphireTest
|
|
||||||
{
|
|
||||||
/** @var string */
|
|
||||||
public static $fixture_file = 'AutoSortTest.yml';
|
|
||||||
|
|
||||||
/** @var array */
|
|
||||||
protected static $extra_dataobjects = [
|
|
||||||
Player::class,
|
|
||||||
VPlayer::class,
|
|
||||||
TestParent::class,
|
|
||||||
BaseObject::class,
|
|
||||||
ChildObject::class
|
|
||||||
];
|
|
||||||
|
|
||||||
public function testAutoSort()
|
|
||||||
{
|
|
||||||
if (Security::getCurrentUser()) {
|
|
||||||
$this->logOut();
|
|
||||||
}
|
|
||||||
|
|
||||||
$list = Player::get();
|
|
||||||
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
|
||||||
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
|
||||||
$form = new Form(new DummyController(), 'mockform', new FieldList([$gridField]), new FieldList());
|
|
||||||
|
|
||||||
$stateID = 'testGridStateActionField';
|
|
||||||
$request = new HTTPRequest('POST', 'url', [], ['action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()]);
|
|
||||||
$session = Controller::curr()->getRequest()->getSession();
|
|
||||||
$session->set($form->getSecurityToken()->getName(), $form->getSecurityToken()->getValue());
|
|
||||||
$session->set($stateID, ['grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => ['GridFieldSortableRows' => ['sortableToggle' => true]]]);
|
|
||||||
$request->setSession($session);
|
|
||||||
|
|
||||||
$gridField->gridFieldAlterAction(['StateID' => $stateID], $form, $request);
|
|
||||||
|
|
||||||
//Insure sort ran
|
|
||||||
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run');
|
|
||||||
|
|
||||||
|
|
||||||
//Check for duplicates (there shouldn't be any)
|
|
||||||
$count = $list->Count();
|
|
||||||
$indexes = count(array_unique($list->column('SortOrder')));
|
|
||||||
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testAppendToTopAutoSort()
|
|
||||||
{
|
|
||||||
if (Security::getCurrentUser()) {
|
|
||||||
$this->logOut();
|
|
||||||
}
|
|
||||||
|
|
||||||
$list = Player::get();
|
|
||||||
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
|
||||||
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
|
||||||
$form = new Form(new DummyController(), 'mockform', new FieldList([$gridField]), new FieldList());
|
|
||||||
|
|
||||||
/** @var GridFieldSortableRows $sortableRows */
|
|
||||||
$sortableRows = $gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
|
||||||
$sortableRows->setAppendToTop(true);
|
|
||||||
|
|
||||||
$this->assertEquals(0, $list->last()->SortOrder, 'Auto sort should not have run');
|
|
||||||
|
|
||||||
$stateID = 'testGridStateActionField';
|
|
||||||
$request = new HTTPRequest('POST', 'url', [], ['action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()]);
|
|
||||||
$session = Controller::curr()->getRequest()->getSession();
|
|
||||||
$session->set($form->getSecurityToken()->getName(), $form->getSecurityToken()->getValue());
|
|
||||||
$session->set($stateID, ['grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => ['GridFieldSortableRows' => ['sortableToggle' => true]]]);
|
|
||||||
$request->setSession($session);
|
|
||||||
$gridField->gridFieldAlterAction(['StateID' => $stateID], $form, $request);
|
|
||||||
|
|
||||||
//Insure sort ran
|
|
||||||
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run');
|
|
||||||
|
|
||||||
|
|
||||||
//Check for duplicates (there shouldn't be any)
|
|
||||||
$count = $list->Count();
|
|
||||||
$indexes = count(array_unique($list->column('SortOrder')));
|
|
||||||
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testAutoSortVersioned()
|
|
||||||
{
|
|
||||||
if (Security::getCurrentUser()) {
|
|
||||||
$this->logOut();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Force versioned to reset
|
|
||||||
Versioned::reset();
|
|
||||||
|
|
||||||
$list = VPlayer::get();
|
|
||||||
|
|
||||||
//Publish all records
|
|
||||||
foreach ($list as $item) {
|
|
||||||
$item->publishSingle();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder', true, 'Live'));
|
|
||||||
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
|
||||||
$form = new Form(new DummyController(), 'mockform', new FieldList([$gridField]), new FieldList());
|
|
||||||
|
|
||||||
$stateID = 'testGridStateActionField';
|
|
||||||
$request = new HTTPRequest('POST', 'url', [], ['action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()]);
|
|
||||||
$session = Controller::curr()->getRequest()->getSession();
|
|
||||||
$session->set($form->getSecurityToken()->getName(), $form->getSecurityToken()->getValue());
|
|
||||||
$session->set($stateID, ['grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => ['GridFieldSortableRows' => ['sortableToggle' => true]]]);
|
|
||||||
$request->setSession($session);
|
|
||||||
$gridField->gridFieldAlterAction(['StateID' => $stateID], $form, $request);
|
|
||||||
|
|
||||||
|
|
||||||
//Insure sort ran
|
|
||||||
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run on Versioned stage "Stage"');
|
|
||||||
|
|
||||||
|
|
||||||
//Check for duplicates (there shouldn't be any)
|
|
||||||
$count = $list->Count();
|
|
||||||
$indexes = count(array_unique($list->column('SortOrder')));
|
|
||||||
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected on Versioned stage "Stage"');
|
|
||||||
|
|
||||||
|
|
||||||
//Force versioned over to Live stage
|
|
||||||
Versioned::set_reading_mode('Live');
|
|
||||||
|
|
||||||
//Get live instance
|
|
||||||
$obj = Versioned::get_one_by_stage(VPlayer::class, 'Live', '"ID"=' . $list->last()->ID);
|
|
||||||
|
|
||||||
//Insure sort ran
|
|
||||||
$this->assertEquals(3, $obj->SortOrder, 'Auto sort should have run on Versioned stage "Live"');
|
|
||||||
|
|
||||||
|
|
||||||
//Check for duplicates (there shouldn't be any)
|
|
||||||
$list = Versioned::get_by_stage(VPlayer::class, 'Live');
|
|
||||||
$count = $list->Count();
|
|
||||||
$indexes = count(array_unique($list->column('SortOrder')));
|
|
||||||
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected on Versioned stage "Live"');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testAppendToTopAutoSortVersioned()
|
|
||||||
{
|
|
||||||
if (Security::getCurrentUser()) {
|
|
||||||
$this->logOut();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Force versioned to reset
|
|
||||||
Versioned::reset();
|
|
||||||
|
|
||||||
$list = VPlayer::get();
|
|
||||||
|
|
||||||
//Publish all records
|
|
||||||
foreach ($list as $item) {
|
|
||||||
$item->publishSingle();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder', true, 'Live'));
|
|
||||||
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
|
||||||
$form = new Form(new DummyController(), 'mockform', new FieldList([$gridField]), new FieldList());
|
|
||||||
|
|
||||||
/** @var GridFieldSortableRows $sortableRows */
|
|
||||||
$sortableRows = $gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
|
||||||
$sortableRows->setAppendToTop(true);
|
|
||||||
|
|
||||||
$this->assertEquals(0, $list->last()->SortOrder, 'Auto sort should not have run on Versioned stage "Stage"');
|
|
||||||
|
|
||||||
$stateID = 'testGridStateActionField';
|
|
||||||
$request = new HTTPRequest('POST', 'url', [], ['action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()]);
|
|
||||||
$session = Controller::curr()->getRequest()->getSession();
|
|
||||||
$session->set($form->getSecurityToken()->getName(), $form->getSecurityToken()->getValue());
|
|
||||||
$session->set($stateID, ['grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => ['GridFieldSortableRows' => ['sortableToggle' => true]]]);
|
|
||||||
$request->setSession($session);
|
|
||||||
$gridField->gridFieldAlterAction(['StateID' => $stateID], $form, $request);
|
|
||||||
|
|
||||||
|
|
||||||
//Insure sort ran
|
|
||||||
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run on Versioned stage "Stage"');
|
|
||||||
|
|
||||||
|
|
||||||
//Check for duplicates (there shouldn't be any)
|
|
||||||
$count = $list->Count();
|
|
||||||
$indexes = count(array_unique($list->column('SortOrder')));
|
|
||||||
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected on Versioned stage "Stage"');
|
|
||||||
|
|
||||||
|
|
||||||
//Force versioned over to Live stage
|
|
||||||
Versioned::set_reading_mode('Live');
|
|
||||||
|
|
||||||
//Insure sort ran
|
|
||||||
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run on Versioned stage "Live"');
|
|
||||||
|
|
||||||
|
|
||||||
//Check for duplicates (there shouldn't be any)
|
|
||||||
$count = $list->Count();
|
|
||||||
$indexes = count(array_unique($list->column('SortOrder')));
|
|
||||||
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected on Versioned stage "Live"');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testAppendToTopAutoSortChild()
|
|
||||||
{
|
|
||||||
if (Security::getCurrentUser()) {
|
|
||||||
$this->logOut();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Push the edit date into the past, we're checking this later
|
|
||||||
DB::query('UPDATE "GridFieldAction_SortOrder_BaseObject" SET "LastEdited"=\'' . date('Y-m-d 00:00:00', strtotime('yesterday')) . '\'');
|
|
||||||
|
|
||||||
/** @var TestParent $parent */
|
|
||||||
$parent = TestParent::get()->first();
|
|
||||||
|
|
||||||
/** @var DataList $list */
|
|
||||||
$list = $parent->TestRelation();
|
|
||||||
|
|
||||||
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
|
||||||
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
|
||||||
$form = new Form(new DummyController(), 'mockform', new FieldList([$gridField]), new FieldList());
|
|
||||||
$form->loadDataFrom($parent);
|
|
||||||
|
|
||||||
/** @var GridFieldSortableRows $sortableRows */
|
|
||||||
$sortableRows = $gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
|
||||||
$sortableRows->setAppendToTop(true);
|
|
||||||
|
|
||||||
$this->assertEquals(0, $list->last()->SortOrder, 'Auto sort should not have run');
|
|
||||||
|
|
||||||
$stateID = 'testGridStateActionField';
|
|
||||||
$request = new HTTPRequest('POST', 'url', [], ['action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()]);
|
|
||||||
$session = Controller::curr()->getRequest()->getSession();
|
|
||||||
$session->set($form->getSecurityToken()->getName(), $form->getSecurityToken()->getValue());
|
|
||||||
$session->set($stateID, ['grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => ['GridFieldSortableRows' => ['sortableToggle' => true]]]);
|
|
||||||
$request->setSession($session);
|
|
||||||
$gridField->gridFieldAlterAction(['StateID' => $stateID], $form, $request);
|
|
||||||
|
|
||||||
//Insure sort ran
|
|
||||||
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run');
|
|
||||||
|
|
||||||
|
|
||||||
//Check for duplicates (there shouldn't be any)
|
|
||||||
$count = $list->Count();
|
|
||||||
$indexes = count(array_unique($list->column('SortOrder')));
|
|
||||||
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected');
|
|
||||||
|
|
||||||
|
|
||||||
//Make sure the last edited is today for all records
|
|
||||||
$this->assertEquals(3, $list->filter('LastEdited:GreaterThan', date('Y-m-d 00:00:00'))->count());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\Player:
|
|
||||||
player1:
|
|
||||||
Name: Player 1
|
|
||||||
SortOrder: 0
|
|
||||||
player2:
|
|
||||||
Name: Player 2
|
|
||||||
SortOrder: 0
|
|
||||||
player3:
|
|
||||||
Name: Player 3
|
|
||||||
SortOrder: 0
|
|
||||||
|
|
||||||
UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\VPlayer:
|
|
||||||
player1:
|
|
||||||
Name: Player 1
|
|
||||||
SortOrder: 0
|
|
||||||
player2:
|
|
||||||
Name: Player 2
|
|
||||||
SortOrder: 0
|
|
||||||
player3:
|
|
||||||
Name: Player 3
|
|
||||||
SortOrder: 0
|
|
||||||
|
|
||||||
UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\TestParent:
|
|
||||||
testparent:
|
|
||||||
Name: Test
|
|
||||||
|
|
||||||
UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\ChildObject:
|
|
||||||
testitem1:
|
|
||||||
Name: Test 1
|
|
||||||
SortOrder: 0
|
|
||||||
Parent: =>UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\TestParent.testparent
|
|
||||||
testitem2:
|
|
||||||
Name: Test 2
|
|
||||||
SortOrder: 0
|
|
||||||
Parent: =>UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\TestParent.testparent
|
|
||||||
testitem3:
|
|
||||||
Name: Test 3
|
|
||||||
SortOrder: 0
|
|
||||||
Parent: =>UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\TestParent.testparent
|
|
@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest;
|
|
||||||
|
|
||||||
use SilverStripe\Dev\TestOnly;
|
|
||||||
use SilverStripe\ORM\DataObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class \UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\BaseObject
|
|
||||||
*
|
|
||||||
* @property string Name
|
|
||||||
*/
|
|
||||||
class BaseObject extends DataObject implements TestOnly
|
|
||||||
{
|
|
||||||
private static $table_name = 'GridFieldAction_SortOrder_BaseObject';
|
|
||||||
|
|
||||||
private static $db = [
|
|
||||||
'Name' => 'Varchar',
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest;
|
|
||||||
|
|
||||||
use SilverStripe\Dev\TestOnly;
|
|
||||||
use SilverStripe\ORM\FieldType\DBInt;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class \UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\ChildObject
|
|
||||||
*
|
|
||||||
* @package SortableGridField\Tests
|
|
||||||
* @property int SortOrder
|
|
||||||
* @method TestParent Parent
|
|
||||||
*/
|
|
||||||
class ChildObject extends BaseObject implements TestOnly
|
|
||||||
{
|
|
||||||
private static $table_name = 'GridFieldAction_SortOrder_ChildObject';
|
|
||||||
|
|
||||||
private static $db = [
|
|
||||||
'SortOrder' => DBInt::class,
|
|
||||||
];
|
|
||||||
|
|
||||||
private static $has_one = [
|
|
||||||
'Parent' => TestParent::class,
|
|
||||||
];
|
|
||||||
|
|
||||||
private static $default_sort = 'SortOrder';
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest;
|
|
||||||
|
|
||||||
use SilverStripe\Control\Controller;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class \UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\DummyController
|
|
||||||
*/
|
|
||||||
class DummyController extends Controller
|
|
||||||
{
|
|
||||||
private static $url_segment = 'sortable-grid-field';
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest;
|
|
||||||
|
|
||||||
use SilverStripe\Dev\TestOnly;
|
|
||||||
use SilverStripe\ORM\DataObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class \UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\Player
|
|
||||||
*
|
|
||||||
* @property string Name
|
|
||||||
* @property int SortOrder
|
|
||||||
*/
|
|
||||||
class Player extends DataObject implements TestOnly
|
|
||||||
{
|
|
||||||
private static $table_name = 'GridFieldAction_SortOrder_Player';
|
|
||||||
|
|
||||||
private static $db = [
|
|
||||||
'Name' => 'Varchar',
|
|
||||||
'SortOrder' => 'Int',
|
|
||||||
];
|
|
||||||
|
|
||||||
private static $default_sort = 'SortOrder';
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest;
|
|
||||||
|
|
||||||
use SilverStripe\Dev\TestOnly;
|
|
||||||
use SilverStripe\ORM\DataObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class \UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\TestParent
|
|
||||||
*
|
|
||||||
* @package SortableGridField\Tests
|
|
||||||
* @property string Name
|
|
||||||
* @method ChildObject TestRelation
|
|
||||||
*/
|
|
||||||
class TestParent extends DataObject implements TestOnly
|
|
||||||
{
|
|
||||||
private static $table_name = 'GridFieldAction_SortOrder_TestParent';
|
|
||||||
|
|
||||||
private static $db = [
|
|
||||||
'Name' => 'Varchar',
|
|
||||||
];
|
|
||||||
|
|
||||||
private static $has_many = [
|
|
||||||
'TestRelation' => ChildObject::class,
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest;
|
|
||||||
|
|
||||||
use SilverStripe\Dev\TestOnly;
|
|
||||||
use SilverStripe\ORM\DataObject;
|
|
||||||
use SilverStripe\Versioned\Versioned;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class \UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\VPlayer
|
|
||||||
*
|
|
||||||
* @property string Name
|
|
||||||
* @property int SortOrder
|
|
||||||
*/
|
|
||||||
class VPlayer extends DataObject implements TestOnly
|
|
||||||
{
|
|
||||||
private static $table_name = 'GridFieldAction_SortOrder_VPlayer';
|
|
||||||
|
|
||||||
private static $db = [
|
|
||||||
'Name' => 'Varchar',
|
|
||||||
'SortOrder' => 'Int',
|
|
||||||
];
|
|
||||||
|
|
||||||
private static $default_sort = 'SortOrder';
|
|
||||||
|
|
||||||
private static $extensions = [
|
|
||||||
Versioned::class,
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,123 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests;
|
|
||||||
|
|
||||||
use SilverStripe\Core\Injector\Injector;
|
|
||||||
use SilverStripe\Control\Controller;
|
|
||||||
use SilverStripe\Control\HTTPRequest;
|
|
||||||
use SilverStripe\Dev\SapphireTest;
|
|
||||||
use SilverStripe\Forms\FieldList;
|
|
||||||
use SilverStripe\Forms\Form;
|
|
||||||
use SilverStripe\Forms\GridField\GridField;
|
|
||||||
use SilverStripe\Forms\GridField\GridFieldConfig;
|
|
||||||
use SilverStripe\ORM\ValidationException;
|
|
||||||
use SilverStripe\Security\IdentityStore;
|
|
||||||
use SilverStripe\Security\Security;
|
|
||||||
use SilverStripe\Versioned\Versioned;
|
|
||||||
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
|
||||||
use UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\DummyController;
|
|
||||||
use UndefinedOffset\SortableGridField\Tests\Forms\OrderingTest\Team;
|
|
||||||
use UndefinedOffset\SortableGridField\Tests\Forms\OrderingTest\VTeam;
|
|
||||||
|
|
||||||
class OrderingTest extends SapphireTest
|
|
||||||
{
|
|
||||||
/** @var ArrayList */
|
|
||||||
protected $list;
|
|
||||||
|
|
||||||
/** @var GridField */
|
|
||||||
protected $gridField;
|
|
||||||
|
|
||||||
/** @var Form */
|
|
||||||
protected $form;
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
public static $fixture_file = 'OrderingTest.yml';
|
|
||||||
|
|
||||||
/** @var array */
|
|
||||||
protected static $extra_dataobjects = [
|
|
||||||
Team::class,
|
|
||||||
VTeam::class
|
|
||||||
];
|
|
||||||
|
|
||||||
protected function setUp(): void
|
|
||||||
{
|
|
||||||
parent::setUp();
|
|
||||||
|
|
||||||
$this->list = Team::get();
|
|
||||||
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
|
||||||
$this->gridField = new GridField('testfield', 'testfield', $this->list, $config);
|
|
||||||
$this->form = new Form(new DummyController(), 'mockform', new FieldList([$this->gridField]), new FieldList());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSortActionWithoutCorrectPermission()
|
|
||||||
{
|
|
||||||
if (Security::getCurrentUser()) {
|
|
||||||
Injector::inst()->get(IdentityStore::class)->logOut(Controller::curr()->getRequest());
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->expectException(ValidationException::class);
|
|
||||||
$team1 = $this->objFromFixture(Team::class, 'team1');
|
|
||||||
$team2 = $this->objFromFixture(Team::class, 'team2');
|
|
||||||
$team3 = $this->objFromFixture(Team::class, 'team3');
|
|
||||||
|
|
||||||
$stateID = 'testGridStateActionField';
|
|
||||||
$request = new HTTPRequest('POST', 'url', ['ItemIDs' => "$team1->ID, $team3->ID, $team2->ID"], ['action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()]);
|
|
||||||
$session = Controller::curr()->getRequest()->getSession();
|
|
||||||
$session->set($this->form->getSecurityToken()->getName(), $this->form->getSecurityToken()->getValue());
|
|
||||||
$session->set($stateID, ['grid' => '', 'actionName' => 'saveGridRowSort', 'args' => ['GridFieldSortableRows' => ['sortableToggle' => true]]]);
|
|
||||||
$request->setSession($session);
|
|
||||||
$this->gridField->gridFieldAlterAction(['StateID' => $stateID], $this->form, $request);
|
|
||||||
$this->assertEquals($team3->ID, $this->list->last()->ID, 'User should\'t be able to sort records without correct permissions.');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSortActionWithAdminPermission()
|
|
||||||
{
|
|
||||||
$team1 = $this->objFromFixture(Team::class, 'team1');
|
|
||||||
$team2 = $this->objFromFixture(Team::class, 'team2');
|
|
||||||
$team3 = $this->objFromFixture(Team::class, 'team3');
|
|
||||||
$this->logInWithPermission('ADMIN');
|
|
||||||
$stateID = 'testGridStateActionField';
|
|
||||||
$request = new HTTPRequest('POST', 'url', ['ItemIDs' => "$team1->ID, $team3->ID, $team2->ID"], ['action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()]);
|
|
||||||
$session = Controller::curr()->getRequest()->getSession();
|
|
||||||
$session->set($this->form->getSecurityToken()->getName(), $this->form->getSecurityToken()->getValue());
|
|
||||||
$session->set($stateID, ['grid' => '', 'actionName' => 'saveGridRowSort', 'args' => ['GridFieldSortableRows' => ['sortableToggle' => true]]]);
|
|
||||||
$request->setSession($session);
|
|
||||||
$this->gridField->gridFieldAlterAction(['StateID' => $stateID], $this->form, $request);
|
|
||||||
$this->assertEquals($team2->ID, $this->list->last()->ID, 'User should be able to sort records with ADMIN permission.');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSortActionVersioned()
|
|
||||||
{
|
|
||||||
//Force versioned to reset
|
|
||||||
Versioned::reset();
|
|
||||||
|
|
||||||
$list = VTeam::get();
|
|
||||||
$this->gridField->setList($list);
|
|
||||||
|
|
||||||
/** @var GridFieldSortableRows $sortableGrid */
|
|
||||||
$sortableGrid = $this->gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
|
||||||
$sortableGrid->setUpdateVersionedStage('Live');
|
|
||||||
|
|
||||||
//Publish all records
|
|
||||||
foreach ($list as $item) {
|
|
||||||
$item->publishSingle();
|
|
||||||
}
|
|
||||||
|
|
||||||
$team1 = $this->objFromFixture(VTeam::class, 'team1');
|
|
||||||
$team2 = $this->objFromFixture(VTeam::class, 'team2');
|
|
||||||
$team3 = $this->objFromFixture(VTeam::class, 'team3');
|
|
||||||
|
|
||||||
$this->logInWithPermission('ADMIN');
|
|
||||||
$stateID = 'testGridStateActionField';
|
|
||||||
$request = new HTTPRequest('POST', 'url', ['ItemIDs' => "$team1->ID, $team3->ID, $team2->ID"], ['action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()]);
|
|
||||||
$session = Controller::curr()->getRequest()->getSession();
|
|
||||||
$session->set($this->form->getSecurityToken()->getName(), $this->form->getSecurityToken()->getValue());
|
|
||||||
$session->set($stateID, ['grid' => '', 'actionName' => 'saveGridRowSort', 'args' => ['GridFieldSortableRows' => ['sortableToggle' => true]]]);
|
|
||||||
$request->setSession($session);
|
|
||||||
$this->gridField->gridFieldAlterAction(['StateID' => $stateID], $this->form, $request);
|
|
||||||
|
|
||||||
$this->assertEquals($team2->ID, $list->last()->ID, 'Sort should have happened on Versioned stage "Stage"');
|
|
||||||
|
|
||||||
$list = Versioned::get_by_stage(VTeam::class, 'Live');
|
|
||||||
$this->assertEquals($team2->ID, $list->last()->ID, 'Sort should have happened on Versioned stage "Live"');
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests\Forms\OrderingTest;
|
|
||||||
|
|
||||||
use SilverStripe\Dev\TestOnly;
|
|
||||||
use SilverStripe\ORM\DataObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class \UndefinedOffset\SortableGridField\Tests\Forms\OrderingTest\Team
|
|
||||||
*
|
|
||||||
* @property string Name
|
|
||||||
* @property string City
|
|
||||||
* @property int SortOrder
|
|
||||||
*/
|
|
||||||
class Team extends DataObject implements TestOnly
|
|
||||||
{
|
|
||||||
private static $table_name = 'GridFieldAction_SortOrder_Team';
|
|
||||||
|
|
||||||
private static $db = [
|
|
||||||
'Name' => 'Varchar',
|
|
||||||
'City' => 'Varchar',
|
|
||||||
'SortOrder' => 'Int',
|
|
||||||
];
|
|
||||||
|
|
||||||
private static $default_sort = 'SortOrder';
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests\Forms\OrderingTest;
|
|
||||||
|
|
||||||
use SilverStripe\Dev\TestOnly;
|
|
||||||
use SilverStripe\ORM\DataObject;
|
|
||||||
use SilverStripe\Versioned\Versioned;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class \UndefinedOffset\SortableGridField\Tests\Forms\OrderingTest\VTeam
|
|
||||||
*
|
|
||||||
* @property string Name
|
|
||||||
* @property string City
|
|
||||||
* @property int SortOrder
|
|
||||||
*/
|
|
||||||
class VTeam extends DataObject implements TestOnly
|
|
||||||
{
|
|
||||||
private static $table_name = 'GridFieldAction_SortOrder_VTeam';
|
|
||||||
|
|
||||||
private static $db = [
|
|
||||||
'Name' => 'Varchar',
|
|
||||||
'City' => 'Varchar',
|
|
||||||
'SortOrder' => 'Int',
|
|
||||||
];
|
|
||||||
private static $default_sort = 'SortOrder';
|
|
||||||
|
|
||||||
private static $extensions = [
|
|
||||||
Versioned::class,
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,188 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests;
|
|
||||||
|
|
||||||
use SilverStripe\Control\Controller;
|
|
||||||
use SilverStripe\Control\HTTPRequest;
|
|
||||||
use SilverStripe\Dev\SapphireTest;
|
|
||||||
use SilverStripe\Forms\FieldList;
|
|
||||||
use SilverStripe\Forms\Form;
|
|
||||||
use SilverStripe\Forms\GridField\GridField;
|
|
||||||
use SilverStripe\Forms\GridField\GridFieldConfig_Base;
|
|
||||||
use SilverStripe\Versioned\Versioned;
|
|
||||||
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
|
||||||
use UndefinedOffset\SortableGridField\Tests\Forms\AutoSortTest\DummyController;
|
|
||||||
use UndefinedOffset\SortableGridField\Tests\Forms\PageSortingTest\Team;
|
|
||||||
use UndefinedOffset\SortableGridField\Tests\Forms\PageSortingTest\VTeam;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class \UndefinedOffset\SortableGridField\Tests\PageSortingTest
|
|
||||||
*/
|
|
||||||
class PageSortingTest extends SapphireTest
|
|
||||||
{
|
|
||||||
/** @var ArrayList */
|
|
||||||
protected $list;
|
|
||||||
|
|
||||||
/** @var GridField */
|
|
||||||
protected $gridField;
|
|
||||||
|
|
||||||
/** @var Form */
|
|
||||||
protected $form;
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
public static $fixture_file = 'PageSortingTest.yml';
|
|
||||||
|
|
||||||
/** @var array */
|
|
||||||
protected static $extra_dataobjects = [
|
|
||||||
Team::class,
|
|
||||||
VTeam::class
|
|
||||||
];
|
|
||||||
|
|
||||||
protected function setUp(): void
|
|
||||||
{
|
|
||||||
parent::setUp();
|
|
||||||
|
|
||||||
$this->list = Team::get();
|
|
||||||
$config = GridFieldConfig_Base::create(5)->addComponent(new GridFieldSortableRows('SortOrder'));
|
|
||||||
$this->gridField = new GridField('testfield', 'testfield', $this->list, $config);
|
|
||||||
$this->form = new Form(new DummyController(), 'mockform', FieldList::create([$this->gridField]), FieldList::create());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSortToNextPage()
|
|
||||||
{
|
|
||||||
$this->gridField->State->GridFieldPaginator->currentPage = 1;
|
|
||||||
|
|
||||||
$team3 = $this->objFromFixture(Team::class, 'team3');
|
|
||||||
|
|
||||||
$this->logInWithPermission('ADMIN');
|
|
||||||
$stateID = 'testGridStateActionField';
|
|
||||||
$request = new HTTPRequest('POST', 'url', ['ItemID' => $team3->ID, 'Target' => 'nextpage'], ['action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()]);
|
|
||||||
$session = Controller::curr()->getRequest()->getSession();
|
|
||||||
$session->set($this->form->getSecurityToken()->getName(), $this->form->getSecurityToken()->getValue());
|
|
||||||
$session->set($stateID, ['grid' => '', 'actionName' => 'sortToPage', 'args' => ['GridFieldSortableRows' => ['sortableToggle' => true], 'GridFieldPaginator' => ['currentPage' => 1]]]);
|
|
||||||
$request->setSession($session);
|
|
||||||
$this->gridField->gridFieldAlterAction(['StateID' => $stateID], $this->form, $request);
|
|
||||||
|
|
||||||
$team6 = $this->objFromFixture(Team::class, 'team6');
|
|
||||||
$this->assertEquals(5, $team6->SortOrder, 'Team 6 Should have moved to the bottom of the first page');
|
|
||||||
|
|
||||||
$team3 = $this->objFromFixture(Team::class, 'team3');
|
|
||||||
$this->assertEquals(6, $team3->SortOrder, 'Team 3 Should have moved to the top of the second page');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSortToPrevPage()
|
|
||||||
{
|
|
||||||
$this->gridField->State->GridFieldPaginator->currentPage = 2;
|
|
||||||
|
|
||||||
$team7 = $this->objFromFixture(Team::class, 'team7');
|
|
||||||
|
|
||||||
$this->logInWithPermission('ADMIN');
|
|
||||||
$stateID = 'testGridStateActionField';
|
|
||||||
$request = new HTTPRequest('POST', 'url', ['ItemID' => $team7->ID, 'Target' => 'previouspage'], ['action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()]);
|
|
||||||
$session = Controller::curr()->getRequest()->getSession();
|
|
||||||
$session->set($this->form->getSecurityToken()->getName(), $this->form->getSecurityToken()->getValue());
|
|
||||||
$session->set($stateID, ['grid' => '', 'actionName' => 'sortToPage', 'args' => ['GridFieldSortableRows' => ['sortableToggle' => true], 'GridFieldPaginator' => ['currentPage' => 1]]]);
|
|
||||||
$request->setSession($session);
|
|
||||||
$this->gridField->gridFieldAlterAction(['StateID' => $stateID], $this->form, $request);
|
|
||||||
|
|
||||||
|
|
||||||
$team7 = $this->objFromFixture(Team::class, 'team7');
|
|
||||||
$this->assertEquals(5, $team7->SortOrder, 'Team 7 Should have moved to the bottom of the first page');
|
|
||||||
|
|
||||||
$team5 = $this->objFromFixture(Team::class, 'team5');
|
|
||||||
$this->assertEquals(6, $team5->SortOrder, 'Team 5 Should have moved to the top of the second page');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSortToNextPageVersioned()
|
|
||||||
{
|
|
||||||
//Force versioned to reset
|
|
||||||
Versioned::reset();
|
|
||||||
|
|
||||||
$list = VTeam::get();
|
|
||||||
$this->gridField->setList($list);
|
|
||||||
|
|
||||||
/** @var GridFieldSortableRows $sortableGrid */
|
|
||||||
$sortableGrid = $this->gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
|
||||||
$sortableGrid->setUpdateVersionedStage('Live');
|
|
||||||
$this->gridField->State->GridFieldPaginator->currentPage = 1;
|
|
||||||
|
|
||||||
//Publish all records
|
|
||||||
foreach ($list as $item) {
|
|
||||||
$item->publishSingle();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$team3 = $this->objFromFixture(VTeam::class, 'team3');
|
|
||||||
|
|
||||||
$this->logInWithPermission('ADMIN');
|
|
||||||
$stateID = 'testGridStateActionField';
|
|
||||||
$request = new HTTPRequest('POST', 'url', ['ItemID' => $team3->ID, 'Target' => 'nextpage'], ['action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()]);
|
|
||||||
$session = Controller::curr()->getRequest()->getSession();
|
|
||||||
$session->set($this->form->getSecurityToken()->getName(), $this->form->getSecurityToken()->getValue());
|
|
||||||
$session->set($stateID, ['grid' => '', 'actionName' => 'sortToPage', 'args' => ['GridFieldSortableRows' => ['sortableToggle' => true], 'GridFieldPaginator' => ['currentPage' => 1]]]);
|
|
||||||
$request->setSession($session);
|
|
||||||
$this->gridField->gridFieldAlterAction(['StateID' => $stateID], $this->form, $request);
|
|
||||||
|
|
||||||
|
|
||||||
$team6 = $this->objFromFixture(VTeam::class, 'team6');
|
|
||||||
$this->assertEquals(5, $team6->SortOrder, 'Team 6 Should have moved to the bottom of the first page on Versioned stage "Stage"');
|
|
||||||
|
|
||||||
$team3 = $this->objFromFixture(VTeam::class, 'team3');
|
|
||||||
$this->assertEquals(6, $team3->SortOrder, 'Team 3 Should have moved to the top of the second page on Versioned stage "Stage"');
|
|
||||||
|
|
||||||
|
|
||||||
$list = Versioned::get_by_stage(VTeam::class, 'Live');
|
|
||||||
|
|
||||||
$team6 = $list->byID($team6->ID);
|
|
||||||
$this->assertEquals(5, $team6->SortOrder, 'Team 6 Should have moved to the bottom of the first page on Versioned stage "Live"');
|
|
||||||
|
|
||||||
$team3 = $list->byID($team3->ID);
|
|
||||||
$this->assertEquals(6, $team3->SortOrder, 'Team 3 Should have moved to the top of the second page on Versioned stage "Live"');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSortToPrevPageVersioned()
|
|
||||||
{
|
|
||||||
//Force versioned to reset
|
|
||||||
Versioned::reset();
|
|
||||||
|
|
||||||
$list = VTeam::get();
|
|
||||||
$this->gridField->setList($list);
|
|
||||||
|
|
||||||
/** @var GridFieldSortableRows $sortableGrid */
|
|
||||||
$sortableGrid = $this->gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
|
||||||
$sortableGrid->setUpdateVersionedStage('Live');
|
|
||||||
$this->gridField->State->GridFieldPaginator->currentPage = 2;
|
|
||||||
|
|
||||||
//Publish all records
|
|
||||||
foreach ($list as $item) {
|
|
||||||
$item->publishSingle();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$team7 = $this->objFromFixture(VTeam::class, 'team7');
|
|
||||||
|
|
||||||
$this->logInWithPermission('ADMIN');
|
|
||||||
$stateID = 'testGridStateActionField';
|
|
||||||
$request = new HTTPRequest('POST', 'url', ['ItemID' => $team7->ID, 'Target' => 'previouspage'], ['action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()]);
|
|
||||||
$session = Controller::curr()->getRequest()->getSession();
|
|
||||||
$session->set($this->form->getSecurityToken()->getName(), $this->form->getSecurityToken()->getValue());
|
|
||||||
$session->set($stateID, ['grid' => '', 'actionName' => 'sortToPage', 'args' => ['GridFieldSortableRows' => ['sortableToggle' => true], 'GridFieldPaginator' => ['currentPage' => 1]]]);
|
|
||||||
$request->setSession($session);
|
|
||||||
$this->gridField->gridFieldAlterAction(['StateID' => $stateID], $this->form, $request);
|
|
||||||
|
|
||||||
|
|
||||||
$team7 = $this->objFromFixture(VTeam::class, 'team7');
|
|
||||||
$this->assertEquals(5, $team7->SortOrder, 'Team 7 Should have moved to the bottom of the first page on Versioned stage "Stage"');
|
|
||||||
|
|
||||||
$team5 = $this->objFromFixture(VTeam::class, 'team5');
|
|
||||||
$this->assertEquals(6, $team5->SortOrder, 'Team 5 Should have moved to the top of the second page on Versioned stage "Stage"');
|
|
||||||
|
|
||||||
|
|
||||||
$list = Versioned::get_by_stage(VTeam::class, 'Live');
|
|
||||||
|
|
||||||
$team7 = $list->byID($team7->ID);
|
|
||||||
$this->assertEquals(5, $team7->SortOrder, 'Team 7 Should have moved to the bottom of the first page on Versioned stage "Live"');
|
|
||||||
|
|
||||||
$team5 = $list->byID($team5->ID);
|
|
||||||
$this->assertEquals(6, $team5->SortOrder, 'Team 5 Should have moved to the top of the second page on Versioned stage "Live"');
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests\Forms\PageSortingTest;
|
|
||||||
|
|
||||||
use SilverStripe\Dev\TestOnly;
|
|
||||||
use SilverStripe\ORM\DataObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class \UndefinedOffset\SortableGridField\Tests\Forms\PageSortingTest\Team
|
|
||||||
*
|
|
||||||
* @property string Name
|
|
||||||
* @property string City
|
|
||||||
* @property int SortOrder
|
|
||||||
*/
|
|
||||||
class Team extends DataObject implements TestOnly
|
|
||||||
{
|
|
||||||
private static $table_name = 'GridFieldAction_PageSortOrder_Team';
|
|
||||||
|
|
||||||
private static $db = [
|
|
||||||
'Name' => 'Varchar',
|
|
||||||
'City' => 'Varchar',
|
|
||||||
'SortOrder' => 'Int',
|
|
||||||
];
|
|
||||||
|
|
||||||
private static $default_sort = 'SortOrder';
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace UndefinedOffset\SortableGridField\Tests\Forms\PageSortingTest;
|
|
||||||
|
|
||||||
use SilverStripe\Dev\TestOnly;
|
|
||||||
use SilverStripe\ORM\DataObject;
|
|
||||||
use SilverStripe\Versioned\Versioned;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class \UndefinedOffset\SortableGridField\Tests\Forms\PageSortingTest\VTeam
|
|
||||||
*
|
|
||||||
* @property string Name
|
|
||||||
* @property string City
|
|
||||||
* @property int SortOrder
|
|
||||||
*/
|
|
||||||
class VTeam extends DataObject implements TestOnly
|
|
||||||
{
|
|
||||||
private static $table_name = 'GridFieldAction_PageSortOrder_VTeam';
|
|
||||||
|
|
||||||
private static $db = [
|
|
||||||
'Name' => 'Varchar',
|
|
||||||
'City' => 'Varchar',
|
|
||||||
'SortOrder' => 'Int',
|
|
||||||
];
|
|
||||||
|
|
||||||
private static $default_sort = 'SortOrder';
|
|
||||||
|
|
||||||
private static $extensions = [
|
|
||||||
Versioned::class,
|
|
||||||
];
|
|
||||||
}
|
|
380
tests/forms/GridFieldSortableRowsAutoSortTest.php
Normal file
380
tests/forms/GridFieldSortableRowsAutoSortTest.php
Normal file
@ -0,0 +1,380 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace UndefinedOffset\SortableGridField\Tests;
|
||||||
|
|
||||||
|
use SilverStripe\Control\Controller;
|
||||||
|
use SilverStripe\Control\HTTPRequest;
|
||||||
|
use SilverStripe\Control\Session;
|
||||||
|
use SilverStripe\Core\Injector\Injector;
|
||||||
|
use SilverStripe\Dev\SapphireTest;
|
||||||
|
use SilverStripe\Dev\TestOnly;
|
||||||
|
use SilverStripe\Forms\FieldList;
|
||||||
|
use SilverStripe\Forms\Form;
|
||||||
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldConfig;
|
||||||
|
use SilverStripe\ORM\DataList;
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
use SilverStripe\ORM\DB;
|
||||||
|
use SilverStripe\ORM\FieldType\DBInt;
|
||||||
|
use SilverStripe\ORM\FieldType\DBVarchar;
|
||||||
|
use SilverStripe\Security\Member;
|
||||||
|
use SilverStripe\Versioned\Versioned;
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldSortableRowsAutoSortTest
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
*/
|
||||||
|
class GridFieldSortableRowsAutoSortTest extends SapphireTest
|
||||||
|
{
|
||||||
|
/** @var string */
|
||||||
|
public static $fixture_file = 'GridFieldSortableRowsAutoSortTest.yml';
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
protected static $extra_dataobjects = array(
|
||||||
|
GridFieldAction_SortOrder_Player::class,
|
||||||
|
GridFieldAction_SortOrder_VPlayer::class,
|
||||||
|
GridFieldAction_SortOrder_TestParent::class,
|
||||||
|
GridFieldAction_SortOrder_BaseObject::class,
|
||||||
|
GridFieldAction_SortOrder_ChildObject::class
|
||||||
|
);
|
||||||
|
|
||||||
|
public function testAutoSort()
|
||||||
|
{
|
||||||
|
if (Member::currentUser()) {
|
||||||
|
Member::currentUser()->logOut();
|
||||||
|
}
|
||||||
|
|
||||||
|
$list = GridFieldAction_SortOrder_Player::get();
|
||||||
|
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
|
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
||||||
|
$form = new Form(new SortableGridField_DummyController(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
||||||
|
|
||||||
|
$stateID = 'testGridStateActionField';
|
||||||
|
$request = new HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()));
|
||||||
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
|
|
||||||
|
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
||||||
|
|
||||||
|
//Insure sort ran
|
||||||
|
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run');
|
||||||
|
|
||||||
|
|
||||||
|
//Check for duplicates (there shouldn't be any)
|
||||||
|
$count = $list->Count();
|
||||||
|
$indexes = count(array_unique($list->column('SortOrder')));
|
||||||
|
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAppendToTopAutoSort()
|
||||||
|
{
|
||||||
|
if (Member::currentUser()) {
|
||||||
|
Member::currentUser()->logOut();
|
||||||
|
}
|
||||||
|
|
||||||
|
$list = GridFieldAction_SortOrder_Player::get();
|
||||||
|
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
|
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
||||||
|
$form = new Form(new SortableGridField_DummyController(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
||||||
|
|
||||||
|
/** @var GridFieldSortableRows $sortableRows */
|
||||||
|
$sortableRows = $gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
||||||
|
$sortableRows->setAppendToTop(true);
|
||||||
|
|
||||||
|
$this->assertEquals(0, $list->last()->SortOrder, 'Auto sort should not have run');
|
||||||
|
|
||||||
|
$stateID = 'testGridStateActionField';
|
||||||
|
$request = new HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()));
|
||||||
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
|
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
||||||
|
|
||||||
|
//Insure sort ran
|
||||||
|
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run');
|
||||||
|
|
||||||
|
|
||||||
|
//Check for duplicates (there shouldn't be any)
|
||||||
|
$count = $list->Count();
|
||||||
|
$indexes = count(array_unique($list->column('SortOrder')));
|
||||||
|
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAutoSortVersioned()
|
||||||
|
{
|
||||||
|
if (Member::currentUser()) {
|
||||||
|
Member::currentUser()->logOut();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Force versioned to reset
|
||||||
|
Versioned::reset();
|
||||||
|
|
||||||
|
$list = GridFieldAction_SortOrder_VPlayer::get();
|
||||||
|
|
||||||
|
//Publish all records
|
||||||
|
foreach ($list as $item) {
|
||||||
|
$item->publish('Stage', 'Live');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder', true, 'Live'));
|
||||||
|
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
||||||
|
$form = new Form(new SortableGridField_DummyController(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
||||||
|
|
||||||
|
$stateID = 'testGridStateActionField';
|
||||||
|
$request = new HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()));
|
||||||
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
|
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
||||||
|
|
||||||
|
|
||||||
|
//Insure sort ran
|
||||||
|
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run on Versioned stage "Stage"');
|
||||||
|
|
||||||
|
|
||||||
|
//Check for duplicates (there shouldn't be any)
|
||||||
|
$count = $list->Count();
|
||||||
|
$indexes = count(array_unique($list->column('SortOrder')));
|
||||||
|
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected on Versioned stage "Stage"');
|
||||||
|
|
||||||
|
|
||||||
|
//Force versioned over to Live stage
|
||||||
|
Versioned::set_reading_mode('Live');
|
||||||
|
|
||||||
|
//Get live instance
|
||||||
|
$obj = Versioned::get_one_by_stage(GridFieldAction_SortOrder_VPlayer::class, 'Live', '"ID"=' . $list->last()->ID);
|
||||||
|
|
||||||
|
//Insure sort ran
|
||||||
|
$this->assertEquals(3, $obj->SortOrder, 'Auto sort should have run on Versioned stage "Live"');
|
||||||
|
|
||||||
|
|
||||||
|
//Check for duplicates (there shouldn't be any)
|
||||||
|
$list = Versioned::get_by_stage(GridFieldAction_SortOrder_VPlayer::class, 'Live');
|
||||||
|
$count = $list->Count();
|
||||||
|
$indexes = count(array_unique($list->column('SortOrder')));
|
||||||
|
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected on Versioned stage "Live"');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAppendToTopAutoSortVersioned()
|
||||||
|
{
|
||||||
|
if (Member::currentUser()) {
|
||||||
|
Member::currentUser()->logOut();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Force versioned to reset
|
||||||
|
Versioned::reset();
|
||||||
|
|
||||||
|
$list = GridFieldAction_SortOrder_VPlayer::get();
|
||||||
|
|
||||||
|
//Publish all records
|
||||||
|
foreach ($list as $item) {
|
||||||
|
$item->publish('Stage', 'Live');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder', true, 'Live'));
|
||||||
|
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
||||||
|
$form = new Form(new SortableGridField_DummyController(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
||||||
|
|
||||||
|
/** @var GridFieldSortableRows $sortableRows */
|
||||||
|
$sortableRows = $gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
||||||
|
$sortableRows->setAppendToTop(true);
|
||||||
|
|
||||||
|
$this->assertEquals(0, $list->last()->SortOrder, 'Auto sort should not have run on Versioned stage "Stage"');
|
||||||
|
|
||||||
|
$stateID = 'testGridStateActionField';
|
||||||
|
$request = new HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()));
|
||||||
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
|
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
||||||
|
|
||||||
|
|
||||||
|
//Insure sort ran
|
||||||
|
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run on Versioned stage "Stage"');
|
||||||
|
|
||||||
|
|
||||||
|
//Check for duplicates (there shouldn't be any)
|
||||||
|
$count = $list->Count();
|
||||||
|
$indexes = count(array_unique($list->column('SortOrder')));
|
||||||
|
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected on Versioned stage "Stage"');
|
||||||
|
|
||||||
|
|
||||||
|
//Force versioned over to Live stage
|
||||||
|
Versioned::set_reading_mode('Live');
|
||||||
|
|
||||||
|
//Insure sort ran
|
||||||
|
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run on Versioned stage "Live"');
|
||||||
|
|
||||||
|
|
||||||
|
//Check for duplicates (there shouldn't be any)
|
||||||
|
$count = $list->Count();
|
||||||
|
$indexes = count(array_unique($list->column('SortOrder')));
|
||||||
|
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected on Versioned stage "Live"');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAppendToTopAutoSortChild()
|
||||||
|
{
|
||||||
|
if (Member::currentUser()) {
|
||||||
|
Member::currentUser()->logOut();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Push the edit date into the past, we're checking this later
|
||||||
|
DB::query('UPDATE "GridFieldAction_SortOrder_BaseObject" SET "LastEdited"=\'' . date('Y-m-d 00:00:00', strtotime('yesterday')) . '\'');
|
||||||
|
|
||||||
|
/** @var GridFieldAction_SortOrder_TestParent $parent */
|
||||||
|
$parent = GridFieldAction_SortOrder_TestParent::get()->first();
|
||||||
|
|
||||||
|
/** @var DataList $list */
|
||||||
|
$list = $parent->TestRelation();
|
||||||
|
|
||||||
|
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
|
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
||||||
|
$form = new Form(new SortableGridField_DummyController(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
||||||
|
$form->loadDataFrom($parent);
|
||||||
|
|
||||||
|
/** @var GridFieldSortableRows $sortableRows */
|
||||||
|
$sortableRows = $gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
||||||
|
$sortableRows->setAppendToTop(true);
|
||||||
|
|
||||||
|
$this->assertEquals(0, $list->last()->SortOrder, 'Auto sort should not have run');
|
||||||
|
|
||||||
|
$stateID = 'testGridStateActionField';
|
||||||
|
$request = new HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()));
|
||||||
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
|
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
||||||
|
|
||||||
|
//Insure sort ran
|
||||||
|
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run');
|
||||||
|
|
||||||
|
|
||||||
|
//Check for duplicates (there shouldn't be any)
|
||||||
|
$count = $list->Count();
|
||||||
|
$indexes = count(array_unique($list->column('SortOrder')));
|
||||||
|
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected');
|
||||||
|
|
||||||
|
|
||||||
|
//Make sure the last edited is today for all records
|
||||||
|
$this->assertEquals(3, $list->filter('LastEdited:GreaterThan', date('Y-m-d 00:00:00'))->count());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldAction_SortOrder_Player
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @property int SortOrder
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_Player extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_Player';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
|
'Name' => DBVarchar::class,
|
||||||
|
'SortOrder' => DBInt::class
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $default_sort = 'SortOrder';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldAction_SortOrder_VPlayer
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @property int SortOrder
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_VPlayer extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_VPlayer';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
|
'Name' => DBVarchar::class,
|
||||||
|
'SortOrder' => DBInt::class
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $default_sort = 'SortOrder';
|
||||||
|
|
||||||
|
private static $extensions = array(
|
||||||
|
"SilverStripe\\Versioned\\Versioned('Stage', 'Live')"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldAction_SortOrder_TestParent
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @method GridFieldAction_SortOrder_ChildObject TestRelation
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_TestParent extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_TestParent';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
|
'Name' => DBVarchar::class
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $has_many = array(
|
||||||
|
'TestRelation' => GridFieldAction_SortOrder_ChildObject::class
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldAction_SortOrder_BaseObject
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_BaseObject extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_BaseObject';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
|
'Name' => DBVarchar::class
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldAction_SortOrder_ChildObject
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property int SortOrder
|
||||||
|
* @method GridFieldAction_SortOrder_TestParent Parent
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_ChildObject extends GridFieldAction_SortOrder_BaseObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_ChildObject';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
|
'SortOrder' => DBInt::class
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $has_one = array(
|
||||||
|
'Parent' => GridFieldAction_SortOrder_TestParent::class
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $default_sort = 'SortOrder';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class SortableGridField_DummyController
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
*/
|
||||||
|
class SortableGridField_DummyController extends Controller
|
||||||
|
{
|
||||||
|
private static $url_segment = 'sortable-grid-field';
|
||||||
|
}
|
39
tests/forms/GridFieldSortableRowsAutoSortTest.yml
Normal file
39
tests/forms/GridFieldSortableRowsAutoSortTest.yml
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Player:
|
||||||
|
player1:
|
||||||
|
Name: Player 1
|
||||||
|
SortOrder: 0
|
||||||
|
player2:
|
||||||
|
Name: Player 2
|
||||||
|
SortOrder: 0
|
||||||
|
player3:
|
||||||
|
Name: Player 3
|
||||||
|
SortOrder: 0
|
||||||
|
|
||||||
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_VPlayer:
|
||||||
|
player1:
|
||||||
|
Name: Player 1
|
||||||
|
SortOrder: 0
|
||||||
|
player2:
|
||||||
|
Name: Player 2
|
||||||
|
SortOrder: 0
|
||||||
|
player3:
|
||||||
|
Name: Player 3
|
||||||
|
SortOrder: 0
|
||||||
|
|
||||||
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_TestParent:
|
||||||
|
testparent:
|
||||||
|
Name: Test
|
||||||
|
|
||||||
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_ChildObject:
|
||||||
|
testitem1:
|
||||||
|
Name: Test 1
|
||||||
|
SortOrder: 0
|
||||||
|
Parent: =>UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_TestParent.testparent
|
||||||
|
testitem2:
|
||||||
|
Name: Test 2
|
||||||
|
SortOrder: 0
|
||||||
|
Parent: =>UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_TestParent.testparent
|
||||||
|
testitem3:
|
||||||
|
Name: Test 3
|
||||||
|
SortOrder: 0
|
||||||
|
Parent: =>UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_TestParent.testparent
|
240
tests/forms/GridFieldSortableRowsPageTest.php
Normal file
240
tests/forms/GridFieldSortableRowsPageTest.php
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace UndefinedOffset\SortableGridField\Tests;
|
||||||
|
|
||||||
|
use SilverStripe\Control\Controller;
|
||||||
|
use SilverStripe\Control\HTTPRequest;
|
||||||
|
use SilverStripe\Control\Session;
|
||||||
|
use SilverStripe\Core\Injector\Injector;
|
||||||
|
use SilverStripe\Dev\SapphireTest;
|
||||||
|
use SilverStripe\Dev\TestOnly;
|
||||||
|
use SilverStripe\Forms\FieldList;
|
||||||
|
use SilverStripe\Forms\Form;
|
||||||
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldConfig_Base;
|
||||||
|
use SilverStripe\ORM\ArrayList;
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
use SilverStripe\ORM\FieldType\DBInt;
|
||||||
|
use SilverStripe\ORM\FieldType\DBVarchar;
|
||||||
|
use SilverStripe\Versioned\Versioned;
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldSortableRowsPageTest
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
*/
|
||||||
|
class GridFieldSortableRowsPageTest extends SapphireTest
|
||||||
|
{
|
||||||
|
/** @var ArrayList */
|
||||||
|
protected $list;
|
||||||
|
|
||||||
|
/** @var GridField */
|
||||||
|
protected $gridField;
|
||||||
|
|
||||||
|
/** @var Form */
|
||||||
|
protected $form;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
public static $fixture_file = 'GridFieldSortableRowsPageTest.yml';
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
protected static $extra_dataobjects = array(
|
||||||
|
GridFieldAction_PageSortOrder_Team::class,
|
||||||
|
GridFieldAction_PageSortOrder_VTeam::class
|
||||||
|
);
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
$this->list = GridFieldAction_PageSortOrder_Team::get();
|
||||||
|
$config = GridFieldConfig_Base::create(5)->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
|
$this->gridField = new GridField('testfield', 'testfield', $this->list, $config);
|
||||||
|
$this->form = new Form(new SortableGridField_DummyController(), 'mockform', FieldList::create(array($this->gridField)), FieldList::create());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSortToNextPage()
|
||||||
|
{
|
||||||
|
$this->gridField->State->GridFieldPaginator->currentPage = 1;
|
||||||
|
|
||||||
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team', 'team3');
|
||||||
|
|
||||||
|
$this->logInWithPermission('ADMIN');
|
||||||
|
$stateID = 'testGridStateActionField';
|
||||||
|
$request = new HTTPRequest('POST', 'url', array('ItemID' => $team3->ID, 'Target' => 'nextpage'), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortToPage', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true), 'GridFieldPaginator' => array('currentPage' => 1))));
|
||||||
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
|
|
||||||
|
$team6 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team', 'team6');
|
||||||
|
$this->assertEquals(5, $team6->SortOrder, 'Team 6 Should have moved to the bottom of the first page');
|
||||||
|
|
||||||
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team', 'team3');
|
||||||
|
$this->assertEquals(6, $team3->SortOrder, 'Team 3 Should have moved to the top of the second page');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSortToPrevPage()
|
||||||
|
{
|
||||||
|
$this->gridField->State->GridFieldPaginator->currentPage = 2;
|
||||||
|
|
||||||
|
$team7 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team', 'team7');
|
||||||
|
|
||||||
|
$this->logInWithPermission('ADMIN');
|
||||||
|
$stateID = 'testGridStateActionField';
|
||||||
|
$request = new HTTPRequest('POST', 'url', array('ItemID' => $team7->ID, 'Target' => 'previouspage'), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortToPage', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true), 'GridFieldPaginator' => array('currentPage' => 1))));
|
||||||
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
|
|
||||||
|
|
||||||
|
$team7 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team', 'team7');
|
||||||
|
$this->assertEquals(5, $team7->SortOrder, 'Team 7 Should have moved to the bottom of the first page');
|
||||||
|
|
||||||
|
$team5 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team', 'team5');
|
||||||
|
$this->assertEquals(6, $team5->SortOrder, 'Team 5 Should have moved to the top of the second page');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSortToNextPageVersioned()
|
||||||
|
{
|
||||||
|
//Force versioned to reset
|
||||||
|
Versioned::reset();
|
||||||
|
|
||||||
|
$list = GridFieldAction_PageSortOrder_VTeam::get();
|
||||||
|
$this->gridField->setList($list);
|
||||||
|
|
||||||
|
/** @var GridFieldSortableRows $sortableGrid */
|
||||||
|
$sortableGrid = $this->gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
||||||
|
$sortableGrid->setUpdateVersionedStage('Live');
|
||||||
|
$this->gridField->State->GridFieldPaginator->currentPage = 1;
|
||||||
|
|
||||||
|
//Publish all records
|
||||||
|
foreach ($list as $item) {
|
||||||
|
$item->publish('Stage', 'Live');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam', 'team3');
|
||||||
|
|
||||||
|
$this->logInWithPermission('ADMIN');
|
||||||
|
$stateID = 'testGridStateActionField';
|
||||||
|
$request = new HTTPRequest('POST', 'url', array('ItemID' => $team3->ID, 'Target' => 'nextpage'), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortToPage', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true), 'GridFieldPaginator' => array('currentPage' => 1))));
|
||||||
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
|
|
||||||
|
|
||||||
|
$team6 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam', 'team6');
|
||||||
|
$this->assertEquals(5, $team6->SortOrder, 'Team 6 Should have moved to the bottom of the first page on Versioned stage "Stage"');
|
||||||
|
|
||||||
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam', 'team3');
|
||||||
|
$this->assertEquals(6, $team3->SortOrder, 'Team 3 Should have moved to the top of the second page on Versioned stage "Stage"');
|
||||||
|
|
||||||
|
|
||||||
|
$list = Versioned::get_by_stage(GridFieldAction_PageSortOrder_VTeam::class, 'Live');
|
||||||
|
|
||||||
|
$team6 = $list->byID($team6->ID);
|
||||||
|
$this->assertEquals(5, $team6->SortOrder, 'Team 6 Should have moved to the bottom of the first page on Versioned stage "Live"');
|
||||||
|
|
||||||
|
$team3 = $list->byID($team3->ID);
|
||||||
|
$this->assertEquals(6, $team3->SortOrder, 'Team 3 Should have moved to the top of the second page on Versioned stage "Live"');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSortToPrevPageVersioned()
|
||||||
|
{
|
||||||
|
//Force versioned to reset
|
||||||
|
Versioned::reset();
|
||||||
|
|
||||||
|
$list = GridFieldAction_PageSortOrder_VTeam::get();
|
||||||
|
$this->gridField->setList($list);
|
||||||
|
|
||||||
|
/** @var GridFieldSortableRows $sortableGrid */
|
||||||
|
$sortableGrid = $this->gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
||||||
|
$sortableGrid->setUpdateVersionedStage('Live');
|
||||||
|
$this->gridField->State->GridFieldPaginator->currentPage = 2;
|
||||||
|
|
||||||
|
//Publish all records
|
||||||
|
foreach ($list as $item) {
|
||||||
|
$item->publish('Stage', 'Live');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$team7 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam', 'team7');
|
||||||
|
|
||||||
|
$this->logInWithPermission('ADMIN');
|
||||||
|
$stateID = 'testGridStateActionField';
|
||||||
|
$request = new HTTPRequest('POST', 'url', array('ItemID' => $team7->ID, 'Target' => 'previouspage'), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortToPage', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true), 'GridFieldPaginator' => array('currentPage' => 1))));
|
||||||
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
|
|
||||||
|
|
||||||
|
$team7 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam', 'team7');
|
||||||
|
$this->assertEquals(5, $team7->SortOrder, 'Team 7 Should have moved to the bottom of the first page on Versioned stage "Stage"');
|
||||||
|
|
||||||
|
$team5 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam', 'team5');
|
||||||
|
$this->assertEquals(6, $team5->SortOrder, 'Team 5 Should have moved to the top of the second page on Versioned stage "Stage"');
|
||||||
|
|
||||||
|
|
||||||
|
$list = Versioned::get_by_stage(GridFieldAction_PageSortOrder_VTeam::class, 'Live');
|
||||||
|
|
||||||
|
$team7 = $list->byID($team7->ID);
|
||||||
|
$this->assertEquals(5, $team7->SortOrder, 'Team 7 Should have moved to the bottom of the first page on Versioned stage "Live"');
|
||||||
|
|
||||||
|
$team5 = $list->byID($team5->ID);
|
||||||
|
$this->assertEquals(6, $team5->SortOrder, 'Team 5 Should have moved to the top of the second page on Versioned stage "Live"');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldAction_PageSortOrder_Team
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @property string City
|
||||||
|
* @property int SortOrder
|
||||||
|
*/
|
||||||
|
class GridFieldAction_PageSortOrder_Team extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_PageSortOrder_Team';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
|
'Name' => DBVarchar::class,
|
||||||
|
'City' => DBVarchar::class,
|
||||||
|
'SortOrder' => DBInt::class
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $default_sort = 'SortOrder';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldAction_PageSortOrder_VTeam
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @property string City
|
||||||
|
* @property int SortOrder
|
||||||
|
*/
|
||||||
|
class GridFieldAction_PageSortOrder_VTeam extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_PageSortOrder_VTeam';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
|
'Name' => DBVarchar::class,
|
||||||
|
'City' => DBVarchar::class,
|
||||||
|
'SortOrder' => DBInt::class
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $default_sort = 'SortOrder';
|
||||||
|
|
||||||
|
private static $extensions = array(
|
||||||
|
"SilverStripe\\Versioned\\Versioned('Stage', 'Live')"
|
||||||
|
);
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
UndefinedOffset\SortableGridField\Tests\Forms\PageSortingTest\Team:
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team:
|
||||||
team1:
|
team1:
|
||||||
Name: Team 1
|
Name: Team 1
|
||||||
City: Cologne
|
City: Cologne
|
||||||
@ -36,7 +36,7 @@ UndefinedOffset\SortableGridField\Tests\Forms\PageSortingTest\Team:
|
|||||||
City: Auckland
|
City: Auckland
|
||||||
SortOrder: 9
|
SortOrder: 9
|
||||||
|
|
||||||
UndefinedOffset\SortableGridField\Tests\Forms\PageSortingTest\VTeam:
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam:
|
||||||
team1:
|
team1:
|
||||||
Name: Team 1
|
Name: Team 1
|
||||||
City: Cologne
|
City: Cologne
|
168
tests/forms/GridFieldSortableRowsTest.php
Normal file
168
tests/forms/GridFieldSortableRowsTest.php
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace UndefinedOffset\SortableGridField\Tests;
|
||||||
|
|
||||||
|
use SilverStripe\Control\HTTPRequest;
|
||||||
|
use SilverStripe\Control\Session;
|
||||||
|
use SilverStripe\Core\Injector\Injector;
|
||||||
|
use SilverStripe\Dev\SapphireTest;
|
||||||
|
use SilverStripe\Dev\TestOnly;
|
||||||
|
use SilverStripe\Forms\FieldList;
|
||||||
|
use SilverStripe\Forms\Form;
|
||||||
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldConfig;
|
||||||
|
use SilverStripe\ORM\ArrayList;
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
use SilverStripe\ORM\ValidationException;
|
||||||
|
use SilverStripe\ORM\FieldType\DBInt;
|
||||||
|
use SilverStripe\ORM\FieldType\DBVarchar;
|
||||||
|
use SilverStripe\Security\Member;
|
||||||
|
use SilverStripe\Versioned\Versioned;
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
||||||
|
|
||||||
|
class GridFieldSortableRowsTest extends SapphireTest
|
||||||
|
{
|
||||||
|
/** @var ArrayList */
|
||||||
|
protected $list;
|
||||||
|
|
||||||
|
/** @var GridField */
|
||||||
|
protected $gridField;
|
||||||
|
|
||||||
|
/** @var Form */
|
||||||
|
protected $form;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
public static $fixture_file = 'GridFieldSortableRowsTest.yml';
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
protected static $extra_dataobjects = array(
|
||||||
|
GridFieldAction_SortOrder_Team::class,
|
||||||
|
GridFieldAction_SortOrder_VTeam::class
|
||||||
|
);
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
$this->list = GridFieldAction_SortOrder_Team::get();
|
||||||
|
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
|
$this->gridField = new GridField('testfield', 'testfield', $this->list, $config);
|
||||||
|
$this->form = new Form(new SortableGridField_DummyController(), 'mockform', new FieldList(array($this->gridField)), new FieldList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSortActionWithoutCorrectPermission()
|
||||||
|
{
|
||||||
|
if (Member::currentUser()) {
|
||||||
|
Member::currentUser()->logOut();
|
||||||
|
}
|
||||||
|
$this->setExpectedException(ValidationException::class);
|
||||||
|
$team1 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team', 'team1');
|
||||||
|
$team2 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team', 'team2');
|
||||||
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team', 'team3');
|
||||||
|
|
||||||
|
$stateID = 'testGridStateActionField';
|
||||||
|
$request = new HTTPRequest('POST', 'url', array('ItemIDs' => "$team1->ID, $team3->ID, $team2->ID"), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'saveGridRowSort', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
|
$this->assertEquals($team3->ID, $this->list->last()->ID, 'User should\'t be able to sort records without correct permissions.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSortActionWithAdminPermission()
|
||||||
|
{
|
||||||
|
$team1 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team', 'team1');
|
||||||
|
$team2 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team', 'team2');
|
||||||
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team', 'team3');
|
||||||
|
$this->logInWithPermission('ADMIN');
|
||||||
|
$stateID = 'testGridStateActionField';
|
||||||
|
$request = new HTTPRequest('POST', 'url', array('ItemIDs' => "$team1->ID, $team3->ID, $team2->ID"), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'saveGridRowSort', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
|
$this->assertEquals($team2->ID, $this->list->last()->ID, 'User should be able to sort records with ADMIN permission.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSortActionVersioned()
|
||||||
|
{
|
||||||
|
//Force versioned to reset
|
||||||
|
Versioned::reset();
|
||||||
|
|
||||||
|
$list = GridFieldAction_SortOrder_VTeam::get();
|
||||||
|
$this->gridField->setList($list);
|
||||||
|
|
||||||
|
/** @var GridFieldSortableRows $sortableGrid */
|
||||||
|
$sortableGrid = $this->gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
||||||
|
$sortableGrid->setUpdateVersionedStage('Live');
|
||||||
|
|
||||||
|
//Publish all records
|
||||||
|
foreach ($list as $item) {
|
||||||
|
$item->publish('Stage', 'Live');
|
||||||
|
}
|
||||||
|
|
||||||
|
$team1 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_VTeam', 'team1');
|
||||||
|
$team2 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_VTeam', 'team2');
|
||||||
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_VTeam', 'team3');
|
||||||
|
|
||||||
|
$this->logInWithPermission('ADMIN');
|
||||||
|
$stateID = 'testGridStateActionField';
|
||||||
|
$request = new HTTPRequest('POST', 'url', array('ItemIDs' => "$team1->ID, $team3->ID, $team2->ID"), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'saveGridRowSort', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
|
|
||||||
|
$this->assertEquals($team2->ID, $list->last()->ID, 'Sort should have happened on Versioned stage "Stage"');
|
||||||
|
|
||||||
|
$list = Versioned::get_by_stage(GridFieldAction_SortOrder_VTeam::class, 'Live');
|
||||||
|
$this->assertEquals($team2->ID, $list->last()->ID, 'Sort should have happened on Versioned stage "Live"');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldAction_SortOrder_Team
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @property string City
|
||||||
|
* @property int SortOrder
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_Team extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_Team';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
|
'Name' => DBVarchar::class,
|
||||||
|
'City' => DBVarchar::class,
|
||||||
|
'SortOrder' => 'Int'
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $default_sort = 'SortOrder';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldAction_SortOrder_VTeam
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @property string City
|
||||||
|
* @property int SortOrder
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_VTeam extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_VTeam';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
|
'Name' => DBVarchar::class,
|
||||||
|
'City' => DBVarchar::class,
|
||||||
|
'SortOrder' => DBInt::class
|
||||||
|
);
|
||||||
|
private static $default_sort = 'SortOrder';
|
||||||
|
|
||||||
|
private static $extensions = array(
|
||||||
|
"SilverStripe\\Versioned\\Versioned('Stage', 'Live')"
|
||||||
|
);
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
UndefinedOffset\SortableGridField\Tests\Forms\OrderingTest\Team:
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team:
|
||||||
team1:
|
team1:
|
||||||
Name: Team 1
|
Name: Team 1
|
||||||
City: Cologne
|
City: Cologne
|
||||||
@ -12,7 +12,7 @@ UndefinedOffset\SortableGridField\Tests\Forms\OrderingTest\Team:
|
|||||||
City: Auckland
|
City: Auckland
|
||||||
SortOrder: 3
|
SortOrder: 3
|
||||||
|
|
||||||
UndefinedOffset\SortableGridField\Tests\Forms\OrderingTest\VTeam:
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_VTeam:
|
||||||
team1:
|
team1:
|
||||||
Name: Team 1
|
Name: Team 1
|
||||||
City: Cologne
|
City: Cologne
|
@ -1,15 +0,0 @@
|
|||||||
SS_ENVIRONMENT_TYPE="dev"
|
|
||||||
SS_TRUSTED_PROXY_IPS="*"
|
|
||||||
|
|
||||||
SS_DATABASE_CLASS="MySQLDatabase"
|
|
||||||
SS_DATABASE_SERVER="127.0.0.1"
|
|
||||||
SS_DATABASE_USERNAME="root"
|
|
||||||
SS_DATABASE_PASSWORD="testpassword"
|
|
||||||
SS_DATABASE_NAME="test_db"
|
|
||||||
|
|
||||||
SS_DEFAULT_ADMIN_USERNAME="username"
|
|
||||||
SS_DEFAULT_ADMIN_PASSWORD="password"
|
|
||||||
|
|
||||||
SS_ERROR_LOG="artifacts/silverstripe-errors.log"
|
|
||||||
|
|
||||||
TRAVIS_TEST_SESSION="1"
|
|
Loading…
Reference in New Issue
Block a user