e9d921f0 by Jeremy Groot

plugin updates

1 parent c17b3e54
Showing 1000 changed files with 1928 additions and 1818 deletions

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";n.r(t);document.addEventListener("DOMContentLoaded",()=>{let e=aca_acf_admin.assets+"images/acf.svg";AC_SERVICES.filters.addFilter("column_type_templates",(t,n)=>(n.result.hasOwnProperty("id")&&(e=>{if(e.element){let t=e.element.parentElement;if(t&&"Advanced Custom Fields"===t.label)return!0}let t=e.id;return 0===t.indexOf("field_")||0===t.indexOf("acfgroup__field")||0===t.indexOf("acfclone")})(n.result)&&(t+=`<img src="${e}" alt="Advanced Custom Fields" class="ac-column-type-icon"/>`),t),10)})}]);
\ No newline at end of file
(()=>{"use strict";document.addEventListener("DOMContentLoaded",(()=>{let e=aca_acf_admin.assets+"images/acf.svg";AC_SERVICES.filters.addFilter("column_type_templates",((t,l)=>(l.result.hasOwnProperty("id")&&(e=>{if(e.element){let t=e.element.parentElement;if(t&&"Advanced Custom Fields"===t.label)return!0}let t=e.id;return 0===t.indexOf("field_")||0===t.indexOf("acfgroup__field")||0===t.indexOf("acfclone")})(l.result)&&(t+=`<img src="${e}" alt="Advanced Custom Fields" class="ac-column-type-icon"/>`),t)),10)}))})();
\ No newline at end of file
......
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var l=t[r]={i:r,l:!1,exports:{}};return e[r].call(l.exports,l,l.exports,n),l.l=!0,l.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var l in e)n.d(r,l,function(t){return e[t]}.bind(null,l));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)}([,function(e,t,n){n(2),n(3)},function(e,t,n){"use strict";n.r(t),AC_SERVICES.addListener("Editing.Editables.Ready",e=>{const t=e.get("_abstract");e.registerEditable("acf_range",class extends t{focus(){this.getElement().querySelector("[name=range]").focus()}getEditableType(){return"acf_range"}render(){let e=this.getElement().querySelector("[name=range]");this.reflect(),e.addEventListener("change",()=>this.reflect()),e.addEventListener("input",()=>this.reflect())}reflect(){this.getElement().querySelector("[name=reflection]").value=this.getElement().querySelector("[name=range]").value}valueToInput(e){this.getElement().querySelector("[name=range]").value=e,this.reflect()}getValue(){return this.getElement().querySelector("[name=range]").value}getTemplate(){return`\n\t\t\t\t<div class="input__group">\n\t\t\t\t\t${this.getEditableTemplate().getFormHelper().input("range",null,this.settings.html_attributes).outerHTML} <input name="reflection">\n\t\t\t\t</div>\n\t\t\t`}getDefaults(){let e=super.getDefaults();return e.html_attributes={type:"range",step:5,min:0,max:100},e}})}),AC_SERVICES.addListener("Editing.Middleware.Ready",e=>{const t=e.getClass("default");e.register("acf_range",class extends t{getEditable(){return this.Editables.get("acf_range")}})})},function(e,t,n){"use strict";n.r(t),AC_SERVICES.addListener("Editing.Editables.Ready",e=>{const t=e.get("_abstract");e.registerEditable("acf_link",class extends t{getEditableType(){return"acf_link"}focus(){this.getElement().querySelector("[name=url]").focus()}valueToInput(e){e&&(this.getElement().querySelector("[name=url]").value=e.url,this.getElement().querySelector("[name=title]").value=e.title,"_blank"===e.target&&(this.getElement().querySelector("[name=target]").checked=!0))}getValue(){return{url:this.getElement().querySelector("[name=url]").value,title:this.getElement().querySelector("[name=title]").value,target:this.getElement().querySelector("[name=target]").checked?"_blank":""}}getTemplate(){return`\n\t\t\t\t<div class="input__group">\n\t\t\t\t\t<label>Url</label>${this.getEditableTemplate().getFormHelper().input("url",null,{placeholder:"http://"}).outerHTML}\n\t\t\t\t</div>\n\t\t\t\t<div class="input__group">\n\t\t\t\t\t<label>Title</label>${this.getEditableTemplate().getFormHelper().input("title",null).outerHTML}\n\t\t\t\t</div>\n\t\t\t\t<div class="input__group -checkbox">\n\t\t\t\t\t<label class="input__checkbox"><input type="checkbox" name="target"> Open link in a new tab</label>\n\t\t\t\t</div>\n\t\t\t`}})}),AC_SERVICES.addListener("Editing.Middleware.Ready",e=>{const t=e.getClass("_abstract");e.register("acf_link",class extends t{getEditable(){return this.Editables.get("acf_link")}})})}]);
\ No newline at end of file
(()=>{var e={133:(e,t,r)=>{"use strict";r.r(t),AC_SERVICES.addListener("Editing.Editables.Ready",(e=>{const t=e.get("_abstract");e.registerEditable("acf_link",class extends t{getEditableType(){return"acf_link"}focus(){this.getElement().querySelector("[name=url]").focus()}valueToInput(e){e&&(this.getElement().querySelector("[name=url]").value=e.url,this.getElement().querySelector("[name=title]").value=e.title,"_blank"===e.target&&(this.getElement().querySelector("[name=target]").checked=!0))}getValue(){return{url:this.getElement().querySelector("[name=url]").value,title:this.getElement().querySelector("[name=title]").value,target:this.getElement().querySelector("[name=target]").checked?"_blank":""}}getTemplate(){return`\n\t\t\t\t<div class="input__group">\n\t\t\t\t\t<label>Url</label>${this.getEditableTemplate().getFormHelper().input("url",null,{placeholder:"http://"}).outerHTML}\n\t\t\t\t</div>\n\t\t\t\t<div class="input__group">\n\t\t\t\t\t<label>Title</label>${this.getEditableTemplate().getFormHelper().input("title",null).outerHTML}\n\t\t\t\t</div>\n\t\t\t\t<div class="input__group -checkbox">\n\t\t\t\t\t<label class="input__checkbox"><input type="checkbox" name="target"> Open link in a new tab</label>\n\t\t\t\t</div>\n\t\t\t`}})})),AC_SERVICES.addListener("Editing.Middleware.Ready",(e=>{const t=e.getClass("_abstract");e.register("acf_link",class extends t{getEditable(){return this.Editables.get("acf_link")}})}))},825:(e,t,r)=>{"use strict";r.r(t),AC_SERVICES.addListener("Editing.Editables.Ready",(e=>{const t=e.get("_abstract");e.registerEditable("acf_range",class extends t{focus(){this.getElement().querySelector("[name=range]").focus()}getEditableType(){return"acf_range"}render(){let e=this.getElement().querySelector("[name=range]");this.reflect(),e.addEventListener("change",(()=>this.reflect())),e.addEventListener("input",(()=>this.reflect()))}reflect(){this.getElement().querySelector("[name=reflection]").value=this.getElement().querySelector("[name=range]").value}valueToInput(e){this.getElement().querySelector("[name=range]").value=e,this.reflect()}getValue(){return this.getElement().querySelector("[name=range]").value}getTemplate(){return`\n\t\t\t\t<div class="input__group">\n\t\t\t\t\t${this.getEditableTemplate().getFormHelper().input("range",null,this.settings.html_attributes).outerHTML} <input name="reflection">\n\t\t\t\t</div>\n\t\t\t`}getDefaults(){let e=super.getDefaults();return e.html_attributes={type:"range",step:5,min:0,max:100},e}})})),AC_SERVICES.addListener("Editing.Middleware.Ready",(e=>{const t=e.getClass("default");e.register("acf_range",class extends t{getEditable(){return this.Editables.get("acf_range")}})}))}},t={};function r(l){var n=t[l];if(void 0!==n)return n.exports;var a=t[l]={exports:{}};return e[l](a,a.exports,r),a.exports}r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r(825),r(133)})();
\ No newline at end of file
......
<?php
declare(strict_types=1);
namespace ACA\ACF;
use AC;
use AC\ListScreenRepository\Storage;
use AC\Registerable;
use AC\Request;
use AC\Services;
use AC\Vendor\Psr\Container\ContainerInterface;
use ACA\ACF\ConditionalFormatting\FieldFormattableFactory;
use ACA\ACF\FieldGroup;
use ACA\ACF\ListScreenFactory\FieldGroupFactory;
use ACA\ACF\RequestHandler\MapLegacyListScreen;
use ACA\ACF\Search;
use ACA\ACF\Service;
use ACA\ACF\Sorting;
use ACP;
use ACP\RequestHandlerFactory;
use ACP\RequestParser;
use ACP\Service\IntegrationStatus;
final class AdvancedCustomFields implements Registerable
{
final class AdvancedCustomFields implements Registerable {
private $location;
private $location;
private $container;
public function __construct( AC\Asset\Location\Absolute $location ) {
$this->location = $location;
}
public function __construct(AC\Asset\Location\Absolute $location, ContainerInterface $container)
{
$this->location = $location;
$this->container = $container;
}
public function register() {
if ( ! class_exists( 'acf', false ) ) {
return;
}
public function register(): void
{
if ( ! class_exists('acf', false)) {
return;
}
AC\ListScreenFactory::add( new FieldGroupFactory() );
AC\ListScreenFactory\Aggregate::add(new FieldGroupFactory());
$column_initiator = new ColumnInstantiator(
new ConfigFactory( new FieldFactory() ),
new Search\ComparisonFactory(),
new Sorting\ModelFactory(),
new Editing\ModelFactory(),
new Filtering\ModelFactory(),
new FieldFormattableFactory()
);
$this->create_services()->register();
}
$request_handler_factory = new RequestHandlerFactory( new Request() );
$request_handler_factory->add( 'aca-acf-map-legacy-list-screen', new MapLegacyListScreen( AC()->get_storage() ) );
private function create_services(): Services
{
$column_initiator = new ColumnInstantiator(
new ConfigFactory(new FieldFactory()),
new Search\ComparisonFactory(),
new Sorting\ModelFactory(),
new Editing\ModelFactory(),
new Filtering\ModelFactory(),
new FieldFormattableFactory()
);
$services = [
new ACP\Service\IntegrationStatus( 'ac-addon-acf' ),
new ColumnGroup(),
new Service\ColumnSettings(),
new Service\EditingFix(),
new Service\LegacyColumnMapper(),
new Service\ListScreens(),
new Service\RemoveDeprecatedColumnFromTypeSelector(),
new Service\AddColumns(
new FieldRepository( new FieldGroup\QueryFactory() ),
new FieldsFactory(),
new ColumnFactory( $column_initiator )
),
new Service\Scripts( $this->location ),
new Service\InitColumn( $column_initiator ),
new RequestParser( $request_handler_factory ),
];
$request_handler_factory = new RequestHandlerFactory(new Request());
$request_handler_factory->add(
'aca-acf-map-legacy-list-screen',
new MapLegacyListScreen($this->container->get(Storage::class))
);
array_map( static function ( Registerable $service ) {
$service->register();
}, $services );
}
return new Services([
new IntegrationStatus('ac-addon-acf'),
new ColumnGroup(),
new Service\ColumnSettings(),
new Service\EditingFix(),
new Service\LegacyColumnMapper(),
new Service\ListScreens(),
new Service\RemoveDeprecatedColumnFromTypeSelector(),
new Service\AddColumns(
new FieldRepository(new FieldGroup\QueryFactory()),
new FieldsFactory(),
new ColumnFactory($column_initiator)
),
new Service\Scripts($this->location),
new Service\InitColumn($column_initiator),
new RequestParser($request_handler_factory),
]);
}
}
\ No newline at end of file
......
......@@ -5,8 +5,6 @@ namespace ACA\ACF;
use AC;
use AC\MetaType;
use ACA\ACF;
use ACA\ACF\Export;
use ACA\ACF\Value;
use ACP\Export\Exportable;
use InvalidArgumentException;
......
......@@ -4,83 +4,94 @@ namespace ACA\ACF;
use ACA\ACF\Column\Repeater;
use ACA\ACF\Column\Unsupported;
use LogicException;
class ColumnFactory {
/**
* @var ColumnInstantiator
*/
private $column_initiator;
/**
* @var CloneColumnFactory
*/
private $clone_column_factory;
public function __construct( ColumnInstantiator $column_initiator ) {
$this->column_initiator = $column_initiator;
$this->clone_column_factory = new CloneColumnFactory( $this );
}
/**
* @param array $settings
*
* @return Column|null
*/
public function create( array $settings ) {
if ( isset( $settings['_clone'] ) ) {
return $this->clone_column_factory->create( $settings );
}
switch ( $settings['type'] ) {
case FieldType::TYPE_GROUP:
return ( new GroupColumnFactory( $this ) )->create( $settings );
case FieldType::TYPE_REPEATER:
return $this->create_column( new Repeater(), $settings );
case FieldType::TYPE_BOOLEAN:
case FieldType::TYPE_BUTTON_GROUP:
case FieldType::TYPE_CHECKBOX:
case FieldType::TYPE_COLOR_PICKER:
case FieldType::TYPE_DATE_PICKER:
case FieldType::TYPE_DATE_TIME_PICKER:
case FieldType::TYPE_EMAIL:
case FieldType::TYPE_FILE:
case FieldType::TYPE_FLEXIBLE_CONTENT:
case FieldType::TYPE_GALLERY:
case FieldType::TYPE_GOOGLE_MAP:
case FieldType::TYPE_IMAGE:
case FieldType::TYPE_LINK:
case FieldType::TYPE_NUMBER:
case FieldType::TYPE_OEMBED:
case FieldType::TYPE_PAGE_LINK:
case FieldType::TYPE_PASSWORD:
case FieldType::TYPE_POST:
case FieldType::TYPE_RADIO:
case FieldType::TYPE_RANGE:
case FieldType::TYPE_RELATIONSHIP:
case FieldType::TYPE_SELECT:
case FieldType::TYPE_TAXONOMY:
case FieldType::TYPE_TEXT:
case FieldType::TYPE_TEXTAREA:
case FieldType::TYPE_TIME_PICKER:
case FieldType::TYPE_URL:
case FieldType::TYPE_USER:
case FieldType::TYPE_WYSIWYG:
return $this->create_column( new Column(), $settings );
default:
return $this->create_column( new Unsupported(), $settings );
}
}
private function create_column( Column $column, array $settings ) {
$column->set_label( $settings['label'] )
->set_type( $settings['key'] );
$this->column_initiator->initiate( $column );
return $column;
}
class ColumnFactory
{
/**
* @var ColumnInstantiator
*/
private $column_initiator;
/**
* @var CloneColumnFactory
*/
private $clone_column_factory;
public function __construct(ColumnInstantiator $column_initiator)
{
$this->column_initiator = $column_initiator;
$this->clone_column_factory = new CloneColumnFactory($this);
}
/**
* @param array $settings
*
* @return Column|null
*/
public function create(array $settings)
{
if (isset($settings['_clone'])) {
return $this->clone_column_factory->create($settings);
}
switch ($settings['type']) {
case FieldType::TYPE_GROUP:
return (new GroupColumnFactory($this))->create($settings);
case FieldType::TYPE_REPEATER:
return $this->create_column(new Repeater(), $settings);
case FieldType::TYPE_BOOLEAN:
case FieldType::TYPE_BUTTON_GROUP:
case FieldType::TYPE_CHECKBOX:
case FieldType::TYPE_COLOR_PICKER:
case FieldType::TYPE_DATE_PICKER:
case FieldType::TYPE_DATE_TIME_PICKER:
case FieldType::TYPE_EMAIL:
case FieldType::TYPE_FILE:
case FieldType::TYPE_FLEXIBLE_CONTENT:
case FieldType::TYPE_GALLERY:
case FieldType::TYPE_GOOGLE_MAP:
case FieldType::TYPE_IMAGE:
case FieldType::TYPE_LINK:
case FieldType::TYPE_NUMBER:
case FieldType::TYPE_OEMBED:
case FieldType::TYPE_PAGE_LINK:
case FieldType::TYPE_PASSWORD:
case FieldType::TYPE_POST:
case FieldType::TYPE_RADIO:
case FieldType::TYPE_RANGE:
case FieldType::TYPE_RELATIONSHIP:
case FieldType::TYPE_SELECT:
case FieldType::TYPE_TAXONOMY:
case FieldType::TYPE_TEXT:
case FieldType::TYPE_TEXTAREA:
case FieldType::TYPE_TIME_PICKER:
case FieldType::TYPE_URL:
case FieldType::TYPE_USER:
case FieldType::TYPE_WYSIWYG:
return $this->create_column(new Column(), $settings);
default:
return $this->create_column(new Unsupported(), $settings);
}
}
private function create_column(Column $column, array $settings)
{
$column = apply_filters('acp/acf/column', $column, $settings['type'], $settings);
if ( ! $column instanceof Column) {
throw new LogicException('Column must be an instance of ACA\ACF\Column');
}
$column->set_label($settings['label'])
->set_type($settings['key']);
$this->column_initiator->initiate($column);
return $column;
}
}
\ No newline at end of file
......
......@@ -8,7 +8,8 @@ class ColumnGroup implements AC\Registerable {
const SLUG = 'acf';
public function register() {
public function register(): void
{
add_action( 'ac/column_groups', [ $this, 'register_column_groups' ] );
}
......
......@@ -2,10 +2,6 @@
namespace ACA\ACF;
use ACA\ACF\ConditionalFormatting;
use ACA\ACF\Search;
use ACA\ACF\Sorting;
final class ColumnInstantiator {
/**
......
......@@ -5,7 +5,6 @@ namespace ACA\ACF\Editing;
use AC\MetaType;
use ACA\ACF\CloneColumnFactory;
use ACA\ACF\Column;
use ACA\ACF\Editing\Storage;
use ACA\ACF\GroupColumnFactory;
class StorageFactory {
......
......@@ -3,7 +3,6 @@
namespace ACA\ACF\Export;
use AC;
use ACA\ACF\Export\Model;
use ACA\ACF\FieldType;
use ACP;
......
......@@ -6,28 +6,31 @@ use ACA\ACF;
use ACP;
use ACP\Column;
class FieldGroup extends ACP\ListScreen\Post {
class FieldGroup extends ACP\ListScreen\Post
{
public function __construct() {
parent::__construct( 'acf-field-group' );
public function __construct()
{
parent::__construct('acf-field-group');
$this->set_group( 'acf' );
}
$this->group = 'acf';
}
protected function register_column_types() {
$this->register_column_types_from_list( [
Column\CustomField::class,
Column\Actions::class,
Column\Post\Author::class,
Column\Post\Content::class,
Column\Post\DatePublished::class,
Column\Post\ID::class,
Column\Post\Modified::class,
Column\Post\Status::class,
Column\Post\Title::class,
Column\Post\TitleRaw::class,
ACF\Column\FieldGroup\Location::class,
] );
}
protected function register_column_types(): void
{
$this->register_column_types_from_list([
Column\CustomField::class,
Column\Actions::class,
Column\Post\Author::class,
Column\Post\Content::class,
Column\Post\DatePublished::class,
Column\Post\ID::class,
Column\Post\Modified::class,
Column\Post\Status::class,
Column\Post\Title::class,
Column\Post\TitleRaw::class,
ACF\Column\FieldGroup\Location::class,
]);
}
}
\ No newline at end of file
......
......@@ -3,38 +3,31 @@
namespace ACA\ACF\ListScreenFactory;
use AC\ListScreen;
use AC\ListScreenFactory\ListSettingsTrait;
use AC\ListScreenFactoryInterface;
use AC\ListScreenFactory;
use ACA\ACF\ListScreen\FieldGroup;
use LogicException;
use WP_Screen;
class FieldGroupFactory implements ListScreenFactoryInterface {
class FieldGroupFactory extends ListScreenFactory\BaseFactory
{
use ListSettingsTrait;
public function can_create(string $key): bool
{
return 'acf-field-group' === $key;
}
public function can_create( string $key ): bool {
return 'acf-field-group' === $key;
}
protected function create_list_screen(string $key): ListScreen
{
return new FieldGroup();
}
public function create( string $key, array $settings = [] ): ListScreen {
if ( ! $this->can_create( $key ) ) {
throw new LogicException( 'Invalid Listscreen key' );
}
public function can_create_from_wp_screen(WP_Screen $screen): bool
{
return $screen->base === 'edit' && $screen->post_type === 'acf-field-group';
}
return $this->add_settings( new FieldGroup(), $settings );
}
public function can_create_by_wp_screen( WP_Screen $screen ): bool {
return $screen->base === 'edit' && $screen->post_type === 'acf-field-group';
}
public function create_by_wp_screen( WP_Screen $screen, array $settings = [] ): ListScreen {
if ( ! $this->can_create_by_wp_screen( $screen ) ) {
throw new LogicException( 'Invalid Screen' );
}
return $this->add_settings( new FieldGroup(), $settings );
}
protected function create_list_screen_from_wp_screen(WP_Screen $screen): ListScreen
{
return new FieldGroup();
}
}
\ No newline at end of file
......
......@@ -24,7 +24,8 @@ class MapLegacyListScreen implements RequestHandler {
$this->list_screen_repository = $list_screen_repository;
}
public function handle( Request $request ) {
public function handle( Request $request ): void
{
if ( ! current_user_can( Capabilities::MANAGE ) ) {
return;
}
......
......@@ -32,7 +32,8 @@ class AddColumns implements Registerable {
$this->column_factory = $column_factory;
}
public function register() {
public function register(): void
{
add_action( 'ac/column_types', [ $this, 'add_columns' ] );
}
......
......@@ -9,7 +9,8 @@ use ACA\ACF\Helper;
class ColumnSettings implements Registerable {
public function register() {
public function register(): void
{
add_action( 'ac/column/settings', [ $this, 'add_edit_field_link_to_column_type' ] );
}
......
......@@ -6,7 +6,8 @@ use AC\Registerable;
class EditingFix implements Registerable {
public function register() {
public function register(): void
{
add_filter( 'acp/editing/post_statuses', [ $this, 'remove_acf_statuses_for_editing' ] );
}
......
......@@ -18,7 +18,8 @@ class InitColumn implements Registerable {
$this->column_initiator = $column_initiator;
}
public function register() {
public function register(): void
{
add_action( 'ac/list_screen/column_created', [ $this, 'initiate_column' ] );
}
......
......@@ -16,7 +16,8 @@ use ACA\ACF\Utils\V2ToV3Migration;
*/
class LegacyColumnMapper implements Registerable {
public function register() {
public function register(): void
{
add_action( 'ac/table/list_screen', [ new V2ToV3Migration(), 'migrate_list_screen_settings' ], 9 );
add_action( 'ac/settings/notice', [ $this, 'render_deprecated_columns_notice' ] );
}
......
......@@ -2,28 +2,33 @@
namespace ACA\ACF\Service;
use AC;
use AC\Column;
use AC\Groups;
use AC\Registerable;
use ACA\ACF\ListScreen;
class ListScreens implements Registerable {
class ListScreens implements Registerable
{
public function register() {
add_action( 'ac/list_screen_groups', [ $this, 'register_list_screen_groups' ] );
add_filter( 'ac/export/value', [ $this, 'strip_tags_export_value' ], 10, 2 );
}
public function register(): void
{
add_action('ac/list_screen_groups', [$this, 'register_list_screen_groups']);
add_filter('ac/export/value', [$this, 'strip_tags_export_value'], 10, 4);
}
public function strip_tags_export_value( string $value, Column $column ) {
if ( $column->get_list_screen() instanceof ListScreen\FieldGroup && $column->is_original() ) {
$value = strip_tags( $value );
}
public function strip_tags_export_value(string $value, Column $column, $id, AC\ListScreen $list_screen)
{
if ($list_screen instanceof ListScreen\FieldGroup && $column->is_original()) {
$value = strip_tags($value);
}
return $value;
}
return $value;
}
public function register_list_screen_groups( Groups $groups ): void {
$groups->add( 'acf', __( 'Advanced Custom Fields', 'codepress-admin-columns' ), 7 );
}
public function register_list_screen_groups(Groups $groups): void
{
$groups->add('acf', __('Advanced Custom Fields', 'codepress-admin-columns'), 7);
}
}
\ No newline at end of file
......
......@@ -7,7 +7,8 @@ use AC\Registerable;
class RemoveDeprecatedColumnFromTypeSelector implements Registerable {
public function register() {
public function register(): void
{
add_filter( 'ac/column/settings/column_types', [ $this, 'remove_from_type_selector' ], 10, 2 );
}
......
......@@ -19,7 +19,8 @@ class Scripts implements Registerable {
$this->location = $location;
}
public function register() {
public function register(): void
{
add_action( 'ac/table_scripts/editing', [ $this, 'table_scripts_editing' ] );
add_action( 'ac/admin_scripts', [ $this, 'admin_scripts' ] );
}
......
......@@ -8,71 +8,116 @@ use ACA\ACF\FieldType;
use ACA\ACF\Sorting;
use ACP;
class ModelFactory implements SortingModelFactory {
public function create( Field $field, $meta_key, Column $column ) {
$meta_type = $column->get_meta_type();
switch ( $field->get_type() ) {
case FieldType::TYPE_NUMBER:
case FieldType::TYPE_RANGE:
return ( new ACP\Sorting\Model\MetaFactory() )->create( $meta_type, $meta_key, new ACP\Sorting\Type\DataType( ACP\Sorting\Type\DataType::DECIMAL ) );
case FieldType::TYPE_TEXT:
case FieldType::TYPE_TEXTAREA:
case FieldType::TYPE_WYSIWYG:
case FieldType::TYPE_EMAIL:
case FieldType::TYPE_COLOR_PICKER:
case FieldType::TYPE_OEMBED:
case FieldType::TYPE_URL:
case FieldType::TYPE_PASSWORD:
case FieldType::TYPE_TIME_PICKER:
case FieldType::TYPE_IMAGE:
case FieldType::TYPE_BOOLEAN:
return ( new ACP\Sorting\Model\MetaFactory() )->create( $meta_type, $meta_key );
case FieldType::TYPE_DATE_PICKER:
return ( new ACP\Sorting\Model\MetaFactory() )->create( $meta_type, $meta_key, new ACP\Sorting\Type\DataType( ACP\Sorting\Type\DataType::NUMERIC ) );
case FieldType::TYPE_DATE_TIME_PICKER:
return ( new ACP\Sorting\Model\MetaFactory() )->create( $meta_type, $meta_key, new ACP\Sorting\Type\DataType( ACP\Sorting\Type\DataType::DATETIME ) );
case FieldType::TYPE_CHECKBOX:
$choices = $field instanceof Field\Choices ? $field->get_choices() : [];
return ( new ACP\Sorting\Model\MetaFormatFactory() )->create( $meta_type, $meta_key, new Sorting\FormatValue\Select( $choices ) );
case FieldType::TYPE_FILE:
return ( new ACP\Sorting\Model\MetaFormatFactory() )->create( $meta_type, $meta_key, new Sorting\FormatValue\File() );
case FieldType::TYPE_RADIO:
case FieldType::TYPE_BUTTON_GROUP:
$choices = $field instanceof Field\Choices ? $field->get_choices() : [];
natcasesort( $choices );
return ( new ACP\Sorting\Model\MetaMappingFactory )->create( $meta_type, $meta_key, array_keys( $choices ) );
case FieldType::TYPE_SELECT:
$choices = $field instanceof Field\Choices ? $field->get_choices() : [];
natcasesort( $choices );
return $field instanceof Field\Multiple && $field->is_multiple()
? ( new ACP\Sorting\Model\MetaFormatFactory() )->create( $meta_type, $meta_key, new Sorting\FormatValue\Select( $choices ) )
: ( new ACP\Sorting\Model\MetaMappingFactory )->create( $meta_type, $meta_key, array_keys( $choices ) );
case FieldType::TYPE_RELATIONSHIP:
case FieldType::TYPE_POST:
case FieldType::TYPE_PAGE_LINK:
return ( new Sorting\ModelFactory\Relation() )->create( $field, $meta_key, $column );
case FieldType::TYPE_USER:
return ( new Sorting\ModelFactory\User() )->create( $field, $meta_key, $column );
case FieldType::TYPE_TAXONOMY:
return ( new Sorting\ModelFactory\Taxonomy() )->create( $field, $meta_key, $column );
default:
return new ACP\Sorting\Model\Disabled();
}
}
class ModelFactory implements SortingModelFactory
{
public function create(Field $field, $meta_key, Column $column)
{
$meta_type = $column->get_meta_type();
switch ($field->get_type()) {
case FieldType::TYPE_NUMBER:
case FieldType::TYPE_RANGE:
return (new ACP\Sorting\Model\MetaFactory())->create(
$meta_type,
$meta_key,
new ACP\Sorting\Type\DataType(ACP\Sorting\Type\DataType::DECIMAL)
);
case FieldType::TYPE_TEXT:
case FieldType::TYPE_TEXTAREA:
case FieldType::TYPE_WYSIWYG:
case FieldType::TYPE_EMAIL:
case FieldType::TYPE_COLOR_PICKER:
case FieldType::TYPE_OEMBED:
case FieldType::TYPE_URL:
case FieldType::TYPE_PASSWORD:
case FieldType::TYPE_TIME_PICKER:
case FieldType::TYPE_IMAGE:
case FieldType::TYPE_BOOLEAN:
return (new ACP\Sorting\Model\MetaFactory())->create($meta_type, $meta_key);
case FieldType::TYPE_DATE_PICKER:
return (new ACP\Sorting\Model\MetaFactory())->create(
$meta_type,
$meta_key,
new ACP\Sorting\Type\DataType(ACP\Sorting\Type\DataType::NUMERIC)
);
case FieldType::TYPE_DATE_TIME_PICKER:
return (new ACP\Sorting\Model\MetaFactory())->create(
$meta_type,
$meta_key,
new ACP\Sorting\Type\DataType(ACP\Sorting\Type\DataType::DATETIME)
);
case FieldType::TYPE_CHECKBOX:
$choices = $field instanceof Field\Choices ? $field->get_choices() : [];
return (new ACP\Sorting\Model\MetaFormatFactory())->create(
$meta_type,
$meta_key,
new Sorting\FormatValue\Select($choices),
null,
[
'post_type' => $column->get_post_type(),
'taxonomy' => $column->get_taxonomy(),
]
);
case FieldType::TYPE_FILE:
return (new ACP\Sorting\Model\MetaFormatFactory())->create(
$meta_type,
$meta_key,
new Sorting\FormatValue\File(),
null,
[
'post_type' => $column->get_post_type(),
'taxonomy' => $column->get_taxonomy(),
]
);
case FieldType::TYPE_RADIO:
case FieldType::TYPE_BUTTON_GROUP:
$choices = $field instanceof Field\Choices ? $field->get_choices() : [];
natcasesort($choices);
return (new ACP\Sorting\Model\MetaMappingFactory())->create(
$meta_type,
$meta_key,
array_keys($choices)
);
case FieldType::TYPE_SELECT:
$choices = $field instanceof Field\Choices ? $field->get_choices() : [];
natcasesort($choices);
return $field instanceof Field\Multiple && $field->is_multiple()
? (new ACP\Sorting\Model\MetaFormatFactory())->create(
$meta_type,
$meta_key,
new Sorting\FormatValue\Select($choices),
null,
[
'post_type' => $column->get_post_type(),
'taxonomy' => $column->get_taxonomy(),
]
)
: (new ACP\Sorting\Model\MetaMappingFactory())->create($meta_type, $meta_key, array_keys($choices));
case FieldType::TYPE_RELATIONSHIP:
case FieldType::TYPE_POST:
case FieldType::TYPE_PAGE_LINK:
return (new Sorting\ModelFactory\Relation())->create($field, $meta_key, $column);
case FieldType::TYPE_USER:
return (new Sorting\ModelFactory\User())->create($field, $meta_key, $column);
case FieldType::TYPE_TAXONOMY:
return (new Sorting\ModelFactory\Taxonomy())->create($field, $meta_key, $column);
default:
return new ACP\Sorting\Model\Disabled();
}
}
}
\ No newline at end of file
......
......@@ -12,52 +12,67 @@ use ACP\Sorting\Model\Disabled;
use ACP\Sorting\Model\MetaFormatFactory;
use ACP\Sorting\Model\MetaRelatedPostFactory;
class Relation implements SortingModelFactory {
/**
* @var MetaFormatFactory
*/
private $meta_format_factory;
public function __construct() {
$this->meta_format_factory = new MetaFormatFactory();
}
public function create( Field $field, $meta_key, Column $column ) {
return $field instanceof Field\Multiple && $field->is_multiple()
? $this->create_multiple_relation_model( $column, $meta_key )
: $this->create_single_relation_model( $column, $meta_key );
}
private function create_single_relation_model( Column $column, $meta_key ) {
$setting = $column->get_setting( AC\Settings\Column\Post::NAME );
if ( ! $setting ) {
return new Disabled();
}
$model = ( new MetaRelatedPostFactory() )->create(
$column->get_meta_type(),
$setting->get_value(),
$meta_key
);
return $model
?: $this->meta_format_factory->create(
$column->get_meta_type(),
$meta_key,
new SettingFormatter( $setting )
);
}
private function create_multiple_relation_model( Column $column, $meta_key ) {
$setting = $column->get_setting( AC\Settings\Column\Post::NAME );
return $this->meta_format_factory->create(
$column->get_meta_type(),
$meta_key,
new SerializedSettingFormatter( new SettingFormatter( $setting ) )
);
}
class Relation implements SortingModelFactory
{
/**
* @var MetaFormatFactory
*/
private $meta_format_factory;
public function __construct()
{
$this->meta_format_factory = new MetaFormatFactory();
}
public function create(Field $field, $meta_key, Column $column)
{
return $field instanceof Field\Multiple && $field->is_multiple()
? $this->create_multiple_relation_model($column, $meta_key)
: $this->create_single_relation_model($column, $meta_key);
}
private function create_single_relation_model(Column $column, $meta_key)
{
$setting = $column->get_setting(AC\Settings\Column\Post::NAME);
if ( ! $setting) {
return new Disabled();
}
$model = (new MetaRelatedPostFactory())->create(
$column->get_meta_type(),
$setting->get_value(),
$meta_key
);
return $model
?: $this->meta_format_factory->create(
$column->get_meta_type(),
$meta_key,
new SettingFormatter($setting),
null,
[
'taxonomy' => $column->get_taxonomy(),
'post_type' => $column->get_post_type(),
]
);
}
private function create_multiple_relation_model(Column $column, $meta_key)
{
$setting = $column->get_setting(AC\Settings\Column\Post::NAME);
return $this->meta_format_factory->create(
$column->get_meta_type(),
$meta_key,
new SerializedSettingFormatter(new SettingFormatter($setting)),
null,
[
'taxonomy' => $column->get_taxonomy(),
'post_type' => $column->get_post_type(),
]
);
}
}
\ No newline at end of file
......
......@@ -7,18 +7,29 @@ use ACA\ACF\Field;
use ACA\ACF\Sorting;
use ACP;
class Taxonomy implements Sorting\SortingModelFactory {
class Taxonomy implements Sorting\SortingModelFactory
{
public function create( Field $field, $meta_key, Column $column ) {
if ( ! $field instanceof Field\Type\Taxonomy ) {
return new ACP\Sorting\Model\Disabled();
}
public function create(Field $field, $meta_key, Column $column)
{
if ( ! $field instanceof Field\Type\Taxonomy) {
return new ACP\Sorting\Model\Disabled();
}
if ( $field->uses_native_term_relation() ) {
return new ACP\Sorting\Model\Disabled();
}
if ($field->uses_native_term_relation()) {
return new ACP\Sorting\Model\Disabled();
}
return ( new ACP\Sorting\Model\MetaFormatFactory() )->create( $column->get_meta_type(), $meta_key, new Sorting\FormatValue\Taxonomy() );
}
return (new ACP\Sorting\Model\MetaFormatFactory())->create(
$column->get_meta_type(),
$meta_key,
new Sorting\FormatValue\Taxonomy(),
null,
[
'taxonomy' => $column->get_taxonomy(),
'post_type' => $column->get_post_type(),
]
);
}
}
\ No newline at end of file
......
......@@ -9,50 +9,65 @@ use ACA\ACF\Sorting\SortingModelFactory;
use ACP;
use ACP\Sorting\Model\MetaRelatedUserFactory;
class User implements SortingModelFactory {
/**
* @var ACP\Sorting\Model\MetaFormatFactory
*/
private $meta_format_factory;
public function __construct() {
$this->meta_format_factory = new ACP\Sorting\Model\MetaFormatFactory();
}
public function create( Field $field, $meta_key, Column $column ) {
return $field instanceof Field\Multiple && $field->is_multiple()
? $this->create_multiple_relation_model( $column, $meta_key )
: $this->create_single_relation_model( $column, $meta_key );
}
private function create_single_relation_model( Column $column, $meta_key ) {
$setting = $column->get_setting( AC\Settings\Column\User::NAME );
$model = ( new MetaRelatedUserFactory() )->create(
$column->get_meta_type(),
$setting->get_value(),
$meta_key
);
return $model
?: $this->meta_format_factory->create(
$column->get_meta_type(),
$meta_key,
new ACP\Sorting\FormatValue\SettingFormatter( $setting )
);
}
private function create_multiple_relation_model( Column $column, $meta_key ) {
$setting = $column->get_setting( AC\Settings\Column\User::NAME );
return $this->meta_format_factory->create(
$column->get_meta_type(),
$meta_key,
new ACP\Sorting\FormatValue\SerializedSettingFormatter(
new ACP\Sorting\FormatValue\SettingFormatter( $setting )
)
);
}
class User implements SortingModelFactory
{
/**
* @var ACP\Sorting\Model\MetaFormatFactory
*/
private $meta_format_factory;
public function __construct()
{
$this->meta_format_factory = new ACP\Sorting\Model\MetaFormatFactory();
}
public function create(Field $field, $meta_key, Column $column)
{
return $field instanceof Field\Multiple && $field->is_multiple()
? $this->create_multiple_relation_model($column, $meta_key)
: $this->create_single_relation_model($column, $meta_key);
}
private function create_single_relation_model(Column $column, $meta_key)
{
$setting = $column->get_setting(AC\Settings\Column\User::NAME);
$model = (new MetaRelatedUserFactory())->create(
$column->get_meta_type(),
(string)$setting->get_value(),
$meta_key
);
return $model
?: $this->meta_format_factory->create(
$column->get_meta_type(),
$meta_key,
new ACP\Sorting\FormatValue\SettingFormatter($setting),
null,
[
'taxonomy' => $column->get_taxonomy(),
'post_type' => $column->get_post_type(),
]
);
}
private function create_multiple_relation_model(Column $column, $meta_key)
{
$setting = $column->get_setting(AC\Settings\Column\User::NAME);
return $this->meta_format_factory->create(
$column->get_meta_type(),
$meta_key,
new ACP\Sorting\FormatValue\SerializedSettingFormatter(
new ACP\Sorting\FormatValue\SettingFormatter($setting)
),
null,
[
'taxonomy' => $column->get_taxonomy(),
'post_type' => $column->get_post_type(),
]
);
}
}
\ No newline at end of file
......
......@@ -3,26 +3,27 @@
namespace ACA\BbPress;
use AC\Registerable;
use ACA\BbPress\Service;
use AC\Services;
class BbPress implements Registerable {
class BbPress implements Registerable
{
public function register() {
if ( ! class_exists( 'bbPress' ) ) {
return;
}
public function register(): void
{
if ( ! class_exists('bbPress')) {
return;
}
$services = [
new Service\Columns(),
new Service\Editing(),
new Service\ListScreens(),
];
$this->create_services()->register();
}
foreach ( $services as $service ) {
if ( $service instanceof Registerable ) {
$service->register();
}
}
}
private function create_services(): Services
{
return new Services([
new Service\Columns(),
new Service\Editing(),
new Service\ListScreens(),
]);
}
}
\ No newline at end of file
......
......@@ -13,7 +13,8 @@ class Topic extends ACP\ListScreen\Post {
$this->set_group( 'bbpress' );
}
protected function register_column_types() {
protected function register_column_types(): void
{
parent::register_column_types();
$this->register_column_type( new Column\Topic\Forum() );
......
......@@ -3,38 +3,31 @@
namespace ACA\BbPress\ListScreenFactory;
use AC\ListScreen;
use AC\ListScreenFactory\ListSettingsTrait;
use AC\ListScreenFactoryInterface;
use AC\ListScreenFactory;
use ACA\BbPress\ListScreen\Topic;
use LogicException;
use WP_Screen;
class TopicFactory implements ListScreenFactoryInterface {
class TopicFactory extends ListScreenFactory\BaseFactory
{
use ListSettingsTrait;
public function can_create(string $key): bool
{
return 'topic' === $key;
}
public function can_create( string $key ): bool {
return 'topic' === $key;
}
protected function create_list_screen(string $key): ListScreen
{
return new Topic();
}
public function create( string $key, array $settings = [] ): ListScreen {
if ( ! $this->can_create( $key ) ) {
throw new LogicException( 'Invalid Listscreen key' );
}
public function can_create_from_wp_screen(WP_Screen $screen): bool
{
return $screen->base === 'edit' && $screen->post_type === 'topic';
}
return $this->add_settings( new Topic(), $settings );
}
public function can_create_by_wp_screen( WP_Screen $screen ): bool {
return $screen->base === 'edit' && $screen->post_type === 'topic';
}
public function create_by_wp_screen( WP_Screen $screen, array $settings = [] ): ListScreen {
if ( ! $this->can_create_by_wp_screen( $screen ) ) {
throw new LogicException( 'Invalid Screen' );
}
return $this->add_settings( new Topic(), $settings );
}
protected function create_list_screen_from_wp_screen(WP_Screen $screen): ListScreen
{
return new Topic();
}
}
\ No newline at end of file
......
......@@ -8,7 +8,8 @@ use ACA\BbPress\Column;
class Columns implements Registerable {
public function register() {
public function register(): void
{
add_action( 'ac/column_groups', [ $this, 'register_column_group' ] );
}
......
......@@ -6,7 +6,8 @@ use AC\Registerable;
class Editing implements Registerable {
public function register() {
public function register(): void
{
add_filter( 'ac/editing/role_group', [ $this, 'editing_role_group' ], 10, 2 );
}
......
......@@ -9,11 +9,12 @@ use ACA\BbPress\ListScreenFactory\TopicFactory;
class ListScreens implements Registerable {
public function register() {
public function register(): void
{
add_action( 'ac/list_screen_groups', [ $this, 'register_list_screen_group' ] );
add_action( 'ac/admin/menu_group', [ $this, 'update_menu_list_groups' ], 10, 2 );
AC\ListScreenFactory::add( new TopicFactory() );
AC\ListScreenFactory\Aggregate::add( new TopicFactory() );
}
public function register_list_screen_group( AC\Groups $groups ): void {
......
......@@ -4,30 +4,32 @@ namespace ACA\BeaverBuilder;
use AC;
use AC\Registerable;
use AC\Services;
use ACA\BeaverBuilder\Service;
class BeaverBuilder implements Registerable {
public function register() {
if ( ! class_exists( 'FLBuilderLoader' ) ) {
return;
}
AC\ListScreenFactory::add( new ListScreenFactory\Templates() );
AC\ListScreenFactory::add( new ListScreenFactory\SavedColumns() );
AC\ListScreenFactory::add( new ListScreenFactory\SavedModules() );
AC\ListScreenFactory::add( new ListScreenFactory\SavedRows() );
$services = [
new Service\ListScreens(),
new Service\PostTypes(),
];
foreach ( $services as $service ) {
if ( $service instanceof Registerable ) {
$service->register();
}
}
}
class BeaverBuilder implements Registerable
{
public function register(): void
{
if ( ! class_exists('FLBuilderLoader')) {
return;
}
AC\ListScreenFactory\Aggregate::add(new ListScreenFactory\Templates());
AC\ListScreenFactory\Aggregate::add(new ListScreenFactory\SavedColumns());
AC\ListScreenFactory\Aggregate::add(new ListScreenFactory\SavedModules());
AC\ListScreenFactory\Aggregate::add(new ListScreenFactory\SavedRows());
$this->create_services()->register();
}
private function create_services(): Services
{
return new Services([
new Service\ListScreens(),
new Service\PostTypes(),
]);
}
}
\ No newline at end of file
......
......@@ -2,34 +2,37 @@
namespace ACA\BeaverBuilder\ListScreen;
use AC\Type\Uri;
use ACP;
class Template extends ACP\ListScreen\Post {
class Template extends ACP\ListScreen\Post
{
public const POST_TYPE = 'fl-builder-template';
public const POST_TYPE = 'fl-builder-template';
private $template_page;
private $template_page;
private $custom_label;
private $custom_label;
public function __construct( string $template_page, string $label ) {
parent::__construct( 'fl-builder-template' );
public function __construct(string $template_page, string $label)
{
parent::__construct('fl-builder-template', self::POST_TYPE . $template_page);
$this->template_page = $template_page;
$this->custom_label = $label;
$this->template_page = $template_page;
$this->custom_label = $label;
$this->set_key( self::POST_TYPE . $template_page )
->set_group( 'beaver_builder' )
->set_label( $label )
->set_screen_id( $this->get_screen_base() . '-fl-builder-template' );
}
$this->set_group('beaver_builder')
->set_label($label);
}
public function get_label() {
return $this->custom_label;
}
public function get_label(): ?string
{
return $this->custom_label;
}
public function get_screen_link() {
return add_query_arg( [ 'fl-builder-template-type' => $this->template_page ], parent::get_screen_link() );
}
public function get_table_url(): Uri
{
return parent::get_table_url()->with_arg('fl-builder-template-type', $this->template_page);
}
}
\ No newline at end of file
......
<?php
declare( strict_types=1 );
declare(strict_types=1);
namespace ACA\BeaverBuilder;
use AC;
use AC\ListScreen;
use AC\ListScreenFactory\ListSettingsTrait;
use AC\ListScreenFactoryInterface;
use ACA\BeaverBuilder\ListScreen\Template;
use LogicException;
use WP_Screen;
abstract class ListScreenFactory implements ListScreenFactoryInterface {
use ListSettingsTrait;
private function create_list_screen(): Template {
return new Template( $this->get_page(), $this->get_label() );
}
abstract protected function get_label(): string;
abstract protected function get_page(): string;
abstract class ListScreenFactory extends AC\ListScreenFactory\BaseFactory
{
public function can_create( string $key ): bool {
return $key === Template::POST_TYPE . $this->get_page() && post_type_exists( Template::POST_TYPE );
}
protected function create_list_screen(string $key): ListScreen
{
return new Template($this->get_page(), $this->get_label());
}
public function create( string $key, array $settings = [] ): ListScreen {
if ( ! $this->can_create( $key ) ) {
throw new LogicException( 'Invalid key' );
}
abstract protected function get_label(): string;
return $this->add_settings( $this->create_list_screen(), $settings );
}
abstract protected function get_page(): string;
public function can_create_by_wp_screen( WP_Screen $screen ): bool {
return 'edit' === $screen->base
&& $screen->post_type
&& 'edit-' . $screen->post_type === $screen->id
&& $this->get_page() === filter_input( INPUT_GET, 'fl-builder-template-type' );
}
public function can_create(string $key): bool
{
return $key === Template::POST_TYPE . $this->get_page() && post_type_exists(Template::POST_TYPE);
}
public function create_by_wp_screen( WP_Screen $screen, array $settings = [] ): ListScreen {
if ( ! $this->can_create_by_wp_screen( $screen ) ) {
throw new LogicException( 'Invalid screen' );
}
public function can_create_from_wp_screen(WP_Screen $screen): bool
{
return 'edit' === $screen->base
&& $screen->post_type
&& 'edit-' . $screen->post_type === $screen->id
&& $this->get_page() === filter_input(INPUT_GET, 'fl-builder-template-type');
}
return $this->add_settings( $this->create_list_screen(), $settings );
}
protected function create_list_screen_from_wp_screen(WP_Screen $screen): ListScreen
{
return $this->create_list_screen($screen->post_type);
}
}
\ No newline at end of file
......
......@@ -12,7 +12,8 @@ use ACP\ListScreen\Taxonomy;
class ListScreens implements Registerable {
public function register(): void {
public function register(): void
{
add_action( 'ac/list_screen_groups', [ $this, 'register_beaver_builder_group' ] );
add_filter( 'ac/admin/menu_group', [ $this, 'update_menu_list_groups' ], 10, 2 );
add_action( 'ac/list_keys', [ $this, 'add_list_keys' ] );
......
......@@ -8,7 +8,8 @@ class PostTypes implements Registerable {
public const POST_TYPE_TEMPLATE = 'fl-builder-template';
public function register() {
public function register(): void
{
add_filter( 'ac/post_types', [ $this, 'deregister_global_post_type' ] );
}
......
......@@ -3,42 +3,42 @@
namespace ACA\BP;
use AC;
use AC\ListScreenFactory\Aggregate;
use AC\Registerable;
use ACA\BP\ListScreenFactory;
use ACA\BP\Service;
use AC\Services;
use ACP\Service\IntegrationStatus;
final class BuddyPress implements Registerable {
private $location;
public function __construct( AC\Asset\Location\Absolute $location ) {
$this->location = $location;
}
public function register() {
if ( ! class_exists( 'BuddyPress', false ) ) {
return;
}
$services = [
new Service\Admin( $this->location ),
new Service\Columns(),
new Service\ListScreens(),
new Service\Table( $this->location ),
new IntegrationStatus( 'ac-addon-buddypress')
];
array_map( [ $this, 'register_service' ], $services );
AC\ListScreenFactory::add( new ListScreenFactory\Email() );
AC\ListScreenFactory::add( new ListScreenFactory\Group() );
}
private function register_service( $service ) {
if ( $service instanceof Registerable ) {
$service->register();
}
}
final class BuddyPress implements Registerable
{
private $location;
public function __construct(AC\Asset\Location\Absolute $location)
{
$this->location = $location;
}
public function register(): void
{
if ( ! class_exists('BuddyPress', false)) {
return;
}
Aggregate::add(new ListScreenFactory\Email());
Aggregate::add(new ListScreenFactory\Group());
$this->create_services()->register();
}
private function create_services(): Services
{
return new Services([
new Service\Admin($this->location),
new Service\Columns(),
new Service\ListScreens(),
new Service\Table($this->location),
new IntegrationStatus('ac-addon-buddypress'),
]);
}
}
\ No newline at end of file
......
......@@ -6,7 +6,8 @@ use ACP;
class Groups extends ACP\Editing\Ajax\TableRows {
public function register() {
public function register(): void
{
add_action( 'bp_groups_admin_load', [ $this, 'handle_request' ] );
}
......
......@@ -4,7 +4,6 @@ namespace ACA\BP\Editing\Service\User;
use ACP;
use ACP\Editing\Service;
use ACP\Editing\Value\Data;
use ACP\Editing\View;
class Membertype implements Service {
......
......@@ -2,12 +2,12 @@
namespace ACA\BP\Field\Profile;
use ACP;
use ACA\BP\Editing;
use ACA\BP\Field\Profile;
use ACA\BP\Filtering;
use ACA\BP\Search;
use ACA\BP\Sorting;
use ACP;
use ACP\Sorting\Type\DataType;
class Datebox extends Profile {
......
......@@ -3,10 +3,10 @@
namespace ACA\BP\Field\Profile;
use AC;
use ACP;
use ACA\BP\Editing;
use ACA\BP\Field\Profile;
use ACA\BP\Search;
use ACP;
use ACP\Editing\Service\Basic;
class Textarea extends Profile {
......
<?php
declare(strict_types=1);
namespace ACA\BP\ListScreen;
use ACP;
class Email extends ACP\ListScreen\Post {
class Email extends ACP\ListScreen\Post
{
public function __construct() {
parent::__construct( 'bp-email' );
public function __construct()
{
parent::__construct('bp-email');
$this->set_group( 'buddypress' );
}
$this->group = 'buddypress';
}
}
\ No newline at end of file
......
<?php
declare(strict_types=1);
namespace ACA\BP\ListScreen;
use AC;
use AC\ColumnRepository;
use AC\Type\Uri;
use ACA\BP\Column;
use ACA\BP\Editing;
use ACA\BP\ListTable;
use ACA\BP\Table;
use ACP;
use BP_Groups_List_Table;
use ReflectionException;
class Group extends AC\ListScreenWP
implements ACP\Editing\ListScreen {
public function __construct() {
$this->set_key( 'bp-groups' )
->set_screen_id( 'toplevel_page_bp-groups' )
->set_screen_base( 'admin' )
->set_page( 'bp-groups' )
->set_label( __( 'Groups', 'codepress-admin-columns' ) )
->set_group( 'buddypress' );
}
public function get_heading_hookname() {
return 'bp_groups_list_table_get_columns';
}
/**
* @param string $value
* @param string $column_name
* @param array $group
*
* @return string
*/
public function manage_value( $value, $column_name, $group ) {
return $this->get_display_value_by_column_name( $column_name, $group['id'], $value );
}
/**
* @param int $id
*
* @return array
*/
protected function get_object( $id ) {
return (array) groups_get_group( $id );
}
public function set_manage_value_callback() {
add_action( 'bp_groups_admin_get_group_custom_column', [ $this, 'manage_value' ], 100, 3 );
}
public function get_screen_link() {
return add_query_arg( [ 'page' => $this->get_page(), 'layout' => $this->get_layout_id() ], $this->get_admin_url() );
}
/**
* @return BP_Groups_List_Table
*/
public function get_list_table() {
// Hook suffix is required when using the list screen, mainly in Ajax
if ( ! isset( $GLOBALS['hook_suffix'] ) ) {
$GLOBALS['hook_suffix'] = $this->get_screen_id();
}
return new BP_Groups_List_Table();
}
/**
* @throws ReflectionException
*/
protected function register_column_types() {
$this->register_column_types_from_list( [
Column\Group\Avatar::class,
Column\Group\Creator::class,
Column\Group\Description::class,
Column\Group\Id::class,
Column\Group\Name::class,
Column\Group\NameOnly::class,
Column\Group\Status::class,
] );
}
public function get_table_attr_id() {
return '#bp-groups-form';
}
public function editing() {
return new Editing\Strategy\Group();
}
class Group extends AC\ListScreen
implements ACP\Editing\ListScreen, AC\ListScreen\ManageValue, AC\ListScreen\ListTable
{
public function __construct()
{
parent::__construct('bp-groups', 'toplevel_page_bp-groups');
$this->label = __('Groups', 'codepress-admin-columns');
$this->group = 'buddypress';
}
public function get_heading_hookname(): string
{
return 'bp_groups_list_table_get_columns';
}
public function list_table(): AC\ListTable
{
// Hook suffix is required when using the list screen, mainly in Ajax
if ( ! isset($GLOBALS['hook_suffix'])) {
$GLOBALS['hook_suffix'] = $this->get_screen_id();
}
return new ListTable\Group(new BP_Groups_List_Table());
}
public function manage_value(): AC\Table\ManageValue
{
return new Table\ManageValue\Group(new ColumnRepository($this));
}
public function get_table_url(): Uri
{
$url = new AC\Type\Url\ListTable(
'admin.php',
$this->has_id() ? $this->get_id() : null
);
return $url->with_arg('page', 'bp-groups');
}
protected function register_column_types(): void
{
$this->register_column_types_from_list([
Column\Group\Avatar::class,
Column\Group\Creator::class,
Column\Group\Description::class,
Column\Group\Id::class,
Column\Group\Name::class,
Column\Group\NameOnly::class,
Column\Group\Status::class,
]);
}
public function get_table_attr_id(): string
{
return '#bp-groups-form';
}
public function editing()
{
return new Editing\Strategy\Group();
}
}
\ No newline at end of file
......
......@@ -2,39 +2,31 @@
namespace ACA\BP\ListScreenFactory;
use AC;
use AC\ListScreenFactory\ListSettingsTrait;
use AC\ListScreenFactoryInterface;
use AC\ListScreenFactory;
use ACA\BP\ListScreen;
use LogicException;
use WP_Screen;
class Email implements ListScreenFactoryInterface {
class Email extends ListScreenFactory\BaseFactory
{
use ListSettingsTrait;
public function can_create(string $key): bool
{
return 'bp-email' === $key;
}
public function can_create( string $key ): bool {
return 'bp-email' === $key;
}
protected function create_list_screen(string $key): \AC\ListScreen
{
return new ListScreen\Email();
}
public function create( string $key, array $settings = [] ): AC\ListScreen {
if ( ! $this->can_create( $key ) ) {
throw new LogicException( 'Invalid Listscreen key' );
}
public function can_create_from_wp_screen(WP_Screen $screen): bool
{
return $screen->base === 'edit' && $screen->post_type === 'bp-email';
}
return $this->add_settings( new ListScreen\Email(), $settings );
}
public function can_create_by_wp_screen( WP_Screen $screen ): bool {
return $screen->base === 'edit' && $screen->post_type === 'bp-email';
}
public function create_by_wp_screen( WP_Screen $screen, array $settings = [] ): AC\ListScreen {
if ( ! $this->can_create_by_wp_screen( $screen ) ) {
throw new LogicException( 'Invalid Screen' );
}
return $this->add_settings( new ListScreen\Email(), $settings );
}
protected function create_list_screen_from_wp_screen(WP_Screen $screen): \AC\ListScreen
{
return $this->create_list_screen('bp-email');
}
}
\ No newline at end of file
......
......@@ -2,39 +2,31 @@
namespace ACA\BP\ListScreenFactory;
use AC;
use AC\ListScreenFactory\ListSettingsTrait;
use AC\ListScreenFactoryInterface;
use AC\ListScreenFactory;
use ACA\BP\ListScreen;
use LogicException;
use WP_Screen;
class Group implements ListScreenFactoryInterface {
class Group extends ListScreenFactory\BaseFactory
{
use ListSettingsTrait;
public function can_create(string $key): bool
{
return 'bp-groups' === $key;
}
public function can_create( string $key ): bool {
return 'bp-groups' === $key;
}
protected function create_list_screen(string $key): \AC\ListScreen
{
return new ListScreen\Group();
}
public function create( string $key, array $settings = [] ): AC\ListScreen {
if ( ! $this->can_create( $key ) ) {
throw new LogicException( 'Invalid Listscreen key' );
}
public function can_create_from_wp_screen(WP_Screen $screen): bool
{
return $screen->id === 'toplevel_page_bp-groups' && 'edit' !== filter_input(INPUT_GET, 'action');
}
return $this->add_settings( new ListScreen\Group(), $settings );
}
public function can_create_by_wp_screen( WP_Screen $screen ): bool {
return $screen->id === 'toplevel_page_bp-groups' && 'edit' !== filter_input( INPUT_GET, 'action' );
}
public function create_by_wp_screen( WP_Screen $screen, array $settings = [] ): AC\ListScreen {
if ( ! $this->can_create_by_wp_screen( $screen ) ) {
throw new LogicException( 'Invalid Screen' );
}
return $this->add_settings( new ListScreen\Group(), $settings );
}
protected function create_list_screen_from_wp_screen(WP_Screen $screen): \AC\ListScreen
{
return $this->create_list_screen('bp-groups');
}
}
\ No newline at end of file
......
<?php
declare(strict_types=1);
namespace ACA\BP\ListTable;
use AC\ListTable;
use BP_Groups_List_Table;
class Group implements ListTable
{
use ListTable\WpListTableTrait;
public function __construct(BP_Groups_List_Table $table)
{
$this->table = $table;
}
public function get_column_value(string $column, int $id): string
{
return (string)apply_filters('bp_groups_admin_get_group_custom_column', '', $column, $this->get_group($id));
}
public function render_row(int $id): string
{
ob_start();
$this->table->single_row($this->get_group($id));
return ob_get_clean();
}
private function get_group(int $id): array
{
return (array)groups_get_group($id);
}
}
\ No newline at end of file
......@@ -20,7 +20,8 @@ class Admin implements Registerable {
$this->location = $location;
}
public function register() {
public function register(): void
{
add_action( 'ac/admin_scripts', [ $this, 'admin_scripts' ] );
}
......
......@@ -9,7 +9,8 @@ use ReflectionException;
class Columns implements Registerable {
public function register() {
public function register(): void
{
add_action( 'ac/column_groups', [ $this, 'register_column_groups' ] );
add_action( 'acp/column_types', [ $this, 'register_columns' ] );
}
......
......@@ -9,7 +9,8 @@ use AC\Type\ListKey;
final class ListScreens implements Registerable {
public function register() {
public function register(): void
{
add_action( 'ac/list_screen_groups', [ $this, 'register_list_screen_group' ] );
add_filter( 'ac/admin/menu_group', [ $this, 'update_menu_list_groups' ], 10, 2 );
add_action( 'ac/list_keys', [ $this, 'add_list_keys' ] );
......
......@@ -22,7 +22,8 @@ class Table implements Registerable {
$this->location = $location;
}
public function register() {
public function register(): void
{
add_action( 'ac/table/list_screen', [ $this, 'init_editable_table' ] );
add_action( 'ac/table_scripts', [ $this, 'table_scripts' ], 1 );
}
......
......@@ -3,47 +3,56 @@
namespace ACA\BP\Sorting;
use ACA\BP\Column;
use ACP\Search\Query\Bindings;
use ACP\Sorting\AbstractModel;
use ACP\Sorting\Model\QueryBindings;
use ACP\Sorting\Model\SqlOrderByFactory;
use ACP\Sorting\Type\CastType;
use ACP\Sorting\Type\DataType;
use WP_User_Query;
class Profile extends AbstractModel {
/**
* @var Column\Profile
*/
protected $column;
protected $datatype;
public function __construct( Column\Profile $column, DataType $data_type = null ) {
parent::__construct( $data_type );
$this->column = $column;
}
public function get_sorting_vars() {
add_action( 'pre_user_query', [ $this, 'pre_user_query_callback' ] );
return [];
}
public function pre_user_query_callback( WP_User_Query $query ) {
global $wpdb, $bp;
$from = $wpdb->prepare( "
LEFT JOIN {$bp->profile->table_name_data} as acsort_pd
ON $wpdb->users.ID = acsort_pd.user_id AND acsort_pd.field_id = %d
", $this->column->get_buddypress_field_id() );
$query->query_from .= $from;
$query->query_orderby = sprintf( "GROUP BY $wpdb->users.ID ORDER BY %s",
SqlOrderByFactory::create( 'acsort_pd.value', $this->get_order(), [ 'cast_type' => (string) CastType::create_from_data_type( $this->data_type ) ] )
);
remove_action( 'pre_user_query', [ $this, __FUNCTION__ ] );
}
use ACP\Sorting\Type\Order;
class Profile extends AbstractModel implements QueryBindings
{
protected $column;
protected $datatype;
public function __construct(Column\Profile $column, DataType $data_type = null)
{
parent::__construct();
$this->column = $column;
$this->data_type = $data_type ?: new DataType(DataType::STRING);
}
public function create_query_bindings(Order $order): Bindings
{
global $wpdb, $bp;
$bindings = new Bindings();
$bindings->join(
$wpdb->prepare(
"
LEFT JOIN {$bp->profile->table_name_data} as acsort_pd
ON $wpdb->users.ID = acsort_pd.user_id AND acsort_pd.field_id = %d
",
$this->column->get_buddypress_field_id()
)
);
$bindings->group_by("$wpdb->users.ID");
$bindings->order_by(
SqlOrderByFactory::create(
"acsort_pd.value",
(string)$order,
[
'cast_type' => (string)CastType::create_from_data_type($this->data_type),
]
)
);
return $bindings;
}
}
\ No newline at end of file
......
......@@ -2,47 +2,57 @@
namespace ACA\BP\Sorting\User;
use ACP\Search\Query\Bindings;
use ACP\Sorting\AbstractModel;
use ACP\Sorting\Model\QueryBindings;
use ACP\Sorting\Model\SqlOrderByFactory;
use ACP\Sorting\Type\ComputationType;
use WP_User_Query;
class ActivityUpdates extends AbstractModel {
/**
* @var string
*/
private $activity_type;
public function __construct( $activity_type ) {
parent::__construct();
$this->activity_type = (string) $activity_type;
}
public function get_sorting_vars() {
add_action( 'pre_user_query', [ $this, 'pre_user_query_callback' ] );
return [];
}
public function pre_user_query_callback( WP_User_Query $query ) {
global $wpdb, $bp;
$where = '';
if ( $this->activity_type ) {
$where = $wpdb->prepare( 'AND acsort_activity.type = %s', $this->activity_type );
}
$query->query_from .= "
LEFT JOIN {$bp->activity->table_name} as acsort_activity
ON {$wpdb->users}.ID = acsort_activity.user_id {$where}
";
$query->query_orderby = sprintf( "GROUP BY {$wpdb->users}.ID ORDER BY %s",
SqlOrderByFactory::create_with_computation( new ComputationType( ComputationType::COUNT ), "acsort_activity.user_id", $this->get_order() )
);
remove_action( 'pre_user_query', [ $this, __FUNCTION__ ] );
}
use ACP\Sorting\Type\Order;
class ActivityUpdates extends AbstractModel implements QueryBindings
{
/**
* @var string
*/
private $activity_type;
public function __construct($activity_type)
{
parent::__construct();
$this->activity_type = (string)$activity_type;
}
public function create_query_bindings(Order $order): Bindings
{
global $wpdb, $bp;
$bindings = new Bindings();
$alias = $bindings->get_unique_alias('activity');
$where = '';
if ($this->activity_type) {
$where = $wpdb->prepare("AND $alias.type = %s", $this->activity_type);
}
$bindings->join(
"
LEFT JOIN {$bp->activity->table_name} as $alias
ON {$wpdb->users}.ID = $alias.user_id {$where}
"
);
$bindings->group_by("$wpdb->users.ID");
$bindings->order_by(
SqlOrderByFactory::create_with_computation(
new ComputationType(ComputationType::COUNT),
"$alias.user_id",
(string)$order
)
);
return $bindings;
}
}
\ No newline at end of file
......
<?php
declare(strict_types=1);
namespace ACA\BP\Table\ManageValue;
use AC\Table\ManageValue;
class Group extends ManageValue
{
public function register(): void
{
add_filter('bp_groups_admin_get_group_custom_column', [$this, 'render_value'], 100, 3);
}
public function render_value($value, $column_name, $group): ?string
{
return $this->render_cell((string)$column_name, (int)$group['id'], (string)$value);
}
}
\ No newline at end of file
......@@ -13,77 +13,98 @@ use ACP\ConditionalFormat;
use ACP\Sorting\Model\MetaFormatFactory;
class Organizer extends Meta
implements AC\Column\Relation, ACP\Export\Exportable, ACP\Search\Searchable, ConditionalFormat\Formattable {
use ConditionalFormat\FilteredHtmlFormatTrait;
public function __construct() {
$this->set_type( 'column-ec-event_organizer' )
->set_label( __( 'Organizer', 'codepress-admin-columns' ) );
parent::__construct();
}
public function get_relation_object() {
return new AC\Relation\Post( 'tribe_organizer' );
}
public function get_meta_key() {
return '_EventOrganizerID';
}
public function get_value( $id ) {
$post_ids = $this->get_raw_value( $id );
if ( ! $post_ids ) {
return $this->get_empty_char();
}
$values = [];
foreach ( $post_ids as $_id ) {
$values[] = $this->get_formatted_value( $_id, $_id );
}
$setting_limit = $this->get_setting( 'number_of_items' );
return ac_helper()->html->more( $values, $setting_limit ? $setting_limit->get_value() : false );
}
public function get_raw_value( $id ) {
$value = $this->get_meta_value( $id, $this->get_meta_key(), false );
$value = array_filter( $value );
if ( ! $value ) {
return false;
}
return $value;
}
public function register_settings() {
$this->add_setting( new Settings\OrganizerDisplay( $this ) );
$this->add_setting( new AC\Settings\Column\NumberOfItems( $this ) );
}
public function editing() {
return new Editing\Service\Event\Organizer();
}
public function filtering() {
return new Filtering\RelatedPost( $this );
}
public function sorting() {
return ( new MetaFormatFactory() )->create( $this->get_meta_type(), $this->get_meta_key(), new ACP\Sorting\FormatValue\PostTitle() );
}
public function export() {
return new ACP\Export\Model\StrippedValue( $this );
}
public function search() {
return new Search\Event\Relation( $this->get_meta_key(), $this->get_meta_type(), $this->get_relation_object() );
}
implements AC\Column\Relation, ACP\Export\Exportable, ACP\Search\Searchable, ConditionalFormat\Formattable
{
use ConditionalFormat\FilteredHtmlFormatTrait;
public function __construct()
{
$this->set_type('column-ec-event_organizer')
->set_label(__('Organizer', 'codepress-admin-columns'));
parent::__construct();
}
public function get_relation_object()
{
return new AC\Relation\Post('tribe_organizer');
}
public function get_meta_key()
{
return '_EventOrganizerID';
}
public function get_value($id)
{
$post_ids = $this->get_raw_value($id);
if ( ! $post_ids) {
return $this->get_empty_char();
}
$values = [];
foreach ($post_ids as $_id) {
$values[] = $this->get_formatted_value($_id, $_id);
}
$setting_limit = $this->get_setting('number_of_items');
return ac_helper()->html->more($values, $setting_limit ? $setting_limit->get_value() : false);
}
public function get_raw_value($id)
{
$value = $this->get_meta_value($id, $this->get_meta_key(), false);
$value = array_filter($value);
if ( ! $value) {
return false;
}
return $value;
}
public function register_settings()
{
$this->add_setting(new Settings\OrganizerDisplay($this));
$this->add_setting(new AC\Settings\Column\NumberOfItems($this));
}
public function editing()
{
return new Editing\Service\Event\Organizer();
}
public function filtering()
{
return new Filtering\RelatedPost($this);
}
public function sorting()
{
return (new MetaFormatFactory())->create(
$this->get_meta_type(),
$this->get_meta_key(),
new ACP\Sorting\FormatValue\PostTitle(),
null,
[
'taxonomy' => $this->get_taxonomy(),
'post_type' => $this->get_post_type(),
]
);
}
public function export()
{
return new ACP\Export\Model\StrippedValue($this);
}
public function search()
{
return new Search\Event\Relation($this->get_meta_key(), $this->get_meta_type(), $this->get_relation_object());
}
}
\ No newline at end of file
......
......@@ -8,8 +8,8 @@ use ACA\EC\Editing;
use ACA\EC\Filtering;
use ACA\EC\Search;
use ACA\EC\Settings;
use ACP\ConditionalFormat;
use ACP;
use ACP\ConditionalFormat;
class Venue extends Meta
implements AC\Column\Relation, ACP\Export\Exportable, ACP\Search\Searchable, ACP\ConditionalFormat\Formattable {
......
......@@ -2,8 +2,8 @@
namespace ACA\EC\Column\Venue;
use ACP\ConditionalFormat;
use ACA\EC\Column\Meta;
use ACP\ConditionalFormat;
use ACP\Search\Comparison\Meta\Text;
use ACP\Search\Searchable;
......
......@@ -5,8 +5,8 @@ namespace ACA\EC\Column\Venue;
use AC;
use ACA\EC\Column;
use ACA\EC\Filtering;
use ACP\ConditionalFormat;
use ACP;
use ACP\ConditionalFormat;
class UpcomingEvent extends Column\UpcomingEvent
implements AC\Column\Relation, ACP\Filtering\Filterable, ConditionalFormat\Formattable {
......
<?php
declare(strict_types=1);
namespace ACA\EC;
use AC;
use AC\Registerable;
use ACA\EC\ImportListscreens;
use AC\Services;
use ACP\Service\IntegrationStatus;
use ACP\Storage\ListScreen\DecoderFactory;
final class EventsCalendar implements Registerable {
private $location;
public function __construct( AC\Asset\Location\Absolute $location ) {
$this->location = $location;
}
public function register() {
if ( ! class_exists( 'Tribe__Events__Main', false ) ) {
return;
}
$services = [
new Service\ColumnGroups(),
new Service\ListScreens(),
new Service\Scripts( $this->location ),
new Service\TableScreen( $this->location ),
new ImportListscreens\Message( new ImportListscreens\ImportedSetting() ),
new ImportListscreens\Controller( new AC\Request(), AC()->get_storage(), new DecoderFactory( new AC\ListScreenFactory() ), $this->location ),
new IntegrationStatus( 'ac-addon-events-calendar' ),
];
array_map( [ $this, 'register_service' ], $services );
}
private function register_service( Registerable $service ) {
$service->register();
}
final class EventsCalendar implements Registerable
{
private $location;
public function __construct(AC\Asset\Location\Absolute $location)
{
$this->location = $location;
}
public function register(): void
{
if ( ! class_exists('Tribe__Events__Main', false)) {
return;
}
$this->create_services()->register();
}
private function create_services(): Services
{
return new Services([
new Service\ColumnGroups(),
new Service\ListScreens(),
new Service\Scripts($this->location),
new Service\TableScreen($this->location),
new IntegrationStatus('ac-addon-events-calendar'),
]);
}
}
\ No newline at end of file
......
......@@ -5,33 +5,29 @@ namespace ACA\EC\Export\Strategy;
use ACA\EC\ListScreen;
use ACP;
/**
* Exportability class for events list screen
* @since 1.0.2
*/
class Event extends ACP\Export\Strategy\Post {
public function __construct( ListScreen\Event $list_screen ) {
parent::__construct( $list_screen );
}
/**
* @since 1.0
* @see ACP_Export_ExportableListScreen::ajax_export()
*/
protected function ajax_export(): void {
parent::ajax_export();
/**
* The Events Calender runs 'post_limits' to alter the limit for the admin list. In order for Export to work, we have to make sure the default 'WordPress' limit is used based on our query arguments
*/
add_filter( 'post_limits', [ $this, 'modify_posts_limit' ], 1 );
}
public function modify_posts_limit( $limit ): string {
remove_filter( 'post_limits', [ 'Tribe__Events__Admin_List', 'events_search_limits' ] );
return $limit;
}
class Event extends ACP\Export\Strategy\Post
{
public function __construct(ListScreen\Event $list_screen)
{
parent::__construct($list_screen);
}
protected function ajax_export(): void
{
parent::ajax_export();
/**
* The Events Calander runs 'post_limits' to alter the limit for the admin list. In order for Export to work, we have to make sure the default 'WordPress' limit is used based on our query arguments
*/
add_filter('post_limits', [$this, 'modify_posts_limit'], 1);
}
public function modify_posts_limit($limit): string
{
remove_filter('post_limits', ['Tribe__Events__Admin_List', 'events_search_limits']);
return $limit;
}
}
\ No newline at end of file
......
<?php
namespace ACA\EC\ImportListscreens;
use AC;
use ACP\Storage\ListScreen\DecoderFactory;
use ACP\Storage\ListScreen\EncodedCollection;
use ACP\Storage\ListScreen\Unserializer\JsonUnserializer;
class Controller implements AC\Registerable {
const ACTION_KEY = 'aca_ec_action';
const IMPORT_METHOD_KEY = 'import-sets';
const DISMISS_METHOD_KEY = 'dismiss-import';
/**
* @var AC\Request
*/
private $request;
/**
* @var ImportedSetting
*/
private $setting;
/**
* @var DecoderFactory
*/
private $decoder_factory;
/**
* @var AC\ListScreenRepository\Storage
*/
private $storage;
/**
* @var AC\Asset\Location\Absolute
*/
private $location;
public function __construct( AC\Request $request, AC\ListScreenRepository\Storage $storage, DecoderFactory $decoder_factory, AC\Asset\Location\Absolute $location ) {
$this->request = $request;
$this->decoder_factory = $decoder_factory;
$this->storage = $storage;
$this->setting = new ImportedSetting();
$this->location = $location;
}
public function register() {
add_action( 'admin_init', [ $this, 'handle_request' ] );
}
public function handle_request() {
$action = $this->request->get( self::ACTION_KEY );
if ( ! $action || ! in_array( $action, [ self::DISMISS_METHOD_KEY, self::IMPORT_METHOD_KEY ], true ) ) {
return;
}
switch ( $action ) {
case self::IMPORT_METHOD_KEY:
$this->import();
$this->setting->mark_as_imported();
break;
case self::DISMISS_METHOD_KEY:
$this->setting->mark_as_imported();
break;
}
wp_redirect( remove_query_arg( self::ACTION_KEY ) );
exit;
}
private function import() {
if ( $this->setting->is_imported() ) {
return;
}
$file_content = file_get_contents( $this->location->with_suffix( '/export/events.json' )->get_path() );
$encoded_list_screens = ( new JsonUnserializer() )->unserialize( $file_content );
if ( ! EncodedCollection::is_valid_collection( $encoded_list_screens ) ) {
return;
}
$encoded_collection = new EncodedCollection( $encoded_list_screens, $this->decoder_factory );
foreach ( $encoded_collection as $encoded_list_screen ) {
if ( ! $encoded_collection->can_decode( $encoded_list_screen ) ) {
continue;
}
$list_screen = $encoded_collection->decode( $encoded_list_screen );
$this->storage->save( $list_screen );
}
}
}
\ No newline at end of file
<?php
namespace ACA\EC\ImportListscreens;
final class ImportedSetting {
const IMPORTED_KEY = 'aca_ec_layouts_imported';
public function is_imported() {
return (bool) get_option( self::IMPORTED_KEY );
}
public function mark_as_imported() {
return update_option( self::IMPORTED_KEY, true );
}
public function delete() {
delete_option( self::IMPORTED_KEY );
}
}
\ No newline at end of file
<?php
namespace ACA\EC\ImportListscreens;
use AC;
class Message implements AC\Registerable {
/**
* @var ImportedSetting
*/
private $setting;
public function __construct( ImportedSetting $setting ) {
$this->setting = $setting;
}
public function register() {
add_action( 'ac/settings/after_title', [ $this, 'display' ] );
}
public function display( AC\ListScreen $list_screen ) {
if ( ! $list_screen instanceof AC\ListScreen\Post ) {
return;
}
if ( ! in_array( $list_screen->get_post_type(), [ 'tribe_events', 'tribe_venue', 'tribe_organizer' ] ) ) {
return;
}
if ( $this->setting->is_imported() ) {
return;
}
$this->display_import_layout_message();
}
public function display_import_layout_message() {
?>
<div class="notice notice-success">
<p>
<?php printf( __( 'Enable our predefined column sets for %s?', 'codepress-admin-columns' ), __( 'The Events Calendar', 'the-events-calendar' ) ); ?>
<a href="<?= add_query_arg( Controller::ACTION_KEY, Controller::IMPORT_METHOD_KEY ) ?>" class="notice__actionlink">Yes</a>
<a href="<?= add_query_arg( Controller::ACTION_KEY, Controller::DISMISS_METHOD_KEY ) ?>" class="notice__actionlink">No thanks</a>
</p>
</div>
<?php
}
}
\ No newline at end of file
......@@ -15,7 +15,8 @@ class Event extends ACP\ListScreen\Post {
$this->set_group( 'events-calendar' );
}
protected function register_column_types() {
protected function register_column_types(): void
{
parent::register_column_types();
$this->register_column_types_from_list( [
......
......@@ -2,8 +2,8 @@
namespace ACA\EC\ListScreen;
use ACP;
use ACA\EC\Column;
use ACP;
class EventSeries extends ACP\ListScreen\Post {
......@@ -13,7 +13,8 @@ class EventSeries extends ACP\ListScreen\Post {
$this->set_group( 'events-calendar' );
}
protected function register_column_types() {
protected function register_column_types(): void
{
parent::register_column_types();
$this->register_column_types_from_list( [
......
......@@ -13,7 +13,8 @@ class Organizer extends ACP\ListScreen\Post {
$this->set_group( 'events-calendar' );
}
protected function register_column_types() {
protected function register_column_types(): void
{
parent::register_column_types();
$this->register_column_types_from_list( [
......
......@@ -13,7 +13,8 @@ class Venue extends ACP\ListScreen\Post {
$this->set_group( 'events-calendar' );
}
protected function register_column_types() {
protected function register_column_types(): void
{
parent::register_column_types();
$this->register_column_types_from_list( [
......
......@@ -3,38 +3,31 @@
namespace ACA\EC\ListScreenFactory;
use AC\ListScreen;
use AC\ListScreenFactory\ListSettingsTrait;
use AC\ListScreenFactoryInterface;
use AC\ListScreenFactory;
use ACA\EC\ListScreen\Event;
use LogicException;
use WP_Screen;
class EventFactory implements ListScreenFactoryInterface {
class EventFactory extends ListScreenFactory\BaseFactory
{
use ListSettingsTrait;
public function can_create(string $key): bool
{
return 'tribe_events' === $key;
}
public function can_create( string $key ): bool {
return 'tribe_events' === $key;
}
protected function create_list_screen(string $key): ListScreen
{
return new Event();
}
public function create( string $key, array $settings = [] ): ListScreen {
if ( ! $this->can_create( $key ) ) {
throw new LogicException( 'Invalid Listscreen key' );
}
public function can_create_from_wp_screen(WP_Screen $screen): bool
{
return $screen->base === 'edit' && $screen->post_type === 'tribe_events';
}
return $this->add_settings( new Event(), $settings );
}
public function can_create_by_wp_screen( WP_Screen $screen ): bool {
return $screen->base === 'edit' && $screen->post_type === 'tribe_events';
}
public function create_by_wp_screen( WP_Screen $screen, array $settings = [] ): ListScreen {
if ( ! $this->can_create_by_wp_screen( $screen ) ) {
throw new LogicException( 'Invalid Screen' );
}
return $this->add_settings( new Event(), $settings );
}
protected function create_list_screen_from_wp_screen(WP_Screen $screen): ListScreen
{
return $this->create_list_screen('tribe_events');
}
}
\ No newline at end of file
......
......@@ -3,38 +3,31 @@
namespace ACA\EC\ListScreenFactory;
use AC\ListScreen;
use AC\ListScreenFactory\ListSettingsTrait;
use AC\ListScreenFactoryInterface;
use AC\ListScreenFactory;
use ACA\EC\ListScreen\EventSeries;
use LogicException;
use WP_Screen;
class EventSeriesFactory implements ListScreenFactoryInterface {
class EventSeriesFactory extends ListScreenFactory\BaseFactory
{
use ListSettingsTrait;
public function can_create(string $key): bool
{
return 'tribe_event_series' === $key;
}
public function can_create( string $key ): bool {
return 'tribe_event_series' === $key;
}
protected function create_list_screen(string $key): ListScreen
{
return new EventSeries();
}
public function create( string $key, array $settings = [] ): ListScreen {
if ( ! $this->can_create( $key ) ) {
throw new LogicException( 'Invalid Listscreen key' );
}
public function can_create_from_wp_screen(WP_Screen $screen): bool
{
return $screen->base === 'edit' && $screen->post_type === 'tribe_event_series';
}
return $this->add_settings( new EventSeries(), $settings );
}
public function can_create_by_wp_screen( WP_Screen $screen ): bool {
return $screen->base === 'edit' && $screen->post_type === 'tribe_event_series';
}
public function create_by_wp_screen( WP_Screen $screen, array $settings = [] ): ListScreen {
if ( ! $this->can_create_by_wp_screen( $screen ) ) {
throw new LogicException( 'Invalid Screen' );
}
return $this->add_settings( new EventSeries(), $settings );
}
protected function create_list_screen_from_wp_screen(WP_Screen $screen): ListScreen
{
return $this->create_list_screen('tribe_event_series');
}
}
\ No newline at end of file
......
......@@ -3,38 +3,31 @@
namespace ACA\EC\ListScreenFactory;
use AC\ListScreen;
use AC\ListScreenFactory\ListSettingsTrait;
use AC\ListScreenFactoryInterface;
use AC\ListScreenFactory;
use ACA\EC\ListScreen\Organizer;
use LogicException;
use WP_Screen;
class OrganizerFactory implements ListScreenFactoryInterface {
class OrganizerFactory extends ListScreenFactory\BaseFactory
{
use ListSettingsTrait;
public function can_create(string $key): bool
{
return 'tribe_organizer' === $key;
}
public function can_create( string $key ): bool {
return 'tribe_organizer' === $key;
}
protected function create_list_screen(string $key): ListScreen
{
return new Organizer();
}
public function create( string $key, array $settings = [] ): ListScreen {
if ( ! $this->can_create( $key ) ) {
throw new LogicException( 'Invalid Listscreen key' );
}
public function can_create_from_wp_screen(WP_Screen $screen): bool
{
return $screen->base === 'edit' && $screen->post_type === 'tribe_organizer';
}
return $this->add_settings( new Organizer(), $settings );
}
public function can_create_by_wp_screen( WP_Screen $screen ): bool {
return $screen->base === 'edit' && $screen->post_type === 'tribe_organizer';
}
public function create_by_wp_screen( WP_Screen $screen, array $settings = [] ): ListScreen {
if ( ! $this->can_create_by_wp_screen( $screen ) ) {
throw new LogicException( 'Invalid Screen' );
}
return $this->add_settings( new Organizer(), $settings );
}
protected function create_list_screen_from_wp_screen(WP_Screen $screen): ListScreen
{
return $this->create_list_screen('tribe_organizer');
}
}
\ No newline at end of file
......
......@@ -3,38 +3,31 @@
namespace ACA\EC\ListScreenFactory;
use AC\ListScreen;
use AC\ListScreenFactory\ListSettingsTrait;
use AC\ListScreenFactoryInterface;
use AC\ListScreenFactory;
use ACA\EC\ListScreen\Venue;
use LogicException;
use WP_Screen;
class VenueFactory implements ListScreenFactoryInterface {
class VenueFactory extends ListScreenFactory\BaseFactory
{
use ListSettingsTrait;
public function can_create(string $key): bool
{
return 'tribe_venue' === $key;
}
public function can_create( string $key ): bool {
return 'tribe_venue' === $key;
}
protected function create_list_screen(string $key): ListScreen
{
return new Venue();
}
public function create( string $key, array $settings = [] ): ListScreen {
if ( ! $this->can_create( $key ) ) {
throw new LogicException( 'Invalid Listscreen key' );
}
public function can_create_from_wp_screen(WP_Screen $screen): bool
{
return $screen->base === 'edit' && $screen->post_type === 'tribe_venue';
}
return $this->add_settings( new Venue(), $settings );
}
public function can_create_by_wp_screen( WP_Screen $screen ): bool {
return $screen->base === 'edit' && $screen->post_type === 'tribe_venue';
}
public function create_by_wp_screen( WP_Screen $screen, array $settings = [] ): ListScreen {
if ( ! $this->can_create_by_wp_screen( $screen ) ) {
throw new LogicException( 'Invalid Screen' );
}
return $this->add_settings( new Venue(), $settings );
}
protected function create_list_screen_from_wp_screen(WP_Screen $screen): ListScreen
{
return $this->create_list_screen('tribe_venue');
}
}
\ No newline at end of file
......
......@@ -2,7 +2,6 @@
namespace ACA\EC\Service;
use AC;
use AC\Groups;
use AC\Registerable;
......@@ -11,7 +10,8 @@ final class ColumnGroups implements Registerable {
const EVENTS_CALENDAR = 'events_calendar';
const EVENTS_CALENDAR_FIELDS = 'events_calendar_fields';
public function register() {
public function register(): void
{
add_action( 'ac/column_groups', [ $this, 'register_column_groups' ] );
}
......
<?php
declare(strict_types=1);
namespace ACA\EC\Service;
use AC;
......@@ -8,13 +10,14 @@ use ACA\EC\ListScreenFactory;
final class ListScreens implements Registerable {
public function register() {
AC\ListScreenFactory::add( new ListScreenFactory\EventFactory() );
AC\ListScreenFactory::add( new ListScreenFactory\OrganizerFactory() );
AC\ListScreenFactory::add( new ListScreenFactory\VenueFactory() );
public function register(): void
{
AC\ListScreenFactory\Aggregate::add( new ListScreenFactory\EventFactory() );
AC\ListScreenFactory\Aggregate::add( new ListScreenFactory\OrganizerFactory() );
AC\ListScreenFactory\Aggregate::add( new ListScreenFactory\VenueFactory() );
if ( post_type_exists( 'tribe_event_series' ) ) {
AC\ListScreenFactory::add( new ListScreenFactory\EventSeriesFactory() );
AC\ListScreenFactory\Aggregate::add( new ListScreenFactory\EventSeriesFactory() );
}
add_action( 'ac/list_screen_groups', [ $this, 'register_list_screen_groups' ] );
......
......@@ -17,7 +17,8 @@ final class Scripts implements Registerable {
$this->location = $location;
}
public function register() {
public function register(): void
{
add_action( 'ac/admin_scripts', [ $this, 'admin_scripts' ] );
}
......
body[class*=_page_gf_entries].acp-overflow-table .acp-hts-wrapper{max-width:100%;min-width:100%;margin-bottom:0}body[class*=_page_gf_entries].acp-overflow-table .gform-settings__wrapper{display:block !important;max-width:none}body[class*=_page_gf_entries].acp-overflow-table .acp-scrolling-indicator{display:none !important}body[class*=_page_gf_entries] .ac-table-actions{margin-top:5px}body[class*=_page_gf_entries] #ac-s{display:none}body[class*=_page_gf_entries] .layout-switcher{padding-left:0;align-self:center;height:26px;margin-right:10px}body[class*=_page_gf_entries] .layout-switcher select{font-size:14px;height:38px;max-width:150px}body[class*=_page_gf_entries] .gf-acs-button-container{display:flex;align-items:center}body[class*=_page_gf_entries] .tablenav{position:relative;z-index:1}body[class*=_page_gf_entries] #gf-acs-form{margin:10px 0;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.04);border:1px solid #e5e5e5;padding:8px 10px;display:flex;position:relative;z-index:1}body[class*=_page_gf_entries] #gf-acs-form #ac-s{display:block}body[class*=_page_gf_entries] #gf-acs-form button.ac-button__segments{vertical-align:bottom !important;transform:translateY(-5px)}body[class*=_page_gf_entries] #gf-acs-form .button{height:30px;padding:0 8px;line-height:12px}body[class*=_page_gf_entries] #gf-acs-form .rule-container{background:none;box-shadow:none !important}body[class*=_page_gf_entries] #gf-acs-form .rule-container.has-error{background-color:#ffe5e2}body[class*=_page_gf_entries] .ui-datepicker .ui-datepicker-header{max-width:90%}body[class*=_page_gf_entries] .ui-datepicker .ui-datepicker-header .ui-datepicker-prev,body[class*=_page_gf_entries] .ui-datepicker .ui-datepicker-header .ui-datepicker-next{top:calc(50% - 3px) !important}body[class*=_page_gf_entries] .ui-datepicker .ui-datepicker-header .ui-datepicker-prev:before,body[class*=_page_gf_entries] .ui-datepicker .ui-datepicker-header .ui-datepicker-next:before{font-family:revert}body[class*=_page_gf_entries] .ui-datepicker .ui-datepicker-header .ui-datepicker-next{top:50% !important}.wp-list-table td .gfield_list td,.wp-list-table td .gfield_list th{padding:3px;padding-right:10px}.wp-list-table th#is_starred span{font-size:15px;color:#aaa;vertical-align:middle;margin-bottom:-4px}
body[class*=_page_gf_entries].acp-overflow-table .acp-hts-wrapper{max-width:100%;min-width:100%;margin-bottom:0}body[class*=_page_gf_entries].acp-overflow-table .gform-settings__wrapper{display:block !important;max-width:none}body[class*=_page_gf_entries].acp-overflow-table .acp-scrolling-indicator{display:none !important}body[class*=_page_gf_entries] .ac-table-actions{margin-top:5px}body[class*=_page_gf_entries] #ac-s{display:none}body[class*=_page_gf_entries] .acp-layout-switcher{padding-left:0;align-self:center;height:26px;margin-right:10px}body[class*=_page_gf_entries] .acp-layout-switcher select{font-size:14px;height:38px;max-width:150px}body[class*=_page_gf_entries] .gf-acs-button-container{display:flex;align-items:center}body[class*=_page_gf_entries] .tablenav{position:relative;z-index:1}body[class*=_page_gf_entries] #gf-acs-form{margin:10px 0;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.04);border:1px solid #e5e5e5;padding:8px 10px;display:flex;position:relative;z-index:1}body[class*=_page_gf_entries] #gf-acs-form #ac-s{display:block}body[class*=_page_gf_entries] #gf-acs-form button.ac-button__segments{vertical-align:bottom !important;transform:translateY(-5px)}body[class*=_page_gf_entries] #gf-acs-form .button{height:30px;padding:0 8px;line-height:12px}body[class*=_page_gf_entries] #gf-acs-form .rule-container{background:none;box-shadow:none !important}body[class*=_page_gf_entries] #gf-acs-form .rule-container.has-error{background-color:#ffe5e2}body[class*=_page_gf_entries] .ui-datepicker .ui-datepicker-header{max-width:90%}body[class*=_page_gf_entries] .ui-datepicker .ui-datepicker-header .ui-datepicker-prev,body[class*=_page_gf_entries] .ui-datepicker .ui-datepicker-header .ui-datepicker-next{top:calc(50% - 3px) !important}body[class*=_page_gf_entries] .ui-datepicker .ui-datepicker-header .ui-datepicker-prev:before,body[class*=_page_gf_entries] .ui-datepicker .ui-datepicker-header .ui-datepicker-next:before{font-family:revert}body[class*=_page_gf_entries] .ui-datepicker .ui-datepicker-header .ui-datepicker-next{top:50% !important}.wp-list-table td .gfield_list td,.wp-list-table td .gfield_list th{padding:3px;padding-right:10px}.wp-list-table th#is_starred span{font-size:15px;color:#aaa;vertical-align:middle;margin-bottom:-4px}
......
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";r.r(t);class n{place(){let e=o(),t=document.querySelector(".gform-settings__content"),r=document.querySelector("#ac-s");t&&r&&(t.parentElement.insertBefore(e,t),e.append(r),e.insertAdjacentHTML("beforeend",'<div class="gf-acs-button-container"><button class="button">Filter</button></div>'))}}const o=()=>{let e=document.createElement("form");e.id="gf-acs-form",e.addEventListener("submit",()=>{let t=AC_SERVICES.getService("Search").getRules();if(AC_SERVICES.getService("Search").disableFields(),0===t.rules.length)return;let r=document.createElement("input");r.type="hidden",r.name="ac-rules",r.value=JSON.stringify(t),e.append(r)});const t=new URLSearchParams(window.location.search);return["page","id"].forEach(r=>{let n=t.get(r);n&&e.insertAdjacentHTML("afterbegin",`<input type="hidden" name="${r}" value="${n}">`)}),e};document.addEventListener("DOMContentLoaded",()=>{let e=document.querySelector("#gf_form_toolbar");e&&e.insertAdjacentHTML("afterend",'<div class="wp-header-end"></div>')}),AC_SERVICES.addListener("Table.Ready",()=>{var e,t;let r=document.querySelector(".layout-switcher"),n=document.querySelector(".gform-form-toolbar__container #gform-form-toolbar__menu");if(r&&n&&n.parentElement.insertBefore(r,n),AC.list_screen.indexOf("gf_entry")>-1){let r=document.querySelector(".tablenav-pages .displaying-num");if(r){let n=r.innerHTML.split(" ")[0],o=n.replace(",","").replace(".","");"undefined"!=typeof ACP_Export&&(ACP_Export.total_num_items=o),null===(t=null===(e=AC_SERVICES.getService("Editing"))||void 0===e?void 0:e.getService("BulkSelectionRow"))||void 0===t||t.setTotalItems(parseInt(o),n)}}}),AC_SERVICES.addListener("Service.Registered.Search",e=>{e.placementFactory.register("gravity_forms_entry",new n)})}]);
\ No newline at end of file
(()=>{"use strict";class e{place(){let e=t(),n=document.querySelector(".gform-settings__content"),r=document.querySelector("#ac-s");n&&r&&(n.parentElement.insertBefore(e,n),e.append(r),e.insertAdjacentHTML("beforeend",'<div class="gf-acs-button-container"><button class="button">Filter</button></div>'))}}const t=()=>{let e=document.createElement("form");e.id="gf-acs-form",e.addEventListener("submit",(()=>{let t=AC_SERVICES.getService("Search").getRules();if(AC_SERVICES.getService("Search").disableFields(),0===t.rules.length)return;let n=document.createElement("input");n.type="hidden",n.name="ac-rules",n.value=JSON.stringify(t),e.append(n)}));const t=new URLSearchParams(window.location.search);return["page","id"].forEach((n=>{let r=t.get(n);r&&e.insertAdjacentHTML("afterbegin",`<input type="hidden" name="${n}" value="${r}">`)})),e};ACP_TABLE&&ACP_TABLE.hasOwnProperty("column_sets_style")&&(ACP_TABLE.column_sets_style="dropdown"),document.addEventListener("DOMContentLoaded",(()=>{let e=document.querySelector("#gf_form_toolbar");e&&e.insertAdjacentHTML("afterend",'<div class="wp-header-end"></div>')})),AC_SERVICES.addListener("Table.Ready",(()=>{var e,t;const n=document.querySelector(".acp-layout-switcher"),r=document.querySelector(".gform-form-toolbar__container #gform-form-toolbar__menu");if(n&&r&&r.parentElement.insertBefore(n,r),AC.list_screen.indexOf("gf_entry")>-1){let n=document.querySelector(".tablenav-pages .displaying-num");if(n){let r=n.innerHTML.split(" ")[0],o=r.replace(",","").replace(".","");"undefined"!=typeof ACP_Export&&(ACP_Export.total_num_items=o),null===(t=null===(e=AC_SERVICES.getService("Editing"))||void 0===e?void 0:e.getService("BulkSelectionRow"))||void 0===t||t.setTotalItems(parseInt(o),r)}}})),AC_SERVICES.addListener("Service.Registered.LayoutTabs",(e=>{if("tabs"===e.getStyle()){const t=e.getElement(),n=document.querySelector("#gf-admin-notices-wrapper");n&&t&&t.insertSelfBefore(n)}})),AC_SERVICES.addListener("Service.Registered.Search",(t=>{t.placementFactory.register("gravity_forms_entry",new e)}))})();
\ No newline at end of file
......
......@@ -11,7 +11,8 @@ use ACP\Type\HideOnScreen\Group;
final class Admin implements AC\Registerable {
public function register() {
public function register(): void
{
add_action( 'acp/admin/settings/hide_on_screen', [ $this, 'add_hide_on_screen' ], 10, 2 );
}
......
......@@ -7,64 +7,70 @@ use ACA\GravityForms\Column;
use ACA\GravityForms\FieldFactory;
use ACA\GravityForms\ListScreen;
final class EntryConfigurator implements AC\Registerable {
private $form_id;
private $column_factory;
private $field_factory;
public function __construct( $form_id, EntryFactory $column_factory, FieldFactory $field_factory ) {
$this->form_id = (int) $form_id;
$this->column_factory = $column_factory;
$this->field_factory = $field_factory;
}
public function register() {
add_action( 'ac/list_screen/column_created', [ $this, 'configure_column' ] );
}
public function configure_column( AC\Column $column ): void {
if ( ! $column instanceof Column\Entry ) {
return;
}
$list_screen = $column->get_list_screen();
if ( ! $list_screen instanceof ListScreen\Entry ) {
return;
}
if ( $list_screen->get_form_id() !== $this->form_id ) {
return;
}
$column->set_field( $this->field_factory->create( $this->get_field_id_by_type( $column->get_type() ), $this->form_id ) );
}
private function get_field_id_by_type( $type ) {
return str_replace( 'field_id-', '', $type );
}
public function register_entry_columns( ListScreen\Entry $list_screen ): void {
foreach ( ( new AC\DefaultColumnsRepository() )->get( $list_screen->get_key() ) as $type => $label ) {
$field_id = $this->get_field_id_by_type( $type );
$form_id = $list_screen->get_form_id();
if ( ! $this->column_factory->has_field( $field_id, $form_id ) ) {
continue;
}
$column = $this->column_factory->create( $field_id, $form_id );
$column->set_type( $type )
->set_label( $label )
->set_list_screen( $list_screen );
$this->configure_column( $column );
$list_screen->register_column_type( $column );
}
}
final class EntryConfigurator implements AC\Registerable
{
private $form_id;
private $column_factory;
private $field_factory;
public function __construct($form_id, EntryFactory $column_factory, FieldFactory $field_factory)
{
$this->form_id = (int)$form_id;
$this->column_factory = $column_factory;
$this->field_factory = $field_factory;
}
public function register(): void
{
add_action('ac/list_screen/column_created', [$this, 'configure_column'], 10, 2);
}
public function configure_column(AC\Column $column, AC\ListScreen $list_screen): void
{
if ( ! $column instanceof Column\Entry) {
return;
}
if ( ! $list_screen instanceof ListScreen\Entry) {
return;
}
if ($list_screen->get_form_id() !== $this->form_id) {
return;
}
$column->set_field(
$this->field_factory->create($this->get_field_id_by_type($column->get_type()), $this->form_id)
);
}
private function get_field_id_by_type($type)
{
return str_replace('field_id-', '', $type);
}
public function register_entry_columns(ListScreen\Entry $list_screen): void
{
foreach ((new AC\DefaultColumnsRepository())->get($list_screen->get_key()) as $type => $label) {
$field_id = $this->get_field_id_by_type($type);
$form_id = $list_screen->get_form_id();
if ( ! $this->column_factory->has_field($field_id, $form_id)) {
continue;
}
$column = $this->column_factory->create($field_id, $form_id);
$column->set_type($type)
->set_label($label)
->set_list_screen($list_screen);
$this->configure_column($column, $list_screen);
$list_screen->register_column_type($column);
}
}
}
\ No newline at end of file
......
......@@ -7,7 +7,8 @@ use ACP;
class Entry extends ACP\Editing\Ajax\TableRows {
public function register() {
public function register(): void
{
add_action( Hooks::get_load_form_entries(), [ $this, 'handle_request' ] );
}
......
......@@ -8,47 +8,53 @@ use ACA\GravityForms\ListTable;
use ACA\GravityForms\Utils\Hooks;
use ACP\Export\Strategy;
class Entry extends Strategy {
public function __construct( ListScreen\Entry $list_screen ) {
parent::__construct( $list_screen );
}
protected function ajax_export(): void {
add_filter( 'gform_get_entries_args_entry_list', [ $this, 'set_pagination_args' ], 11 );
add_action( Hooks::get_load_form_entries(), [ $this, 'delayed_export' ] );
}
public function delayed_export(): void {
$table = $this->list_screen->get_list_table();
$table->prepare_items();
$this->export( wp_list_pluck( $table->items, 'id' ) );
}
public function set_pagination_args( array $args ): array {
$per_page = $this->get_num_items_per_iteration();
$args['paging']['page_size'] = $per_page;
$args['paging']['offset'] = $this->get_export_counter() * $per_page;
$ids = $this->get_requested_ids();
if ( $ids ) {
$args['search_criteria']['field_filters'] = [
[
'key' => 'id',
'operator' => 'IN',
'value' => $ids,
],
];
}
return $args;
}
protected function get_list_table(): ?AC\ListTable {
return new ListTable( $this->list_screen->get_list_table() );
}
class Entry extends Strategy
{
public function __construct(ListScreen\Entry $list_screen)
{
parent::__construct($list_screen);
}
protected function ajax_export(): void
{
add_filter('gform_get_entries_args_entry_list', [$this, 'set_pagination_args'], 11);
add_action(Hooks::get_load_form_entries(), [$this, 'delayed_export']);
}
public function delayed_export(): void
{
$table = $this->list_screen->get_list_table();
$table->prepare_items();
$this->export(wp_list_pluck($table->items, 'id'));
}
public function set_pagination_args(array $args): array
{
$per_page = $this->get_num_items_per_iteration();
$args['paging']['page_size'] = $per_page;
$args['paging']['offset'] = $this->get_export_counter() * $per_page;
$ids = $this->get_requested_ids();
if ($ids) {
$args['search_criteria']['field_filters'] = [
[
'key' => 'id',
'operator' => 'IN',
'value' => $ids,
],
];
}
return $args;
}
protected function get_list_table(): AC\ListTable
{
return new ListTable($this->list_screen->get_list_table());
}
}
\ No newline at end of file
......
<?php
declare(strict_types=1);
namespace ACA\GravityForms;
use AC;
use AC\Asset\Script;
use AC\Asset\Style;
use AC\DefaultColumnsRepository;
use AC\Registerable;
use ACA\GravityForms\ListScreen;
use AC\Services;
use AC\Vendor\Psr\Container\ContainerInterface;
use ACA\GravityForms\Search\Query;
use ACA\GravityForms\TableScreen;
use ACA\GravityForms\Service\ColumnGroup;
use ACA\GravityForms\Service\Scripts;
use ACP\Search\QueryFactory;
use ACP\Search\TableScreenFactory;
use ACP\Service\IntegrationStatus;
use GFCommon;
final class GravityForms implements Registerable {
public const GROUP = 'gravity_forms';
private $location;
public function __construct( AC\Asset\Location\Absolute $location ) {
$this->location = $location;
}
public function register() {
if ( ! class_exists( 'GFCommon', false ) ) {
return;
}
$minimum_gf_version = '2.5';
if ( class_exists( 'GFCommon', false ) && version_compare( GFCommon::$version, $minimum_gf_version, '<' ) ) {
return;
}
AC\ListScreenFactory::add( new ListScreenFactory\EntryFactory() );
add_action( 'ac/column_groups', [ $this, 'register_column_group' ] );
add_action( 'ac/admin_scripts', [ $this, 'admin_scripts' ] );
add_action( 'ac/table_scripts', [ $this, 'table_scripts' ] );
add_filter( "gform_noconflict_styles", [ $this, 'allowed_acp_styles' ] );
add_filter( "gform_noconflict_scripts", [ $this, 'allowed_acp_scripts' ] );
$services = [
new Service\ListScreens(),
new TableScreen\Entry( new AC\ListScreenFactory(), AC()->get_storage(), new DefaultColumnsRepository() ),
new Admin(),
new IntegrationStatus( 'ac-addon-gravityforms' ),
];
array_map( static function ( Registerable $service ) {
$service->register();
}, $services );
// Enable Search
QueryFactory::register( MetaTypes::GRAVITY_FORMS_ENTRY, Query::class );
TableScreenFactory::register( ListScreen\Entry::class, Search\TableScreen\Entry::class );
}
public function register_column_group( AC\Groups $groups ): void {
$groups->add( 'gravity_forms', __( 'Gravity Forms', 'codepress-admin-columns' ), 14 );
}
/**
* @param string $key
*
* @return bool
*/
private function is_acp_asset( $key ) {
$acp_prefixes = [ 'ac-', 'acp-', 'aca-', 'editor', 'mce-view', 'quicktags', 'common', 'tinymce' ];
foreach ( $acp_prefixes as $prefix ) {
if ( strpos( $key, $prefix ) !== false ) {
return true;
}
}
return false;
}
/**
* @param array $objects
*
* @return array
*/
public function allowed_acp_styles( $objects ) {
global $wp_styles;
foreach ( $wp_styles->queue as $handle ) {
if ( ! $this->is_acp_asset( $handle ) ) {
continue;
}
$objects[] = $handle;
}
return $objects;
}
/**
* @param array $objects
*
* @return array
*/
public function allowed_acp_scripts( $objects ) {
global $wp_scripts;
foreach ( $wp_scripts->queue as $handle ) {
if ( ! $this->is_acp_asset( $handle ) ) {
continue;
}
$objects[] = $handle;
}
return $objects;
}
public function admin_scripts() {
wp_enqueue_style( 'gform_font_awesome' );
}
public function table_scripts() {
$style = new Style( 'aca-gf-table', $this->location->with_suffix( 'assets/css/table.css' ) );
$style->enqueue();
$script = new Script( 'aca-gf-table', $this->location->with_suffix( 'assets/js/table.js' ) );
$script->enqueue();
wp_enqueue_script( 'wp-tinymce' );
}
final class GravityForms implements Registerable
{
public const GROUP = 'gravity_forms';
private $location;
private $container;
public function __construct(AC\Asset\Location\Absolute $location, ContainerInterface $container)
{
$this->location = $location;
$this->container = $container;
}
public function register(): void
{
if ( ! class_exists('GFCommon', false)) {
return;
}
$minimum_gf_version = '2.5';
if (class_exists('GFCommon', false) && version_compare((string)GFCommon::$version, $minimum_gf_version, '<')) {
return;
}
AC\ListScreenFactory\Aggregate::add(new ListScreenFactory\EntryFactory());
$this->create_services()->register();
// Enable Search
QueryFactory::register(MetaTypes::GRAVITY_FORMS_ENTRY, Query::class);
TableScreenFactory::register(ListScreen\Entry::class, Search\TableScreen\Entry::class);
}
private function create_services(): Services
{
return new Services([
new Service\ListScreens(),
new TableScreen\Entry(
new AC\ListScreenFactory\Aggregate(),
$this->container->get(AC\ListScreenRepository\Storage::class),
new DefaultColumnsRepository()
),
new Admin(),
new IntegrationStatus('ac-addon-gravityforms'),
new Scripts($this->location),
new ColumnGroup(),
]);
}
}
\ No newline at end of file
......
<?php
declare(strict_types=1);
namespace ACA\GravityForms\ListScreen;
use AC;
use AC\ColumnRepository;
use AC\Type\Uri;
use ACA\GravityForms;
use ACA\GravityForms\Column;
use ACA\GravityForms\Column\EntryConfigurator;
use ACA\GravityForms\ListTable;
use ACA\GravityForms\MetaTypes;
use ACP\Editing;
use ACP\Export;
use GF_Entry_List_Table;
use GFAPI;
class Entry extends AC\ListScreenWP implements Editing\ListScreen, Export\ListScreen {
private $form_id;
private $column_configurator;
public function __construct( int $form_id, EntryConfigurator $column_configurator ) {
$this->form_id = $form_id;
$this->column_configurator = $column_configurator;
$this->set_group( 'gravity_forms' )
->set_page( 'gf_entries' )
->set_screen_id( '_page_gf_entries' )
->set_screen_base( '_page_gf_entries' )
->set_key( 'gf_entry_' . $form_id )
->set_meta_type( GravityForms\MetaTypes::GRAVITY_FORMS_ENTRY );
}
public function editing() {
return new GravityForms\Editing\Strategy\Entry( $this->get_list_table() );
}
public function export() {
return new GravityForms\Export\Strategy\Entry( $this );
}
public function get_heading_hookname() {
return 'gform_entry_list_columns';
}
protected function get_object( $id ) {
return GFAPI::get_entry( $id );
}
public function set_manage_value_callback() {
add_filter( 'gform_entries_field_value', [ $this, 'manage_value_entry' ], 10, 4 );
}
/**
* @param string $original_value
* @param int $form_id
* @param string $field_id
* @param array $entry
*
* @return string
*/
public function manage_value_entry( $original_value, $form_id, $field_id, $entry ) {
$custom_column_value = $this->get_display_value_by_column_name( $field_id, $entry['id'], $original_value );
if ( $custom_column_value ) {
return $custom_column_value;
}
$value = $this->get_display_value_by_column_name( 'field_id-' . $field_id, $entry['id'], $original_value );
return $value ?: $original_value;
}
/**
* @return string
*/
public function get_label() {
return GFAPI::get_form( $this->get_form_id() )['title'];
}
/**
* @return int
*/
public function get_form_id() {
return $this->form_id;
}
protected function get_admin_url() {
return admin_url( 'admin.php' );
}
public function get_screen_link() {
return add_query_arg( [ 'id' => $this->get_form_id() ], parent::get_screen_link() );
}
public function get_list_table(): GF_Entry_List_Table {
return ( new GravityForms\TableFactory() )->create( $this->get_screen_id(), $this->form_id );
}
public function register_column_types(): void {
$this->column_configurator->register_entry_columns( $this );
$this->register_column_types_from_list( [
Column\Entry\Custom\User::class,
Column\Entry\Original\DateCreated::class,
Column\Entry\Original\DatePayment::class,
Column\Entry\Original\EntryId::class,
Column\Entry\Original\PaymentAmount::class,
Column\Entry\Original\SourceUrl::class,
Column\Entry\Original\Starred::class,
Column\Entry\Original\TransactionId::class,
Column\Entry\Original\User::class,
Column\Entry\Original\UserIp::class,
] );
}
class Entry extends AC\ListScreen implements Editing\ListScreen, Export\ListScreen, AC\ListScreen\ManageValue,
AC\ListScreen\ListTable
{
private $form_id;
private $column_configurator;
public function __construct(int $form_id, EntryConfigurator $column_configurator)
{
parent::__construct('gf_entry_' . $form_id, '_page_gf_entries');
$this->form_id = $form_id;
$this->column_configurator = $column_configurator;
$this->group = 'gravity_forms';
$this->set_meta_type(MetaTypes::GRAVITY_FORMS_ENTRY);
}
public function list_table(): AC\ListTable
{
return new ListTable($this->get_list_table());
}
public function manage_value(): AC\Table\ManageValue
{
return new GravityForms\Table\ManageValue\Entry(new ColumnRepository($this));
}
public function editing()
{
return new GravityForms\Editing\Strategy\Entry($this->get_list_table());
}
public function export()
{
return new GravityForms\Export\Strategy\Entry($this);
}
public function get_heading_hookname(): string
{
return 'gform_entry_list_columns';
}
public function get_label(): ?string
{
return GFAPI::get_form($this->get_form_id())['title'];
}
public function get_form_id(): int
{
return $this->form_id;
}
public function get_table_url(): Uri
{
$url = new AC\Type\Url\ListTable('admin.php');
return $url->with_arg('id', (string)$this->form_id)
->with_arg('page', 'gf_entries');
}
public function get_list_table(): GF_Entry_List_Table
{
return (new GravityForms\TableFactory())->create($this->get_screen_id(), $this->form_id);
}
public function register_column_types(): void
{
$this->column_configurator->register_entry_columns($this);
$this->register_column_types_from_list([
Column\Entry\Custom\User::class,
Column\Entry\Original\DateCreated::class,
Column\Entry\Original\DatePayment::class,
Column\Entry\Original\EntryId::class,
Column\Entry\Original\PaymentAmount::class,
Column\Entry\Original\SourceUrl::class,
Column\Entry\Original\Starred::class,
Column\Entry\Original\TransactionId::class,
Column\Entry\Original\User::class,
Column\Entry\Original\UserIp::class,
]);
}
}
\ No newline at end of file
......
......@@ -3,99 +3,86 @@
namespace ACA\GravityForms\ListScreenFactory;
use AC\ListScreen;
use AC\ListScreenFactory\ListSettingsTrait;
use AC\ListScreenFactoryInterface;
use AC\ListScreenFactory;
use ACA\GravityForms;
use ACA\GravityForms\Column\EntryConfigurator;
use ACA\GravityForms\FieldFactory;
use ACA\GravityForms\ListScreen\Entry;
use GFForms;
use GFFormsModel;
use LogicException;
use WP_Screen;
class EntryFactory implements ListScreenFactoryInterface {
class EntryFactory extends ListScreenFactory\BaseFactory
{
use ListSettingsTrait;
public function can_create(string $key): bool
{
return null !== $this->get_form_id_from_list_key($key);
}
public function can_create( string $key ): bool {
return null !== $this->get_form_id_from_list_key( $key );
}
protected function create_list_screen(string $key): ListScreen
{
$form_id = $this->get_form_id_from_list_key($key);
private function get_form_id_from_list_key( string $key ): ?int {
if ( ! ac_helper()->string->starts_with( $key, 'gf_entry_' ) ) {
return null;
}
return new Entry($form_id, $this->create_entry_configurator($this->get_form_id_from_list_key($key)));
}
$entry_id = ac_helper()->string->remove_prefix( $key, 'gf_entry_' );
private function get_form_id_from_list_key(string $key): ?int
{
if ( ! ac_helper()->string->starts_with($key, 'gf_entry_')) {
return null;
}
return is_numeric( $entry_id )
? (int) $entry_id
: null;
}
$entry_id = ac_helper()->string->remove_prefix($key, 'gf_entry_');
public function create( string $key, array $settings = [] ): ListScreen {
if ( ! $this->can_create( $key ) ) {
throw new LogicException( 'Invalid key' );
}
return is_numeric($entry_id)
? (int)$entry_id
: null;
}
$form_id = $this->get_form_id_from_list_key( $key );
public function can_create_from_wp_screen(WP_Screen $screen): bool
{
return strpos($screen->id, '_page_gf_entries') !== false &&
strpos($screen->base, '_page_gf_entries') !== false &&
$this->has_form_id();
}
if ( null === $form_id ) {
throw new LogicException( 'Invalid form id' );
}
private function has_form_id(): bool
{
return $this->get_current_form_id() > 0;
}
return $this->add_settings(
new Entry( $form_id, $this->create_entry_configurator( $form_id ) ),
$settings
);
}
protected function create_list_screen_from_wp_screen(WP_Screen $screen): ListScreen
{
$form_id = $this->get_current_form_id();
public function can_create_by_wp_screen( WP_Screen $screen ): bool {
return strpos( $screen->id, '_page_gf_entries' ) !== false &&
strpos( $screen->base, '_page_gf_entries' ) !== false &&
$this->has_form_id();
}
return new Entry($form_id, $this->create_entry_configurator($form_id));
}
private function has_form_id(): bool {
return $this->get_current_form_id() > 0;
}
private function get_current_form_id(): int
{
$form_id = GFForms::get('id');
public function create_by_wp_screen( WP_Screen $screen, array $settings = [] ): ListScreen {
if ( ! $this->can_create_by_wp_screen( $screen ) ) {
throw new LogicException( 'Invalid screen' );
}
if ( ! $form_id) {
$forms = GFFormsModel::get_forms();
$form_id = $this->get_current_form_id();
if ($forms) {
$form_id = $forms[0]->id;
}
}
return $this->add_settings(
new Entry( $form_id, $this->create_entry_configurator( $form_id ) ),
$settings
);
}
return (int)$form_id;
}
private function get_current_form_id(): int {
$form_id = GFForms::get( 'id' );
private function create_entry_configurator(int $form_id): EntryConfigurator
{
$fieldFactory = new FieldFactory();
$columnFactory = new GravityForms\Column\EntryFactory($fieldFactory);
if ( ! $form_id ) {
$forms = GFFormsModel::get_forms();
$entry_configurator = new EntryConfigurator($form_id, $columnFactory, $fieldFactory);
$entry_configurator->register();
if ( $forms ) {
$form_id = $forms[0]->id;
}
}
return (int) $form_id;
}
private function create_entry_configurator( int $form_id ): EntryConfigurator {
$fieldFactory = new FieldFactory();
$columnFactory = new GravityForms\Column\EntryFactory( $fieldFactory );
$entry_configurator = new EntryConfigurator( $form_id, $columnFactory, $fieldFactory );
$entry_configurator->register();
return $entry_configurator;
}
return $entry_configurator;
}
}
\ No newline at end of file
......
<?php
declare(strict_types=1);
namespace ACA\GravityForms;
use AC;
use GF_Entry_List_Table;
use GFAPI;
class ListTable implements AC\ListTable {
class ListTable implements AC\ListTable
{
private $table;
private $listTable;
public function __construct(GF_Entry_List_Table $table)
{
$this->table = $table;
}
public function __construct( GF_Entry_List_Table $listTable ) {
$this->listTable = $listTable;
}
public function get_column_value(string $column, int $id): string
{
ob_start();
$this->table->column_default(GFAPI::get_entry($id), $column);
public function get_column_value( $column, $id ) {
ob_start();
return ob_get_clean();
}
$entry = GFAPI::get_entry( $id );
$this->listTable->column_default( $entry, $column );
public function get_total_items(): int
{
return $this->table->get_pagination_arg('total_items');
}
return ob_get_clean();
}
public function render_row(int $id): string
{
ob_start();
$this->table->single_row(GFAPI::get_entry($id));
public function get_total_items() {
return $this->listTable->get_pagination_arg( 'total_items' );
}
return ob_get_clean();
}
}
\ No newline at end of file
......
......@@ -4,6 +4,6 @@ namespace ACA\GravityForms;
interface MetaTypes {
const GRAVITY_FORMS_ENTRY = 'gravity_forms_entry';
public const GRAVITY_FORMS_ENTRY = 'gravity_forms_entry';
}
\ No newline at end of file
......
......@@ -5,59 +5,63 @@ namespace ACA\GravityForms\Search;
use ACP\Search;
use GFFormsModel;
final class Query extends Search\Query {
/**
* @var int
*/
private $form_id;
/**
* @var string
*/
private $status;
public function register() {
add_filter( 'gform_get_entries_args_entry_list', [ $this, 'catch_list_details' ], 10, 3 );
add_filter( 'gform_gf_query_sql', [ $this, 'parse_search_query' ] );
}
public function catch_list_details( array $args ) {
$this->form_id = (int) $args['form_id'];
$this->status = (string) $args['search_criteria']['status'];
return $args;
}
public function parse_search_query( array $query ) {
global $wpdb;
$entry_table = GFFormsModel::get_entry_table_name();
$where = sprintf(
'WHERE %s.form_id = %s AND %s.status = %s',
$entry_table,
$wpdb->prepare( '%d', $this->form_id ),
$entry_table,
$wpdb->prepare( '%s', $this->status )
);
$query['select'] = sprintf( 'SELECT SQL_CALC_FOUND_ROWS DISTINCT %s.id', $entry_table );
$query['from'] = sprintf( 'FROM %s', $entry_table );
$query['where'] = $where;
$query['order'] = sprintf( 'ORDER BY %s.id DESC', $entry_table );
foreach ( $this->bindings as $binding ) {
if ( $binding->get_where() ) {
$query['where'] .= "\nAND " . $binding->get_where();
}
if ( $binding->get_join() ) {
$query['join'] .= "\n" . $binding->get_join();
}
}
return $query;
}
final class Query extends Search\Query
{
/**
* @var int
*/
private $form_id;
/**
* @var string
*/
private $status;
public function register(): void
{
add_filter('gform_get_entries_args_entry_list', [$this, 'catch_list_details'], 10, 3);
add_filter('gform_gf_query_sql', [$this, 'parse_search_query']);
}
public function catch_list_details(array $args): array
{
$this->form_id = (int)$args['form_id'];
$this->status = (string)$args['search_criteria']['status'];
return $args;
}
public function parse_search_query(array $query): array
{
global $wpdb;
$entry_table = GFFormsModel::get_entry_table_name();
$where = sprintf(
'WHERE %s.form_id = %s AND %s.status = %s',
$entry_table,
$wpdb->prepare('%d', $this->form_id),
$entry_table,
$wpdb->prepare('%s', $this->status)
);
$query['select'] = sprintf('SELECT SQL_CALC_FOUND_ROWS DISTINCT %s.id', $entry_table);
$query['from'] = sprintf('FROM %s', $entry_table);
$query['where'] = $where;
$query['order'] = sprintf('ORDER BY %s.id DESC', $entry_table);
foreach ($this->bindings as $binding) {
if ($binding->get_where()) {
$query['where'] .= "\nAND " . $binding->get_where();
}
if ($binding->get_join()) {
$query['join'] .= "\n" . $binding->get_join();
}
}
return $query;
}
}
\ No newline at end of file
......
......@@ -6,7 +6,8 @@ use ACP\Search;
class Entry extends Search\TableScreen {
public function register() {
public function register(): void
{
parent::register();
add_action( 'gform_pre_entry_list', [ $this, 'filters_markup' ] );
......
<?php
declare(strict_types=1);
namespace ACA\GravityForms\Service;
use AC;
use AC\Registerable;
class ColumnGroup implements Registerable
{
public function register(): void
{
add_action('ac/column_groups', [$this, 'register_column_group']);
}
public function register_column_group(AC\Groups $groups): void
{
$groups->add('gravity_forms', __('Gravity Forms', 'codepress-admin-columns'), 14);
}
}
\ No newline at end of file
......@@ -10,7 +10,8 @@ use GFAPI;
class ListScreens implements Registerable {
public function register() {
public function register(): void
{
add_action( 'ac/list_screen_groups', [ $this, 'register_list_screen_group' ] );
add_action( 'ac/list_keys', [ $this, 'add_list_keys' ] );
}
......
<?php
declare(strict_types=1);
namespace ACA\GravityForms\Service;
use AC\Asset\Location\Absolute;
use AC\Asset\Script;
use AC\Asset\Style;
use AC\ListScreen;
use AC\Registerable;
use ACA\GravityForms\ListScreen\Entry;
class Scripts implements Registerable
{
private $location;
public function __construct(Absolute $location)
{
$this->location = $location;
}
public function register(): void
{
add_action('ac/admin_scripts', [$this, 'admin_scripts']);
add_action('ac/table_scripts', [$this, 'table_scripts']);
add_filter("gform_noconflict_styles", [$this, 'allowed_acp_styles']);
add_filter("gform_noconflict_scripts", [$this, 'allowed_acp_scripts']);
}
public function admin_scripts(): void
{
wp_enqueue_style('gform_font_awesome');
}
public function table_scripts(ListScreen $list_screen): void
{
if ( ! $list_screen instanceof Entry) {
return;
}
$style = new Style('aca-gf-table', $this->location->with_suffix('assets/css/table.css'));
$style->enqueue();
$script = new Script('aca-gf-table', $this->location->with_suffix('assets/js/table.js'));
$script->enqueue();
wp_enqueue_script('wp-tinymce');
}
public function allowed_acp_styles($objects)
{
global $wp_styles;
foreach ($wp_styles->queue as $handle) {
if ( ! $this->is_acp_asset($handle)) {
continue;
}
$objects[] = $handle;
}
return $objects;
}
public function allowed_acp_scripts($objects)
{
global $wp_scripts;
foreach ($wp_scripts->queue as $handle) {
if ( ! $this->is_acp_asset($handle)) {
continue;
}
$objects[] = $handle;
}
return $objects;
}
private function is_acp_asset(string $key): bool
{
$acp_prefixes = ['ac-', 'acp-', 'aca-', 'editor', 'mce-view', 'quicktags', 'common', 'tinymce'];
foreach ($acp_prefixes as $prefix) {
if (strpos($key, $prefix) !== false) {
return true;
}
}
return false;
}
}
\ No newline at end of file
<?php
declare(strict_types=1);
namespace ACA\GravityForms\Table\ManageValue;
use AC\Table\ManageValue;
class Entry extends ManageValue
{
public function register(): void
{
add_filter('gform_entries_field_value', [$this, 'render_value'], 10, 4);
}
public function render_value($original_value, $form_id, $field_id, $entry)
{
$value = $this->render_cell((string)$field_id, (int)$entry['id'], (string)$original_value);
if ( ! $value) {
$value = $this->render_cell('field_id-' . $field_id, (int)$entry['id'], (string)$original_value);
}
return $value ?: $original_value;
}
}
\ No newline at end of file
......@@ -5,21 +5,17 @@ namespace ACA\GravityForms;
use GF_Entry_List_Table;
use GFCommon;
class TableFactory {
class TableFactory
{
/**
* @param string $screen_id
* @param int $form_id
*
* @return GF_Entry_List_Table
*/
public function create( $screen_id, $form_id ) {
require_once( GFCommon::get_base_path() . '/entry_list.php' );
public function create(string $screen_id, int $form_id): GF_Entry_List_Table
{
require_once(GFCommon::get_base_path() . '/entry_list.php');
return new GF_Entry_List_Table( [
'screen' => $screen_id,
'form_id' => $form_id,
] );
}
return new GF_Entry_List_Table([
'screen' => $screen_id,
'form_id' => $form_id,
]);
}
}
\ No newline at end of file
......
......@@ -4,7 +4,7 @@ namespace ACA\GravityForms\TableScreen;
use AC;
use AC\DefaultColumnsRepository;
use AC\ListScreenFactoryInterface;
use AC\ListScreenFactory;
use AC\ListScreenRepository\Storage;
use AC\Type\ListScreenId;
use ACA\GravityForms\Column;
......@@ -25,7 +25,7 @@ class Entry implements AC\Registerable {
private $default_columns_repository;
public function __construct(
ListScreenFactoryInterface $list_screen_factory,
ListScreenFactory $list_screen_factory,
Storage $storage,
DefaultColumnsRepository $default_columns_repository
) {
......@@ -34,7 +34,8 @@ class Entry implements AC\Registerable {
$this->default_columns_repository = $default_columns_repository;
}
public function register() {
public function register(): void
{
add_filter( 'gform_entry_list_columns', [ $this, 'remove_selector_column' ], 11, 2 );
add_filter( 'acp/editing/result', [ $this, 'get_editing_ajax_value' ], 10, 3 );
add_action( 'ac/table/list_screen', [ $this, 'create_default_list_screen' ], 9 );
......
......@@ -8,37 +8,39 @@ use ACA\JetEngine\Field\Field;
use ACA\JetEngine\Service\ColumnGroups;
use ACP;
class Meta extends AC\Column implements ACP\Export\Exportable {
/**
* @var Field
*/
protected $field;
public function __construct() {
$this->set_group( ColumnGroups::JET_ENGINE )
->set_label( 'JetEngine Meta' );
}
public function get_raw_value( $id ) {
return get_metadata( $this->list_screen->get_meta_type(), $id, $this->get_type(), true );
}
protected function get_meta_type() {
return $this->list_screen->get_meta_type();
}
// Delayed constructor
public function set_field( Field $field ) {
$this->field = $field;
}
protected function get_meta_key() {
return $this->get_type();
}
public function export() {
return ( new Export\ModelFactory() )->create( $this, $this->field ) ?: false;
}
class Meta extends AC\Column implements ACP\Export\Exportable
{
/**
* @var Field
*/
protected $field;
public function __construct()
{
$this->set_group(ColumnGroups::JET_ENGINE)
->set_label('JetEngine Meta');
}
public function get_raw_value($id)
{
return get_metadata($this->list_screen->get_meta_type(), $id, $this->get_type(), true);
}
// Delayed constructor
public function set_field(Field $field)
{
$this->field = $field;
}
protected function get_meta_key()
{
return $this->get_type();
}
public function export()
{
return (new Export\ModelFactory())->create($this, $this->field) ?: false;
}
}
\ No newline at end of file
......
......@@ -15,30 +15,43 @@ use ACP;
* @property Field\Type\Posts $field
*/
class Post extends Column\Meta
implements ACP\Search\Searchable, ACP\Editing\Editable, ACP\Sorting\Sortable, ACP\ConditionalFormat\Formattable {
use SearchableTrait,
EditableTrait,
DefaultValueFormatterTrait,
ACP\ConditionalFormat\FilteredHtmlFormatTrait;
protected function register_settings() {
$this->add_setting( new Settings\Column\Post( $this ) );
}
/**
* @return Settings\Column\Post
*/
private function get_post_setting() {
$setting = $this->get_setting( Settings\Column\Post::NAME );
return $setting instanceof Settings\Column\Post
? $setting
: null;
}
public function sorting() {
return ( new Sorting\ModelFactory\Post )->create( $this->get_meta_type(), $this->get_meta_key(), $this->field->is_multiple(), $this->get_post_setting() );
}
implements ACP\Search\Searchable, ACP\Editing\Editable, ACP\Sorting\Sortable, ACP\ConditionalFormat\Formattable
{
use SearchableTrait;
use EditableTrait;
use DefaultValueFormatterTrait;
use ACP\ConditionalFormat\FilteredHtmlFormatTrait;
protected function register_settings()
{
$this->add_setting(new Settings\Column\Post($this));
}
/**
* @return Settings\Column\Post
*/
private function get_post_setting()
{
$setting = $this->get_setting(Settings\Column\Post::NAME);
return $setting instanceof Settings\Column\Post
? $setting
: null;
}
public function sorting()
{
return (new Sorting\ModelFactory\Post())->create(
$this->get_meta_type(),
$this->get_meta_key(),
$this->field->is_multiple(),
$this->get_post_setting(),
[
'taxonomy' => $this->get_taxonomy(),
'post_type' => $this->get_post_type(),
]
);
}
}
\ No newline at end of file
......
......@@ -6,7 +6,6 @@ use ACA\JetEngine\Column;
use ACA\JetEngine\Editing;
use ACA\JetEngine\Search;
use ACA\JetEngine\Sorting;
use ACA\JetEngine\Value\DefaultValueFormatterTrait;
use ACP;
class Switcher extends Column\Meta implements ACP\Search\Searchable, ACP\Editing\Editable, ACP\Sorting\Sortable {
......
......@@ -2,7 +2,6 @@
namespace ACA\JetEngine;
use ACA\JetEngine\Column;
use ACA\JetEngine\Field\Field;
use ACA\JetEngine\Field\Type;
......
......@@ -2,8 +2,6 @@
namespace ACA\JetEngine;
use ACA\JetEngine\Field;
final class FieldFactory {
public function create( array $settings ): ?Field\Field {
......
......@@ -3,67 +3,81 @@
namespace ACA\JetEngine;
use AC\ListScreen;
use ACA\JetEngine\Column;
use ACA\JetEngine\Field\Field;
use ACA\JetEngine\Utils\Api;
use ACP;
final class FieldRepository {
/**
* @var FieldFactory
*/
private $field_factory;
public function __construct() {
$this->field_factory = new FieldFactory();
}
public function find_by_column( Column\Meta $column ): ?Field {
$fields = $this->find_by_list_screen( $column->get_list_screen() );
if ( empty( $fields ) ) {
return null;
}
$field = array_filter( $fields, static function ( $field ) use ( $column ) {
return $field->get_name() === $column->get_type();
} );
return empty( $field ) ? null : current( $field );
}
/**
* @return Field[]
*/
public function find_by_list_screen( ListScreen $list_screen ): array {
switch ( true ) {
case $list_screen instanceof ListScreen\Post:
return $this->map_meta_types( Api::MetaBox()->get_fields_for_context( 'post_type', $list_screen->get_post_type() ) );
case $list_screen instanceof ACP\ListScreen\Taxonomy:
return $this->map_meta_types( Api::MetaBox()->get_fields_for_context( 'taxonomy', $list_screen->get_taxonomy() ) );
case $list_screen instanceof ACP\ListScreen\User:
$fields = array_merge( ...array_values( Api::MetaBox()->get_fields_for_context( 'user' ) ) );
return $this->map_meta_types( $fields );
}
return [];
}
/**
* @return Field[]
*/
private function map_meta_types( array $meta_types ): array {
$fields = [];
foreach ( $meta_types as $field ) {
if ( isset( $field['object_type'] ) && $field['object_type'] === 'field' ) {
$fields[] = $this->field_factory->create( $field );
}
}
return array_filter( $fields );
}
final class FieldRepository
{
/**
* @var FieldFactory
*/
private $field_factory;
/**
* @var ListScreen
*/
private $list_screen;
public function __construct(ListScreen $list_screen)
{
$this->list_screen = $list_screen;
$this->field_factory = new FieldFactory();
}
public function find_by_column(Column\Meta $column): ?Field
{
$fields = $this->find_all();
if (empty($fields)) {
return null;
}
$field = array_filter($fields, static function ($field) use ($column) {
return $field->get_name() === $column->get_type();
});
return empty($field) ? null : current($field);
}
/**
* @return Field[]
*/
public function find_all(): array
{
switch (true) {
case $this->list_screen instanceof ListScreen\Post:
return $this->map_meta_types(
Api::MetaBox()->get_fields_for_context('post_type', $this->list_screen->get_post_type())
);
case $this->list_screen instanceof ACP\ListScreen\Taxonomy:
return $this->map_meta_types(
Api::MetaBox()->get_fields_for_context('taxonomy', $this->list_screen->get_taxonomy())
);
case $this->list_screen instanceof ACP\ListScreen\User:
$fields = array_merge(...array_values(Api::MetaBox()->get_fields_for_context('user')));
return $this->map_meta_types($fields);
}
return [];
}
/**
* @return Field[]
*/
private function map_meta_types(array $meta_types): array
{
$fields = [];
foreach ($meta_types as $field) {
if (isset($field['object_type']) && $field['object_type'] === 'field') {
$fields[] = $this->field_factory->create($field);
}
}
return array_filter($fields);
}
}
\ No newline at end of file
......
......@@ -4,43 +4,45 @@ namespace ACA\JetEngine;
use AC;
use AC\Registerable;
use AC\Services;
use ACP\Service\IntegrationStatus;
class JetEngine implements Registerable {
private $location;
public function __construct( AC\Asset\Location\Absolute $location ) {
$this->location = $location;
}
public function register() {
if ( ! class_exists( 'Jet_Engine', false ) || ! $this->check_minimum_jet_engine_version() ) {
return;
}
$services = [
new Service\Admin( $this->location ),
new Service\ColumnInstantiate,
new Service\ColumnGroups,
new Service\RelationalColumns(),
new Service\MetaColumns(),
new IntegrationStatus( 'ac-addon-jetengine' ),
];
foreach ( $services as $service ) {
if ( $service instanceof Registerable ) {
$service->register();
}
}
}
private function check_minimum_jet_engine_version(): bool {
$jet_engine = jet_engine();
return $jet_engine
? version_compare( $jet_engine->get_version(), '2.11.0', '>=' )
: false;
}
class JetEngine implements Registerable
{
private $location;
public function __construct(AC\Asset\Location\Absolute $location)
{
$this->location = $location;
}
public function register(): void
{
if ( ! class_exists('Jet_Engine', false) || ! $this->check_minimum_jet_engine_version()) {
return;
}
$this->create_services()->register();
}
private function create_services(): Services
{
return new Services([
new Service\Admin($this->location),
new Service\ColumnInstantiate(),
new Service\ColumnGroups(),
new Service\RelationalColumns(),
new Service\MetaColumns(),
new IntegrationStatus('ac-addon-jetengine'),
]);
}
private function check_minimum_jet_engine_version(): bool
{
$jet_engine = jet_engine();
return $jet_engine && version_compare($jet_engine->get_version(), '2.11.0', '>=');
}
}
\ No newline at end of file
......
......@@ -19,7 +19,8 @@ final class Admin implements AC\Registerable {
$this->location = $location;
}
public function register() {
public function register(): void
{
add_action( 'ac/admin_scripts', [ $this, 'admin_scripts' ] );
}
......
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.