1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-22 14:52:41 +01:00
phorge-phorge/resources/sql/autopatches/20190412.dashboard.01.panels.php
epriestley d0078570cc Convert dashboard panel storage to a format which can handle duplicates
Summary:
Ref T13272. See PHI945. Currently, dashboards tend to break when they have duplicate panels. Partly, this is because all the edit operations operate on a "panelPHID", so there's no way to say "remove the copy of panel X at the bottom of the right-hand column", since the operation is `remove(phid)` and that doesn't point at a specific copy of that panel.

In theory, the code is supposed to prevent duplicate panels, but (a) it doesn't always do this successfully and (b) there's no real reason you can't put duplicate panels on a dashboard if you want. There may even be good reason to do this if you have a "random cat picture" panel or something. Even if you aren't doing this on purpose, it's probably better to let you do it and then fix your mistake by removing the panel you don't want than to prevent the operation entirely.

To simplify this whole mess, I want to just support putting the same panel into multiple places on a dashboard. As a first step, change the storage format so each instance of a panel has a unique "panelKey".

Since each instance of each panel now has its own object, this will also let us give particular instances of panels things like "automatic refresh time" (T5514) or "custom name for this panel on this dashboard" later, if we want. Not clear these are valuable but having this capability can't hurt.

Test Plan:
  - `var_dump()`'d the migration, looked at all the results.
  - Ran the migration.

NOTE: This breaks dashboards on its own since none of the other code has been changed yet, see followups.

Reviewers: amckinley

Reviewed By: amckinley

Subscribers: PHID-OPKG-gm6ozazyms6q6i22gyam

Maniphest Tasks: T13272

Differential Revision: https://secure.phabricator.com/D20405
2019-04-14 10:22:29 -07:00

81 lines
1.9 KiB
PHP

<?php
// Convert dashboards to a new storage format. The old storage format looks
// like this:
// {
// "0": ["PHID-DSHP-A", ...],
// "1": ["PHID-DSHP-B", ...]
// }
// The new storage format looks like this:
// [
// {
// "panelKey": "abcdefgh",
// "panelPHID": "PHID-DSHP-A",
// "columnKey": "left"
// },
// ...
// ]
// One major issue with the old storage format is that when multiple copies of
// a single dashboard panel appeared on the same dashboard, the UI had a lot
// of difficulty acting on a particular copy because copies were identified
// only by PHID and all copies of the same panel have the same panel PHID.
$dashboard_table = new PhabricatorDashboard();
$conn = $dashboard_table->establishConnection('r');
$table_name = $dashboard_table->getTableName();
$rows = new LiskRawMigrationIterator($conn, $table_name);
foreach ($rows as $row) {
$config = $row['layoutConfig'];
try {
$config = phutil_json_decode($config);
} catch (Exception $ex) {
$config = array();
}
if (!is_array($config)) {
$config = array();
}
$panels = idx($config, 'panelLocations');
if (!is_array($panels)) {
$panels = array();
}
if (idx($config, 'layoutMode') === 'layout-mode-full') {
$column_map = array(
0 => 'main',
);
} else {
$column_map = array(
0 => 'left',
1 => 'right',
);
}
$panel_list = array();
foreach ($panels as $column_idx => $panel_phids) {
$column_key = idx($column_map, $column_idx, 'unknown');
foreach ($panel_phids as $panel_phid) {
$panel_list[] = array(
'panelKey' => Filesystem::readRandomCharacters(8),
'columnKey' => $column_key,
'panelPHID' => $panel_phid,
);
}
}
unset($config['panelLocations']);
$config['panels'] = $panel_list;
queryfx(
$conn,
'UPDATE %R SET layoutConfig = %s WHERE id = %d',
$dashboard_table,
phutil_json_encode($config),
$row['id']);
}