Skip to content

Commit

Permalink
Initial work at Add route type filter in admin area post listing #92
Browse files Browse the repository at this point in the history
…- added route type column.
  • Loading branch information
alexboia committed Feb 17, 2024
1 parent 29b10de commit c6fe574
Show file tree
Hide file tree
Showing 8 changed files with 363 additions and 69 deletions.
94 changes: 94 additions & 0 deletions lib/display/postListing/TripSummaryRouteTypeColumn.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php
/**
* Copyright (c) 2014-2024 Alexandru Boia and Contributors
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/

if (!defined('ABP01_LOADED') || !ABP01_LOADED) {
exit ;
}

class Abp01_Display_PostListing_TripSummaryRouteTypeColumn extends Abp01_Display_PostListing_Column {
public function __construct($key, $label, Abp01_Display_PostListing_ColumnDataSource $dataSource) {
parent::__construct($key, $label, $dataSource);
}

public function renderValue($postId) {
$routeType = parent::renderValue($postId);

if (empty($routeType)) {
return '-';
}

$label = $this->_getRouteTypeLabel($postId,
$routeType);

return $this->_formatRouteTypeLabel($postId,
$routeType,
$label);
}

private function _formatRouteTypeLabel($postId, $routeType, $routeTypeLabel) {
$cssClass = sprintf('abp01-route-type-cell abp01-route-type-cell-%s', esc_attr($routeType));
$formatted = '<span class="' . $cssClass . '">' . $routeTypeLabel . '</span>';

return apply_filters('abp01_formatted_route_tyle_listing_label',
$formatted,
$postId,
$routeType,
$routeTypeLabel);
}

private function _getRouteTypeLabel($postId, $routeType) {
$routeTypeLabel = '';
switch ($routeType) {
case Abp01_Route_Info::BIKE:
$routeTypeLabel = __('Biking', 'abp01-trip-summary');
break;
case Abp01_Route_Info::HIKING:
$routeTypeLabel = __('Hiking', 'abp01-trip-summary');
break;
case Abp01_Route_Info::TRAIN_RIDE:
$routeTypeLabel = __('Train Ride', 'abp01-trip-summary');
break;
}

return apply_filters('abp01_unformatted_route_type_label',
$routeTypeLabel,
$postId,
$routeType);
}

public function renderLabel() {
return parent::renderLabel();
}

public function getKey() {
return parent::getKey();
}
}
61 changes: 61 additions & 0 deletions lib/display/postListing/TripSummaryRouteTypeColumnsDecorator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php
/**
* Copyright (c) 2014-2024 Alexandru Boia and Contributors
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/

if (!defined('ABP01_LOADED') || !ABP01_LOADED) {
exit ;
}

class Abp01_Display_PostListing_TripSummaryRouteTypeColumnsDecorator extends Abp01_Display_PostListing_ColumnCustomization {
public function __construct() {
parent::__construct($this->_getColumns(), $this->_getPostTypes());
}

private function _getColumns() {
$routeManager = $this->_getRouteManager();
return array(
new Abp01_Display_PostListing_TripSummaryRouteTypeColumn(
'abp01_trip_summary_route_type',
esc_html__('Route type', 'abp01-trip-summary'),
new Abp01_Display_PostListing_TripSummaryRouteTypeDataSource(
$routeManager
)
)
);
}

private function _getRouteManager(): Abp01_Route_Manager {
return abp01_get_route_manager();
}

private function _getPostTypes() {
return Abp01_AvailabilityHelper::getTripSummaryAvailableForPostTypes();
}
}
106 changes: 106 additions & 0 deletions lib/display/postListing/TripSummaryRouteTypeDataSource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<?php
/**
* Copyright (c) 2014-2024 Alexandru Boia and Contributors
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/

if (!defined('ABP01_LOADED') || !ABP01_LOADED) {
exit ;
}

class Abp01_Display_PostListing_TripSummaryRouteTypeDataSource implements Abp01_Display_PostListing_ColumnDataSource {
private $_routeManager;

public function __construct(Abp01_Route_Manager $routeManager) {
$this->_routeManager = $routeManager;
}

public function getValue($postId) {
$routeType = $this->_getTripSummaryRouteTypeInfoForPostId($postId);
return $routeType;
}

private function _getTripSummaryRouteTypeInfoForPostId($postId) {
$allRouteTypeInfo = $this->_getTripSummaryRouteTypeInfoForCurrentWpQuery();
$postRouteTypeInfo = isset($allRouteTypeInfo[$postId])
? $allRouteTypeInfo[$postId]
: '';

return $postRouteTypeInfo;
}

private function _getTripSummaryRouteTypeInfoForCurrentWpQuery() {
$query = $this->_getCurrentWpQuery();
$allRouteTypeInfo = $query != null
? $this->_getPostsTripSummaryRouteTypeInfo($query->posts)
: array();

return $allRouteTypeInfo;
}

private function _getPostsTripSummaryRouteTypeInfo($posts) {
$postIds = array();
$allRouteTypeInfo = array();

//extract post IDs
$postIds = abp01_extract_post_ids($posts);
if (!empty($postIds)) {
//Attempt to extract any cached data
$cacheKey = $this->_getPostsTripSummaryRouteTypeInfoCacheKey($postIds);
$allRouteTypeInfo = $this->_retrieveCachedTripSummaryRouteTypeInfo($cacheKey);

//If there is no status information cached, fetch it
if (!is_array($allRouteTypeInfo)) {
$allRouteTypeInfo = $this->_routeManager
->getTripSummaryRouteTypeInfo($postIds);
$this->_cacheTripSummaryRouteTypeInfo($cacheKey,
$allRouteTypeInfo);
}
}

return $allRouteTypeInfo;
}

private function _getPostsTripSummaryRouteTypeInfoCacheKey($postIds) {
return sprintf('_abp01_posts_listing_route_type_info_%s', sha1(join('_', $postIds)));
}

private function _retrieveCachedTripSummaryRouteTypeInfo($cacheKey) {
return get_transient($cacheKey);
}

private function _cacheTripSummaryRouteTypeInfo($cacheKey, $statusInfo) {
set_transient($cacheKey, $statusInfo, MINUTE_IN_SECONDS / 2);
}

private function _getCurrentWpQuery() {
return isset($GLOBALS['wp_query'])
? $GLOBALS['wp_query']
: null;
}
}
42 changes: 21 additions & 21 deletions lib/display/postListing/TripSummaryStatusColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,30 +34,30 @@
}

class Abp01_Display_PostListing_TripSummaryStatusColumn extends Abp01_Display_PostListing_Column {
public function __construct($key, $label, Abp01_Display_PostListing_ColumnDataSource $dataSource) {
parent::__construct($key, $label, $dataSource);
}
public function __construct($key, $label, Abp01_Display_PostListing_ColumnDataSource $dataSource) {
parent::__construct($key, $label, $dataSource);
}

public function renderValue($postId) {
$formattedValue = null;
$value = parent::renderValue($postId);
public function renderValue($postId) {
$formattedValue = null;
$value = parent::renderValue($postId);

if ($value !== null) {
$formattedValue = $value
? abp01_get_status_text(esc_html__('Yes', 'abp01-trip-summary'), ABP01_STATUS_OK)
: abp01_get_status_text(esc_html__('No', 'abp01-trip-summary'), ABP01_STATUS_ERR);
} else {
$formattedValue = abp01_get_status_text(esc_html__('Not available', 'abp01-trip-summary'), ABP01_STATUS_WARN);
}
if ($value !== null) {
$formattedValue = $value
? abp01_get_status_text(esc_html__('Yes', 'abp01-trip-summary'), ABP01_STATUS_OK)
: abp01_get_status_text(esc_html__('No', 'abp01-trip-summary'), ABP01_STATUS_ERR);
} else {
$formattedValue = abp01_get_status_text(esc_html__('Not available', 'abp01-trip-summary'), ABP01_STATUS_WARN);
}

return $formattedValue;
}
return $formattedValue;
}

public function renderLabel() {
return parent::renderLabel();
}
public function renderLabel() {
return parent::renderLabel();
}

public function getKey() {
return parent::getKey();
}
public function getKey() {
return parent::getKey();
}
}
63 changes: 30 additions & 33 deletions lib/display/postListing/TripSummaryStatusColumnsDecorator.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,41 +34,38 @@
}

class Abp01_Display_PostListing_TripSummaryStatusColumnsDecorator extends Abp01_Display_PostListing_ColumnCustomization {
public function __construct() {
parent::__construct($this->_getColumns(), $this->_getPostTypes());
}
public function __construct() {
parent::__construct($this->_getColumns(), $this->_getPostTypes());
}

private function _getColumns() {
$routeManager = $this->_getRouteManager();
return array(
new Abp01_Display_PostListing_TripSummaryStatusColumn(
'abp01_trip_summary_info_status',
esc_html__('Trip summary info', 'abp01-trip-summary'),
new Abp01_Display_PostListing_TripSummaryStatusColumnDataSource(
$routeManager,
'has_route_details'
)
),
private function _getColumns(): array {
$routeManager = $this->_getRouteManager();
return array(
new Abp01_Display_PostListing_TripSummaryStatusColumn(
'abp01_trip_summary_info_status',
esc_html__('Trip summary info', 'abp01-trip-summary'),
new Abp01_Display_PostListing_TripSummaryStatusColumnDataSource(
$routeManager,
'has_route_details'
)
),

new Abp01_Display_PostListing_TripSummaryStatusColumn(
'abp01_trip_summary_track_status',
esc_html__('Trip summary track', 'abp01-trip-summary'),
new Abp01_Display_PostListing_TripSummaryStatusColumnDataSource(
$routeManager,
'has_route_track'
)
)
);
}
new Abp01_Display_PostListing_TripSummaryStatusColumn(
'abp01_trip_summary_track_status',
esc_html__('Trip summary track', 'abp01-trip-summary'),
new Abp01_Display_PostListing_TripSummaryStatusColumnDataSource(
$routeManager,
'has_route_track'
)
)
);
}

private function _getRouteManager() {
return abp01_get_route_manager();
}
private function _getRouteManager(): Abp01_Route_Manager {
return abp01_get_route_manager();
}

private function _getPostTypes() {
return array(
'post',
'page'
);
}
private function _getPostTypes(): array {
return Abp01_AvailabilityHelper::getTripSummaryAvailableForPostTypes();
}
}
Loading

0 comments on commit c6fe574

Please sign in to comment.