|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
namespace Epesi\Core\System; |
|
4
|
|
|
|
|
5
|
|
|
use Epesi\Core\System\Integration\Modules\ModuleView; |
|
6
|
|
|
use Illuminate\Support\Facades\Auth; |
|
7
|
|
|
use Epesi\Core\System\Integration\Modules\ModuleManager; |
|
8
|
|
|
use Epesi\Core\Layout\Seeds\ActionBar; |
|
9
|
|
|
use Epesi\Core\System\Seeds\Form; |
|
10
|
|
|
|
|
11
|
|
|
class ModuleAdministration extends ModuleView |
|
12
|
|
|
{ |
|
13
|
|
|
protected $label = 'Module Administration'; |
|
14
|
|
|
|
|
15
|
|
|
public static function access() |
|
16
|
|
|
{ |
|
17
|
|
|
return Auth::user()->can('modify system settings'); |
|
18
|
|
|
} |
|
19
|
|
|
|
|
20
|
|
|
public function body() |
|
21
|
|
|
{ |
|
22
|
|
|
$this->addControlButtons(); |
|
23
|
|
|
|
|
24
|
|
|
$this->addAccordion($this, $this->topLevelModules()); |
|
25
|
|
|
} |
|
26
|
|
|
|
|
27
|
|
|
public function topLevelModules() |
|
28
|
|
|
{ |
|
29
|
|
|
$modules = ModuleManager::getAll(); |
|
30
|
|
|
|
|
31
|
|
|
return $modules->filter(function ($subModuleClass) use ($modules) { |
|
32
|
|
|
return ! $modules->map(function($moduleClass){ |
|
33
|
|
|
return $moduleClass::namespace(); |
|
34
|
|
|
})->contains($subModuleClass::parentNamespace()); |
|
35
|
|
|
})->sort(); |
|
36
|
|
|
} |
|
37
|
|
|
|
|
38
|
|
|
public function addAccordion($container, $modules) |
|
39
|
|
|
{ |
|
40
|
|
|
$accordion = $container->add(['Accordion', 'type' => ['styled', 'fluid'], 'settings' => ['animateChildren' => false]])->setStyle(['max-width' => '800px', 'margin-left' => 'auto', 'margin-right' => 'auto']); |
|
41
|
|
|
|
|
42
|
|
|
foreach ($modules as $moduleClass) { |
|
43
|
|
|
$section = $accordion->addSection($moduleClass::label()); |
|
44
|
|
|
|
|
45
|
|
|
|
|
46
|
|
|
$section->add(['Message', 'ui' => 'tiny message'])->template->appendHTML('Content', $this->formatModuleInfo($moduleClass)); |
|
47
|
|
|
|
|
48
|
|
|
if (ModuleManager::isInstalled($moduleClass)) { |
|
49
|
|
|
$label = ['Label', __('Installed'), 'green']; |
|
50
|
|
|
|
|
51
|
|
|
$this->addUninstallButton($section, $moduleClass); |
|
52
|
|
|
|
|
53
|
|
|
// $this->addReinstallButton($section, $moduleClass); |
|
54
|
|
|
} |
|
55
|
|
|
else { |
|
56
|
|
|
$label = ['Label', __('Available'), 'yellow']; |
|
57
|
|
|
|
|
58
|
|
|
$this->addInstallButton($section, $moduleClass); |
|
59
|
|
|
} |
|
60
|
|
|
|
|
61
|
|
|
$section->add($label, 'title')->setStyle('float', 'right'); |
|
62
|
|
|
|
|
63
|
|
|
$submodules = ModuleManager::getAll()->filter(function ($subModuleClass) use ($moduleClass) { |
|
64
|
|
|
return $subModuleClass::isSubModuleOf($moduleClass); |
|
65
|
|
|
}); |
|
66
|
|
|
|
|
67
|
|
|
if ($submodules->isEmpty()) continue; |
|
68
|
|
|
|
|
69
|
|
|
$this->addAccordion($section, $submodules); |
|
70
|
|
|
} |
|
71
|
|
|
} |
|
72
|
|
|
|
|
73
|
|
|
public function formatModuleInfo($moduleClass) |
|
74
|
|
|
{ |
|
75
|
|
|
$moduleInfo = (array) ($moduleClass::info()?: __(' No details provided by author')); |
|
76
|
|
|
|
|
77
|
|
|
$ret = []; |
|
78
|
|
|
foreach ($moduleInfo as $label => $text) { |
|
79
|
|
|
$ret[] = (is_string($label)? "<strong>$label</strong>: ": '') . $text; |
|
80
|
|
|
} |
|
81
|
|
|
|
|
82
|
|
|
return implode('<br>', $ret); |
|
83
|
|
|
} |
|
84
|
|
|
|
|
85
|
|
|
public function addInstallButton($container, $moduleClass) |
|
86
|
|
|
{ |
|
87
|
|
|
$callback = $installCallback = $this->add('jsCallback')->set(function() use ($moduleClass) { |
|
|
|
|
|
|
88
|
|
|
ob_start(); |
|
89
|
|
|
ModuleManager::install($moduleClass); |
|
90
|
|
|
|
|
91
|
|
|
return ob_get_clean(); |
|
92
|
|
|
}); |
|
93
|
|
|
|
|
94
|
|
|
$dependencies = ModuleManager::listDependencies($moduleClass); |
|
95
|
|
|
$recommended = ModuleManager::listRecommended($moduleClass); |
|
96
|
|
|
|
|
97
|
|
|
if ($dependencies || $recommended) { |
|
98
|
|
|
$modal = $this->add(['Modal', 'title' => __(':module Module Installation', ['module' => $moduleClass::label()])])->set(function($view) use ($installCallback, $moduleClass, $dependencies, $recommended) { |
|
|
|
|
|
|
99
|
|
|
if ($dependencies) { |
|
100
|
|
|
$message = $view->add(['Message', __('Module has following dependencies which will be installed')]); |
|
101
|
|
|
|
|
102
|
|
|
foreach ($dependencies as $parentModule) { |
|
103
|
|
|
$message->text->addParagraph($parentModule::label()); |
|
104
|
|
|
} |
|
105
|
|
|
} |
|
106
|
|
|
|
|
107
|
|
|
if ($recommended) { |
|
108
|
|
|
$message = $view->add(['Message', __('Select to install recommended modules for best experience')]); |
|
|
|
|
|
|
109
|
|
|
|
|
110
|
|
|
$form = $view->add(new Form()); |
|
111
|
|
|
foreach ($recommended as $childModule) { |
|
112
|
|
|
if (! ModuleManager::isAvailable($childModule)) continue; |
|
113
|
|
|
|
|
114
|
|
|
$form->addField($childModule::alias(), ['CheckBox', 'caption' => $childModule::label()]); |
|
115
|
|
|
} |
|
116
|
|
|
|
|
117
|
|
|
$form->onSubmit(function ($form) use ($moduleClass) { |
|
118
|
|
|
ob_start(); |
|
119
|
|
|
ModuleManager::install($moduleClass, array_keys($form->getValues(), true)); |
|
120
|
|
|
|
|
121
|
|
|
return ob_get_clean(); |
|
122
|
|
|
}); |
|
123
|
|
|
} |
|
124
|
|
|
|
|
125
|
|
|
$view->add(['Button', __('Install'), 'primary'])->on('click', [ |
|
126
|
|
|
isset($form)? $form->submit(): $installCallback |
|
127
|
|
|
]); |
|
128
|
|
|
}); |
|
129
|
|
|
|
|
130
|
|
|
$callback = $modal->show(); |
|
131
|
|
|
} |
|
132
|
|
|
|
|
133
|
|
|
$container->add(['Button', __('Install'), 'class' => ['green']])->on('click', $callback); |
|
134
|
|
|
} |
|
135
|
|
|
|
|
136
|
|
|
public function addUninstallButton($container, $moduleClass) |
|
137
|
|
|
{ |
|
138
|
|
|
$callback = $uninstallCallback = $this->add('jsCallback')->set(function() use ($moduleClass) { |
|
|
|
|
|
|
139
|
|
|
ob_start(); |
|
140
|
|
|
ModuleManager::uninstall($moduleClass); |
|
141
|
|
|
|
|
142
|
|
|
return ob_get_clean(); |
|
143
|
|
|
}); |
|
144
|
|
|
|
|
145
|
|
|
if ($dependents = ModuleManager::listDependents()[$moduleClass]?? []) { |
|
146
|
|
|
$modal = $this->add(['Modal', 'title' => __(':module Module Installation', ['module' => $moduleClass::label()])])->set(function($view) use ($moduleClass, $dependents, $uninstallCallback) { |
|
|
|
|
|
|
147
|
|
|
$message = $view->add(['Message', __('Module is required by following modules')]); |
|
148
|
|
|
|
|
149
|
|
|
foreach ($dependents as $childModule) { |
|
150
|
|
|
$message->text->addParagraph($childModule::label()); |
|
151
|
|
|
} |
|
152
|
|
|
|
|
153
|
|
|
$view->add(['Button', __('Install'), 'primary'])->on('click', [ |
|
154
|
|
|
$uninstallCallback |
|
155
|
|
|
]); |
|
156
|
|
|
}); |
|
157
|
|
|
|
|
158
|
|
|
$callback = $modal->show(); |
|
159
|
|
|
} |
|
160
|
|
|
|
|
161
|
|
|
$container->add(['Button', __('Uninstall'), 'class' => ['red']])->on('click', $callback); |
|
162
|
|
|
} |
|
163
|
|
|
|
|
164
|
|
|
public function addReinstallButton($container, $moduleClass) |
|
|
|
|
|
|
165
|
|
|
{ |
|
166
|
|
|
$container->add(['Button', __('Re-install')]); |
|
167
|
|
|
} |
|
168
|
|
|
|
|
169
|
|
|
public function addControlButtons() |
|
170
|
|
|
{ |
|
171
|
|
|
ActionBar::addButton('back')->link(url('view/system')); |
|
172
|
|
|
|
|
173
|
|
|
$this->addClearCacheButton(); |
|
174
|
|
|
} |
|
175
|
|
|
|
|
176
|
|
|
public function addClearCacheButton() |
|
177
|
|
|
{ |
|
178
|
|
|
ActionBar::addButton(['icon' => 'refresh', 'label' => __('Clear Cache')])->callback(function($callback) { |
|
|
|
|
|
|
179
|
|
|
ModuleManager::clearCache(); |
|
180
|
|
|
|
|
181
|
|
|
return $this->notify(__('Cache cleared!')); |
|
182
|
|
|
}); |
|
183
|
|
|
} |
|
184
|
|
|
|
|
185
|
|
|
} |
|
186
|
|
|
|