Skip to content

Commit

Permalink
Currencies and Stocks duration issue (xibosignage#2360)
Browse files Browse the repository at this point in the history
* JavaScript: ignore [0] references as they cannot be library references.

* Widget: calculatedDuration incorrect for currencies and stocks.
* Widget: HTML should contain the duration according to whether use duration is set.

relates to xibosignageltd/xibo-private#615
  • Loading branch information
dasgarner authored Feb 8, 2024
1 parent a91cbaa commit 3f1e35d
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 9 deletions.
6 changes: 4 additions & 2 deletions lib/Entity/ModulePropertyTrait.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php
/*
* Copyright (C) 2023 Xibo Signage Ltd
* Copyright (C) 2024 Xibo Signage Ltd
*
* Xibo - Digital Signage - https://xibosignage.com
*
Expand Down Expand Up @@ -126,10 +126,12 @@ public function getPropertyValues(
// Does this property have library references?
if ($property->allowLibraryRefs && !empty($value)) {
// Parse them out and replace for our special syntax.
// TODO: Can we improve this regex to ignore things we suspect are JavaScript array access?
$matches = [];
preg_match_all('/\[(.*?)\]/', $value, $matches);
foreach ($matches[1] as $match) {
if (is_numeric($match)) {
// We ignore non-numbers and zero/negative integers
if (is_numeric($match) && intval($match) <= 0) {
$value = str_replace(
'[' . $match . ']',
'[[mediaId=' . $match . ']]',
Expand Down
96 changes: 96 additions & 0 deletions lib/Widget/CurrenciesAndStocksProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<?php
/*
* Copyright (C) 2024 Xibo Signage Ltd
*
* Xibo - Digital Signage - https://xibosignage.com
*
* This file is part of Xibo.
*
* Xibo is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* Xibo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Xibo. If not, see <http://www.gnu.org/licenses/>.
*/

namespace Xibo\Widget;

use Carbon\Carbon;
use Xibo\Widget\Provider\DataProviderInterface;
use Xibo\Widget\Provider\DurationProviderInterface;
use Xibo\Widget\Provider\WidgetProviderInterface;
use Xibo\Widget\Provider\WidgetProviderTrait;

/**
* A widget provider for stocks and currencies, only used to correctly set the numItems
*/
class CurrenciesAndStocksProvider implements WidgetProviderInterface
{
use WidgetProviderTrait;

/**
* We want to pass this out to the event mechanism for 3rd party sources.
* @param \Xibo\Widget\Provider\DataProviderInterface $dataProvider
* @return \Xibo\Widget\Provider\WidgetProviderInterface
*/
public function fetchData(DataProviderInterface $dataProvider): WidgetProviderInterface
{
$dataProvider->setIsUseEvent();
return $this;
}

/**
* Special handling for currencies and stocks where the number of data items is based on the quantity of
* items input in the `items` property.
* @param \Xibo\Widget\Provider\DurationProviderInterface $durationProvider
* @return \Xibo\Widget\Provider\WidgetProviderInterface
*/
public function fetchDuration(DurationProviderInterface $durationProvider): WidgetProviderInterface
{
$this->getLog()->debug('fetchDuration: CurrenciesAndStocksProvider');

// Currencies and stocks are based on the number of items set in the respective fields.
$items = $durationProvider->getWidget()->getOptionValue('items', null);
if ($items === null) {
$this->getLog()->debug('fetchDuration: CurrenciesAndStocksProvider: no items set');
return $this;
}

if ($durationProvider->getWidget()->getOptionValue('durationIsPerItem', 0) == 0) {
$this->getLog()->debug('fetchDuration: CurrenciesAndStocksProvider: duration per item not set');
return $this;
}

$numItems = count(explode(',', $items));

$this->getLog()->debug('fetchDuration: CurrenciesAndStocksProvider: number of items: ' . $numItems);

if ($numItems > 1) {
// If we have paging involved then work out the page count.
$itemsPerPage = $durationProvider->getWidget()->getOptionValue('itemsPerPage', 0);
if ($itemsPerPage > 0) {
$numItems = ceil($numItems / $itemsPerPage);
}

$durationProvider->setDuration($durationProvider->getWidget()->calculatedDuration * $numItems);
}
return $this;
}

public function getDataCacheKey(DataProviderInterface $dataProvider): ?string
{
return null;
}

public function getDataModifiedDt(DataProviderInterface $dataProvider): ?Carbon
{
return null;
}
}
8 changes: 7 additions & 1 deletion lib/Widget/Provider/DataProviderInterface.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php
/*
* Copyright (C) 2023 Xibo Signage Ltd
* Copyright (C) 2024 Xibo Signage Ltd
*
* Xibo - Digital Signage - https://xibosignage.com
*
Expand Down Expand Up @@ -131,6 +131,12 @@ public function getSanitizer(array $params): SanitizerInterface;
*/
public function getWidgetModifiedDt(): ?Carbon;

/**
* Indicate that we should use the event mechanism to handle this event.
* @return \Xibo\Widget\Provider\DataProviderInterface
*/
public function setIsUseEvent(): DataProviderInterface;

/**
* Indicate that this data provider has been handled.
* @return DataProviderInterface
Expand Down
4 changes: 2 additions & 2 deletions lib/Widget/Render/WidgetHtmlRenderer.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php
/*
* Copyright (C) 2023 Xibo Signage Ltd
* Copyright (C) 2024 Xibo Signage Ltd
*
* Xibo - Digital Signage - https://xibosignage.com
*
Expand Down Expand Up @@ -493,7 +493,7 @@ private function render(
'properties' => $module->getPropertyValues(),
'isValid' => $widget->isValid === 1,
'isRepeatData' => $widget->getOptionValue('isRepeatData', 1) === 1,
'duration' => $widget->duration,
'duration' => $widget->useDuration ? $widget->duration : $module->defaultDuration,
'calculatedDuration' => $widget->calculatedDuration,
'isDataExpected' => $module->isDataProviderExpected(),
];
Expand Down
4 changes: 2 additions & 2 deletions modules/currencies.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!--
~ Copyright (C) 2023 Xibo Signage Ltd
~ Copyright (C) 2024 Xibo Signage Ltd
~
~ Xibo - Digital Signage - https://xibosignage.com
~
Expand All @@ -24,7 +24,7 @@
<author>Core</author>
<description>A module for showing Currency pairs and exchange rates</description>
<icon>fa fa-line-chart</icon>
<class></class>
<class>\Xibo\Widget\CurrenciesAndStocksProvider</class>
<compatibilityClass>\Xibo\Widget\Compatibility\CurrenciesWidgetCompatibility</compatibilityClass>
<type>currencies</type>
<dataType>currency</dataType>
Expand Down
4 changes: 2 additions & 2 deletions modules/stocks.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!--
~ Copyright (C) 2023 Xibo Signage Ltd
~ Copyright (C) 2024 Xibo Signage Ltd
~
~ Xibo - Digital Signage - https://xibosignage.com
~
Expand All @@ -24,7 +24,7 @@
<author>Core</author>
<description>A module for showing Stock quotes</description>
<icon>fa fa-bar-chart</icon>
<class></class>
<class>\Xibo\Widget\CurrenciesAndStocksProvider</class>
<compatibilityClass>\Xibo\Widget\Compatibility\StocksWidgetCompatibility</compatibilityClass>
<type>stocks</type>
<dataType>stock</dataType>
Expand Down

0 comments on commit 3f1e35d

Please sign in to comment.