Skip to content

Commit 5a8292f

Browse files
mykh-hailosusnux
authored andcommitted
fix: duplicate dashboard widget
Signed-off-by: mykh-hailo <kristianderonta0205@gmail.com>
1 parent c0cab68 commit 5a8292f

3 files changed

Lines changed: 50 additions & 2 deletions

File tree

apps/dashboard/lib/Controller/DashboardApiController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ public function getLayout(): DataResponse {
202202
#[NoAdminRequired]
203203
#[ApiRoute(verb: 'POST', url: '/api/v3/layout')]
204204
public function updateLayout(array $layout): DataResponse {
205+
$layout = $this->service->sanitizeLayout($layout);
205206
$this->userConfig->setValueString($this->userId, 'dashboard', 'layout', implode(',', $layout));
206207
return new DataResponse(['layout' => $layout]);
207208
}

apps/dashboard/lib/Service/DashboardService.php

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,19 @@ public function __construct(
3131
*/
3232
public function getLayout(): array {
3333
$systemDefault = $this->appConfig->getAppValueString('layout', 'recommendations,spreed,mail,calendar');
34-
return array_values(array_filter(
34+
return $this->sanitizeStringList(
3535
explode(',', $this->userConfig->getValueString($this->userId, 'dashboard', 'layout', $systemDefault)),
36-
fn (string $value) => $value !== '')
3736
);
3837
}
3938

39+
/**
40+
* @param list<string> $layout
41+
* @return list<string>
42+
*/
43+
public function sanitizeLayout(array $layout): array {
44+
return $this->sanitizeStringList($layout);
45+
}
46+
4047
/**
4148
* @return list<string>
4249
*/
@@ -73,4 +80,25 @@ public function getBirthdate(): string {
7380

7481
return $birthdate->getValue();
7582
}
83+
84+
/**
85+
* Keep insertion order while removing empty and duplicate values.
86+
*
87+
* @param list<string> $values
88+
* @return list<string>
89+
*/
90+
private function sanitizeStringList(array $values): array {
91+
$seen = [];
92+
$result = [];
93+
foreach ($values as $value) {
94+
if ($value === '' || isset($seen[$value])) {
95+
continue;
96+
}
97+
98+
$seen[$value] = true;
99+
$result[] = $value;
100+
}
101+
102+
return $result;
103+
}
76104
}

apps/dashboard/tests/DashboardServiceTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,25 @@ protected function setUp(): void {
4444
);
4545
}
4646

47+
public function testGetLayoutRemovesEmptyAndDuplicateEntries(): void {
48+
$this->appConfig->method('getAppValueString')
49+
->with('layout', 'recommendations,spreed,mail,calendar')
50+
->willReturn('recommendations,spreed,mail,calendar');
51+
$this->userConfig->method('getValueString')
52+
->with('alice', 'dashboard', 'layout', 'recommendations,spreed,mail,calendar')
53+
->willReturn('spreed,,mail,mail,calendar,spreed');
54+
55+
$layout = $this->service->getLayout();
56+
57+
$this->assertSame(['spreed', 'mail', 'calendar'], $layout);
58+
}
59+
60+
public function testSanitizeLayoutRemovesEmptyAndDuplicateEntries(): void {
61+
$layout = $this->service->sanitizeLayout(['files', 'calendar', 'files', '', 'mail', 'calendar']);
62+
63+
$this->assertSame(['files', 'calendar', 'mail'], $layout);
64+
}
65+
4766
public function testGetBirthdate(): void {
4867
$user = $this->createMock(IUser::class);
4968
$this->userManager->method('get')

0 commit comments

Comments
 (0)