Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ vendor/
logs/
build/
*.zip
.cursor/
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM wordpress:6.6.2-php8.3-apache
FROM wordpress:6.8.0-php8.3-apache

RUN apt-get update && \
apt-get install -y --no-install-recommends ssl-cert && \
Expand Down
2 changes: 0 additions & 2 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
version: '3.1'

services:
wordpress:
depends_on:
Expand Down
2 changes: 1 addition & 1 deletion fetch-jft-plugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* Install: Drop this directory into the "wp-content/plugins/" directory and activate it.
* Contributors: pjaudiomv, bmltenabled
* Authors: bmltenabled
* Version: 1.8.5
* Version: 1.9.0
* Requires PHP: 7.3
* License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
Expand Down
23 changes: 23 additions & 0 deletions js/jft.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
jQuery(document).ready(function($) {
const jftLanguageSelect = $('#jft_language');
const timezoneContainer = $('#timezone-container');
const layoutContainer = $('#layout-container');

function updateEnglishOnlyOptions() {
let isEnglish = jftLanguageSelect.val() === 'english';

if (isEnglish) {
timezoneContainer.show();
layoutContainer.show();
} else {
timezoneContainer.hide();
layoutContainer.hide();
}
}

// Initial update
updateEnglishOnlyOptions();

// Listen for changes
jftLanguageSelect.on('change', updateEnglishOnlyOptions);
});
8 changes: 6 additions & 2 deletions readme.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

Contributors: pjaudiomv, klgrimley, bmltenabled
Tags: jft, just for today, narcotics anonymous, na
Tested up to: 6.6
Stable tag: 1.8.5
Tested up to: 6.8
Stable tag: 1.9.0
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html

Expand Down Expand Up @@ -50,6 +50,10 @@ This section describes how to install the plugin and get it working.

== Changelog ==

= 1.9.0 =

* Added Time Zone support for English.

= 1.8.5 =

* Compliance fixes.
Expand Down
170 changes: 142 additions & 28 deletions src/Dashboard.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,43 @@ class Dashboard

public function __construct()
{
add_action('admin_init', [$this, 'registerSettings']);
add_action('admin_menu', [$this, 'createMenu']);
if (is_admin()) {
add_action('admin_init', [$this, 'registerSettings']);
add_action('admin_menu', [$this, 'createMenu']);
add_action('admin_enqueue_scripts', [ $this, 'enqueueBackendFiles' ], 500);
}
}

public function enqueueBackendFiles(string $hook): void
{
if ('settings_page_jft-plugin' !== $hook) {
return;
}
$base_url = plugin_dir_url(dirname(__FILE__));
wp_enqueue_script('fetch-jft-admin', $base_url . 'js/jft.js', [ 'jquery' ], filemtime(plugin_dir_path(dirname(__FILE__)) . 'js/jft.js'), false);
}

public function registerSettings(): void
{
register_setting(self::SETTING_GROUP, 'jft_layout');
register_setting(self::SETTING_GROUP, 'jft_language');
register_setting(
self::SETTING_GROUP,
'jft_language',
[
'type' => 'string',
'default' => 'english',
'sanitize_callback' => 'sanitize_text_field',
]
);
register_setting(
self::SETTING_GROUP,
'jft_timezone',
[
'type' => 'string',
'default' => '',
'sanitize_callback' => 'sanitize_text_field',
]
);
}

public function createMenu(string $baseFile): void
Expand All @@ -37,6 +66,19 @@ public function settingsLink($links)
return $links;
}

private static function renderSelectOption(string $name, string $selected_value, array $options): string
{
// Render a dropdown select input for settings
$select_html = "<select id='$name' name='$name'>";
foreach ($options as $value => $label) {
$selected = selected($selected_value, $value, false);
$select_html .= "<option value='$value' $selected>$label</option>";
}
$select_html .= '</select>';

return $select_html;
}

public function drawSettings(): void
{
?>
Expand All @@ -48,37 +90,51 @@ public function drawSettings(): void
do_settings_sections(self::SETTING_GROUP);
?>
<table class="form-table">
<tr valign="top">
<th scope="row">Language</th>
<td>
<select id="jft_language" name="jft_language">
<?php
$languages = [
'danish' => 'Danish',
'english' => 'English',
'farsi' => 'Farsi',
'french' => 'French',
'german' => 'German',
'italian' => 'Italian',
'japanese' => 'Japanese',
'portuguese' => 'Portuguese',
'russian' => 'Russian',
'spanish' => 'Spanish',
'swedish' => 'Swedish',
];

$selectedLanguage = esc_attr(get_option('jft_language'));

foreach ($languages as $value => $label) {
$selected = $selectedLanguage === $value ? 'selected="selected"' : '';
echo '<option value="' . esc_attr($value) . '" ' . esc_attr($selected) . '>' . esc_html($label) . '</option>';
}
$timezone = esc_attr(get_option('jft_timezone'));
$allowed_html = [
'select' => [
'id' => [],
'name' => [],
],
'option' => [
'value' => [],
'selected' => [],
],
];
?>
</select>
<p class="description">Choose the language for the JFT Display.<br> insert [jft] shortcode on your page or post. <strong>Languages other then English only works with raw HTML layout.</strong></p>
<tr valign="top" id="language-container">
<th scope="row">Language</th>
<td>
<?php
echo wp_kses(
static::renderSelectOption(
'jft_language',
$selectedLanguage,
[
'danish' => 'Danish',
'english' => 'English',
'farsi' => 'Farsi',
'french' => 'French',
'german' => 'German',
'italian' => 'Italian',
'japanese' => 'Japanese',
'portuguese' => 'Portuguese',
'russian' => 'Russian',
'spanish' => 'Spanish',
'swedish' => 'Swedish',
]
),
$allowed_html
);
?>
</td>
<p class="description">Choose the language for the JFT Display.<br> insert [jft] shortcode on your page or post. <strong>Languages other then English only works with raw HTML layout.</strong></p>
</tr>
<tr valign="top">
</tr>
<tr valign="top" id="layout-container">
<th scope="row">Layout</th>
<td>
<select id="jft_layout" name="jft_layout">
Expand All @@ -92,6 +148,64 @@ public function drawSettings(): void
<p class="description"><strong>Only for English.</strong> Change between raw HTML Table and CSS block elements.</p>
</td>
</tr>
<tr valign="top" id="timezone-container">
<th scope="row">Timezone (English Only)</th>
<td>
<?php
$timezone_options = [
'' => 'Server Default',
// North America
'America/New_York' => 'America/New_York',
'America/Chicago' => 'America/Chicago',
'America/Denver' => 'America/Denver',
'America/Los_Angeles' => 'America/Los_Angeles',
'America/Anchorage' => 'America/Anchorage',
'America/Honolulu' => 'America/Honolulu',
'America/Phoenix' => 'America/Phoenix',

// South America
'America/Sao_Paulo' => 'America/Sao_Paulo',
'America/Argentina/Buenos_Aires' => 'America/Argentina/Buenos_Aires',
'America/Santiago' => 'America/Santiago',

// Europe
'Europe/London' => 'Europe/London',
'Europe/Paris' => 'Europe/Paris',
'Europe/Berlin' => 'Europe/Berlin',
'Europe/Moscow' => 'Europe/Moscow',

// Africa
'Africa/Cairo' => 'Africa/Cairo',
'Africa/Johannesburg' => 'Africa/Johannesburg',
'Africa/Lagos' => 'Africa/Lagos',

// Asia
'Asia/Dubai' => 'Asia/Dubai',
'Asia/Kolkata' => 'Asia/Kolkata',
'Asia/Bangkok' => 'Asia/Bangkok',
'Asia/Singapore' => 'Asia/Singapore',
'Asia/Tokyo' => 'Asia/Tokyo',
'Asia/Shanghai' => 'Asia/Shanghai',
'Asia/Seoul' => 'Asia/Seoul',

// Australia/Pacific
'Australia/Sydney' => 'Australia/Sydney',
'Australia/Perth' => 'Australia/Perth',
'Pacific/Auckland' => 'Pacific/Auckland',
'Pacific/Fiji' => 'Pacific/Fiji'
];
echo wp_kses(
static::renderSelectOption(
'jft_timezone',
$timezone,
$timezone_options
),
$allowed_html
);
?>
<p class="description">Only applies when English language is selected. Leave blank to use server default.</p>
</td>
</tr>
</table>
<?php submit_button(); ?>
</form>
Expand Down
32 changes: 27 additions & 5 deletions src/Reading.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,30 +11,47 @@ class Reading
const CSS_CLASS = 'jft-rendered-element';

const DEFAULT_CONFIG = [
'url' => 'https://jftna.org/jft/',
'url' => 'https://jft.na.org/',
'dom_element' => 'table',
'footer' => '<div align="right" id="jft-subscribe" class="jft-rendered-element"><a href="https://www.jftna.org/jft-subscription.htm" target="_blank">Subscribe</a></div>',
'language' => 'english'
];

public function renderReading($atts = []): string
{
$args = shortcode_atts(['layout' => '', 'language' => ''], $atts);
$args = shortcode_atts(['layout' => '', 'language' => '', 'timezone' => ''], $atts);
$layout = $this->sanitizeLayout($args);
$language = $this->sanitizeLanguage($args);
$languageConfig = $this->getLanguageConfig($language);
$timezone = $this->sanitizeTimezone($args);
$languageConfig = $this->getLanguageConfig($language, $timezone);
$response = $this->getJft($languageConfig);
if ($layout == "block" && $language != "english") {
return '<b>Fetch JFT Error</b> - Block layout can only be used with english. Language set: ' . $language;
}
return $this->getContent($layout, $response, $languageConfig);
}

protected function getLanguageConfig($language): array
protected function getLanguageConfig($language, $timezone = ''): array
{
$pdate = new \jDateTimePlus(true, true, 'Asia/Tehran');

// Check for timezone setting for English
$timezoneParam = '';
if ($language === 'english') {
// Prioritize shortcode timezone parameter over global setting
$timezone_setting = !empty($timezone) ? $timezone : get_option('jft_timezone');
if (!empty($timezone_setting)) {
$timezoneParam = '?timeZone=' . urlencode($timezone_setting);
}
}

$languageConfig = [
'english' => self::DEFAULT_CONFIG,
'english' => [
'url' => self::DEFAULT_CONFIG['url'] . $timezoneParam,
'dom_element' => self::DEFAULT_CONFIG['dom_element'],
'footer' => self::DEFAULT_CONFIG['footer'],
'language' => self::DEFAULT_CONFIG['language']
],
'spanish' => [
'url' => 'https://fzla.org/wp-content/uploads/meditaciones/' . $this->getTimezoneDate('spanish', 'm/d') . ".html",
'footer' => '',
Expand Down Expand Up @@ -111,6 +128,11 @@ protected function sanitizeLanguage(array $args): string
return !empty($args['language']) ? sanitize_text_field(strtolower($args['language'])) : sanitize_text_field(get_option('jft_language'));
}

protected function sanitizeTimezone(array $args): string
{
return !empty($args['timezone']) ? sanitize_text_field($args['timezone']) : '';
}

protected function getJft(array $languageConfig): string
{
$charset = self::DEFAULT_CHAR_ENCODING;
Expand Down