Skip to content

Commit 382bc56

Browse files
committed
apply further fixes
1 parent b69c3fc commit 382bc56

3 files changed

Lines changed: 59 additions & 4 deletions

File tree

plugins/Dashboard/javascripts/widgetMenu.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ widgetsHelper.firstGetAvailableWidgetsCall = null;
2020
*/
2121
widgetsHelper.getAvailableWidgets = function (callback) {
2222

23+
function resetFirstGetAvailableWidgetsCall(promise) {
24+
if (widgetsHelper.firstGetAvailableWidgetsCall === promise) {
25+
widgetsHelper.firstGetAvailableWidgetsCall = null;
26+
}
27+
}
28+
2329
if (!widgetsHelper.availableWidgets && widgetsHelper.firstGetAvailableWidgetsCall) {
2430
widgetsHelper.firstGetAvailableWidgetsCall.then(function () {
2531
if (callback) {
@@ -97,15 +103,25 @@ widgetsHelper.getAvailableWidgets = function (callback) {
97103
function (data) {
98104
widgetsHelper.availableWidgets = mergeCategoriesAndSubCategories(data);
99105

106+
resetFirstGetAvailableWidgetsCall(promise);
100107
resolve();
101108
}
102109
);
103110
ajaxRequest.setErrorCallback(function (deferred, status) {
104-
if (status == 'abort' || !deferred || deferred.status < 400 || deferred.status >= 600) {
111+
resetFirstGetAvailableWidgetsCall(promise);
112+
113+
if (status == 'abort') {
114+
reject(new Error('Loading widget metadata was aborted'));
105115
return;
106116
}
117+
118+
if (!deferred || deferred.status < 400 || deferred.status >= 600) {
119+
reject(new Error('Loading widget metadata failed'));
120+
return;
121+
}
122+
107123
$('#loadingError').show();
108-
reject();
124+
reject(new Error('Loading widget metadata failed'));
109125
});
110126
ajaxRequest.send();
111127
return;

plugins/Widgetize/Controller.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Piwik\Plugins\API\WidgetMetadata;
1919
use Piwik\Url;
2020
use Piwik\View;
21+
use Piwik\Widget\WidgetConfig;
2122
use Piwik\Widget\WidgetsList;
2223

2324
class Controller extends \Piwik\Plugin\Controller
@@ -113,10 +114,21 @@ private function findClientWidgetMetadata(string $module, string $action): ?arra
113114
return null;
114115
}
115116

116-
$metadata = new WidgetMetadata();
117-
return $metadata->buildWidgetMetadata($config);
117+
return $this->buildClientWidgetMetadata($config);
118118
}
119119

120120
return null;
121121
}
122+
123+
private function buildClientWidgetMetadata(WidgetConfig $config): ?array
124+
{
125+
if (!$config->isWidgetizeable()) {
126+
return null;
127+
}
128+
129+
$config->checkIsEnabled();
130+
131+
$metadata = new WidgetMetadata();
132+
return $metadata->buildWidgetMetadata($config);
133+
}
122134
}

plugins/Widgetize/tests/Integration/ControllerTest.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Piwik\Tests\Framework\Fixture;
1414
use Piwik\Tests\Framework\Mock\FakeAccess;
1515
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
16+
use Piwik\Widget\WidgetConfig;
1617

1718
/**
1819
* @group Widgetize
@@ -83,4 +84,30 @@ public function testIframeShouldBootstrapClientRenderedWidgetForLegacyWidgetizeU
8384
$this->assertStringContainsString('clientComponent', $html);
8485
$this->assertStringContainsString('TransitionsPage', $html);
8586
}
87+
88+
public function testBuildClientWidgetMetadataShouldRejectDisabledWidgets(): void
89+
{
90+
$config = new WidgetConfig();
91+
$config->setClientSideComponent('Transitions', 'TransitionsPage');
92+
$config->disable();
93+
94+
$this->expectException(\Exception::class);
95+
$this->expectExceptionMessage('General_ExceptionWidgetNotEnabled');
96+
97+
$method = new \ReflectionMethod(Controller::class, 'buildClientWidgetMetadata');
98+
$method->setAccessible(true);
99+
$method->invoke($this->controller, $config);
100+
}
101+
102+
public function testBuildClientWidgetMetadataShouldIgnoreNonWidgetizableWidgets(): void
103+
{
104+
$config = new WidgetConfig();
105+
$config->setClientSideComponent('Transitions', 'TransitionsPage');
106+
$config->setIsNotWidgetizable();
107+
108+
$method = new \ReflectionMethod(Controller::class, 'buildClientWidgetMetadata');
109+
$method->setAccessible(true);
110+
111+
$this->assertNull($method->invoke($this->controller, $config));
112+
}
86113
}

0 commit comments

Comments
 (0)