Skip to content

Commit 5e3f3ce

Browse files
committed
apply further fixes
1 parent b69c3fc commit 5e3f3ce

3 files changed

Lines changed: 61 additions & 10 deletions

File tree

plugins/Dashboard/javascripts/widgetMenu.js

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,18 @@ 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) {
24-
widgetsHelper.firstGetAvailableWidgetsCall.then(function () {
30+
return widgetsHelper.firstGetAvailableWidgetsCall.then(function () {
2531
if (callback) {
2632
callback(widgetsHelper.availableWidgets);
2733
}
2834
});
29-
30-
return widgetsHelper.firstGetAvailableWidgetsCall;
3135
}
3236

3337
function mergeCategoriesAndSubCategories(availableWidgets)
@@ -97,15 +101,25 @@ widgetsHelper.getAvailableWidgets = function (callback) {
97101
function (data) {
98102
widgetsHelper.availableWidgets = mergeCategoriesAndSubCategories(data);
99103

104+
resetFirstGetAvailableWidgetsCall(promise);
100105
resolve();
101106
}
102107
);
103108
ajaxRequest.setErrorCallback(function (deferred, status) {
104-
if (status == 'abort' || !deferred || deferred.status < 400 || deferred.status >= 600) {
109+
resetFirstGetAvailableWidgetsCall(promise);
110+
111+
if (status == 'abort') {
112+
reject(new Error('Loading widget metadata was aborted'));
105113
return;
106114
}
115+
116+
if (!deferred || deferred.status < 400 || deferred.status >= 600) {
117+
reject(new Error('Loading widget metadata failed'));
118+
return;
119+
}
120+
107121
$('#loadingError').show();
108-
reject();
122+
reject(new Error('Loading widget metadata failed'));
109123
});
110124
ajaxRequest.send();
111125
return;
@@ -118,13 +132,11 @@ widgetsHelper.getAvailableWidgets = function (callback) {
118132
widgetsHelper.firstGetAvailableWidgetsCall = promise;
119133
}
120134

121-
promise.then(function () {
135+
return promise.then(function () {
122136
if (callback) {
123137
callback(widgetsHelper.availableWidgets);
124138
}
125139
});
126-
127-
return promise;
128140
};
129141

130142
/**

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)