1<?php
2/**
3 * Elgg upgrade library.
4 * Contains code for handling versioning and upgrades.
5 */
6
7use Elgg\Menu\MenuItems;
8
9/**
10 * Perform some clean up when upgrade completes
11 * @elgg_event complete upgrade
12 * @return void
13 */
14function _elgg_upgrade_completed() {
15	$pending = _elgg_services()->upgrades->getPendingUpgrades();
16	if (empty($pending)) {
17		elgg_delete_admin_notice('pending_upgrades');
18	}
19}
20
21/**
22 * Add menu items to the entity menu of ElggUpgrade
23 *
24 * @param \Elgg\Hook $hook 'register', 'menu:entity'
25 *
26 * @return void|MenuItems
27 * @internal
28 */
29function _elgg_upgrade_entity_menu(\Elgg\Hook $hook) {
30
31	$entity = $hook->getEntityParam();
32	if (!$entity instanceof ElggUpgrade || !$entity->canEdit()) {
33		return;
34	}
35
36	$result = $hook->getValue();
37
38	// deleting upgrades has no point, they'll be rediscovered again
39	// don't want to completely block the ability in ->canDelete(), just don't offer the link
40	$result->remove('delete');
41
42	if (!$entity->isCompleted()) {
43		$result[] = ElggMenuItem::factory([
44			'name' => 'run_upgrade',
45			'icon' => 'play',
46			'text' => elgg_echo('admin:upgrades:menu:run_single'),
47			'href' => false,
48			'deps' => [
49				'core/js/upgrader',
50			],
51			'data-guid' => $entity->guid,
52		]);
53	} elseif ($batch = $entity->getBatch()) {
54		if (!$batch->shouldBeSkipped()) {
55			// only show reset if it will have an effect
56			$result[] = ElggMenuItem::factory([
57				'name' => 'reset',
58				'icon' => 'sync',
59				'text' => elgg_echo('reset'),
60				'href' => elgg_generate_action_url('admin/upgrade/reset', [
61					'guid' => $entity->guid,
62				]),
63			]);
64		}
65	}
66
67	return $result;
68}
69
70return function (\Elgg\EventsService $events, \Elgg\HooksRegistrationService $hooks) {
71	$events->registerHandler('complete', 'upgrade', '_elgg_upgrade_completed');
72
73	$hooks->registerHandler('register', 'menu:entity', '_elgg_upgrade_entity_menu', 501);
74};
75